議:AI開(kāi)發(fā)新范式,從工具集成到能力連接)
1. 從“工具集成”到“能力連接”MCP協(xié)議為何成為AI開(kāi)發(fā)新范式最近在折騰AI應(yīng)用開(kāi)發(fā)的朋友可能都注意到了“MCP”這個(gè)詞的熱度。無(wú)論是Claude Code、Cursor還是各種AI Agent框架都在討論如何集成MCP。今天看到FTShare上線了150金融數(shù)據(jù)工具的MCP免費(fèi)開(kāi)放這讓我覺(jué)得是時(shí)候聊聊MCP到底是什么以及它為什么能讓我們調(diào)用工具的方式發(fā)生根本性改變。簡(jiǎn)單來(lái)說(shuō)MCPModel Context Protocol是一個(gè)標(biāo)準(zhǔn)化的協(xié)議它的核心目標(biāo)就一個(gè)讓大語(yǔ)言模型LLM能夠安全、可靠、標(biāo)準(zhǔn)化地調(diào)用外部工具和數(shù)據(jù)。聽(tīng)起來(lái)是不是有點(diǎn)像Function Calling沒(méi)錯(cuò)它們目的相似但實(shí)現(xiàn)路徑和哲學(xué)完全不同。傳統(tǒng)的Function Calling你需要把工具的API接口、參數(shù)格式、返回結(jié)構(gòu)全部硬編碼到你的應(yīng)用代碼或者提示詞里。每增加一個(gè)新工具就得改一次代碼調(diào)試一次兼容性非常繁瑣。而MCP則把工具本身“服務(wù)器化”了。你可以把MCP Server理解為一個(gè)專門為AI模型設(shè)計(jì)的、標(biāo)準(zhǔn)化的“工具驅(qū)動(dòng)包”。這個(gè)Server定義好了工具的名稱、描述、輸入?yún)?shù)和輸出格式。AI客戶端比如Claude Desktop、Cursor只需要按照MCP協(xié)議去“發(fā)現(xiàn)”和“連接”這些Server就能直接使用里面的工具完全不需要關(guān)心工具內(nèi)部是用Python寫(xiě)的還是Go寫(xiě)的調(diào)的是哪個(gè)API。這就好比以前你家裝修每裝一個(gè)電器工具都得專門為它拉一條獨(dú)特的電線、配一個(gè)特殊的插座寫(xiě)適配代碼。而現(xiàn)在有了MCP就像所有電器都統(tǒng)一成了國(guó)標(biāo)插頭MCP協(xié)議你只需要有標(biāo)準(zhǔn)的插座MCP客戶端任何符合標(biāo)準(zhǔn)的電器插上就能用。FTShare這次做的事情就是提供了150多個(gè)金融數(shù)據(jù)領(lǐng)域的“國(guó)標(biāo)電器”并且免費(fèi)給你用。這對(duì)于做量化分析、金融研究或者需要實(shí)時(shí)市場(chǎng)數(shù)據(jù)的開(kāi)發(fā)者來(lái)說(shuō)相當(dāng)于直接獲得了一個(gè)開(kāi)箱即用的強(qiáng)大工具箱。2. 實(shí)戰(zhàn)在Claude Code中配置與使用FTShare金融MCP理論說(shuō)得再多不如親手配置一遍來(lái)得實(shí)在。下面我就以Claude Code或Claude Desktop原理相通為例帶你一步步把FTShare的金融數(shù)據(jù)MCP配置起來(lái)并實(shí)際調(diào)用幾個(gè)工具看看效果。這是理解MCP工作流最直接的方式。2.1 環(huán)境準(zhǔn)備與MCP Server獲取首先你需要一個(gè)支持MCP的客戶端。目前最主流的就是Anthropic官方推出的Claude Desktop桌面版以及深度集成Claude的Cursor編輯器。這里以Claude Desktop為例它的配置更加直觀。安裝Claude Desktop前往Anthropic官網(wǎng)下載并安裝對(duì)應(yīng)你操作系統(tǒng)Windows/macOS的Claude Desktop應(yīng)用。定位配置目錄Claude Desktop的MCP配置通常通過(guò)一個(gè)配置文件來(lái)管理。這個(gè)文件的位置因系統(tǒng)而異macOS:~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:%APPDATA%\Claude\claude_desktop_config.json如果這個(gè)文件不存在你需要手動(dòng)創(chuàng)建它。獲取FTShare MCP Server根據(jù)FTShare官方公告你需要通過(guò)特定的方式獲取他們的MCP Server。通常這可能需要通過(guò)npm安裝一個(gè)包或者從GitHub倉(cāng)庫(kù)克隆。假設(shè)他們提供了一個(gè)npm包ftshare/mcp-server-finance那么你可以在終端執(zhí)行npm install -g ftshare/mcp-server-finance安裝后該包會(huì)提供一個(gè)可執(zhí)行命令或腳本作為MCP Server啟動(dòng)。你需要記下這個(gè)啟動(dòng)命令的路徑或名稱比如可能是ftshare-mcp-server。2.2 編輯Claude Desktop配置文件接下來(lái)編輯或創(chuàng)建上面提到的claude_desktop_config.json文件。這個(gè)文件的核心結(jié)構(gòu)是一個(gè)JSON對(duì)象其中mcpServers字段用來(lái)定義所有你想要連接的MCP Server。一個(gè)典型的配置示例如下{ mcpServers: { ftshare-finance: { command: node, args: [ /usr/local/bin/ftshare-mcp-server ], env: { FTSHARE_API_KEY: your_actual_api_key_here } } } }我們來(lái)拆解一下這個(gè)配置ftshare-finance這是你給這個(gè)Server起的別名可以自定義方便識(shí)別。command啟動(dòng)Server的命令。這里假設(shè)Server是一個(gè)Node.js腳本所以命令是node。args傳遞給命令的參數(shù)。這里指向了全局安裝后Server腳本的路徑。請(qǐng)注意這個(gè)路徑需要根據(jù)你的實(shí)際安裝位置進(jìn)行調(diào)整。你可以通過(guò)which ftshare-mcp-server(macOS/Linux) 或where ftshare-mcp-server(Windows) 來(lái)查找確切路徑。env設(shè)置環(huán)境變量。很多MCP Server需要API Key或其他認(rèn)證信息通常通過(guò)環(huán)境變量傳入。這里假設(shè)FTShare的Server需要FTSHARE_API_KEY。你需要將your_actual_api_key_here替換為你在FTShare平臺(tái)獲取的真實(shí)API Key。如果FTShare當(dāng)前免費(fèi)且無(wú)需Key則可能不需要這個(gè)env字段。注意配置文件的路徑和格式必須絕對(duì)準(zhǔn)確。一個(gè)常見(jiàn)的錯(cuò)誤是JSON格式不對(duì)比如多了或少了一個(gè)逗號(hào)這會(huì)導(dǎo)致Claude Desktop完全無(wú)法讀取配置。建議使用支持JSON語(yǔ)法高亮的編輯器如VSCode來(lái)編輯并利用其格式化功能。2.3 驗(yàn)證與使用保存配置文件后完全重啟Claude Desktop應(yīng)用不是關(guān)閉聊天窗口而是退出整個(gè)應(yīng)用再重新打開(kāi)。這是關(guān)鍵一步因?yàn)榕渲弥辉趩?dòng)時(shí)加載。重啟后新建一個(gè)對(duì)話。如果你配置成功Claude應(yīng)該會(huì)自動(dòng)感知到新連接的工具。你可以嘗試用自然語(yǔ)言詢問(wèn)例如“查看一下貴州茅臺(tái)的實(shí)時(shí)股價(jià)。”“獲取上證指數(shù)最近5天的日K線數(shù)據(jù)。”“搜索一下新能源汽車行業(yè)的最新研報(bào)。”Claude在理解你的意圖后會(huì)自動(dòng)調(diào)用FTShare MCP Server中對(duì)應(yīng)的工具比如get_realtime_quoteget_historical_datasearch_research_reports并將結(jié)果返回給你。你會(huì)在Claude的回復(fù)中看到它執(zhí)行了某個(gè)“工具調(diào)用”并附上結(jié)構(gòu)化的數(shù)據(jù)結(jié)果。實(shí)操心得第一次配置時(shí)最容易出問(wèn)題的地方就是Server啟動(dòng)命令的路徑和環(huán)境變量。如果Claude沒(méi)有任何反應(yīng)或者提示找不到工具首先去檢查Claude Desktop的應(yīng)用日志。在macOS上你可以通過(guò)Console.app查看在Windows上日志可能位于%APPDATA%\Claude\logs。日志里通常會(huì)明確告訴你MCP Server啟動(dòng)失敗的原因比如“命令未找到”或“API Key無(wú)效”。3. 深入拆解MCP協(xié)議的核心組件與通信機(jī)制理解了怎么用我們?cè)賮?lái)深入看看MCP是怎么工作的。這有助于你在遇到復(fù)雜情況時(shí)能夠自己進(jìn)行排查甚至未來(lái)創(chuàng)建自己的MCP Server。MCP協(xié)議主要包含三個(gè)核心角色和一套基于JSON-RPC的通信機(jī)制。3.1 核心三要素Server Client與TransportMCP Server服務(wù)器這就是工具的提供方比如FTShare的金融數(shù)據(jù)服務(wù)。它的職責(zé)是聲明能力在初始化時(shí)告訴Client“我有哪些工具可用”。每個(gè)工具都有唯一的名稱、詳細(xì)描述、嚴(yán)格的輸入?yún)?shù)模式JSON Schema和輸出格式。處理請(qǐng)求當(dāng)Client發(fā)起工具調(diào)用請(qǐng)求時(shí)Server執(zhí)行實(shí)際的后端邏輯比如調(diào)用金融數(shù)據(jù)API、查詢數(shù)據(jù)庫(kù)、執(zhí)行計(jì)算。返回結(jié)果將執(zhí)行結(jié)果按照約定的格式返回給Client。 Server可以是一個(gè)長(zhǎng)期運(yùn)行的守護(hù)進(jìn)程也可以是按需啟動(dòng)的腳本。MCP Client客戶端這是AI模型的前端界面比如Claude Desktop、Cursor編輯器。它的職責(zé)是發(fā)現(xiàn)與連接根據(jù)配置啟動(dòng)或連接到指定的MCP Server。管理工具列表從所有已連接的Server那里收集工具列表并將其“上下文”提供給AI模型。模型在生成回復(fù)時(shí)就知道有哪些工具可以調(diào)用。代理調(diào)用當(dāng)模型決定使用某個(gè)工具時(shí)Client負(fù)責(zé)按照MCP協(xié)議格式向?qū)?yīng)的Server發(fā)送調(diào)用請(qǐng)求并將結(jié)果返回給模型用于組織最終回復(fù)。Transport傳輸層這是Server和Client之間通信的管道。MCP協(xié)議設(shè)計(jì)上不綁定于某種特定的傳輸方式常見(jiàn)的有stdio標(biāo)準(zhǔn)輸入輸出最常用的方式。Client通過(guò)命令行啟動(dòng)Server進(jìn)程兩者通過(guò)標(biāo)準(zhǔn)輸入(stdin)和標(biāo)準(zhǔn)輸出(stdout)交換JSON-RPC消息。上面Claude Desktop的配置就是這種方式。優(yōu)點(diǎn)是簡(jiǎn)單、跨平臺(tái)適合大多數(shù)本地工具。HTTP/SSEServer作為一個(gè)HTTP服務(wù)運(yùn)行Client通過(guò)HTTP請(qǐng)求或Server-Sent Events與之通信。這種方式更適合遠(yuǎn)程服務(wù)或需要更高并發(fā)能力的場(chǎng)景。3.2 基于JSON-RPC的通信流程MCP在傳輸層之上使用JSON-RPC 2.0作為消息協(xié)議。整個(gè)交互流程可以簡(jiǎn)化為以下幾步初始化握手Client啟動(dòng)Server后雙方會(huì)交換initialize和initialized消息協(xié)商協(xié)議版本等基本信息。工具列表同步Client向Server發(fā)送tools/list請(qǐng)求。Server回復(fù)一個(gè)包含所有可用工具定義的列表。這是最關(guān)鍵的一步Client由此知道能干什么。工具調(diào)用當(dāng)AI模型需要時(shí)Client向Server發(fā)送tools/call請(qǐng)求其中包含工具名稱和調(diào)用參數(shù)。結(jié)果返回Server執(zhí)行完畢通過(guò)tools/call的響應(yīng)返回執(zhí)行結(jié)果成功或錯(cuò)誤信息。資源管理可選MCP還支持“資源”Resources和“提示模板”P(pán)rompts的概念。Server可以聲明一些只讀的數(shù)據(jù)資源比如一個(gè)參考文檔的URI或可復(fù)用的提示模板Client可以讀取resources/listresources/read或獲取模板prompts/listprompts/get進(jìn)一步豐富模型的上下文。為什么是JSON-RPC因?yàn)樗且粋€(gè)輕量級(jí)、語(yǔ)言無(wú)關(guān)的遠(yuǎn)程調(diào)用協(xié)議。無(wú)論是用Python、JavaScript、Go還是Rust編寫(xiě)的Server只要按照同樣的JSON格式收發(fā)消息就能被任何Client理解。這種標(biāo)準(zhǔn)化極大地降低了生態(tài)建設(shè)的門檻。4. MCP與Function Calling、Skill的橫向?qū)Ρ扰c選型思考現(xiàn)在AI調(diào)用外部能力的方式不止一種除了MCP你可能還經(jīng)常聽(tīng)到Function Calling和像cursor-agent里提到的Skill。它們之間有什么區(qū)別又該如何選擇呢4.1 與Function Calling的對(duì)比Function Calling本質(zhì)上是LLM原生能力的一部分。你需要在請(qǐng)求LLM API時(shí)在消息體中附帶一個(gè)tools或functions數(shù)組里面詳細(xì)描述每個(gè)函數(shù)的名稱、描述和參數(shù)模式。LLM在生成回復(fù)時(shí)如果認(rèn)為需要調(diào)用函數(shù)就會(huì)在響應(yīng)中返回一個(gè)特殊的結(jié)構(gòu)指示應(yīng)該調(diào)用哪個(gè)函數(shù)以及參數(shù)是什么然后由你的應(yīng)用程序去執(zhí)行對(duì)應(yīng)的代碼。MCP的優(yōu)勢(shì)解耦與標(biāo)準(zhǔn)化工具的實(shí)現(xiàn)和AI客戶端完全解耦。工具開(kāi)發(fā)者只需要維護(hù)一個(gè)符合MCP協(xié)議的Server就可以被所有支持MCP的客戶端使用。無(wú)需為每個(gè)客戶端Claude, Cursor, 其他Agent框架單獨(dú)做適配。動(dòng)態(tài)發(fā)現(xiàn)工具列表是在運(yùn)行時(shí)動(dòng)態(tài)獲取的無(wú)需在應(yīng)用代碼中硬編碼。添加或移除工具只需要重啟Client連接新的Server無(wú)需修改Client的源碼。安全性Server運(yùn)行在獨(dú)立的進(jìn)程或環(huán)境中與AI客戶端隔離。即使某個(gè)Server出現(xiàn)問(wèn)題如內(nèi)存泄漏、崩潰也不容易拖垮主Client。Function Calling的優(yōu)勢(shì)零延遲由于函數(shù)定義和調(diào)用邏輯都在你的應(yīng)用程序內(nèi)部沒(méi)有進(jìn)程間通信的開(kāi)銷速度最快。深度集成函數(shù)可以直接訪問(wèn)應(yīng)用的內(nèi)存狀態(tài)、數(shù)據(jù)庫(kù)連接等實(shí)現(xiàn)更緊密的集成。簡(jiǎn)單場(chǎng)景更直接如果你只是為自己的單一應(yīng)用添加幾個(gè)固定的工具使用Function Calling可能更簡(jiǎn)單直接不需要引入MCP的復(fù)雜度。簡(jiǎn)單比喻Function Calling像是你家的定制家具工具直接固定在房子里應(yīng)用代碼里。MCP像是標(biāo)準(zhǔn)接口的智能家電工具通過(guò)統(tǒng)一的智能插座MCP協(xié)議接入全屋智能系統(tǒng)AI客戶端。4.2 與Skill的對(duì)比“Skill”這個(gè)概念在不同框架中含義不同。在一些AI Agent框架如LangChain的Agent里Skill可能指的是一組預(yù)定義的工具鏈或復(fù)雜流程。而在Cursor的上下文中“Skill”可能更接近一種增強(qiáng)提示詞或特定工作流的封裝。MCP vs. SkillMCP是協(xié)議層它解決的是“如何讓AI安全、標(biāo)準(zhǔn)地調(diào)用任意外部功能”的基礎(chǔ)設(shè)施問(wèn)題。它不關(guān)心這個(gè)功能是簡(jiǎn)單查詢還是復(fù)雜流程。Skill是應(yīng)用層它建立在協(xié)議或基礎(chǔ)工具之上封裝了解決特定領(lǐng)域問(wèn)題如“代碼審查”、“數(shù)據(jù)庫(kù)查詢優(yōu)化”的完整邏輯、提示詞和工具組合。一個(gè)Skill內(nèi)部可能會(huì)調(diào)用多個(gè)MCP工具。關(guān)系可以認(rèn)為MCP提供了磚塊和水泥標(biāo)準(zhǔn)化工具而Skill是用這些材料建造出來(lái)的功能房間。MCP使得構(gòu)建Skill變得更加容易和標(biāo)準(zhǔn)化。選型建議如果你是工具/數(shù)據(jù)服務(wù)提供商像FTShare希望你的能力能被廣泛集成到各種AI應(yīng)用中那么開(kāi)發(fā)一個(gè)MCP Server是最佳選擇一勞永逸。如果你在構(gòu)建一個(gè)具體的AI應(yīng)用需要集成一些外部能力并且希望保持架構(gòu)的靈活性和未來(lái)可擴(kuò)展性優(yōu)先選擇集成MCP Client來(lái)連接現(xiàn)有的MCP Server。如果你需要封裝一個(gè)非常特定、復(fù)雜的AI工作流并且主要在某個(gè)特定框架如Cursor內(nèi)使用那么研究該框架的Skill機(jī)制可能更合適。如果你的需求極其簡(jiǎn)單、固定且對(duì)延遲敏感直接使用模型原生的Function Calling可能是最快捷的方案。5. 擴(kuò)展探索MCP生態(tài)中的其他熱門Server與配置踩坑FTShare的金融MCP是一個(gè)垂直領(lǐng)域的優(yōu)秀例子。實(shí)際上MCP生態(tài)正在快速成長(zhǎng)涌現(xiàn)出許多解決通用問(wèn)題的Server了解它們能極大提升你的AI生產(chǎn)力。5.1 值得關(guān)注的MCP Server類型搜索類如tavily-mcp,brave-search-mcp。它們?yōu)锳I提供了聯(lián)網(wǎng)搜索能力是克服大模型信息陳舊問(wèn)題的關(guān)鍵。配置時(shí)通常需要申請(qǐng)對(duì)應(yīng)的搜索API Key。代碼倉(cāng)庫(kù)類如git-mcp。允許AI直接讀取、分析Git倉(cāng)庫(kù)的代碼結(jié)構(gòu)、提交歷史甚至進(jìn)行簡(jiǎn)單的代碼操作非常適合代碼審查和項(xiàng)目理解。數(shù)據(jù)庫(kù)類如sqlite-mcp。讓AI能夠連接并查詢數(shù)據(jù)庫(kù)。這里有一個(gè)大坑很多教程會(huì)教你配置command: npx -y modelcontextprotocol/server-sqlite然后args: [“/path/to/your.db”]。但如果你在Windows上路徑中的反斜杠和空格可能會(huì)引發(fā)解析錯(cuò)誤。更可靠的做法是用一個(gè)批處理腳本或PowerShell腳本包裝一下或者在配置中使用正斜杠/并確保路徑用雙引號(hào)包裹。瀏覽器自動(dòng)化類如playwright-mcp。賦予AI操控瀏覽器如Chrome的能力可以自動(dòng)填寫(xiě)表單、抓取動(dòng)態(tài)渲染的網(wǎng)頁(yè)內(nèi)容等功能強(qiáng)大但需謹(jǐn)慎授權(quán)。設(shè)計(jì)工具類如figma-mcp。允許AI讀取Figma設(shè)計(jì)稿的信息是實(shí)現(xiàn)“設(shè)計(jì)稿轉(zhuǎn)代碼”或“根據(jù)AI描述修改設(shè)計(jì)”的橋梁。有用戶反饋“還原度低”這往往是因?yàn)镕igma API返回的是抽象的節(jié)點(diǎn)樹(shù)和樣式數(shù)據(jù)如何精準(zhǔn)地映射到前端代碼如CSS-in-JS、Tailwind類名是一個(gè)復(fù)雜的工程問(wèn)題并非MCP協(xié)議本身之過(guò)。筆記知識(shí)庫(kù)類如obsidian-mcp。將你的Obsidian筆記庫(kù)暴露給AI使其能基于你的個(gè)人知識(shí)進(jìn)行問(wèn)答和創(chuàng)作實(shí)現(xiàn)真正的“第二大腦”聯(lián)動(dòng)。5.2 常見(jiàn)配置問(wèn)題與排查指南在配置各種MCP Server時(shí)我踩過(guò)不少坑這里總結(jié)幾個(gè)高頻問(wèn)題問(wèn)題一Claude Desktop重啟后配置不生效檢查點(diǎn)首先確認(rèn)配置文件路徑和名稱絕對(duì)正確。其次配置文件必須是有效的JSON。一個(gè)多余的逗號(hào)或缺失的引號(hào)都會(huì)導(dǎo)致整個(gè)文件被忽略。使用在線JSON校驗(yàn)工具或編輯器的Lint功能檢查。檢查點(diǎn)查看Claude Desktop的日志。這是最直接的排錯(cuò)方式里面會(huì)記錄加載配置時(shí)遇到的錯(cuò)誤或者啟動(dòng)MCP Server失敗的原因。問(wèn)題二MCP Server啟動(dòng)失敗提示“命令未找到”場(chǎng)景這在Windows上尤其常見(jiàn)。你的command配置的是node但系統(tǒng)PATH環(huán)境變量里可能沒(méi)有node或者你用的是node.exe。解決在命令行中直接輸入你配置的command看是否能識(shí)別。如果不能需要使用絕對(duì)路徑。例如在Windows上command可能是C:\\Program Files\\nodejs\\node.exe。對(duì)于通過(guò)npm全局安裝的包其可執(zhí)行文件路徑也可能不在默認(rèn)PATH中同樣需要配置絕對(duì)路徑。問(wèn)題三工具列表可見(jiàn)但調(diào)用時(shí)失敗權(quán)限錯(cuò)誤、網(wǎng)絡(luò)錯(cuò)誤場(chǎng)景Claude能列出FTShare的工具但調(diào)用“獲取股價(jià)”時(shí)失敗。排查這通常是MCP Server自身的問(wèn)題。首先檢查配置中env部分傳入的API_KEY等環(huán)境變量是否正確。其次嘗試在終端手動(dòng)以相同命令和環(huán)境變量啟動(dòng)這個(gè)MCP Server看它是否能獨(dú)立運(yùn)行并響應(yīng)測(cè)試請(qǐng)求。很多Server提供測(cè)試模式或健康檢查端點(diǎn)。問(wèn)題四多個(gè)MCP Server沖突場(chǎng)景配置了多個(gè)Server后某個(gè)工具無(wú)法使用或Client行為異常。排查檢查是否有不同Server提供了同名工具這可能會(huì)引起混淆。暫時(shí)注釋掉其他Server的配置單獨(dú)測(cè)試有問(wèn)題的Server以確定沖突源。一個(gè)高級(jí)技巧對(duì)于復(fù)雜的、需要多個(gè)步驟啟動(dòng)的Server或者需要在調(diào)用前后做一些預(yù)處理/后處理的可以編寫(xiě)一個(gè)簡(jiǎn)單的包裝腳本Shell腳本或批處理文件。在MCP配置中command指向這個(gè)包裝腳本然后在腳本內(nèi)部去設(shè)置環(huán)境變量、啟動(dòng)真正的Server進(jìn)程。這能極大提升配置的靈活性和可維護(hù)性。6. 從使用到創(chuàng)造如何規(guī)劃與開(kāi)發(fā)自己的MCP Server當(dāng)你充分體驗(yàn)了MCP帶來(lái)的便利后很可能會(huì)萌生一個(gè)想法我能不能把自己的內(nèi)部工具或服務(wù)也封裝成MCP Server讓團(tuán)隊(duì)內(nèi)的AI都能方便調(diào)用答案是肯定的而且開(kāi)發(fā)一個(gè)基礎(chǔ)MCP Server的門檻并不高。6.1 核心開(kāi)發(fā)思路與工具選型開(kāi)發(fā)一個(gè)MCP Server本質(zhì)上就是創(chuàng)建一個(gè)遵循JSON-RPC 2.0和MCP協(xié)議規(guī)范的程序。你需要處理以下幾件事實(shí)現(xiàn)協(xié)議消息處理解析Client發(fā)來(lái)的initializetools/listtools/call等請(qǐng)求并按照規(guī)范格式返回響應(yīng)。定義工具明確你的Server提供哪些工具每個(gè)工具需要什么參數(shù)用JSON Schema定義以及返回什么格式的數(shù)據(jù)。實(shí)現(xiàn)工具邏輯當(dāng)收到tools/call請(qǐng)求時(shí)執(zhí)行實(shí)際的操作比如調(diào)用一個(gè)內(nèi)部API、運(yùn)行一個(gè)計(jì)算、查詢數(shù)據(jù)庫(kù)等。幸運(yùn)的是社區(qū)已經(jīng)提供了多種語(yǔ)言的SDK來(lái)幫你處理底層的協(xié)議通信讓你可以專注于工具邏輯本身。TypeScript/JavaScript使用官方modelcontextprotocol/sdk包。這是目前生態(tài)最繁榮的選擇文檔和示例也最全。它提供了高級(jí)API讓你通過(guò)聲明式的方式定義工具和資源非常簡(jiǎn)單。npm install modelcontextprotocol/sdkPython使用mcp包。對(duì)于Python技術(shù)棧的團(tuán)隊(duì)來(lái)說(shuō)非常友好。pip install mcp其他語(yǔ)言Go、Rust、Java等語(yǔ)言的SDK也在逐步完善中可以在MCP官方GitHub倉(cāng)庫(kù)找到。6.2 一個(gè)簡(jiǎn)單的Python MCP Server示例假設(shè)我們要?jiǎng)?chuàng)建一個(gè)提供“天氣查詢”和“單位換算”兩個(gè)簡(jiǎn)單工具的Server。# weather_converter_server.py import asyncio from typing import Any import mcp.server as mcp from mcp.server.models import InitializationOptions import httpx # 創(chuàng)建Server實(shí)例 server mcp.Server(example-weather-converter) # 1. 定義工具 server.list_tools() async def handle_list_tools() - list[mcp.Tool]: return [ mcp.Tool( nameget_weather, description獲取指定城市的當(dāng)前天氣, inputSchema{ type: object, properties: { city: {type: string, description: 城市名稱如北京} }, required: [city] } ), mcp.Tool( nameconvert_units, description進(jìn)行常用單位換算, inputSchema{ type: object, properties: { value: {type: number, description: 要換算的數(shù)值}, from_unit: {type: string, description: 原單位如km}, to_unit: {type: string, description: 目標(biāo)單位如mile} }, required: [value, from_unit, to_unit] } ) ] # 2. 實(shí)現(xiàn)工具調(diào)用邏輯 server.call_tool() async def handle_call_tool(name: str, arguments: dict[str, Any]) - list[mcp.TextContent]: if name get_weather: city arguments[city] # 模擬一個(gè)API調(diào)用 async with httpx.AsyncClient() as client: # 這里應(yīng)替換為真實(shí)的天氣API # response await client.get(fhttps://api.weather.com/...{city}) # data response.json() data {temperature: 22, condition: 晴朗, humidity: 65} return [mcp.TextContent( typetext, textf城市{city}的天氣溫度{data[temperature]}°C{data[condition]}濕度{data[humidity]}%。 )] elif name convert_units: value arguments[value] from_unit arguments[from_unit] to_unit arguments[to_unit] # 簡(jiǎn)單的換算邏輯 conversions { (km, mile): 0.621371, (mile, km): 1.60934, (kg, lb): 2.20462, (lb, kg): 0.453592, } factor conversions.get((from_unit, to_unit)) if factor: result value * factor return [mcp.TextContent( typetext, textf{value} {from_unit} {result:.2f} {to_unit} )] else: return [mcp.TextContent(typetext, textf不支持從{from_unit}到{to_unit}的換算。)] else: raise ValueError(f未知工具: {name}) # 3. 啟動(dòng)Server使用stdio傳輸 async def main(): async with server.run_stdio(): await asyncio.Future() # 永久運(yùn)行 if __name__ __main__: asyncio.run(main())這個(gè)示例展示了MCP Server的核心結(jié)構(gòu)定義工具列表并實(shí)現(xiàn)對(duì)應(yīng)的調(diào)用處理器。你可以用以下配置在Claude Desktop中連接它{ mcpServers: { my-python-server: { command: python, args: [/絕對(duì)路徑/weather_converter_server.py] } } }開(kāi)發(fā)注意事項(xiàng)錯(cuò)誤處理在handle_call_tool中務(wù)必做好異常捕獲并返回格式化的錯(cuò)誤信息而不是讓進(jìn)程崩潰。資源清理如果工具調(diào)用涉及網(wǎng)絡(luò)連接、文件句柄等確保在使用后正確關(guān)閉。安全性這是重中之重。你的Server可能被AI客戶端調(diào)用而AI生成的參數(shù)可能是不可預(yù)測(cè)的。必須對(duì)輸入?yún)?shù)進(jìn)行嚴(yán)格的驗(yàn)證和清理防止注入攻擊。例如如果工具涉及數(shù)據(jù)庫(kù)查詢絕對(duì)不要直接將用戶輸入拼接成SQL。性能工具邏輯應(yīng)盡可能高效避免長(zhǎng)時(shí)間阻塞。如果是IO密集型操作使用異步。從FTShare開(kāi)放金融MCP這件事我們可以看到MCP協(xié)議正在從一個(gè)小眾的開(kāi)發(fā)者協(xié)議迅速成長(zhǎng)為連接AI模型與現(xiàn)實(shí)世界能力的“USB-C接口”。它帶來(lái)的標(biāo)準(zhǔn)化和生態(tài)化潛力是巨大的。對(duì)于開(kāi)發(fā)者而言現(xiàn)在正是學(xué)習(xí)和擁抱這套范式的好時(shí)機(jī)。無(wú)論是通過(guò)配置現(xiàn)有Server來(lái)增強(qiáng)你的AI助手還是著手將內(nèi)部能力封裝成Server以提升團(tuán)隊(duì)效率MCP都提供了一個(gè)清晰、高效的路徑。