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