更新日期 :2026 年 2 月
适用读者 :AI 开发者、LLM 应用构建者、技术决策者
前置知识:了解大语言模型(LLM)、API 调用、JSON 格式
一、什么是 MCP?
MCP (Model Context Protocol,模型上下文协议)是由 Anthropic 于 2024 年底提出并开源的一种标准化协议 ,旨在让大语言模型(如 Claude、GPT、Llama 等)能够安全、高效、结构化地访问外部工具和数据源。
✅ 一句话定义 :
MCP 是 LLM 与外部世界通信的"通用语言" ,就像 HTTP 之于 Web。
二、为什么需要 MCP?------解决 LLM 的三大痛点
| 问题 | 传统方案 | MCP 方案 |
|---|---|---|
| 工具碎片化 | 每个工具需定制集成(如 LangChain 工具) | 统一接口,一次接入,多模型可用 |
| 上下文污染 | 工具结果以文本拼接,易混乱 | 结构化 JSON 响应,模型精准理解 |
| 安全性风险 | 直接暴露 API 密钥或系统命令 | 通过 MCP Server 隔离,权限可控 |
🌰 举个例子:
你想让 AI 帮你查天气 + 发邮件 + 查数据库。
- 无 MCP:需为每个模型写三套工具调用逻辑
- 有 MCP:只需部署一个 MCP Server,所有支持 MCP 的模型自动获得能力
三、MCP 核心架构
scss
[ LLM (Claude/GPT/Llama) ]
↓ (MCP over HTTP/WS)
[ MCP Client (内置在 AI 应用中) ]
↓
[ MCP Server (你的后端服务) ]
↓
[ 外部工具:数据库 / API / 文件系统 / 自定义函数 ]
关键组件说明:
| 组件 | 作用 | 示例 |
|---|---|---|
| MCP Server | 实现 MCP 协议的服务端 | 用 Python/Node.js 编写的微服务 |
| MCP Client | 模型侧的协议解析器 | Anthropic 官方提供,集成在 Claude 中 |
| Tool Definition | 工具的元数据描述 | JSON Schema 定义输入/输出 |
| Resource | 可被模型读取的数据源 | 如日历事件、文件列表 |
四、MCP 支持的操作类型
MCP 定义了三种核心操作:
1. Tools(工具) → 执行动作
- 模型可调用的函数
- 例如:
send_email(),query_database(),create_jira_ticket()
2. Resources(资源) → 读取数据
- 模型可列出/读取的静态数据
- 例如:
list_files(),get_calendar_events(),read_config()
3. Prompts(提示模板) → 复用指令
- 预定义的提示词模板
- 例如:
summarize_text,translate_to_chinese
💡 注意 :截至 2026 年初,Tools 和 Resources 是主流用法,Prompts 尚在实验阶段。
五、动手实践:用 Python 实现一个 MCP Server
我们将创建一个简单的 MCP Server,提供两个功能:
- 获取当前时间(Tool)
- 列出项目文件(Resource)
步骤 1:安装依赖
pip install fastapi uvicorn pydantic
步骤 2:创建 mcp_server.py
python
# mcp_server.py
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
import os
from datetime import datetime
import json
app = FastAPI()
# === MCP 协议核心:处理 LLM 的请求 ===
@app.post("/mcp")
async def handle_mcp_request(request: Request):
body = await request.json()
# 获取操作类型
method = body.get("method")
params = body.get("params", {})
if method == "initialize":
# 返回服务器支持的能力
return JSONResponse({
"jsonrpc": "2.0",
"id": body.get("id"),
"result": {
"protocolVersion": "2024-10-07",
"capabilities": {
"tools": {},
"resources": {}
}
}
})
elif method == "list_tools":
# 声明可用工具
return JSONResponse({
"jsonrpc": "2.0",
"id": body.get("id"),
"result": [
{
"name": "get_current_time",
"description": "获取服务器当前时间",
"inputSchema": {
"type": "object",
"properties": {},
"required": []
}
}
]
})
elif method == "call_tool":
tool_name = params.get("name")
if tool_name == "get_current_time":
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
return JSONResponse({
"jsonrpc": "2.0",
"id": body.get("id"),
"result": {
"content": [{"type": "text", "text": f"当前时间是: {current_time}"}],
"isError": False
}
})
elif method == "list_resources":
return JSONResponse({
"jsonrpc": "2.0",
"id": body.get("id"),
"result": [
{"uri": "file://project_files", "name": "项目文件列表"}
]
})
elif method == "read_resource":
uri = params.get("uri")
if uri == "file://project_files":
files = os.listdir(".")
file_list = "\n".join(files)
return JSONResponse({
"jsonrpc": "2.0",
"id": body.get("id"),
"result": {
"contents": [{"type": "text", "text": file_list}]
}
})
# 未知方法
return JSONResponse({
"jsonrpc": "2.0",
"id": body.get("id"),
"error": {"code": -32601, "message": "Method not found"}
})
步骤 3:启动服务器
lua
uvicorn mcp_server:app --host 0.0.0.0 --port 8000
现在你的 MCP Server 运行在 http://localhost:8000/mcp
六、如何让 Claude 使用你的 MCP Server?
方法 1:通过 Claude.ai 官网(需企业版)
- 登录 claude.ai
- 进入 Settings → Developer Settings
- 添加 MCP Server URL:
http://your-server.com/mcp - Claude 在聊天中会自动发现并使用你的工具!
📌 限制 :目前仅 Claude Pro/Enterprise 用户 可配置自定义 MCP。
方法 2:通过 API 调用(推荐开发者)
ini
# client_example.py
from anthropic import Anthropic
import requests
client = Anthropic(api_key="your_api_key")
# 构造带 MCP 上下文的消息
response = client.messages.create(
model="claude-3-5-sonnet-20260201",
max_tokens=1024,
system="你是一个助手,可以使用工具获取信息。",
messages=[
{
"role": "user",
"content": "请告诉我现在的时间,并列出当前目录的文件。"
}
],
# 关键:附加 MCP 上下文(模拟 MCP Client 行为)
extra_headers={
"anthropic-beta": "mcp-2024-10-07"
},
# 实际生产中,此步骤由 MCP Client 自动完成
)
⚠️ 注意 :截至 2026 年 2 月,官方 MCP Client SDK 尚未完全开放 ,但 Anthropic 提供了 mcp 开源库用于构建自己的客户端。
七、MCP 消息格式详解(JSON-RPC 2.0)
MCP 基于 JSON-RPC 2.0 协议,典型请求/响应如下:
请求示例:调用工具
json
{
"jsonrpc": "2.0",
"id": 1,
"method": "call_tool",
"params": {
"name": "get_current_time",
"arguments": {}
}
}
响应示例:
json
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "当前时间是: 2026-02-08 10:30:45"
}
],
"isError": false
}
}
错误响应:
css
{
"jsonrpc": "2.0",
"id": 2,
"error": {
"code": -32602,
"message": "Invalid arguments"
}
}
八、安全最佳实践
1. 认证与授权
- 为 MCP Server 添加 API Key 验证
- 使用 JWT 或 OAuth 2.0 控制访问权限
python
# 在 FastAPI 中添加中间件
@app.middleware("http")
async def verify_api_key(request: Request, call_next):
key = request.headers.get("x-api-key")
if key != "your-secret-key":
return JSONResponse({"error": "Unauthorized"}, status_code=401)
return await call_next(request)
2. 输入验证
- 严格校验
call_tool的参数 - 防止路径遍历、SQL 注入等攻击
3. 沙箱执行
- 工具函数在隔离环境中运行
- 限制文件系统/网络访问权限
九、MCP vs 其他工具调用方案
| 方案 | 优点 | 缺点 |
|---|---|---|
| MCP | 标准化、多模型兼容、安全隔离 | 生态较新,文档较少 |
| LangChain Tools | 生态成熟、插件丰富 | 绑定 LangChain,迁移成本高 |
| Function Calling (OpenAI) | 原生支持、简单易用 | 仅限 OpenAI 模型 |
| Custom API | 完全可控 | 需为每个模型重复开发 |
✅ MCP 的最大优势 :一次开发,多模型复用。
十、真实应用场景
场景 1:企业内部知识库
- MCP Server 连接 Confluence/Notion
- 员工问:"Q4 营销计划是什么?" → 模型自动检索并总结
场景 2:开发助手
- MCP Server 集成 Git/GitHub
- 开发者说:"创建一个修复登录 bug 的 PR" → 自动执行 git 命令
场景 3:数据分析
- MCP Server 连接数据库
- "上月销售额最高的产品?" → 执行 SQL 并返回图表
十一、学习资源
- 官方 GitHub :github.com/anthropics/...
- 协议规范 :MCP Specification
- Python SDK :
pip install mcp - 示例项目 :mcp-examples
十二、常见问题(FAQ)
Q1:MCP 支持哪些模型?
- 官方支持:Claude 3.5+(Sonnet/Opus)
- 社区适配:通过 MCP Client,理论上可支持任何 LLM
Q2:MCP 是开源的吗?
- 是! 协议和参考实现均在 GitHub 开源(Apache 2.0 许可证)
Q3:和 LangChain 冲突吗?
- 不冲突!可将 MCP Server 作为 LangChain 的 Tool 使用
Q4:性能如何?
- 单次工具调用延迟 ≈ 网络 RTT + 工具执行时间
- 建议对高频工具做缓存
十三、总结
MCP 是 LLM 应用开发的"游戏规则改变者" 。
它通过标准化协议,解决了工具集成的碎片化问题,让开发者能一次构建,多处运行。
关键要点回顾:
- MCP = LLM 与外部世界的通用接口
- 三大能力:Tools(执行)、Resources(读取)、Prompts(模板)
- 基于 JSON-RPC 2.0,易于实现
- 安全第一:务必做好认证和输入验证
- 未来已来:2026 年,MCP 将成为 AI 应用标配
作者 :AI 架构师
版权声明 :本文可自由转载,但请保留出处。
GitHub 示例代码 :github.com/yourname/mc...(虚构)