google-cloud-mcp
Version:
Model Context Protocol server for Google Cloud services
161 lines (121 loc) • 4.7 kB
Markdown
# MCP Resource Implementation Improvements
This document outlines planned improvements to our Google Cloud MCP server's resource implementation to better align with the Model Context Protocol specification.
## Current Implementation
Our server currently implements resources for Google Cloud services:
- **Logging**: Query and filter log entries
- **Spanner**: Explore database schema and table data
- **Monitoring**: Retrieve and analyse metrics
These resources are implemented using the `ResourceTemplate` class and follow the basic MCP resource structure.
## Planned Improvements
### 1. Resource Discovery ✅
Implement proper resource discovery through a dedicated resource endpoint:
```typescript
// In src/utils/resource-discovery.ts
server.resource(
'resource-list',
'resources://list',
async (uri) => {
return {
contents: [{
uri: uri.href,
text: `# Available Resources\n\n## Logging Resources\n\n* **Recent Logs** - \`gcp-logs://${projectId}/recent\`\n Recent log entries from Google Cloud Logging\n\n* **Filtered Logs** - \`gcp-logs://{projectId}/filter/{filter}\`\n Log entries matching a specific filter\n\n## Spanner Resources\n\n* **Spanner Schema** - \`gcp-spanner://{projectId}/{instanceId}/{databaseId}/schema\`\n Database schema for a Google Cloud Spanner database\n\n* **Table Preview** - \`gcp-spanner://{projectId}/{instanceId}/{databaseId}/tables/{tableName}/preview\`\n Preview of data in a Spanner table\n\n## Monitoring Resources\n\n* **Recent Metrics** - \`gcp-monitoring://${projectId}/recent\`\n Recent metrics from Google Cloud Monitoring\n\n* **Filtered Metrics** - \`gcp-monitoring://{projectId}/filter/{filter}\`\n Metrics matching a specific filter\n`
}]
};
}
);
```
This implementation creates a dedicated resource at `resources://list` that provides a formatted markdown document listing all available resources with their URIs and descriptions.
### 2. MIME Types
Add explicit MIME types to all resource responses:
```typescript
return {
contents: [{
uri: uri.href,
text: `# Recent Logs for Project: ${actualProjectId}\n\n${formattedLogs}`,
mimeType: "text/markdown"
}]
};
```
### 3. Resource Subscriptions
Implement subscription support for resources that change frequently:
```typescript
// In src/services/logging.ts
server.setRequestHandler(SubscribeResourceRequestSchema, async (request) => {
const uri = request.params.uri;
// Add subscription logic here
// Store subscription in a map
return { success: true };
});
server.setRequestHandler(UnsubscribeResourceRequestSchema, async (request) => {
const uri = request.params.uri;
// Remove subscription
return { success: true };
});
// When logs change
server.sendNotification({
type: "notifications/resources/updated",
params: {
uri: "gcp-logs://recent"
}
});
```
### 4. Pagination
Add pagination support for large resources:
```typescript
server.resource(
'paginated-logs',
new ResourceTemplate('gcp-logs://{projectId}/page/{page}/size/{pageSize}', { list: undefined }),
async (uri, { projectId, page, pageSize }, _extra) => {
// Implement pagination logic
const pageNum = parseInt(page as string) || 1;
const size = parseInt(pageSize as string) || 50;
// Fetch logs with pagination
// ...
return {
contents: [{
uri: uri.href,
text: `# Logs (Page ${pageNum})\n\n${formattedLogs}`,
mimeType: "text/markdown"
}]
};
}
);
```
### 5. Enhanced Security
Improve security for resource access:
```typescript
// Validate URI parameters
function validateResourceUri(uri: string): boolean {
// Implement validation logic
// Check for injection attacks, etc.
return true;
}
// In resource handlers
if (!validateResourceUri(uri.href)) {
throw new GcpMcpError('Invalid resource URI', 'INVALID_ARGUMENT', 400);
}
```
### 6. Binary Resources
Add support for binary resources (e.g., charts or visualisations):
```typescript
// Generate a chart image
const chartBuffer = await generateMetricsChart(timeSeries);
const base64Image = chartBuffer.toString('base64');
return {
contents: [{
uri: uri.href,
blob: base64Image,
mimeType: "image/png"
}]
};
```
## Implementation Timeline
1. Resource Discovery - High Priority
2. MIME Types - High Priority
3. Pagination - Medium Priority
4. Enhanced Security - Medium Priority
5. Subscriptions - Low Priority
6. Binary Resources - Low Priority
## References
- [MCP Resource Documentation](https://modelcontextprotocol.io/docs/concepts/resources/)
- [MCP Resource Examples](https://github.com/modelcontextprotocol/servers/blob/main/src/postgres/)