Model Context Protocol(MCP)超全解析:从原理到实战,一篇就够!
Model Context Protocol(MCP)超全解析:从原理到实战,一篇就够!
·
本文基于官方最新版 MCP 文档,力求用中文把 MCP 的架构、核心概念、协议细节讲得明明白白。看完你就能自己动手写 MCP Server,让大模型真正“长出手脚”!
一、MCP 是什么?
一句话:MCP 是一套“上下文交换协议”,专门解决「如何让 AI 应用安全、实时、可扩展地获取外部数据与工具」的问题。
它不绑定任何大模型,也不关心你用什么语言开发,只要实现协议,就能接入 Claude、Cursor、Copilot 等任何 MCP Host。
二、MCP 的“全家桶”
项目 | 作用 | 备注 |
---|---|---|
MCP Specification | 协议规范 | 必读!定义了客户端和服务端必须实现的 JSON-RPC 格式 |
MCP SDKs | 多语言 SDK | Python、TypeScript、Java、Go…官方已开源 |
MCP Inspector | 调试神器 | 可视化查看工具/资源/提示词列表,一键发请求 |
官方示例 Server | 拿来即抄 | 文件系统、Sentry、数据库…示例代码全都有 |
三、核心角色与关系图
MCP 采用「1:1 单连接」的客户端-服务器架构:
- MCP Host(AI 应用本体,如 Claude Desktop)
- MCP Client(Host 为每个 Server 创建的独立客户端)
- MCP Server(真正干活的“插件”,本地或远程均可)
┌──────────────┐
│ MCP Host │
│ (AI 应用) │
└──────┬───────┘
┌─────────────┼─────────────┐
│one-to-one │one-to-one │one-to-one
┌──▼───┐ ┌───▼───┐ ┌───▼───┐
│Client│ │Client │ │Client │
└──┬───┘ └───┬───┘ └───┬───┘
│ │ │
┌──▼───┐ ┌──▼───┐ ┌──▼───┐
│Server│ │Server│ │Server│
└──────┘ └──────┘ └──────┘
(本地/远程) (本地/远程) (本地/远程)
四、两层协议栈
- 数据层(Data Layer)
- 协议:JSON-RPC 2.0
- 功能:生命周期、工具、资源、提示词、通知等
- 传输层(Transport Layer)
- stdio:本地进程通信,零延迟
- Streamable HTTP:远程 Server,支持 SSE 流式回包、Bearer Token、OAuth 2.0
五、数据层协议详解
5.1 生命周期(Lifecycle)
连接建立后第一件事:握手。
- 协商协议版本
- 交换 capabilities
- 互相自我介绍(name / version)
示例握手
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": { "elicitation": {} },
"clientInfo": { "name": "csdn-client", "version": "1.0.0" }
}
}
5.2 三大核心 Primitive
类型 | 作用 | 关键方法 |
---|---|---|
Tools | 可调用的函数 | tools/list 枚举、tools/call 执行 |
Resources | 只读数据源 | resources/list 枚举、resources/read 读取 |
Prompts | 可复用的模板 | prompts/list 、prompts/get |
所有 list 接口都支持动态更新,Server 可随时增删工具而无需重启 Host。
5.3 通知(Notifications)
Server 状态变化时主动推送,例如:
{ "jsonrpc": "2.0", "method": "notifications/tools/list_changed" }
Host 收到后立即重新 tools/list
,保持最新工具列表。
六、实战演练:一次完整交互
下面用伪代码演示「查询旧金山天气」的完整链路:
- 连接 & 初始化
async with stdio_client(server_config) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
- 发现工具
tools = await session.list_tools()
# 找到 weather_current
- 调用工具
result = await session.call_tool(
"weather_current",
{"location": "San Francisco", "units": "imperial"}
)
- 接收通知 & 动态刷新
async def on_tools_changed():
tools = await session.list_tools()
app.update_tools(tools)
七、Client 端三大能力
能力 | 方法 | 场景 |
---|---|---|
Sampling | sampling/complete |
Server 需要 LLM 生成文本,但不自己集成模型 |
Elicitation | elicitation/request |
Server 向用户索要额外输入或二次确认 |
Logging | log/message |
Server 把调试日志打到 Host |
八、如何快速上手?
- 克隆官方仓库:
git clone https://github.com/modelcontextprotocol/servers
- 挑一个示例(如 filesystem)跑通:
python -m mcp_server_filesystem /your/path
- 用 MCP Inspector 调试:
npx @modelcontextprotocol/inspector
九、小结
MCP 把「AI 应用如何安全、实时地获取外部世界」这件事做到了极致解耦:
- 对 Host:随意插拔 Server,像装 VS Code 插件一样简单
- 对 Server:专注提供工具/数据,零 AI 知识也能写
- 对开发者:一套协议多端复用,Python、Node、Rust 想写啥写啥
如果本文对你有帮助,记得点赞、收藏、留言三连!
更多推荐
所有评论(0)