[具身智能-339]:MCP的工具定义标准 Jason格式,内容详解与示例说明
在 MCP 协议中工具定义Tool Definition本质上就是一段符合JSON Schema标准的 JSON 数据。它的作用非常明确它是 AI 的“产品说明书”。AI 看不懂你的 Python 代码它只能通过这段 JSON 知道“哦我有这个工具它叫什么能干什么以及我需要给它什么参数。”下面我为你详细拆解这个 JSON 格式的每一个字段并提供一个完整的实战示例。 核心结构详解一个标准的 MCP 工具定义 JSON 通常包含三个顶级字段name、description和inputSchema。1. 基础信息表格字段名类型说明对应 Python 代码name字符串工具的唯一标识符。AI调用时会使用这个名字。通常使用下划线命名法如get_weather。def get_weather(...)中的函数名description字符串工具的功能描述。这是AI 决定是否调用该工具的关键依据。描述越清晰AI 调用越准确。AI使用自然语言进行模糊匹配因此描述得越准确匹配度越高函数顶部的文档字符串2. 输入模式 (inputSchema)这是最复杂也最重要的部分它遵循JSON Schema规范用来告诉AI 参数的格式。type: 固定为object表示参数是一个对象键值对集合keyvalue。properties: 定义具体参数的“字典”。键名如city对应参数名。键值如{type: string, description: ...}定义该参数的类型和描述。required: 一个字符串数组列出必须提供的参数名。如果AI 没提供这些参数调用就会失败。 完整示例天气查询工具假设我们有一个 Python 函数用来查询天气。Python 代码pythondef get_weather(city: str, unit: str celsius) - str: 查询指定城市的当前天气。 Args: city: 城市名称例如 Beijing 或 Shanghai unit: 温度单位celsius 表示摄氏度fahrenheit 表示华氏度 # ... 具体逻辑 ... return f{city} 的天气是晴天25{unit}对应的 MCP 工具定义 JSONjson{ name: get_weather, description: 查询指定城市的当前天气情况支持选择温度单位。, inputSchema: { type: object, properties: { city: { type: string, description: 城市名称例如 Beijing 或 Shanghai }, unit: { type: string, description: 温度单位可选值为 celsius (摄氏度) 或 fahrenheit (华氏度), enum: [celsius, fahrenheit] } }, required: [city] } } 字段深度解读让我们逐行看看这个 JSON 是怎么“翻译” Python 代码的1.name和descriptionname: get_weather: 直接对应函数名。description: ...: 这里我们把 Python 的文档字符串提炼了一下。注意这里不要写太复杂的代码逻辑要用自然语言告诉 AI“这个工具能解决什么问题”。2.properties中的类型映射MCP 使用 JSON Schema 的类型系统与 Python 类型的对应关系如下表格Python 类型JSON Schema 类型示例strstringhelloint/floatnumber123,3.14boolbooleantrue,falselist/arrayarray[a, b]dictobject{key: value}3.required(必填项)required: [city]:在 Python 函数中city没有默认值所以是必填的。unit有默认值celsius所以它是选填的。规则只有当参数在required列表中时AI 才会被强制要求提供该参数否则 AI 可以选择不传此时函数会使用默认值。4. 高级技巧enum(枚举)注意看unit参数里多了一个enum: [celsius, fahrenheit]。作用这限制了 AI 只能从这两个词里选。这非常有用可以防止 AI 瞎编参数比如传了 kelvin 或 度保证程序的稳定性。 调用流程演示当这段 JSON 被发送给 AI 后流程是这样的用户提问“帮我查查上海现在的天气用华氏度。”AI 思考看到工具get_weather。阅读description确认是查天气的。检查inputSchema发现需要city(必填) 和unit(可选)。从用户的话里提取city Shanghaiunit fahrenheit。AI 发出调用请求 (JSON-RPC)json{ jsonrpc: 2.0, id: 123, method: tools/call, params: { name: get_weather, arguments: { city: Shanghai, unit: fahrenheit } } }你的 Server 执行Python 函数接收到参数执行代码返回结果。 避坑指南描述太简略不要只写 Get weather。要写获取指定城市的实时天气数据包括温度、湿度和风力等级。描述越丰富AI 越智能。AI就靠这个进行自然语言的匹配。类型不匹配如果你在 Python 里要的是int但 JSON 里写成了type: stringAI 可能会传100而不是100导致你的代码报错。忘记required如果你的函数逻辑强依赖某个参数一定要把它加到required列表里否则 AI 可能会偷懒不传