給 Claude Code 接入資料庫:用 MCP 直接查真實資料

用 MCP 把 PostgreSQL 接入 Claude Code,設定唯讀帳號和權限控管,讓 Claude 直接讀 schema、寫查詢、分析資料,不再需要手動貼上表結構。


接了資料庫之後,Claude Code 的工作方式會變。你不需要把表結構複製進 prompt,不需要告訴它欄位叫什麼——它直接連上去,自己讀 schema,自己寫查詢,結果出來就給你分析。

這篇文章用 PostgreSQL 做示例,從配置到實際使用完整走一遍。

用哪個 MCP Server

官方維護的 @modelcontextprotocol/server-postgres 支援:

  • 讀取所有表的 schema(欄位名、類型、約束)
  • 執行 SQL 查詢並回傳結果
  • 支援多 schema

唯讀。這個 Server 設計上只做查詢,不執行 INSERT/UPDATE/DELETE。

安裝

npm install -g @modelcontextprotocol/server-postgres

配置

編輯 .claude/settings.json(專案級):

{
  "mcpServers": {
    "db": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-postgres",
        "postgresql://readonly_user:password@localhost:5432/myapp_production"
      ]
    }
  }
}

連線字串格式:postgresql://USER:PASSWORD@HOST:PORT/DATABASE

如果不想把密碼寫進設定檔,用環境變數:

{
  "mcpServers": {
    "db": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-postgres"],
      "env": {
        "DATABASE_URL": "postgresql://readonly_user:password@localhost:5432/myapp_production"
      }
    }
  }
}

注意:.claude/settings.json 如果要提交 git,確保裡面沒有明文密碼。敏感設定放 .claude/settings.local.json(加入 .gitignore)。

先建一個唯讀帳號

不要把有寫入權限的帳號給 Claude 用。在 PostgreSQL 裡建一個唯讀帳號:

-- 建立唯讀使用者
CREATE USER claude_readonly WITH PASSWORD 'your_password';

-- 授予連線權限
GRANT CONNECT ON DATABASE myapp_production TO claude_readonly;

-- 授予 schema 使用權限
GRANT USAGE ON SCHEMA public TO claude_readonly;

-- 授予所有資料表的查詢權限
GRANT SELECT ON ALL TABLES IN SCHEMA public TO claude_readonly;

-- 確保未來新建的資料表也有權限
ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT ON TABLES TO claude_readonly;

如果有些表不想讓 Claude 看(比如 sessionsaudit_logs),就不要授權那些表,或者把它們放在單獨的 schema 裡。

驗證連線

重啟 Claude Code,然後問它:

列出資料庫裡有哪些資料表

如果 Claude 回傳了資料表名稱清單而不是說「我沒有存取資料庫的能力」,代表 MCP 連線成功。

實際使用示例

配置完成後,Claude 能做的事情變了很多。下面是幾個真實場景。

場景一:理解資料結構

這個資料庫的 users 和 orders 表是什麼關係?
有沒有外鍵約束?

Claude 會直接查 information_schema 讀取表結構和約束,然後給你清晰的解釋,而不是讓你先把 schema 貼給它。

場景二:資料分析

最近 30 天註冊的使用者裡,下過訂單的比例是多少?
按註冊渠道分組

Claude 會寫 SQL、執行、然後分析結果。如果查詢寫錯了(比如欄位名對不上),它能直接看到錯誤然後自己修。

場景三:排查問題

orders 表裡有 status = 'pending' 但 created_at 超過 7 天的記錄,
看看有多少,最近一條是什麼時候

這類臨時排查,過去要你自己寫 SQL 或者去資料庫工具裡手動查。現在直接說需求就行。

場景四:輔助開發

我要給 users 表加一個 last_login_at 欄位,
幫我寫遷移 SQL,順便檢查一下現有索引夠不夠用

Claude 會先看當前表結構,再寫遷移,同時分析索引情況給出建議。

控制 Claude 能看到什麼

預設情況下,Claude 能看到你授權的所有表的完整 schema 和資料。根據實際需要,可以做以下限制:

按表控制

不給某些表授權:

-- 只授權特定表,而不是全部
GRANT SELECT ON TABLE users, orders, products TO claude_readonly;
-- 不授權 sessions, payment_tokens, audit_logs 等敏感表

用 view 過濾敏感欄位

如果表裡有敏感欄位(密碼 hash、API key、手機號),建一個 view 屏蔽掉:

CREATE VIEW users_safe AS
  SELECT id, email, created_at, plan, status
  FROM users;
  -- 不包含 password_digest, phone, payment_method_id

GRANT SELECT ON users_safe TO claude_readonly;
-- 不授權原表

Claude 只能查 view,看不到原始欄位。

限制行數

@modelcontextprotocol/server-postgres 預設對查詢結果有行數限制(通常 1000 行),防止把整張表拉回來。這個限制是合理的,不需要調大。

連線遠端資料庫

如果生產資料庫在遠端伺服器,通常不會直接暴露連接埠。可以用 SSH 隧道:

# 在本地建隧道,把 localhost:5433 對映到遠端伺服器的 5432
ssh -L 5433:localhost:5432 [email protected] -N

然後設定檔裡用本地連接埠:

"postgresql://readonly_user:password@localhost:5433/myapp_production"

或者用 pgBouncer 這類連線池中間件。

多個資料庫

如果專案有多個資料庫(主庫 + 分析庫 + 快取庫),可以配置多個 MCP Server:

{
  "mcpServers": {
    "main-db": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-postgres", "postgresql://...主庫..."]
    },
    "analytics-db": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-postgres", "postgresql://...分析庫..."]
    }
  }
}

Claude 會同時連兩個庫,你告訴它去哪個庫查就行。

實際效果

接了資料庫之後,最明顯的變化是:和 Claude 討論資料相關問題不需要鋪墊了。不用先解釋表結構,不用先說欄位叫什麼類型,直接說需求,它自己去查。

排查 bug 的時候尤其有用。過去的流程是:你查資料庫 → 複製結果 → 貼給 Claude → 它分析。現在是:你描述問題 → 它自己查 → 直接給結論。