🚀 PostgreSQL Performance Tuning MCP
このModel Context Protocol (MCP)サーバーは、AIを搭載したPostgreSQLのパフォーマンスチューニング機能を提供します。このサーバーは、低速クエリの特定、最適なインデックスの推奨、実行プランの分析、およびHypoPGを使用した仮想インデックスのテストを支援します。

🚀 クイックスタート
このセクションでは、PostgreSQL Performance Tuning MCPの基本的な使い方を説明します。サーバーのインストールから設定、実際の使用までの手順を追っていきます。
✨ 主な機能
クエリ分析
pg_stat_statementsから低速クエリを詳細な統計情報とともに取得します。
EXPLAINとEXPLAIN ANALYZEを使用してクエリの実行プランを分析します。
- 自動化されたプラン分析によりパフォーマンスのボトルネックを特定します。
- アクティブなクエリを監視し、長時間実行されるトランザクションを検出します。
インデックスチューニング
- クエリワークロード分析に基づくAIによるインデックス推奨を行います。
- HypoPG拡張機能を使用した仮想インデックステスト(ディスク使用量がない)。
- クリーンアップのために未使用および重複するインデックスを見つけます。
- 作成前にインデックスのサイズを推定します。
- 実装する前に提案されたインデックスでクエリプランをテストします。
データベースの健全性
- 複数のチェックによる包括的な健全性スコアリング。
- 接続利用率の監視。
- キャッシュヒット率の分析(バッファおよびインデックス)。
- ロック競合の検出。
- バキュームの健全性とトランザクションIDのラップアラウンドの監視。
- レプリケーション遅延の監視。
- バックグラウンドライターとチェックポイントの分析。
バキューム監視
- 長時間実行されるVACUUMおよびVACUUM FULL操作をリアルタイムで追跡します。
- オートバキュームの進捗状況とパフォーマンスを監視します。
- バキュームが必要なテーブルを特定します。
- 最近のバキュームアクティビティ履歴を表示します。
- オートバキュームの設定の有効性を分析します。
I/Oパフォーマンス分析
- テーブルとインデックス全体のディスク読み書きパターンを分析します。
- I/Oのボトルネックとホットテーブルを特定します。
- バッファキャッシュのヒット率を監視します。
- work_memの問題を示す一時ファイルの使用量を追跡します。
- チェックポイントとバックグラウンドライターのI/Oを分析します。
- PostgreSQL 16以降の拡張されたpg_stat_ioメトリックのサポート。
設定分析
- カテゴリ別にPostgreSQLの設定をレビューします。
- メモリ、チェックポイント、WAL、オートバキューム、および接続設定の推奨事項を取得します。
- 最適でない設定を特定します。
MCPプロンプトとリソース
- 一般的なチューニングワークフローのための事前定義されたプロンプトテンプレート。
- テーブル統計、インデックス情報、および健全性チェックのための動的リソース。
- 包括的なドキュメントリソース。
📦 インストール
標準インストール(Claude DesktopなどのMCPクライアント用)
pip install pgtuner_mcp
またはuvを使用する場合:
uv pip install pgtuner_mcp
手動インストール
git clone https://github.com/isdaniel/pgtuner_mcp.git
cd pgtuner_mcp
pip install -e .
📚 ドキュメント
設定
環境変数
| 変数 |
説明 |
必須 |
DATABASE_URI |
PostgreSQLの接続文字列 |
はい |
PGTUNER_EXCLUDE_USERIDS |
監視から除外するユーザーID(OID)のカンマ区切りリスト |
いいえ |
接続文字列の形式: postgresql://user:password@host:port/database
最小限のユーザー権限
このMCPサーバーを実行するには、PostgreSQLユーザーにシステムカタログと拡張機能を照会するための特定の権限が必要です。以下は、さまざまな機能セットに必要な最小限の権限です。
基本権限(コア機能に必要)
CREATE USER pgtuner_monitor WITH PASSWORD 'secure_password';
GRANT CONNECT ON DATABASE your_database TO pgtuner_monitor;
GRANT USAGE ON SCHEMA public TO pgtuner_monitor;
GRANT USAGE ON SCHEMA pg_catalog TO pgtuner_monitor;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO pgtuner_monitor;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO pgtuner_monitor;
GRANT pg_read_all_stats TO pgtuner_monitor;
拡張機能固有の権限
pgstattuple(ブロート検出用):
CREATE EXTENSION IF NOT EXISTS pgstattuple;
GRANT EXECUTE ON FUNCTION pgstattuple(regclass) TO pgtuner_monitor;
GRANT EXECUTE ON FUNCTION pgstattuple_approx(regclass) TO pgtuner_monitor;
GRANT EXECUTE ON FUNCTION pgstatindex(regclass) TO pgtuner_monitor;
GRANT EXECUTE ON FUNCTION pgstatginindex(regclass) TO pgtuner_monitor;
GRANT EXECUTE ON FUNCTION pgstathashindex(regclass) TO pgtuner_monitor;
GRANT pg_stat_scan_tables TO pgtuner_monitor;
HypoPG(仮想インデックステスト用):
CREATE EXTENSION IF NOT EXISTS hypopg;
GRANT SELECT ON hypopg_list_indexes TO pgtuner_monitor;
GRANT SELECT ON hypopg_hidden_indexes TO pgtuner_monitor;
GRANT EXECUTE ON FUNCTION hypopg_create_index(text) TO pgtuner_monitor;
GRANT EXECUTE ON FUNCTION hypopg_drop_index(oid) TO pgtuner_monitor;
GRANT EXECUTE ON FUNCTION hypopg_reset() TO pgtuner_monitor;
GRANT EXECUTE ON FUNCTION hypopg_hide_index(oid) TO pgtuner_monitor;
GRANT EXECUTE ON FUNCTION hypopg_unhide_index(oid) TO pgtuner_monitor;
GRANT EXECUTE ON FUNCTION hypopg_relation_size(oid) TO pgtuner_monitor;
完全なセットアップスクリプト
CREATE USER pgtuner_monitor WITH PASSWORD 'secure_password';
GRANT CONNECT ON DATABASE your_database TO pgtuner_monitor;
GRANT USAGE ON SCHEMA public TO pgtuner_monitor;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO pgtuner_monitor;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO pgtuner_monitor;
GRANT pg_read_all_stats TO pgtuner_monitor;
GRANT SELECT ON pg_stat_statements TO pgtuner_monitor;
GRANT SELECT ON pg_stat_statements_info TO pgtuner_monitor;
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
CREATE EXTENSION IF NOT EXISTS pgstattuple;
GRANT pg_stat_scan_tables TO pgtuner_monitor;
CREATE EXTENSION IF NOT EXISTS hypopg;
GRANT SELECT ON hypopg_list_indexes TO pgtuner_monitor;
GRANT SELECT ON hypopg_hidden_indexes TO pgtuner_monitor;
GRANT EXECUTE ON FUNCTION hypopg_create_index(text) TO pgtuner_monitor;
GRANT EXECUTE ON FUNCTION hypopg_drop_index(oid) TO pgtuner_monitor;
GRANT EXECUTE ON FUNCTION hypopg_reset() TO pgtuner_monitor;
GRANT EXECUTE ON FUNCTION hypopg_hide_index(oid) TO pgtuner_monitor;
GRANT EXECUTE ON FUNCTION hypopg_unhide_index(oid) TO pgtuner_monitor;
GRANT EXECUTE ON FUNCTION hypopg_relation_size(oid) TO pgtuner_monitor;
SET ROLE pgtuner_monitor;
SELECT * FROM pg_stat_statements LIMIT 1;
SELECT * FROM pg_stat_activity WHERE pid = pg_backend_pid();
SELECT * FROM pgstattuple('pg_class') LIMIT 1;
SELECT * FROM hypopg_list_indexes();
RESET ROLE;
特定のユーザーを監視から除外する
特定のPostgreSQLユーザーをクエリ分析と監視結果から除外することができます。これは、以下のようなユーザーをフィルタリングするのに役立ちます。
- 監視またはレプリケーションユーザー
- システムアカウント
- 内部アプリケーションサービスアカウント
PGTUNER_EXCLUDE_USERIDS環境変数にユーザーOIDのカンマ区切りリストを設定します。
export PGTUNER_EXCLUDE_USERIDS="16384,16385,16386"
特定のPostgreSQLユーザーのOIDを見つけるには:
SELECT usesysid, usename FROM pg_user WHERE usename = 'monitoring_user';
設定すると、以下のクエリがフィルタリングされます。
pg_stat_activityクエリ(usesysid列でフィルタリング)
pg_stat_statementsクエリ(userid列でフィルタリング)
これは、get_slow_queries、get_active_queries、analyze_wait_events、check_database_health、およびget_index_recommendationsなどのツールに影響します。
MCPクライアントの設定
cline_mcp_settings.jsonまたはClaude Desktopの設定に追加します。
{
"mcpServers": {
"pgtuner_mcp": {
"command": "python",
"args": ["-m", "pgtuner_mcp"],
"env": {
"DATABASE_URI": "postgresql://user:password@localhost:5432/mydb"
},
"disabled": false,
"autoApprove": []
}
}
}
またはストリーミング可能なHTTPモード
{
"mcpServers": {
"pgtuner_mcp": {
"type": "http",
"url": "http://localhost:8080/mcp"
}
}
}
サーバーモード
1. 標準MCPモード(デフォルト)
python -m pgtuner_mcp
python -m pgtuner_mcp --mode stdio
2. HTTP SSEモード(レガシーWebアプリケーション用)
SSE(Server-Sent Events)モードは、MCP通信のためのWebベースのトランスポートを提供します。WebアプリケーションやHTTPベースの通信を必要とするクライアントに役立ちます。
python -m pgtuner_mcp --mode sse
python -m pgtuner_mcp --mode sse --host localhost --port 3000
python -m pgtuner_mcp --mode sse --debug
SSEエンドポイント:
| エンドポイント |
メソッド |
説明 |
/sse |
GET |
SSE接続エンドポイント - クライアントはここに接続してサーバーイベントを受信します |
/messages |
POST |
サーバーにメッセージ/リクエストを送信します |
SSE用のMCPクライアント設定:
SSEトランスポートをサポートするMCPクライアント(Claude Desktopやカスタムクライアントなど)の場合:
{
"mcpServers": {
"pgtuner_mcp": {
"type": "sse",
"url": "http://localhost:8080/sse"
}
}
}
3. ストリーミング可能なHTTPモード(推奨される最新のMCPプロトコル)
ストリーミング可能なHTTPモードは、単一の/mcpエンドポイントで最新のMCP Streamable HTTPプロトコルを実装します。ステートフル(セッションベース)およびステートレスモードの両方をサポートします。
python -m pgtuner_mcp --mode streamable-http
python -m pgtuner_mcp --mode streamable-http --stateless
python -m pgtuner_mcp --mode streamable-http --host localhost --port 8080
python -m pgtuner_mcp --mode streamable-http --debug
ステートフルとステートレスの比較:
- ステートフル(デフォルト):
mcp-session-idヘッダーを使用してリクエスト間でセッション状態を維持します。長時間実行されるインタラクションに最適です。
- ステートレス: セッション追跡なしで各リクエストに新しいトランスポートを作成します。サーバーレスデプロイメントや単純なリクエスト/レスポンスパターンに最適です。
エンドポイント: http://{host}:{port}/mcp
利用可能なツール
⚠️ 重要提示
すべてのツールは、ユーザー/アプリケーションのテーブルとインデックスにのみ焦点を当てています。システムカタログテーブル(pg_catalog、information_schema、pg_toast)はすべての分析から自動的に除外されます。
パフォーマンス分析ツール
| ツール |
説明 |
get_slow_queries |
pg_stat_statementsから低速クエリを詳細な統計情報(合計時間、平均時間、呼び出し回数、キャッシュヒット率)とともに取得します。システムカタログクエリを除外します。 |
analyze_query |
EXPLAIN ANALYZEを使用してクエリの実行プランを分析し、自動的な問題検出を含みます。 |
get_table_stats |
サイズ、行数、削除されたタプル、およびアクセスパターンを含む詳細なテーブル統計を取得します。 |
analyze_disk_io_patterns |
ディスクI/Oの読み書きパターンを分析し、ホットテーブル、バッファキャッシュの効率、およびI/Oのボトルネックを特定します。分析タイプ(すべて、バッファプール、テーブル、インデックス、一時ファイル、チェックポイント)でフィルタリングをサポートします。 |
インデックスチューニングツール
| ツール |
説明 |
get_index_recommendations |
クエリワークロード分析に基づくAIによるインデックス推奨を行います。 |
explain_with_indexes |
実際のインデックスを作成せずに、仮想インデックスでEXPLAINを実行して改善をテストします。 |
manage_hypothetical_indexes |
HypoPGの仮想インデックスを作成、一覧表示、削除、またはリセットします。既存のインデックスの非表示/表示をサポートします。 |
find_unused_indexes |
安全に削除できる未使用および重複するインデックスを見つけます。 |
データベース健全性ツール
| ツール |
説明 |
check_database_health |
包括的な健全性チェックを行い、スコアリング(接続、キャッシュ、ロック、レプリケーション、ラップアラウンド、ディスク、チェックポイント)を行います。 |
get_active_queries |
アクティブなクエリを監視し、長時間実行されるトランザクションとブロックされたクエリを見つけます。デフォルトではシステムプロセスを除外します。 |
analyze_wait_events |
待機イベントを分析してI/O、ロック、またはCPUのボトルネックを特定します。クライアントバックエンドプロセスに焦点を当てます。 |
review_settings |
カテゴリ別にPostgreSQLの設定をレビューし、最適化の推奨事項を提供します。 |
ブロート検出ツール(pgstattuple)
| ツール |
説明 |
analyze_table_bloat |
pgstattuple拡張機能を使用してテーブルのブロートを分析します。削除されたタプルの数、空き領域、および無駄な領域の割合を表示します。 |
analyze_index_bloat |
pgstatindexを使用してB-treeインデックスのブロートを分析します。リーフ密度、断片化、および空/削除されたページを表示します。GINおよびハッシュインデックスもサポートします。 |
get_bloat_summary |
データベースのブロートの包括的な概要を取得し、最上位のブロートのあるテーブル/インデックス、回収可能な総領域、および優先的なメンテナンスアクションを表示します。 |
バキューム監視ツール
| ツール |
説明 |
monitor_vacuum_progress |
手動のVACUUM、VACUUM FULL、およびオートバキューム操作を追跡します。進捗率、削除されたタプルの収集、インデックスバキュームのラウンド、および推定残り時間を監視します。オートバキュームの設定レビューとメンテナンスが必要なテーブルを含みます。 |
ツールのパラメータ
get_slow_queries
limit: 返す最大クエリ数(デフォルト: 10)
min_calls: 最小呼び出し回数フィルター(デフォルト: 1)
min_mean_time_ms: 最小平均(平均)実行時間(ミリ秒)フィルター
order_by: mean_time、calls、またはrowsでソート
analyze_query
query (必須): 分析するSQLクエリ
analyze: EXPLAIN ANALYZEでクエリを実行(デフォルト: true)
buffers: バッファ統計を含める(デフォルト: true)
format: 出力形式 - json、text、yaml、xml
get_index_recommendations
workload_queries: 分析する特定のクエリのオプションのリスト
max_recommendations: 最大推奨数(デフォルト: 10)
min_improvement_percent: 最小改善閾値(デフォルト: 10%)
include_hypothetical_testing: HypoPGでテストする(デフォルト: true)
target_tables: 特定のテーブルに焦点を当てる
check_database_health
include_recommendations: 実行可能な推奨事項を含める(デフォルト: true)
verbose: 詳細な統計を含める(デフォルト: false)
analyze_table_bloat
table_name: 分析する特定のテーブルの名前(オプション)
schema_name: スキーマ名(デフォルト: public)
use_approx: 大規模なテーブルの高速分析にpgstattuple_approxを使用する(デフォルト: false)
min_table_size_gb: スキーマ全体のスキャンに含める最小テーブルサイズ(GB)(デフォルト: 5)
include_toast: TOASTテーブルの分析を含める(デフォルト: false)
analyze_index_bloat
index_name: 分析する特定のインデックスの名前(オプション)
table_name: このテーブルのすべてのインデックスを分析する(オプション)
schema_name: スキーマ名(デフォルト: public)
min_index_size_gb: 含める最小インデックスサイズ(GB)(デフォルト: 5)
min_bloat_percent: このパーセンテージ以上のブロートのあるインデックスのみを表示する(デフォルト: 20)
get_bloat_summary
schema_name: 分析するスキーマ(デフォルト: public)
top_n: 表示する最上位のブロートのあるオブジェクトの数(デフォルト: 10)
min_size_gb: 含める最小オブジェクトサイズ(GB)(デフォルト: 5)
monitor_vacuum_progress
action: 実行するアクション - progress(アクティブなバキューム操作を監視)、needs_vacuum(バキュームが必要なテーブルを見つける)、autovacuum_status(オートバキュームの設定をレビュー)、またはrecent_activity(最近のバキューム履歴を表示)
schema_name: 分析するスキーマ(デフォルト: public、needs_vacuumアクションで使用)
top_n: 返す結果の数(デフォルト: 20)
analyze_disk_io_patterns
analysis_type: I/O分析のタイプ - all(包括的)、buffer_pool(キャッシュヒット率)、tables(テーブルI/Oパターン)、indexes(インデックスI/Oパターン)、temp_files(一時ファイルの使用量)、またはcheckpoints(チェックポイントI/O統計)
schema_name: 分析するスキーマ(デフォルト: public)
top_n: 表示する最上位のI/O集中型オブジェクトの数(デフォルト: 20)
min_size_gb: 含める最小オブジェクトサイズ(GB)(デフォルト: 1)
MCPプロンプト
サーバーには、ガイド付きチューニングセッションのための事前定義されたプロンプトテンプレートが含まれています。
| プロンプト |
説明 |
diagnose_slow_queries |
系統的な低速クエリ調査ワークフロー |
index_optimization |
包括的なインデックス分析とクリーンアップ |
health_check |
完全なデータベース健全性評価 |
query_tuning |
特定のSQLクエリを最適化 |
performance_baseline |
比較用のベースラインレポートを生成 |
MCPリソース
静的リソース
pgtuner://docs/tools - 完全なツールドキュメント
pgtuner://docs/workflows - 一般的なチューニングワークフローガイド
pgtuner://docs/prompts - プロンプトテンプレートのドキュメント
動的リソーステンプレート
pgtuner://table/{schema}/{table_name}/stats - テーブル統計
pgtuner://table/{schema}/{table_name}/indexes - テーブルインデックス情報
pgtuner://query/{query_hash}/stats - クエリパフォーマンス統計
pgtuner://settings/{category} - PostgreSQLの設定(メモリ、チェックポイント、wal、オートバキューム、接続、すべて)
pgtuner://health/{check_type} - 健全性チェック(接続、キャッシュ、ロック、レプリケーション、ブロート、すべて)
PostgreSQL拡張機能のセットアップ
HypoPG拡張機能
HypoPGは、実際にインデックスを作成せずにインデックスをテストできるようにします。これは、以下のような場合に非常に有用です。
- 提案されたインデックスがクエリプランナーによって使用されるかどうかをテストする。
- 異なるインデックス戦略で実行プランを比較する。
- コミットする前にストレージ要件を推定する。
データベースでHypoPGを有効にする
HypoPGは、ディスク上にインデックスを作成せずに仮想インデックスをテストできるようにします。
CREATE EXTENSION IF NOT EXISTS hypopg;
SELECT * FROM hypopg_list_indexes();
pg_stat_statements拡張機能
pg_stat_statements拡張機能は、クエリパフォーマンス分析に必須です。サーバーで実行されるすべてのSQLステートメントの計画と実行統計を追跡します。
ステップ1: postgresql.confで拡張機能を有効にする
postgresql.confファイルに以下を追加します。
shared_preload_libraries = 'pg_stat_statements'
compute_query_id = on
pg_stat_statements.max = 10000
pg_stat_statements.track = top
pg_stat_statements.track_utility = on
⚠️ 重要提示
shared_preload_librariesを変更した後、PostgreSQLサーバーの再起動が必要です。
ステップ2: データベースで拡張機能を作成する
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
SELECT * FROM pg_stat_statements LIMIT 1;
pgstattuple拡張機能
pgstattuple拡張機能は、ブロート検出ツール(analyze_table_bloat、analyze_index_bloat、get_bloat_summary)に必須です。テーブルとインデックスのタプルレベルの統計を取得する関数を提供します。
CREATE EXTENSION IF NOT EXISTS pgstattuple;
SELECT * FROM pgstattuple('pg_class') LIMIT 1;
パフォーマンス影響の考慮事項
| 設定 |
オーバーヘッド |
推奨事項 |
pg_stat_statements |
低(約1-2%) |
常に有効にする |
track_io_timing |
低 - 中(約2-5%) |
本番環境で有効にする前にテストする |
track_functions = all |
低 |
関数中心のワークロードで有効にする |
pg_stat_statements.track_planning |
中 |
計画問題を調査するときのみ有効にする |
log_min_duration_statement |
低 |
低速クエリの特定に推奨 |
💡 使用建议
track_io_timingを有効にする前に、pg_test_timingを使用して特定のシステムでのタイミングオーバーヘッドを測定してください。
💻 使用例
低速クエリを見つけて分析する
slow_queries = await get_slow_queries(limit=10, order_by="total_time")
analysis = await analyze_query(
query="SELECT * FROM orders WHERE user_id = 123",
analyze=True,
buffers=True
)
インデックスの推奨事項を取得する
recommendations = await get_index_recommendations(
max_recommendations=5,
min_improvement_percent=20,
include_hypothetical_testing=True
)
for rec in recommendations["recommendations"]:
print(rec["create_statement"])
データベースの健全性チェック
health = await check_database_health(
include_recommendations=True,
verbose=True
)
print(f"健全性スコア: {health['overall_score']}/100")
print(f"ステータス: {health['status']}")
for issue in health["issues"]:
print(f"{issue}")
未使用のインデックスを見つける
unused = await find_unused_indexes(
schema_name="public",
include_duplicates=True
)
for stmt in unused["recommendations"]:
print(stmt)
Docker
docker pull dog830228/pgtuner_mcp
docker run -p 8080:8080 \
-e DATABASE_URI=postgresql://user:pass@host:5432/db \
dog830228/pgtuner_mcp --mode streamable-http
docker run -p 8080:8080 \
-e DATABASE_URI=postgresql://user:pass@host:5432/db \
dog830228/pgtuner_mcp --mode streamable-http --stateless
docker run -p 8080:8080 \
-e DATABASE_URI=postgresql://user:pass@host:5432/db \
dog830228/pgtuner_mcp --mode sse
docker run -i \
-e DATABASE_URI=postgresql://user:pass@host:5432/db \
dog830228/pgtuner_mcp --mode stdio
要件
- Python: 3.10+
- PostgreSQL: 12+(推奨: 14+)
- 拡張機能:
pg_stat_statements(クエリ分析に必要)
hypopg(オプション、仮想インデックステスト用)
依存関係
コア依存関係
mcp[cli]>=1.12.0 - Model Context Protocol SDK
psycopg[binary,pool]>=3.1.0 - 接続プーリングを備えたPostgreSQLアダプター
pglast>=7.10 - PostgreSQLクエリパーサー
オプション(HTTPモード用)
starlette>=0.27.0 - ASGIフレームワーク
uvicorn>=0.23.0 - ASGIサーバー
コントリビュート
コントリビューションは大歓迎です!プルリクエストを送信してください。