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 支持请求体流式
相关推荐
学长毕业设计21 分钟前
基于SpringBoot的健康食谱管理系统的设计与实现(源码+文档+讲解视频)
java·spring boot·后端
逃逸线LOF1 小时前
Spring的AOP简介
java·后端·spring
yume_sibai1 小时前
02-Rust 所有权与借用深入解析(底层原理 + 借用检查器 + 生命周期 + 内部可变性)
开发语言·后端·rust
卷无止境1 小时前
从脚本到程序:Windows平台上的Python打包全景图
后端·python
骇客野人1 小时前
Springboot 的 配置文件 application.yml 和 bootrap.yml 的由来和作用
java·spring boot·后端
岁月宁静2 小时前
三、《从零手撸 Agent》 · system prompt 与核心参数:调好你的旋钮
后端·python·agent
bcbnb2 小时前
Flutter-Notebook代码混淆:Android与iOS平台安全配置
后端·ios
泡海椒2 小时前
SpringBoot 集成 JQuick-Curl:Spring 环境完整接入教程,第三方接口调用别再到处手写模板类
后端
落木萧萧8252 小时前
MyBatis 关联查询的四种写法,为什么最后都变回了手写 XML
java·数据库·后端
cui_hao_nan2 小时前
Spring AOP 自调用、代理与 private 方法引发的诡异 NPE
java·后端·spring·ai开发