作者:Frank Fiegel,发表于2024年11月25日。
标签:anthropic, mpc, typescript
当大型语言模型首次出现时,用户必须将代码复制粘贴到文本界面中与它们交互。这种方式很快被证明不够用,导致开发了定制化集成以获得更好的上下文加载。然而,这些集成是分散的,需要单独开发。模型上下文协议(MCP)通过提供一个通用协议来解决这个问题,使AI能够高效地与本地和远程资源交互。
有关MCP的问题?加入模型上下文协议Discord并在
#general
频道提问。
协议
协议的高级概述:
- 主机是启动连接的LLM应用程序(如Claude Desktop或IDE)
- 客户端在主机应用程序内部与服务器保持1:1连接
- 服务器向客户端提供上下文、工具和提示
服务器
如果你已经熟悉工具使用,那么MCP会让你感到熟悉。
让我们快速看一下其中一个示例服务器实现:Brave搜索服务器。
在内部,服务器实现定义了它可以访问的工具,并将它们的可用性传达给客户端。
javascript
server.setRequestHandler(ListToolsRequestSchema, async () => ({
tools: [WEB_SEARCH_TOOL, LOCAL_SEARCH_TOOL],
}));
这里,WEB_SEARCH_TOOL
是描述可用工具的对象,例如:
css
{
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工具使用API或OpenAI函数调用完全相同。
然后它暴露一个请求处理器。
dart
server.setRequestHandler(CallToolRequestSchema, async (request) => {
// ...
});
请求处理器将传入请求与工具匹配,然后调用与该工具相关联的函数。
vbnet
case "brave_web_search": {
if (!isBraveWebSearchArgs(args)) {
throw new Error("Invalid arguments for brave_web_search");
}
const { query, count = 10 } = args;
const results = await performWebSearch(query, count);
return {
content: [{ type: "text", text: results }],
isError: false,
};
}
每个MPC服务器都有一个URI(例如,tool://brave_web_search/brave_web_search
),作为单独的进程运行,并通过JSON-RPC与客户端通信。例如,你可以通过以下命令启动Brave搜索服务器:
你可以通过注册Brave账号获取免费的Brave搜索API密钥。
shell
$ export BRAVE_API_KEY=your-api-key
$ npx -y @modelcontextprotocol/server-brave-search
客户端
客户端需要知道它可以连接到哪个服务器。
arduino
const transport = new StdioClientTransport({
command: "tool://brave_web_search/brave_web_search"
});
然后,它需要连接到服务器:
csharp
await client.connect(transport);
连接的目的是通过协议协商功能。在连接期间:
- 客户端发送带有协议版本和功能的初始化请求
- 服务器响应其协议版本和功能
- 客户端发送初始化通知作为确认
- 开始正常的消息交换
最后,客户端可以向服务器发送消息。
csharp
const resources = await client.request(
{ method: "brave_web_search" },
BraveWebSearchResultSchema
);
协议定义了4种消息类型:
- 请求:期望响应的消息
- 通知:不期望响应的消息
- 结果:对请求的成功响应
- 错误:对请求的失败响应
传输
MCP支持多种传输机制:
-
标准输入输出传输
- 使用标准输入/输出进行通信
- 适合本地进程
-
带SSE的HTTP传输
- 使用服务器发送事件进行服务器到客户端的消息
- 使用HTTP POST进行客户端到服务器的消息
所有传输都使用JSON-RPC 2.0交换消息。
主机
主机是启动与服务器连接的应用程序(例如Claude Desktop)。
主机负责发现服务器的功能,并计划如何利用它们来解决最终用户问题。
协议的这部分相当模糊。然而,据我理解,预期是主机实现自定义路由逻辑。你可以在我早期的文章在对话式AI中实现工具功能中看到此类实现的示例。
开源组件
框架
这些是高级框架,使构建MCP服务器变得更容易。
SDK
生态系统
- Inspector - 用于测试和调试MCP服务器的开发工具。
- Specification - MCP协议规范。
服务器
- Filesystem - 具有可配置访问控制的安全文件操作
- GitHub - 存储库管理、文件操作和GitHub API集成
- Google Drive - Google Drive的文件访问和搜索功能
- PostgreSQL - 具有模式检查的只读数据库访问
- Slack - 频道管理和消息功能
- Memory - 基于知识图谱的持久记忆系统
- Puppeteer - 浏览器自动化和网页抓取
- Brave Search - 使用Brave的搜索API进行网络和本地搜索
- Google Maps - 位置服务、方向和地点详情
- Fetch - 网络内容获取和转换,以高效使用LLM
社区服务器
- MCP YouTube -- 使用
yt-dlp
从YouTube下载字幕。 - mcp-security-scanner -- 一个用MCP插件构建的安全漏洞扫描器,用于分析JavaScript代码。
- Cloudflare MCP Server -- 这是一个用于与Cloudflare服务交互的模型上下文协议(MCP)服务器。它为管理Cloudflare KV Store、R2 Storage、D1 Database、Workers和Analytics提供了统一的接口。
- mcp-get -- 一个用于安装和管理模型上下文协议(MCP)服务器的命令行工具。
我们现在有一个基于网络的MCP服务器目录:glama.ai/mcp/servers。
未来的更新将发布到github.com/punkpeye/aw...
早期采用和使用案例
几个组织和工具已经采用了MCP:
- Sourcegraph Cody:增强代码任务的上下文检索。
- Zed Editor:通过MCP扩展开发人员的功能。
Sourcegraph Cody
来自Cody博客文章:
这是Cody连接到Postgres数据库的示例,在查看数据库模式后编写Prisma查询:
Zed编辑器
来自Zed编辑器博客文章:
这是使用Zed扩展程序来访问PostgreSQL的示例,以便立即向模型提供关于我们整个数据库模式的信息,这样当我们要求它为我们编写查询时,它确切地知道存在哪些表和列,以及它们的类型是什么。

Sourcegraph的博客文章中还有一个使用TypeScript和MCP构建Linear集成的示例。
使用Claude Desktop测试MCP
Claude Desktop应用是测试MCP的最简单方法。
在文本编辑器中打开Claude Desktop应用配置文件:~/Library/Application Support/Claude/claude_desktop_config.json
。
~/Library/Application Support/Claude/claude_desktop_config.json
在你的机器上可能不存在。你需要创建它。
~/Library/Application Support/Claude/config.json
是一个不同的、不相关的文件。不要编辑它。
添加此配置:
perl
{
"mcpServers": {
"brave_search": {
"command": "npx",
"args": ["@modelcontextprotocol/server-brave-search"],
"env": {
"BRAVE_API_KEY": "your-api-key"
}
}
}
}
这告诉Claude Desktop:
- 有一个名为
brave_search
的MCP服务器 - 使用
npx @modelcontextprotocol/server-brave-search
启动它
保存文件,并重启Claude Desktop。
现在,你可以要求Claude Desktop"搜索网络"获取某些内容。
例如,尝试让Claude Desktop"搜索网络查找glama.ai"。
你首先会被提示允许Claude Desktop使用MCP:

点击"允许此次聊天"以允许Claude Desktop使用MCP。
之后,你将看到Claude Desktop使用Brave搜索MCP服务器来搜索网络查找"glama.ai"并获取结果。
替代方案
有几个解决与MCP相同问题的开源项目。
- Web Applets -- 一个开放规范和SDK,用于创建代理可以使用的应用程序。
接下来是什么?
我预计MCP在获得HTTP传输支持之前不会得到广泛采用。
然而,我确实想象未来像Glama或Claude Desktop这样的通用LLM客户端将拥有MCP服务器市场,用户将能够将这些服务插入到他们的工作流程中。
局限性
目前使用MCP的实际应用很少。但随着时间推移,这种情况会改变。
至于Claude Desktop:
- Claude Desktop应用中MCP服务器的设置过程目前是手动的。
- 每次重新打开应用时,你都必须授予Claude Desktop使用MCP的权限。查看这个解决方法。
- MCP仅在本地支持(服务器必须在你自己的机器上运行)。
- 大多数说明针对macOS。然而,这里有人成功在Windows上使用MCP。
早期想法
我认为这是Anthropic的一个受欢迎的举措。然而,需要一些时间来看它是否会获得牵引力。
同时,我看好计算机使用成为AI驱动自动化的标准,包括MCP试图解决的所有问题。
有关MCP的问题?加入模型上下文协议Discord并在#general
频道提问。