MCP Server to Relational Database
The connection generator wires a TypeScript MCP Server to a Relational Database project, making a Prisma client available to all tools registered inside createServer.
Prerequisites
Section titled “Prerequisites”Before using this generator, ensure you have:
- A
ts#mcp-serverproject - A
ts#rdbproject
Run the Generator
Section titled “Run the Generator”- Install the Nx Console VSCode Plugin if you haven't already
- Open the Nx Console in VSCode
- Click
Generate (UI)in the "Common Nx Commands" section - Search for
@aws/nx-plugin - connection - Fill in the required parameters
- Click
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:connectionYou can also perform a dry-run to see what files would be changed
pnpm nx g @aws/nx-plugin:connection --dry-runyarn nx g @aws/nx-plugin:connection --dry-runnpx nx g @aws/nx-plugin:connection --dry-runbunx nx g @aws/nx-plugin:connection --dry-runSelect your MCP server project as the source and your relational database project as the target. If the project contains multiple MCP server components, specify sourceComponent to disambiguate.
Options
Section titled “Options”| Parameter | Type | Default | Description |
|---|---|---|---|
| sourceProject Required | string | - | The source project |
| targetProject Required | string | - | The target project to connect to |
| sourceComponent | string | - | The source component to connect from (component name, path relative to source project root, or generator id). Use '.' to explicitly select the project as the source. |
| targetComponent | string | - | The target component to connect to (component name, path relative to target project root, or generator id). Use '.' to explicitly select the project as the target. |
Generator Output
Section titled “Generator Output”The generator modifies server.ts in your MCP server’s source directory:
Directorypackages/my-service/src/my-mcp
- server.ts Prisma client fetched and available to all tools registered inside
createServer
- server.ts Prisma client fetched and available to all tools registered inside
Additionally, the <mcp-server-name>-serve-local target is updated to depend on the database’s serve-local target.
How It Works
Section titled “How It Works”The Prisma client is fetched inside createServer and available to all tools and resources registered there:
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;};Multiple Databases
Section titled “Multiple Databases”Running the generator again with a different target adds the second database alongside the first. Both are fetched inside createServer:
export const createServer = async () => { const postgresDb = await getPostgresDb(); const mysqlDb = await getMysqlDb(); const server = new McpServer({ ... }); // register tools using both clients return server;};Infrastructure
Section titled “Infrastructure”The generated MCP server construct implements IGrantable and IConnectable, so you can grant network and IAM access to the database directly on the construct.
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 opens the security group rule so the MCP server runtime can reach the database port. grantConnect grants IAM rds-db:connect permission to the server’s execution role.
Pass the database module outputs into your MCP server module so it can reach the database and read its runtime configuration:
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}Ensure the MCP server’s execution role has rds-db:connect permission and that its security group can reach the database security group on the database port.
Local Development
Section titled “Local Development”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>This starts the MCP server and all connected databases. The SERVE_LOCAL=true environment variable causes each Prisma client to connect to its local Docker database instead of Aurora.