[控场AI]
· 8 分钟阅读· 4,288 字

MCP协议详解:从N×M到N+M的AI集成革命

MCP协议详解:从N×M到N+M的AI集成革命

MCP 是统一 AI 模型与外部工具连接的标准协议,把集成复杂度从 N×M 降为 N+M。

MCP(Model Context Protocol)是一个面向 AI 模型的开放标准协议,类比 USB-C 统一硬件接口,它统一了 LLM 与外部工具、数据库、API 的连接方式。传统模式下 N 个模型与 M 个工具需要 N×M 套集成代码,MCP 通过让每个工具实现一次标准 Server,将连接器数量降为 N+M。架构上由 Host、Client、Server 三部分组成,通过 JSON-RPC 2.0 通信,支持 stdio 和 SSE 两种传输方式。Server 暴露 Tools(模型控制)、Resources(应用控制)、Prompts(用户控制)三类原语。与 Function Calling 和 LangChain Tool 相比,MCP 在互操作性、关注点分离和权限隔离上更具优势。生产环境应遵循无状态设计、细分工具作用域、优化 token 占用和返回可读错误信息四条原则。

如果你正在用大模型连接外部工具,大概率遇到过这样的麻烦:想让Claude查PostgreSQL,写一套代码;想让ChatGPT读GitHub文件,再写一套;换个模型,所有胶水代码推倒重来。MCP(Model Context Protocol,模型上下文协议)就是为了终结这种混乱而生的。

MCP到底是什么?一个USB-C的比喻

MCP的全称是Model Context Protocol,本质是一个面向AI模型的标准开放协议。一位YouTube技术创作者在讲解中给出了一个精准的类比:MCP之于AI应用,就像USB-C之于硬件设备。

USB-C出现之前,每台设备都有专属的充电线和适配器;USB-C统一接口之后,一根线可以喂饱笔记本、手机和各种外设。MCP做的事情一模一样——统一LLM与外部工具、数据库、API之间的连接方式。

在这之前,开发者要为每个模型与每个数据源的组合单独编写集成代码。MCP把这个过程标准化了:工具方只需实现一次,任何支持MCP的客户端都能直接使用。

AI模型与MCP host的连接示意

为什么需要MCP?N×M问题太痛了

理解MCP的价值,得先看清它要解决的痛点。假设你有N个模型(Claude、ChatGPT、各类开源模型)和M个数据源或工具(PostgreSQL、GitHub本地文件、Slack等)。传统做法下,你需要为每一个「模型×工具」组合编写独立的wrapper和逻辑,连接器数量是N乘以M。

据该YouTube频道的分析,这种架构带来两个直接后果:一是复杂度呈乘法级膨胀,二是模型无法在没有专有插件的情况下安全地直接访问本地文件、开发环境或内部工具。

MCP的解法是把乘法变成加法。工具和数据源只需各自实现一个MCP Server,任意MCP Client(Claude Desktop、Cursor或自定义AI Agent)都能即插即用。连接器数量从N×M降为N+M,工程负担出现数量级的下降。

架构拆解:Host、Client与Server

MCP在三个核心组件之间协作运转。

MCP Host 是用户直接交互的应用程序,比如Claude Desktop、Cursor,或者用Streamlit、FastAPI搭建的自定义Agent。Host内部嵌入MCP Client,负责与Server建立连接和握手。

MCP Client 是Host内部的协议层,承担实际连接与握手职责。

MCP Server 是一个轻量服务,按照MCP规范把数据源和工具暴露出来,比如一个GitHub Server或SQLite Server。Server背后连接的是本地或远程资源——文件、数据库、Web API。

整个链路的通信统一使用JSON-RPC 2.0。

JSON-RPC 2.0 是一种轻量级的远程过程调用协议,使用 JSON 作为数据格式。它定义了请求、响应和通知三种消息类型,每条消息包含 jsonrpc、method、params、id 等字段。MCP 选择 JSON-RPC 2.0 作为通信基石,是因为它足够简单、语言无关,且天然支持双向通信(Server 也可以主动向 Client 发送通知,比如资源更新提醒)。与 REST 不同,JSON-RPC 不依赖 HTTP 方法语义,同一端点即可处理所有操作,这让 stdio 这种非 HTTP 传输方式也能无缝复用同一套消息规范。

三大构建块:Tools、Resources、Prompts

一个标准MCP Server向外暴露三类原语,它们的控制权归属各不相同。

Tools:模型控制

Tools由模型控制,用于执行有副作用的函数,例如运行SQL查询、发送Slack消息、触发模型训练。模型根据用户意图自主决定是否调用。

MCP中可复用的prompt模板

Resources:应用控制

Resources由应用控制,提供只读上下文,比如项目文件夹中的schema文件。用户或Host把数据直接传入模型的上下文窗口。

Prompts:用户控制

Prompts由用户控制,是可复用的预写模板。创作者举了个例子:给模型一个类似编程任务的模板,保持prompt主体不变,只替换其中的变量标签,就能反复复用。

两种传输方式:stdio与SSE

Server和Client之间的通信有两种主要途径,适用场景截然不同。

标准输入输出(stdio) 适用于MCP Server作为进程运行在同一台本地机器上。Client直接spawn服务进程,通过stdin和stdout收发消息。这种方式速度快、安全性好,是本地文件系统和开发场景的首选。

SSE(Server-Sent Events) 适用于Server托管在远程容器或云VM上,比如GCP Cloud Run或微服务架构。Client通过HTTP POST发送命令,再从SSE流中获取更新。

SSE(Server-Sent Events) 是 HTML5 规范中定义的一种服务器推送技术。客户端发起一个普通 HTTP 请求后,服务器保持连接不关闭,并以 text/event-stream 格式持续向客户端推送文本消息。它只支持服务器到客户端的单向流,因此 MCP 在 SSE 模式下采用「双通道」设计:客户端通过 HTTP POST 向 Server 发送请求,Server 的响应和通知则通过 SSE 流回传。相比 WebSocket,SSE 更轻量、更容易穿透代理和防火墙,适合 MCP Server 部署在云环境、需要被多个客户端远程访问的场景,但长连接也意味着需要处理断线重连和会话恢复问题。

动手实现:一个Python MCP Server

官方提供了Python MCP SDK,上手门槛很低。安装只需一条命令:

pip install mcp

接着在服务端创建一个server.py文件。假设要构建一个分析型MCP Server,用于检查机器学习数据集的指标并执行查询。

server.py的编写位置示意

客户端侧,以Claude Desktop为例,需要在配置文件中注册Server的路径。当Claude Desktop启动时,它会在后台启动这个server.py,通过标准输入输出完成初始化握手,拉取工具的schema并注入模型上下文。当用户提问「实际值和预测值的MAE是多少」,模型会自动触发计算指标的工具并执行。

MCP Server 启动时的初始化握手是整个链路的关键一步。Client 与 Server 建立连接后,双方首先交换协议版本和各自支持的能力(capabilities),随后 Client 可以请求 Server 暴露的工具列表(tools/list),Server 返回每个工具的名称、描述和输入参数的 JSON Schema。这些 schema 会被注入模型的上下文,模型据此判断何时调用哪个工具、如何构造参数。当模型决定调用时,Client 发送 tools/call 请求,Server 执行后返回结果。理解这个「先发现、后调用」的流程,有助于排查工具未被触发或参数校验失败等常见问题。

MCP与Function Calling、LangChain Tool的区别

三者在三个维度上差异明显。

互操作性:Function Calling往往绑定特定厂商,JSON schema格式各异;LangChain Tool是框架绑定的;MCP是通用标准,任何Client或模型都能运行。

关注点分离:用API做Function Calling,工具逻辑写在应用代码里;LangChain把工具逻辑与Python代码紧耦合;MCP采用解耦架构,Server运行在独立进程或容器中。

安全与权限:Function Calling需要开发者手动管理安全;LangChain没有框架层面的隔离;MCP支持客户端级隔离,用户可以检视工具到底访问了什么。

用户可以检视工具的访问范围

Function Calling 是大模型厂商提供的一种能力:开发者在 API 请求中传入一组函数描述(通常是 JSON Schema),模型在需要时返回结构化的调用意图,由应用代码实际执行函数并把结果回传给模型。它的本质是「模型输出一个调用指令」,工具的执行和生命周期管理完全由应用负责,因此与特定厂商的 API 格式深度绑定。MCP 则把「工具如何被描述、被发现、被调用」抽象成独立于模型厂商的协议层,Server 可以独立部署、独立升级,模型只负责通过 Client 发起标准化调用。换句话说,Function Calling 解决的是「模型如何表达要调用什么」,MCP 解决的是「工具如何以统一方式接入任何模型」。

生产环境的四条实践原则

视频最后给出了值得照做的生产实践。

保持无状态:MCP工具尽量设计成幂等或无状态,避免并发请求之间互相干扰。

细分工具作用域:与其造一个巨型单体Server,不如按领域拆分——数据库一个、GitHub一个、模型监控一个。拆分能有效避免上下文token膨胀。

优化token占用:Resources返回数据时,不要把上万行原始数据直接塞进上下文窗口,而是返回聚合摘要、schema或过滤后的头部数据。

错误信息要可读:工具输出应包含描述性错误,比如「SQL语法无效」或「类型不匹配」,让LLM能够自我纠正,带着修正上下文重试。

小结

MCP的价值不在于发明了新概念,而在于把AI与外部世界连接的工程复杂度从乘法降为加法。对于每天在多个模型和多个数据源之间写胶水代码的开发者来说,这套协议值得投入时间理解。

分享:

相关推荐