MCP

MCP

MCP 是什么

MCP 全称是 Model Context Protocol(模型上下文协议) 是 AI 应用与工具提供方约定的通讯协议。

MCP 解决什么问题

解决重复对接第三方工具的问题。 举个例子:

A 公司为了让他们的 Agent 支持查询天气、路线,接入了百度地图 API。B 公司为了支持查询天气、路线也同样接入了百度地图API。那么当有 1万家公司需要接入地图API,就需要重复开发 1万次。

现在百度提供一个标准接口,跟所有公司说,我们搞了一个通用的交互协议,并提供了这个协议所有语言的实现,你们只需要引入对应的协议包,再连接上百度的 MCP 地址,就能让 Agent 拥有百度所有的开放能力。 这就是 MCP 要解决的问题。

引入 MCP 会带来的副作用

有舍有得,MCP 带来方便的同时,也带来了另一个问题:token 消耗剧增,一个 MCP Server 支持的 tool 越多,token 消耗越多。

为什么会出现这个问题呢?

因为 MCP 的工作模式是:全量加载,每次发送

为了让 AI 知道能用哪些工具,MCP 客户端会在每轮对话开始时,把所有连接的 MCP 服务器上所有工具的完整定义(名称、描述、复杂的 JSON Schema 参数)都塞进上下文里,即使你只是简单的说一句 "你好"。

这就是早期 MCP 的问题。但现在的 Agent 一般都会有智能过滤,懒加载,并不会将所有工具定义都加载到上下文中。

  • 智能过滤: 先根据用户意图筛选出最相关的几个工具
  • 懒加载: 让 AI 通过一个 "通用工具" 动态发现和调用所需工具

有了 Skill 还需要 MCP 吗

Skill 和 MCP 用于解决不同的问题。

如果是在本地环境,Skill 可以直接平替 MCP。但是如果非本地环境,例如云端 Agent 无法执行 Skill,只能用 MCP。

也可以这么了解,Skill 是 C/S 架构, MCP 是 B/S 架构,当提供的能力发生变更时, Skill 需要更新,MCP 不需要更新。

了解 MCP 协议

  1. 初始化握手:协商双方都有的能力
  2. 能力发现:Client 调用 tools/list 自动拉取完整工具 Schema
  3. 交互阶段:用户发起请求 -> Client 将所有完整的 Schema 变成 Tools(Function Calling) 发给大模型 -> 大模型返回 Client 调用哪个 Tools -> Client 发送 tools/call RPC -> MCP Server 执行 -> 执行结果返回给 MCP Client -> 大模型整合数据输出回答

MCP 传输机制

stdio

为了 Agent(MCP Client) 与 本地的外部工具(MCP Server)交互,父进程(MCP Client)会创建子进程(MCP Server),并通过管道(pipeline)将父子进程的输入输出绑在一起。

例如父进程的 stdin 通过管道连接子进程的 stdout。

SSE

MCP 中,客户端使用独立的 HTTP POST 接口向服务端发起请求,服务端使用 SSE 推数据给客户端。

SSE 是什么

Server-Send-Event,服务器推送事件 SSE 是 W3C 标准,GET 单向长连接流水规范,HTML5 原生能力。

解决什么问题

服务端无法单向推送消息给客户端

为什么有 WebSocket 还需要有 SSE

核心矛盾点:WebSocket 已经脱离 HTTP 生态,无法复用 HTTP 生态;需要协议升级,很多老旧网络设备不兼容 WebSocket;WebSocket 本身协议也比较重。

而 SSE 被设计出来的目标为:提供一套基于原生 HTTP 协议,无需协议升级的标准化单向推送方案。

SSE 有什么弊端

需要声明,SSE 是特别被设计为单向传输的,所以这并不是它的弊端。

SSE 的弊端在于:

  1. 需要会话粘性(负载均衡必须路由到同一台服务实例);一旦 SSE 长连接断掉,下行通知全部丢失;
  2. SSE 是基于 GET 的长连接, 无法携带 body,无法上传文件

Streamable HTTP

Streamable HTTP 是什么

基于 HTTP Chunked 流式双向传输范式,是 Anthropic 专为 MCP 设计的底层传输层

为什么被设计出来,要解决什么问题

初代 MCP 是 SSE 双端点架构,要解决 SSE 双端点架构问题,以及 SSE 本身的问题。

这里解释一下什么是双端点架构

  1. GET /sse 建立长连接,Server -> Client
  2. POST /message , Client -> Sever。每次 Client 要发送消息都要单独使用 POST

上面的架构就带来 1 个问题,认证、超时、重连要做 2 套。

Streamable HTTP 特点

  1. 单端点通信
  2. 不需要会话粘性
  3. 双向流,一个 POST 请求完成收发
  4. 标准 HTTP 协议,兼容性好
  5. 浏览器、后端通用。原生浏览器 Fetch API 支持请求体流式
相关推荐
江湖十年2 小时前
Go 语言中 YAML to JSON 踩坑笔记
后端·go·json
你驴我3 小时前
WhatsApp 消息撤回与编辑的幂等性设计实践
java·服务器·前端·后端·python
一缕清烟在人间3 小时前
HarmonyOS开发实战:小分享-TextEditPage文字编辑器——Header+TextArea+工具栏
后端·华为·harmonyos·鸿蒙
人间凡尔赛3 小时前
K8s 十年之变:从 Cloud Native 到 AI Native,2026 年后端架构的范式革命
后端·云原生·架构
程序员cxuan3 小时前
Opus 5 深夜炸场,价格还挺香。。。
人工智能·后端·程序员
北冥you鱼4 小时前
Go 语言新手扫盲:指针 * 和 & 使用场景详解
开发语言·后端·golang
青山木4 小时前
Hot 100 ---腐烂的橘子
java·数据结构·后端·算法·leetcode·广度优先
卷无止境4 小时前
Python的collections模块:那些被低估的"瑞士军刀"
后端·python
卷无止境4 小时前
Python的方法解析顺序:一场关于继承顺序的精妙设计
后端·python