跳转到内容

MCP Server 到关系数据库

connection 生成器将 TypeScript MCP Server 连接到 关系数据库项目,使 Prisma 客户端可供 createServer 内注册的所有工具使用。

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

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

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

参数类型默认值描述
sourceProject 必需string-源项目
targetProject 必需string-要连接到的目标项目
sourceComponent string-要从其连接的源组件(组件名称、相对于源项目根目录的路径或生成器 ID)。使用 '.' 显式选择项目作为源。
targetComponent string-要连接到的目标组件(组件名称、相对于目标项目根目录的路径或生成器 ID)。使用 '.' 显式选择项目作为目标。
preferInstallDependencies booleantrue是否在生成器运行后优先安装依赖项。设置为 false 可在批量运行多个生成器时延迟安装(如果后续生成器需要计算 Nx 项目图,仍会运行安装);在最后统一安装一次。

生成器会修改 MCP server 源目录中的两个文件:

  • 文件夹packages/my-service/src/my-mcp
    • server.ts Prisma 客户端已获取并可供 createServer 内注册的所有工具使用
    • Dockerfile 已安装 RDS CA 证书包以便通过 SSL 连接到 Aurora

此外,<mcp-server-name>-dev 目标会更新为依赖于数据库的 dev 目标。

Prisma 客户端在 createServer 内获取,并可供在其中注册的所有工具和资源使用:

packages/my-service/src/my-mcp/server.ts
import { getPrisma as getMyDb } from '@my-scope/my-db';
export const createServer = async () => {
const myDb = await getMyDb();
const server = new McpServer({ name: 'my-service', version: '1.0.0' });
// register tools/resources that use myDb
return server;
};

使用不同的目标再次运行生成器会将第二个数据库添加到第一个数据库旁边。两者都在 createServer 内获取:

packages/my-service/src/my-mcp/server.ts
export const createServer = async () => {
const postgresDb = await getPostgresDb();
const mysqlDb = await getMysqlDb();
const server = new McpServer({ ... });
// register tools using both clients
return server;
};

生成的 MCP server 构造实现了 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 server 运行时可以访问数据库端口。grantConnect 向服务器的执行角色授予 IAM rds-db:connect 权限。

不使用 RDS Proxy 连接时的 SSL 要求

Section titled “不使用 RDS Proxy 连接时的 SSL 要求”

连接生成器会更新 Dockerfile 以在 /usr/local/share/ca-certificates/rds-bundle.crt 安装 Amazon RDS CA 证书包。将 NODE_EXTRA_CA_CERTS 设置为该路径,以便 Node.js 在不使用 RDS Proxy 连接时信任该证书:

packages/infra/src/stacks/application-stack.ts
new MyMcpServer(this, 'MyMcpServer', {
...
environmentVariables: {
NODE_EXTRA_CA_CERTS: '/usr/local/share/ca-certificates/rds-bundle.crt',
},
});

有关更多详细信息,请参阅 Amazon RDS SSL/TLS 文档。使用 RDS Proxy 时,您无需配置 NODE_EXTRA_CA_CERTS

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

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