开发者 Model Context Protocol (MCP) 指南


人工智能(AI)开发的格局正在从独立的对话式模型迅速演变为能够与世界互动的复杂代理系统。这一演变过程中的一个关键瓶颈是,AI 缺乏一种标准化的方法来访问外部数据、工具和服务。Model Context Protocol (MCP) 是一个旨在解决这一问题的开源标准,它提供了一种通用语言,用于将大型语言模型(LLM)连接到它们执行复杂、多步骤任务所需的上下文。

对于开发者而言,MCP 代表了一次范式转变。它超越了定制的、一次性的集成,转向了一种可重用、可扩展且安全的架构,用于构建强大的 AI 应用程序。本指南对 MCP 进行了全面的技术深度剖析,涵盖其核心架构、高级概念、安全考量、性能优化及其在更广泛的 AI 生态系统中的地位。

一张展示 Model Context Protocol 架构的图表,其中包含一个主机、客户端和服务器在进行通信。

什么是 MCP?“AI 的 USB-C”

Model Context Protocol 的核心是一个开放标准,它定义了 AI 应用程序如何安全可靠地与外部系统通信。它由 Anthropic 推出,旨在解决 AI 工具领域的碎片化问题。在 MCP 出现之前,将 LLM 连接到像 GitHub 仓库或项目管理工具这样的新数据源,需要为每个特定应用程序编写自定义的连接器代码。这种方法效率低下、不安全且无法扩展。

MCP 的灵感来源于 Language Server Protocol (LSP) 在 IDE 领域的成功,它创建了一个统一的接口。开发者可以为一个服务(例如 Jira)构建一个单一的“MCP 服务器”,任何与 MCP 兼容的“主机”(如 AI 驱动的 IDE 或聊天应用)都可以立即使用它。这种“一次构建,处处使用”的理念,正是它常被称为“AI 的 USB-C”的原因。

核心架构:主机、客户端和服务器

理解 MCP 首先要从其三个主要组件入手。该协议在 JSON-RPC 2.0 之上定义了一个标准的、基于消息的通信层,确保交互是结构化且明确的。

  • MCP 主机 (Host): 这是最终用户与之交互的主要 AI 应用程序。例如 Visual Studio Code、Claude 桌面版或自定义构建的 AI 代理。主机的角色是管理用户界面、运行 LLM,并为 MCP 客户端提供运行的沙盒环境。
  • MCP 客户端 (Client): 客户端作为连接器或中介,存在于主机内部。它负责发现、连接并与一个或多个 MCP 服务器通信。客户端处理能力协商,并在主机和服务器之间路由请求和响应。
  • MCP 服务器 (Server): 这是协议的主力。MCP 服务器是一个独立的进程或服务,向 MCP 主机公开外部数据和功能。例如,你可以有一个用于创建问题的 GitHub MCP 服务器,一个提供资源(文件)的 Google Drive 服务器,或者一个连接到公司内部数据库的自定义服务器。

这种架构创建了清晰的系统边界。主机从不直接与服务器通信;所有交互都由客户端代理,客户端可以充当安全和同意的守门人。

深入探讨:MCP 服务器能力

根据官方 MCP 规范的定义,MCP 服务器可以向客户端提供多种类型的功能。这种模块化设计允许开发者精确地公开他们需要的功能。

1. 工具 (Tools)

工具是 AI 模型可以调用以执行操作的可执行函数。这是创建代理工作流最强大的功能。工具通过名称、人类可读的描述及其输入参数的 JSON 模式来定义。

  • 工作原理: 主机的 LLM 使用工具描述来推断应该调用哪个函数来满足用户的请求。例如,如果用户说:“在我们的跟踪器中为登录失败创建一个错误报告”,LLM 可以从 Jira MCP 服务器中识别出一个 create_issue 工具,提取必要的参数(titledescription),并请求执行它。
  • 安全性: 用户同意是核心原则。主机在执行工具之前必须获得用户的明确批准,特别是对于执行写操作或处理敏感数据的工具。

2. 资源 (Resources)

资源代表可以提供给 LLM 的文件类数据或上下文。这可以是任何东西,从本地磁盘上的文件内容、Google Drive 中的文档、数据库模式,到 API 调用的输出。

  • 工作原理: 资源允许 LLM“看到”它原本无法访问的数据。开发者可以使用 file_system MCP 服务器向模型提供特定源代码文件的内容,并要求它重构代码。资源作为上下文提供,丰富了提示,而无需用户手动复制和粘贴。

3. 提示 (Prompts)

提示是预定义的、可重用的模板,用户通常通过斜杠命令(例如 /generateApiRoute)来调用。它们通过为交互提供一个结构化的起点来简化常见任务。

  • 工作原理: 服务器可以注册一个像 performSecurityReview 这样的提示,它接受一个 filePath 作为参数。当用户调用它时,主机可以使用该模板构建一个详细的请求给 LLM,将用户的输入与预定义的指令结合起来。

4. 高级功能:采样 (Sampling)

采样是一项高级功能,允许 MCP 服务器向客户端请求模型补全。这颠覆了典型的流程,使服务器能够利用主机的 LLM 进行其自身的内部逻辑处理,从而创建强大的、协作式的多代理工作流。例如,服务器可以获取一个大文档,使用采样让 LLM 对其进行总结,然后将简洁的摘要作为最终结果返回。

构建你的第一个 MCP 服务器:一个实践示例

理解 MCP 的最佳方式是构建一个服务器。官方文档为多种语言提供了 SDK,包括 TypeScript、Python 和 C#。让我们使用 Python SDK 来概述构建一个公开工具的简单服务器的过程。

官方快速入门指南详细介绍了如何创建一个天气服务器,这是一个极好的起点。核心步骤如下:

  1. 设置你的环境: 安装必要的 SDK。对于 Python,这通常通过包管理器完成。

    bash
    # 使用官方文档推荐的 uv uv pip install "mcp[cli]"
  2. 初始化服务器: 从 SDK 中实例化服务器类。Python SDK 中的 FastMCP 类使用类型提示和文档字符串来自动生成工具定义。

    python
    from mcp.server.fastmcp import FastMCP # 初始化 FastMCP 服务器 mcp = FastMCP("my_awesome_server")
  3. 定义一个工具: 创建一个函数并用 @mcp.tool() 装饰它。函数的文档字符串至关重要,因为它将成为 LLM 用来理解工具功能的描述。函数签名和类型提示定义了工具的参数。

    python
    @mcp.tool() async def get_github_issue(repo: str, issue_number: int) -> str: """ 从 GitHub 仓库获取特定问题的详细信息。 Args: repo: 仓库名称,格式为 'owner/repo'。 issue_number: 要获取的问题编号。 """ # 调用 GitHub API 的逻辑将放在这里。 # 在这个例子中,我们将返回一个模拟响应。 if repo == "owner/repo" and issue_number == 123: return "问题 123:登录按钮不工作。状态:开放。" return f"在 {repo} 中未找到问题 {issue_number}。"
  4. 运行服务器: 添加启动服务器进程的入口点。MCP 服务器可以通过标准输入/输出(stdio)进行本地执行,或通过 HTTP 进行远程访问。

    python
    if __name__ == "__main__": # 运行服务器,通过标准输入/输出进行通信 mcp.run(transport='stdio')

一旦这个服务器运行起来,你就可以配置像 VS Code 或 Claude 桌面版这样的 MCP 主机来连接它。然后,当你问 AI:“owner/repo 中的问题 123 的状态是什么?”,它就能智能地决定调用你的 get_github_issue 工具。

开发者必须关注的关键安全问题

虽然 MCP 为安全交互提供了一个框架,但实施的责任在于开发者。协议本身并非万能。正如官方安全最佳实践中所详述,开发者必须警惕几个关键风险:

  • 权限过大: 一个常见的陷阱是授予 MCP 服务器对后端服务过于宽泛的访问权限。一个设计用于读取销售数据的服务器不应该拥有对整个企业数据存储的写权限。始终遵守最小权限原则,将权限范围限定为服务器预期功能所需的最低限度。
  • 间接提示注入: 攻击者可能会污染 MCP 服务器稍后检索的数据源(例如,文档或数据库条目)。如果这些数据包含恶意指令,它可能会被传递给 LLM,可能导致其执行非预期的操作。输入清理和输出编码是至关重要的缓解控制措施。
  • 会话劫持: 在有状态的 HTTP 实现中,攻击者可能获取会话 ID 并用它来冒充合法用户。规范要求服务器不得使用会话进行身份验证,并应将会话 ID 绑定到从安全令牌派生的用户特定信息。
  • “困惑的副手”问题 (Confused Deputy Problem): 如果 MCP 服务器充当另一个服务的代理,就可能出现这种典型的漏洞。攻击者可能诱使服务器使用其提升的权限来执行未经授权的操作。适当的验证和用户同意流程至关重要。

MCP 服务器的性能优化

MCP 服务器的性能约束与传统 Web API 不同。它们主要服务于能够生成大量并行请求的 AI 模型。针对这种独特的配置文件进行优化对于构建响应迅速且成本效益高的应用程序至关重要。

  • Token 效率至关重要: 你的服务器返回的每个字符都会消耗 LLM 宝贵的上下文窗口。带有不必要字段、长描述和元数据的冗长 JSON 响应会迅速耗尽上下文,降低模型的推理能力。
    • 最佳实践: 将 JSON 有效负载精简至其基本元素。只返回 AI 当前任务所需的内容。对于大型数据集,考虑返回结构化纯文本而不是 JSON 以消除开销。
  • 最小化工具定义开销: 所有可用工具的定义在会话开始时都会加载到模型的上下文中。带有冗长描述的复杂模式可能会在用户输入提示之前就消耗数千个 Token。
    • 最佳实践: 编写简洁但清晰的工具描述。使用对外部文档的引用,而不是在模式本身中嵌入冗长的解释。
  • 地理位置邻近性很重要: 在 MCP 典型的对话式、多轮交互中,网络延迟会被放大。托管在远离 AI 提供商基础设施的服务器会引入显著的延迟。
    • 最佳实践: 将你的 MCP 服务器托管在地理上靠近你所针对的 AI 模型主要基础设施的数据中心(例如,对于 Anthropic 的 Claude,选择美国的数据中心)。

一张代码编辑器的图片,显示了可用的 MCP 工具列表,说明了它们如何集成到开发者的工作流程中。

与代理客户端集成:Jenova

虽然构建服务器是成功的一半,但开发者和用户需要一个强大的客户端来使用它们。Jenova 是第一个为 MCP 生态系统从头开始构建的 AI 代理。它作为一个代理客户端,使得连接和大规模利用远程 MCP 服务器变得极其容易。

对于构建 MCP 服务器的开发者来说,Jenova 提供了一个完美的测试和部署目标。对于最终用户来说,它释放了协议的全部潜力。Jenova 在几个关键领域表现出色:

  • 无缝服务器集成: 只需将 Jenova 连接到远程 MCP 服务器,其工具即可立即用于复杂的工​​作流程。
  • 多步骤代理工作流: Jenova 理解高层目标,并可以通过链接来自不同 MCP 服务器的工具来规划和执行多步骤任务。例如,它可以使用 GitHub 服务器查找新产品功能,使用报告服务器生成摘要,并使用 Slack 服务器向产品团队发送消息。
  • 可扩展且可靠的工具: Jenova 基于多代理架构构建,旨在支持大量工具而不会降低性能。这使其比那些有严格工具容量限制的客户端(如 Cursor 的 50 个工具上限)具有显著优势,使 Jenova 成为大规模可靠集成工具的最有能力的代理。
  • 多模型智能: Jenova 与模型无关,可与 GPT-4、Claude 3 和 Gemini 等领先的 LLM 配合使用,确保用户始终能为其任务获得最佳结果。
  • 为普通人设计: Jenova 的构建旨在让非技术用户也能享受到 MCP 生态系统的好处,用于发送日历邀请或编辑文档等任务。它还完全支持在移动设备(iOS 和 Android)上使用 MCP。

MCP 在更广泛的生态系统中:与 A2A 和框架的比较

MCP 并非孤立存在。了解它与其他新兴标准和框架的关系非常重要。

  • MCP vs. A2A (Agent-to-Agent Protocol): 这些协议是互补的,而非竞争关系。正如这篇 Logto 博客文章所解释的,MCP 处理“垂直”集成(代理如何连接到工具),而谷歌的 A2A 协议处理“水平”集成(不同代理如何相互通信)。一个系统可能会使用 A2A 让代理委派任务,而这些独立的代理则使用 MCP 来访问完成任务所需的工具。
  • MCP vs. 框架 (LangChain, Semantic Kernel): 像 LangChain 和微软的 Semantic Kernel 这样的框架是用于构建代理逻辑的。它们可以用来创建 MCP 主机或客户端。这些框架可以在其生态系统内将 MCP 服务器作为工具来使用,将框架的编排能力与 MCP 的标准化连接性结合起来。

未来是可组合的

Model Context Protocol 不仅仅是另一个 API 标准;它是下一代 AI 软件的基础层。通过将 AI 模型与其使用的工具解耦,MCP 促进了一个充满活力、可互操作的生态系统,开发者可以在其中构建和共享强大的功能。随着越来越多的主机、像 Jenova 这样的客户端以及服务器采用该协议,一个真正可组合、具有上下文感知能力的 AI 的愿景正日益接近现实。对于开发者来说,现在是时候在这个激动人心的新前沿上开始构建了。


来源

  1. Model Context Protocol 官方网站: https://modelcontextprotocol.io/
  2. MCP 安全最佳实践: https://modelcontextprotocol.io/specification/draft/basic/security_best_practices
  3. Protect AI - MCP Security 101: https://protectai.com/blog/mcp-security-101