用 MCP 把 PostgreSQL 接入 Claude Code,設定唯讀帳號和權限控管,讓 Claude 直接讀 schema、寫查詢、分析資料,不再需要手動貼上表結構。
接了資料庫之後,Claude Code 的工作方式會變。你不需要把表結構複製進 prompt,不需要告訴它欄位叫什麼——它直接連上去,自己讀 schema,自己寫查詢,結果出來就給你分析。
這篇文章用 PostgreSQL 做示例,從配置到實際使用完整走一遍。
官方維護的 @modelcontextprotocol/server-postgres 支援:
唯讀。這個 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 看(比如 sessions、audit_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 能看到你授權的所有表的完整 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 → 它分析。現在是:你描述問題 → 它自己查 → 直接給結論。