模型 / 資料集
designcomputer/mysql_mcp_server avatar
designcomputer/mysql_mcp_server

mysql_mcp_server:把 MySQL 交給 LLM 之前,先看清楚它的邊界

A Model Context Protocol (MCP) server that enables secure interaction with MySQL databases

1,391 個 Star257 個 ForkPythonMIT

秒懂

它是什麼?
這是一個以 Python 實作的 MCP 伺服器,讓 Claude Code、Claude Desktop 等主機透過工具呼叫讀寫 MySQL。它的價值不在功能多,而在於把「AI 碰資料庫」這件事收斂成四個工具與一組環境變數。
適合誰用?
如果你要讓 Claude Code 或 Claude Desktop 在受控範圍內查詢 MySQL,而且能接受「單一 SQL 語句」與「取樣上限 20 筆」這兩個硬限制,這個伺服器值得裝;若你需要跨語句交易、需要細粒度的資料列層級權限控管,或想用一個受限的查詢介面取代任意 SQL,它就不是對的工具,應改看 MySQL 官方的 mysql-mcp-server。動手前先確認三件事:你的 MySQL 版本與認證外掛是否相容(必要時設 MYSQL_AUTH_PLUGIN=mysql_native_password)、MCP 主機是否從自己的工作目錄啟動(若是,.env 不會被讀到,必須把 MYSQL_* 寫進主機的 env 區塊)、以及 MCP_TRANSPORT 要設 stdio 還是 sse。
可以商用嗎?
可以。MIT 是寬鬆授權:你可以使用、修改並販售以它為基礎的軟體,只需保留著作權與授權聲明。
還在維護嗎?
有在維護。儲存庫最近一次提交在 44 天前。
用什麼語言寫的?
主要是 Python(依據 GitHub 的語言統計)。

以上回答依據專案的 GitHub 資料(最近同步於 2026年9月15日)與我們的分析,不構成法律意見。

開源專案深度解析

它解決的是「AI 直接連資料庫」這件事的失控風險

LLM 要分析資料,最直覺的做法是把連線字串給它,讓它自己寫程式連 MySQL。問題是這樣等於把整條連線路徑交出去:帳密出現在對話或腳本裡,查詢內容不受任何結構約束,主機端也無從得知模型到底執行了什麼。mysql_mcp_server 的定位就是在中間插一層。它是一個 Model Context Protocol 伺服器,README 的開頭寫得很清楚,目的是讓 AI 應用與 MySQL 之間的溝通「更安全、更有結構,透過一個受控介面」。

受控的具體形式是:模型不能任意連線,只能呼叫伺服器暴露的工具。目前 README 列出三個工具,execute_sql、get_schema_info、get_table_sample,另外還有以資源形式呈現的資料表清單與資料讀取。憑證則全部走環境變數,不進對話。

誰適合用?已經在用 Claude Code 或 Claude Desktop、手上有 MySQL、想讓模型幫忙看 schema 或撈資料的工程師。誰不適合?想拿它當正式的資料存取層、需要逐語句審計或列級權限的人。這個專案給的是探索與分析用的介面,不是資料庫閘道。

三個工具與一組環境變數,就是全部的介面

execute_sql 執行標準 SQL,支援 SELECT、SHOW、DESCRIBE 以及 DML 的 INSERT、UPDATE、DELETE。README 特別註明 DML 操作會被標記為 destructive hint,也就是主機端可以據此提示使用者。限制寫得很直接:只支援單一語句,多語句查詢不支援。

get_schema_info 回傳資料表的欄位名稱、型別、可為空性、預設值與註解,參數 table_name 可省略。get_table_sample 取樣資料,limit 是選填整數,上限 20 筆。

這兩個工具對識別字有明確規則:只允許英數字、底線與 $,點號可作為資料庫與資料表之間的分隔。換句話說,跨資料庫查詢是設計過的行為,不是意外。

設定面全部是環境變數。必填的只有 MYSQL_HOST、MYSQL_USER、MYSQL_PASSWORD,其餘都有預設值。比較容易被忽略的是 MYSQL_SQL_MODE,預設為 TRADITIONAL,這個值會套用到連線上。如果你的正式環境依賴寬鬆的 SQL 模式,這個預設值會改變伺服器端看到的行為,值得先確認再上線。

多資料庫模式與單語句限制是同一枚硬幣的兩面

不設 MYSQL_DATABASE 時,伺服器進入多資料庫模式。README 說明此時 list_resources 會回傳所有使用者資料庫,系統資料庫被過濾掉,查詢時要用 mydb.mytable 這種完整限定名稱。

這裡有個必須注意的連帶限制:多語句查詢不支援,README 直接舉例,USE db; SELECT ... 這種寫法行不通。原因不難推測,一旦允許 USE 切換當前資料庫,跨資料庫的識別字規則與權限邊界就會變得難以描述。所以設計上選擇用限定名稱取代 USE。

代價是模型必須自己記得把資料庫名寫進每一句 SQL。對人類來說這是小事,對模型來說是容易出錯的地方,尤其當它先呼叫 list_resources 拿到一堆資料庫名稱之後。如果你打算在多資料庫模式下使用,最好在系統提示裡明確要求所有查詢都帶資料庫前綴。

單一語句的限制也意味著不能用 BEGIN、COMMIT 包住一組變更。要執行多步寫入,只能拆成多次工具呼叫,而這中間沒有交易保證。

安裝路徑有三條,選錯會踩到 .env 的坑

最直接的是 pip install mysql-mcp-server。透過 Smithery 則是一行 npx -y @smithery/cli install designcomputer/mysql-mcp-server --client claude,README 說明它會自動為 Claude Desktop 安裝。Claude Code 使用者可以走 CLI:claude mcp add --transport stdio designcomputer-mysql_mcp_server uvx mysql_mcp_server。

啟動時伺服器會透過 python-dotenv 自動載入 .env,README 建議直接 cp .env.example .env 再編輯。但這裡有個明確的警告:檔案是從行程的工作目錄(及其上層目錄)讀取。Claude Code 與 Claude Desktop 會從自己的工作目錄啟動伺服器,因此專案的 .env 不會被找到,結果就是 Missing required database configuration。

解法是把 MYSQL_* 的值寫進 MCP 設定的 env 區塊,而不是依賴 .env。這個坑很常見,因為手動在專案目錄下跑一次會成功,換到主機啟動就失敗,兩者行為不一致。

另外 README 提到 Autohand Code CLI 的安裝方式,並註明加上 --scope project 可把註冊留在當前工作區。

SSE 與 SSH 通道:遠端部署才需要打開的開關

預設傳輸是 stdio,適合本機。要遠端或自架部署,README 建議改用 SSE 模式,設定 MCP_TRANSPORT=sse。相關變數包括 MCP_SSE_HOST,Docker 或託管情境需要設 0.0.0.0 才能對外監聽;PORT 是 HTTP 埠,作為 MCP_SSE_PORT 的備援;MCP_SSE_ALLOWED_HOSTS 是逗號分隔的允許 Host 標頭清單,預設只允許 localhost:{port} 與 127.0.0.1:{port}。

這個預設值值得留意。把 MCP_SSE_HOST 設成 0.0.0.0 之後,如果沒有同步放寬 MCP_SSE_ALLOWED_HOSTS,來自外部網域的請求會被 Host 標頭檢查擋下。反過來說,一旦放寬,這層保護就沒了,得靠網路層自己補。

SSH 通道由 MYSQL_SSH_ENABLE 控制,設為 true 才啟用,其餘參數包含 MYSQL_SSH_HOST、MYSQL_SSH_PORT(預設 22)、MYSQL_SSH_USER、MYSQL_SSH_KEY_PATH,以及從跳板機視角看的 MYSQL_SSH_REMOTE_HOST 與 MYSQL_SSH_REMOTE_PORT,本機端則用 MYSQL_LOCAL_PORT(範例值 3330)。這組設定讓伺服器能穿過跳板機連到不对外开放的 MySQL,對於內網資料庫是實用的選項。

連線層還有幾個相容性開關:MYSQL_SSL_MODE 可為 DISABLED、REQUIRED、VERIFY_CA、VERIFY_IDENTITY;MYSQL_CONNECT_TIMEOUT 預設 10 秒;MYSQL_CHARSET 與 MYSQL_COLLATION 預設 utf8mb4 與 utf8mb4_unicode_ci;MYSQL_AUTH_PLUGIN 用於較舊的 MySQL 版本,例如 mysql_native_password;MYSQL_USE_PURE 可強制使用純 Python 連接器;MYSQL_RAISE_ON_WARNINGS 預設 false。

它不適合當資料存取層,官方 mysql-mcp-server 走的是另一條路

最明顯的限制是 execute_sql 接受任意 SQL。README 說它支援 SELECT、SHOW、DESCRIBE 與 DML,工具本身沒有查詢白名單、沒有資料表層級的拒絕清單、也沒有列級過濾。防線實際上落在兩處:一是資料庫帳號本身的權限,二是主機端對 destructive hint 的處理。如果你給這個伺服器的帳號有 DROP 權限,模型就有機會執行 DROP。這一點在採用前必須先想清楚,README 並沒有聲稱它會攔截這類語句。

第二個限制是取樣上限 20 筆。get_table_sample 的 limit 最大值就是 20,這是刻意設計,避免一次拉回大量資料。要更大範圍的分析,得改用 execute_sql 自己寫查詢。

第三,單一語句限制讓需要交易的作業變得麻煩。

替代方案是 MySQL 官方的 mysql-mcp-server。兩者取向不同:designcomputer 這個版本把 execute_sql 當成主要工具,等於把 SQL 撰寫權交給模型;官方版本則以受限的查詢介面為主,模型能做的是結構化的查詢操作,而不是任意 SQL。差異不在功能多寡,而在誰承擔「這句話該不該執行」的判斷。如果你的環境無法接受模型自由撰寫 SQL,官方版本的路線更合適;如果你要的就是讓模型自由探索 schema 與資料,這個版本的工具集更直接。

授權與維護成本

授權是 MIT,這意味著可以商用、可以修改、可以再散布,只要保留著作權聲明。這裡不提供法律意見,實際條文請自行查閱。

維護面可觀察到的訊號是版本節奏。從提供的資料看,v0.4.2 在 2026-06-20,v0.4.3 與 v0.4.4 都落在 2026-07-30,同一天連出兩個版本,而最後一次推送是 2026-08-02。專案未封存。這種節奏通常代表仍在處理相容性與細節修正,而不是進入長期凍結。

升級成本主要取決於你依賴多少環境變數。設定面是純環境變數,沒有設定檔格式,所以升級時要檢查的是預設值有沒有變動,例如 MYSQL_SQL_MODE 的 TRADITIONAL 預設。如果你的正式環境對 SQL 模式敏感,每次升級前把 README 的設定段落與你實際使用的變數對一遍,是最實際的做法。

另外 README 提到 AgentAudit 的標章,這屬於第三方標示,本文不對其審核範圍作任何推論。

編輯結論

如果你要讓 Claude Code 或 Claude Desktop 在受控範圍內查詢 MySQL,而且能接受「單一 SQL 語句」與「取樣上限 20 筆」這兩個硬限制,這個伺服器值得裝;若你需要跨語句交易、需要細粒度的資料列層級權限控管,或想用一個受限的查詢介面取代任意 SQL,它就不是對的工具,應改看 MySQL 官方的 mysql-mcp-server。動手前先確認三件事:你的 MySQL 版本與認證外掛是否相容(必要時設 MYSQL_AUTH_PLUGIN=mysql_native_password)、MCP 主機是否從自己的工作目錄啟動(若是,.env 不會被讀到,必須把 MYSQL_* 寫進主機的 env 區塊)、以及 MCP_TRANSPORT 要設 stdio 還是 sse。這三項沒確認,第一次啟動就會卡在 Missing required database configuration。

官方來源

  1. designcomputer/mysql_mcp_server on GitHub
  2. License: MIT
  3. Project website
  4. README
  5. Releases
社群筆記

社群筆記