MCP或將成為AI界的HTTP? 原創
本文將向你詳細介紹什么是MCP(模型上下文協議),如何構建一個基礎的MCP服務器,及其工作原理。?
由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
