【随笔】MCP工具错误怎样分层:先读反馈,再决定下一步
上一篇给MCP工具结果加上结构与业务检查。接着沿调用链想一层工具没有给出可用结果时Agent应该修改参数、等待更多输入还是先停止操作把所有失败都写成“再试一次”会丢掉关键线索。今天整理MCP工具错误的分层表达。我们用几份模拟响应观察客户端怎样分流让模型收到可以处理的反馈同时保留系统对执行边界的判断。本文依据2026年10月6日核对的MCP2026-07-28规范。示例使用Python3.12.14在本地实际运行只演示应用处理策略不连接真实MCP服务器不代表某个SDK的完整实现。一、失败发生在哪一层MCP工具规范区分两种错误协议错误用JSON-RPC的error响应表达工具执行错误在结果中设置isError: true。未知工具、请求结构问题与工具执行中的校验、API或业务错误需要分别识别。官方工具错误处理在这两种服务器反馈之外客户端也可能遇到本地超时。这时甚至没有收到响应应保留“结果未知”的状态。下图把可观察到的线索放在不同入口便于后续处理。图中超时属于本地观察结果不能冒充服务器返回的JSON-RPC错误。收到error或isError之后仍需结合具体反馈判断操作是否留下影响。二、协议错误先检查请求与接口下面展示一份未知工具的错误响应与官方示例使用相同错误码{jsonrpc:2.0,id:1,error:{code:-32602,message:Unknown tool: missing_tool}}JSON-RPC响应的error包含整数code与message可有data携带额外信息。MCP还对标准错误码和部分服务器错误码范围作了约定本地实现的超时目前没有被统一分配协议错误码。基础协议与错误码应用层可以核对工具目录、参数结构和协商版本。遇到未知工具时原样重复同一请求通常不会得到新结果。错误码也不宜单独充当重试开关需要结合接口说明与具体故障。三、工具执行错误把可修正的信息交给Agent工具已进入执行过程发现日期无效时可以给出下面的结果片段{jsonrpc:2.0,id:2,result:{resultType:complete,isError:true,content:[{type:text,text:Date must be in the future}]}}resultType为complete表示请求已经给出最终内容是否工具执行失败仍要读取isError。当前版本还可能返回input_required早期版本缺少resultType时按complete处理未识别的结果种类应视为无效。结果种类说明规范建议客户端把工具执行错误提供给模型使其能够根据反馈修正。应用设计上可以提供简短原因和允许的输入范围数据库连接串、访问令牌或完整内部堆栈没有必要作为模型反馈公开。图中反馈先经过应用判断才进入下一次请求。修正日期的请求表达新的意图它与超时后原样重放同一次写入应分别处理。四、完整示例六类观察怎样分流为了只观察分层规则下面省略网络与SDK接入。kind是本地程序自行定义的事件字段协议响应放在response里函数假设响应基本结构已通过前置校验。输出是处理建议不会自动调用工具。defdecide(event):# Local illustrative policy: no network calls and no automatic retries.ifevent[kind]timeout:returnOUTCOME_UNKNOWN: query status firstresponseevent[response]iferrorinresponse:returnPROTOCOL_ERROR: inspect request and serverresultresponse[result]result_typeresult.get(resultType,complete)ifresult_typeinput_required:returnINPUT_REQUIRED: use the negotiated input flowifresult_type!complete:returnINVALID_RESULT: stopifresult.get(isError,False):returnTOOL_ERROR: inspect actionable feedbackreturnRESULT_READY: validate structure and business statecases[(protocol,{kind:response,response:{jsonrpc:2.0,id:1,error:{code:-32602,message:Unknown tool: missing_tool}}}),(tool,{kind:response,response:{jsonrpc:2.0,id:2,result:{resultType:complete,isError:True,content:[{type:text,text:Date must be in the future}]}}}),(ready,{kind:response,response:{jsonrpc:2.0,id:3,result:{resultType:complete,isError:False,content:[{type:text,text:Report prepared}]}}}),(input,{kind:response,response:{jsonrpc:2.0,id:4,result:{resultType:input_required,inputRequests:{details:{method:elicitation/create,params:{mode:form,message:Provide details,requestedSchema:{type:object}}}}}}}),(unknown_type,{kind:response,response:{jsonrpc:2.0,id:5,result:{resultType:not_negotiated}}}),(timeout,{kind:timeout}),]forname,eventincases:print(f{name}:{decide(event)})保存为error_layers_demo.py并执行python error_layers_demo.py本次实际输出protocol: PROTOCOL_ERROR: inspect request and server tool: TOOL_ERROR: inspect actionable feedback ready: RESULT_READY: validate structure and business state input: INPUT_REQUIRED: use the negotiated input flow unknown_type: INVALID_RESULT: stop timeout: OUTCOME_UNKNOWN: query status firstready只进入后续结构与业务检查尚未宣告业务完成。input交给已协商的补充输入流程unknown_type停止。timeout也停止自动推进先查询状态。这样的分流让每一次失败保留自己的处理入口。五、恢复决策怎样留下边界可观察线索应用可以先做什么需要另行确认什么JSON-RPC error检查请求、工具定义与服务端反馈接口是否支持恢复isError为true提取可修正原因并校验新参数是否已经发生部分副作用input_required进入协商过的补充输入流程输入来源与用户意图本地超时回查状态或停止推进服务端是否已经执行普通完整结果继续结构与业务核验结果是否满足下一步条件重试是应用策略。设置次数预算、整体时限与退避规则是恢复流程的一部分这些条件不能保证写入只发生一次。涉及状态变化时应依据工具契约判断幂等性与回查能力上一篇讲过的结果校验也要保留。错误反馈不等于回滚证明。下游API失败前可能已有部分动作完成。工具若能返回任务编号、明确阶段或可查询状态调用端更容易给出可解释的处理结果这些业务字段要由工具契约定义。注解需要可信来源。工具的行为注解可以帮助理解接口但客户端仍需校验来源与结果。将readOnlyHint或idempotentHint当成某个不可信服务自动获得执行权限的依据会让应用判断失去约束。六、落地时补上这些检查将协议解析、结果分流、业务校验与执行授权分别放在明确入口日志保存关联ID与决策原因避免把秘密参数完整写进日志。给模型的反馈尽量清楚哪个字段需要调整、允许范围是什么、哪些条件还没确认。下一次调用仍需经过参数校验不能仅凭模型说“已修复”就直接执行。生产接入还要校验响应结构、请求ID关联、协议协商结果和错误内容可信度。本文六个用例没有覆盖断线、所有标准错误码或真实服务器恢复行为不能替代联机验证。七、 思维导图MCP工具错误协议层JSON-RPC error执行层isError反馈本地观察超时保留结果未知结果分流complete与input_required恢复策略校验参数和副作用边界八、总结总结要点先识别错误层次。协议error、工具isError与本地超时提供不同线索客户端应该保留这些差异。反馈服务于下一步判断。可修正的信息能帮助Agent调整输入新的调用仍需校验与授权。恢复遵守工具契约。收到失败或没有响应都不能直接推导回滚已经完成结果核验、状态回查和副作用处理要一起设计。下一篇继续看MCP工具注解理解readOnlyHint与idempotentHint能提示什么以及调用端怎样判断可信度。如果你觉得这篇文章对你有所帮助欢迎点赞、收藏、分享

相关新闻

ava面向对象核心:类与对象超详细解析

ava面向对象核心:类与对象超详细解析

哈喽各位小伙伴!前面我们学完了 Java 的分支与循环,掌握了程序的流程逻辑。从今天开始,我们正式进入 Java 最核心、最重要的思想——面向对象编程(OOP)。可以毫不夸张地说:学好类与对象,才算真正…

2026/10/9 4:29:56 阅读更多 →
60/60 vs 4/60:humanizer与提示词改写方案大比拼,本地12B模型为何更强

60/60 vs 4/60:humanizer与提示词改写方案大比拼,本地12B模型为何更强

60/60 vs 4/60:humanizer与提示词改写方案大比拼,本地12B模型为何更强 【免费下载链接】humanizer 项目地址: https://ai.gitcode.com/hf_mirrors/jialinyyzz/humanizer 同一批 60 篇英文草稿,两种去 AI 味方案正面交锋:一…

2026/10/7 20:29:40 阅读更多 →
SpringBoot物联网宠物定位监控系统项目实战指南

SpringBoot物联网宠物定位监控系统项目实战指南

如果你正在纠结Java毕设到底选什么题目,我建议你看看这个方向:基于物联网技术的宠物定位与监控系统。技术栈固定在SpringBoot、物联网、小程序、MySQL上,题目融合了当下流行的IoT概念,又贴着日常生活场景走,做出来的东…

2026/10/7 20:29:40 阅读更多 →

最新新闻

JavaWeb新闻期刊管理系统课程设计:架构拆解与部署避坑全攻略

JavaWeb新闻期刊管理系统课程设计:架构拆解与部署避坑全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 4:29:50 阅读更多 →
PLC工程师实战经验:仿真启动、触摸屏通讯、变频器控制与接线排查指南

PLC工程师实战经验:仿真启动、触摸屏通讯、变频器控制与接线排查指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 4:29:50 阅读更多 →
基于Python Django的舆情分析系统:数据采集、情感分析与可视化实践

基于Python Django的舆情分析系统:数据采集、情感分析与可视化实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 4:29:50 阅读更多 →
JavaWeb考试系统源码:JDBC+Servlet+JSP全链路实战

JavaWeb考试系统源码:JDBC+Servlet+JSP全链路实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 4:29:50 阅读更多 →
ADAS域控制器功能安全设计:从芯片锁步到系统落地的四层防护体系

ADAS域控制器功能安全设计:从芯片锁步到系统落地的四层防护体系

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 4:29:50 阅读更多 →
自研定位问题反馈工具:从采集到定位的完整实践

自研定位问题反馈工具:从采集到定位的完整实践

“定位问题反馈工具正式上线!”消息在内部群弹出来的时候,我正在整理上周的“问题定位时长”周报。看到这条公告,我第一反应是:终于不用再靠爬聊天记录、猜设备型号、翻用户口述来找问题了。这套工具不是那种做完就扔的试验品&…

2026/10/9 4:28:50 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:34:55 阅读更多 →