PostgreSQL MCP サーバ(ローカル DB)
@modelcontextprotocol/server-postgres 経由で Claude や Cursor をローカル PostgreSQL に接続し、スキーマの読み取りと SELECT クエリを可能にします。
詳細な説明
PostgreSQL サーバ:読み取り専用 SQL
postgres サーバはモデルにスキーマ調査(pg_catalog.pg_tables)と SELECT クエリを許可します。設計上、INSERT / UPDATE / DELETE / DDL は 許可されません。慣例として読み取り専用ロールを指す形で設定します。
設定
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-postgres",
"postgresql://readonly:secret@localhost:5432/myapp"
]
}
}
}
読み取り専用ロールの作成
接続文字列は URI に資格情報を含むので、superuser を再利用せず専用ロールを作ります。psql で:
CREATE ROLE mcp_readonly WITH LOGIN PASSWORD 'secret';
GRANT CONNECT ON DATABASE myapp TO mcp_readonly;
GRANT USAGE ON SCHEMA public TO mcp_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO mcp_readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO mcp_readonly;
最後の行は、後から追加するテーブルにも自動で SELECT 権限を付与する設定です。これがないと新規テーブルがモデルのスキーマダンプに表示されません。
接続文字列の構造
postgresql://USER:PASSWORD@HOST:PORT/DATABASE — URI スキームです。postgres サーバはこれをそのまま libpq に渡すため、?sslmode=require や ?application_name=claude-mcp といった標準オプションをクエリ文字列として追加できます。
安全上の注意
接続文字列はシークレットです。ジェネレーターはこれを検知してシークレット警告バナーを表示します。claude_desktop_config.json を git にコミットしないでください。資格情報のローテーションについては PostgreSQL 読み取り専用セットアップ を参照してください。
ユースケース
ローカル開発中に「今週のサインアップ数は?」「orders テーブルのスキーマを見せて」を実 DB に対して答えさせ、しかも誤ってテーブルを drop されないようにする用途です。