Skip to content

[兼容性问题] 18 个工具的 inputSchema 被 Moonshot/Kimi API 拒绝:根节点 type 与 anyOf/oneOf 同级(HTTP 400) #7

Description

@longkerdandy

问题描述

将 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:

这里存在两个相互制约的约束:

  1. Moonshot API 要求 anyOf/oneOf 场景下 type 只能出现在子项中,不能与
    anyOf/oneOf 同级;
  2. 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 个工具全部可用,调用正常。

环境

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions