Jixue AI学习库
返回知识库
MCP进阶

MCP Transport:stdio 与 Streamable HTTP

MCP 数据层(JSON-RPC 消息)不变,传输层二选一:本地子进程走 stdio,远程服务走 Streamable HTTP。

01

为什么重要

Transport 决定进程管理、鉴权方式、会话边界和故障模式;选型错误会把本地工具拖进网络复杂度,或让远程服务无法多客户端共享。

02

核心原理

Transport(传输层)只负责搬运 JSON-RPC 消息,方法、参数和结果在两种方式下完全一致。stdio 模式下 Host 把 Server 作为子进程拉起,消息写进子进程的标准输入输出,进程即会话,权限继承操作系统用户,不需要网络鉴权——Claude Desktop 接本地工具就是这个形态。Streamable HTTP 把 Server 当远程服务:Client 用 HTTP POST 发消息,服务端可用 SSE(Server-Sent Events,服务器向客户端的单向推送流)回推消息,并用会话头维护多客户端状态;鉴权(通常 OAuth 或 Bearer Token)、TLS 和水平扩展都要自己解决。选型规则很直接:要用本地文件、本地命令、跟随用户机器权限,选 stdio;要做团队共享的远程服务、统一鉴权和多客户端接入,选 Streamable HTTP。本站 POST /api/mcp 就是后者的一个无状态子集:单 POST 单响应、不开 SSE、不维持会话,专门用来演示数据层。

03

工程实现

  • 本地集成用 stdio,远程共享服务用 Streamable HTTP
  • stdio 要管进程生命周期:启动参数、stderr 日志、退出重启
  • 远程形态先解决鉴权与 TLS,再暴露工具
  • 无状态单请求子集最易起步,SSE 推送可后补
04

展开说明

Claude Desktop 配置里的 command 加 args 拉起本地 Server 就是 stdio;本站 POST /api/mcp 用一次普通 HTTP POST 跑同一套 JSON-RPC(initialize、tools/list、tools/call),curl 即可复现,是 Streamable HTTP 的单请求模式。

05

常见误区

  • 给远程共享服务套 stdio,每台客户端机器都得装一遍 Server
  • stdio Server 把日志写进 stdout,污染 JSON-RPC 消息流(日志必须走 stderr)
  • 远程 Server 不做鉴权就把工具暴露到公网
06

面试怎么说

数据层不变,传输层二选一:stdio 是本地子进程、进程即会话、免网络鉴权,适合桌面宿主与本地工具;Streamable HTTP 是远程服务,要自己处理鉴权、TLS 与多客户端会话,适合共享部署。按部署形态选,不按功能选。