跳转到内容

MCP 服务器连接到关系数据库

connection 生成器将 TypeScript MCP 服务器 连接到 关系数据库 项目,使 Prisma 客户端在 createServer 及其传输入口点内可用。

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

  1. 一个 ts#mcp-server 项目
  2. 一个 ts#rdb 项目
  1. 安装 Nx Console VSCode Plugin 如果您尚未安装
  2. 在VSCode中打开Nx控制台
  3. 点击 Generate (UI) 在"Common Nx Commands"部分
  4. 搜索 @aws/nx-plugin - connection
  5. 填写必需参数
    • 点击 Generate

    选择您的 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 客户端

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

    createServer 接收 Prisma 客户端作为参数,因此它保持同步并可以将客户端传递给工具和资源:

    packages/my-service/src/my-mcp/server.ts
    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;
    };

    Prisma 客户端在请求处理程序内创建,位于 createServer 调用上方:

    packages/my-service/src/my-mcp/http.ts
    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 传输入口点:

    packages/my-service/src/my-mcp/stdio.ts
    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

    packages/my-service/src/my-mcp/http.ts
    const postgresDb = await getPostgresDb();
    const mySqlDb = await getMySqlDb();
    const server = createServer({ postgresDb, mysqlDb });

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

    packages/infra/src/stacks/application-stack.ts
    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 权限。

    Terminal window
    pnpm nx <mcp-server-name>-serve-local <project-name>

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