我們在 Elestio 上執行自託管的 n8n 2.26.4,無法透過 MCP 將 Claude.ai 連接到我們的實例。實例級 MCP 已啟用,OAuth/存取權杖也已設定。
我們嘗試了 Claude.ai 上的官方 n8n 夥伴連接器和使用直接 MCP 伺服器 URL 的自訂連接器(格式:https://your-instance.vm.elestio.app/mcp-server/http)。兩者都在 Claude 端出現相同錯誤:
「與 MCP 伺服器的授權失敗。您可以檢查您的認證和權限。」
有趣的是,在 n8n 側,「已連接的客戶端」標籤確實會在每次我們嘗試連接時顯示新的 Claude 項目,所以 n8n 正在接收連接嘗試。只是授權握手在 Claude 端無法成功完成。
來自三次失敗嘗試的參考代碼:
- ofid_ccb9a1fd230c7285
- ofid_757ab36960e137e7
- ofid_a02cf908ec28723f
有人可以幫助我們找出是什麼阻止了授權完成嗎?
1 個讚
那些 Connected Clients 列很有幫助:Claude 正在連接到 n8n,所以下一步需要區分的是 URL 探索對比權杖交換。試著用直接 MCP URL 進行一次乾淨的重新連接,然後在 n8n 日誌中檢查相同的 ofid_...;如果在權杖交換期間失敗,請貼出那一行日誌(隱藏主機名稱/機密資訊)和你使用的 OAuth 憑證類型。
1 個讚
更新:我們深入查閱了日誌並找到了根本原因。
每次連線嘗試都顯示:
ValidationError: An invalid 'request.ip' was detected
隨後立即出現「Deleting OAuth client」和「OAuth client deleted successfully」。OAuth 工作階段被建立後立即關閉,因為 n8n 的速率限制器拒絕了來自我們執行個體前面 nginx 反向代理的格式不正確的 IP。
我們已設定 N8N_TRUST_PROXY=true 和 N8N_PROXY_HOPS=1,但問題出在 nginx 層。Nginx 正在轉發 X-Forwarded-For 標頭,但缺少 real_ip_header 和 set_real_ip_from 指令,所以 n8n 收到格式不正確的 IP 並在令牌交換完成前殺死了 OAuth 工作階段。
我們已向託管提供商 Elestio 提報,要求其新增 nginx real_ip 指令。在我們等待期間,n8n 端有什麼辦法可以略過或停用速率限制器 IP 驗證作為暫時解決方案嗎?
在等待 Elestio 的過程中,值得一試的是暫時設定 N8N_PROXY_HOPS=0。這會告訴 n8n 它不在任何 Proxy 後面,所以它會停止嘗試解析 X-Forwarded-For Headers,改為使用原始連接 IP — 這樣可以繞過導致 OAuth 握手失敗的格式錯誤 IP 驗證。權衡之下,速率限制會套用到 Proxy 的 IP 而非真實客戶端 IP,但對於 MCP 伺服器來說通常沒問題。一旦 Elestio 應用了 real_ip_header 和 set_real_ip_from nginx 指令,就改回 N8N_PROXY_HOPS=1,這樣速率限制就能正常運作。
1 個讚
Meesam,將上面的 N8N_PROXY_HOPS=0 想法視為臨時隔離測試,而不是修復。這會導致 n8n 針對代理 IP 進行速率限制,所以要保持短期使用,一旦 Elestio 設置真實 IP 鏈後就切換回去。
在此過程中不要在 n8n 中停用限制器本身。持久修復仍然需要上游處理:nginx 需要在 OAuth/速率限制路徑正常運作之前傳遞有效的受信任客戶端 IP 鏈。
1 個讚
更新:已取得進展。OAuth 刪除迴圈已修復。現在日誌顯示每次嘗試都會出現「同意已批准」和「重新整理令牌已輪換,新的存取令牌已簽發」,所以 OAuth 流程在 n8n 側完成成功。不過 Claude.ai 仍然顯示「與 MCP 伺服器的授權失敗」。現在失敗發生在 OAuth 完成後、MCP 工作階段初始化期間。您有什麼想法,什麼可能導致 MCP 工作階段在成功的 OAuth 握手後失敗?
Meesam,如果 n8n 現在顯示同意已核准和令牌輪換,那麼請停止查看此部分的代理/IP 路徑。下一個檢查是 Claude 是否在 OAuth 後到達 MCP 端點:在同一次嘗試中,n8n 日誌是否在令牌行之後顯示對 /mcp-server/http 的請求,或者是否沒有進一步的活動?
如果沒有進一步的活動,連接器可能在會話初始化到達 n8n 之前就失敗了。如果有請求到達,請貼上第一個 MCP 會話錯誤行(隱藏主機名稱/令牌);那裡的狀態碼現在比 OAuth 行更重要。
立即檢查了連線嘗試後的日誌。在「同意已批准」和權杖輪換後,日誌完全沒有任何活動。根本沒有對 /mcp-server/http 的任何請求。所以 Claude 成功完成了 OAuth,但從未到達 MCP 工作階段初始化端點。在成功的權杖交換後,是什麼原因導致 Claude.ai 在到達 /mcp-server/http 之前停止?
這大大縮小了範圍:如果 n8n 在 token 輪換後沒有響應,失敗的步驟可能不再是 n8n 接受 OAuth 結果。Claude 已經通過了那個階段,然後沒有啟動 MCP 工作階段請求。
下一個線索是 Claude 保存的客戶端 MCP URL。它是否完全符合公開的 https://.../mcp-server/http URL,沒有來自 Elestio 的尾部斜線/路徑重寫?如果該 URL 完全符合,且 token 輪換後 n8n 仍然看不到任何內容,這可能是在 Claude 遠端 MCP 客戶端一側,而不是 n8n 工作流設定。
嘗試過將 API 金鑰作為查詢參數嵌入 URL 的方法。在 Claude 端仍然收到「MCP 伺服器授權失敗」。
查詢參數方式無法運作 - Claude.ai 的 MCP 用戶端會透過 Authorization: Bearer <key> 在請求標頭中發送令牌,而不是作為 URL 參數。問題幾乎肯定是 Elestio 的 nginx 在到達 n8n 之前就已經移除了 Authorization 標頭。
在你的 Elestio nginx 設定中,確保在處理 MCP 的位置區塊中有以下內容:
proxy_set_header Authorization $http_authorization;
沒有這個設定,nginx 會允許 Cookie 和自訂標頭通過,但預設會捨棄 Authorization 標頭,所以 n8n 的 MCP 伺服器永遠看不到令牌,因此會拒絕連線。一旦該標頭通過設定就位後,直接在 Claude 連接器中使用 n8n API 金鑰即可 - 不需要在 URL 中嵌入。
1 個讚
更新:使用 curl 直接測試 MCP 端點。該端點透過 WWW-Authenticate: Bearer realm="n8n MCP Server" 公告 Bearer 驗證,但即使在傳送有效的 Authorization: Bearer <token> 標頭時,仍會傳回 「Missing Bearer prefix」。Token 已到達 n8n(已確認 nginx 通過 Authorization 標頭)。同時使用 MCP 存取 token 和 n8n API 金鑰都會傳回 HTTP 401。在 2.26.4 版本中,MCP 伺服器對直接 Bearer 驗證有特定的 token 格式或端點預期嗎?
已解決 - 以下是對任何使用 Elestio 的用戶的實際修復方法:
根本原因是 Elestio 的 nginx 配置缺少特定的 MCP 相關代理指令。儘管 nginx 為其他路由傳遞了授權標頭,但處理 n8n MCP 端點 (/mcp-server/http) 的位置區塊未正確配置為傳遞標頭並處理 MCP 會話初始化。
修復方法是 Elestio 使用 MCP 端點的正確代理指令更新 n8n 服務的 nginx 配置。我們沒有獲得他們更改的確切行數,但症狀是:
- OAuth 成功完成(同意已批准,令牌在 n8n 日誌中發出)
- Claude 在令牌交換後從未訪問過
/mcp-server/http,日誌一片沉寂
- 使用 Bearer 令牌直接 curl 到
/mcp-server/http 返回 401,出現矛盾的錯誤「缺少 Bearer 前綴」,即使存在 Bearer 前綴
- Elestio 更新了 nginx MCP 配置後,連接立即工作
我們在此過程中修復的其他內容,雖然不是根本原因但卻是真實問題:
- n8n 從 1.121.3 升級到 2.26.4(MCP 穩定支持所需)
- 在 docker-compose.yml 中添加了
N8N_TRUST_PROXY: "true"(反向代理後的最佳實踐)
N8N_PROXY_HOPS=1 已正確設置,請勿更改
如果您使用 Elestio 並遇到同樣的問題,請開設支持工單並要求他們更新您的 n8n 服務的 nginx MCP 配置。一旦我們提供了具體的錯誤,他們很快就修復了它。
1 個讚