跳到正文
MyDSH我的 DSH 实战笔记
English
独立维护,非DeepSeek官方;与mydsh.dev等其他MyDSH站点无关联。

首页/开发者与插件开发/MCP与工具定义

工具名不被接受时:UNKNOWN_TOOL 的两种形态分清

接第三方网关后报 UNKNOWN_TOOL/400,不知道是自己的工具名不对还是网关的问题。

已核验版本与环境核验日期2026-11-14
来源
packages/core/tools的ToolNotFoundError定义
核验日期
2026-11-14

源码里的 ToolNotFoundError 抛两种消息,看有没有冒号后半句就能分开:

报错原文含义该查哪
unknown tool "<name>"这个名字哪里都没注册网关是否改了工具名、截断了名字,或中间层重写了工具调用
unknown tool "<name>": <reachableFrom>名字可见但呈现层不允许直接调用别查网关。查 DSH_TOOLS_MODE 与preset的tool-presentation

第二种最容易被误判

它的典型场景是PTC模式:模型只被允许直接调 run_code,其它native工具名虽然可见,直接调用就会被拒,并附带「你该从哪调用它」的说明。这跟网关一点关系都没有,但报错文本长得很像协议错误,很多人第一反应是去查网关。

怎么一次定位

  1. 看后半句。有 : … 就跳到「呈现层」分支,直接停手别查网关。
  2. 没有后半句,抓一次出站请求体,把 tools[].function.name 与本地注册的名字逐个比对。
  3. 两边一致还报UNKNOWN_TOOL → 本地侧问题;不一致 → 网关或中间层改写了名字。
这个错误码的设计其实是好的:它继承自HarnessError,让「工具不存在」和「工具执行失败」在重试/沙箱/回放逻辑里可区分。可惜它的两种消息只差一个冒号,读快了就会错过。

怎么算跑通

照着逐条对,全过才算完成。有一条没过,先解决它再往下。

  • 能从报错里区分两种形态
  • 第二种不去查网关而是查tool-presentation
  • 第一种会抓请求体比对tools[].function.name

会失败在哪

现象 / 原因 / 怎么办,按实际踩到的顺序写。

现象原因怎么办
把呈现层拒绝当成网关问题报错有冒号后半句就是本地的先读后半句;有它就别动网关配置

来源

标「已核验」的,来自本站实跑;标「公开资料整理」的,逐条附出处。