メインコンテンツまでスキップ

AWS Labs postgres MCP Server

Aurora Postgres 用の AWS Labs Model Context Protocol (MCP) サーバーです。

機能

自然言語から Postgres SQL クエリへの変換

  • 人間が読める質問やコマンドを、構造化された Postgres 互換の SQL クエリに変換し、設定された Aurora Postgres データベースに対して実行します。

前提条件

  1. Astral または GitHub README から uv をインストールします
  2. uv python install 3.10 を使用して Python をインストールします
  3. この MCP サーバーは、LLM クライアントと同じホスト上でのみローカルに実行できます。
  4. Docker ランタイム
  5. AWS サービスへのアクセス権を持つ AWS 認証情報を設定します
    • 適切な権限を持つ AWS アカウントが必要です
    • aws configure または環境変数で AWS 認証情報を設定します

インストール

KiroCursorVS Code
Add to KiroInstall MCP ServerInstall on 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 イメージをローカルにビルドしてインストールする

  1. 'git clone https://github.com/awslabs/mcp.git' を実行します
  2. サブディレクトリ 'src/postgres-mcp-server/' に移動します
  3. '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 という名前のデータベースに接続してください


サポートされている接続方法

方法説明サポートされるデータベースタイプ
pgwirePostgreSQL ワイヤープロトコルを使用して PostgreSQL インスタンスに直接接続します。データベースへの直接接続には、適切な VPC セキュリティグループの設定が必要です。APG、RPG
pgwire_iampgwire と同じですが、IAM 認証を使用します。Aurora PostgreSQL クラスターで IAM 認証が有効になっている必要があります。APG のみ
rdsapiRDS 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_backendpg_sleep、アドバイザリロック系などの影響の大きい関数)によって実装されています。

これはベストエフォートの多層防御メカニズムであり、セキュリティ境界ではないものとして扱ってください。 ブロックリストはすべての危険な構文を列挙することはできず、十分に巧妙なクエリ(難読化、引用符付き識別子、新しいサーバー/拡張機能の関数など)はそれをバイパスする可能性があります。これを唯一の制御手段として頼らないでください。

ベストプラクティス:最小権限の Postgres ロールで MCP サーバーを実行する

最も強力な制御は、実際に必要な権限のみを持つ専用の Postgres ロールを使用して MCP サーバーを接続することです。これにより、どのような SQL が到達しても、データベース自体が境界を強制します。具体的には:

  • スーパーユーザー、rds_superuser、またはクラスターのマスターユーザーとして接続しないでください。 これらのロールは行レベルセキュリティをバイパスし、認証情報カタログ (pg_authidpg_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;