返回首頁

GitHub Repo

Dify 社群提出 MCP 聯合型別修補,合法陣列參數可能被轉成字串

10 月 16 日的 Dify 社群回報指出,MCP 工具參數同時接受字串與陣列時,合法陣列可能被轉成 Python 表示字串,導致工具查詢失敗。修補提案已加入型別保留與回歸測試,但尚未合併或正式發布。

The original uploader was Ggia at Greek Wikipedia. · CC BY-SA 2.5 · Image source
zh-Hant

Dify 社群於 10 月 16 日提出一項 MCP 工具互通性修補:當參數允許多種 JSON 型別,框架可能先將它簡化為單一型別,再於執行時改寫合法輸入。回報者使用 Docker 自架的 Dify 1.16.1,並表示當時主分支也有相同問題;目前證據來自公開重現與修補提案,影響範圍仍待維護者確認。議題紀錄

重現案例連接 Home Assistant 2026.9 的內建 MCP 服務。其 GetLiveContext 工具允許 domain 接受字串或字串陣列,但模型傳入 {"domain":["light"]} 後,Dify 送出的值變成字串 "['light']",使服務回覆找不到對應領域的實體。回報者指出,直接呼叫服務並傳入字串或陣列都能成功。重現步驟 Home Assistant 官方文件也確認,這套 MCP 整合可讓代理取得目前狀態並呼叫工具,因此參數傳遞錯誤會影響代理取得環境資訊的能力。官方文件

依提案分析,問題跨越兩個階段:結構描述轉換只選取聯合型別的第一個非空分支,使模型看到不完整的參數定義;執行時又依選中的型別強制轉換,將陣列套用 str()。技術上的含意是,即使模型產生符合原始定義的參數,中介框架仍可能改變其語意,除錯時須比對實際送往工具的值。修補分析

PR #44182 提議保留多型別參數的原始結構描述,並讓這類 MCP 參數直接傳遞,由服務端驗證;單一型別參數則維持既有轉換。作者新增涵蓋三種聯合型別表示、兩種分支順序,以及純字串與陣列輸入的測試,並回報相關測試共 991 項通過。這些仍是提案作者的驗證結果,查核時 PR 尚待審查。提案與測試

工程團隊接下來應關注合併與發布版本,並測試自己的多型別工具參數。對單一領域查詢,回報中已驗證的純字串形式可暫時避開問題,但無法取代多領域陣列呼叫;也不宜直接把所有參數都改成陣列型別,以免改變其他合法輸入的行為。限制說明

來源

  1. MCP tool parameters declared as a string-or-array union are sent as stringified Python lists
  2. fix: don't stringify list values for union-typed MCP tool parameters
  3. Model Context Protocol Server