跳到正文
Elaine Blog
返回

MCP 怎样连接与授权:stdio、HTTP 和凭据的完整路径

更新于:
Tool Calling 与 MCP

同一 MCP Server 可以运行在本地子进程,也可以作为远程服务。工具含义不变,消息怎样到达、凭据怎样提供、进程由谁管理却不同。

理解这些差别有助于排查“工具列表为空”“连接失败”和“认证失败”:它们发生在模型决定调用之前或之外,不能只靠修改 Prompt 解决。

stdio 是两个进程间的消息通道

Host 启动 Server 子进程,将请求写入子进程标准输入,从标准输出读取响应。MCP stdio 使用按行分隔的消息,普通调试 print 写到 stdout 可能破坏协议流。传输规范

日志应写 stderr,业务函数返回结果交给 SDK 序列化。Client 关闭时应释放进程和管道,不能为每次查询无限启动新进程而不清理。

启动路径也很重要。系统 Python 未必安装了相同 SDK,工作目录改变会影响相对文件路径。因此示例使用当前解释器和基于脚本位置计算的绝对 Server 路径,而不是假设读者一定从某个目录启动。

环境变量只传实际需要的值。把 Host 的全部凭据继承给第三方 Server,会扩大本地代码能够访问的范围;协议兼容与代码可信是两回事。

HTTP 连接服务不等于会话状态

远程请求发往 MCP endpoint。Streamable HTTP 可以以 JSON 或请求范围内的 SSE 流返回;不要把仍可用的 SSE 响应形式与历史 HTTP+SSE 传输方案混为一谈。

当前自包含请求携带协议元数据,HTTP 头可以镜像方法和工具名供中间层使用。镜像值与消息体不一致时,应按规范拒绝,不能让网关按一个名字授权、Server 按另一个名字执行。

一个 TCP 连接可以复用,但业务状态不应暗藏在“上次连到哪台机器”。任务句柄、草稿和审批保存到适当业务存储,多实例才能看到一致的必要记录。

本系列只提供本地 stdio 和内存演示,远程授权在正文解释完整参与关系,不把一个无认证 HTTP 服务称为生产接入。

远程授权有哪几个参与者

用户拥有数据权限;MCP Client 代表用户请求资源;授权服务器负责授权流程并签发访问令牌;MCP Server 作为资源服务器验证令牌和具体资源权限。身份提供方可能与这些组件合并部署,但逻辑职责仍需区分。

Client 发现受保护资源与授权服务器信息,建立对应客户端身份,再按选定流程引导用户授权。返回后验证响应,交换访问令牌,然后才携带令牌访问 MCP Server。具体发现和流程要求以 MCP Authorization 为准。

用户同意允许“读取订单”,不等于允许“提交退款”。OAuth Scope 表达授权范围的一部分,单张订单的归属与业务操作条件仍由服务端判断。

Token 上的限制为什么都要检查

Issuer 回答谁签发,Audience 回答给哪个资源使用,Scope 表达权限范围,过期时间限制有效期。还要验证令牌真实性,而不是仅 Base64 解码后相信字段。

令牌可以是 JWT,也可以是不透明字符串。验证方法取决于授权服务器和资源服务器约定,不能默认所有 Token 都能本地解码验证。客户端也不应把访问令牌原文放进 Prompt 或日志。

例如给库存服务签发的只读令牌,即使签名有效,也不能据此访问退款服务。只检查“签名没问题”会遗漏受众和用途。

PKCE、回调与刷新解决什么问题

在授权码流程里,Client 保留与本次请求关联的验证材料,授权后再完成代码交换。PKCE 将兑换动作与发起者关联,回调验证与请求关联帮助避免把错误响应接到当前用户任务中。

刷新用于取得新的访问令牌,不应扩大到未获准范围。刷新失败时按协议重新授权或停止,不要把旧过期令牌无限重试。多个并发请求同时刷新还可能需要由客户端集中协调。

这些过程应使用成熟 OAuth 组件实现。正文通过时序讲解,配套不会写一个省略签名、PKCE 和响应验证的“简化 OAuth”冒充可部署方案。

为什么不能把 MCP Token 原样转发给下游

MCP Server 访问订单 API 时处于新的资源边界。它应使用适合下游资源与主体的凭据,例如自己的服务身份,或经授权的委派机制,而不是把收到的 MCP 访问令牌透传。

透传会把不同 Audience 和权限语义混在一起,也可能让下游错误信任一个本不发给它的令牌。Server 的广泛服务权限同样不能自动继承给任何 Client,请求仍需映射到调用者获准范围。

例如 Server 自己可以查全店订单,用户只能查 A1042。服务凭据能完成数据库读取,不意味着用户可以通过参数查询 A2000。

本地 Server 为什么不是同一套授权部署

stdio 常通过受控启动配置与环境提供凭据,它不需要机械套用远程 HTTP OAuth 流程。但本地进程依然有文件、网络和系统权限,不能因没有 HTTP 就认为安全。

mcp_client_demo.py下载 负责进程生命周期;业务 Server 使用明确标记的单用户教学身份。真实多用户服务必须从可信认证上下文构造主体,不能把这个常量作为通用部署方案。

排查时先确认进程和传输,再确认版本和发现,再确认授权与业务结果。把这些层次分开,错误信息才有具体含义。

继续阅读

上一篇:MCP 不只有工具:Resources、Prompts 与多轮请求

下一篇:接入工具以后,系统多了哪些风险:MCP 与工具安全边界

下载文件、依赖与运行边界见配套指南下载


分享这篇文章:

上一篇
MCP 不只有工具:Resources、Prompts 与多轮请求
下一篇
接入工具以后,系统多了哪些风险:MCP 与工具安全边界