MCP(Model Context Protocol,模型上下文协议)是由Anthropic推出的开放协议标准,它定义了AI模型与外部工具、数据源之间的标准化通信方式。MCP正在成为连接AI与现实世界的"USB接口",让大语言模型能够安全、高效地访问各类资源和执行操作。
📋 目录
核心要点
- 标准化协议:MCP定义了统一的JSON-RPC 2.0通信标准,让不同AI应用可以复用同一套工具
- 三大原语:Tools(工具)、Resources(资源)、Prompts(提示)构成MCP的核心能力
- 双向通信:支持Client到Server的请求,也支持Server主动推送通知
- 安全隔离:Server运行在独立进程中,通过明确的权限边界保护系统安全
- 生态繁荣:已有数百个MCP Server覆盖数据库、API、文件系统等各类场景
想要快速发现和使用各类MCP Server?访问我们的MCP导航页面:
什么是MCP协议
MCP(Model Context Protocol)是一个开放的通信协议,旨在解决AI模型与外部世界交互的标准化问题。在MCP出现之前,每个AI应用都需要自己实现工具调用逻辑,导致大量重复工作和兼容性问题。
为什么需要MCP?
| 对比维度 | 传统方式 | MCP协议 |
|---|---|---|
| 工具复用 | 每个AI单独实现 | 一次开发,多处使用 |
| 协议标准 | 各自定义 | 统一JSON-RPC 2.0 |
| 安全模型 | 不统一 | 明确的权限边界 |
| 生态建设 | 碎片化 | 统一的Server生态 |
| 开发成本 | 高 | 低 |
MCP的核心价值
- 互操作性:同一个MCP Server可被Claude、Cursor、Windsurf等多个客户端使用
- 安全性:通过进程隔离和权限控制,保护用户数据和系统安全
- 可扩展性:简单的协议设计让开发者可以快速构建新的Server
- 生态效应:共享的Server生态降低了整个行业的开发成本
MCP架构详解
MCP采用客户端-服务器架构,通过标准化的消息格式实现通信。
整体架构图
通信流程
核心组件深度解析
MCP协议定义了三大核心原语(Primitives),它们构成了AI与外部世界交互的基础。
1. Tools(工具)
Tools是MCP最核心的能力,允许AI模型执行具体操作。
interface Tool {
name: string;
description: string;
inputSchema: {
type: "object";
properties: Record<string, JSONSchema>;
required?: string[];
};
}
interface CallToolResult {
content: Array<TextContent | ImageContent | EmbeddedResource>;
isError?: boolean;
}
工具示例:
| 工具类型 | 示例 | 用途 |
|---|---|---|
| 文件操作 | read_file, write_file | 读写本地文件 |
| 数据库 | query, execute | SQL查询和执行 |
| API调用 | http_request | 调用外部API |
| 系统命令 | run_command | 执行shell命令 |
| 搜索 | web_search | 网络搜索 |
2. Resources(资源)
Resources提供了对数据的结构化访问,类似于REST API中的GET端点。
interface Resource {
uri: string;
name: string;
description?: string;
mimeType?: string;
}
interface ReadResourceResult {
contents: Array<TextResourceContents | BlobResourceContents>;
}
资源URI示例:
file:///path/to/document.txt- 本地文件postgres://localhost/mydb/users- 数据库表github://repo/owner/name/issues- GitHub Issues
3. Prompts(提示模板)
Prompts允许Server预定义可复用的提示模板,简化常见操作。
interface Prompt {
name: string;
description?: string;
arguments?: Array<{
name: string;
description?: string;
required?: boolean;
}>;
}
interface GetPromptResult {
description?: string;
messages: Array<PromptMessage>;
}
开发MCP Server实战
下面我们通过一个完整的示例,展示如何使用TypeScript开发MCP Server。
环境准备
# 创建项目
mkdir my-mcp-server && cd my-mcp-server
npm init -y
# 安装依赖
npm install @modelcontextprotocol/sdk zod
npm install -D typescript @types/node
基础Server结构
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
CallToolRequestSchema,
ListToolsRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
const server = new Server(
{
name: "my-mcp-server",
version: "1.0.0",
},
{
capabilities: {
tools: {},
},
}
);
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [
{
name: "get_weather",
description: "获取指定城市的天气信息",
inputSchema: {
type: "object",
properties: {
city: {
type: "string",
description: "城市名称",
},
},
required: ["city"],
},
},
],
};
});
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
if (name === "get_weather") {
const city = args?.city as string;
const weather = await fetchWeather(city);
return {
content: [
{
type: "text",
text: JSON.stringify(weather, null, 2),
},
],
};
}
throw new Error(`Unknown tool: ${name}`);
});
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
}
main().catch(console.error);
Python版本实现
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp.types import Tool, TextContent
server = Server("my-mcp-server")
@server.list_tools()
async def list_tools() -> list[Tool]:
return [
Tool(
name="get_weather",
description="获取指定城市的天气信息",
inputSchema={
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称"
}
},
"required": ["city"]
}
)
]
@server.call_tool()
async def call_tool(name: str, arguments: dict) -> list[TextContent]:
if name == "get_weather":
city = arguments["city"]
weather = await fetch_weather(city)
return [TextContent(type="text", text=str(weather))]
raise ValueError(f"Unknown tool: {name}")
async def main():
async with stdio_server() as (read_stream, write_stream):
await server.run(read_stream, write_stream)
if __name__ == "__main__":
import asyncio
asyncio.run(main())
配置MCP Server
在Claude Desktop中配置Server(claude_desktop_config.json):
{
"mcpServers": {
"my-server": {
"command": "node",
"args": ["/path/to/my-mcp-server/dist/index.js"],
"env": {
"API_KEY": "your-api-key"
}
}
}
}
主流MCP客户端对比
| 客户端 | 类型 | MCP支持 | 特点 |
|---|---|---|---|
| Claude Desktop | 桌面应用 | 原生支持 | Anthropic官方,最完整的MCP支持 |
| Cursor | IDE | 原生支持 | AI编程IDE,深度集成MCP |
| Windsurf | IDE | 原生支持 | Codeium出品,MCP工具丰富 |
| Cline | VS Code插件 | 原生支持 | 开源,支持多种LLM |
| Continue | IDE插件 | 原生支持 | 开源,支持VS Code和JetBrains |
| Zed | 编辑器 | 原生支持 | 高性能编辑器,原生MCP |
Claude Desktop配置示例
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/Users/username/Documents"]
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxxx"
}
}
}
}
Cursor配置示例
在Cursor设置中添加MCP Server:
{
"mcp.servers": {
"database": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres"],
"env": {
"DATABASE_URL": "postgresql://localhost/mydb"
}
}
}
}
MCP生态与资源
MCP生态正在快速发展,已有数百个Server覆盖各类使用场景。
官方Server
| Server | 功能 | 安装命令 |
|---|---|---|
| filesystem | 文件系统操作 | npx @modelcontextprotocol/server-filesystem |
| github | GitHub API | npx @modelcontextprotocol/server-github |
| postgres | PostgreSQL | npx @modelcontextprotocol/server-postgres |
| sqlite | SQLite数据库 | npx @modelcontextprotocol/server-sqlite |
| puppeteer | 浏览器自动化 | npx @modelcontextprotocol/server-puppeteer |
社区热门Server
- Brave Search:网络搜索能力
- Slack:Slack消息和频道管理
- Google Drive:Google云端硬盘操作
- Notion:Notion页面和数据库
- Linear:项目管理和Issue追踪
💡 发现更多MCP Server:访问 QubitTool MCP Server导航 浏览和搜索完整的MCP Server列表,快速找到适合您需求的工具。
最佳实践与安全考虑
开发最佳实践
- 明确的工具描述:为每个工具提供清晰、详细的description,帮助AI正确选择和使用
- 输入验证:使用JSON Schema严格验证输入参数
- 错误处理:返回有意义的错误信息,帮助调试
- 日志记录:记录关键操作,便于问题排查
server.setRequestHandler(CallToolRequestSchema, async (request) => {
try {
const result = await executeTool(request.params);
return { content: [{ type: "text", text: JSON.stringify(result) }] };
} catch (error) {
console.error(`Tool execution failed: ${error}`);
return {
content: [{ type: "text", text: `Error: ${error.message}` }],
isError: true,
};
}
});
安全考虑
| 安全措施 | 说明 |
|---|---|
| 最小权限 | Server只请求必要的权限 |
| 输入过滤 | 验证和清理所有用户输入 |
| 敏感数据 | 不在日志中记录密钥和敏感信息 |
| 进程隔离 | Server运行在独立进程中 |
| 环境变量 | 使用环境变量管理密钥,不硬编码 |
常见问题
MCP和Function Calling有什么区别?
Function Calling是各AI厂商自己实现的工具调用机制,格式和能力各不相同。MCP是一个开放协议标准,定义了统一的通信格式,让同一个Server可以被多个AI客户端使用,实现了真正的互操作性。
如何调试MCP Server?
- 使用MCP Inspector工具:
npx @modelcontextprotocol/inspector - 查看Server的stderr输出
- 在代码中添加详细的日志记录
- 使用Claude Desktop的开发者工具查看通信日志
MCP Server支持哪些传输方式?
- stdio:标准输入输出,最常用,适合本地Server
- SSE(Server-Sent Events):HTTP长连接,适合远程Server
- WebSocket:双向通信,适合需要实时推送的场景
如何发布自己的MCP Server?
- 将代码发布到npm或PyPI
- 提交到MCP官方Server列表
- 在社区分享(GitHub、Discord等)
- 提交到 QubitTool MCP导航 增加曝光
总结
MCP协议正在成为AI应用开发的重要基础设施。通过标准化的通信协议,MCP让AI模型能够安全、高效地与外部世界交互,大大降低了开发成本,促进了生态繁荣。
关键要点回顾
✅ MCP是AI与外部工具交互的标准化协议
✅ 三大原语:Tools、Resources、Prompts
✅ 支持TypeScript和Python SDK开发Server
✅ 主流AI客户端已广泛支持MCP
✅ 开放生态,一次开发多处复用
相关资源
- MCP Server导航 - 发现和搜索各类MCP Server
- AI Agent工具导航 - 探索AI Agent生态
- JSON格式化工具 - 处理MCP消息数据
延伸阅读
- AI Agent开发完全指南 - 深入了解Agent开发
- JWT原理与应用详解 - API认证最佳实践
💡 开始探索:访问 QubitTool MCP Server导航 发现适合您需求的MCP工具,加速AI应用开发!