Skip to content

MCP ServerとRelational Databaseの接続

connectionジェネレーターは、TypeScript MCP ServerRelational Databaseプロジェクトに接続し、createServerとそのトランスポートエントリーポイント内でPrismaクライアントを利用可能にします。

このジェネレーターを使用する前に、以下を用意してください:

  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サーバーのソースディレクトリ内の3つのファイルを変更します:

    • Directorypackages/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);
    };

    異なるターゲットで再度ジェネレーターを実行すると、最初のデータベースと並んで2番目のデータベースが追加されます。両方が一緒に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クライアントはAuroraの代わりにローカルのDockerデータベースに接続します。