譯者 | 陳峻
審校 | 重樓
由Claude 人工智能(AI)模型家族背后的公司--Anthropic推出的通信協(xié)議MCP(模型上下文協(xié)議,Model Context Protocol)可謂2025年的流行協(xié)議。目前,包括Google和OpenAI在內(nèi)的幾乎所有主要AI公司都接受了MCP,并使之正在成為AI模型的標(biāo)準(zhǔn)化通信方式。
下面,我將向你詳細(xì)介紹什么是MCP,如何構(gòu)建一個(gè)基礎(chǔ)的MCP服務(wù)器,及其工作原理。
什么是MCP?
MCP,又名AI模型上下文協(xié)議,是AI模型與外部工具和應(yīng)用通信的標(biāo)準(zhǔn)化方式。和HTTP、以及TCP等其他協(xié)議類(lèi)似,它是一種協(xié)議、一種通信方式、也是一套規(guī)則。
由于MCP遵循客戶(hù)端-服務(wù)器的架構(gòu),因此我們通常需要兩個(gè)構(gòu)建塊,來(lái)實(shí)現(xiàn)MCP客戶(hù)端和MCP服務(wù)器的通信,即:
- MCP客戶(hù)端:主要使用模型上下文協(xié)議與MCP服務(wù)器對(duì)話(huà)。你可以將其視為一種工具,可用來(lái)啟動(dòng)與MCP服務(wù)器的連接,與支持MCP的AI模型進(jìn)行交互。
- MCP服務(wù)器:主要處理來(lái)自AI模型(即MCP客戶(hù)端)的請(qǐng)求,并將其映射到服務(wù)器中預(yù)定義的適當(dāng)任務(wù)中。也就是說(shuō),MCP服務(wù)器定義了AI模型在服務(wù)器與工具上執(zhí)行哪些操作,以及它可以訪(fǎng)問(wèn)哪些資源。你可以把它想象成一個(gè)映射器,將各種請(qǐng)求映射為適當(dāng)?shù)牟僮鳌>唧w而言,當(dāng)我向支持MCP的AI工具(例如Claude Desktop)發(fā)送提示詞時(shí),MCP客戶(hù)端會(huì)將其轉(zhuǎn)到AI模型(例如Claude),AI模型據(jù)此思考如何繼續(xù)處理請(qǐng)求,并探索所有可用的工具和資源,然后它將決定使用哪些工具與資源,并告訴MCP客戶(hù)端如何與外部MCP服務(wù)器交流,以獲取并執(zhí)行這些工具與資源。一旦MCP客戶(hù)端從MCP服務(wù)器處獲得了響應(yīng),它會(huì)將該數(shù)據(jù)發(fā)送給AI模型,而AI模型將以人類(lèi)可讀的方式重組并呈現(xiàn)數(shù)據(jù)。具體流程請(qǐng)參見(jiàn)下圖。
圖片來(lái)源:https://syntackle.com/blog/model-context-protocol/
為何需要MCP?
你也許會(huì)問(wèn),MCP與我們常用的API有何區(qū)別呢?其實(shí),作為一個(gè)AI模型,如果我想連接到外部工具或應(yīng)用的話(huà),只需為其構(gòu)建一個(gè)API,以便AI模型與對(duì)應(yīng)的工具或應(yīng)用通信即可。不過(guò),請(qǐng)注意,這類(lèi)API往往特定于某些工具或應(yīng)用。如果我想讓AI模型使用其他的工具,就必須額外再構(gòu)建一個(gè)自定義的API。顯然,到頭來(lái),我需要構(gòu)建的API數(shù)量將與AI模型使用的工具及應(yīng)用的數(shù)量成比上升。而對(duì)于AI公司而言,這將增加大量的構(gòu)建和管理成本。而這恰恰是Anthropic發(fā)揮作用的地方。
Anthropic創(chuàng)建了一個(gè)與AI模型和工具無(wú)關(guān)的通用協(xié)議。這意味著,任何支持該協(xié)議的AI模型都可以與任何支持該協(xié)議的外部工具/應(yīng)用進(jìn)行通信。據(jù)此,AI模型提供商只需要支持MCP,便可與任何也支持MCP的外部工具進(jìn)行通信。實(shí)際上,他們所做的是將構(gòu)建API的任務(wù)轉(zhuǎn)移到了開(kāi)發(fā)者社區(qū)(例如各種外部工具和應(yīng)用),讓MCP與應(yīng)用集成的任務(wù)成為應(yīng)用開(kāi)發(fā)人員的工作,而不是AI模型提供商的工作。這對(duì)于雙方來(lái)說(shuō)都是雙贏的,畢竟他們只需要維護(hù)一個(gè)接口,即MCP。
圖片來(lái)源:https://syntackle.com/blog/model-context-protocol/
不僅如此,第三方MCP服務(wù)器也可以為給定的應(yīng)用進(jìn)行構(gòu)建。這鼓勵(lì)了開(kāi)發(fā)者社區(qū)使用AI在現(xiàn)有應(yīng)用的基礎(chǔ)上構(gòu)建新的方案,而無(wú)需了解AI模型或平臺(tái)的具體內(nèi)容;且反之亦然。
如何構(gòu)建 MCP 服務(wù)器
MCP服務(wù)器包括三個(gè)組件:
- 工具:用于執(zhí)行各項(xiàng)功能性操作,實(shí)現(xiàn)類(lèi)似于HTTP的PUT/PATCH/DELETE請(qǐng)求。
- 資源:提供MCP 客戶(hù)端可讀取的數(shù)據(jù)。實(shí)現(xiàn)類(lèi)似于HTTP的GET請(qǐng)求。
- 預(yù)定義的提示:各種可供LLM使用的提示模板。MCP服務(wù)器通常可以由Python、Node、Java、Kotlin和C#來(lái)構(gòu)建。在下文中,我將使用Node(TypeScript)來(lái)構(gòu)建一個(gè)基本的MCP服務(wù)器。
安裝MCP SDK和應(yīng)用
請(qǐng)使用npm init -y來(lái)初始化Node應(yīng)用。然后,根據(jù)你的編程語(yǔ)言或框架,安裝適當(dāng)?shù)腟DK。在本例中,我使用的是:
npm install @modelcontextprotocol/sdk
并且,通過(guò)修改package.json文件來(lái)實(shí)現(xiàn):
- 讓Node應(yīng)用成為一個(gè)模塊。
- 使用bin腳本在bin文件夾中包含一個(gè)可執(zhí)行文件。
- 在build腳本中設(shè)置可執(zhí)行文件的權(quán)限。如有必要,請(qǐng)包含一個(gè)files腳本,來(lái)定義在最終構(gòu)建中包含哪些文件:
{
"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"
}
}
在此,我建議在項(xiàng)目文件夾的根目錄處,創(chuàng)建一個(gè)tsconfig.json文件,具體內(nèi)容如下:
{
"compilerOptions": {
"target": "ES2022",
"module": "Node16",
"moduleResolution": "Node16",
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
},
"include": [
"src/**/*"
],
"exclude": [
"node_modules"
]
}
創(chuàng)建 MCP 服務(wù)器實(shí)例
接著,請(qǐng)創(chuàng)建一個(gè)src文件夾,并在該文件夾中創(chuàng)建一個(gè)index.ts文件。當(dāng)然,你也可以自定義不同的文件夾結(jié)構(gòu),但請(qǐng)確保相應(yīng)地更新到package.json和tsconfig.json的對(duì)應(yīng)位置。
// 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服務(wù)器需要設(shè)定一種傳輸類(lèi)型,才能與MCP客戶(hù)端通信。這便是使用stdio傳輸類(lèi)型的原因。請(qǐng)注意,該傳輸類(lèi)型僅在Node中可用。
配置 MCP 客戶(hù)端
在本例中,我正在使用Claude Desktop App作為MCP客戶(hù)端來(lái)與MCP服務(wù)器通信。當(dāng)然,你也可以使用任何自己喜歡的MCP客戶(hù)端。
首先,我需要告知Claude Desktop自己的MCP服務(wù)器,并提供一條可以找到它的路徑。為此,我需要修改Claude Desktop的配置文件。該文件存在于以下不同操作系統(tǒng)的路徑中:
- MacOS和Linux:~/Library/Application\ Support/Claude/claude_desktop_config.json
- Windows:AppData\Claude\claude_desktop_config.json請(qǐng)?jiān)诮K端上使用VSCode打開(kāi)該文件:
- MacOS和Linux:code ~/Library/Application\Support/Claude/claude_desktop_config.json
- Windows:code $env:AppData\Claude\claude_desktop_config.json然后,在你獲取了訪(fǎng)問(wèn)該文件的權(quán)限后,請(qǐng)參照如下方式添加你的MCP服務(wù)器:
{
"mcpServers": {
"mcp-demo": {
"command": "node",
"args": [
"/Users/murtuzaalisurti/Documents/Development/MCP Servers/demo/dist/index.js", // absolute path to your MCP server build
]
}
}
}
- 請(qǐng)保存文件并重新啟動(dòng)Claude Desktop。
- 如果你遇到了錯(cuò)誤,請(qǐng)轉(zhuǎn)到Claude App Settings > Developer > Logs。
- 如果MCP服務(wù)器在Claude Desktop中被正確配置和注冊(cè),那么你將可以通過(guò)轉(zhuǎn)到Claude App Settings > Developer > [MCP Server Name]來(lái)驗(yàn)證MCP服務(wù)器的狀態(tài)(如下圖所示應(yīng)為running狀態(tài))。
使用MCP服務(wù)器
在Claude Desktop中,連接上MCP服務(wù)器后,如果你在MCP服務(wù)器中定義了資源,你可以看到一個(gè)插頭的圖標(biāo)。它允許你將這些資源中的數(shù)據(jù)附加到AI模型的上下文中。
Claude Desktop應(yīng)用的mcp資源上下文圖標(biāo)(插頭圖標(biāo))
點(diǎn)擊Claude Desktop應(yīng)用的mcp資源上下文圖標(biāo)(插入圖標(biāo))
一旦你將資源附加到聊天上下文中,并告訴Claude用正常人類(lèi)語(yǔ)言檢索該信息,它便可以提供如下互動(dòng):
在Claude Desktop中將mcp資源附加到聊天的上下文中
如果你在MCP服務(wù)器中定義了tools,你將在Claude Desktop中看到一個(gè)錘子圖標(biāo),并能顯示可用的工具。
在Claude Desktop中將mcp工具附加到聊天上下文中
例如,我在自己的MCP服務(wù)器中添加了一個(gè)修改用戶(hù)年齡的工具,并將其與現(xiàn)有的資源結(jié)合使用,該資源能夠?yàn)镃laude提供用戶(hù)列表。請(qǐng)注意,你需要將這些資源附加到聊天的上下文中。當(dāng)然,Claude需要征得你的許可,方可修改數(shù)據(jù)。
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}`,
}]
}
},
)
通過(guò)請(qǐng)求權(quán)限在Claude Desktop中將mcp服務(wù)器資源和工具一起使用
在Claude Desktop中一起使用mcp服務(wù)器資源和工具
在將資源附加到聊天上下文后,如果我再次要求它獲取用戶(hù)列表,Claude就會(huì)使用更新的數(shù)據(jù)進(jìn)行響應(yīng)了。
在Claude Desktop中使用mcp服務(wù)器資源和工具,獲取更新的用戶(hù)列表
這就是我構(gòu)建一個(gè)基本而簡(jiǎn)單的MCP服務(wù)器,并將其與Claude Desktop(MCP客戶(hù)端)集成。
MCP 服務(wù)器列表
以下是你可以試用的MCP服務(wù)器詳盡列表:
- 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服務(wù)器,請(qǐng)查看如下MCP服務(wù)器目錄,其中包含了各種社區(qū)和官方的MCP服務(wù)器。
- Glama
- Cursor MCP Directory
- HuggingFace MCP Server List
- punkpeye/awesome-mcp-servers
- modelcontextprotocol MCP server list
- MCP.so
小結(jié)
有人將MCP稱(chēng)為AI領(lǐng)域的“USB-C”、也有人稱(chēng)之為AI界的HTTP,顯然它比HTTP更復(fù)雜。盡管MCP并不能解決每個(gè)AI模型的通信問(wèn)題,但是它肯定會(huì)使之變得更容易。隨著MCP的出現(xiàn),其他協(xié)議,如A2A(代理對(duì)代理協(xié)議)也開(kāi)始被使用,并使得由不同框架構(gòu)建的AI代理之間的通信變得更加容易。可見(jiàn),MCP只是AI通信協(xié)議的開(kāi)始,我們將能看到一些更強(qiáng)大、更好用、更注重隱私的AI協(xié)議的涌現(xiàn)。
譯者介紹
陳峻(Julian Chen),51CTO社區(qū)編輯,具有十多年的IT項(xiàng)目實(shí)施經(jīng)驗(yàn),善于對(duì)內(nèi)外部資源與風(fēng)險(xiǎn)實(shí)施管控,專(zhuān)注傳播網(wǎng)絡(luò)與信息安全知識(shí)與經(jīng)驗(yàn)。
原文標(biāo)題:Anthropic’s New Protocol Wants to Be the HTTP of AI,作者:Murtuza