MCP 远程服务器启用 OAuth 刷新令牌轮换后,旧令牌为何还能调用工具
不少人在 MCP 远程服务器启用 OAuth 刷新令牌轮换后,发现旧令牌似乎仍能调用工具。本文区分刷新令牌与访问令牌,解释轮换约束落在哪个环节、访问令牌为何在过期前仍会被资源服务器接受,以及排查时应检查的令牌校验点。
共 36 篇文章
不少人在 MCP 远程服务器启用 OAuth 刷新令牌轮换后,发现旧令牌似乎仍能调用工具。本文区分刷新令牌与访问令牌,解释轮换约束落在哪个环节、访问令牌为何在过期前仍会被资源服务器接受,以及排查时应检查的令牌校验点。
Agent 调用带可选参数的 MCP 工具时,模型省略字段常让服务端收到缺键参数对象,引发解引用报错或空值写入。文章从 JSON Schema 中 required 与 default 的语义边界出发,说明缺键如何产生、校验点应放在哪里,并比较客户端预填与服务端容错解析的取舍。
本地 MCP Server 监听 localhost 时,若服务端不校验 Origin 头,任意网页都可能借 DNS rebinding 发起工具调用。本文以本地代码执行工具为场景,拆解 Origin 校验的作用点、校验过宽与缺失时的攻击路径,并对比回环绑定与令牌鉴权的边界。
远程 MCP Server 同时支持 SSE 流与 JSON 单次响应时,客户端 POST 请求的 Accept 头必须同时列出两种媒体类型。本文解释服务端据此选择响应形态的机制,分析 Accept 缺失或不匹配导致 406 拒绝与响应降级的失败模式,并给出校验点与可观测指标。
批量发送 MCP 请求时,服务端可以并发处理并按任意顺序返回响应。本文从一次并行读取多个资源的客户端场景出发,解释 JSON-RPC 2.0 的 id 配对规则、服务端并发导致乱序的机制、id 重复或缺失时错配的具体表现,并给出校验点、可观测指标与逐条请求方案的取舍。
远程 MCP Server 执行查询工具时,把参数校验失败、业务空结果和传输异常都塞进 isError 或 content 文本,会让客户端与模型无法区分可重试与不可重试。本文拆解 CallToolResult 中 isError 的定位、错误分类混用的失效机制,对比结构化错误码方案,并给出校验点与可观测指标。
本地 MCP Server 通过 stdio 返回多行工具结果时,客户端常出现 JSON 解析失败或消息粘连。文章从规范对换行分隔帧的约束出发,分析服务端拼接原始文本、客户端按行切分的错位机制,并给出校验点、可观测指标与替代帧格式的取舍。
远程 MCP Server 用 SSE 推送工具进度时,客户端断线重连会带上 Last-Event-ID 请求续传。本文解释事件 ID 如何标记流位置、服务端如何从缓冲区重放,并分析 ID 非单调、缓冲区驱逐和无状态部署导致重复或丢失的条件,给出可落地的校验点与观测指标。
本地 MCP Server 用 stdout 传 JSON-RPC、用 stderr 写日志时,客户端若不读取 stderr,管道缓冲区写满后服务端会阻塞在写日志调用上,工具调用随之无响应。本文从管道缓冲机制出发,解释阻塞的形成过程、日志级别与异步写入的缓解效果,并给出可观测指标和部署边界。
远程 MCP Server 暴露带必填参数的提示模板时,客户端常因参数名大小写、缺失或类型不符收到 -32602 错误。本文沿 prompts/list 的 arguments 声明到 prompts/get 校验链路,解释服务端如何判定参数合法,对比客户端预校验与服务端宽松解析的取舍,并给出可观测指标与部署边界。
远程 MCP Server 暴露带枚举参数的提示模板时,客户端常常只能让模型猜参数值。本文拆解 completion/complete 的 ref、argument 与 context 结构,说明服务端能力声明、客户端发起时机与结果渲染之间的断点,并给出校验点与可观测指标。
从远程 MCP Server 返回图片与资源引用的工具调用结果出发,解释 CallToolResult 的 content 数组如何按类型分块,客户端只走 text 分支时为何丢弃正文或抛错,并给出校验点、可观测指标与纯文本封装方案的取舍。
远程 MCP 服务器接入 OAuth 2.1 时,客户端常通过 RFC 7591 动态注册获取 client_id。本文解释注册端点未鉴权、凭据未持久化与重装重复注册如何叠加成孤儿记录和配额耗尽,并给出清理策略、可观测指标及与静态预注册的取舍。
远程 MCP Server 接入第三方 OAuth 时,客户端常把授权请求发给错误的授权服务器。本文围绕 RFC 9728 受保护资源元数据、RFC 8414 授权服务器元数据、401 响应与 WWW-Authenticate 头,拆解资源标识暴露、resource 参数绑定、元数据缓存与路径拼接的失败机制,给出校验点与可观测指标。
从远程 MCP Server 返回超长列表型工具结果的场景出发,解释 tools/list 与 resources/list 的游标分页契约,说明客户端如何携带 cursor 续拉并合并,分析忽略 nextCursor、跨会话复用游标、游标非单调导致的重复与缺失,并给出校验点与可观测指标。
Agent 调用带数值与布尔参数的 MCP 工具时,模型常把 5 写成 "5"、把 true 写成 "true",服务端按 inputSchema 严格校验就会直接拒绝。本文用一个库存查询工具贯穿全文,梳理类型声明、序列化路径、隐式转换歧义与枚举大小写问题,并对比客户端预校验与服务端宽松解析的取舍。
远程 MCP Server 用 RFC 6570 模板声明文件与数据库资源时,客户端填充变量、服务端匹配模板这两步经常对不上。文章拆解模板展开、百分号编码、路径段转义与匹配歧义,说明解析失败发生在哪一环,并给出校验点与可观测指标。
远程 MCP Server 注册的工具超过一页时,tools/list 会返回 nextCursor,客户端必须带着游标继续拉取才能拿到完整工具集。本文解释分页契约、客户端漏跟游标和服务端游标失效这两类故障,并给出校验点与可观测指标。
以远程 MCP Server 启动握手为场景,说明 initialize 请求中 capabilities 如何声明双方支持的采样、通知与根目录能力,分析客户端漏报 sampling 或 roots 后服务端调用被拒或降级的机制,并给出可观测指标与兼容性边界。
远程 MCP Server 执行下单类写工具时,客户端超时重发同一 JSON-RPC 请求,服务端却把它当成一次新调用,导致重复扣款或重复下单。本文从 JSON-RPC 请求 ID 的会话内语义出发,解释断线重连后 ID 重置、服务端缺少幂等键存储的机制,并对比幂等键、去重窗口与人工确认三种方案,给出可观测指标与部署边界。
远程 MCP Server 经反向代理暴露时,工具调用结果常在客户端迟迟不出现。本文以 nginx 反代场景为例,解释 SSE 流为何需要周期性保活事件、代理缓冲与空闲超时如何攒住响应、Content-Type 改写为何让客户端解析失败,并给出可观测指标与部署边界。
远程 MCP Server 返回结构化工具结果时,outputSchema 声明返回结构,structuredContent 承载实际负载。本文用一个订单查询工具贯穿全文,分析二者不一致、schema 未声明、客户端只读 content 文本分支时各自的解析失败路径,对比纯文本封装与严格校验两种方案,并给出服务端与客户端的校验点和可观测指标。
远程 MCP Server 执行长任务时,客户端常因 ping 超时误判连接断开并重复重连。本文围绕双向存活探测、请求超时与进度通知的区别,分析事件循环阻塞、SSE 流空闲和代理层超时如何制造假故障,并给出心跳间隔与可观测指标的配置思路。
远程 MCP Server 排障时,服务端明明调高了日志级别,客户端却只看到 info 以上日志。文章从 logging/setLevel 与 notifications/message 的职责划分入手,解释级别未同步、通知未订阅、会话重连后级别重置三类日志缺失,并对比本地日志与轮询方案的取舍。
远程 MCP Server 返回单次工具结果时,服务端可以直接用 application/json 响应,而不必开启 SSE 流。这篇文章解释规范允许的两种响应形态、客户端对 Content-Type 的解析假设、请求与响应的配对方式,以及 JSON 单次响应与 SSE 流式响应在兼容性、可观测性和失败模式上的差异。
Agent 自动调用写操作工具时,客户端常靠 readOnlyHint、destructiveHint 决定是否弹窗确认。本文拆解这些注解的语义与来源,说明它们由服务端自述、客户端无从验证的信任假设,对比服务端强制鉴权与人工审批,并给出校验方法与可观测指标。
远程 MCP Server 暴露在公网时,Mcp-Session-Id 只负责关联一次有状态会话,并不自动证明请求者是谁。文章解释会话 ID 与会话状态如何建立、为何可预测或未与访问令牌绑定,以及重连后不重新校验如何导致会话劫持,并对比无状态模式与每请求鉴权,给出绑定与轮换的可观测指标。
多台远程 MCP Server 共用同一授权服务器时,为 A 服务签发的访问令牌常能直接调用 B 服务。本文解释 RFC 8707 资源指示器与 aud 绑定机制,分析授权服务器未按资源签发、客户端复用令牌、资源服务器漏校验 aud 三类成因,对比静态 API Key 与逐服务令牌方案,并给出校验逻辑与可观测指标。
远程 MCP Server 执行耗时数据导出时,客户端如何用进度令牌跟踪任务、用取消通知请求中止,以及服务端如何回收临时文件与数据库连接。文章分析令牌缺失、取消竞态和资源未清理三类失败模式,并对比超时轮询与幂等重试的适用边界。
本地 MCP Server 读写项目文件时,客户端通过 roots/list 声明的根目录决定了服务端能碰哪些路径。文章拆解根目录替换、变更通知、路径规范化与符号链接绕过,并给出可观测指标与部署边界。
远程 MCP Server 想在工具执行中生成摘要,却不愿自持 API Key,这时 sampling/createMessage 让服务端反向请求客户端模型补全。文章拆解请求参数、模型偏好映射、结果回传与拒绝路径,对比服务端自持密钥方案,并给出可观测指标与适用边界。
工具跑到一半才发现缺少必填参数,直接报错会让用户重来一遍。本文以订位工具为例,拆解 MCP elicitation/create 如何暂停调用、用受限 JSON Schema 收集结构化输入并恢复执行,分析 accept、decline、cancel 三条路径、schema 校验失败与超时处理、敏感字段为何必须走 URL 模式,并给出可观测指标与适用边界。
远程 MCP Server 暴露文件与数据库资源时,客户端调用 resources/subscribe 后仍可能读到旧内容。文章拆解订阅、通知与缓存刷新的完整链路,分析订阅粒度粗、通知丢失、重连后订阅状态不同步等失效原因,并对比轮询与版本校验的取舍,给出可观测指标与部署边界。
远程 MCP Server 热更新工具后,客户端仍调用已删除工具,问题往往出在 tools/list_changed 通知链路而非服务端。本文拆解通知、重新拉取与缓存刷新的完整流程,分析通知丢失、未订阅、会话重连三类失效路径,对比轮询与版本校验方案,并给出可观测指标与部署边界。
移动网络下远程 MCP Server 断线重连后,工具调用结果可能凭空消失。文章从会话 ID、SSE 事件 ID 与 Last-Event-ID 重放机制入手,说明恢复成立的前提、服务端事件缓冲的边界,以及无状态模式为何无法重放,并给出可观测指标与部署取舍。
接入多个 MCP Server 的 Agent 为什么越接越笨?本文从工具名、描述与 JSON Schema 被序列化进系统提示并随每轮请求重复计费讲起,分析工具数量增长带来的上下文挤占与选择准确率下降,对比全量注入、检索式筛选与动态发现三种加载策略的延迟与可靠性权衡,并给出可观测指标与适用边界。