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 支持请求体流式
相关推荐
IT_陈寒1 小时前
Python的GIL让我多写了500行代码
前端·人工智能·后端
IT爱学堂2 小时前
精讲软件设计师(软考中级)一站式通关课_实战课程_慕课网
后端
战天战地站房顶3 小时前
在 Windows Docker 中部署 PostgreSQL 17 + pgvector 完整指南
后端
卷无止境3 小时前
FastAPI Guard 全解析,从概念到工程落地的实战指南
后端·python
卷无止境3 小时前
FastAPI Users 全面解析:概念、原理与工程实战
后端·python
程序员爱钓鱼3 小时前
Go switch 详解
后端·面试·go
程序员爱钓鱼3 小时前
Rust Struct结构体详解:定义自己的复杂数据类型
后端·面试·rust
风流 少年3 小时前
Spring AI 2.0:MCP
java·后端·spring
北斗落凡尘4 小时前
LangGraph 入门实战(7)
后端·langchain
uzong4 小时前
业务新老系统数据迁移-负责人经验总结和复盘
后端