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