實操干貨!MCP 全解析,手把手教你基于 MCP 開發(fā) Agent 原創(chuàng)
隨著 Manus 推動 Agent 應(yīng)用的火爆,MCP(模型上下文協(xié)議)成為眾多社區(qū)熱議的焦點。今天,我們將深入解析 MCP 并提供實操應(yīng)用指南。相信讀完這篇文章,你就能立刻上手 MCP。
1、MCP 架構(gòu)設(shè)計全剖析
第一、為什么會出現(xiàn) MCP?
如果你開發(fā)了一個 AI 應(yīng)用,無論是 ChatBot 還是復(fù)雜的 Agent,都不會僅限于簡單的 LLM 對話。很多時候,你需要與外部世界連接,以訪問數(shù)據(jù)源或使用工具。例如:
- 操控瀏覽器實現(xiàn)自動化;
- 訪問本地文件;
- 訪問數(shù)據(jù)庫結(jié)構(gòu),以便更好地讓 AI 參與編程;
- 調(diào)用 CRM 的 API 以驅(qū)動智能客服流程。
在這種情況下,你需要連接不同的對象,使用不同的接口協(xié)議。你可能需要熟悉 SQL、HTTP 調(diào)用、Playwright 等接口,甚至還需要使用搜索引擎、訪問云存儲、調(diào)用第三方開放API等。這些都涉及大量的“粘合”工作。
MCP(模型上下文協(xié)議)正是為了解決這一問題。它允許 LLM 應(yīng)用通過統(tǒng)一的協(xié)議連接外部資源,而無需逐個適配。MCP 通過增加一個中間層來實現(xiàn)這一點:LLM 應(yīng)用通過統(tǒng)一的 MCP 協(xié)議連接到中間層(稱為 MCP Server),而中間層則負(fù)責(zé)處理與外部資源的對接。
那么,為什么在 Agent 應(yīng)用火熱之后,大家才開始關(guān)注 MCP 呢?原因很簡單:Agent 是最需要對接外部資源和工具的 LLM 應(yīng)用類型。
第二、MCP 有哪些好處?
這種設(shè)計范式在軟件系統(tǒng)中其實很常見,比如:一些大模型 API 網(wǎng)關(guān)會將不同廠家的大模型協(xié)議轉(zhuǎn)化為統(tǒng)一的 OpenAI 兼容協(xié)議,方便應(yīng)用接入。它的具體意義主要體現(xiàn)在以下幾點:
- 簡化 LLM 應(yīng)用:無需適配各種私有協(xié)議,只需學(xué)會連接 MCP Server 即可。
- 快速擴(kuò)展 LLM 應(yīng)用:隨時可以“插拔”新的 MCP Server,需要更多功能時,簡單添加即可。
- 快速適應(yīng)變化:如果外部資源的接口發(fā)生變化,只需在對應(yīng)的 MCP Server 上進(jìn)行修改,所有連接的 LLM 應(yīng)用都能無縫適應(yīng)。
- 構(gòu)建新的 AI 能力共享生態(tài):通過共享 MCP Server,新的 LLM 應(yīng)用能夠快速獲得各種工具,形成一種新的合作體系,從而提升整體的效用。
例如,MCP 的提出者 Anthropic 旗下的 Claude Desktop,就可以通過這種方式輕松擴(kuò)充自身的能力。
第三、基于 MCP 的 Agent 架構(gòu)設(shè)計
以下是基于 MCP 將 LLM 應(yīng)用(Agent)與外部資源集成的架構(gòu)設(shè)計圖:
與 LLM 應(yīng)用直接連接外部資源的方式相比,這里主要增加了一個中間層(MCP Server)以及用于連接該中間層的(MCP Client)。理解了這兩個組件,你就基本掌握了 MCP 的核心。
(1)MCP Server
這里的 “Server” 并非傳統(tǒng)意義上的集中式服務(wù)器,更像是一個服務(wù)插件。
- MCP Server 部署位置
MCP Server可以部署在 LLM 應(yīng)用所在的本機上,也可以遠(yuǎn)程部署(Remote)。不過目前遠(yuǎn)程部署方式尚未完善,暫時不考慮。以下內(nèi)容僅針對本地部署模式。
- MCP Server 提供的“服務(wù)”
- Tools:為 LLM 應(yīng)用,尤其是 Agent 提供各種工具。
- Resources:為 LLM 應(yīng)用提供額外的結(jié)構(gòu)化數(shù)據(jù)。
- Prompts:為 LLM 應(yīng)用提供 Prompt模板。例如,如果你的應(yīng)用是一個Chatbot,可以從 MCP Server 中獲取這些模板供用戶選擇使用。
- 獲取 MCP Server 的方式
- 自己使用 MCP SDK 創(chuàng)建后,供個人或企業(yè)內(nèi)部共享使用。
- 從他人創(chuàng)建的 MCP Servers 中“挑選”,然后下載使用。例如,可以從以下鏈接獲取。
- MCP Server 的啟動方式
- 在本地模式下,通過在 LLM 應(yīng)用中配置啟動命令后,MCP Server 會自動啟動。
- 需要注意的是,不同的 MCP Server 可能有不同的啟動命令,具體請查看 MCP Server 的說明書。
- 部分 MCP Server 可能需要先安裝依賴項;而對于通過 npx 或 uvx 運行的 MCP Server,則會自動下載緩存并臨時運行。
- 啟動后,MCP Server 在物理形式上是一個獨立的進(jìn)程。
- MCP Server 與 Client 應(yīng)用的通信方式
在本地模式下,MCP Server 與客戶端應(yīng)用之間通過 stdio/stdout(標(biāo)準(zhǔn)輸入輸出)進(jìn)行進(jìn)程間通信,交換消息。這種通信方式你可能已經(jīng)很熟悉了,例如:
cat file.txt | grep "error" | sort > result.txt
- 創(chuàng)建 MCP Server 的編程語言
目前支持使用 TS(TypeScript)、Python、Java SDK 來編寫 MCP Server。
(2)MCP Client
MCP Client 是由客戶端 LLM 應(yīng)用使用 Client SDK 創(chuàng)建并維護(hù)的一個 Server 會話,就像你在程序中維護(hù)一個數(shù)據(jù)庫的 Connection 一樣。一般長這樣:
async with stdio_client(server_params) as (read, write):
async with ClientSession(
read, write, sampling_callback=None
) as session:、
......
借助 Client SDK 你可以與 MCP Server 通信。比如查看 Server 的 Tools:
tools = await session.list_tools()
本地模式下,Client 與 Server 是一對一的關(guān)系。如果需要連接多個MCP Server,需要自行維護(hù)多個 Session。
2、動手做一個 MCP
讓我們通過一個簡單的 Client + Server 的完整案例來加深對 MCP 的理解。
首先,使用以下命令安裝 SDK:
pip install mcp
安裝完成后,按照以下步驟進(jìn)行操作:
第一、創(chuàng)建 MCP Server
這個 MCP Server 僅具備一個功能:提供一個計算器工具。具體實現(xiàn)如下:
#server_demo.py
from mcp.server.fastmcp import FastMCP
# 創(chuàng)建一個MCP服務(wù)器
mcp = FastMCP("演示")
# 添加一個工具
@mcp.tool()
def calculate(expression: str) -> float:
"""計算四則運算表達(dá)式
參數(shù):
expression: 數(shù)學(xué)表達(dá)式字符串,如 "1 + 2 * 3"
返回:
計算結(jié)果
"""
...省略計算器代碼...
if __name__ == "__main__":
mcp.run(transport='stdio')
注意這里必須要有啟動代碼,但現(xiàn)在你不需要啟動它。
第二、創(chuàng)建 MCP Client
接下來,創(chuàng)建一個客戶端應(yīng)用,用于連接上述 MCP Server 并調(diào)用其中的計算器功能:
#client_demo.py
from mcp.client.stdio import stdio_client
from mcp import ClientSession, StdioServerParameters, types
import asyncio
#Client會使用這里的配置來啟動本地 MCP Server
server_params = StdioServerParameters(
command="python",
args=["./server_demo.py"],
env=None
)
async def main():
async with stdio_client(server_params) as (read, write):
async with ClientSession(
read, write, sampling_callback=None )
)as session:
await session.initialize()
print('\n正在調(diào)用工具...')
result = await session.call_tool("calculate",{ "expression": "188*23-34" })
print(result.content)
asyncio.run(main())
現(xiàn)在直接運行這個 Client,就可以看到如下輸出:
第三、如何調(diào)試 MCP Server
如果只是單純開發(fā) MCP Server,如何快速進(jìn)行測試呢?對于用 Python 編寫的 Server,可以通過 MCP Inspector 來進(jìn)行調(diào)試。運行以下命令:
mcp dev server_demo.py
隨后,訪問 ???http://localhost:5173??,即可進(jìn)入可視化調(diào)試界面,在這里可以直觀地測試剛才的計算器工具。
本文轉(zhuǎn)載自公眾號玄姐聊AGI 作者:玄姐
