postgres-mcp
postgres-mcp
Claude(または任意のMCP互換クライアント)を利用して、任意のPostgresデータベースに対して読み取り専用のクエリを実行するための、汎用かつ再利用可能なMCPサーバーです。特定のスキーマについての知識はなく、list_tables、describe_table、run_sql は、information_schema と一般的なjsonbイントロスペクションだけを使って動作するので、コードを変更せずに任意のPostgresデータベースに適用できます。
セキュリティモデル
多層防御を備えた、独立した2つのレイヤーです。
DBレベル: サーバーは、
SELECTのみが許可されたロールとして接続します。たとえクエリが書き込みを試みようとしても、書き込むことはできません。このロールはsetup_reader_role.sqlで作成します。アプリレベル:
run_sql()は、単純なSELECT(またはWITH ... SELECT)以外をすべて拒否し、200行の上限を強制し、ステートメントのタイムアウトを5秒に設定します。これらはすべて、データベースに実際にアクセスする前に実行されるフェイルファストなチェックです。
Related MCP server: @yawlabs/postgres-mcp
セットアップ
対象のデータベースに読み取り専用ロールを作成します:
setup_reader_role.sqlを開き、パスワードのプレースホルダーと<your_db_name>を実際の値に置き換え、対象のデータベースに対して一度実行します(例:psqlまたはデータベースプロバイダのSQLコンソールを使用)。
このディレクトリ内の
.envファイルに接続文字列を設定します:DATABASE_URL=postgresql://mcp_reader:yourpassword@host:5432/yourdb ANTHROPIC_API_KEY=sk-ant-...(
ANTHROPIC_API_KEYはchat.pyでのみ必要です。MCPサーバー自体の実行には必要ありません。)依存関係をインストールします:
pip install -r requirements.txt
ローカルテスト
まず、MCPクライアントを介さずにクエリレイヤーを直接テストします:
python chat.py "what tables do I have?"次に、Inspectorで実際のMCPサーバーとしてテストします:
fastmcp dev inspector mcp_server.pyもしInspectorのNode.jsツールチェーンで問題が発生する場合(以前にもありました)、代わりにHTTPでサーバーを直接起動し、FastMCP Python クライアントからアクセスする方法に切り替えてください:
fastmcp run mcp_server.py --transport http --port 8000from fastmcp import Client
import asyncio
async def main():
async with Client("http://localhost:8000/mcp") as client:
print(await client.call_tool("list_tables", {}))
asyncio.run(main())デプロイ(Prefect Horizon)
FastMCPのホスティング型デプロイプラットフォームは現在 Prefect Horizon と呼ばれています(以前は「FastMCP Cloud」でした。過去にも名称変更されているので、以下の手順を進める前に、gofastmcp.com/deployment に現在の名称・URLを再確認してください。また変わっている可能性があります)。
このリポジトリをGitHubにプッシュします — 先に実際のリモートが存在している必要があります(まだ設定していない場合は、このREADMEの下部にあるgitコマンドを参照してください)。
現在のプラットフォームのサイト(執筆時点では horizon.prefect.io)にアクセスし、GitHubアカウントでサインインします。
このリポジトリを接続します。
デプロイを設定します:
エントリーポイント:
mcp_server.py:mcp— この:mcpの部分は、ファイル内でサーバーオブジェクトが代入される変数名です(mcp_server.py内のmcp = FastMCP(...)の行を参照してください)。もし変数名を変更したりファイルを移動したりした場合は、このエントリーポイントの文字列もそれが一致するように正確に更新しなければなりません。認証: これをオンにしてください。claude.ai や Claude Desktop のような対話型MCPクライアントは、接続するために実在するOAuthディスカバリエンドポイントを必要とします。認証を有効にしていないサーバーは、直接のAPI呼び出しやFastMCP Python クライアントでテストしても正常に動作する場合でも、それらのクライアントでは動作しません。
環境変数: プラットフォームのダッシュボード上で
DATABASE_URLを追加してください。これはこのプロジェクトのローカルにある.envファイルとは別物で、.envは読み込まれません。デプロイされたサーバーがデータベースにアクセスできるようにするには、値をダッシュボードに直接入力する必要があります。
デプロイして、発行されたサーバーURLをコピーします。
https://<your-server-name>.fastmcp.app/mcpのような形になります(正確なドメインは異なる場合があります — 実際にプラットフォームに表示されるものを使用してください)。ほかの場所に接続する前に、まずプラットフォームに組み込みのInspector/テストツールでテストしてください。まずそこで
list_tablesを呼び出します。引数が必要ないため、デプロイしたサーバーが実際にデータベースに到達できることを確認する最速の方法です。
claude.ai への接続
claude.ai → Settings → Connectors → Add custom connector の順に移動します。
前のデプロイ手順で取得したサーバーURLを貼り付けます。
表示されるOAuthプロンプトを完了します。
新規チャットを開始します(コネクタを追加する前から存在していたチャットではなく、そのチャットで コネクタを有効にします)。
「どのようなテーブルがありますか?」のような簡単な質問でテストします。
後で新しいツールを追加して表示されない場合、何かが壊れていると決めつける前に、コネクタの設定にある「ツールを更新」を試してください。これは既知のキャッシュ動作であって、バグではありません。
制限
このサーバーは本当にスキーマに依存しませんが、制限がないわけではありません。
Postgres固有。
jsonb_object_keys()と、Postgresのカタログ構文(information_schemaなど)を使用しています。MySQLやSQLiteを対象にする場合は、接続文字列を変えるだけではダメーで、db_tools.pyのコードを実際に変更する必要があります。スキーマ非依存なことは、データベースごとのセットアップが不要なことを意味するではありません。 新しいターゲットデータベースには、専用読み取り専用ロール(
setup_reader_role.sql)と、そのデータベースに向けた専用デプロイ(少なくとも専用のDATABASE_URL)がやはり必要です。つまり、複数データベースを透過的に提供する単一サーバではありません。
Gitセットアップ
まだgitの履歴をせずにこのコードから始める場合:
git init
git add .
git commit -m "Initial commit: generic read-only Postgres MCP server"
git branch -M main
git remote add origin <your-repo-url>
git push -u origin mainThis server cannot be deployed
Maintenance
Related MCP Connectors
Query PostgreSQL databases in plain English — LLM-generated, safety-validated SQL.
Safe, read-only Postgres and MySQL access for AI agents. Audit log + column-level controls.
Query your Postgres from ChatGPT or Claude without exposing the database or handing over credentials. Run npx boltschema connect next to your database and it dials out over HTTPS — no inbound firewall rule, no open port, works with localhost and VPC-private databases. Read-only is enforced by a SQL guard, a Postgres READ ONLY transaction, and a scoped role generated for you.
Query your warehouse or a CSV with Claude/ChatGPT over MCP, governed by table-level ACL + audit.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables natural language querying of PostgreSQL databases through the Model Context Protocol. It translates user questions into validated SQL, executes read-only queries safely, and returns results to MCP-compatible clients like Claude Desktop.-
- AlicenseAqualityAmaintenanceQuery and manage PostgreSQL databases from Claude Code, Cursor, and any MCP client, with read-only by default and built-in schema introspection, EXPLAIN, and performance diagnostics.232,268 npm8MIT
- FlicenseNot gradedqualityCmaintenanceEnables LLM agents to explore a Postgres database and answer questions by running safe, read-only SQL queries through MCP tools.-
- FlicenseAqualityCmaintenanceEnables read-only access to a PostgreSQL database, allowing users to inspect schema, generate SQL from natural language, and execute read-only queries via MCP.5-