问题描述
将 FTShare-MCP 接入使用 Moonshot/Kimi 模型的客户端(如 Kimi Code CLI,
模型 kimi-for-coding)时,整个工具列表被 API 拒绝,所有工具均不可用。
172 个工具中有 18 个的 inputSchema 在根节点同时声明了 "type": "object"
和 anyOf(12 个)或 oneOf(6 个)。这符合标准 JSON Schema,但超出了
Moonshot API 接受的子集范围。
报错信息
Error: [provider.api_error] 400 tools.function.parameters is not a valid
moonshot flavored json schema, details: <At path 'root': when using anyOf,
type should be defined in anyOf items instead of the parent schema>
受影响的工具(18 个)
- 根级
anyOf:ft_balance、ft_cashflow、ft_earnings_reports_paginated、
ft_get_eastmoney_stock_valuation、ft_income、ft_performance_forecasts_paginated、
ft_stock_announcements、ft_stock_float_holders、ft_stock_holders、
ft_stock_holders_number、ft_stock_reports、ft_stock_share_chg
- 根级
oneOf:ft_get_fund_asset_allocation、ft_get_fund_daily、
ft_get_fund_manager、ft_get_fund_net_value、
ft_get_fund_net_value_performance、ft_get_fund_portfolio
以 ft_balance 为例(节选):
{
"type": "object",
"anyOf": [
{ "properties": { "stock_code": {} }, "required": ["stock_code"] },
{ "properties": { "report_type": {}, "year": {} }, "required": ["year", "report_type"] }
],
"properties": { "stock_code": { ... }, "year": { ... } },
"required": []
}
原因
Moonshot 官方文档明确说明工具的 parameters 必须是 JSON Schema 的一个子集,
称为 MFJS(Moonshot Flavored JSON Schema),并提供了官方校验器 walle:
这里存在两个相互制约的约束:
- Moonshot API 要求 anyOf/oneOf 场景下 type 只能出现在子项中,不能与
anyOf/oneOf 同级;
- Kimi Code CLI 等客户端在校验工具列表时,又强制要求 inputSchema 根节点
必须是 "type": "object",因此简单地删掉根级 type 也行不通。
唯一能同时通过两侧校验的写法是:根节点保留 "type": "object",不在根级
使用 anyOf/oneOf。Google Gemini 的 function calling 也有几乎相同的限制,
因此这样调整可以普遍提升跨平台兼容性,不仅仅是适配 Moonshot。
建议修复
将上述 18 个工具的根 schema 改为 {"type": "object", "properties": {...}},
去掉根级 anyOf/oneOf。互斥参数组合(如 stock_code 与 year+report_type
二选一)在各属性的 description 中已有说明,且服务端本身也会对非法组合
返回可读的 isError 错误,实际校验能力没有损失。
Moonshot 官方 walle 库还提供 ms_tool_req_simplify 辅助函数,可将工具
schema 规范化为兼容子集,可作为构建时检查或运行时清洗手段。
临时绕过方案
在服务端修复前,用户可以在客户端侧加一个本地 stdio MCP 代理,拦截
tools/list 响应并改写 schema(保留根级 type、删除根级 anyOf/oneOf)。
已验证有效:172 个工具全部可用,调用正常。
环境
问题描述
将 FTShare-MCP 接入使用 Moonshot/Kimi 模型的客户端(如 Kimi Code CLI,
模型 kimi-for-coding)时,整个工具列表被 API 拒绝,所有工具均不可用。
172 个工具中有 18 个的 inputSchema 在根节点同时声明了
"type": "object"和
anyOf(12 个)或oneOf(6 个)。这符合标准 JSON Schema,但超出了Moonshot API 接受的子集范围。
报错信息
受影响的工具(18 个)
anyOf:ft_balance、ft_cashflow、ft_earnings_reports_paginated、ft_get_eastmoney_stock_valuation、ft_income、ft_performance_forecasts_paginated、
ft_stock_announcements、ft_stock_float_holders、ft_stock_holders、
ft_stock_holders_number、ft_stock_reports、ft_stock_share_chg
oneOf:ft_get_fund_asset_allocation、ft_get_fund_daily、ft_get_fund_manager、ft_get_fund_net_value、
ft_get_fund_net_value_performance、ft_get_fund_portfolio
以 ft_balance 为例(节选):
{ "type": "object", "anyOf": [ { "properties": { "stock_code": {} }, "required": ["stock_code"] }, { "properties": { "report_type": {}, "year": {} }, "required": ["year", "report_type"] } ], "properties": { "stock_code": { ... }, "year": { ... } }, "required": [] }原因
Moonshot 官方文档明确说明工具的 parameters 必须是 JSON Schema 的一个子集,
称为 MFJS(Moonshot Flavored JSON Schema),并提供了官方校验器 walle:
json schema 的子集(详见 MFJS 规范)"
https://platform.kimi.com/docs/api/tool-use
https://github.com/MoonshotAI/walle
JSON Schema"
https://forum.moonshot.ai/t/tool-calling-specification-violation-on-moonshot-api/102
这里存在两个相互制约的约束:
anyOf/oneOf 同级;
必须是
"type": "object",因此简单地删掉根级 type 也行不通。唯一能同时通过两侧校验的写法是:根节点保留
"type": "object",不在根级使用 anyOf/oneOf。Google Gemini 的 function calling 也有几乎相同的限制,
因此这样调整可以普遍提升跨平台兼容性,不仅仅是适配 Moonshot。
建议修复
将上述 18 个工具的根 schema 改为
{"type": "object", "properties": {...}},去掉根级 anyOf/oneOf。互斥参数组合(如 stock_code 与 year+report_type
二选一)在各属性的 description 中已有说明,且服务端本身也会对非法组合
返回可读的 isError 错误,实际校验能力没有损失。
Moonshot 官方 walle 库还提供 ms_tool_req_simplify 辅助函数,可将工具
schema 规范化为兼容子集,可作为构建时检查或运行时清洗手段。
临时绕过方案
在服务端修复前,用户可以在客户端侧加一个本地 stdio MCP 代理,拦截
tools/list 响应并改写 schema(保留根级 type、删除根级 anyOf/oneOf)。
已验证有效:172 个工具全部可用,调用正常。
环境