MCP:从概念到实战
一、什么是 MCP?
MCP(Model Context Protocol,模型上下文协议)是由 Anthropic 在 2024 年底提出的开放标准协议。它被广泛称为**“AI 时代的 USB-C 端口”** ——正如 USB-C 统一了各种外设的接口标准,MCP 统一了 AI Agent 与外部工具、数据源和服务之间的交互方式。
核心价值
在 MCP 出现之前,AI Agent 接入一个新工具往往需要单独编写适配代码,每增加一个工具或数据源都意味着新的集成工作——这就是所谓的 “M×N 问题” 。MCP 通过标准化协议将这一问题转化为 “M+N 问题” :模型侧只需理解任务语义,工具侧只需遵循 MCP 规范,两者通过协议自动对接。
面试金句:“MCP 解决了 Agent 的‘插件碎片化’问题。有了 MCP,工具可以像 USB 设备一样即插即用,无需为每个新数据源单独写适配代码。”
二、MCP 的核心组成
MCP 采用客户端-服务器架构,由以下核心部分组成:
1. MCP Host(宿主)
运行 AI 模型的宿主环境,如 Claude Desktop、Cursor、Cherry Studio 等 AI 应用。
2. MCP Client(客户端)
集成在 Host 内部的客户端,负责与 MCP Server 通信。Agent 通过 MCP Client 以统一方式发现和调用外部能力。
3. MCP Server(服务端)
轻量级服务端程序,对外提供三类核心功能:
| 能力类型 | 说明 | 示例 |
|---|---|---|
| Tools(工具) | 可执行函数,LLM 可直接调用 | 数据库查询、API 调用、文件操作 |
| Resources(资源) | 只读数据源 | 文件内容、数据库 Schema、日志 |
| Prompts(提示词模板) | 预定义的结构化任务模板 | 代码审查模板、SQL 生成模板 |
4. 传输层(Transport)
MCP 客户端与服务器之间的通信通道,支持多种传输方式:
-
stdio:通过标准输入输出通信,适合本地进程
-
Streamable HTTP:基于 HTTP 的远程通信,支持流式返回
早期版本还支持独立的 SSE(Server-Sent Events)传输方式,但在 2025 年 6 月 18 日的协议版本中已被 Streamable HTTP 取代。Streamable HTTP 在保留 SSE 流式能力的同时,提供了更统一的 HTTP 语义。
补充说明:文档中提及的 SSE 地址 https://mcp.example.com/sse 为示例地址,该网页解析失败(提示:网页解析失败,可能是不支持的网页类型,请检查网页或稍后重试),属于协议废弃类型的无效端点,生产环境请勿沿用。
三、MCP 的消息格式
MCP 中的所有消息必须遵循 JSON-RPC 2.0 规范。协议定义了三种类型的消息:
1. 请求(Request)
请求从客户端发送到服务器(或相反),用于发起操作:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {}
}
关键规则:
-
必须包含字符串或整数类型的
id -
id不得为null(与基础 JSON-RPC 不同) -
id不得在同一会话中重复使用
2. 响应(Response)
响应作为对请求的回复发送:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"tools": [
{ "name": "add_note", "description": "添加新备忘录" }
]
}
}
关键规则:
-
必须包含与请求相同的
id -
必须设置
result或error,但不得同时设置两者
3. 通知(Notification)
通知从客户端发送到服务器或相反,接收者不得发送响应:
{
"jsonrpc": "2.0",
"method": "notifications/tools/list_changed"
}
关键规则:通知不得包含id。
四、传输方式详解
1. stdio(标准输入输出)
stdio 是最常见的本地通信方式,适用于 IDE 插件、本地文件系统等场景。
工作原理:
-
客户端将 MCP Server 作为子进程启动
-
Server 从标准输入(stdin)读取 JSON-RPC 消息
-
Server 通过标准输出(stdout)发送消息
-
消息以换行符分隔,不得包含内嵌换行符
特点:
-
配置简单,适合本地开发
-
无需网络,延迟低
-
Server 可通过 stderr 输出日志
2. Streamable HTTP(流式 HTTP)
Streamable HTTP 是现代远程通信方式,Server 作为独立进程运行,可处理多个客户端连接。
工作原理:
-
Server 提供统一的 HTTP 端点(如
/mcp) -
客户端通过 HTTP POST 发送 JSON-RPC 消息
-
支持 Server-Sent Events(SSE)实现流式返回
-
支持双向通信(服务器到客户端的通知和请求)
安全警告:
-
Server 必须验证
Origin头,防止 DNS 重绑定攻击 -
本地运行时建议只绑定 localhost(127.0.0.1)
-
应实现适当的认证机制
五、MCP Server 开发实战
1. 环境准备
Python:
# 创建项目
mkdir my-mcp-server && cd my-mcp-server
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 安装 MCP SDK
pip install mcp
TypeScript/JavaScript:
mkdir my-mcp-server && cd my-mcp-server
npm init -y
npm install @modelcontextprotocol/sdk
2. 实现一个简单的 MCP Server
以下是一个备忘录管理 MCP Server 的核心实现:
from mcp.server.fastmcp import FastMCP
from datetime import datetime
import json
from pathlib import Path
# 创建 MCP 服务实例
mcp_server = FastMCP(
name="NoteManager",
version="1.0",
log_level="INFO"
)
NOTES_FILE = Path("notes.json")
def load_notes():
if NOTES_FILE.exists():
with open(NOTES_FILE, 'r', encoding='utf-8') as f:
return json.load(f)
return []
def save_notes(notes):
with open(NOTES_FILE, 'w', encoding='utf-8') as f:
json.dump(notes, f, ensure_ascii=False, indent=2)
# 注册工具
@mcp_server.tool(
name="add_note",
description="添加新备忘录",
params_schema={
"type": "object",
"properties": {
"content": {"type": "string"},
"tags": {"type": "array", "items": {"type": "string"}}
},
"required": ["content"]
}
)
def add_note(params):
notes = load_notes()
new_note = {
"id": len(notes) + 1,
"content": params["content"],
"tags": params.get("tags", []),
"create_time": datetime.now().isoformat()
}
notes.append(new_note)
save_notes(notes)
return {"status": "success", "note_id": new_note["id"]}
# 启动服务(stdio 模式)
if __name__ == "__main__":
mcp_server.run()
3. 工具描述的最佳实践
工具的描述(description)至关重要——AI 模型会根据描述判断何时调用该工具。好的工具描述应:
-
清晰说明工具的功能
-
说明输入参数的含义
-
说明输出结果的格式
-
说明适用的场景和限制
六、MCP Client 集成与配置
1. 配置文件方式(推荐)
大多数 MCP 客户端支持通过配置文件声明 MCP Server,实现 “配置即集成” 。
mcp.json 配置示例:
stdio 本地进程:
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${env:GITHUB_TOKEN}"
}
}
}
}
stdio 文件系统服务:
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "./data"]
}
}
}
老旧远程 SSE 服务(已废弃,不推荐使用):
{
"mcpServers": {
"remote-knowledge": {
"url": "https://mcp.example.com/sse",
"headers": {
"Authorization": "Bearer ${env:MCP_TOKEN}"
}
}
}
}
配置提示:上述 SSE 配置项为协议旧版本规范,目标地址存在网页解析失败问题,现已全面废弃。远程服务请替换为 Streamable HTTP 端点(如 https://mcp.example.com/mcp)。
2. 代码方式集成
以 Python 为例,构建一个连接 MCP Server 的客户端:
import asyncio
from contextlib import AsyncExitStack
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
class MCPClient:
def __init__(self):
self.session = None
self.exit_stack = AsyncExitStack()
async def connect_to_server(self, server_script_path: str):
"""连接到 MCP 服务器"""
is_python = server_script_path.endswith('.py')
command = "python" if is_python else "node"
server_params = StdioServerParameters(
command=command,
args=[server_script_path],
env=None
)
stdio_transport = await self.exit_stack.enter_async_context(
stdio_client(server_params)
)
self.stdio, self.write = stdio_transport
self.session = await self.exit_stack.enter_async_context(
ClientSession(self.stdio, self.write)
)
await self.session.initialize()
# 列出可用工具(动态发现)
response = await self.session.list_tools()
tools = response.tools
print("Connected with tools:", [tool.name for tool in tools])
3. 主流平台集成示例
Cursor 编辑器:
-
导航到
文件 > 首选项 > 游标设置 -
从左侧选择 “工具和集成”
-
在 “MCP 工具” 部分选择 “新建 MCP 服务器”
-
编辑
mcp.json文件
Spring AI Alibaba(Java) :
# application.yml
spring:
ai:
mcp:
client:
enabled: true
name: my-agent-mcp
type: SYNC
request-timeout: 30s
toolcallback:
enabled: true
stdio:
servers-configuration: classpath:mcp-servers.json
AgentScope 2.0(Java) :在 workspace/tools.json 中声明 MCP Server,Agent 启动时自动发现并注册工具。
七、安全最佳实践
随着 MCP 生态的快速发展,安全问题日益重要。以下是关键的安全实践:
1. 认证与授权
截至 2026 年初,生态中仅有 8.5% 的 MCP Server 使用 OAuth,91.5% 依赖静态 API Key、共享 Token 或根本没有认证。
建议:
-
对暴露敏感数据或业务逻辑的 MCP Server 实施 OAuth 认证
-
使用 JWT 令牌、RBAC 权限模型等企业级安全方案
2. 隔离运行
最重要的一条建议:将每个 MCP Server 放在独立的隔离容器中运行,并赋予最小权限。
3. 网络暴露控制
-
Streamable HTTP 模式下,验证
Origin头防止 DNS 重绑定攻击 -
本地运行时绑定
127.0.0.1而非0.0.0.0
4. 操作确认
高风险操作(如删除文件)应要求用户手动授权。
八、总结
MCP 通过标准化协议彻底改变了 AI Agent 与外部世界的交互方式:
-
统一接入:一个协议覆盖工具调用、资源读取、提示词模板三大能力
-
动态发现:Client 可实时获取 Server 提供的所有工具列表
-
多 Server 聚合:一个 Agent 可连接多个 MCP Server,组合不同能力
-
配置即集成:通过配置文件声明 MCP Server,无需编写适配代码
MCP 让 AI 从 “只会说” 进化为 “能做事” 。无论你是 AI 应用开发者、工具提供方还是企业架构师,掌握 MCP 都已成为 2026 年 AI 技术栈的必修课。
更多推荐


所有评论(0)