让你彻底弄懂 MCP 的一切
AI界的TYPE-C接口:模型上下文协议!
MCP 模型上下文协议(Model Context Protocol
)是 AI
领域的一种 标准化通信协议,是由 Anthropic
于 2024
年 11
月推出,旨在解决大语言模型(LLM
)与外部工具、数据源之间的碎片化集成问题。其核心目标是充当 AI领域的USB-C接口,实现模型与工具的即插即用式连接,推动 AI 从被动生成文本转向主动执行任务。
1. 技术原理与架构
MCP 促进了AI 模型与外部世界之间的连接和交互。
MCP
的核心是通过 标准化接口 统一 AI
模型与外部资源的交互方式,技术架构分为三个核心组件:MCP Host(运行 AI 模型的应用程序;负责发起用户请求)、MCP Client(集成在 Host 内并与Server通信;负责将 LLM 的请求转换为标准化消息)、MCP Server(轻量级服务端;封装特定工具或数据源的功能;通过 JSON-RPC 2.0
协议暴露接口)。
> 工作流程
1. 工具发现:Client
从 Server
获取可用工具列表,比如发送邮件等。2. 请求处理:用户查询+工具描述发送给 LLM
,LLM
决策需调用的工具及参数。3. 工具执行:Client
调用对应 Server
执行操作,比如查询 GitHub
仓库。4. 结果整合:Server
返回结果至 LLM
,然后 LLM
生成自然语言响应给用户。
需要注意的是,MCP
选择 JSON-RPC 2.0 作为通信协议核心。主要原因是,解决 LLM 工具调用的核心痛点,比如极简的消息结构、双向通信灵活性、无状态协议适配性、强错误处理机制、生态成熟度。
// 请求
{"jsonrpc":"2.0", "method":"tool.execute", "params":{...}, "id":1}
// 成功响应
{"jsonrpc":"2.0", "result":{...}, "id":1}
// 错误响应
{"jsonrpc":"2.0", "error":{"code":-32601, "message":"Method not found"}, "id":1}
> 通信模式
1. 本地模式(STDIO):Server 作为 Host 的子进程运行,通过 stdin/stdout 管道交换 JSON-RPC 消息,无需网络传输,适合敏感操作如文件访问。使用场景,比如代码编辑器插件需要访问本地文件系统、数据库凭证管理等执行敏感的操作。
# 启动Server(Python示例)
import mcp
server = mcp.StdioServer(tools=[FileTool(), DBQueryTool()])
server.start()
# Host配置(伪代码)
mcp_client = Client(server_path="python mcp_server.py")
**2. 远程模式(SSE)**:基于 HTTP Server-Sent Events 的单向流通信,Client 发送 POST 请求后,Server 通过事件流持续返回结果。支持云端服务调用,比如 Slack 消息推送、长时任务执行、多 Host 共享工具服务。
# 启动Server(监听8080端口)
mcp-server --tools github_tool --port 8080
# Client调用
curl -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-d '{
"method": "github.search_repos",
"params": {"query": "MCP protocol", "limit": 5}
}'
2. 技术突破与优势
MCP 促进了AI 模型与外部世界之间的连接和交互。
1. 动态工具集成
支持运行时发现新工具(如临时接入 GitHub API
),突破传统预定义函数的限制。
2. 上下文感知
跨多步任务保持状态(例如先查数据库再生成报告),避免传统 RAG
的单次检索局限。
3. 协议无关性
封装多种底层协议(HTTP
/WebSocket
),统一为 JSON
消息格式,降低开发成本。
4. 生态兼容性
OpenAI
、Google
等巨头已支持,推动协议成为行业标准。
3. 与传统技术对比
工具调用(Function Call) + 系统提示词(System Prompt)
MCP
和客户端对接的时候,根据客户端的不同,对接方式也有所不同。比如,Cline
依赖系统提示词不依赖 function call
,而 5ire
则选择依赖 function call
功能没有使用系统提示词。所以 MCP
协议是一种灵活的协议,通用性能力更强,可以兼容市面上所有的大模型。
MCP
的本质是 AI 大模型的标准化工具箱。每个 MCP Server
通过 mcp.discover
方法返回结构化工具描述,其中,description
字段用自然语言描述功能,直接被注入 LLM
的 prompt
中。参数类型兼容 JSON Schema
,但 不强制严格校验。
{
"tools": [{
"name": "send_email",
"description": "发送邮件至联系人", // LLM可读的语义描述
"parameters": { // 参数Schema
"recipient": {"type": "string", "description": "收件人邮箱"},
"subject": {"type": "string"},
"body": {"type": "string"}
}
}]
}
4. 简单开发的示例
协议:STDIO、SSE、Streamable HTTP!
下面是,官网 Python-SDK
给出的一个测试用例。即创建一个简单的 MCP
服务器,功能只包括计算器中的一个加法运算。这里使用的协议模式是 stdio
,即标准输入输出。我们不需要启动 MCP Server
的服务,让客户端帮我们启动即可。
# 初始化我们自己的mcp服务
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("Demo")
# tool声明下面这个函数是一个MCP工具
# tool类似于HTTP的RestAPI里面的Post方法
@mcp.tool()
def add(a: int, b: int) -> int:
# 上面的类型修饰符必须写;有助于大模型理解传参类型
# 注释必须写;给AI进行输入信息(必须语义正确)
"""Add two numbers"""
return a + b
# resource类似于HTTP的RestAPI里面的Get方法
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""Get a personalized greeting"""
return f"Hello, {name}!"
if __name__ == "__main__":
mcp.settings.host = "0.0.0.0"
mcp.settings.port = 8000
mcp.run(transport="stdio")
之后,添加运行成功之后,可以将协议改为 sse
远程调用方式。这时就需要我们手动现将之前写好的 MCP Server
的服务启动起来,再通过 API
接口调用。
# uv run ./main.py(http://127.0.0.1:8000/sse)
if __name__ == "__main__":
mcp.run(transport="sse")
后续,还支持使用 streamable-http
可流式传输 HTTP
协议。
# uv run ./main.py(http://127.0.0.1:8000/mcp)
if __name__ == "__main__":
mcp.run(transport="streamable-http")