什么是 标准输入输出传输(STDIO Transport)?
标准输入输出传输(STDIO Transport)是 Model Context Protocol 的一种传输方式,由 MCP 客户端启动服务器子进程,将协议消息写入服务器标准输入,并从其标准输出读取协议消息。
快速了解
| 规范文档 | 官方规范 |
|---|
工作原理
保持按换行分隔的协议消息流
MCP STDIO 规范使用换行符分隔消息,并禁止一条消息内部包含原始换行。JSON 字符串可以包含转义后的 \n,但多行美化 JSON 或写入 stdout 的日志都会破坏分帧。双方应序列化一条完整 JSON-RPC 消息,追加一个换行并及时刷新,同时限制最大单行长度;stderr 专门承载可由客户端单独收集的日志。
独立于进程 I/O 处理 JSON-RPC 关联
请求携带 ID,并要求响应返回相同 ID;通知不带 ID,也不会收到响应。实现应维护未决请求表,不能按消息行位置猜测对应关系。取消是一条协议通知,只表示协作式取消,并不保证工作已经停止。当多个请求在途时,传输读取器仍需持续处理合法响应与通知。
明确关闭、重启与本地信任边界
客户端应显式指定可执行文件、参数、环境变量和工作目录。正常关闭时先关闭服务器 stdin 并等待退出,超时后再终止进程。重启会创建新进程,应用层没有幂等重试机制时,在途状态无法恢复。不开放网络端口降低了远程暴露面,但子进程仍拥有 Host 授予的本地文件、环境和进程权限。
主要特点
- 使用客户端管理的子进程,而不是网络监听端口
- 把每条 UTF-8 JSON-RPC 消息编码为一个换行分隔的单行
- 服务器 stdout 只输出协议消息,诊断日志输出到 stderr
- 通过 JSON-RPC ID 关联请求与响应,通知不携带 ID
- 需要明确处理取消、EOF、退出、超时和强制终止
- 本地安全边界由可执行文件、环境变量和操作系统权限共同决定
常见用途
- 由桌面 Host 启动用户级文件系统或代码仓库 MCP Server
- 让 IDE Agent 连接本地工具而不开放监听端口
- 把命令行集成封装为 MCP 客户端按需启动的进程
- 在本地测试协议分帧、取消和进程失败
- 分发可执行文件及其权限都受集中控制的本地 Server
示例
Loading code...常见问题
MCP 消息在 STDIO 上如何分帧?
每条消息都是一个完整的 UTF-8 JSON-RPC 对象,末尾跟一个换行符。消息不能包含原始换行,但 JSON 字符串可以把换行编码为 `\n`。线上不要输出多行美化 JSON,应设置最大单行长度,并在每条消息完成后及时刷新缓冲区。
MCP Server 可以把日志写入 stdout 吗?
不可以。STDIO Transport 中的服务器 stdout 只允许有效协议消息。启动横幅、调试输出、进度条或依赖库日志都可能让客户端读到非法 JSON-RPC 行并终止会话。诊断信息应写入 stderr,协议序列化则使用独立写入器。
STDIO Transport 比 HTTP 更安全吗?
它不需要监听网络端口,但这不是完整安全模型。被启动程序会获得 Host 允许的本地权限、环境变量、工作目录和继承资源。应固定可信命令、缩减环境变量、限制文件访问,并继续对 MCP 操作执行授权。
STDIO Server 退出后,在途请求会怎样?
字节流结束,未收到响应的请求会失败,除非客户端定义更高层的重试策略。启动新进程不会自动恢复协议状态。只有已知幂等或受应用级请求键保护的操作才能安全重试,副作用是否完成不确定时应明确告知调用方。
MCP 什么时候应使用 HTTP 而不是 STDIO?
一个本地客户端独占管理一个本地子进程时适合 STDIO。服务器需要通过网络访问、独立于客户端进程运行,或接入网络认证和部署治理时,应使用 Streamable HTTP。传输方式不会改变 MCP 对外暴露的能力。