Claude Media
PostgreSQL MCPサーバーの使い方 — 索引提案とヘルスチェックまで

PostgreSQL MCPサーバーの使い方 — 索引提案とヘルスチェックまで

PostgreSQL専用のMCPサーバーPostgres MCP Proで、ヘルスチェックと索引チューニングを行う手順をまとめます。DBHubとの使い分けも扱います。

MCPはAIエージェントと外部ツールをつなぐ標準プロトコルで、詳しい仕組みはMCPとはにまとめています。MCPからPostgreSQLに接続する記事といえば、汎用DB接続サーバーDBHubを軸にしたMCPからデータベースに接続する方法がすでにあります。DBHubは複数DBに読み取り専用でつなぐ用途に強い一方、索引の提案やヘルスチェックのようなPostgreSQL固有のパフォーマンス分析はスコープ外です。この記事で扱うPostgres MCP Pro(crystaldba/postgres-mcp)は、その隙間を埋めるPostgreSQL専用のMCPサーバーです。仮想インデックスを使った索引提案、遅いクエリの特定、DBの健全性チェックまでを1つのサーバーで行えます。

Postgres MCP ProとDBHubは何が違うか

同じ「MCPでPostgreSQLに触る」でも、狙っている作業が違います。

項目DBHub(既存記事)Postgres MCP Pro
対応DBDBHub(既存記事)PostgreSQL / MySQL / MariaDB / SQL Server / SQLitePostgres MCP ProPostgreSQLのみ
主な用途DBHub(既存記事)複数DBへの読み取り専用クエリPostgres MCP Pro単一DBのパフォーマンス分析・チューニング
代表ツールDBHub(既存記事)execute_sql / search_objectsPostgres MCP Proanalyze_db_health / analyze_workload_indexes / explain_query
アクセス制御DBHub(既存記事)既定で読み取り専用Postgres MCP Pro--access-modeで明示選択

DBHubが「安全にクエリを投げる」ことに寄せた設計なのに対し、Postgres MCP Proは「このデータベースは今どこが遅いか、どの索引を足せば効くか」を分析する側に寄せた設計です。両方を同じプロジェクトに登録し、日常のクエリはDBHub、パフォーマンス診断が必要になったらPostgres MCP Proと使い分けることもできます。対応DBの広さで選ぶならDBHub、PostgreSQLに絞ってどこまでも深く分析したいならPostgres MCP Proという住み分けです。対象がBigQueryのようなクラウドDWHであれば、Google自身がマネージドで提供するMCPサーバーという別の選択肢もあります。詳しくはClaude BigQuery連携にまとめています。

インストールと接続手順

インストール方法は3通りあります。

pipx install postgres-mcp
# または
uv pip install postgres-mcp
# またはDockerイメージを使う
docker pull crystaldba/postgres-mcp

Claude Codeへの登録はclaude mcp addで行います。データベース接続文字列はDATABASE_URIという環境変数で渡す仕様なので、--envフラグを使います。

claude mcp add --env DATABASE_URI="postgresql://readonly:pass@prod.db.com:5432/analytics" \
  --transport stdio postgres -- postgres-mcp --access-mode=restricted

DBHubの記事と同じく、接続文字列に使うDBユーザーは読み取り専用アカウントを基本にします。claude mcp list✔ Connectedになれば準備完了です。

Dockerイメージを使う場合は、docker runに環境変数を渡す形になります。

claude mcp add --transport stdio postgres -- docker run -i --rm \
  -e DATABASE_URI="postgresql://readonly:pass@prod.db.com:5432/analytics" \
  crystaldba/postgres-mcp --access-mode=restricted

pipx・uv・Dockerのどれを選んでも、Claude Code側から見えるツールは同じです。手元にPython環境があるならpipx、コンテナ運用に統一したいならDockerと、既存の開発環境に合わせて選べます。

Postgres MCP Proの分析ツールには、あらかじめ2つのPostgreSQL拡張機能を有効にしておく必要があります。

CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
CREATE EXTENSION IF NOT EXISTS hypopg;

pg_stat_statementsはクエリ実行統計を集計する標準拡張、hypopgは実際にはインデックスを作らずに「作ったらどうなるか」をシミュレートする拡張です。この2つが入っていないと、後述のヘルスチェックと索引提案の大半が機能しません。クラウドマネージドPostgreSQL(RDSやCloud SQLなど)でも、多くはこの2拡張を有効化できます。pg_stat_statementsshared_preload_librariesへの追加とサーバー再起動を伴う場合があるため、本番環境で初めて有効化するときは事前にメンテナンス時間を確保しておくと安全です。

アクセスモードの使い分け

Postgres MCP Proは起動時に--access-modeでモードを選びます。

モード向く環境できること
restricted向く環境本番データベースできること読み取り専用トランザクションに限定し、リソース利用も制約する
unrestricted向く環境開発・検証環境できることデータとスキーマの変更を含む読み書き両方

--access-modeはサーバー全体に効くスイッチで、DBHubのreadonlyのようにツールごとに個別設定できるわけではありません。接続に使うDBユーザーの権限を絞ることは、--access-modeとは別の層の防御として引き続き有効です。restrictedモードのままでも、接続文字列に管理者権限のアカウントをそのまま渡していれば、モードの不具合や設定ミス1つで書き込みが通ってしまうリスクは残ります。DBユーザー側を読み取り専用にしておく発想は、DBHubの記事で扱った多重防御と同じ考え方です。

提供ツール一覧

ツール名機能
list_schemas機能すべてのスキーマを一覧表示
list_objects機能スキーマ内のテーブル・ビュー・シーケンスを表示
get_object_details機能テーブルのカラム・制約・インデックス情報を取得
execute_sql機能SQLを実行(restrictedモードでは読み取り専用)
explain_query機能実行計画を取得。仮想インデックスを使ったシミュレーションも可能
get_top_queries機能pg_stat_statementsに基づき遅いクエリを報告
analyze_workload_indexes機能ワークロード全体を分析し、最適な索引の組み合わせを提案
analyze_query_indexes機能指定したクエリ(最大10個)に対する索引を提案
analyze_db_health機能バッファキャッシュ比率・接続状態・索引の健全性などを確認

ヘルスチェックと索引提案を実際に使う

インストールが終われば、あとは自然文で聞くだけです。

このデータベースの健全性をチェックして、問題があれば教えて

analyze_db_healthが呼ばれ、バッファキャッシュのヒット率や接続数、肥大化したインデックスの有無などがまとまって返ってきます。索引の提案はもう一歩踏み込んだ使い方です。

過去1週間で遅いクエリを見つけて、効きそうな索引があれば提案して

1つのクエリだけを対象にしたいなら、対象を絞った聞き方もできます。

このSELECT文にインデックスを1つ足すとしたら、どこに何を足すべき?

この聞き方ではanalyze_query_indexesが呼ばれ、指定したクエリ(最大10個まで)に絞って索引候補を検討します。先ほどの「過去1週間で遅いクエリを見つけて」という聞き方ではget_top_queriesで遅いクエリを特定し、analyze_workload_indexesがワークロード全体から候補となる索引を検討します。ワークロード全体を見たいのか、目の前の1本のクエリだけを見たいのかで、裏側で呼ばれるツールが変わる仕組みです。

実際にインデックスを作成する前にexplain_queryhypopgを使って「その索引があったらこのクエリのコストはどう変わるか」をシミュレートするため、本番で試行錯誤せずに効果を見積もれます。索引を実際に作成するCREATE INDEXの実行自体は、execute_sqlを通じてunrestrictedモードでのみ可能です。

Claude Codeのpermissionsでツールごとに許可を分ける

--access-modeはサーバー起動時に固定するモードですが、Claude Code側のpermissionsを組み合わせると、ツール単位でさらに細かく制御できます。ルールはmcp__<サーバー名>__<ツール名>の形式で書きます。

{
  "permissions": {
    "allow": ["mcp__postgres__analyze_db_health", "mcp__postgres__get_top_queries"],
    "ask": ["mcp__postgres__execute_sql"]
  }
}

この設定なら、ヘルスチェックと遅いクエリの確認はプロンプトなしで通り、execute_sqlを呼ぶたびに確認が挟まります。分析系のツールを日常的に使い、実際のSQL実行だけ都度承認する運用にしておくと、restrictedモードでの制約に加えてもう1つ防御が重なります。設定の書き方全般はClaude Code MCP設定ガイドで扱っています。

DBHubとPostgres MCP Proの使い分け早見表

シーンおすすめ理由
1つのDBに読み取り専用でつなぐだけおすすめDBHub理由設定ファイル不要、既定で読み取り専用
本番DBのパフォーマンス診断・索引提案おすすめPostgres MCP Pro理由ヘルスチェックと索引チューニングに特化
PostgreSQL以外も含む複数DBへの接続おすすめDBHub理由MySQL・SQL Server等にも対応
インデックス追加前のコスト試算おすすめPostgres MCP Pro(restricted)理由仮想インデックスで実際には変更せず見積もれる

よくあるつまずき

  • 索引提案ツールが何も返さない: pg_stat_statementsが有効化されていないとget_top_queriesanalyze_workload_indexesは動かない。SELECT * FROM pg_extension;で有効化状況を確認する
  • 仮想インデックスのシミュレーションが効かない: hypopg拡張が未インストールだと、explain_queryの仮想インデックス機能は通常のEXPLAINと同じ結果しか返さない
  • unrestrictedのまま本番接続文字列を渡してしまう: 開発用にunrestrictedで試した設定をそのまま本番のDATABASE_URIに使い回すと、書き込みも通る状態で本番につながる。環境ごとに接続設定を分ける
  • DBHubと同時登録して重複する: 同じデータベースにDBHubとPostgres MCP Proを両方つなぐと、似た名前のツールが2系統存在してどちらが呼ばれるか分かりにくくなる。用途で片方を/mcpから無効化しておくと混乱を避けられる

よくある質問

DBHubとPostgres MCP Proは同時に使えますか

同時に登録すること自体は可能です。ただしどちらもexecute_sqlに近い機能を持つため、日常のクエリ実行はDBHub、パフォーマンス分析が必要なときだけPostgres MCP Proを有効にする、といった使い分けをしておくと、Claudeがどちらのツールを呼ぶか迷いにくくなります。

Claude Desktopなど他のMCPクライアントでも使えますか

使えます。Postgres MCP Proの配布元はClaude Desktop・Cursor・Windsurfなど複数のMCPクライアント向けの設定例を公開しており、Claude Code固有の手順が明記されていない分はclaude mcp addの一般的な変換手順(--envでのDATABASE_URI受け渡し)で対応できます。

対応するPostgreSQLのバージョンは決まっていますか

配布元は特定バージョンの要件を明記していません。前提となるpg_stat_statementshypopgの両拡張が利用できるバージョンであることが実質的な条件です。クラウドマネージドPostgreSQLでは、拡張機能の許可リストに両方が含まれているか事前に確認します。

テーブル構造を調べるだけの用途にも使えますか

使えます。list_schemasでスキーマ一覧を、list_objectsでテーブル・ビュー・シーケンスの一覧を、get_object_detailsで個々のテーブルのカラム・制約・インデックス情報を取得できます。パフォーマンス分析の前段として、まずスキーマを把握したいだけの場面でも役立ちます。

料金はかかりますか

Postgres MCP ProはMITライセンスで公開されているオープンソースソフトウェアです。サーバー自体の利用に料金はかかりませんが、接続先のPostgreSQLインスタンスの実行コストは別途発生します。

まとめ

Postgres MCP Proは、DBHubが手薄なPostgreSQL固有のパフォーマンス分析を埋めるMCPサーバーです。pg_stat_statementshypopgの2拡張を有効にしておけば、遅いクエリの特定から仮想インデックスでのコスト試算、ヘルスチェックまでを自然文で頼めます。肝心なのはアクセスモードの選択で、本番にはrestricted、書き込みを伴う検証にはunrestrictedと環境ごとに分け、接続に使うDBユーザーの権限も絞っておけば、分析目的のMCPサーバーが誤って本番データを書き換える事故を避けられます。analyze_db_healthanalyze_workload_indexesのような分析系ツールはClaude Codeのpermissionsで許可リストに入れ、実際にデータを書き換えるexecute_sqlだけは都度確認する運用にしておくと、アクセスモードの制約とpermissionsのツール単位の制約という2段構えで防御が重なり、誤操作のリスクをさらに下げられます。

この記事を共有:XはてブLinkedIn