译者 | 陈峻
审校 | 重楼
由Claude 人工智能(AI)模型家族背后的公司--Anthropic推出的通信协议MCP(模型上下文协议,Model Context Protocol)可谓2025年的流行协议。目前,包括Google和OpenAI在内的几乎所有主要AI公司都接受了MCP,并使之正在成为AI模型的标准化通信方式。
下面,我将向你详细介绍什么是MCP,如何构建一个基础的MCP服务器,及其工作原理。
什么是MCP?
MCP,又名AI模型上下文协议,是AI模型与外部工具和应用通信的标准化方式。和HTTP、以及TCP等其他协议类似,它是一种协议、一种通信方式、也是一套规则。
由于MCP遵循客户端-服务器的架构,因此我们通常需要两个构建块,来实现MCP客户端和MCP服务器的通信,即:
- MCP客户端:主要使用模型上下文协议与MCP服务器对话。你可以将其视为一种工具,可用来启动与MCP服务器的连接,与支持MCP的AI模型进行交互。
- MCP服务器:主要处理来自AI模型(即MCP客户端)的请求,并将其映射到服务器中预定义的适当任务中。也就是说,MCP服务器定义了AI模型在服务器与工具上执行哪些操作,以及它可以访问哪些资源。你可以把它想象成一个映射器,将各种请求映射为适当的操作。具体而言,当我向支持MCP的AI工具(例如Claude Desktop)发送提示词时,MCP客户端会将其转到AI模型(例如Claude),AI模型据此思考如何继续处理请求,并探索所有可用的工具和资源,然后它将决定使用哪些工具与资源,并告诉MCP客户端如何与外部MCP服务器交流,以获取并执行这些工具与资源。一旦MCP客户端从MCP服务器处获得了响应,它会将该数据发送给AI模型,而AI模型将以人类可读的方式重组并呈现数据。具体流程请参见下图。
图片来源:https://syntackle.com/blog/model-context-protocol/
为何需要MCP?
你也许会问,MCP与我们常用的API有何区别呢?其实,作为一个AI模型,如果我想连接到外部工具或应用的话,只需为其构建一个API,以便AI模型与对应的工具或应用通信即可。不过,请注意,这类API往往特定于某些工具或应用。如果我想让AI模型使用其他的工具,就必须额外再构建一个自定义的API。显然,到头来,我需要构建的API数量将与AI模型使用的工具及应用的数量成比上升。而对于AI公司而言,这将增加大量的构建和管理成本。而这恰恰是Anthropic发挥作用的地方。
Anthropic创建了一个与AI模型和工具无关的通用协议。这意味着,任何支持该协议的AI模型都可以与任何支持该协议的外部工具/应用进行通信。据此,AI模型提供商只需要支持MCP,便可与任何也支持MCP的外部工具进行通信。实际上,他们所做的是将构建API的任务转移到了开发者社区(例如各种外部工具和应用),让MCP与应用集成的任务成为应用开发人员的工作,而不是AI模型提供商的工作。这对于双方来说都是双赢的,毕竟他们只需要维护一个接口,即MCP。
图片来源:https://syntackle.com/blog/model-context-protocol/
不仅如此,第三方MCP服务器也可以为给定的应用进行构建。这鼓励了开发者社区使用AI在现有应用的基础上构建新的方案,而无需了解AI模型或平台的具体内容;且反之亦然。
如何构建 MCP 服务器
MCP服务器包括三个组件:
- 工具:用于执行各项功能性操作,实现类似于HTTP的PUT/PATCH/DELETE请求。
- 资源:提供MCP 客户端可读取的数据。实现类似于HTTP的GET请求。
- 预定义的提示:各种可供LLM使用的提示模板。MCP服务器通常可以由Python、Node、Java、Kotlin和C#来构建。在下文中,我将使用Node(TypeScript)来构建一个基本的MCP服务器。
安装MCP SDK和应用
请使用npm init -y来初始化Node应用。然后,根据你的编程语言或框架,安装适当的SDK。在本例中,我使用的是:
复制npm install @modelcontextprotocol/sdk
并且,通过修改package.json文件来实现:
- 让Node应用成为一个模块。
- 使用bin脚本在bin文件夹中包含一个可执行文件。
- 在build脚本中设置可执行文件的权限。如有必要,请包含一个files脚本,来定义在最终构建中包含哪些文件:
{ "name": "mcp-demo", "version": "1.0.0", "type": "module", "bin": { "mcp-demo": "./dist/index.js" }, "scripts": { "ts": "npx tsc", "rootFile": "chmod 755 ./dist/index.js", "build": "npm-run-all -s ts rootFile" }, "files": [ "dist" ], "dependencies": { "@modelcontextprotocol/sdk": "^1.10.1", "npm-run-all": "^4.1.5", "typescript": "^5.8.3" } }
在此,我建议在项目文件夹的根目录处,创建一个tsconfig.json文件,具体内容如下:
复制{ "compilerOptions": { "target": "ES2022", "module": "Node16", "moduleResolution": "Node16", "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true }, "include": [ "src/**/*" ], "exclude": [ "node_modules" ] }
创建 MCP 服务器实例
接着,请创建一个src文件夹,并在该文件夹中创建一个index.ts文件。当然,你也可以自定义不同的文件夹结构,但请确保相应地更新到package.json和tsconfig.json的对应位置。
复制// index.ts import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; const server = new McpServer({ name: "mcp-demo", version: "1.0.0", capabilities: { resources: {}, tools: {}, prompts: {}, } }); const transport = new StdioServerTransport(); await server.connect(transport); console.log("Server started and connected to transport.");
MCP服务器需要设定一种传输类型,才能与MCP客户端通信。这便是使用stdio传输类型的原因。请注意,该传输类型仅在Node中可用。
配置 MCP 客户端
在本例中,我正在使用Claude Desktop App作为MCP客户端来与MCP服务器通信。当然,你也可以使用任何自己喜欢的MCP客户端。
首先,我需要告知Claude Desktop自己的MCP服务器,并提供一条可以找到它的路径。为此,我需要修改Claude Desktop的配置文件。该文件存在于以下不同操作系统的路径中:
- MacOS和Linux:~/Library/Application\ Support/Claude/claude_desktop_config.json
- Windows:AppData\Claude\claude_desktop_config.json请在终端上使用VSCode打开该文件:
- MacOS和Linux:code ~/Library/Application\Support/Claude/claude_desktop_config.json
- Windows:code $env:AppData\Claude\claude_desktop_config.json然后,在你获取了访问该文件的权限后,请参照如下方式添加你的MCP服务器:
{ "mcpServers": { "mcp-demo": { "command": "node", "args": [ "/Users/murtuzaalisurti/Documents/Development/MCP Servers/demo/dist/index.js", // absolute path to your MCP server build ] } } }
- 请保存文件并重新启动Claude Desktop。
- 如果你遇到了错误,请转到Claude App Settings > Developer > Logs。
- 如果MCP服务器在Claude Desktop中被正确配置和注册,那么你将可以通过转到Claude App Settings > Developer > [MCP Server Name]来验证MCP服务器的状态(如下图所示应为running状态)。
使用MCP服务器
在Claude Desktop中,连接上MCP服务器后,如果你在MCP服务器中定义了资源,你可以看到一个插头的图标。它允许你将这些资源中的数据附加到AI模型的上下文中。
Claude Desktop应用的mcp资源上下文图标(插头图标)
点击Claude Desktop应用的mcp资源上下文图标(插入图标)
一旦你将资源附加到聊天上下文中,并告诉Claude用正常人类语言检索该信息,它便可以提供如下互动:
在Claude Desktop中将mcp资源附加到聊天的上下文中
如果你在MCP服务器中定义了tools,你将在Claude Desktop中看到一个锤子图标,并能显示可用的工具。
在Claude Desktop中将mcp工具附加到聊天上下文中
例如,我在自己的MCP服务器中添加了一个修改用户年龄的工具,并将其与现有的资源结合使用,该资源能够为Claude提供用户列表。请注意,你需要将这些资源附加到聊天的上下文中。当然,Claude需要征得你的许可,方可修改数据。
复制const users = [ { name: "Alice", age: 30 }, { name: "Bob", age: 25 }, { name: "Charlie", age: 35 } ] server.tool( "modify-user-age", "Modify user age", { name: z.string(), // install zod: npm i zod age: z.number(), }, ({ name, age }) => { const user = users.find(user => user.name === name); if (!user) { return { content: [{ type: "text", text: `User ${name} not found`, }] } } user.age = age; return { content: [{ type: "text", text: `User ${name} updated to age ${age}`, }] } }, )
通过请求权限在Claude Desktop中将mcp服务器资源和工具一起使用
在Claude Desktop中一起使用mcp服务器资源和工具
在将资源附加到聊天上下文后,如果我再次要求它获取用户列表,Claude就会使用更新的数据进行响应了。
在Claude Desktop中使用mcp服务器资源和工具,获取更新的用户列表
这就是我构建一个基本而简单的MCP服务器,并将其与Claude Desktop(MCP客户端)集成。
MCP 服务器列表
以下是你可以试用的MCP服务器详尽列表:
- Git MCP
- GitHub MCP
- Google Maps MCP
- Reddit MCP
- Blender MCP
- Da Vinci Resolve MCP
- Google Drive MCP
- Figma MCP
- Prisma MCP
- GitLab MCP
- FileSystem MCP
- Slack MCP
- Brave Search MCP
- SQLite MCP
如果你想探索更多的MCP服务器,请查看如下MCP服务器目录,其中包含了各种社区和官方的MCP服务器。
- Glama
- Cursor MCP Directory
- HuggingFace MCP Server List
- punkpeye/awesome-mcp-servers
- modelcontextprotocol MCP server list
- MCP.so
小结
有人将MCP称为AI领域的“USB-C”、也有人称之为AI界的HTTP,显然它比HTTP更复杂。尽管MCP并不能解决每个AI模型的通信问题,但是它肯定会使之变得更容易。随着MCP的出现,其他协议,如A2A(代理对代理协议)也开始被使用,并使得由不同框架构建的AI代理之间的通信变得更加容易。可见,MCP只是AI通信协议的开始,我们将能看到一些更强大、更好用、更注重隐私的AI协议的涌现。
译者介绍
陈峻(Julian Chen),51CTO社区编辑,具有十多年的IT项目实施经验,善于对内外部资源与风险实施管控,专注传播网络与信息安全知识与经验。
原文标题:Anthropic’s New Protocol Wants to Be the HTTP of AI,作者:Murtuza