Python MCP Server 连接到关系数据库
connection 生成器将 Python MCP Server 连接到 Python 关系数据库项目,使数据库会话可供服务器中注册的所有工具使用。
在使用此生成器之前,请确保您拥有:
- 一个
py#mcp-server项目 - 一个
py#rdb项目
- 安装 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:connection选择您的 MCP 服务器项目作为源,选择您的关系数据库项目作为目标。如果项目包含多个 MCP 服务器组件,请指定 sourceComponent 以消除歧义。
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| sourceProject 必需 | string | - | 源项目 |
| targetProject 必需 | string | - | 要连接到的目标项目 |
| sourceComponent | string | - | 要从其连接的源组件(组件名称、相对于源项目根目录的路径或生成器 ID)。使用 '.' 显式选择项目作为源。 |
| targetComponent | string | - | 要连接到的目标组件(组件名称、相对于目标项目根目录的路径或生成器 ID)。使用 '.' 显式选择项目作为目标。 |
| preferInstallDependencies | boolean | true | 是否在生成器运行后优先安装依赖项。设置为 false 可在批量运行多个生成器时延迟安装(如果后续生成器需要计算 Nx 项目图,仍会运行安装);在最后统一安装一次。 |
文件夹packages/my_service
- project.json 添加从
my_mcp_server-dev到数据库的dev目标的依赖关系 - pyproject.toml 将数据库包添加为工作区依赖项
文件夹my_service
文件夹my_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])使用不同的目标再次运行生成器会将第二个数据库添加到第一个数据库旁边。所有工具都可以使用两个会话上下文:
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生成的 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 权限。
在与数据库相同的 VPC 中运行 MCP 服务器,通过 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 服务器直接连接到 Aurora 集群(不使用 RDS Proxy)时,连接生成器会更新生成的 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-certificates使用 RDS Proxy 时,您无需在 MCP 服务器运行时中配置 RDS CA 证书包。
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 环境变量使数据库客户端连接到其本地 Docker 数据库而不是 Aurora。