Python MCP Server からリレーショナルデータベースへの接続
connection ジェネレーターは、Python MCP Server を Python リレーショナルデータベースプロジェクトに接続し、サーバーに登録されたすべてのツールでデータベースセッションを利用できるようにします。
このジェネレーターを使用する前に、以下を用意してください:
py#mcp-serverプロジェクトpy#rdbプロジェクト
ジェネレーターの実行
Section titled “ジェネレーターの実行”- インストール Nx Console VSCode Plugin まだインストールしていない場合
- VSCodeでNxコンソールを開く
- クリック
Generate (UI)"Common Nx Commands"セクションで - 検索
@aws/nx-plugin - connection - 必須パラメータを入力
- クリック
Generate
pnpm nx g @aws/nx-plugin:connectionyarn nx g @aws/nx-plugin:connectionnpx nx g @aws/nx-plugin:connectionbunx nx g @aws/nx-plugin:connectionMCP サーバープロジェクトをソースとして、リレーショナルデータベースプロジェクトをターゲットとして選択します。プロジェクトに複数の MCP サーバーコンポーネントが含まれている場合は、sourceComponent を指定して明確にします。
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
| sourceProject 必須 | string | - | ソース プロジェクト |
| targetProject 必須 | string | - | 接続先のターゲット プロジェクト |
| sourceComponent | string | - | 接続元のソース コンポーネント (コンポーネント名、ソース プロジェクト ルートからの相対パス、またはジェネレーター ID)。プロジェクトをソースとして明示的に選択するには '.' を使用します。 |
| targetComponent | string | - | 接続先のターゲット コンポーネント (コンポーネント名、ターゲット プロジェクト ルートからの相対パス、またはジェネレーター ID)。プロジェクトをターゲットとして明示的に選択するには '.' を使用します。 |
| preferInstallDependencies | boolean | true | ジェネレーター実行後に依存関係のインストールを優先するかどうか。複数のジェネレーターをバッチ処理する際にインストールを延期する場合はfalseに設定します(後続のジェネレーターがNxプロジェクトグラフを計算できるよう、必要に応じてインストールは実行されます)。最後に一度だけインストールします。 |
ジェネレーターの出力
Section titled “ジェネレーターの出力”Directorypackages/my_service
- project.json
my_mcp_server-devからデータベースのdevターゲットへの依存関係を追加します - pyproject.toml データベースパッケージをワークスペースの依存関係として追加します
Directorymy_service
Directorymy_mcp_server
- Dockerfile Aurora への直接接続に使用される RDS CA バンドルを追加します
- project.json
MCP ツールでのデータベースの使用
Section titled “MCP ツールでのデータベースの使用”データベースパッケージから session_context をインポートし、MCP サーバーツール内で使用します:
from sqlmodel import selectfrom my_scope.my_db import session_contextfrom my_scope.my_db.models.example import ExampleModel
@mcp.tool()async def list_examples() -> str: """List all example records.""" async with session_context() as session: items = (await session.execute(select(ExampleModel))).all() return str([item.model_dump() for item in items])複数のデータベース
Section titled “複数のデータベース”異なるターゲットでジェネレーターを再度実行すると、最初のデータベースと並行して2番目のデータベースが追加されます。両方のセッションコンテキストがすべてのツールで利用可能になります:
from my_scope.my_db import session_context as my_db_session_contextfrom my_scope.other_db import session_context as other_db_session_contextインフラストラクチャ
Section titled “インフラストラクチャ”生成された MCP サーバーコンストラクトは IGrantable と IConnectable を実装しているため、コンストラクト上で直接データベースへのネットワークおよび IAM アクセスを許可できます。
import { RuntimeNetworkConfiguration } from 'aws-cdk-lib/aws-bedrockagentcore';import { MyDatabase } from ':my-scope/common-constructs';
const db = new MyDatabase(this, 'Db', { vpc, ... });
const myMcpServer = new MyMcpServer(this, 'MyMcpServer', { networkConfiguration: RuntimeNetworkConfiguration.usingVpc(this, { vpc, vpcSubnets: { subnetType: SubnetType.PRIVATE_WITH_EGRESS }, }),});
db.allowDefaultPortFrom(myMcpServer);db.grantConnect(myMcpServer);allowDefaultPortFrom はセキュリティグループルールを開き、MCP サーバーランタイムがデータベースポートに到達できるようにします。grantConnect は、サーバーの実行ロールに IAM rds-db:connect 権限を付与します。
MCP サーバーをデータベースと同じ VPC 内で実行し、additional_iam_policy_statements を介して rds-db:connect を付与し、セキュリティグループルールのペアでネットワークパスを開きます:
module "my_database" { source = "../../common/terraform/src/app/dbs/my-database" vpc_id = module.vpc.vpc_id database_subnet_ids = module.vpc.private_isolated_subnet_ids lambda_subnet_ids = module.vpc.private_subnet_ids}
module "my_mcp_server" { source = "../../common/terraform/src/app/mcp-servers/my-mcp-server" enable_vpc = true vpc_id = module.vpc.vpc_id subnet_ids = module.vpc.private_subnet_ids
appconfig_application_id = module.runtime_config_appconfig.application_id appconfig_application_arn = module.runtime_config_appconfig.application_arn
additional_iam_policy_statements = [ { Effect = "Allow" Action = ["rds-db:connect"] Resource = [ "arn:aws:rds-db:${data.aws_region.current.region}:${data.aws_caller_identity.current.account_id}:dbuser:${module.my_database.connect_resource_id}/${module.my_database.database_runtime_user}" ] } ]}
resource "aws_vpc_security_group_ingress_rule" "mcp_server_to_database" { security_group_id = module.my_database.security_group_id referenced_security_group_id = module.my_mcp_server.security_group_id from_port = module.my_database.cluster_port to_port = module.my_database.cluster_port ip_protocol = "tcp"}
resource "aws_vpc_security_group_egress_rule" "mcp_server_to_database" { security_group_id = module.my_mcp_server.security_group_id referenced_security_group_id = module.my_database.security_group_id from_port = module.my_database.cluster_port to_port = module.my_database.cluster_port ip_protocol = "tcp"}appconfig_application_id/appconfig_application_arn は、データベースモジュールからではなく、ルートモジュールで一度宣言された共有ランタイム設定 AppConfig アプリケーションから取得されます。
RDS Proxy を使用せずに接続する場合の SSL 要件
Section titled “RDS Proxy を使用せずに接続する場合の SSL 要件”MCP サーバーが(RDS Proxy を使用せずに)Aurora クラスターに直接接続する場合、接続ジェネレーターは生成された MCP サーバーの Dockerfile を更新して、Amazon RDS CA バンドルをシステムトラストストアにインストールします:
ADD https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem /usr/local/share/ca-certificates/rds-global-bundle.crtRUN update-ca-certificatesRDS Proxy を使用する場合、MCP サーバーランタイムで RDS CA バンドルを設定する必要はありません。
ローカル開発
Section titled “ローカル開発”pnpm nx <mcp-server-name>-dev <project-name>yarn nx <mcp-server-name>-dev <project-name>npx nx <mcp-server-name>-dev <project-name>bunx nx <mcp-server-name>-dev <project-name>これにより、MCP サーバーと接続されたすべてのデータベースが起動します。LOCAL_DEV=true 環境変数により、データベースクライアントは Aurora ではなくローカルの Docker データベースに接続します。