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 Server导航

什么是MCP协议

MCP(Model Context Protocol)是一个开放的通信协议,旨在解决AI模型与外部世界交互的标准化问题。在MCP出现之前,每个AI应用都需要自己实现工具调用逻辑,导致大量重复工作和兼容性问题。

为什么需要MCP?

graph LR subgraph "MCP之前" A1[Claude] -->|自定义| T1[工具A] A2[GPT] -->|自定义| T2[工具A'] A3[Gemini] -->|自定义| T3[工具A''] end subgraph "MCP之后" B1[Claude] -->|MCP| T4[MCP Server] B2[GPT] -->|MCP| T4 B3[Gemini] -->|MCP| T4 end
对比维度 传统方式 MCP协议
工具复用 每个AI单独实现 一次开发,多处使用
协议标准 各自定义 统一JSON-RPC 2.0
安全模型 不统一 明确的权限边界
生态建设 碎片化 统一的Server生态
开发成本

MCP的核心价值

  1. 互操作性:同一个MCP Server可被Claude、Cursor、Windsurf等多个客户端使用
  2. 安全性:通过进程隔离和权限控制,保护用户数据和系统安全
  3. 可扩展性:简单的协议设计让开发者可以快速构建新的Server
  4. 生态效应:共享的Server生态降低了整个行业的开发成本

MCP架构详解

MCP采用客户端-服务器架构,通过标准化的消息格式实现通信。

整体架构图

graph TB subgraph "MCP Host(宿主应用)" H["Claude Desktop / Cursor / IDE"] C1[MCP Client 1] C2[MCP Client 2] H --> C1 H --> C2 end subgraph "MCP Servers" S1[文件系统 Server] S2[数据库 Server] S3[API Server] end subgraph "外部资源" R1["(本地文件)"] R2["(PostgreSQL)"] R3[GitHub API] end C1 <-->|stdio/SSE| S1 C2 <-->|stdio/SSE| S2 C2 <-->|stdio/SSE| S3 S1 --> R1 S2 --> R2 S3 --> R3

通信流程

sequenceDiagram participant User as 用户 participant Host as MCP Host participant Client as MCP Client participant Server as MCP Server participant Resource as 外部资源 User->>Host: 发送请求 Host->>Client: 解析意图 Client->>Server: initialize Server-->>Client: capabilities Client->>Server: tools/list Server-->>Client: 可用工具列表 Client->>Server: tools/call Server->>Resource: 执行操作 Resource-->>Server: 返回结果 Server-->>Client: 工具执行结果 Client-->>Host: 格式化响应 Host-->>User: 展示结果

核心组件深度解析

MCP协议定义了三大核心原语(Primitives),它们构成了AI与外部世界交互的基础。

1. Tools(工具)

Tools是MCP最核心的能力,允许AI模型执行具体操作。

typescript
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端点。

typescript
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预定义可复用的提示模板,简化常见操作。

typescript
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。

环境准备

bash
# 创建项目
mkdir my-mcp-server && cd my-mcp-server
npm init -y

# 安装依赖
npm install @modelcontextprotocol/sdk zod
npm install -D typescript @types/node

基础Server结构

typescript
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版本实现

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):

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配置示例

json
{
  "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:

json
{
  "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列表,快速找到适合您需求的工具。

最佳实践与安全考虑

开发最佳实践

  1. 明确的工具描述:为每个工具提供清晰、详细的description,帮助AI正确选择和使用
  2. 输入验证:使用JSON Schema严格验证输入参数
  3. 错误处理:返回有意义的错误信息,帮助调试
  4. 日志记录:记录关键操作,便于问题排查
typescript
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?

  1. 使用MCP Inspector工具:npx @modelcontextprotocol/inspector
  2. 查看Server的stderr输出
  3. 在代码中添加详细的日志记录
  4. 使用Claude Desktop的开发者工具查看通信日志

MCP Server支持哪些传输方式?

  • stdio:标准输入输出,最常用,适合本地Server
  • SSE(Server-Sent Events):HTTP长连接,适合远程Server
  • WebSocket:双向通信,适合需要实时推送的场景

如何发布自己的MCP Server?

  1. 将代码发布到npm或PyPI
  2. 提交到MCP官方Server列表
  3. 在社区分享(GitHub、Discord等)
  4. 提交到 QubitTool MCP导航 增加曝光

总结

MCP协议正在成为AI应用开发的重要基础设施。通过标准化的通信协议,MCP让AI模型能够安全、高效地与外部世界交互,大大降低了开发成本,促进了生态繁荣。

关键要点回顾

✅ MCP是AI与外部工具交互的标准化协议
✅ 三大原语:Tools、Resources、Prompts
✅ 支持TypeScript和Python SDK开发Server
✅ 主流AI客户端已广泛支持MCP
✅ 开放生态,一次开发多处复用

相关资源

延伸阅读


💡 开始探索:访问 QubitTool MCP Server导航 发现适合您需求的MCP工具,加速AI应用开发!