从入门到精通构建 AI 与外部世界的桥梁目录什么是 MCPMCP 核心架构核心概念详解构建第一个 MCP 服务器构建 MCP 客户端MCP 与其他协议对比高级主题与最佳实践实战构建智能代码助手未来展望1. 什么是 MCPModel Context ProtocolMCP是由 Anthropic 提出的一种开放协议旨在标准化 AI 模型与外部工具、数据源之间的通信方式。MCP 的核心理念类似于 USB-C 接口——提供统一的、标准化的连接方式让任何 AI 应用都能以一致的方式接入各种外部能力。在 MCP 出现之前每个 AI 应用都需要为不同的工具、API 和数据源编写定制化的集成代码。这导致了大量重复工作且各集成方案之间互不兼容。MCP 通过定义统一的协议规范使得开发者只需实现一次集成即可在任何支持 MCP 的 AI 应用中使用。MCP 的设计目标标准化为 AI 模型与外部系统的交互提供统一协议可扩展支持任意类型的外部工具和数据源安全可控提供细粒度的权限控制和安全机制跨平台不绑定任何特定的 AI 模型或平台生态友好降低第三方集成的门槛促进生态繁荣类比理解如果把 AI 模型比作一台电脑的主机那么 MCP 就是这个主机的 USB-C 接口。无论你想连接打印机、硬盘、显示器还是键盘只需要插入对应的 USB 设备即可——不需要每次都重新设计和制造一个新的接口。2. MCP 核心架构2.1 客户端-服务器模型MCP 采用经典的客户端-服务器Client-Server架构分为三个核心角色MCP 主机Host运行 AI 模型的应用如 Claude Desktop、VS Code 插件、Web 应用等MCP 客户端Client在 Host 内部运行负责与 Server 建立一对一连接MCP 服务器Server提供具体能力的外部程序如数据库查询、文件操作、API 调用等2.2 通信协议MCP 支持两种传输层协议stdio标准输入输出适合本地进程通信简单高效HTTP SSEServer-Sent Events适合远程服务通信支持流式响应消息格式采用 JSON-RPC 2.0 规范所有请求和响应都遵循统一的消息结构。一条典型的 MCP 请求如下{ jsonrpc: 2.0, id: 1, method: tools/call, params: { name: read_file, arguments: { path: /home/user/readme.md } } }2.3 生命周期MCP 连接的生命周期分为三个阶段初始化Initialization客户端与服务器交换能力信息capability negotiation运行Operation正常进行请求/响应和通知消息传递关闭Shutdown优雅地终止连接释放资源3. 核心概念详解3.1 Resources资源Resources 是 MCP 中用于数据读写的抽象。它类似于 REST API 中的资源概念但更加灵活。资源可以是文件内容、数据库记录、API 响应等任何数据。资源支持 URI 寻址客户端可以通过resource://前缀的 URI 来访问资源。同时支持订阅机制当资源发生变化时服务器可以主动推送更新给客户端。// 服务端注册资源 server.setRequestHandler(ListResourcesRequestSchema, async () ({ resources: [{ uri: file:///project/readme.md, name: 项目说明, mimeType: text/markdown, }] }));3.2 Tools工具Tools 是 MCP 中最核心的概念代表 AI 模型可以调用的外部能力。与 Resources 不同Tools 是主动执行操作的而非被动提供数据。每个 Tool 包含三个要素名称name唯一标识符如read_file、search_code描述description自然语言描述帮助 AI 理解何时使用该工具输入模式inputSchemaJSON Schema 定义的参数结构3.3 Prompts提示模板Prompts 是预定义的提示词模板可以包含参数和资源引用。它们帮助 AI 应用提供一致的交互体验并且可以动态组合不同的上下文信息。3.4 Sampling采样Sampling 允许 MCP 服务器主动请求 AI 模型生成内容。这在需要多轮交互或服务器端需要 AI 辅助决策时非常有用。这是一个高级特性需要在初始化时声明支持。4. 构建第一个 MCP 服务器4.1 环境准备mkdir my-mcp-server cd my-mcp-server npm init -y npm install modelcontextprotocol/sdk4.2 实现文件管理服务器以下是一个完整的 MCP 文件管理服务器示例提供读取文件和列出目录两个工具import { Server } from modelcontextprotocol/sdk/server/index.js; import { StdioServerTransport } from modelcontextprotocol/sdk/server/stdio.js; import { ListToolsRequestSchema, CallToolRequestSchema, } from modelcontextprotocol/sdk/types.js; import fs from fs/promises; import path from path; const server new Server( { name: file-manager, version: 1.0.0 }, { capabilities: { tools: {} } } ); // 注册工具列表 server.setRequestHandler(ListToolsRequestSchema, async () ({ tools: [ { name: read_file, description: 读取指定路径的文件内容, inputSchema: { type: object, properties: { path: { type: string, description: 文件路径 } }, required: [path] } }, { name: list_directory, description: 列出目录中的文件和子目录, inputSchema: { type: object, properties: { path: { type: string, description: 目录路径 } }, required: [path] } } ] })); // 处理工具调用 server.setRequestHandler(CallToolRequestSchema, async (request) { const { name, arguments: args } request.params; switch (name) { case read_file: { const content await fs.readFile(args.path, utf-8); return { content: [{ type: text, text: content }] }; } case list_directory: { const files await fs.readdir(args.path); return { content: [{ type: text, text: files.join(\n) }] }; } default: throw new Error(Unknown tool: ${name}); } }); // 启动服务器 const transport new StdioServerTransport(); await server.connect(transport);4.3 配置 Claude Desktop在claude_desktop_config.json中添加以下配置即可在 Claude Desktop 中使用上面创建的 MCP 服务器{ mcpServers: { file-manager: { command: node, args: [/path/to/my-mcp-server/index.js] } } }5. 构建 MCP 客户端MCP 客户端负责与服务器建立连接并管理通信。以下是一个使用 TypeScript 实现的客户端示例import { Client } from modelcontextprotocol/sdk/client/index.js; import { StdioClientTransport } from modelcontextprotocol/sdk/client/stdio.js; async function main() { const transport new StdioClientTransport({ command: node, args: [./server.js] }); const client new Client( { name: my-client, version: 1.0.0 }, { capabilities: {} } ); await client.connect(transport); // 获取可用工具列表 const { tools } await client.listTools(); console.log(可用工具:, tools.map(t t.name)); // 调用工具 const result await client.callTool({ name: read_file, arguments: { path: ./package.json } }); console.log(结果:, result.content[0].text); await client.close(); } main().catch(console.error);6. MCP 与其他协议对比6.1 MCP vs Function CallingOpenAI 的 Function Calling 是模型级别的工具调用机制而 MCP 是应用级别的协议。Function Calling 需要在每次请求中携带工具定义而 MCP 将工具注册和调用分离支持更复杂的工具管理和状态维护。6.2 MCP vs LangChain ToolsLangChain Tools 是框架内置的工具抽象绑定于 LangChain 生态。MCP 是语言无关的开放协议任何语言、任何框架都可以实现和消费 MCP 服务。6.3 MCP vs Plugin 系统ChatGPT Plugins 是闭源的专有系统受限于特定平台。MCP 完全开源可以在任何地方部署和使用给予开发者完全的控制权。对比表格特性Function CallingLangChain ToolsMCP开放性仅 OpenAI仅 LangChain完全开源语言支持Python/NodePython/JS任意语言状态管理无状态会话级连接级工具发现请求时携带代码注册动态发现适用场景简单函数调用链式编排企业级集成7. 高级主题与最佳实践7.1 安全性设计最小权限原则每个 MCP 服务器只暴露必要的工具和资源用户授权敏感操作需要用户明确授权输入验证严格校验所有来自 AI 模型的输入参数沙箱隔离MCP 服务器应在受限环境中运行7.2 性能优化批量操作将多个小请求合并为一次批量调用缓存策略对频繁访问的资源启用客户端缓存流式传输使用 SSE 传输大体积数据减少内存占用连接池复用 MCP 连接避免频繁创建/销毁开销7.3 错误处理MCP 定义了标准的错误码体系包括工具未找到、参数错误、权限不足等。服务器应始终返回结构化错误信息方便 AI 模型理解和纠正。7.4 工具设计原则单一职责每个工具只做一件事做好一件事描述清晰工具描述应包含使用场景、前置条件和预期结果参数命名语义化使用描述性的参数名如read_file而非rf返回结构化始终返回 JSON 格式的结构化结果而非纯文本8. 实战构建智能代码助手让我们结合前面的知识构建一个实用的智能代码助手 MCP 服务器它能够读取和分析项目文件执行代码搜索运行 linter 检查生成代码审查报告8.1 项目结构code-assistant-mcp/ src/ index.ts # 入口 tools/ search.ts # 代码搜索工具 lint.ts # Linter 检查工具 review.ts # 代码审查工具 resources/ project.ts # 项目信息资源 package.json8.2 核心实现要点使用modelcontextprotocol/sdk构建服务器利用 ripgrep 实现高性能代码搜索集成 ESLint 进行实时代码质量检查通过git diff分析变更生成审查建议8.3 使用效果配置好后AI 助手就可以直接操作你的代码库读取文件、搜索特定模式、检查代码质量甚至生成重构建议。所有这些操作都在本地执行数据不会离开你的机器。9. 未来展望MCP 作为一项新兴的开放协议正在快速发展中。以下是一些值得关注的方向远程 MCP 注册中心集中发现和管理第三方 MCP 服务器MCP 市场/商店类似 VS Code 扩展市场分享和分发 MCP 服务器可视化编排通过拖拽方式组合多个 MCP 服务构建复杂工作流企业级特性多租户隔离、审计日志、SLA 保障跨模型协作多个 AI 模型通过 MCP 共享工具和上下文结语MCP 正在重新定义 AI 与外部世界的交互方式。它不仅是一个技术协议更是一种开放生态的愿景——让 AI 能够无缝地连接和使用人类已经构建的所有数字工具。作为开发者现在就是学习和参与 MCP 生态的最佳时机。
(干货满满) Model Context Protocol(MCP) 完全指南从入门到精通,构建 AI 与外部世界的桥梁
发布时间:2026/7/2 4:19:20
从入门到精通构建 AI 与外部世界的桥梁目录什么是 MCPMCP 核心架构核心概念详解构建第一个 MCP 服务器构建 MCP 客户端MCP 与其他协议对比高级主题与最佳实践实战构建智能代码助手未来展望1. 什么是 MCPModel Context ProtocolMCP是由 Anthropic 提出的一种开放协议旨在标准化 AI 模型与外部工具、数据源之间的通信方式。MCP 的核心理念类似于 USB-C 接口——提供统一的、标准化的连接方式让任何 AI 应用都能以一致的方式接入各种外部能力。在 MCP 出现之前每个 AI 应用都需要为不同的工具、API 和数据源编写定制化的集成代码。这导致了大量重复工作且各集成方案之间互不兼容。MCP 通过定义统一的协议规范使得开发者只需实现一次集成即可在任何支持 MCP 的 AI 应用中使用。MCP 的设计目标标准化为 AI 模型与外部系统的交互提供统一协议可扩展支持任意类型的外部工具和数据源安全可控提供细粒度的权限控制和安全机制跨平台不绑定任何特定的 AI 模型或平台生态友好降低第三方集成的门槛促进生态繁荣类比理解如果把 AI 模型比作一台电脑的主机那么 MCP 就是这个主机的 USB-C 接口。无论你想连接打印机、硬盘、显示器还是键盘只需要插入对应的 USB 设备即可——不需要每次都重新设计和制造一个新的接口。2. MCP 核心架构2.1 客户端-服务器模型MCP 采用经典的客户端-服务器Client-Server架构分为三个核心角色MCP 主机Host运行 AI 模型的应用如 Claude Desktop、VS Code 插件、Web 应用等MCP 客户端Client在 Host 内部运行负责与 Server 建立一对一连接MCP 服务器Server提供具体能力的外部程序如数据库查询、文件操作、API 调用等2.2 通信协议MCP 支持两种传输层协议stdio标准输入输出适合本地进程通信简单高效HTTP SSEServer-Sent Events适合远程服务通信支持流式响应消息格式采用 JSON-RPC 2.0 规范所有请求和响应都遵循统一的消息结构。一条典型的 MCP 请求如下{ jsonrpc: 2.0, id: 1, method: tools/call, params: { name: read_file, arguments: { path: /home/user/readme.md } } }2.3 生命周期MCP 连接的生命周期分为三个阶段初始化Initialization客户端与服务器交换能力信息capability negotiation运行Operation正常进行请求/响应和通知消息传递关闭Shutdown优雅地终止连接释放资源3. 核心概念详解3.1 Resources资源Resources 是 MCP 中用于数据读写的抽象。它类似于 REST API 中的资源概念但更加灵活。资源可以是文件内容、数据库记录、API 响应等任何数据。资源支持 URI 寻址客户端可以通过resource://前缀的 URI 来访问资源。同时支持订阅机制当资源发生变化时服务器可以主动推送更新给客户端。// 服务端注册资源 server.setRequestHandler(ListResourcesRequestSchema, async () ({ resources: [{ uri: file:///project/readme.md, name: 项目说明, mimeType: text/markdown, }] }));3.2 Tools工具Tools 是 MCP 中最核心的概念代表 AI 模型可以调用的外部能力。与 Resources 不同Tools 是主动执行操作的而非被动提供数据。每个 Tool 包含三个要素名称name唯一标识符如read_file、search_code描述description自然语言描述帮助 AI 理解何时使用该工具输入模式inputSchemaJSON Schema 定义的参数结构3.3 Prompts提示模板Prompts 是预定义的提示词模板可以包含参数和资源引用。它们帮助 AI 应用提供一致的交互体验并且可以动态组合不同的上下文信息。3.4 Sampling采样Sampling 允许 MCP 服务器主动请求 AI 模型生成内容。这在需要多轮交互或服务器端需要 AI 辅助决策时非常有用。这是一个高级特性需要在初始化时声明支持。4. 构建第一个 MCP 服务器4.1 环境准备mkdir my-mcp-server cd my-mcp-server npm init -y npm install modelcontextprotocol/sdk4.2 实现文件管理服务器以下是一个完整的 MCP 文件管理服务器示例提供读取文件和列出目录两个工具import { Server } from modelcontextprotocol/sdk/server/index.js; import { StdioServerTransport } from modelcontextprotocol/sdk/server/stdio.js; import { ListToolsRequestSchema, CallToolRequestSchema, } from modelcontextprotocol/sdk/types.js; import fs from fs/promises; import path from path; const server new Server( { name: file-manager, version: 1.0.0 }, { capabilities: { tools: {} } } ); // 注册工具列表 server.setRequestHandler(ListToolsRequestSchema, async () ({ tools: [ { name: read_file, description: 读取指定路径的文件内容, inputSchema: { type: object, properties: { path: { type: string, description: 文件路径 } }, required: [path] } }, { name: list_directory, description: 列出目录中的文件和子目录, inputSchema: { type: object, properties: { path: { type: string, description: 目录路径 } }, required: [path] } } ] })); // 处理工具调用 server.setRequestHandler(CallToolRequestSchema, async (request) { const { name, arguments: args } request.params; switch (name) { case read_file: { const content await fs.readFile(args.path, utf-8); return { content: [{ type: text, text: content }] }; } case list_directory: { const files await fs.readdir(args.path); return { content: [{ type: text, text: files.join(\n) }] }; } default: throw new Error(Unknown tool: ${name}); } }); // 启动服务器 const transport new StdioServerTransport(); await server.connect(transport);4.3 配置 Claude Desktop在claude_desktop_config.json中添加以下配置即可在 Claude Desktop 中使用上面创建的 MCP 服务器{ mcpServers: { file-manager: { command: node, args: [/path/to/my-mcp-server/index.js] } } }5. 构建 MCP 客户端MCP 客户端负责与服务器建立连接并管理通信。以下是一个使用 TypeScript 实现的客户端示例import { Client } from modelcontextprotocol/sdk/client/index.js; import { StdioClientTransport } from modelcontextprotocol/sdk/client/stdio.js; async function main() { const transport new StdioClientTransport({ command: node, args: [./server.js] }); const client new Client( { name: my-client, version: 1.0.0 }, { capabilities: {} } ); await client.connect(transport); // 获取可用工具列表 const { tools } await client.listTools(); console.log(可用工具:, tools.map(t t.name)); // 调用工具 const result await client.callTool({ name: read_file, arguments: { path: ./package.json } }); console.log(结果:, result.content[0].text); await client.close(); } main().catch(console.error);6. MCP 与其他协议对比6.1 MCP vs Function CallingOpenAI 的 Function Calling 是模型级别的工具调用机制而 MCP 是应用级别的协议。Function Calling 需要在每次请求中携带工具定义而 MCP 将工具注册和调用分离支持更复杂的工具管理和状态维护。6.2 MCP vs LangChain ToolsLangChain Tools 是框架内置的工具抽象绑定于 LangChain 生态。MCP 是语言无关的开放协议任何语言、任何框架都可以实现和消费 MCP 服务。6.3 MCP vs Plugin 系统ChatGPT Plugins 是闭源的专有系统受限于特定平台。MCP 完全开源可以在任何地方部署和使用给予开发者完全的控制权。对比表格特性Function CallingLangChain ToolsMCP开放性仅 OpenAI仅 LangChain完全开源语言支持Python/NodePython/JS任意语言状态管理无状态会话级连接级工具发现请求时携带代码注册动态发现适用场景简单函数调用链式编排企业级集成7. 高级主题与最佳实践7.1 安全性设计最小权限原则每个 MCP 服务器只暴露必要的工具和资源用户授权敏感操作需要用户明确授权输入验证严格校验所有来自 AI 模型的输入参数沙箱隔离MCP 服务器应在受限环境中运行7.2 性能优化批量操作将多个小请求合并为一次批量调用缓存策略对频繁访问的资源启用客户端缓存流式传输使用 SSE 传输大体积数据减少内存占用连接池复用 MCP 连接避免频繁创建/销毁开销7.3 错误处理MCP 定义了标准的错误码体系包括工具未找到、参数错误、权限不足等。服务器应始终返回结构化错误信息方便 AI 模型理解和纠正。7.4 工具设计原则单一职责每个工具只做一件事做好一件事描述清晰工具描述应包含使用场景、前置条件和预期结果参数命名语义化使用描述性的参数名如read_file而非rf返回结构化始终返回 JSON 格式的结构化结果而非纯文本8. 实战构建智能代码助手让我们结合前面的知识构建一个实用的智能代码助手 MCP 服务器它能够读取和分析项目文件执行代码搜索运行 linter 检查生成代码审查报告8.1 项目结构code-assistant-mcp/ src/ index.ts # 入口 tools/ search.ts # 代码搜索工具 lint.ts # Linter 检查工具 review.ts # 代码审查工具 resources/ project.ts # 项目信息资源 package.json8.2 核心实现要点使用modelcontextprotocol/sdk构建服务器利用 ripgrep 实现高性能代码搜索集成 ESLint 进行实时代码质量检查通过git diff分析变更生成审查建议8.3 使用效果配置好后AI 助手就可以直接操作你的代码库读取文件、搜索特定模式、检查代码质量甚至生成重构建议。所有这些操作都在本地执行数据不会离开你的机器。9. 未来展望MCP 作为一项新兴的开放协议正在快速发展中。以下是一些值得关注的方向远程 MCP 注册中心集中发现和管理第三方 MCP 服务器MCP 市场/商店类似 VS Code 扩展市场分享和分发 MCP 服务器可视化编排通过拖拽方式组合多个 MCP 服务构建复杂工作流企业级特性多租户隔离、审计日志、SLA 保障跨模型协作多个 AI 模型通过 MCP 共享工具和上下文结语MCP 正在重新定义 AI 与外部世界的交互方式。它不仅是一个技术协议更是一种开放生态的愿景——让 AI 能够无缝地连接和使用人类已经构建的所有数字工具。作为开发者现在就是学习和参与 MCP 生态的最佳时机。