Model Context Protocol (MCP) 介绍
当大型语言模型首次出现时,用户必须复制粘贴代码到文本界面中才能与之交互。很快就证明这不足以满足需求,从而出现了用于更好上下文加载的自定义集成方案。然而,这些方案是零散的,并且需要单独开发。Model Context Protocol (MCP) 通过提供一个通用的协议来解决这个问题,该协议可以实现 AI 与本地和远程资源的高效交互。
协议
协议的高级概述:
- Hosts 是 LLM 应用程序(如 Claude Desktop 或 IDE),它们发起连接
- Clients 在 Host 应用程序内部,与 Server 保持 1:1 连接
- Servers 向 Client 提供上下文、工具和提示
Server
如果你已经熟悉tool use,那么你会觉得 MCP 很熟悉。
让我们快速看一下一个示例 Server 实现:Brave Search Server。
在内部,Server 实现定义了它可以访问的工具,并将这些工具的可用性传达给 Client。
server.setRequestHandler(ListToolsRequestSchema, async () => ({
tools: [WEB_SEARCH_TOOL, LOCAL_SEARCH_TOOL],
}));
这里,WEB_SEARCH_TOOL
是一个描述可用工具的对象,例如:
{
name: "brave_web_search",
description:
"Performs a web search using the Brave Search API, ideal for general queries, news, articles, and online content. " +
"Use this for broad information gathering, recent events, or when you need diverse web sources. " +
"Supports pagination, content filtering, and freshness controls. " +
"Maximum 20 results per request, with offset for pagination. ",
inputSchema: {
type: "object",
properties: {
query: {
type: "string",
description: "Search query (max 400 chars, 50 words)"
},
count: {
type: "number",
description: "Number of results (1-20, default 10)",
default: 10
},
offset: {
type: "number",
description: "Pagination offset (max 9, default 0)",
default: 0
},
},
required: ["query"],
},
}
据我所知,这与 Anthropic Claude Tool Use API 或 OpenAI Function Calling 完全相同。
然后它公开了一个请求处理器(request handler)。
server.setRequestHandler(CallToolRequestSchema, async (request) => {
// ...
});
请求处理器将入站请求与一个工具进行匹配,然后调用与该工具关联的任何函数。
case "brave_web_search": {
if (!isBraveWebSearchArgs(args)) {
throw new Error("Invalid arguments for brave_web_search"); // brave_web_search 的参数无效
}
const { query, count = 10 } = args;
const results = await performWebSearch(query, count);
return {
content: [{ type: "text", text: results }],
isError: false,
};
}
每个 MPC Server 都有一个 URI(例如,tool://brave_web_search/brave_web_search
),作为一个单独的进程运行,并通过 JSON-RPC 与 Client 通信。例如,您可以使用以下命令启动 Brave Search Server:
您可以通过注册 Brave 账户 获得免费的 Brave Search API 密钥。
$ export BRAVE_API_KEY=your-api-key
$ npx -y @modelcontextprotocol/server-brave-search
Client
Client 需要知道它可以连接到哪个 Server。
const transport = new StdioClientTransport({ command: "tool://brave_web_search/brave_web_search" });
然后,它需要连接到 Server:
await client.connect(transport);
连接的目的是通过协议协商能力。在连接期间:
- Client 发送包含协议版本和能力的初始化请求
- Server 响应其协议版本和能力
- Client 发送初始化完成通知作为确认
- 正常的 message 交换开始
最后,Client 可以向 Server 发送消息。
const resources = await client.request(
{ method: "brave_web_search" },
BraveWebSearchResultSchema
);
协议定义了 4 种类型的消息:
- Request:期望收到响应的消息
- Notification:不期望收到响应的消息
- Result:对请求的成功响应
- Error:对请求的失败响应
Transport
MCP 支持多种传输机制:
- Stdio transport
- 使用标准输入/输出进行通信
- 适用于本地进程
- HTTP with SSE transport
- 使用 Server-Sent Events 用于 Server 到 Client 的消息
- HTTP POST 用于 Client 到 Server 的消息
所有传输都使用 JSON-RPC 2.0 来交换消息。
Host
Host 是发起与 Server 连接的应用程序(例如 Claude Desktop)。
Host 负责发现 Server 的能力,并规划如何利用它们来解决最终用户的问题。
协议的这部分相当模糊。但是,据我理解,期望 Host 实现自定义路由逻辑。您可以在我之前的文章 Implementing Tool Functionality in Conversational AI 中看到此类实现的示例。
开源组件
框架
这些是使构建 MCP Server 更容易的高级框架。
SDKs
生态系统
- Inspector - 用于测试和调试 MCP Server 的开发者工具。
- Specification - MCP 协议的规范。
Servers
- Filesystem - 具有可配置访问控制的安全文件操作
- GitHub - 仓库管理、文件操作和 GitHub API 集成
- Google Drive - Google Drive 的文件访问和搜索功能
- PostgreSQL - 具有模式检查的只读数据库访问
- Slack - 频道管理和消息传递功能
- Memory - 基于知识图谱的持久内存系统
- Puppeteer - 浏览器自动化和网页抓取
- Brave Search - 使用 Brave Search API 进行网络和本地搜索
- Google Maps - 位置服务、方向和地点详情
- Fetch - 用于高效 LLM 使用的网络内容抓取和转换
社区 Servers
- MCP YouTube – 使用
yt-dlp
从 YouTube 下载字幕。 - mcp-security-scanner – 一个安全漏洞扫描器,使用 MCP 插件构建,用于分析 JavaScript 代码。
- Cloudflare MCP Server – 这是一个用于与 Cloudflare 服务交互的 Model Context Protocol (MCP) Server。它为管理 Cloudflare KV Store、R2 Storage、D1 Database、Workers 和 Analytics 提供了统一的接口。
- mcp-get – 一个用于安装和管理 Model Context Protocol (MCP) Server 的命令行工具。
早期采用和用例
几个组织和工具已经采用了 MCP:
- Sourcegraph Cody: 增强编码任务的上下文检索。
- Zed Editor: 通过 MCP 扩展开发人员的功能。
Sourcegraph Cody
来自 Cody 博客文章:
这是一个 Cody 连接到 Postgres 数据库,在查看数据库模式后编写 Prisma 查询的示例:
Cody 连接到 Postgres 数据库,在查看数据库模式后编写 Prisma 查询
Zed Editor
来自 Zed Editor 博客文章:
这是一个使用 Zed 的 PostgreSQL 扩展程序的示例,它可以立即将我们的整个数据库模式告知模型,因此当我们要求它为我们编写查询时,它确切地知道存在哪些表和列,以及它们的类型是什么。
使用 Postgres Context Server 让 Assistant 编写一个模式感知的查询。
Sourcegraph 的博客文章还有一个 使用 TypeScript 和 MCP 构建 Linear 集成的示例。
使用 Claude Desktop 测试 MCP
Claude Desktop 应用程序 是测试 MCP 最简单的方法。
在文本编辑器中打开您的 Claude Desktop App 配置文件,路径为 ~/Library/Application Support/Claude/claude_desktop_config.json
。
~/Library/Application Support/Claude/claude_desktop_config.json
可能在您的机器上不存在。您需要创建它。
~/Library/Application Support/Claude/config.json
是一个不同的、不相关的文件。请勿编辑它。
添加以下配置:
{
"mcpServers": {
"brave_search": {
"command": "npx",
"args": ["@modelcontextprotocol/server-brave-search"],
"env": {
"BRAVE_API_KEY": "your-api-key"
}
}
}
}
这告诉 Claude Desktop:
- 有一个名为
brave_search
的 MCP Server - 使用
npx @modelcontextprotocol/server-brave-search
启动它
保存文件,并重启 Claude Desktop。
现在,您可以要求 Claude Desktop “在网络上搜索”某些内容。
例如,尝试要求 Claude Desktop “在网络上搜索 glama.ai”。
您最初会被提示允许 Claude Desktop 使用 MCP:
点击 “Allow for This Chat”(允许用于本次聊天)以允许 Claude Desktop 使用 MCP。
之后,您将看到 Claude Desktop 使用 Brave Search MCP Server 在网络上搜索 “glama.ai” 并获取结果。
替代方案
有一些开源项目可以解决与 MCP 相同的问题。
- Web Applets – 一个开放规范和 SDK,用于创建代理可以使用的应用程序。
未来展望?
在 MCP 获得 HTTP 传输支持之前,我不期望它能被广泛采用。
然而,我确实设想未来像 Glama 或 Claude Desktop 这样的通用 LLM Client 将拥有一个 MCP Server 市场,用户可以将这些服务即插即用地集成到他们的工作流程中。
局限性
如今,使用 MCP 的实际应用非常少。但是,这种情况会随着时间而改变。
至于 Claude Desktop,
- 在 Claude Desktop 应用程序中设置 MCP Server 的过程目前是手动的。
- 每次重新打开应用程序时,您都必须授予 Claude Desktop 使用 MCP 的权限。请参阅此解决方法。
- MCP 仅在本地支持(Server 必须在您自己的机器上运行)。
- 大多数说明都是针对 macOS 的。但是,这里有人在 Windows 上成功使用了 MCP。
早期想法
我认为这是 Anthropic 值得欢迎的举措。但是,还需要一段时间才能看看它是否能获得关注。
同时,我更看好 Computer Use 成为 AI 驱动自动化的标准,包括 MCP 试图解决的所有问题。