# 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
- ✅ 添加结构化输出支持
- ✅ 创建响应模型库
- ✅ 更新所有现有工具
- ✅ 添加自动化测试
- ✅ 更新文档和示例
---
**注意**:本升级完全向后兼容,现有客户端和集成无需任何更改即可继续正常工作。所有更改都是增量式的,旨在增强而非替换现有功能。