從0到1玩轉(zhuǎn)MCP:AI的「萬能插頭」,代碼手把手教你!
在人工智能飛速發(fā)展的今天,LLM 的能力令人嘆為觀止,但其局限性也日益凸顯 —— 它們往往被困于訓(xùn)練數(shù)據(jù)的「孤島」,無法直接觸及實(shí)時信息或外部工具。
2024 年 11 月,Anthropic 推出了開源協(xié)議 MCP(Model Context Protocol,模型上下文協(xié)議),旨在為 AI 模型與外部數(shù)據(jù)源和工具之間的交互提供一個通用、標(biāo)準(zhǔn)化的連接方式。MCP 的開源性質(zhì)也迅速吸引了開發(fā)社區(qū)的關(guān)注,許多人將其視為 AI 生態(tài)系統(tǒng)標(biāo)準(zhǔn)化的重要一步。
MCP 的好處之一是它們能讓 AI 系統(tǒng)更安全。當(dāng)大家都能用到經(jīng)過嚴(yán)格測試的工具時,公司就不必「重復(fù)造輪子」,這樣既減少了安全隱患,也降低了惡意代碼出現(xiàn)的可能。
隨著 MCP 的逐漸普及,其影響力開始在行業(yè)內(nèi)顯現(xiàn)。2025 年 3 月 27 日,OpenAI 也開始支持 MCP 了。
谷歌似乎也在考慮是否加入 MCP 大家庭:
仔細(xì)看 MCP 的相關(guān)資料,會發(fā)現(xiàn)明顯存在信息斷層。雖然有很多解釋「它能做什么」的概述,但當(dāng)你真想了解它是「怎么運(yùn)作的」時,資料就變得稀少了 —— 特別是對非專業(yè)開發(fā)者來說。目前的資料不是過于表面的介紹,就是太過深奧的源代碼。
近日,一篇博客以淺顯易懂的方式講解了 MCP,讓各種背景的讀者都能理解它的概念和功能,讀者還可以跟著代碼進(jìn)行實(shí)踐。
博客鏈接:https://towardsdatascience.com/clear-intro-to-mcp/
讓我們跟隨博客一探究竟(注:本文代碼截圖可能不完整,詳見原文)。
通過類比理解 MCP:餐廳模型
首先,讓我們將 MCP 的概念想象成一家餐廳,其中:
- 主機(jī)(Host)=餐廳建筑(智能體程序運(yùn)行的環(huán)境)
- 服務(wù)器(Server)=廚房(工具發(fā)揮作用的地方)
- 客戶端(Client)=服務(wù)員(發(fā)送工具請求的角色)
- 智能體(Agent)=顧客(決定使用哪種工具的角色)
- 工具(Tools)=食譜(被執(zhí)行的代碼)
現(xiàn)在,我們來看看這家餐廳的「崗位要求」:
主機(jī)(Host)
智能體運(yùn)行的環(huán)境。類比餐廳建筑,在 MCP 中,它是智能體或 LLM 實(shí)際運(yùn)行的位置。如果在本地使用 Ollama,用戶即為主機(jī);若使用 Claude 或 GPT,則 Anthropic 或 OpenAI 為主機(jī)。
客戶端(Client)
負(fù)責(zé)從智能體發(fā)送工具調(diào)用請求的環(huán)境。相當(dāng)于將顧客訂單傳遞至廚房的服務(wù)員。實(shí)際上是智能體運(yùn)行的應(yīng)用程序或接口,客戶端通過 MCP 將工具調(diào)用請求傳遞給服務(wù)器。
服務(wù)器(Server)
類似廚房,存儲各種「食譜」或工具。集中管理工具,使智能體能夠便捷訪問。服務(wù)器可以是本地的(用戶啟動)或遠(yuǎn)程的(由提供工具的公司托管)。服務(wù)器上的工具通常按功能或集成方式分組,例如,所有 Slack 相關(guān)工具可集中于「Slack 服務(wù)器」,或所有消息工具可集中于「消息服務(wù)器」。這種組織方式取決于架構(gòu)設(shè)計和開發(fā)者偏好。
智能體(Agent)
系統(tǒng)的「大腦」,由大語言模型驅(qū)動,決定調(diào)用哪些工具完成任務(wù)。當(dāng)確定需要某工具時,向服務(wù)器發(fā)起請求。智能體無需原生理解 MCP,因?yàn)樗ㄟ^每個工具關(guān)聯(lián)的元數(shù)據(jù)學(xué)習(xí)使用方法。工具關(guān)聯(lián)的元數(shù)據(jù)指導(dǎo)智能體如何調(diào)用工具及執(zhí)行方式。需注意,平臺或智能體必須支持 MCP 才能自動處理工具調(diào)用,否則開發(fā)者需編寫復(fù)雜的轉(zhuǎn)換邏輯,包括從架構(gòu)解析元數(shù)據(jù)、以 MCP 格式形成工具調(diào)用請求、將請求映射至正確函數(shù)、執(zhí)行代碼,并以符合 MCP 的格式將結(jié)果返回給智能體。
工具(Tools)
執(zhí)行具體工作的函數(shù),如調(diào)用 API 或自定義代碼。工具存在于服務(wù)器上,可以是:
- 用戶創(chuàng)建并托管在本地服務(wù)器的自定義工具
- 他人在遠(yuǎn)程服務(wù)器上托管的預(yù)制工具
- 他人創(chuàng)建但用戶在本地服務(wù)器托管的預(yù)制代碼
如何協(xié)同工作
下面詳細(xì)介紹 MCP 的具體工作流程:
服務(wù)器注冊工具:每個工具都需定義名稱、描述、輸入 / 輸出模式及函數(shù)處理程序(執(zhí)行代碼),并注冊到服務(wù)器。這一過程通常通過調(diào)用特定方法或 API,向服務(wù)器聲明「這是一個新工具及其使用方式」。
服務(wù)器暴露元數(shù)據(jù):服務(wù)器啟動或智能體連接時,通過 MCP 協(xié)議暴露工具元數(shù)據(jù)(包括模式和描述)。
智能體發(fā)現(xiàn)工具:智能體通過 MCP 查詢服務(wù)器,了解可用工具集。智能體從工具元數(shù)據(jù)中學(xué)習(xí)如何使用每個工具。這一過程通常在系統(tǒng)啟動時或新工具添加時觸發(fā)。
智能體規(guī)劃工具使用:當(dāng)智能體確定需要某個工具(基于用戶輸入或任務(wù)上下文)時,會按照標(biāo)準(zhǔn)化的 MCP JSON 格式構(gòu)建工具調(diào)用請求,包含工具名稱、符合工具輸入模式的參數(shù)及其他必要元數(shù)據(jù)。客戶端作為傳輸層,通過 HTTP 將 MCP 格式的請求發(fā)送至服務(wù)器。
翻譯層執(zhí)行:翻譯層接收智能體的標(biāo)準(zhǔn)化工具調(diào)用(通過 MCP),將請求映射到服務(wù)器上對應(yīng)的函數(shù),執(zhí)行該函數(shù),將結(jié)果格式化回 MCP 格式,然后發(fā)送回智能體。抽象化 MCP 的框架可以完成所有這些工作,開發(fā)者無需編寫翻譯層邏輯(這聽起來是個令人頭疼的事情)。
MCP Brave 搜索服務(wù)器的 Re-Act 智能體代碼示例
為了理解 MCP 的實(shí)際應(yīng)用效果,我們可以使用 IBM 的 beeAI 框架,該框架原生支持 MCP 并為我們處理轉(zhuǎn)換邏輯。如果你計劃運(yùn)行這段代碼,你需要:
- 克隆 beeAI 框架倉庫以獲取此代碼中使用的輔助類: https://github.com/i-am-bee/beeai-framework ;
- 創(chuàng)建一個免費(fèi)的 Brave 開發(fā)者賬戶并獲取 API 密鑰(有免費(fèi)訂閱可用,需要信用卡);
- 創(chuàng)建一個 OpenAI 開發(fā)者賬戶并生成 API 密鑰;
- 將你的 Brave API 密鑰和 OpenAI 密鑰添加到倉庫 Python 文件夾級別的 .env 文件中;
- 確保你已安裝 npm 并正確設(shè)置了路徑。
示例 .env 文件
示例 mcp_agent.ipynb
1. 導(dǎo)入必要的庫
2. 加載環(huán)境變量并設(shè)置系統(tǒng)路徑(如有需要)
3. 配置日志記錄器
4. 加載輔助函數(shù)如 process_agent_events、observer,并創(chuàng)建 ConsoleReader 實(shí)例
- process_agent_events:處理智能體事件并根據(jù)事件類型(如錯誤、重試、更新)將消息記錄到控制臺。它為每種事件提供有意義的輸出,以幫助跟蹤智能體活動。
- observer:監(jiān)聽來自發(fā)射器的所有事件,并將它們路由到 process_agent_events 進(jìn)行處理和顯示。
- ConsoleReader:管理控制臺輸入 / 輸出,允許用戶交互并通過帶有色彩編碼角色的方式顯示格式化消息。
5. 設(shè)置 Brave API 密鑰和服務(wù)器參數(shù)。
Anthropic 有一個 MCP 服務(wù)器列表:https://modelcontextprotocol.io/examples
6. 創(chuàng)建一個 Brave 工具,它將啟動與 MCP 服務(wù)器的連接,發(fā)現(xiàn)工具,并將發(fā)現(xiàn)的工具返回給智能體,以便它決定對于給定的任務(wù)應(yīng)該調(diào)用哪個工具。
在此情況下,Brave MCP 服務(wù)器上可發(fā)現(xiàn) 2 個工具:
- brave_web_search:執(zhí)行帶分頁和過濾的網(wǎng)頁搜索
- brave_local_search:搜索本地商家和服務(wù)
(可選)檢查與 MCP 服務(wù)器的連接,并在將其提供給智能體之前確保它返回所有可用的工具。
輸出
7. 編寫創(chuàng)建智能體的函數(shù)
- 分配一個 LLM
- 創(chuàng)建一個 brave_tool () 函數(shù)的實(shí)例,并將其分配給 tools 變量
- 創(chuàng)建一個 re-act 智能體,并給它分配選擇的 llm、tools、內(nèi)存(以便它可以進(jìn)行持續(xù)的對話)
- 向 re-act 智能體添加系統(tǒng)提示
注意:您可能會注意到在系統(tǒng)提示詞中添加了一句話:「If you need to use the brave_tool you must use a count of 5.」這是一個臨時解決方案,因?yàn)樵?Brave 服務(wù)器的 index.ts 文件中發(fā)現(xiàn)了一個錯誤。用戶將為該倉庫貢獻(xiàn)代碼來修復(fù)它。
8. 創(chuàng)建主函數(shù)
- 創(chuàng)建智能體
- 與用戶進(jìn)入對話循環(huán),并使用用戶提示和一些配置設(shè)置運(yùn)行智能體。如果用戶輸入「exit」或「quit」,則結(jié)束對話。
輸出:
MCP 憑借網(wǎng)絡(luò)效應(yīng)、標(biāo)準(zhǔn)化優(yōu)勢、降低開發(fā)成本和行業(yè)門檻以及增強(qiáng)互操作性,未來發(fā)展?jié)摿薮?。但它也面臨挑戰(zhàn),包括工具發(fā)現(xiàn)依賴服務(wù)器、新增故障點(diǎn)、治理需求、安全考慮和延遲問題。
隨著技術(shù)的不斷發(fā)展,我們期待 MCP 能夠克服這些挑戰(zhàn),充分發(fā)揮其潛力,為行業(yè)帶來更多價值。