AWS Labs postgres MCP Server
Aurora Postgres 用の AWS Labs Model Context Protocol (MCP) サーバーです。
機能
自然言語から Postgres SQL クエリへの変換
- 人間が読める質問やコマンドを、構造化された Postgres 互換の SQL クエリに変換し、設定された Aurora Postgres データベースに対して実行します。
前提条件
- Astral または GitHub README から
uvをインストールします uv python install 3.10を使用して Python をインストールします- この MCP サーバーは、LLM クライアントと同じホスト上でのみローカルに実行できます。
- Docker ランタイム
- AWS サービスへのアクセス権を持つ AWS 認証情報を設定します
- 適切な権限を持つ AWS アカウントが必要です
aws configureまたは環境変数で AWS 認証情報を設定します
インストール
| Kiro | Cursor | VS Code |
|---|---|---|
MCP クライアントの設定で MCP サーバーを設定します(例:Kiro の場合は ~/.kiro/settings/mcp.json を編集します):
{
"mcpServers": {
"awslabs.postgres-mcp-server": {
"command": "uvx",
"args": [
"awslabs.postgres-mcp-server@latest",
"--allow_write_query"
],
"env": {
"AWS_PROFILE": "your-aws-profile",
"AWS_REGION": "us-east-1",
"FASTMCP_LOG_LEVEL": "ERROR"
},
"disabled": false,
"autoApprove": []
}
}
}
Windows でのインストール
Windows ユーザーの場合、MCP サーバーの設定形式が少し異なります:
{
"mcpServers": {
"awslabs.postgres-mcp-server": {
"disabled": false,
"timeout": 60,
"type": "stdio",
"command": "uv",
"args": [
"tool",
"run",
"--from",
"awslabs.postgres-mcp-server@latest",
"awslabs.postgres-mcp-server.exe"
],
"env": {
"FASTMCP_LOG_LEVEL": "ERROR",
"AWS_PROFILE": "your-aws-profile",
"AWS_REGION": "us-east-1"
}
}
}
}
LLM クライアントと同じホスト上で Docker イメージをローカルにビルドしてインストールする
- 'git clone https://github.com/awslabs/mcp.git' を実行します
- サブディレクトリ 'src/postgres-mcp-server/' に移動します
- 'docker build -t awslabs/postgres-mcp-server:latest .' を実行します
LLM クライアントの設定に以下を追加または更新します:
オプション 1:RDS Data API 接続を使用する(Aurora Postgres 向け)
{
"mcpServers": {
"awslabs.postgres-mcp-server": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e", "AWS_ACCESS_KEY_ID=[your data]",
"-e", "AWS_SECRET_ACCESS_KEY=[your data]",
"-e", "AWS_REGION=[your data]",
"awslabs/postgres-mcp-server:latest",
"--allow_write_query"
]
}
}
}
注意:この MCP 設定例には、書き込みクエリを有効にする方法を示すために --allow_write_query が含まれています。書き込みクエリを無効にしたい場合は、--allow_write_query オプションを削除してください。
データベースクラスター作成のサポート
以下の LLM プロンプトを使用して、新しい Aurora PostgreSQL クラスターを作成できます:
us-west-2 リージョンに 'mycluster' という名前の Aurora PostgreSQL クラスターを作成してください
接続方法
この MCP サーバーは、LLM プロンプトを介してさまざまな接続方法を使用し、複数のデータベースエンドポイントへの接続をサポートします。
データベースタイプ
- APG: Amazon Aurora PostgreSQL
- RPG: Amazon RDS for PostgreSQL
プロンプトの例
RDS Data API を使用して接続する:
database_type を APG とし、us-west-2 リージョンで rdsapi を接続方法として使用して、Aurora PostgreSQL クラスター 'my-cluster' 内の postgres という名前のデータベースに接続してください
pgwire を使用して接続する(Aurora PostgreSQL):
database_type を APG とし、us-west-2 リージョンで pgwire を接続方法として使用して、データベースエンドポイント my-apg17-instance-1.ctgfg6yyo9df.us-west-2.rds.amazonaws.com の postgres という名前のデータベースに接続してください
pgwire を使用して接続する(RDS PostgreSQL):
database_type を RPG とし、us-west-2 リージョンで pgwire を接続方法として使用して、データベースエンドポイント test-apg17-instance-1.ctgfg6yyo9df.us-west-2.rds.amazonaws.com の postgres という名前のデータベースに接続してください
サポートされている接続方法
| 方法 | 説明 | サポートされるデータベースタイプ |
|---|---|---|
pgwire | PostgreSQL ワイヤープロトコルを使用して PostgreSQL インスタンスに直接接続します。データベースへの直接接続には、適切な VPC セキュリティグループの設定が必要です。 | APG、RPG |
pgwire_iam | pgwire と同じですが、IAM 認証を使用します。Aurora PostgreSQL クラスターで IAM 認証が有効になっている必要があります。 | APG のみ |
rdsapi | RDS Data API を使用して Aurora PostgreSQL に接続します。クラスターで RDS Data API が有効になっている必要があります。 | APG のみ |
接続方法ごとの前提条件
pgwire / pgwire_iam
- VPC セキュリティグループが、MCP サーバーからデータベースへのインバウンド接続を許可している必要があります
pgwire_iamの場合:Aurora PostgreSQL クラスターで IAM 認証が有効になっている必要があります
rdsapi
- Aurora PostgreSQL クラスターで RDS Data API が有効になっている必要があります
- Data API へのアクセスに適切な IAM 権限が必要です
AWS 認証
MCP サーバーは、データベースクラスターまたはインスタンスのデータを読み取り、クラスターやインスタンスを作成するために AWS 認証情報を必要とします。これらは、Postgres 操作(SELECT、CREATE など)とは別のコントロールプレーン操作です。rdsapi 接続方法を使用する場合、AWS 認証情報には Aurora クラスターに対する rds-data:ExecuteStatement 権限が必要です(https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonrdsdataapi.html を参照してください)。MCP は、AWS_PROFILE 環境変数で指定された AWS プロファイルを使用します。指定されていない場合は、AWS 設定ファイルの "default" プロファイルがデフォルトで使用されます。
"env": {
"AWS_PROFILE": "your-aws-profile"
}
AWS プロファイルに、RDS data API および AWS Secrets Manager のシークレットにアクセスする権限があることを確認してください。MCP サーバーは、指定されたプロファイルを使用して boto3 セッションを作成し、AWS サービスで認証を行います。AWS IAM 認証情報はローカルマシン上に保持され、AWS サービスへのアクセスにのみ厳密に使用されます。
Postgres 認証
MCP サーバーは、Postgres 認証として IAM とユーザー名/パスワードの方法をサポートしています。認証情報の保存には AWS Secrets Manager を使用し、MCP 設定ファイルで --secretManagerARN を指定する必要があります。
セキュリティに関する考慮事項
--allow_write_query の読み取り専用強制はベストエフォートです
MCP サーバーを --allow_write_query なしで実行すると、データやセッション状態を変更すると思われるクエリは拒否されます。これは、キーワードと関数のブロックリスト(INSERT/UPDATE/DROP などの DML/DDL 動詞、SET/RESET/DISCARD/LOAD などのセッション状態ステートメント、匿名コードブロック DO、および pg_terminate_backend、pg_sleep、アドバイザリロック系などの影響の大きい関数)によって実装されています。
これはベストエフォートの多層防御メカニズムであり、セキュリティ境界ではないものとして扱ってください。 ブロックリストはすべての危険な構文を列挙することはできず、十分に巧妙なクエリ(難読化、引用符付き識別子、新しいサーバー/拡張機能の関数など)はそれをバイパスする可能性があります。これを唯一の制御手段として頼らないでください。
ベストプラクティス:最小権限の Postgres ロールで MCP サーバーを実行する
最も強力な制御は、実際に必要な権限のみを持つ専用の Postgres ロールを使用して MCP サーバーを接続することです。これにより、どのような SQL が到達しても、データベース自体が境界を強制します。具体的には:
- スーパーユーザー、
rds_superuser、またはクラスターのマスターユーザーとして接続しないでください。 これらのロールは行レベルセキュリティをバイパスし、認証情報カタログ (pg_authid、pg_user_mappings)を読み取ることができ、他のセッションを終了させることができます。 - 読み取り専用で使用する場合は、エージェントが必要とするスキーマに対して
CONNECT+USAGE+SELECTのみを付与し、 ロールレベルで読み取り専用トランザクションを強制してください。 - 読み取り/書き込みで使用する場合は、必要なスキーマとテーブルに限定して、必要な特定の
INSERT/UPDATE/DELETE権限のみを付与してください。
最小権限ロール(データベースによる強制)とブロックリスト(アプリケーションによる強制)を組み合わせることで、多層防御が実現します。クエリがブロックリストをすり抜けたとしても、ロールの権限によって実行できる範囲が制限されます。
以下は読み取り専用ロールの例です:
-- Create a read-only role for Postgres MCP server
CREATE ROLE postgres_mcp_server_readonly WITH LOGIN PASSWORD 'change-me'
NOSUPERUSER NOCREATEDB NOCREATEROLE NOREPLICATION;
-- Allow connection and schema visibility for public schema
-- TODO: add additional schema if required
GRANT CONNECT ON DATABASE mydb TO postgres_mcp_server_readonly;
GRANT USAGE ON SCHEMA public TO postgres_mcp_server_readonly;
-- Read existing tables and sequences for public schema
-- TODO: add additional schema if required
GRANT SELECT ON ALL TABLES IN SCHEMA public TO postgres_mcp_server_readonly;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO postgres_mcp_server_readonly;
-- Read future tables and sequences for public schema
-- TODO: add additional schema if required
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO postgres_mcp_server_readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON SEQUENCES TO postgres_mcp_server_readonly;
-- Force read-only transactions
ALTER ROLE postgres_mcp_server_readonly SET default_transaction_read_only = on;