导语:
除了整理网络上基本的概念原理,还会增加一些有深度的代码解析,帮助读者进一步了解MCP。
一、什么是MCP
MCP(Model Context Protocol)是由Anthropic于2024年底提出并开源的一种协议,旨在为AI系统(如AI编程助手、Agent等)提供安全、标准化的数据访问方式。它采用客户端-服务器架构,使AI工具(如Claude Desktop、IDE插件等)能够通过MCP客户端与MCP服务端交互,访问本地或远程数据源。
官方文档:MCP Quickstart
https://modelcontextprotocol.io/quickstart/server
MCP的核心特点包括:
模块化:每个模块专注于一个概念、任务或技能。
组合性:多个模块可按需组合,处理复杂任务。
动态路由:主控制器根据上下文动态调用合适模块。
可解释性:每一步推理过程清晰可追踪。
二、为什么需要MCP
MCP 则提供了一种新的范式,让模型能像人类一样“拆分任务”、“调动知识”、“有条理地思考”。它就像一个“转接头”或“通用插座”,它的核心作用是统一不同外部服务(如 Google Drive、GitHub、Slack、本地文件系统等),通过标准化接口与 AI 模型对接。
这样,开发者只需基于 MCP 规范开发一次“接口适配器”(MCP 服务器),就能让所有兼容 MCP 的模型(MCP 客户端)无缝接入,无需针对每个模型单独适配,大幅提升兼容性与开发效率。
MCP可以标准化地连接AI系统与各类外部工具和数据源:
传统的 API 就像不同的门和特定的钥匙:
三、MCP的架构
MCP遵循客户端 - 服务器架构,包含以下几个核心部分:
MCP 主机(MCP Hosts):
发起请求的 AI 应用程序,比如聊天机器人、AI 驱动的 IDE 等。
MCP 客户端(MCP Clients):
在主机程序内部,与 MCP 服务器保持 1:1 的连接。
MCP 服务器(MCP Servers):
为 MCP 客户端提供上下文、工具和提示信息。
本地资源(Local Resources):
本地计算机中可供 MCP 服务器安全访问的资源,如文件、数据库。
远程资源(Remote Resources):
MCP 服务器可以连接到的远程资源,如通过 API 提供的数据。
这个图比较直观的展现了一个样例交互流程。
协议层与传输层
协议层(Protocol Layer)
负责消息封装(framing)、请求/响应关联、高级通信模式管理。
传输层(Transport Layer)
支持两种通信方式:
1.Stdio传输(标准输入/输出)
- 适用于本地进程间通信。
2.HTTP + SSE传输
-
服务端→客户端:Server-Sent Events(SSE)
-
客户端→服务端:HTTP POST
-
适用于远程网络通信。
所有传输均采用JSON-RPC 2.0进行消息交换。
消息类型
MCP 拥有多种类型的消息来处理不同的场景
请求(Request)(期望获得响应)
interface Request {
method: string;
params?: { ... };
}
成功响应(Result)
interface Result {
[key: string]: unknown;
}
错误响应(Error)
interface Error {
code: number;
message: string;
data?: unknown;
}
通知(Notification)(单向,无需响应)
interface Notification {
method: string;
params?: { ... };
}
生命周期
类似于三次握手,MCP客户端与MCP服务端初始化建立连接会进行以下步骤:
初始化(Initialization)
-
1.客户端发送initialize请求(含协议版本、能力集)。
2.服务端返回版本及能力信息。
3.客户端发送initialized通知确认。
4.进入正常通信阶段。
消息交换(Message Exchange)
当初始化完毕,就可以进行通信了,目前支持:
-
请求-响应模式(Request-Response):双向通信。
通知模式(Notification):单向消息。
终止(Termination)
有以下几种方式会关闭连接
-
主动关闭(close())。
传输层断开。
错误触发终止。
四、MCP能用来做什么
五、MCP与API的区别
你可能会问:API 不也能让 AI 调用外部服务吗?为什么需要 MCP?答案在于,MCP 不仅实现了 API 的功能,还带来了更高的标准化和灵活性:
举个例子:用 API 获取天气数据,AI 得解析复杂的 JSON;而用 MCP 天气服务器,AI 直接拿到简洁的预报结果,还能顺手帮你记录下来。MCP 的标准化和双向性,让 AI 的操作更高效、更自然。
以下是一个简单的表格,展示了两者在不同场景下的表现:
这里说下我的一些观点,MCP实质上也是一种特殊的API,是针对大模型和智能体而定制的API,转换一下角度,就不难理解了。
六、一个实践案例
基础概念介绍完毕,接下来进行实践,我希望能实现一个自己的 agent,让 AI 不仅能和我交流,还能帮我干活。
先画一个图:
如图,要实现一个这样的效果,实现一个 myAgent,启动时,MCP Client建立与 MCP 服务端的连接,此时 MCP Server 上的能力或者可调用的工具会注册进来, 让 Client 感知到这个MCP服务能够干啥。
当用户与 Agent 进行交互时,Agent 会让 MCP Client 将用户的输入发送给 AI,让 AI 解析用户意图,一并发送的还有注册在 Client 上的能力集合。
我写了一个搜索助手的 MCP Server ,能力集的数据是这样的,可以看到目前只有一个 function,get_offers,可以看到工具里有它的名字,能力描述,需要的字段(包含字段类型,字段描述)。
available_tools is: [{'type': 'function', 'function': {'name': 'get_offers', 'description': 'Get product offers from API', 'parameters': {'type': 'object', 'properties': {'keywords': {'type': 'string', 'description': 'Keywords to search for products', 'default': ''}, 'pageSize': {'type': 'number', 'description': 'Number of items per page', 'minimum': 1, 'maximum': 100, 'default': 10}}}}}]
AI 会理解用户意图,决定是否用自然语言回答用户,或者选择合适的工具,告诉 client,帮我调用它。
当输入 你好 时,传给 AI 的 message 是这样的,这里系统预设了 AI 的一个身份,用于更好的完成特定领域的任务。
[
{
"role": "user",
"content": "你好"
},
{
"role": "system",
"content": "You're a helpful digital assistant who can answer questions and support users in completing tasks."
}
]
此时 client 接收到 AI 的消息后,会解析数据,当没有工具要调用时
AI返回的是这样的:
ChatCompletionMessage(content='你好!有什么可以帮助你的吗?', refusal=None, role='assistant', annotations=None, audio=None, function_call=None, tool_calls=None)
可以看到,AI 返回是带有角色信息的,然后本次并没有识别到需要调用工具的地方,因此直接返回给用户就好,当然,在工程应用时,可以进行额外的逻辑处理。
让 AI 长出手,AI调用 MCP Server流程揭秘
当输入 帮我找一些手表 时,输入是:
[{'role': 'user', 'content': '帮我找一些手表'}, {'role': 'system', 'content': 'You are a helpful assistant that can answer questions and help with tasks.'}]
第一次AI 交互
AI返回的是
AI response is
ChatCompletionMessage(content='', refusal=None, role='assistant', annotations=None, audio=None, function_call=None,
tool_calls=[ChatCompletionMessageToolCall(id='0195c8c06aaf3ea050e6d8eed17380ec', function=Function(arguments='{"keywords": "手表", "pageSize": 10}', name='get_offers'), type='function')])
可以看到,AI 识别到了用户的意图,是要寻找一些手表,并自动的选择了一个工具进行调用,根据工具使用说明,决定了选择的工具应该输入什么入参。(这里和模型很相关,是一个重要的节点,识别用户意图并决定要调用工具,有时识别的并不准确,或者返回的结构不是标准可解析的,这时就触发不了工具的调用,还会引入一些辣鸡信息,可能的解决方案是 换效果更好的模型,或者用提示词来约束模型返回,或者系统自己增加鲁棒性,提升成功率)
下面举一个效果不好的例子,大家如果知道有其他解决方法欢迎留言。
AI response is ChatCompletionMessage(content='leton\n{{"name": "get_offers", "arguments": {"keywords": "手表", "pageSize": 10}}}\n</tool_call>', refusal=None, role='assistant', annotations=None, audio=None, function_call=None, tool_calls=None)
Client 调用 MCP Server
client 接收到AI 的消息后,发现要调用工具,并且也有了工具所需的参数,就会与通过协议与 MCP Server 进行通信,告诉 MCP Server 该使用 get_offers 能力了,并且期待 MCP Server 将结果返回回来:
result = await self.session.call_tool(tool_name, tool_args)
获取 MCP Server 数据
MCP Server 不负众望,将结果返回了,可以看看返回的格式是什么样的:
meta=None content=[TextContent(type='text', text='some...product...info', annotations=None)] isError=False
MCP Client 拿到数据后,再将数据发送给 AI,输入是这样的:
{
"messages": [
{
"role": "user",
"content": "帮我找一些手表"
},
{
"role": "system",
"content": "You are a helpful assistant that can answer questions and help with tasks."
},
{
"role": "assistant",
"content": "",
"tool_calls": [
{
"id": "0195c8c06aaf3ea050e6d8eed17380ec",
"type": "function",
"function": {
"name": "get_offers",
"arguments": "{\"keywords\": \"手表\", \"pageSize\": 10}"
}
}
]
},
{
"role": "tool",
"tool_call_id": "0195c8c06aaf3ea050e6d8eed17380ec",
"content": {
"type": "text",
"text": "some...product...info"
}
}
]
}
第二次 AI 交互
最后,AI 将 MCPServer 的结果,进行总结润色,结构化返回:
🤖AI: [📞调用工具 get_offers 🔑参数是 {'keywords': '手表', 'pageSize': 10}]
根据您的搜索,这里有几款手表供您参考:
1. 款式 ID: ididid2
价格: $0.24
供应商: Guangzhou Huapan Cosmetics Co., Ltd.
评分: **
收评次数: **
供应商年限: **年
推荐指数: ★★
2. 款式 ID: ididid
价格: $3.99
供应商: Shenzhen Top Quality Electronics Technology Co., Ltd.
评分: **
收评次数: **
供应商年限: **年
推荐指数: ★★
这两款手表的评价和销售情况都还不错,您可以根据自己的需求选择合适的款式。如果还有其他问题或需要更多信息,请随时告诉我。
这里给了 它 10 个品 ,但是只总结了两个品,可能适合我之前的输入 帮我找一些手表 有关,看来AI 也会偷懒😅。
上面的交互过程,其实可以化简,如果在工程应用上,调用的 MCP Server 是一个预期内的结构化的结果或者触发某个任务时,可以不必进行二次 AI 调用。如上面的例子中,MCP Server 是一个搜索助手,内部发起调用的是搜索的接口,并进行结构化返回。此时在 AI 识别到用户意图并告诉 Client 该调用什么工具时,与 AI 的交互就可以结束了,由系统接管决定应该返回给用户什么,不必再将结果给到 AI 进行润色总结。
给到 AI 进行润色总结的好处是可以根据用户的输入,再结合工具获取的数据,更智能友好的返回给用户信息,这一点可以在工程应用时,进行衡量取舍。
将MCP Server 的结果交给 AI,在需要进行多轮交互场景是有必要的,根据 MCP Server的结果,进行分析及决策,动态调整要使用的工具,可以将一个复杂的任务交给 AI , 它会自己拆解成小任务,然后自动完成。
对于该场景,也进行了一些实践。
例如,让Al agent拆解抽象任务,并自己主动与系统进行多轮交互,完成任务场景。
七、MCP社区
4月15日,中国第一AI开源社区魔搭(ModelScope)推出全新MCP广场,上架千余款热门的MCP服务,包括支付宝、MiniMax等全新MCP服务在魔搭独家首发。魔搭社区为AI开发者提供丰富的MCP服务及调试工具,并支持第三方平台集成和调用,通过开源开放的方式加速Agent及AI应用的创新和落地。