先这样答
MCP 的传输层主要分为本地和远程两种模式。stdio 是一种本地子进程通信方式,客户端直接把 server 当作子进程启动,双方通过标准输入输出交换 JSON-RPC 消息。这种方式零网络开销,非常适合运行在本地的工具集。Streamable HTTP 则是面向远程服务的通信方式,通过单个 HTTP 端点承载请求,并且支持按需升级为流式返回。这种单端点设计取代了早期独立的 HTTP 加 SSE 双端点方案。这里的流式主要指响应可以边生成边推,比如长任务进度条或生成型文本输出,它并不是为音视频流设计的,音视频通常走专门的媒体通道而不经过 MCP。
如果要从头实现一个 MCP server,核心流程分为握手和能力暴露两部分。服务端首先要按协议处理 initialize 握手请求,完成客户端和服务端的能力协商。接着需要用协议原语向外暴露能力,主要包括 tools、resources 和 prompts 三类。对于 tools,需要定义工具名称、描述、JSON Schema 格式的参数以及具体的回调逻辑;resources 用于提供可读的数据;prompts 用于暴露提示词模板。在运行阶段,服务端持续监听并处理 tools/list、tools/call 等具体请求。
在实际工程中,我们通常不会手写底层通信,而是使用 FastMCP 等框架,通过装饰器把现有的函数注册为工具,传输层和协议解析交由框架处理。上线前还需要完善参数校验、超时控制与错误码。由于 MCP 协议本身不内置鉴权机制,权限校验和安全认证需要交由宿主和部署层来负责。
面试官会怎么追问
-
「Streamable HTTP 的流式传输可以用来传视频流吗?」 不能用来传视频流。Streamable HTTP 的流式语义是指服务端可以边计算边返回结果,比如通过 SSE 推送大语言模型的生成文本或者长耗时任务的执行进度。音频和视频流的数据量和传输机制不同,一般会走专门的媒体通道,不经过 MCP 协议。
-
「既然 MCP 协议不内置鉴权,那服务端怎么做权限控制?」 权限控制需要由宿主环境和部署层来实现。对于远程的 Streamable HTTP 服务,可以在 HTTP 请求头中加入 Token,由服务端的网关或拦截器进行校验。对于本地的 stdio 服务,通常依赖操作系统的文件权限和进程隔离机制来保证运行安全。
-
「用 FastMCP 写服务端和原生手写有什么区别?」 原生手写需要开发者自己处理标准输入输出流或 HTTP 请求,手动解析 JSON-RPC 消息并维护 initialize 握手状态。用 FastMCP 只需要关注业务逻辑,直接用装饰器标记函数,框架会自动生成 JSON Schema 并接管底层的传输层通信和协议路由。
回答的坑
- 误以为 stdio 也是基于网络的某种本地端口通信,实际上它是纯粹的操作系统父子进程间通过标准输入输出流交换文本。
- 认为实现 MCP 服务端只需要写好工具逻辑即可,忽略了必须先处理 initialize 握手协商,否则客户端无法获取工具列表。
同系列的题