Skip to main content
Glama
OUTPUTSCHEMA_UPGRADE_PLAN.md8.13 kB
# MCP SDK outputSchema 支持升级规划 ## 📋 升级概述 本文档描述了将 Awesome-MCP-Scaffold 升级以支持 MCP SDK v1.11.0 的 `outputSchema` 功能的详细规划。这个升级将使脚手架中的所有工具默认支持结构化输出,提供更好的类型安全性和开发体验。 ## 🎯 升级目标 ### 主要目标 - 升级 MCP SDK 到 v1.11.0([最新版本](https://github.com/modelcontextprotocol/python-sdk/releases/tag/v1.11.0)) - 为所有工具添加 `outputSchema` 支持 - 保持现有功能完全兼容 - 提供开箱即用的结构化输出 ### 核心原则 - **无破坏性更改**:现有代码和API保持完全兼容 - **渐进式增强**:只添加新功能,不修改现有逻辑 - **开发者友好**:简化新工具的开发流程 - **类型安全**:利用Python类型系统提供更好的开发体验 ## 🔍 技术背景 ### outputSchema 功能说明 根据 MCP SDK v1.11.0,工具现在支持: - **输入验证**:通过 `inputSchema`(现有功能) - **输出验证**:通过 `outputSchema`(新功能) - **结构化数据**:JSON 格式的类型化输出 - **向后兼容**:同时提供文本和结构化输出 ### 支持的返回类型 - Pydantic BaseModel 子类(推荐) - TypedDict - 带类型注解的数据类 - 基础类型(自动包装为 `{"result": value}`) - dict[str, T] 格式 ## 📅 实施计划 ### 阶段 1:基础设施升级 ⭐⭐⭐ **预计时间**:1-2 小时 #### 1.1 依赖升级 - [ ] 升级 mcp 到 v1.11.0 - [ ] 验证兼容性 - [ ] 更新 requirements.txt #### 1.2 类型模型创建 - [ ] 创建 `server/models/responses.py` - [ ] 定义标准响应模型 - [ ] 确保类型安全 ### 阶段 2:工具响应模型 ⭐⭐ **预计时间**:2-3 小时 #### 2.1 计算器工具模型 - [ ] `CalculationResult` - [ ] `BMIResult` - [ ] `StatisticsResult` #### 2.2 文本处理工具模型 - [ ] `TextAnalysisResult` - [ ] `CaseConversionResult` - [ ] `ExtractionResult` #### 2.3 文件操作工具模型 - [ ] `FileOperationResult` - [ ] `FileInfoResult` - [ ] `DirectoryResult` ### 阶段 3:工具更新 ⭐⭐ **预计时间**:3-4 小时 #### 3.1 更新现有工具 - [ ] 计算器工具返回类型更新 - [ ] 文本处理工具返回类型更新 - [ ] 文件操作工具返回类型更新 #### 3.2 保持向后兼容 - [ ] 验证现有客户端正常工作 - [ ] 确保 JSON-RPC 响应格式正确 ### 阶段 4:测试和验证 ⭐ **预计时间**:1-2 小时 #### 4.1 功能测试 - [ ] outputSchema 生成测试 - [ ] 结构化输出验证测试 - [ ] 向后兼容性测试 #### 4.2 集成测试 - [ ] MCP 协议测试 - [ ] HTTP 端点测试 ### 阶段 5:文档更新 ⭐ **预计时间**:1 小时 #### 5.1 开发文档 - [ ] 更新 BEST_PRACTICES.md - [ ] 创建 outputSchema 使用指南 - [ ] 更新 API 文档 #### 5.2 示例代码 - [ ] 创建结构化输出示例 - [ ] 更新 README ## 🏗️ 技术实现 ### 响应模型设计 ```python # server/models/responses.py from pydantic import BaseModel, Field from typing import Optional, List, Dict, Any from datetime import datetime class BaseToolResponse(BaseModel): """工具响应基类""" success: bool = Field(description="操作是否成功") timestamp: datetime = Field(default_factory=datetime.now, description="操作时间") class CalculationResult(BaseToolResponse): """计算结果模型""" result: float = Field(description="计算结果") expression: Optional[str] = Field(None, description="计算表达式") operation: str = Field(description="操作类型") class BMIResult(BaseToolResponse): """BMI计算结果""" bmi: float = Field(description="BMI值", ge=0) category: str = Field(description="BMI分类") weight_kg: float = Field(description="体重(千克)", gt=0) height_m: float = Field(description="身高(米)", gt=0) ``` ### 工具更新示例 ```python # server/tools/calculator.py(更新后) from ..models.responses import CalculationResult, BMIResult @mcp.tool(title="Add Numbers", description="Add two numbers together") def add(a: float, b: float) -> CalculationResult: """Add two numbers and return structured result.""" result = a + b return CalculationResult( success=True, result=result, expression=f"{a} + {b}", operation="addition" ) @mcp.tool(title="Calculate BMI", description="Calculate Body Mass Index") def calculate_bmi(weight_kg: float, height_m: float) -> BMIResult: """Calculate BMI and return structured result.""" if weight_kg <= 0 or height_m <= 0: raise ValueError("Weight and height must be positive numbers") bmi = weight_kg / (height_m ** 2) # 确定BMI分类 if bmi < 18.5: category = "Underweight" elif bmi < 25: category = "Normal weight" elif bmi < 30: category = "Overweight" else: category = "Obese" return BMIResult( success=True, bmi=round(bmi, 2), category=category, weight_kg=weight_kg, height_m=height_m ) ``` ## 🧪 测试策略 ### 自动化测试 ```python # tests/test_output_schema.py async def test_tool_has_output_schema(): """验证工具包含outputSchema""" tools = await client.list_tools() bmi_tool = next(t for t in tools.tools if t.name == "calculate_bmi") assert bmi_tool.outputSchema is not None assert bmi_tool.outputSchema["type"] == "object" assert "bmi" in bmi_tool.outputSchema["properties"] assert "category" in bmi_tool.outputSchema["properties"] async def test_structured_output(): """验证结构化输出""" result = await client.call_tool("calculate_bmi", { "weight_kg": 70, "height_m": 1.75 }) # 验证包含结构化内容 assert hasattr(result, 'structuredContent') assert result.structuredContent["success"] is True assert "bmi" in result.structuredContent assert "category" in result.structuredContent ``` ### 兼容性验证 ```bash # 验证现有客户端 echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | python run.py echo '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"add","arguments":{"a":2,"b":3}}}' | python run.py ``` ## 📁 文件结构变更 ``` server/ ├── models/ │ ├── __init__.py │ ├── common.py # 现有 │ └── responses.py # 新增:工具响应模型 ├── tools/ │ ├── __init__.py │ ├── calculator.py # 更新:添加结构化返回类型 │ ├── text_processing.py # 更新:添加结构化返回类型 │ └── file_operations.py # 更新:添加结构化返回类型 └── (其他文件保持不变) ``` ## ⚠️ 风险评估 ### 低风险 - **SDK升级**:v1.11.0 是稳定版本,向后兼容 - **模型添加**:纯增量功能,不影响现有逻辑 - **类型注解**:仅影响开发时,运行时兼容 ### 缓解措施 - 渐进式部署:一次更新一个工具模块 - 完整测试:验证所有现有功能正常 - 回滚准备:保持版本控制,可快速回退 ## 📊 成功指标 ### 技术指标 - [ ] 所有工具支持 outputSchema - [ ] 现有功能 100% 兼容 - [ ] 测试覆盖率保持 > 90% - [ ] 性能无显著影响(< 5%) ### 开发体验 - [ ] 新工具开发模板就绪 - [ ] 类型提示完整 - [ ] 文档完整更新 - [ ] 示例代码可用 ## 🚀 后续增强 ### 第二阶段功能 - 自定义响应验证器 - 响应模型生成工具 - 更丰富的类型支持 ### 生态系统集成 - Cursor AI 规则更新 - 开发模板优化 - 社区示例扩展 ## 📝 变更日志 ### v1.11.0 升级 - ✅ 升级 MCP SDK 到 v1.11.0 - ✅ 添加结构化输出支持 - ✅ 创建响应模型库 - ✅ 更新所有现有工具 - ✅ 添加自动化测试 - ✅ 更新文档和示例 --- **注意**:本升级完全向后兼容,现有客户端和集成无需任何更改即可继续正常工作。所有更改都是增量式的,旨在增强而非替换现有功能。

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/WW-AI-Lab/Awesome-MCP-Scaffold'

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