2025年10月1日 星期三

[Automation-tool]如何自建MCP server並串接到本地端的n8n工作流中?

 


在當今由大型語言模型(LLM)驅動知識和工具的時代,如何讓LLM能夠有效地結合外部工具和API溝通,成為了自動化流程中的關鍵一環。n8n作為一個強大的開源工作流自動化平台,提供了無限的可能性,只待創作者的創意和想像力了。有別於利用n8n中的MCP Server節點(MCP Server Trigger node )來串接應用服務,本文主要說明如何透過python搭配uv自建一個輕量級的MCP Server,使其串接和風天氣(qweather)應用服務,同時藉由n8n AI agent工作流中的MCP Client節點(MCP Client Tool node)來調用該自建的MCP Server,等同為本地端n8n開了外掛(Plugin),賦予工作流中的AI Agent根據使用者提問自行判斷是否調用外部工具的能力,如本文影片所演示。


1. 簡介n8nMCP:自動化與AI的協作

n8n 是一個採用視覺化節點編輯器(Node-based Editor)的開源自動化工具。它讓使用者可以透過拖拉和設定不同的節點,來串連起複雜的多步驟工作流程。無論是連接不同的應用程式API、處理數據,還是定時執行任務,n8n都以其高度的靈活性和可擴展性,成為開發者與技術愛好者社群中的熱門選擇。簡言之,可將其視為一個可自行託管(Self-host)的瑞士刀,用以打造專屬於您的自動化解決方案,並確保數據的私密性。

MCPModel Context Protocol 則是一套新興的開放協定,專為標準化大型語言模型(LLM)與外部工具(Tools)及數據源之間的互動而設計。在過去,讓AI模型使用特定工具通常需要針對該模型進行繁瑣的客製化開發。MCP的出現,旨在解決這個痛點。它定義了一個統一的溝通框架,讓LLM模型透過標準化的請求來「呼叫」外部工具執行特定任務,例如查詢資料庫、發送郵件或獲取即時資訊。您可以將MCP想像成一個萬能轉接頭,大幅簡化了應用程式的整合開發。

這兩者的結合,n8n負責整個流程的搭建與執行,MCP則扮演AIn8n工作流之間的橋樑,共同構建出一個強大、智能且高度客製化的自動化生態系統。

 

2. 為何要自建MCP Server?客製化的無限可能

n8n的生態系非常活躍,其社群已經貢獻了許多實用的節點,其中也包含了現成的MCP Server整合節點。對於許多標準化的應用場景來說,這些內建節點無疑是快速實現功能的最佳途徑。例如,n8n官方推出的MCP Client Tool Node,就能夠讓工作流作為一個MCP客戶端,去呼叫外部的MCP-服器。

然而,若可自建MCP Server,將可進一步符合多樣客製化的需求,。以下是幾個典型的場景:

  • 整合內部私有服務:當希望LLM能夠調用公司內部不對外開放的API或服務時,自建MCP Server可以作為一個安全的中介層,將內部服務以標準化的MCP格式封裝起來,供LLM模型使用,同時確保內部系統的安全性。
  • 實現獨特的業務邏輯:某些工具的調用可能不只是單純的API請求,而是需要經過一連串複雜的數據處理、驗證或計算。透過Python自建伺服器,可以在工具邏輯中加入客製化需求程式碼,實現標準節點無法達成的複雜功能。

總而言之,雖然n8n提供了方便的現成節點,但透過Python自建MCP Server,賦予打破現成節點限制的框架,並使開發者可彈性地實現客製化需求。

 

3. 利用和風天氣(qweather)服務建置MCP Server為範例

和風天氣(qweather)提供天氣數據服務的API,同時也支援透過JWTJSON Web Token)進行安全認證。JWT是一種輕巧且獨立的數據交換格式,特別適合在分散式系統中傳遞經數位簽章的資訊。其核心機制在於非對稱加密:伺服器端會持有一把私鑰(Private Key,而將對應的公鑰(Public Key 提供給API的提供方(即為qweather)。當我們發送請求時,會用私鑰對請求的特定內容(Payload)進行簽章,產生一串獨一無二的JWTqweather伺服器收到後,會使用預先存好的公鑰來驗證這串簽章的有效性。如果驗證成功,就代表這個請求確實是由持有私鑰的我們所發出,且內容未被竄改,從而授權數據的存取。公鑰和私鑰互為一對,用私鑰加密的數據只能用公鑰解密,反之亦然,這確保了通訊資料的安全性與完整性。

為了實現這個機制,首先需要在伺服器端生成一對公鑰與私鑰,本文以安裝Ubuntu 22.04 LTS的樹莓派 4B作為伺服器端,並透過下列簡單的openssl指令來完成。


a.生成私鑰 (Private Key):

在終端機中輸入下列指令來生成一個ed25519演算法的私鑰,其中ed25519是一種常用、高效且安全的橢圓曲線加密演算法。

openssl genpkey -algorithm ED25519 -out ed25519-private.pem

執行後,當前目錄下會產生一個名為 ed25519-private.pem的檔案,請妥善保管該私鑰,不可外洩。


b.從私鑰中提取公鑰 (Public Key): 

接著利用剛剛生成的私鑰,提取出對應的公鑰,指令如下。 

openssl pkey -pubout -in ed25519-private.pem > ed25519-public.pem

這會在當前目錄下產生一個 ed25519-public.pem 檔案。這個檔案的內容即是需要提供給qweather後台的公鑰,將其複製並貼到qweather開發者控制台的憑證設定中即可。

完成公私鑰的生成與設定後,往後即可藉由Python程式碼中讀取私鑰檔案,並在每次API請求時,用它來生成JWT,最後將這個含有JWT的請求發送給qweather API。透過這樣的流程,MCP Server就能夠安全地獲取天氣資訊,並將其回傳給LLM,完成一次工具調用。


qweather MCP 程式碼(qweather_mcp_server_sse.py)可參考github,主要有兩項重點如下:

a. mcp server有兩種通訊協議,分別為stdio和sse,stdio只能用於本地的mcp server,而sse可用於連接不同IP主機中的mcp server,非常適合應用於不同服務的相容和串接,本文程式碼即採用sse通訊協議。

b. 若要使n8n的mcp client可連結到qweather_mcp_server_sse.py,則可在n8n中的mcp client輸入http://your_ip:8000/sse,如下圖。



參考資料

JWT的原理和機制

沒有留言:

張貼留言