跳转到内容

Python MCP Server 到关系数据库

connection 生成器将 Python MCP Server 连接到 Python 关系数据库项目,使数据库会话可供服务器中注册的所有工具使用。

在使用此生成器之前,请确保您拥有:

  1. 一个 py#mcp-server 项目
  2. 一个 py#rdb 项目
Terminal window
pnpm nx g @aws/nx-plugin:connection
您还可以执行试运行以查看哪些文件会被更改
Terminal window
pnpm nx g @aws/nx-plugin:connection --dry-run

选择您的 MCP 服务器项目作为源,选择您的关系数据库项目作为目标。如果项目包含多个 MCP 服务器组件,请指定 sourceComponent 以消除歧义。

参数类型默认值描述
sourceProject 必需string-源项目
targetProject 必需string-要连接到的目标项目
sourceComponent string-要从其连接的源组件(组件名称、相对于源项目根目录的路径或生成器 ID)。使用 '.' 显式选择项目作为源。
targetComponent string-要连接到的目标组件(组件名称、相对于目标项目根目录的路径或生成器 ID)。使用 '.' 显式选择项目作为目标。
preferInstallDependencies booleantrue是否在生成器运行后优先安装依赖项。设置为 false 可在批量运行多个生成器时延迟安装(如果后续生成器需要计算 Nx 项目图,仍会运行安装);在最后统一安装一次。
  • 文件夹packages/my_service
    • project.json 添加从 my_mcp_server-dev 到数据库的 dev 目标的依赖
    • pyproject.toml 将数据库包添加为工作区依赖
    • 文件夹my_service
      • 文件夹my_mcp_server
        • Dockerfile 添加用于直接 Aurora 连接的 RDS CA 证书包

从您的数据库包中导入 session_context,并在您的 MCP 服务器工具中使用它:

packages/my_service/my_service/my_mcp_server/server.py
from sqlmodel import select
from my_scope.my_db import session_context
from 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])

使用不同的目标再次运行生成器会将第二个数据库添加到第一个数据库旁边。两个会话上下文都可供所有工具使用:

packages/my_service/my_service/my_mcp_server/server.py
from my_scope.my_db import session_context as my_db_session_context
from my_scope.other_db import session_context as other_db_session_context

生成的 MCP 服务器构造实现了 IGrantableIConnectable,因此您可以直接在构造上授予对数据库的网络和 IAM 访问权限。

packages/infra/src/stacks/application-stack.ts
import { SecurityGroup } from 'aws-cdk-lib/aws-ec2';
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 },
securityGroups: [
new SecurityGroup(this, 'MyMcpServerSecurityGroup', { vpc, allowAllOutbound: true }),
],
}),
});
db.allowDefaultPortFrom(myMcpServer);
db.grantConnect(myMcpServer);

allowDefaultPortFrom 打开安全组规则,以便 MCP 服务器运行时可以访问数据库端口。grantConnect 向服务器的执行角色授予 IAM rds-db:connect 权限。

在不使用 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.crt
RUN update-ca-certificates

使用 RDS Proxy 时,您无需在 MCP 服务器运行时中配置 RDS CA 证书包。

Terminal window
pnpm nx <mcp-server-name>-dev <project-name>

这将启动 MCP 服务器和所有连接的数据库。LOCAL_DEV=true 环境变量会导致数据库客户端连接到其本地 Docker 数据库而不是 Aurora。