議構(gòu)建天氣查詢(xún)工具:從原理到Node.js實(shí)戰(zhàn))
1. 項(xiàng)目概述為什么從MCP天氣查詢(xún)工具入手最近和幾個(gè)做AI應(yīng)用開(kāi)發(fā)的朋友聊天發(fā)現(xiàn)大家不約而同地都在研究一個(gè)叫“模型上下文協(xié)議”的東西也就是MCP。這玩意兒聽(tīng)起來(lái)挺高大上但說(shuō)白了它就像給大語(yǔ)言模型比如ChatGPT、Claude裝上了一套標(biāo)準(zhǔn)化的“手”和“眼睛”。模型本身是個(gè)聰明的“大腦”但它沒(méi)法直接操作電腦、讀取文件、查詢(xún)網(wǎng)絡(luò)數(shù)據(jù)。MCP就是定義了一套標(biāo)準(zhǔn)方法讓“大腦”可以安全、可控地指揮“手”去執(zhí)行具體任務(wù)。那為什么選擇從“天氣查詢(xún)”這個(gè)工具開(kāi)始呢原因很簡(jiǎn)單它是一個(gè)絕佳的MCP入門(mén)練手項(xiàng)目。首先它的業(yè)務(wù)邏輯清晰——輸入地點(diǎn)返回天氣信息。其次它涉及了MCP最核心的幾個(gè)概念工具Tools的定義、服務(wù)器Server的實(shí)現(xiàn)、以及客戶端Client的調(diào)用。最后它需要與外部API天氣服務(wù)交互這正好體現(xiàn)了MCP“連接模型與現(xiàn)實(shí)世界”的核心價(jià)值。通過(guò)親手實(shí)現(xiàn)一個(gè)天氣查詢(xún)MCP工具你能把MCP的抽象概念迅速具象化理解數(shù)據(jù)是如何在模型、MCP服務(wù)器和外部服務(wù)之間流轉(zhuǎn)的。這比你讀十篇文檔都管用。2. 核心概念與工具選型構(gòu)建MCP的基石在動(dòng)手寫(xiě)代碼之前我們必須把幾個(gè)關(guān)鍵概念和工具理清楚。這就像蓋房子前得先認(rèn)識(shí)磚瓦和圖紙。2.1 MCP的三層架構(gòu)Server, Client ToolsMCP的架構(gòu)非常清晰主要包含三層MCP Server服務(wù)器這是你將要編寫(xiě)的核心部分。它對(duì)外暴露一組定義好的“工具”Tools。你可以把它想象成一個(gè)“技能提供者”。在我們的天氣項(xiàng)目中這個(gè)服務(wù)器就提供了一個(gè)叫g(shù)et_weather的工具。MCP Client客戶端這是與大語(yǔ)言模型如Claude Desktop、Cursor等集成的部分。客戶端負(fù)責(zé)與MCP Server建立連接獲取可用的工具列表并在模型需要時(shí)代表模型去調(diào)用服務(wù)器上的工具??蛻舳送ǔS葾I應(yīng)用平臺(tái)提供我們不需要從頭寫(xiě)。Tools工具這是MCP協(xié)議中定義的“能力單元”。每個(gè)工具都有明確的名稱(chēng)、描述、輸入?yún)?shù)input_schema和輸出。模型的“大腦”通過(guò)閱讀工具的描述來(lái)決定在什么時(shí)候、使用什么參數(shù)來(lái)調(diào)用它。對(duì)于我們開(kāi)發(fā)者而言核心工作就是實(shí)現(xiàn)一個(gè)MCP Server并在其中定義好我們想讓模型使用的工具。2.2 為什么選擇Node.js和官方SDK實(shí)現(xiàn)MCP Server有多種語(yǔ)言選擇比如Python、TypeScript等。這里我強(qiáng)烈推薦使用TypeScript (Node.js)并結(jié)合modelcontextprotocol/sdk這個(gè)官方SDK。理由如下官方背書(shū)與活躍度這是由AnthropicClaude的創(chuàng)造者官方維護(hù)的SDK更新及時(shí)與協(xié)議標(biāo)準(zhǔn)同步性最好遇到問(wèn)題也容易找到答案。開(kāi)發(fā)體驗(yàn)優(yōu)秀TypeScript提供了完善的類(lèi)型提示SDK的封裝讓建立連接、定義工具、處理請(qǐng)求變得非常直觀能避免很多低級(jí)錯(cuò)誤。生態(tài)成熟Node.js的異步和非阻塞I/O特性非常適合處理MCP這種多請(qǐng)求、需要調(diào)用外部網(wǎng)絡(luò)API的場(chǎng)景。NPM上有海量的包可以輔助開(kāi)發(fā)比如我們馬上會(huì)用到的axios。注意雖然Python也有社區(qū)實(shí)現(xiàn)的庫(kù)但就目前的穩(wěn)定性和文檔完整性來(lái)看官方的Node.js SDK是新手入門(mén)阻力最小的選擇。2.3 天氣數(shù)據(jù)源的選擇與考量工具的核心是數(shù)據(jù)。為天氣查詢(xún)工具選擇一個(gè)可靠、免費(fèi)或低成本、易于使用的數(shù)據(jù)源至關(guān)重要。這里有幾個(gè)常見(jiàn)選項(xiàng)OpenWeatherMap老牌服務(wù)提供免費(fèi)層每分鐘60次調(diào)用數(shù)據(jù)全面文檔清晰。免費(fèi)層需要注冊(cè)獲取API Key。WeatherAPI另一個(gè)流行的選擇免費(fèi)層額度也不錯(cuò)提供多種數(shù)據(jù)。和風(fēng)天氣國(guó)內(nèi)如果你主要查詢(xún)國(guó)內(nèi)地點(diǎn)這是個(gè)非常優(yōu)秀的選擇中文支持好免費(fèi)額度足夠個(gè)人開(kāi)發(fā)使用。我個(gè)人的選擇是 OpenWeatherMap。原因在于其國(guó)際覆蓋廣API設(shè)計(jì)規(guī)范社區(qū)資源多遇到問(wèn)題容易搜索到解決方案。我們接下來(lái)的實(shí)現(xiàn)也將以它為例。關(guān)鍵一步請(qǐng)立即去 OpenWeatherMap官網(wǎng) 注冊(cè)一個(gè)免費(fèi)賬戶獲取你的API Key。這個(gè)Key將用于在代碼中認(rèn)證你的請(qǐng)求。3. 手把手實(shí)現(xiàn)MCP天氣查詢(xún)服務(wù)器理論鋪墊完畢現(xiàn)在進(jìn)入實(shí)戰(zhàn)環(huán)節(jié)。請(qǐng)確保你的開(kāi)發(fā)環(huán)境已經(jīng)安裝了Node.js (版本18或以上)和npm。3.1 項(xiàng)目初始化與依賴(lài)安裝首先創(chuàng)建一個(gè)新的項(xiàng)目目錄并初始化mkdir mcp-weather-server cd mcp-weather-server npm init -y接著安裝我們需要的核心依賴(lài)npm install modelcontextprotocol/sdk axios npm install --save-dev typescript ts-node types/nodemodelcontextprotocol/sdk MCP官方SDK。axios 一個(gè)優(yōu)秀的HTTP客戶端用于調(diào)用OpenWeatherMap的API。typescript,ts-node,types/node 用于TypeScript開(kāi)發(fā)和執(zhí)行。然后初始化TypeScript配置npx tsc --init你可以根據(jù)需要修改生成的tsconfig.json一個(gè)簡(jiǎn)單的可用于快速啟動(dòng)的配置如下{ compilerOptions: { target: ES2022, module: commonjs, outDir: ./dist, rootDir: ./src, strict: true, esModuleInterop: true, skipLibCheck: true, forceConsistentCasingInFileNames: true }, include: [src/**/*], exclude: [node_modules] }創(chuàng)建源代碼目錄和入口文件mkdir src touch src/index.ts3.2 構(gòu)建MCP服務(wù)器骨架現(xiàn)在打開(kāi)src/index.ts開(kāi)始編寫(xiě)服務(wù)器的核心代碼。我們先從導(dǎo)入依賴(lài)和搭建基礎(chǔ)結(jié)構(gòu)開(kāi)始import { Server } from modelcontextprotocol/sdk/server/index.js; import { StdioServerTransport } from modelcontextprotocol/sdk/server/stdio.js; import axios from axios; // 1. 定義工具Tool的輸入?yún)?shù)結(jié)構(gòu) // 這告訴MCP客戶端和模型調(diào)用get_weather工具時(shí)需要提供一個(gè)location字符串參數(shù)。 const WEATHER_TOOL { name: get_weather, description: 獲取指定城市或地區(qū)的當(dāng)前天氣信息。, inputSchema: { type: object, properties: { location: { type: string, description: 城市或地區(qū)名稱(chēng)例如: Beijing, London, Tokyo, }, }, required: [location], }, }; // 2. 創(chuàng)建MCP服務(wù)器實(shí)例 // WeatherServer 是我們給這個(gè)服務(wù)器起的名字。 const server new Server( { name: WeatherServer, version: 1.0.0, }, { capabilities: { tools: {}, // 這里先留空我們會(huì)在后面動(dòng)態(tài)添加工具處理邏輯 }, } );3.3 實(shí)現(xiàn)工具處理邏輯這是服務(wù)器的“大腦”。我們需要告訴服務(wù)器當(dāng)get_weather工具被調(diào)用時(shí)具體要執(zhí)行什么操作。// 3. 設(shè)置工具處理函數(shù) server.setRequestHandler(tools/call, async (request) { // 檢查被調(diào)用的工具名稱(chēng)是否是我們定義的get_weather if (request.params.name WEATHER_TOOL.name) { const location (request.params.arguments as any).location; if (!location) { throw new Error(Location parameter is required.); } // 你的OpenWeatherMap API Key務(wù)必替換成你自己的 const API_KEY YOUR_OPENWEATHERMAP_API_KEY_HERE; // 使用標(biāo)準(zhǔn)單位攝氏度、米/秒等 const url https://api.openweathermap.org/data/2.5/weather?q${encodeURIComponent(location)}appid${API_KEY}unitsmetric; try { // 調(diào)用外部天氣API const response await axios.get(url); const data response.data; // 從API響應(yīng)中提取我們需要的信息 const weatherInfo { location: data.name, country: data.sys.country, temperature: ${data.main.temp}°C, feels_like: ${data.main.feels_like}°C, humidity: ${data.main.humidity}%, pressure: ${data.main.pressure} hPa, weather: data.weather[0].description, wind_speed: ${data.wind.speed} m/s, }; // 將結(jié)果格式化成易讀的文本返回給MCP客戶端最終給到大模型 const contentText 當(dāng)前 ${weatherInfo.location} (${weatherInfo.country}) 的天氣狀況 - 天氣${weatherInfo.weather} - 溫度${weatherInfo.temperature} (體感 ${weatherInfo.feels_like}) - 濕度${weatherInfo.humidity} - 氣壓${weatherInfo.pressure} - 風(fēng)速${weatherInfo.wind_speed} .trim(); return { content: [ { type: text, text: contentText, }, ], }; } catch (error: any) { // 錯(cuò)誤處理網(wǎng)絡(luò)問(wèn)題、城市未找到、API Key無(wú)效等 let errorMessage 無(wú)法獲取天氣信息。; if (axios.isAxiosError(error) error.response) { if (error.response.status 404) { errorMessage 未找到地點(diǎn) ${location}請(qǐng)檢查名稱(chēng)是否正確。; } else if (error.response.status 401) { errorMessage 天氣服務(wù)認(rèn)證失敗請(qǐng)檢查API Key。; } else { errorMessage 天氣服務(wù)返回錯(cuò)誤: ${error.response.status}; } } // 將錯(cuò)誤信息返回模型可以據(jù)此回復(fù)用戶 return { content: [ { type: text, text: 錯(cuò)誤: ${errorMessage}, }, ], isError: true, }; } } // 如果收到其他未知工具的調(diào)用請(qǐng)求拋出錯(cuò)誤 throw new Error(Unknown tool: ${request.params.name}); });3.4 啟動(dòng)服務(wù)器與連接傳輸MCP服務(wù)器需要通過(guò)一種“傳輸”方式與客戶端通信。對(duì)于本地開(kāi)發(fā)調(diào)試最常用、最簡(jiǎn)單的方式是標(biāo)準(zhǔn)輸入輸出stdio。這意味著我們的服務(wù)器將通過(guò)命令行啟動(dòng)并通過(guò)控制臺(tái)的輸入輸出來(lái)與客戶端如Claude Desktop交換數(shù)據(jù)。// 4. 啟動(dòng)服務(wù)器 async function runServer() { // 使用Stdio傳輸這是與桌面客戶端集成的最常見(jiàn)方式 const transport new StdioServerTransport(); await server.connect(transport); console.error(MCP Weather Server is running on stdio...); } // 5. 在服務(wù)器連接前告知客戶端本服務(wù)器提供哪些工具 // 這是關(guān)鍵一步客戶端在連接時(shí)會(huì)請(qǐng)求工具列表。 server.setRequestHandler(tools/list, async () { return { tools: [WEATHER_TOOL], }; }); runServer().catch((error) { console.error(Server fatal error:, error); process.exit(1); });至此一個(gè)完整的MCP天氣查詢(xún)服務(wù)器就編寫(xiě)完成了。你的src/index.ts文件現(xiàn)在應(yīng)該包含了以上所有代碼塊。實(shí)操心得在開(kāi)發(fā)過(guò)程中務(wù)必用你自己的真實(shí)API Key替換YOUR_OPENWEATHERMAP_API_KEY_HERE。一個(gè)常見(jiàn)的錯(cuò)誤是忘記替換或誤將Key提交到公開(kāi)的代碼倉(cāng)庫(kù)這會(huì)導(dǎo)致API調(diào)用失敗或Key泄露。建議使用環(huán)境變量來(lái)管理敏感信息例如process.env.OPENWEATHER_API_KEY。4. 編譯、運(yùn)行與測(cè)試代碼寫(xiě)好了我們得讓它跑起來(lái)并驗(yàn)證是否工作。4.1 編譯TypeScript并運(yùn)行首先編譯TypeScript代碼到JavaScriptnpx tsc這會(huì)在dist目錄下生成index.js文件。更便捷的方式是使用ts-node直接運(yùn)行省去編譯步驟特別適合開(kāi)發(fā)階段npx ts-node src/index.ts如果一切正常你會(huì)看到MCP Weather Server is running on stdio...這條信息輸出到標(biāo)準(zhǔn)錯(cuò)誤流stderr然后程序看起來(lái)就“掛起”了。這是正常的因?yàn)樗诘却齺?lái)自標(biāo)準(zhǔn)輸入stdin的MCP協(xié)議消息。此時(shí)你需要一個(gè)MCP客戶端來(lái)連接它。4.2 使用MCP Inspector進(jìn)行本地測(cè)試在集成到Claude Desktop等大型應(yīng)用之前強(qiáng)烈建議先用一個(gè)輕量級(jí)的調(diào)試工具進(jìn)行測(cè)試。這就是MCP Inspector。全局安裝MCP Inspectornpm install -g modelcontextprotocol/inspector啟動(dòng)Inspector并連接我們的服務(wù)器 我們需要告訴Inspector如何啟動(dòng)我們的服務(wù)器。創(chuàng)建一個(gè)簡(jiǎn)單的配置文件比如server-config.json{ mcpServers: { weather: { command: node, args: [/ABSOLUTE/PATH/TO/YOUR/mcp-weather-server/dist/index.js], env: { NODE_ENV: development } } } }注意args中的路徑必須替換為你項(xiàng)目dist/index.js的絕對(duì)路徑。如果使用ts-nodecommand可以是npxargs可以是[ts-node, /ABSOLUTE/PATH/TO/src/index.ts]。運(yùn)行Inspectormcp-inspector --config ./server-config.json這會(huì)打開(kāi)一個(gè)本地網(wǎng)頁(yè)通常是http://localhost:5173這就是MCP Inspector的界面。在Inspector中測(cè)試工具在Inspector網(wǎng)頁(yè)中你應(yīng)該能在左側(cè)看到連接的weather服務(wù)器。點(diǎn)擊它你會(huì)看到它提供的get_weather工具。在工具面板的輸入框里輸入{location: Beijing}。點(diǎn)擊 “Call Tool”。如果一切配置正確右側(cè)會(huì)顯示來(lái)自O(shè)penWeatherMap API的、格式化的北京天氣信息。成功這證明你的MCP服務(wù)器邏輯正確能夠處理請(qǐng)求、調(diào)用外部API并返回結(jié)果。4.3 集成到Claude Desktop可選但推薦真正的魅力在于讓AI模型使用你的工具。以Claude Desktop為例找到Claude Desktop的配置文件位置。macOS:~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:%APPDATA%\Claude\claude_desktop_config.json編輯這個(gè)JSON文件如果不存在則創(chuàng)建{ mcpServers: { weather: { command: node, args: [/ABSOLUTE/PATH/TO/YOUR/mcp-weather-server/dist/index.js] } } }同樣請(qǐng)?zhí)鎿Q為你的絕對(duì)路徑。如果使用ts-node配置方式同Inspector。重啟Claude Desktop?,F(xiàn)在當(dāng)你和Claude對(duì)話時(shí)你可以直接說(shuō)“幫我查一下東京的天氣?!?Claude會(huì)自動(dòng)識(shí)別出它有一個(gè)get_weather工具可用并在后臺(tái)調(diào)用你的服務(wù)器然后將結(jié)果融入它的回復(fù)中。整個(gè)過(guò)程無(wú)縫銜接用戶感知到的就是Claude“知道”了天氣。5. 進(jìn)階優(yōu)化與問(wèn)題排查實(shí)錄一個(gè)基礎(chǔ)工具跑起來(lái)后我們可以讓它更健壯、更實(shí)用。下面分享幾個(gè)我在實(shí)際開(kāi)發(fā)中總結(jié)的優(yōu)化點(diǎn)和常見(jiàn)坑位。5.1 功能優(yōu)化從基礎(chǔ)查詢(xún)到實(shí)用工具多單位支持讓用戶或模型可以選擇溫度單位攝氏/華氏。修改工具的inputSchema增加一個(gè)unit可選參數(shù)然后在調(diào)用API時(shí)根據(jù)這個(gè)參數(shù)決定units字段是metric還是imperial。位置模糊處理OpenWeatherMap對(duì)某些中文地名支持可能不完美??梢砸胍粋€(gè)地理位置解析服務(wù)如OpenCage Geocoder先將地名轉(zhuǎn)換為經(jīng)緯度再用經(jīng)緯度去查詢(xún)天氣提高準(zhǔn)確率。緩存機(jī)制天氣數(shù)據(jù)變化不頻繁頻繁調(diào)用API會(huì)浪費(fèi)額度且慢??梢砸胍粋€(gè)簡(jiǎn)單的內(nèi)存緩存如node-cache將相同地點(diǎn)的結(jié)果緩存5-10分鐘。更豐富的信息除了當(dāng)前天氣OpenWeatherMap的API還提供預(yù)報(bào)、空氣質(zhì)量等。你可以定義更多工具如get_forecast或者擴(kuò)展當(dāng)前工具的參數(shù)來(lái)返回更多數(shù)據(jù)。5.2 常見(jiàn)問(wèn)題與解決方案速查表問(wèn)題現(xiàn)象可能原因排查步驟與解決方案Inspector/Claude 無(wú)法連接服務(wù)器1. 配置文件路徑錯(cuò)誤。2. Node命令執(zhí)行失敗。3. 服務(wù)器代碼有語(yǔ)法錯(cuò)誤立即崩潰。1.檢查絕對(duì)路徑確保args中的路徑完全正確特別是使用ts-node時(shí)。一個(gè)技巧是先在對(duì)應(yīng)目錄下用命令行手動(dòng)執(zhí)行該命令看是否成功。2.查看日志Claude Desktop會(huì)在其日志文件中記錄MCP服務(wù)器的啟動(dòng)錯(cuò)誤。去上述配置文件的同級(jí)目錄找日志文件。3.獨(dú)立運(yùn)行測(cè)試在項(xiàng)目目錄下直接運(yùn)行node dist/index.js觀察是否有錯(cuò)誤輸出。調(diào)用工具返回“未找到地點(diǎn)”1. 輸入的地點(diǎn)名稱(chēng)API不認(rèn)識(shí)。2. 地點(diǎn)名稱(chēng)含有特殊字符或格式問(wèn)題。1.嘗試英文名用“Beijing”而不是“北京”試試。2.URL編碼確保代碼中使用了encodeURIComponent(location)來(lái)處理輸入。3.提供更具體信息在工具描述中提示用戶輸入“城市名,國(guó)家代碼”格式如“London,GB”。返回“認(rèn)證失敗”1. API Key未設(shè)置或錯(cuò)誤。2. API Key對(duì)應(yīng)的免費(fèi)額度已用盡。1.檢查代碼確認(rèn)API_KEY變量已正確替換。2.訪問(wèn)OpenWeatherMap網(wǎng)站登錄賬號(hào)在控制面板檢查API Key狀態(tài)和調(diào)用次數(shù)。服務(wù)器運(yùn)行后無(wú)響應(yīng)或卡死1. 沒(méi)有正確處理請(qǐng)求或響應(yīng)格式不符合MCP協(xié)議。2.async/await使用不當(dāng)Promise未捕獲。1.使用Inspector調(diào)試Inspector能清晰顯示通信的原始JSON消息對(duì)比MCP協(xié)議文檔檢查你的請(qǐng)求處理器返回的結(jié)構(gòu)是否正確。2.強(qiáng)化錯(cuò)誤處理確保所有可能的異常都被try...catch包裹并返回格式正確的錯(cuò)誤信息給客戶端而不是讓進(jìn)程崩潰或掛起。Claude不主動(dòng)使用工具1. 工具描述不夠清晰。2. 用戶提問(wèn)方式不夠直接。1.優(yōu)化工具描述description字段要寫(xiě)得非常清晰說(shuō)明工具用途、輸入是什么。例如“獲取全球城市的當(dāng)前天氣情況需要提供城市名稱(chēng)?!?.明確指令直接對(duì)Claude說(shuō)“請(qǐng)使用天氣工具查詢(xún)XX的天氣”看它是否會(huì)調(diào)用。這是測(cè)試工具是否成功加載的好方法。5.3 安全與生產(chǎn)環(huán)境考量保護(hù)API Key永遠(yuǎn)不要將硬編碼的API Key提交到Git倉(cāng)庫(kù)。使用環(huán)境變量.env文件配合dotenv包或運(yùn)行時(shí)配置來(lái)管理。輸入驗(yàn)證與清理雖然MCP客戶端和模型會(huì)進(jìn)行初步校驗(yàn)但服務(wù)器端仍應(yīng)對(duì)location參數(shù)進(jìn)行基本的清理和驗(yàn)證防止注入攻擊。限流與配額如果你的工具公開(kāi)使用需要考慮對(duì)調(diào)用頻率進(jìn)行限制防止濫用耗盡你的API免費(fèi)額度。6. 總結(jié)與延伸思考通過(guò)這個(gè)簡(jiǎn)易的MCP天氣查詢(xún)工具項(xiàng)目我們完整走通了一個(gè)MCP Server從概念到實(shí)現(xiàn)、再到測(cè)試集成的全流程。你親手搭建了一個(gè)橋梁讓原本“困在”文本世界的大模型獲得了感知現(xiàn)實(shí)世界天氣的能力。這個(gè)項(xiàng)目的價(jià)值遠(yuǎn)不止于查詢(xún)天氣。它提供了一個(gè)可復(fù)用的范式。下一次當(dāng)你想讓AI模型幫你“讀取某個(gè)GitHub倉(cāng)庫(kù)的最新Issue”、“查詢(xún)數(shù)據(jù)庫(kù)里的用戶數(shù)據(jù)”、“控制家里的智能燈光”時(shí)你只需要做同樣的事情定義一個(gè)工具實(shí)現(xiàn)一個(gè)MCP Server然后將它連接到你的AI助手。我個(gè)人在實(shí)踐中的體會(huì)是MCP最大的魅力在于標(biāo)準(zhǔn)化和生態(tài)。一旦工具按照協(xié)議實(shí)現(xiàn)它就可以被任何支持MCP的客戶端Claude, Cursor, 未來(lái)可能更多的AI應(yīng)用所使用。這意味著你的一次開(kāi)發(fā)可以賦能多個(gè)AI入口。隨著協(xié)議的發(fā)展或許未來(lái)會(huì)出現(xiàn)一個(gè)豐富的“MCP工具商店”開(kāi)發(fā)者可以共享工具用戶則可以像安裝插件一樣為自己AI助手?jǐn)U展各種超能力。從這個(gè)小工具出發(fā)你可以嘗試更復(fù)雜的場(chǎng)景比如一個(gè)需要多步交互的工具先搜索再選擇最后執(zhí)行或者結(jié)合多個(gè)API的工具鏈。MCP的世界剛剛打開(kāi)更多的可能性正等待被構(gòu)建。