Kaiva Postgres MCP について
Kaiva Postgres MCPは、AIクライアント向けのPostgreSQL読み取り専用サーバーで、アーカイブ済みのserver-postgresを置き換えられます。クエリを単一ステートメントに限定し、実行時間と行数に上限を設け、スキーマ確認ツールも提供します。
主な機能
- 01単一の読み取り専用SQLクエリ
- 02読み取り可能なテーブルとビューの一覧
- 03列、キー、参照関係、インデックスの確認
- 04クエリ時間と返却行数の制限
- 05データベースログイン権限の確認
活用シーン
- 01書き込み権限なしでAIにデータベースを調査させる
- 02クエリ前にテーブル間の関係を確認する
- 03大規模クエリの結果量と実行時間を制限する
MCP 対応
MCPサーバーはquery、list_tables、describe_tableツールと、テーブル列のリソースを公開します。クライアントはPostgreSQL URLまたはDATABASE_URL環境変数で接続できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Kaiva Postgres MCP
読み取り専用を維持する Postgres MCP サーバーです。アーカイブ済みの
@modelcontextprotocol/server-postgresとそのまま置き換えられます。
1 行で切り替え
AI クライアントで現在、アーカイブ済みサーバーを起動している箇所で:
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres", "postgresql://localhost/mydb"]
}
}
}
パッケージ名を変更します:
"args": ["-y", "@kaiva/postgres-mcp", "postgresql://localhost/mydb"]
Claude Code の場合:
claude mcp add postgres -- npx -y @kaiva/postgres-mcp postgresql://localhost/mydb
query ツール、その sql 入力、テーブルスキーマのリソースは同じなので、ほかに変更はありません。
環境変数にDATABASE_URLを設定したうえで利用できる方法:
- Claude Code プラグイン:
/plugin install postgres-mcp --marketplace ai-kaiva/postgres-mcp - Gemini CLI 拡張機能:
gemini extensions install https://github.com/ai-kaiva/postgres-mcpを実行し、その後gemini extensions config kaiva-postgres-mcpでデータベース URL を入力します - Docker:イメージの公開後、
docker run -i --rm -e DATABASE_URL ghcr.io/ai-kaiva/postgres-mcpを実行します
切り替える理由
アーカイブ済みサーバーはメンテナンスされていません。Anthropic は 2025 年に、本番ソフトウェアではなく参考例としてアーカイブし、npm では「パッケージはサポートされなくなりました」と表示されています。受け取ったテキストを何でもBEGIN TRANSACTION READ ONLYの中で実行しますが、それでは不十分です。
COMMIT; DROP SCHEMA public CASCADEは読み取り専用トランザクションを終了し、スキーマを削除します(2025 年 8 月に Datadog Security Labs が報告しましたが、修正は npm に反映されておらず、最新バージョンは依然として 0.6.2 です)。- スーパーユーザーでログインしている場合(ローカル環境や Docker のインストールの多くはこの状態で開始します)、1 つのステートメントでデータベースサーバー上のシェルコマンドを実行できます。PostgreSQL は読み取り専用トランザクション内で
COPY ... TO PROGRAMを実行します。
PostgreSQL 14 でバージョン 0.6.2 を使い、両方の動作を確認しました。どちらも実行されました。Kaiva Postgres MCP はどちらも拒否します。
| アーカイブ済み 0.6.2 | Kaiva Postgres MCP | |
|---|---|---|
COMMIT後の 2 つ目のステートメント | 実行されます | 拒否されます:1 回の呼び出しにつき 1 つのステートメントで、PostgreSQL 自体も 2 つ目を拒否します |
COPY ... TO PROGRAM、サーバー上のファイル読み取り、dblink | ログインに許可されていれば実行されます | 拒否されます |
| 制限時間 | なし | ステートメントごとに 15 秒、ロック待ちは 3 秒 |
| 返される行数 | すべて | 最初の 1,000 行。上限に達したことも通知します |
| スーパーユーザーでのログイン | そのまま使用されます | このマシンでは警告が表示されます。別のマシン上のデータベースでは、許可しない限り拒否されます |
| 一覧表示されるテーブル | publicスキーマのみ | すべてのスキーマ |
| 日付とタイムスタンプ | JavaScript の日付に変換されるため、日付が前日にずれることがあります | PostgreSQL の表示どおりです |
| エラー | プロトコルエラーとして返されます | 修正方法とともに AI に返されます |
| メンテナンス | いいえ | はい |
ツール
query:読み取り専用の SQL ステートメント(SELECT、WITH、VALUES、TABLE、SHOW、EXPLAIN)を 1 つ実行し、行を JSON として取得します。list_tables:このログインで読み取り可能なテーブルとビューを、種類、推定行数、コメントとともに表示します。describe_table:テーブルの列、主キー、一意キーと外部キー、そのテーブルを参照するテーブル、およびインデックスを表示します。
リソース:アーカイブ済みサーバーと同様に、各テーブルの列を表示します。
読み取り専用を強制する仕組み
呼び出しごとに、次の処理を行います。
- SQL を送信前に検査します。ステートメントは 1 つで、
SELECT、WITH、VALUES、TABLE、SHOW、EXPLAINのいずれかで始まる必要があります。また、トランザクションの外部にアクセスする関数(dblink、サーバーファイル関数、lo_importとlo_export、pg_terminate_backend、アドバイザリロック、テキストとして渡された SQL を実行する関数)は呼び出せません。 - PostgreSQL の拡張クエリプロトコルを通じて単独で実行します。このプロトコルは 2 つ目のステートメントを拒否します。実行は、ステートメントの時間制限とロックの時間制限を設定した
READ ONLYトランザクション内で行います。 - トランザクションは必ずロールバックされ、
DISCARD ALLでセッションがリセットされるため、ステートメントが設定した内容がその後も残ることはありません。
データベースから取得するのは最初の 1,000 行だけです(さらに 1 行読み取り、続きがあるかどうかを確認します)。そのため、大きなテーブルに対するクエリもすぐに返ります。
読み取り専用のログインを使用する
最も強力な保護策は、書き込みができないログインを使用することです。管理者として一度実行し、接続 URL に
mcp_readonly を指定してください。
CREATE ROLE mcp_readonly LOGIN PASSWORD 'choose-a-password';
GRANT CONNECT ON DATABASE mydb TO mcp_readonly;
GRANT pg_read_all_data TO mcp_readonly; -- PostgreSQL 14 and later
ALTER ROLE mcp_readonly SET default_transaction_read_only = on;
ログインでできることを確認するには:
npx -y @kaiva/postgres-mcp postgresql://mcp_readonly:...@localhost/mydb --check
オプション
| オプション | デフォルト | |
|---|---|---|
--max-rows <n> | 1000 | クエリごとに返す行数。1~10000 |
--timeout <seconds> | 15 | ステートメントごとの制限時間。1~300 |
--allow-superuser | off | 別のマシン上のデータベースでスーパーユーザーのログインを許可します。Docker Compose ではデータベースが別のコンテナにあるため、こちらにも適用されます。読み取り専用のログインを使用する方が適切です |
--check | 一度接続し、ログインでできることを報告して終了します |
接続 URL を最初の引数として指定するか、DATABASE_URL を設定してください。TLS の設定は psql と同様に URL(sslmode、sslrootcert)に指定します。
保護されないもの
- ログインで読み取れるものはすべて、AI も読み取れます。テーブル、ビュー、外部テーブルに加え、スーパーユーザーの場合はシステムカタログも対象です(
pg_authidにはパスワードのハッシュが格納されています)。共有するテーブルだけを参照できるログインを使用してください。 - 拒否対象関数のリストは二重の保護策であり、サンドボックスではありません。ビュー、外部テーブル(
file_fdw)、またはデータベースにすでに定義されている関数が読み取り時に実行する処理ではなく、AI が送信する SQL を確認します。スーパーユーザーのログインでは、こうしたオブジェクトがデータベースサーバー上のファイルを読み取れる場合があります。読み取り専用のログインでは、PostgreSQL 自体がこれを拒否します(確認済み:pg_read_fileを参照するビューはスーパーユーザーとしてファイルを読み取るため、読み取り専用のログインでは拒否されます)。 - 「このマシン」とは、localhost、127.x、::1、Unix ソケット、
*.localhost、およびhost.docker.internal(Docker ホスト)を意味します。それ以外の場所では、Docker Compose のサービス名やプライベートネットワークのアドレスも含め、--allow-superuserを指定しない限りスーパーユーザーは拒否されます。
Claude.ai、ChatGPT、またはチームでの利用
このパッケージはお使いのマシン上で動作します。Claude.ai または ChatGPT から同じデータベースを利用する場合や、サインインが必要な環境でチームと共有する場合は、Kaiva Bridge が管理型の MCP サーバーとして提供します。.env に DATABASE_URL を記載したプロジェクトフォルダーで:
npx @kaiva/bridge push mydb --db
データベースはインターネットからアクセスできる必要があります。https://kaiv.ai/bridge?utm_source=postgres-mcp&utm_medium=readme
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。