MCP 服务器连接到关系数据库
connection 生成器将 TypeScript MCP 服务器 连接到 关系数据库 项目,使 Prisma 客户端在 createServer 及其传输入口点内可用。
在使用此生成器之前,请确保您拥有:
- 一个
ts#mcp-server项目 - 一个
ts#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)。使用 '.' 显式选择项目作为目标。 |
生成器会修改 MCP 服务器源目录中的三个文件:
文件夹packages/my-service/src/my-mcp
- server.ts
createServer更新为接受{ db }参数 - http.ts 在
const server = createServer({ db })上方创建 Prisma 客户端 - stdio.ts 在
await createServer({ db }).connect(transport)之前创建 Prisma 客户端
- server.ts
此外,<mcp-server-name>-serve-local 目标会更新为依赖数据库的 serve-local 目标。
createServer 接收 Prisma 客户端作为参数,因此它保持同步并可以将客户端传递给工具和资源:
import { getPrisma as getMyDb } from ':my-scope/my-db';
export const createServer = ({ myDb,}: { myDb: Awaited<ReturnType<typeof getMyDb>>;}) => { const server = new McpServer({ name: 'my-service', version: '1.0.0' }); // register tools/resources that use myDb return server;};HTTP 传输
Section titled “HTTP 传输”Prisma 客户端在请求处理程序内创建,位于 createServer 调用上方:
import { getPrisma as getMyDb } from ':my-scope/my-db';
app.post('/mcp', async (req, res) => { try { const myDb = await getMyDb(); const server = createServer({ myDb }); // ... }});Stdio 传输
Section titled “Stdio 传输”相同的模式适用于 stdio 传输入口点:
import { getPrisma as getMyDb } from ':my-scope/my-db';
export const startMcpServer = async () => { const transport = new StdioServerTransport(); const myDb = await getMyDb(); await createServer({ myDb }).connect(transport);};使用不同的目标再次运行生成器会将第二个数据库添加到第一个数据库旁边。两者一起传递给 createServer:
const postgresDb = await getPostgresDb();const mySqlDb = await getMySqlDb();const server = createServer({ postgresDb, mysqlDb });生成的 MCP 服务器构造实现了 IGrantable 和 IConnectable,因此您可以直接在构造上授予对数据库的网络和 IAM 访问权限。
import { MyDatabase } from ':my-scope/common-constructs';
const db = new MyDatabase(this, 'Db', { vpc, ... });const myMcpServer = new MyMcpServer(this, 'MyMcpServer', { vpc, ... });
db.allowDefaultPortFrom(myMcpServer);db.grantConnect(myMcpServer);allowDefaultPortFrom 打开安全组规则,以便 MCP 服务器运行时可以访问数据库端口。grantConnect 向服务器的执行角色授予 IAM rds-db:connect 权限。
将数据库模块输出传递到您的 MCP 服务器模块中,以便它可以访问数据库并读取其运行时配置:
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}
module "my_mcp_server" { source = "../../common/terraform/src/app/mcp-servers/my-mcp-server"
appconfig_application_id = module.my_database.appconfig_application_id database_cluster_resource_id = module.my_database.cluster_resource_id database_runtime_user = module.my_database.database_runtime_user database_security_group_id = module.my_database.security_group_id database_port = module.my_database.cluster_port}确保 MCP 服务器的执行角色具有 rds-db:connect 权限,并且其安全组可以在数据库端口上访问数据库安全组。
pnpm nx <mcp-server-name>-serve-local <project-name>yarn nx <mcp-server-name>-serve-local <project-name>npx nx <mcp-server-name>-serve-local <project-name>bunx nx <mcp-server-name>-serve-local <project-name>这会启动 MCP 服务器和所有连接的数据库。SERVE_LOCAL=true 环境变量使每个 Prisma 客户端连接到其本地 Docker 数据库而不是 Aurora。