news 2026/7/18 17:11:48

【Bug已解决】`unsupported call: mcp__<server>__<tool>` for MCP tools when used with custom Responses A...

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Bug已解决】`unsupported call: mcp__<server>__<tool>` for MCP tools when used with custom Responses A...

【Bug已解决】unsupported call: mcp__<server>__<tool>for MCP tools when used with custom Responses API provider (Apps SDK + custom model) 解决方案

原始报错线索:unsupported call: mcp__<server>__<tool>for MCP tools when used with custom Responses API provider (Apps SDK + custom model)(当使用自定义的 Responses API provider 时,调用 MCP 工具会报unsupported call,因为该 provider 没有声明支持这种命名空间工具)。


一、现象长什么样

用户配了一个「自定义 Responses API provider」(比如自己搭的模型网关)。然后:

  1. 想用一个 MCP 工具,名字形如mcp__filesystem__read
  2. 调用被 provider 拒绝:unsupported call: mcp__filesystem__read
  3. 换成官方内置 provider,同样的工具却能调;
  4. 说明:自定义 provider 的「支持工具清单」里没有mcp__前缀这套命名,于是拒掉。 根因是工具名带提供方特定的命名空间前缀,切换 provider 时前缀/能力没被适配和声明,目标 provider 不认识就拒绝。

二、背景:工具命名空间与能力声明

模型通过「工具名」调用外部能力。不同 provider 对工具名的约定不同:

  • 内置 provider 认识mcp__<server>__<tool>这种 MCP 命名空间;
  • 自定义 provider 可能只认识裸名read,或自己另一套前缀;
  • 还有的 provider 要求工具先在tools/list(或等价声明)里登记,未登记即unsupported。 问题出在调用方用了 A 的命名,发给了按 B 约定校验的 provider,中间缺一道「命名空间翻译 + 能力校验」。

三、为什么报 unsupported call:根因

3.1 命名空间前缀未翻译

mcp__filesystem__read是给内置 provider 看的;自定义 provider 要的是readfs_read。没翻译直接发 → 不认识。

3.2 provider 能力未声明

自定义 provider 的「支持工具集」是空的或不含该工具,调用前没校验就发出去 → 被拒。

3.3 工具名含保留字符

mcp__双下划线可能是某些系统的保留/分隔符,自定义 provider 解析器把它当非法名。

3.4 缺少适配层

调用方直接拼 MCP 名发给 provider,没有「provider 适配器」做转换与兜底。

四、最小可运行复现(命名不匹配被拒)

下面演示「按 A 命名发给 B provider」如何被拒:

class Provider: def __init__(self, name, supported_prefixes): self.name = name self.supported_prefixes = supported_prefixes # 该 provider 认哪些前缀 def call(self, tool_name): prefix = tool_name.split("__")[0] if "__" in tool_name else "" if prefix and prefix not in self.supported_prefixes: raise ValueError(f"unsupported call: {tool_name}") return f"执行 {tool_name}" builtin = Provider("builtin", {"mcp", "native"}) custom = Provider("custom", {"native"}) # 自定义 provider 不认 mcp if __name__ == "__main__": print(builtin.call("mcp__filesystem__read")) # 成功 try: custom.call("mcp__filesystem__read") # 自定义 provider 拒 except ValueError as e: print("被拒:", e) # unsupported call: mcp__filesystem__read

自定义 provider 不在supported_prefixes里,直接拒——正是 Bug 表现。

五、解决方案一:provider 能力声明(声明它支持什么)

每个 provider 明确声明「我支持哪些工具命名空间 / 哪些工具」,调用前对照:

def provider_capabilities(provider_id): """返回该 provider 支持的工具前缀/集合。真实环境来自配置或握手。""" caps = { "builtin": {"prefixes": {"mcp", "native"}, "tools": set()}, "custom_a": {"prefixes": {"native"}, "tools": {"read", "write"}}, } return caps.get(provider_id, {"prefixes": set(), "tools": set()}) def is_supported(provider_id, tool_name): caps = provider_capabilities(provider_id) if tool_name in caps["tools"]: return True prefix = tool_name.split("__")[0] if "__" in tool_name else "" return prefix in caps["prefixes"] if __name__ == "__main__": print(is_supported("custom_a", "mcp__filesystem__read")) # False print(is_supported("custom_a", "read")) # True

声明 + 校验,调用前就知道会不会被拒(解决 3.2)。

六、解决方案二:命名空间适配层(翻译工具名)

切换 provider 时,把 MCP 命名翻译成目标 provider 认的名字:

def translate_tool_name(tool_name, target_provider): """把 MCP 命名空间工具名,翻译为目标 provider 认识的格式。""" if "__" not in tool_name: return tool_name parts = tool_name.split("__") # mcp__server__tool -> 不同 provider 不同映射 if target_provider == "custom_a": # 剥掉 mcp__server__ 前缀,留裸名(假设自定义 provider 按裸名路由) if parts[0] == "mcp": return parts[-1] # filesystem__read -> read(取末段) return tool_name if __name__ == "__main__": print(translate_tool_name("mcp__filesystem__read", "custom_a")) # read print(translate_tool_name("mcp__filesystem__read", "builtin")) # 原样

适配层把mcp__filesystem__read翻成read再发给自定义 provider,它就能认识了(解决 3.1/3.3)。

七、解决方案三:调用前校验 + 友好降级

组合「能力校验 + 翻译」,调用前若仍不支持,给出明确原因而非神秘unsupported

def safe_call(provider_id, tool_name): translated = translate_tool_name(tool_name, provider_id) if not is_supported(provider_id, translated): return {"ok": False, "reason": f"provider {provider_id} 不支持工具 {tool_name}(已尝试翻译为 {translated})", "suggestion": "请在自定义 provider 中登记该工具,或改用内置 provider"} return {"ok": True, "tool": translated} if __name__ == "__main__": print(safe_call("custom_a", "mcp__filesystem__read")) # {'ok': False, 'reason': '...不支持...', 'suggestion': '...'}

翻译后仍不支持,返回结构化原因 + 建议,用户不再对着unsupported call发懵。

八、跨 provider 一致性

  • 单一工具注册表:所有 provider 共享一份「逻辑工具 → 各 provider 物理名」映射;
  • 握手声明能力:provider 接入时上报支持的工具/前缀,调用方缓存;
  • 保留字符约定:工具名避免mcp__这类被多系统当保留的分隔符,或明确其语义;
  • 失败可重试到其他 provider:某 provider 不支持,能否路由到支持的。

九、排查清单

「自定义 provider 下工具报 unsupported call」,按下面排查:

  1. 工具名是否带 provider 专属前缀(如mcp__)?目标 provider 认吗(第四节);
  2. provider 是否声明了支持的工具/前缀(第五节);
  3. 是否有命名空间适配层?切换 provider 时翻译工具名(第六节);
  4. 调用前是否校验?不支持是否给原因而非神秘报错(第七节);
  5. 保留字符冲突吗__是否被目标 provider 当非法;
  6. 能否路由到其他支持的 provider
  7. provider 握手是否上报能力
  8. 日志是否打印翻译前后工具名

十、小结

「自定义 provider 下工具调用报 unsupported call」的根因是工具命名空间前缀在 provider 切换时未翻译、且目标 provider 能力未声明/未校验,导致不认识的名字被拒。通用修复:

  1. 能力声明:每个 provider 声明支持的工具前缀/集合,调用前对照;
  2. 命名空间适配:切换 provider 时把mcp__server__tool翻译成目标认的名字(第六节);
  3. 校验 + 友好降级:翻译后仍不支持,返回结构化原因与建议;
  4. 共享映射 + 握手:逻辑工具到各 provider 物理名的统一映射。 一句话:工具名从来不是「全局唯一」的,它绑定在某个 provider 的命名约定上;跨 provider 调用必须有一层『命名空间适配 + 能力校验』,把 A 的语言翻译成 B 的语言,并在翻译后仍不通时给出明确原因。把适配层做成调用链的标配,自定义 provider 就能和内置 provider 一样顺畅使用 MCP 工具——这与第 122 篇工具路由、第 134 篇能力协商、第 131 篇 MCP 暴露,共同体现「跨提供方的能力必须有统一寻址与适配」。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/18 17:10:57

KingbaseES数据库高频DML表CPU高、autovacumm失效问题优化

1 问题概述业务数据表e10_common.esch_log为高频DML访问表&#xff0c;日常存在大量INSERT、UPDATE并发操作。该表热点数据长期常驻内存&#xff0c;数据写入、更新时需优先获取内存锁&#xff0c;高并发场景下极易触发锁争用问题&#xff0c;直接导致autovacuum自动清理任务执…

作者头像 李华
网站建设 2026/7/18 17:10:53

SOLIDWORKS仿真结果不可靠?硕迪科技工程师教我三步校准有限元分析

SOLIDWORKS仿真结果不可靠&#xff1f;硕迪科技工程师教我三步校准有限元分析上个月&#xff0c;长治一家煤机装备厂的车间主管老张&#xff0c;在电话里直接跟我摔了电话。他们用 SOLIDWORKS Simulation 做了三个月的结构优化&#xff0c;样机实测结果与仿真差了 12%。焊接支架…

作者头像 李华
网站建设 2026/7/18 17:10:01

轻量鞋材助剂赋能产业发展

现代鞋材行业持续迭代&#xff0c;轻量化、高颜值、高品质成为PVC鞋材核心发展方向&#xff0c;而助剂的合理搭配是提升PVC鞋材综合品质的关键。佳百特(jabetter)深耕PVC鞋材助剂领域多年&#xff0c;打造的PVC鞋材稳定剂&#xff08;PVC shoe material stabilizer&#xff09;…

作者头像 李华
网站建设 2026/7/18 17:08:23

按摩椅有用吗

按摩椅真的有用吗&#xff1f;迪斯T803L给你答案很多人第一次接触按摩椅时&#xff0c;都会犹豫&#xff1a;这东西真的有用吗&#xff1f;会不会只是智商税&#xff1f;答案其实很明确——真正有技术含量的按摩椅&#xff0c;确实能有效缓解身体疲劳、改善亚健康状态。而迪斯&…

作者头像 李华
网站建设 2026/7/18 17:08:16

Legacy iOS Kit 终极指南:快速降级与恢复旧款iOS设备的完整方案

Legacy iOS Kit 终极指南&#xff1a;快速降级与恢复旧款iOS设备的完整方案 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-…

作者头像 李华
网站建设 2026/7/18 17:06:58

Meteodyn WDA 6.9.1 用于分析和补充风数据的直观软件

Meteodyn WDA是一款专为风能行业设计的风数据处理和分析软件。它能够处理、验证、补充和分析现场测量的风数据。该软件功能全面&#xff0c;可处理来自测量气象塔、虚拟气象塔、气象站、激光雷达和声呐等各种类型的数据。 凭借其综合仪表盘和多种筛选器&#xff0c; Meteodyn W…

作者头像 李华