{
"name": "get_weather",
"description": "Current weather for a city",
"input_schema": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "City name"
}
},
"required": [
"city"
],
"additionalProperties": false
}
}功能说明
Function-calling 与 MCP 工具由 JSON Schema 定义,而提供商以严格模式运行该 schema:每个对象都设 additionalProperties: false,每个属性都列入 required,不使用 default,全程类型化。本工具为此做两件事:
- 构建 — 填入工具名称、描述和参数行;它生成的 schema 从构造上就符合严格模式,实时更新,并带复制按钮。
- Lint — 粘贴任意工具定义;它按严格模式契约检查,并按确切路径列出每一条违规。一键应用自动严格化——修复机械性问题——而名称和描述仍由你来写。
规则(linter 强制执行的精确契约)
| 规则 | 检查内容 |
|---|---|
non-empty-name |
名称由 1–64 个 [a-z0-9_-] 字符组成(get_weather 惯例) |
description-present |
工具和每个属性都带有真实描述 |
no-additional-properties |
每个对象——根对象与嵌套对象——都设置 additionalProperties: false |
all-required |
required 在每一层列出所有属性 |
no-defaults |
没有 default 键——提供商会拒绝或忽略它们 |
typed-properties |
每个属性的类型是 string · number · integer · boolean · object · array 之一 |
enum-values |
枚举非空且共享同一原始类型 |
array-items |
数组声明带类型的 items |
json-parseable |
输入可解析,且 input_schema 是类型化对象 |
自动严格化修复 no-additional-properties、all-required(包括 required 中的垃圾条目)和 no-defaults——递归且幂等。它绝不发明名称或描述:那些是语义层面的,不是机械层面的。
使用方法
- 构建模式:输入工具名称和描述,为每个参数添加一行(名称、类型、描述),然后复制生成的 schema。这里刻意没有“可选”开关——严格模式要求每个属性都在
required中,可选性属于你模型的语义,而不是 schema。 - Lint 模式:粘贴一个定义(试试示例标签——一个有效、一个损坏)。问题会附带规则 id 和路径显示;按自动严格化修复机械性问题;修复后的 schema 会替换输入供审查,并带复制按钮。
- 把你的 agent 指向上面的规则表——它是“为什么我的工具 schema 被拒绝?”的答案面。
示例
一个干净的工具 — 带 city 和 unit 枚举的 get_weather:零问题,可原样复制到任何提供商的工具定义中。
一个典型的损坏示例 — 空描述、一个 default、缺失的 additionalProperties、以及忘了 unit 的 required:linter 指出全部六处违规;自动严格化立即修复三处;其余需要你补两句话。
补充说明
- 100% 客户端运行。 不向任何地方发送数据——schema 可能是专有的。
- 严格模式是安全默认值:它保证模型的参数能通过你 schema 的校验,这正是让工具调用值得执行的原因。
- Go 孪生:相同规则以 CLI 中的
cosmodev tool-schema-builder提供(共享测试向量),让 agent 可以在本地对 schema 做 lint。 - 为什么没有可选参数? 严格模式的提供商要求每个属性都在
required中;生态惯例是在描述中说明可选性,让模型在语义上省略值。