MCP:让AI连接万物的“万能插头“
一、基础概念
二、核心功能
三、实战教程
四、进阶指南
五、总结
什么是MCP?
MCP(Model Context Protocol)是Anthropic在2024年推出的模型上下文协议。它是一个开放标准,让AI模型能够安全、标准化地连接外部数据源和工具。
简单理解:MCP是AI世界的USB-C接口——一个协议,连接万物。
为什么需要MCP?
痛点:AI的"信息孤岛"
大模型很强大,但有两个致命弱点:
-
知识有截止日期 - 不知道今天发生了什么
-
无法执行操作 - 只能说,不能做
想让AI查实时天气?读你的文件?操作数据库?以前每接一个功能,都要写一堆定制代码。
解决:标准化连接
MCP的出现,让这件事变得简单:
以前:AI → 定制代码A → 工具A AI → 定制代码B → 工具B AI → 定制代码C → 工具C (每个都要单独开发) 现在:AI → MCP协议 → 任意MCP服务器 (一次开发,到处可用)
核心架构
MCP采用客户端-服务器架构:
┌─────────────────────────────────────────────────────────┐ │ AI应用(宿主) │ │ ┌─────────────────────────────────────────────────┐ │ │ │ MCP客户端 │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ │ │ 客户端A │ │ 客户端B │ │ 客户端C │ ... │ │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ │ │ │ └────────┼───────────┼───────────┼───────────────┘ │ └───────────┼───────────┼───────────┼─────────────────────┘ │ │ │ ▼ ▼ ▼ ┌──────────┐ ┌──────────┐ ┌──────────┐ │MCP服务器A│ │MCP服务器B│ │MCP服务器C│ │ (数据库) │ │ (文件系统)│ │ (API服务)│ └──────────┘ └──────────┘ └──────────┘
三个核心角色
| 角色 | 职责 | 举例 |
|---|---|---|
| 宿主(Host) | 运行AI的应用 | Claude Desktop、Cursor、你的AI应用 |
| 客户端(Client) | 处理协议通信 | 内嵌在宿主中,管理与服务器的连接 |
| 服务器(Server) | 提供具体能力 | 天气服务、数据库服务、文件服务 |
三大核心功能
1. 工具(Tools)—— 让AI"能做"
工具让AI可以执行操作,比如:
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("my-tools")
@mcp.tool()
async def send_email(to: str, subject: str, body: str) -> str:
"""发送邮件"""
# 实际发送逻辑...
return f"邮件已发送至 {to}"
@mcp.tool()
async def query_database(sql: str) -> list:
"""执行SQL查询"""
# 实际查询逻辑...
return [{"name": "张三", "age": 28}]
典型场景:
-
发送消息/邮件
-
操作数据库
-
调用第三方API
-
文件增删改
2. 资源(Resources)—— 让AI"能看"
资源让AI可以读取数据,比如:
@mcp.resource("file:///{path}")
async def read_file(path: str) -> str:
"""读取文件内容"""
with open(path, 'r') as f:
return f.read()
@mcp.resource("db://users/{user_id}")
async def get_user(user_id: str) -> dict:
"""获取用户信息"""
return {"id": user_id, "name": "张三"}
典型场景:
-
读取本地文件
-
查询数据库记录
-
获取API数据
-
访问云存储
3. 提示(Prompts)—— 让AI"更专业"
提示模板让AI在特定场景下表现更好:
@mcp.prompt()
async def code_review(code: str, language: str) -> str:
"""代码审查提示"""
return f"""请审查以下{language}代码,关注:
1. 安全漏洞
2. 性能问题
3. 代码规范
代码:
```{language}
{code}
```"""
@mcp.prompt()
async def translate(text: str, target_lang: str) -> str:
"""翻译提示"""
return f"将以下文本翻译成{target_lang},保持原意和语气:\n\n{text}"
典型场景:
-
代码审查模板
-
翻译优化模板
-
数据分析模板
-
内容创作模板
实战:5分钟搭建MCP服务器
根据你的技术栈选择对应语言:
Python版本(推荐使用FastMCP)
第一步:安装依赖
pip install mcp
第二步:编写服务器
# weather_server.py
from mcp.server.fastmcp import FastMCP
# 创建FastMCP服务器实例
mcp = FastMCP("weather-server")
@mcp.tool()
async def get_weather(city: str) -> str:
"""获取指定城市的天气信息"""
# 这里用模拟数据,实际可调用天气API
weather_data = {
"北京": "晴,25°C,湿度40%",
"上海": "多云,22°C,湿度65%",
"广州": "阵雨,28°C,湿度80%",
}
return weather_data.get(city, f"暂无{city}的天气数据")
@mcp.tool()
async def get_weather_forecast(city: str, days: int = 3) -> str:
"""获取未来几天的天气预报"""
return f"{city}未来{days}天天气预报:晴转多云,气温20-28°C"
if __name__ == "__main__":
mcp.run()
第三步:配置客户端
在Claude Desktop的配置文件中添加:
{
"mcpServers": {
"weather": {
"command": "python",
"args": ["weather_server.py"]
}
}
}
TypeScript + Node.js版本
第一步:初始化项目
# 创建项目文件夹 mkdir weather-mcp && cd weather-mcp # 初始化项目 npm init -y # 安装MCP SDK npm install @modelcontextprotocol/sdk
第二步:编写服务器
// weather_server.js
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { ListToolsRequestSchema, CallToolRequestSchema } from "@modelcontextprotocol/sdk/types.js";
const server = new Server({
name: "weather-server",
version: "1.0.0"
}, {
capabilities: { tools: {} }
});
// 定义可用工具
server.setRequestHandler(ListToolsRequestSchema, async () => ({
tools: [
{
name: "get_weather",
description: "获取指定城市的天气信息",
inputSchema: {
type: "object",
properties: {
city: { type: "string", description: "城市名称" }
},
required: ["city"]
}
}
]
}));
// 处理工具调用
server.setRequestHandler(CallToolRequestSchema, async (request) => {
if (request.params.name === "get_weather") {
const city = request.params.arguments.city;
const weatherData = {
"北京": "晴,25°C,湿度40%",
"上海": "多云,22°C,湿度65%",
"广州": "阵雨,28°C,湿度80%"
};
return {
content: [{
type: "text",
text: weatherData[city] || `暂无${city}的天气数据`
}]
};
}
});
// 启动服务器
const transport = new StdioServerTransport();
await server.connect(transport);
第三步:配置package.json
确保你的 package.json 包含:
{
"name": "weather-mcp",
"version": "1.0.0",
"type": "module",
"main": "weather_server.js"
}
第四步:配置客户端
在Claude Desktop的配置文件中添加:
{
"mcpServers": {
"weather": {
"command": "node",
"args": ["weather_server.js"]
}
}
}
测试使用
重启Claude Desktop,然后问:
"北京今天天气怎么样?"
AI会自动调用你的天气服务器,返回实时数据。
传输方式
MCP支持多种通信方式:
| 传输方式 | 特点 | 适用场景 |
|---|---|---|
| stdio | 标准输入输出,简单直接 | 本地工具、CLI集成 |
| SSE | Server-Sent Events,HTTP长连接 | Web应用、远程服务 |
| Streamable HTTP | 新一代HTTP传输,更灵活 | 生产环境、高并发 |
安全最佳实践
MCP设计时就把安全放在首位:
1. 最小权限原则
# 只暴露必要的工具
@mcp.tool()
def read_file(path: str) -> str:
"""只读权限,不能写入"""
# 检查路径是否在允许范围内
if not is_allowed_path(path):
raise PermissionError("无权访问该路径")
...
2. 用户确认机制
-
敏感操作(删除、发送)需要用户确认
-
可配置自动批准的工具列表
-
所有操作可审计追溯
3. 输入验证
@mcp.tool()
def query_database(sql: str) -> list:
"""执行查询,但禁止危险操作"""
# 禁止删除、更新等操作
if any(keyword in sql.upper() for keyword in ["DROP", "DELETE", "UPDATE"]):
raise ValueError("只允许SELECT查询")
...
生态系统
MCP正在快速发展,已有的服务器包括:
官方示例:
-
文件系统访问
-
PostgreSQL/SQLite数据库
-
Git操作
-
Google Maps
-
Brave搜索
社区贡献:
-
Slack/Discord集成
-
GitHub操作
-
云服务(AWS/GCP/Azure)
-
各类SaaS工具
常见问题
MCP vs OpenAI Function Calling 详细对比
| 对比维度 | MCP | OpenAI Function Calling |
|---|---|---|
| 协议标准 | 开放标准,Anthropic主导 | OpenAI私有协议 |
| 跨平台 | ✅ 支持所有AI模型 | ❌ 仅限OpenAI模型 |
| 功能范围 | 工具 + 资源 + 提示 | 仅工具调用 |
| 状态管理 | 支持有状态会话 | 无状态,每次调用独立 |
| 传输方式 | stdio / SSE / HTTP | HTTP API调用 |
| 生态建设 | 统一生态,一次开发多处可用 | 碎片化,各平台各搞各的 |
| 学习成本 | 需学习协议规范 | 简单,定义JSON Schema即可 |
| 适用场景 | 复杂工具链、跨AI平台 | 简单单次工具调用 |
选择建议:
-
用Claude → 优先MCP
-
只用OpenAI → Function Calling够用
-
需要跨平台 → 必须MCP
什么时候不用MCP?
MCP很强大,但不是所有场景都需要:
| 场景 | 是否需要MCP | 替代方案 |
|---|---|---|
| 简单API调用 | ❌ 不需要 | 直接用Function Calling |
| 单模型单工具 | ❌ 不需要 | 内置工具调用 |
| 纯文本生成 | ❌ 不需要 | 纯Prompt工程 |
| 实时流式处理 | ⚠️ 谨慎 | WebSocket更合适 |
| 高性能计算 | ❌ 不需要 | 专用微服务 |
| 多工具协作 | ✅ 推荐MCP | - |
| 跨AI平台 | ✅ 推荐MCP | - |
| 复杂工作流 | ✅ 推荐MCP | - |
简单判断标准:
-
只调用1-2个简单工具 → 不用MCP
-
需要多个工具协作、跨平台复用 → 用MCP
版本兼容性说明
MCP协议版本
| 版本 | 发布时间 | 主要特性 | 状态 |
|---|---|---|---|
| 2024-11-05 | 2024年11月 | 首个正式版,基础功能 | ✅ 稳定 |
| 2025-03-26 | 2025年3月 | OAuth 2.1认证、Streamable HTTP | ✅ 推荐 |
| 2025-06-18 | 2025年6月 | 结构化工具输出、资源链接 | ✅ 最新 |
SDK版本要求
| SDK | 最低版本 | 推荐版本 | 备注 |
|---|---|---|---|
| Python | >=1.0.0 | 最新 | 支持async/await |
| TypeScript | >=1.0.0 | 最新 | 需要Node.js 18+ |
| Java(社区) | >=0.2.0 | 最新 | 非官方维护 |
客户端兼容性
| 客户端 | MCP版本支持 | 备注 |
|---|---|---|
| Claude Desktop | 2024-11-05+ | 原生支持 |
| Cursor | 2024-11-05+ | 内置支持 |
| Windsurf | 2024-11-05+ | 内置支持 |
| 自建应用 | 取决于SDK版本 | 使用对应语言SDK |
常见兼容性问题
-
SDK版本过低
错误:Method not found 解决:升级SDK到最新版本
-
Node.js版本过低
错误:SyntaxError: Unexpected token 解决:升级Node.js到18+
-
Python版本过低
错误:ModuleNotFoundError 解决:使用Python 3.10+
💡 建议: 始终使用最新稳定版SDK,避免版本兼容问题。
支持哪些编程语言?
| 语言 | SDK来源 | 安装命令 | 适合人群 |
|---|---|---|---|
| Python | 官方 | pip install mcp |
Python开发者、数据科学 |
| TypeScript/Node.js | 官方 | npm install @modelcontextprotocol/sdk |
前端/全栈开发者 |
| Java | 社区 | Maven/Gradle引入 | Java后端开发者 |
| Go | 社区 | go get |
Go开发者 |
| Rust | 社区 | Cargo引入 | 系统级开发 |
💡 选择建议: 用你最熟悉的语言就行,功能都一样。
总结
MCP解决了AI连接外部世界的关键问题:
✅ 标准化 - 一套协议,连接所有工具 ✅ 可组合 - 像乐高一样拼装能力 ✅ 安全可控 - 权限明确,操作可审计 ✅ 生态共建 - 开发一次,所有AI可用
一句话:MCP让AI从"聊天机器人"进化成"智能助手"。
相关资源
更多推荐
所有评论(0)