AI Agent 真正开始干活时,需要的不只是一段提示词,还要知道可以调用哪些工具、每个参数是什么类型、哪些字段必填。MCP(Model Context Protocol)让工具更容易被发现和复用,但它并没有让 Claude、OpenAI 和 Gemini 的 API 请求格式自动变成一样。
一个在 Claude 中正常的 input_schema,复制到 OpenAI 后可能缺少 function 包装;OpenAI 的 Strict Mode 工具改成 Gemini 时,additionalProperties 又可能需要删除。这篇文章不讨论抽象的“Agent 未来”,只解决一个具体问题:如何把同一个工具定义稳定地迁移到 MCP、Claude、OpenAI 和 Gemini。
TL;DR:MCP、Claude、OpenAI 和 Gemini 都使用 JSON Schema 描述工具参数,但外层包装、字段名和支持的 Schema 子集不完全相同。MCP 常用
inputSchema,Claude 使用input_schema,OpenAI 使用tools[].function.parameters,Gemini 放在functionDeclarations[].parameters。先规范化为标准 JSON Schema,再生成各家包装,是最稳定的迁移方法。
四种工具定义有什么不同?
| 目标 | 参数 Schema 位置 | 常见注意点 |
|---|---|---|
| MCP | tools/list 结果中的 inputSchema |
工具还包含 name 和 description |
| Claude | tools[].input_schema |
字段名是 snake_case |
| OpenAI | tools[].function.parameters |
Strict Mode 对 required 和 additionalProperties 更严格 |
| Gemini | functionDeclarations[].parameters |
支持 JSON Schema/OpenAPI 的特定子集,需按当前 SDK 文档复核 |
最容易犯的错误,是只改了 input_schema 或 parameters 的字段名,却没有改外层结构。模型看到的参数规则可能一样,API 看到的请求对象却完全不同。
用一个天气工具看懂格式映射
先把参数收敛为一份中立 JSON Schema:
{
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "City name, for example Shanghai"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"]
}
},
"required": ["city"]
}
MCP 工具
{
"name": "get_weather",
"description": "Get the current weather for a city",
"inputSchema": {
"type": "object",
"properties": {
"city": { "type": "string" },
"unit": { "type": "string", "enum": ["celsius", "fahrenheit"] }
},
"required": ["city"]
}
}
Claude Tool Use
{
"name": "get_weather",
"description": "Get the current weather for a city",
"input_schema": {
"type": "object",
"properties": {
"city": { "type": "string" },
"unit": { "type": "string", "enum": ["celsius", "fahrenheit"] }
},
"required": ["city"]
}
}
OpenAI Function Calling
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get the current weather for a city",
"parameters": {
"type": "object",
"properties": {
"city": { "type": "string" },
"unit": { "type": "string", "enum": ["celsius", "fahrenheit"] }
},
"required": ["city"]
}
}
}
Gemini Function Calling
{
"name": "get_weather",
"description": "Get the current weather for a city",
"parameters": {
"type": "OBJECT",
"properties": {
"city": { "type": "STRING" },
"unit": { "type": "STRING", "enum": ["celsius", "fahrenheit"] }
},
"required": ["city"]
}
}
不同 Gemini SDK 版本可能接受枚举值或小写 JSON Schema 类型。不要凭记忆硬改,应以项目当前使用的 SDK 和官方文档为准。
最常见的 6 类 Schema 报错
1. 只复制参数体,丢了平台外层包装
OpenAI 需要 type: "function" 和 function 对象,Claude 工具则直接使用 name、description 和 input_schema。请不要把整个 Claude 工具对象直接塞进 OpenAI 的 parameters。
2. Strict Mode 下遗漏 additionalProperties: false
Strict 工具的目的是让模型输出严格匹配 Schema。对象层级通常需要禁止未声明的字段,而且嵌套对象也要递归检查。
3. required 与 properties 不一致
required 中的名称必须在 properties 里存在。启用严格结构输出时,某些 API 还会要求所有字段出现在 required 中,可选性通过允许 null 表达。
4. Gemini 不接受某些 JSON Schema 关键字
$schema、$id 或复杂的 additionalProperties 并不一定属于目标 API 支持的子集。迁移时应删除无关元数据,但不要误删 enum、required 和嵌套参数。
5. 工具名称不稳定
get-weather、get_weather 和 GetWeather 对业务人员来说可能是同一件事,但对 Agent 调度器来说是三个不同的标识符。确定命名规则后,不要在不同平台中随意改名。
6. Schema 合法,但工具描述太模糊
Schema 验证通过不等于模型会正确选择工具。description 应说清使用时机、输入边界和不该调用的场景,不要只写“查询数据”。
如何在浏览器里完成格式转换
打开 Tool Schema 转换器,粘贴 Claude Tool、OpenAI Function、Gemini Function Declaration 或原始 JSON Schema。工具会识别输入并同时生成三种平台格式。
开启 Strict Mode 时,转换器会为对象节点补充 additionalProperties: false,并根据属性列表整理 required。转换后建议再用 JSON 格式化与校验 检查语法,并用 Token 计数器 评估大量工具定义带来的上下文成本。
格式转换只能处理结构差异,不能证明业务语义正确。生成结果必须在目标 SDK 中做一次真实调用测试。
MCP 和多模型迁移检查清单
- 工具
name在所有平台保持一致。 description明确说明调用时机和禁用场景。- 所有
required字段都存在于properties。 - 嵌套对象和数组的
items也被完整转换。 - Strict Mode 所需的对象限制已递归处理。
- 不支持的
$schema、$id等元数据已移除。 - 参数类型和大小写符合当前 SDK 要求。
- 已测试正常输入、缺少必填字段和多余字段三种情况。
- 服务端仍会验证参数,而不是信任模型输出。
- 工具失败时返回可操作的错误,避免 Agent 无限重试。
官方规范与参考
- MCP Tools Specification
- OpenAI Function Calling Guide
- Anthropic Tool Use Documentation
- Google Gemini Function Calling
- JSON Schema Specification
常见问题
MCP 的 inputSchema 能直接给 Claude 使用吗?
参数 Schema 通常可以复用,但 Claude API 的工具定义字段是 input_schema,仍需转换外层字段并验证使用的 JSON Schema 特性是否受支持。
Claude input_schema 和 OpenAI parameters 有什么区别?
两者内部都以 JSON Schema 描述参数,但所在的 API 外层对象不同。OpenAI 还支持在 Function 对象中配置 Strict Mode,因此不应只做字段名替换。
为什么开启 strict: true 后 Schema 报错?
常见原因是对象节点未禁止额外字段、required 未覆盖所需属性,或使用了目标 API 不支持的 JSON Schema 关键字。
Gemini 的 type 为什么有时是大写?
不同 Gemini SDK 和示例可能使用枚举常量或 JSON 字符串。转换器会生成常见的大写类型形式,但最终仍应以项目使用的 SDK 版本为准。
Tool Schema 转换会上传我的接口定义吗?
PocketKit 的 Tool Schema 转换器 在浏览器中处理粘贴的 JSON,转换本身不需要把 Schema 发送到服务器。但在粘贴前仍应删除密钥、内部 URL 和其他敏感值。
转换后是否还需要测试?
需要。Schema 转换器能处理结构差异,但无法验证工具服务的权限、超时、业务参数和错误恢复逻辑。至少要测试一次正常调用和两次失败调用。
如果你正在搭建多模型 Agent,可以从 AI 应用开发工具包 继续完成 Schema 转换、Token 预算、提示词整理和安全测试。