UNPKG

google-cloud-mcp

Version:

Model Context Protocol server for Google Cloud services

213 lines (173 loc) 5.7 kB
# MCP Tool Implementation Improvements This document outlines our current implementation of tools in the Google Cloud MCP server and suggests improvements to better align with the Model Context Protocol specification. ## Current Implementation Our server currently implements tools for Google Cloud services: - **Logging Tools**: - `query-logs`: Query logs with a custom filter - `logs-time-range`: Get logs for a specific time range - **Spanner Tools**: - `execute-spanner-query`: Execute SQL queries on Spanner databases - `list-spanner-tables`: List tables in a Spanner database - **Monitoring Tools**: - `query-metrics`: Query metrics with a custom filter and time range - `list-metric-types`: List available metric types These tools are implemented using the `server.tool()` method from the MCP SDK, which handles parameter validation using Zod schemas. ## Alignment with MCP Specification ### What We've Implemented Correctly: 1. **Tool Definitions**: We've defined tools with clear names and descriptions. 2. **Input Schemas**: We use Zod for parameter validation, which aligns with the JSON Schema approach. 3. **Return Values**: Our tools return properly formatted content. 4. **Parameter Descriptions**: We include descriptions for all parameters. ### Areas for Improvement: 1. **Tool Discovery**: We haven't explicitly implemented the `tools/list` endpoint. The SDK may handle this automatically, but we should verify. 2. **Error Handling**: We're currently throwing errors rather than returning them as part of the tool response with `isError: true`. 3. **Progress Reporting**: We don't have progress reporting for long-running operations. 4. **Tool Updates**: We don't notify clients when tools change. 5. **Security Considerations**: We could enhance input validation and access controls. ## Recommended Improvements ### 1. Proper Error Handling Update our tools to return errors in the content rather than throwing exceptions: ```typescript try { // Tool operation const result = await performOperation(); return { content: [{ type: 'text', text: `Operation successful: ${result}` }] }; } catch (error) { return { isError: true, content: [{ type: 'text', text: `Error: ${error.message}` }] }; } ``` ### 2. Verify Tool Discovery Ensure the SDK is properly exposing our tools via the `tools/list` endpoint, or implement it explicitly: ```typescript // Verify if this is needed or if the SDK handles it automatically server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: [ { name: "query-logs", description: "Query logs with a custom filter", inputSchema: { type: "object", properties: { filter: { type: "string", description: "The filter to apply to logs" }, limit: { type: "number", description: "Maximum number of log entries to return" } }, required: ["filter"] } }, // Add other tools here ] }; }); ``` ### 3. Progress Reporting for Long Operations Implement progress reporting for long-running operations: ```typescript server.tool( 'execute-long-query', { // Parameters }, async (params, context) => { // Start operation const operationId = startLongRunningOperation(); // Return initial response return { content: [{ type: 'text', text: `Operation started with ID: ${operationId}` }], progress: { status: 'in_progress', message: 'Query execution started', percentComplete: 0 } }; // In background process, update progress: // server.sendNotification({ // type: 'notifications/tools/progress', // params: { // toolCallId: context.toolCallId, // progress: { // status: 'in_progress', // message: 'Processing data', // percentComplete: 50 // } // } // }); } ); ``` ### 4. Enhanced Input Validation Improve input validation for all tools: ```typescript server.tool( 'execute-spanner-query', { sql: z.string() .min(1, "SQL query cannot be empty") .max(10000, "SQL query too long") .refine( sql => !sql.toLowerCase().includes("drop") && !sql.toLowerCase().includes("truncate"), "Destructive operations are not allowed" ) .describe('The SQL query to execute'), // Other parameters }, // Implementation ); ``` ### 5. Tool Notifications Implement notifications for tool changes: ```typescript // When tools are updated server.sendNotification({ type: "notifications/tools/list_changed" }); ``` ### 6. Security Enhancements Add more robust security measures: ```typescript // Rate limiting const rateLimiter = new RateLimiter(); server.tool( 'query-logs', { // Parameters }, async (params, context) => { // Check rate limits if (!rateLimiter.allowRequest(context.clientId)) { return { isError: true, content: [{ type: 'text', text: 'Rate limit exceeded. Please try again later.' }] }; } // Proceed with tool execution } ); ``` ## Implementation Timeline 1. Error Handling - High Priority 2. Verify Tool Discovery - High Priority 3. Enhanced Input Validation - Medium Priority 4. Progress Reporting - Medium Priority 5. Security Enhancements - Medium Priority 6. Tool Notifications - Low Priority ## References - [MCP Tool Documentation](https://modelcontextprotocol.io/docs/concepts/tools/) - [MCP Tool Examples](https://github.com/modelcontextprotocol/servers/blob/main/src/github/)