PostgreSQL MCP Server (Enhanced) について
AI アプリケーションから PostgreSQL を調査・変更するためのサーバーです。読み取り専用クエリに加え、トランザクションによるデータ変更やテーブル、関数、トリガー、インデックスの管理に対応します。
主な機能
- 01読み取り専用 SQL クエリの実行
- 02トランザクションでの挿入・更新・削除
- 03テーブル・関数・トリガーの作成
- 04インデックス作成とテーブル変更
- 05テーブルスキーマリソースの参照
活用シーン
- 01スキーマの確認とレコードの検索
- 02トランザクションによるレコード変更
- 03テーブル作成やデータベース構造の調整
MCP 対応
MCP サーバーは、PostgreSQL のクエリ・変更ツールと、自動検出されたテーブルスキーマリソースをクライアントに提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
PostgreSQL MCP サーバー(拡張版)
PostgreSQL データベースへの読み取りと書き込みの両方のアクセスを提供する、Model Context Protocol サーバーです。このサーバーにより、LLM はデータベーススキーマを調査し、クエリを実行し、データを変更し、データベースのスキーマオブジェクトを作成・変更できます。
注: これは、Anthropic による元の PostgreSQL MCP サーバー の拡張版です。元のサーバーは読み取り専用アクセスを提供しますが、この拡張版では書き込み機能とスキーマ管理機能が追加されています。
コンポーネント
ツール
データクエリ
- query
- 接続されたデータベースに対して読み取り専用 SQL クエリを実行します
- 入力:
sql(string):実行する SQL クエリ - すべてのクエリは READ ONLY トランザクション内で実行されます
データ変更
-
execute
- データを変更する SQL 文(INSERT、UPDATE、DELETE)を実行します
- 入力:
sql(string):実行する SQL 文 - 適切な COMMIT/ROLLBACK 処理を行うトランザクション内で実行されます
-
insert
- テーブルに新しいレコードを挿入します
- 入力:
table(string):テーブル名data(object):キーが列名、値が挿入するデータであるキーと値のペア
-
update
- テーブル内のレコードを更新します
- 入力:
table(string):テーブル名data(object):更新するフィールドのキーと値のペアwhere(string):更新するレコードを特定する WHERE 条件
-
delete
- テーブルからレコードを削除します
- 入力:
table(string):テーブル名where(string):削除するレコードを特定する WHERE 条件
スキーマ管理
-
createTable
- 指定された列と制約を含む新しいテーブルを作成します
- 入力:
tableName(string):テーブル名columns(array):名前、型、任意の制約を含む列定義の配列constraints(array):任意のテーブルレベル制約の配列
-
createFunction
- PostgreSQL の関数/プロシージャを作成します
- 入力:
name(string):関数名parameters(string):関数のパラメーターreturnType(string):戻り値の型language(string):言語(plpgsql、sql など)body(string):関数の本体options(string):任意の追加関数オプション
-
createTrigger
- テーブルにトリガーを作成します
- 入力:
name(string):トリガー名tableName(string):トリガーを適用するテーブルfunctionName(string):呼び出す関数when(string):BEFORE、AFTER、または INSTEAD OFevents(array):イベントの配列(INSERT、UPDATE、DELETE)forEach(string):ROW または STATEMENTcondition(string):任意の WHEN 条件
-
createIndex
- テーブルにインデックスを作成します
- 入力:
tableName(string):テーブル名indexName(string):インデックス名columns(array):インデックスを作成する列unique(boolean):インデックスが一意かどうかtype(string):任意のインデックス型(BTREE、HASH、GIN、GIST など)where(string):任意の条件
-
alterTable
- テーブル構造を変更します
- 入力:
tableName(string):テーブル名operation(string):操作(ADD COLUMN、DROP COLUMN など)details(string):操作の詳細
リソース
サーバーは、データベース内の各テーブルのスキーマ情報を提供します。
- テーブルスキーマ(
postgres://<host>/<table>/schema)- 各テーブルの JSON スキーマ情報
- 列名とデータ型を含みます
- データベースのメタデータから自動的に検出されます
Claude Desktop での使用方法
このサーバーを Claude Desktop アプリで使用するには、次の設定を claude_desktop_config.json の「mcpServers」セクションに追加します。
Docker
- macOS で Docker を実行する場合、サーバーがホストネットワーク(例:localhost)で実行されているときは、host.docker.internal を使用してください
- postgresql URL に
postgresql://user:password@host:port/db-nameを指定すると、ユーザー名とパスワードを追加できます - SSL 証明書の検証を回避する必要がある場合は、
?sslmode=no-verifyを追加してください
{
"mcpServers": {
"postgres": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"mcp/postgres",
"postgresql://host.docker.internal:5432/mydb"]
}
}
}
NPX
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-postgres",
"postgresql://localhost/mydb"
]
}
}
}
/mydb をデータベース名に置き換えてください。
使用例
データのクエリ
/query SELECT * FROM users LIMIT 5
データの挿入
/insert table="users", data={"name": "John Doe", "email": "[email protected]"}
データの更新
/update table="users", data={"status": "inactive"}, where="id='123'"
テーブルの作成
/createTable tableName="tasks", columns=[
{"name": "id", "type": "SERIAL", "constraints": "PRIMARY KEY"},
{"name": "title", "type": "VARCHAR(100)", "constraints": "NOT NULL"},
{"name": "created_at", "type": "TIMESTAMP", "constraints": "DEFAULT CURRENT_TIMESTAMP"}
]
関数とトリガーの作成
/createFunction name="update_timestamp", parameters="", returnType="TRIGGER", language="plpgsql", body="BEGIN NEW.updated_at = NOW(); RETURN NEW; END;"
/createTrigger name="set_timestamp", tableName="tasks", functionName="update_timestamp", when="BEFORE", events=["UPDATE"], forEach="ROW"
ビルド
Docker:
docker build -t mcp/postgres -f Dockerfile .
セキュリティに関する考慮事項
- すべてのデータ変更操作では、適切な COMMIT/ROLLBACK 処理を伴うトランザクションを使用します
- 各操作では、透明性を確保するため、実行された SQL が返されます
- サーバーでは、SQL インジェクションを防ぐため、挿入/更新操作にパラメーター化クエリを使用します
- セキュリティ修正(v1.0.2):読み取り専用クエリツールでは、複数のステートメントを実行してトランザクション分離を回避する SQL インジェクション攻撃を防ぐため、プリペアドステートメントを使用するようになりました
ライセンス
この MCP サーバーは MIT ライセンスの下でライセンスされています。つまり、MIT ライセンスの利用規約に従うことを条件に、ソフトウェアを自由に使用、変更、配布できます。詳細については、プロジェクトリポジトリ内の LICENSE ファイルをご覧ください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。