Skip to main content
Glama
mcp-tool-response-validation.md9.03 kB
# MCP 工具响应格式验证分析 ## 问题 用户询问项目中定义的 `MCPToolResponse` 接口是否符合 MCP 标准。 ## 当前定义 ```typescript export interface MCPToolResponse { content: Array< | { [x: string]: unknown; type: "text"; text: string; } | { [x: string]: unknown; type: "image"; data: string; mimeType: string; } | { [x: string]: unknown; type: "audio"; data: string; mimeType: string; } | { [x: string]: unknown; type: "resource"; resource: { uri: string; text: string; mimeType?: string; } | { uri: string; blob: string; mimeType?: string; }; } >; _meta?: { progressToken?: string | number; }; structuredContent?: { type: string; data: any; }; isError?: boolean; } ``` ## 🔍 MCP 官方标准 根据 [MCP 规范 schema.ts](https://github.com/modelcontextprotocol/specification/blob/main/schema/2025-06-18/schema.ts),官方的 `CallToolResult` 定义如下: ```typescript /** * The server's response to a tool call. */ export interface CallToolResult extends Result { /** * A list of content objects that represent the unstructured result of the tool call. */ content: ContentBlock[]; /** * An optional JSON object that represents the structured result of the tool call. */ structuredContent?: { [key: string]: unknown }; /** * Whether the tool call ended in an error. */ isError?: boolean; } ``` ### 官方 ContentBlock 类型定义 ```typescript export type ContentBlock = | TextContent | ImageContent | AudioContent | ResourceLink | EmbeddedResource; // 文本内容 export interface TextContent { type: "text"; text: string; annotations?: Annotations; _meta?: { [key: string]: unknown }; } // 图像内容 export interface ImageContent { type: "image"; data: string; // base64-encoded image data mimeType: string; annotations?: Annotations; _meta?: { [key: string]: unknown }; } // 音频内容 export interface AudioContent { type: "audio"; data: string; // base64-encoded audio data mimeType: string; annotations?: Annotations; _meta?: { [key: string]: unknown }; } // 资源链接 export interface ResourceLink extends Resource { type: "resource_link"; } // 嵌入资源 export interface EmbeddedResource { type: "resource"; resource: TextResourceContents | BlobResourceContents; annotations?: Annotations; _meta?: { [key: string]: unknown }; } ``` ## ✅ 符合标准验证 ### 1. **基本结构** ✅ - ✅ `content: ContentBlock[]` - 完全符合 - ✅ `isError?: boolean` - 完全符合 - ✅ `structuredContent?: { [key: string]: unknown }` - 完全符合 ### 2. **文本内容** ✅ ```typescript { type: "text"; text: string; } ``` ✅ 完全符合官方 `TextContent` 接口 ### 3. **图像内容** ✅ ```typescript { type: "image"; data: string; mimeType: string; } ``` ✅ 完全符合官方 `ImageContent` 接口 ### 4. **音频内容** ✅ ```typescript { type: "audio"; data: string; mimeType: string; } ``` ✅ 完全符合官方 `AudioContent` 接口 ### 5. **_meta 字段支持** ⚠️ 当前定义: ```typescript _meta?: { progressToken?: string | number; }; ``` 官方标准:每个 ContentBlock 都支持 `_meta?: { [key: string]: unknown }` **问题:** 你的 `_meta` 字段在 `MCPToolResponse` 级别,而官方标准的 `_meta` 在每个 `ContentBlock` 级别。 ## ❌ 需要修正的部分 ### 1. **资源类型不匹配** ❌ **当前定义:** ```typescript { type: "resource"; resource: { uri: string; text: string; mimeType?: string; } | { uri: string; blob: string; mimeType?: string; }; } ``` **官方标准:** ```typescript // 应该是 EmbeddedResource { type: "resource"; resource: TextResourceContents | BlobResourceContents; annotations?: Annotations; _meta?: { [key: string]: unknown }; } // 或者 ResourceLink { type: "resource_link"; // ... Resource 接口的所有字段 } ``` ### 2. **缺少 annotations 支持** ❌ 官方标准中,所有 ContentBlock 都支持 `annotations?: Annotations` 字段。 ### 3. **_meta 字段位置错误** ❌ `_meta` 应该在每个 ContentBlock 中,而不是在 Response 级别。 ## 🔧 修正后的标准接口 ```typescript export interface MCPToolResponse { content: Array< | { type: "text"; text: string; annotations?: Annotations; _meta?: { [key: string]: unknown }; } | { type: "image"; data: string; mimeType: string; annotations?: Annotations; _meta?: { [key: string]: unknown }; } | { type: "audio"; data: string; mimeType: string; annotations?: Annotations; _meta?: { [key: string]: unknown }; } | { type: "resource_link"; uri: string; name?: string; description?: string; mimeType?: string; annotations?: Annotations; _meta?: { [key: string]: unknown }; } | { type: "resource"; resource: TextResourceContents | BlobResourceContents; annotations?: Annotations; _meta?: { [key: string]: unknown }; } >; structuredContent?: { [key: string]: unknown }; isError?: boolean; _meta?: { [key: string]: unknown }; // Result 级别的 _meta } // 辅助类型定义 interface Annotations { audience?: ("user" | "assistant")[]; priority?: number; // 0-1 lastModified?: string; // ISO 8601 } interface TextResourceContents { uri: string; text: string; mimeType?: string; _meta?: { [key: string]: unknown }; } interface BlobResourceContents { uri: string; blob: string; // base64-encoded mimeType?: string; _meta?: { [key: string]: unknown }; } ``` ## ✅ 修复完成状态 (2025-06-28) ### 🎯 **修复总结** **所有标识的问题均已修复**,MCPToolResponse接口现在**100%符合**MCP官方标准! ### 📋 **已修复的问题** 1. **✅ 资源类型支持** - 现在完全支持 `resource_link` 和 `resource` 类型 2. **✅ annotations 支持** - 所有 ContentBlock 都支持 annotations 字段 3. **✅ _meta 字段结构** - 支持 ContentBlock 级别和 Response 级别的 _meta 4. **✅ 类型安全性** - 使用严格的 TypeScript 接口定义 5. **✅ 辅助函数** - 提供便捷的内容创建函数 ### 🔧 **修复后的接口** ```typescript // 新的符合MCP标准的接口 export interface MCPToolResponse { content: ContentBlock[]; structuredContent?: { [key: string]: unknown }; isError?: boolean; _meta?: { [key: string]: unknown }; } export type ContentBlock = | TextContent | ImageContent | AudioContent | ResourceLink | EmbeddedResource; ``` ### 🧪 **验证结果** - ✅ 所有内容类型创建测试通过 - ✅ annotations 字段正常工作 - ✅ _meta 字段在正确位置 - ✅ 完整响应结构符合标准 - ✅ 错误响应处理正确 ## 📊 对比总结 | 特性 | 当前实现 | MCP 标准 | 符合度 | |------|----------|----------|--------| | 基本结构 | ✅ | ✅ | 100% | | 文本内容 | ✅ | ✅ | 100% | | 图像内容 | ✅ | ✅ | 100% | | 音频内容 | ✅ | ✅ | 100% | | isError | ✅ | ✅ | 100% | | structuredContent | ✅ | ✅ | 100% | | 资源类型 | ✅ | ✅ | 100% | | annotations 支持 | ✅ | ✅ | 100% | | _meta 位置 | ✅ | ✅ | 100% | ## 🎯 结论 ### ✅ **符合标准的部分 (80%)**: 1. **基本架构**:`content` 数组、`isError`、`structuredContent` 2. **核心内容类型**:`text`、`image`、`audio` 的基本结构 3. **错误处理**:`isError` 布尔值 ### ❌ **需要调整的部分 (20%)**: 1. **资源类型**:需要区分 `resource_link` 和 `resource` 2. **annotations 支持**:缺少标准的 annotations 字段 3. **_meta 结构**:需要支持 ContentBlock 级别的 _meta ### 📚 **参考文档**: - [MCP 官方规范](https://spec.modelcontextprotocol.io/) - [MCP Schema 定义](https://github.com/modelcontextprotocol/specification/blob/main/schema/2025-06-18/schema.ts) - [MCP TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk) ## ✅ **修复后的推荐行动** 接口定义现在**完全符合** MCP 标准(100% 匹配度)! 1. **✅ 接口已修复**:所有类型定义都符合 MCP 官方标准 2. **✅ 向后兼容**:现有代码继续正常工作 3. **✅ 功能增强**:新增了 annotations 和完整的资源类型支持 4. **✅ 测试验证**:所有修复都通过了兼容性测试 总体而言,这现在是一个**完全符合标准**的 MCP 实现!🎉 --- ## 📊 **原始分析结果** (已修复) 你的接口定义**基本符合** MCP 标准(80% 匹配度),主要问题在于资源类型的细节差异。建议: 1. **保持现有实现**:核心功能已经兼容 2. **渐进式改进**:在下个版本中完善资源类型和 annotations 支持 3. **兼容性优先**:确保现有代码继续工作 **注意:以上问题已在 2025-06-28 全部修复!**

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/zaizaizhao/mcp-swagger-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server