一文帶你入門 MCP(模型上下文協議)
什麼是 MCP?
MCP(Model Context Protocol,模型上下文協議) 是由 Anthropic 推出的一種開放標準,旨在統一大型語言模型(LLM)與外部數據源和工具之間的通信協議。MCP 的主要目的在於解決當前 AI 模型因數據孤島限制而無法充分發揮潛力的難題,MCP 使得 AI 應用能夠安全地訪問和操作本地及遠程數據,爲 AI 應用提供了連接萬物的接口。
MCP 架構
MCP 遵循客戶端 - 服務器架構(client-server),其中包含以下幾個核心概念:
-
MCP 主機(MCP Hosts):發起請求的 LLM 應用程序(例如 Claude Desktop、IDE 或 AI 工具)。
-
MCP 客戶端(MCP Clients):在主機程序內部,與 MCP server 保持 1:1 的連接。
-
MCP 服務器(MCP Servers):爲 MCP client 提供上下文、工具和 prompt 信息。
-
本地資源(Local Resources):本地計算機中可供 MCP server 安全訪問的資源(例如文件、數據庫)。
-
遠程資源(Remote Resources):MCP server 可以連接到的遠程資源(例如通過 API)。
MCP Client
MCP client 充當 LLM 和 MCP server 之間的橋樑,MCP client 的工作流程如下:
-
MCP client 首先從 MCP server 獲取可用的工具列表。
-
將用戶的查詢連同工具描述通過 function calling 一起發送給 LLM。
-
LLM 決定是否需要使用工具以及使用哪些工具。
-
如果需要使用工具,MCP client 會通過 MCP server 執行相應的工具調用。
-
工具調用的結果會被髮送回 LLM。
-
LLM 基於所有信息生成自然語言響應。
-
最後將響應展示給用戶。
你可以在 Example Clients 找到當前支持 MCP 協議的客戶端程序。本文將會使用 Claude Desktop 作爲 MCP client,你可以在此頁面下載安裝:https://claude.ai/download 。
MCP Server
MCP server 是 MCP 架構中的關鍵組件,它可以提供 3 種主要類型的功能:
-
資源(Resources):類似文件的數據,可以被客戶端讀取,如 API 響應或文件內容。
-
工具(Tools):可以被 LLM 調用的函數(需要用戶批准)。
-
提示(Prompts):預先編寫的模板,幫助用戶完成特定任務。
這些功能使 MCP server 能夠爲 AI 應用提供豐富的上下文信息和操作能力,從而增強 LLM 的實用性和靈活性。
你可以在 MCP Servers Repository 和 Awesome MCP Servers 這兩個 repo 中找到許多由社區實現的 MCP server。使用 TypeScript 編寫的 MCP server 可以通過 npx 命令來運行,使用 Python 編寫的 MCP server 可以通過 uvx 命令來運行。
使用 Claude Desktop 通過 PostgreSQL MCP Server 查詢數據庫信息
接下來演示通過 PostgreSQL MCP Server 使 LLM 能夠基於 PostgreSQL 中的數據來回答問題。
準備 PostgreSQL 數據
首先使用 Docker 啓動 PostgreSQL 服務。
docker run -d --name postgres \
-e POSTGRES_PASSWORD=postgres -p 5432:5432 \
postgres
在 PostgreSQL 中創建數據庫和表,並插入數據。
-- 登錄 PostgreSQL
docker exec -it postgres psql -U postgres
-- 創建數據庫
CREATEDATABASE shopdb;
-- 連接到新創建的數據庫
\c shopdb;
-- 創建 users 表
CREATETABLEusers (
user_id SERIAL PRIMARY KEY,
first_name VARCHAR(50) NOTNULL,
last_name VARCHAR(50) NOTNULL,
email VARCHAR(100) UNIQUENOTNULL
);
-- 創建 orders 表
CREATETABLE orders (
order_id SERIAL PRIMARY KEY,
order_date TIMESTAMPNOTNULL,
total_amount DECIMAL(10, 2) NOTNULL,
user_id INTREFERENCESusers(user_id)
);
-- 插入示例數據
INSERTINTOusers (first_name, last_name, email) VALUES
('John', 'Doe', 'john.doe@example.com'),
('Jane', 'Smith', 'jane.smith@example.com'),
('Alice', 'Johnson', 'alice.johnson@example.com');
INSERTINTO orders (order_date, total_amount, user_id) VALUES
('2025-01-05 10:30:00', 150.75, 1),
('2025-01-06 11:00:00', 200.50, 2),
('2025-01-07 12:45:00', 120.25, 1);
配置連接 PostgreSQL MCP Server
在 Claude Desktop 中配置 PostgreSQL MCP Server 的連接信息,具體內容可以參考:For Claude Desktop Users。最終是在 claude_desktop_config.json
文件中添加如下內容:
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-postgres",
"postgresql://postgres:postgres@127.0.0.1/shopdb"
]
}
}
}
配置完畢後,重啓 Claude Desktop。一切正常的話,你應該能在輸入框的右下角看到一個錘子圖標。點擊錘子圖標,可以看到 PostgreSQL MCP Server 提供的工具信息。
根據 PostgreSQL 的數據進行提問
首先來問一個簡短的問題:數據庫中有哪些表? Claude 會判斷出需要調用 MCP server 來查詢 PostgreSQL 中的數據。這裏會彈出一個窗口,需要用戶授權。
點擊 Allow 後,Claude 成功返回了結果。
接下來我們可以增加一點難度:查詢金額最高的訂單信息。在數據庫中有兩張表 users
和 orders
,要想得到完整的訂單信息,需要先去查詢 orders
表中金額最高的一條記錄,然後根據 user_id
這個外鍵再去查詢 users
表中對應的用戶信息。
從下面的輸出可以發現 Claude 一開始是不知道數據庫中的表結構的,因此先發送請求分別確定 orders
表和 users
表中相應的字段,然後再對兩張表進行 join 查詢。
點擊 View Result from query from postgres
可以看到 Claude Desktop 向 MCP server 發送的請求以及得到的響應,說明這個結果確實是從 PostgreSQL 數據庫中查詢得到的。
你也可以複製這條 SQL 語句到數據庫中查詢進行確認。
總結
本文帶領讀者快速入門了 MCP(模型上下文協議),介紹了其架構、核心概念以及實際應用場景。通過演示 Claude Desktop 結合 PostgreSQL MCP Server 查詢數據庫的場景,展示了 MCP 如何增強 LLM 與外部數據源的交互能力。後續文章還會繼續分享 MCP server 和 MCP client 開發的相關內容,歡迎持續關注。
參考資料
-
Model Context Protocol 官方文檔:https://modelcontextprotocol.io/introduction
-
深度解析:Anthropic MCP 協議:https://mp.weixin.qq.com/s/ASmcjW53HKokdYt1m-xyXA
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s?__biz=MzkxOTIwMDgxMg==&mid=2247488037&idx=1&sn=0622fbbbb1de0c323ef6cc6b78b27aca&scene=21#wechat_redirect