Linguista

理解MCP:连接AI与工具及其与A2A的协同

注:本文基于与Grok 3的讨论生成,缺乏具体的实践验证。仅供用于概念理解阶段的参考

想象你在一间忙碌的办公室里,忙于编写代码并在GitHub上管理项目。你可以打开浏览器,登录GitHub,手动创建一个问题来跟踪一个错误。或者,你只需对你的编码助手说:“为这个错误创建一个GitHub问题”,就能在不离开编辑器的情况下瞬间完成。这无缝的交互,让AI助手能够调用外部工具完成任务,正是得益于模型上下文协议(Model Context Protocol,简称MCP)。本文将以通俗的语言,探索MCP的理念、原理、实际应用,以及它与Google的代理到代理协议(Agent-to-Agent,简称A2A)的对比与协同,用一个贴近生活的类比让这些概念更加生动。

MCP的理念:AI与工具的桥梁

MCP的核心在于让AI助手通过连接外部世界变得更智能。传统的编码工具,比如早期的Visual Studio Code(VS Code),就像一台基础的饮水机:你能得到热水或冷水,但必须自己动手——按下按钮,拿着杯子接水。当像GitHub Copilot这样的大型语言模型(LLM)出现后,这台饮水机升级成了智能机器。你可以说:“给我一杯咖啡”,它就会从预设的饮品菜单中为你准备,但仅限于机器内置的选项。MCP则更进一步,将助手变成了“饮品机器人”,它可以拨通咖啡研磨机或榨汁机的“电话”,按需制作一杯新鲜的拿铁或果昔。

MCP由Anthropic开发,灵感来源于语言服务器协议(Language Server Protocol,LSP),是一种让AI模型与外部工具和数据源对话的标准化方式。可以把MCP想象成机器人的“智能手机”,让它能联系GitHub服务器创建问题,或联系数据库获取记录。与过去将工具硬编码到AI中的方式不同,MCP通过灵活的协议,将模型连接到任何能“听懂”它的服务,让助手变得更加动态和多功能。

MCP的原理:连接的机制

要理解MCP如何工作,想象我们的饮品机器人在运作。当你说:“给我一杯拿铁”,机器人不会自己研磨咖啡豆,而是拿起它的“智能手机”(MCP),拨通咖啡研磨机(服务器),附上你的要求,比如“用巴西咖啡豆”。研磨机处理任务后,将研磨好的咖啡豆送回,机器人再用它完成你的饮品。这个交互过程通过MCP的规则进行结构化对话。

从技术角度看,MCP基于JSON-RPC 2.0,这是一个轻量级的远程过程调用协议,支持标准输入/输出(stdio)、WebSockets或服务器推送事件(Server-Sent Events,SSE)等传输方式。AI应用,比如VS Code中的Copilot,扮演客户端角色,而外部工具——如GitHub API服务器——则是服务器。这些服务器暴露“工具”(如创建问题的函数)、“资源”(如仓库数据)或“提示”(预定义指令)。当Copilot接收到用户指令,如“列出我的GitHub问题”,它通过MCP向GitHub服务器发送请求,服务器返回数据供Copilot展示。

MCP的魅力在于动态注入上下文的能力。如果你在处理一个项目,MCP可以将你的代码、仓库信息甚至最近的提交记录提供给Copilot,确保AI的响应与你的工作相关。这些上下文就像机器人电话中附带的详细便条,指导服务器的工作。对开发者来说,配置MCP很简单:在VS Code中连接一个服务器(如GitHub的MCP服务器),提供GitHub令牌进行认证,然后通过Copilot的聊天窗口发出指令。

MCP的落地:现实世界的应用

MCP的实际应用正在改变开发者的工作方式。在VS Code中,GitHub Copilot利用MCP与GitHub服务器集成,让你无需离开编辑器就能创建问题、管理拉取请求或获取仓库数据。例如,在Copilot的聊天窗口输入“创建一个标题为‘修复登录错误’的问题”,MCP会调用GitHub服务器,验证你的请求,并在几秒钟内返回新问题的链接。这就像饮品机器人拨通研磨机准备咖啡豆,而你只需专注于享用饮品。

MCP的生态系统远不止GitHub。目前,社区已开发了超过1000个服务器,连接到Slack、Notion或PostgreSQL数据库等工具。开发者还可以使用Python、TypeScript或C#的SDK编写自定义服务器。例如,一个Python脚本可以暴露一个工具,让Copilot查询公司内部API,获取销售数据或记录支持工单。搭建这样的服务器需要定义工具的名称、参数(如用户名)和逻辑(如HTTP请求),然后在本地或云平台(如Vercel)上运行。这种灵活性让MCP成为定制AI助手以适应特定工作流的强大工具。

对于拥有GitHub Copilot订阅的用户,MCP功能已内置,GitHub的服务器无需额外费用即可使用。社区服务器通常免费,但云端托管自定义服务器可能需要付费。MCP的开放性鼓励广泛参与,工具如MCP Inspector帮助调试服务器连接,就像测试机器人的电话线路是否畅通。

图表说明:MCP的工作流程与生态

为了更直观地展示MCP的原理和生态,以下是两个结构框图:

图1:MCP的工作流程

+----------------+        +----------------+        +----------------+
| 用户           |        | AI客户端       |        | MCP服务器      |
| (VS Code用户   | -----> | (Copilot)      | -----> | (GitHub API)   |
| 输入指令       |        | 解析指令       |        | 执行任务       |
| “创建问题”     |        | 发送MCP请求    |        | 返回结果       |
+----------------+        +----------------+        +----------------+

说明:用户在VS Code中输入指令,Copilot通过MCP协议发送请求到GitHub服务器,服务器执行任务并返回结果。

图2:MCP与A2A的生态协同

+----------------+        +----------------+        +----------------+
| AI客户端        | <----> | MCP服务器       |        | 外部工具       |
| (Copilot)      |        | (GitHub, Slack)| -----> | (API, 数据库)  |
+----------------+        +----------------+        +----------------+
         |                                           ^
         v                                           |
+----------------+        +----------------+        +----------------+
| A2A代理         | <----> | A2A代理        | <----> | A2A代理        |
| (咖啡机器人)     |        | (果汁机器人)    |        | (报告机器人)    |
+----------------+        +----------------+        +----------------+

说明:MCP连接AI客户端与外部工具,A2A协调多个代理协作,共同完成复杂任务。

MCP与A2A:两种协议的故事

虽然MCP擅长将AI连接到工具,但Google在2025年4月发布的代理到代理协议(A2A)解决了另一个问题:协调多个AI代理。回到我们的类比,如果MCP是饮品机器人用来联系研磨机的“智能手机”,A2A则是派对策划团队的“对讲机系统”。一群机器人——分别擅长咖啡、果汁或糕点——通过对讲机讨论任务分配,分享进展,确保派对的饮品和点心准时准备好。

MCP是垂直的:AI(如Copilot)像领导,发送指令给工具,工具独立执行并返回结果。当Copilot要求GitHub服务器列出问题时,服务器直接提供数据,无需协商。这使得MCP非常适合需要快速、可靠地访问外部数据或功能的任务,比如获取代码片段或更新数据库。

相比之下,A2A是水平的。它让拥有不同技能的AI代理像团队成员一样协作。在旅行规划场景中,一个代理搜索航班,另一个预订酒店,第三个检查天气预报。通过A2A的“代理卡”(描述代理能力的JSON),它们发现彼此,通过JSON-RPC或HTTP交换任务细节,并动态调整计划——比如因天气恶劣重新安排航班。A2A的强项在于管理复杂的、多步骤工作流,代理需要协商和适应。

尽管有差异,MCP和A2A是互补的。想象派对场景:饮品机器人用MCP联系研磨机获取咖啡豆(获取GitHub数据),同时用A2A与其他机器人协商饮品搭配(生成项目报告)。在实际应用中,Copilot可能用MCP检索仓库问题,用A2A与报告代理共享数据,由另一个代理协助生成总结。这种协同让AI系统既能集成工具,又能协作完成复杂任务,构建智能自动化的强大生态。

图表说明:MCP与A2A的对比

图3:MCP与A2A的通信模式

MCP (垂直)                     A2A (水平)
+----------------+             +----------------+
| AI客户端        |             | A2A代理        |
| (Copilot)      | ---->       | (咖啡机器人)    |
|                |      |      |               |
|                | <----       |               |
| MCP服务器       |             | A2A代理        |
| (GitHub API)   |             | (果汁机器人)    |
+----------------+             +----------------+

说明:MCP是客户端到服务器的单向指令,A2A是代理间的双向协商。

关键代码:MCP的技术落地

以下是两个代码示例,展示如何配置和撰写MCP服务器,落地文中提到的功能。

示例1:配置MCP服务器(VS Code)

在VS Code的settings.json中连接GitHub MCP服务器:

{
  "github.copilot.mcpServers": [
    {
      "name": "GitHubMCP",
      "type": "stdio",
      "command": "node",
      "args": ["/path/to/mcp-server-github/index.js"],
      "url": "http://localhost:8080"
    }
  ]
}

说明:此配置让Copilot通过MCP调用GitHub服务器,执行任务如创建问题。

示例2:撰写自定义MCP服务器(Python)

创建一个查询GitHub用户信息的MCP服务器:

import os
from mcp import Server, Tool, run_server
from dotenv import load_dotenv
import requests

load_dotenv()
GITHUB_TOKEN = os.getenv("GITHUB_TOKEN")

class GitHubUserTool(Tool):
    name = "get_github_user"
    description = "Retrieve information about a GitHub user by username."
    parameters = {
        "username": {"type": "string", "description": "GitHub username"}
    }

    def call(self, parameters):
        username = parameters.get("username")
        if not username:
            return {"error": "Username is required"}
        
        headers = {"Authorization": f"Bearer {GITHUB_TOKEN}"}
        response = requests.get(f"https://api.github.com/users/{username}", headers=headers)
        
        if response.status_code == 200:
            return response.json()
        return {"error": f"Failed to fetch user: {response.status_code}"}

server = Server()
server.register_tool(GitHubUserTool())

if __name__ == "__main__":
    run_server(server, transport="stdio")

说明:此服务器暴露一个工具,Copilot可通过MCP调用它查询GitHub用户信息。

展望未来:MCP与A2A的前景

MCP和A2A代表了AI系统向模块化、互联化方向的转变。MCP通过连接模型与工具,让Copilot这样的助手成为开发者不可或缺的伙伴,简化了曾经繁琐的任务。A2A专注于代理协作,为项目管理、自动化客服等复杂工作流开启了新的可能。两者结合,让AI不仅是一个工具,更是工具和团队的协调者。

对开发者来说,MCP的入门很简单:配置VS Code中的服务器,或编写自定义服务器连接常用工具。A2A虽处于早期,但通过开源SDK为构建协作代理提供了支持,Google及Salesforce等合作伙伴正在推动其发展。对于Copilot用户,这两个协议无需额外订阅即可使用,尽管高级用例可能需要云托管或API密钥。

我们的饮品机器人,从一台简单的饮水机,进化成了协调研磨机、榨汁机和其他机器人的智能助手,端出从拿铁到派对计划的一切。MCP和A2A是它的智能手机和对讲机,证明了AI的未来在于连接——不仅连接数据,还连接彼此。