Servidor MCP Python para Banco de Dados Relacional
O gerador connection conecta um Servidor MCP Python a um projeto de Banco de Dados Relacional Python, tornando a sessão do banco de dados disponível para todas as ferramentas registradas no servidor.
Pré-requisitos
Seção intitulada “Pré-requisitos”Antes de usar este gerador, certifique-se de ter:
- Um projeto
py#mcp-server - Um projeto
py#rdb
Executar o Gerador
Seção intitulada “Executar o Gerador”- Instale o Nx Console VSCode Plugin se ainda não o fez
- Abra o console Nx no VSCode
- Clique em
Generate (UI)na seção "Common Nx Commands" - Procure por
@aws/nx-plugin - connection - Preencha os parâmetros obrigatórios
- Clique em
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:connectionVocê também pode realizar uma execução simulada para ver quais arquivos seriam alterados
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-runSelecione seu projeto de servidor MCP como origem e seu projeto de banco de dados relacional como destino. Se o projeto contiver múltiplos componentes de servidor MCP, especifique sourceComponent para desambiguar.
| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
| sourceProject Obrigatório | string | - | O projeto de origem |
| targetProject Obrigatório | string | - | O projeto de destino para conectar |
| sourceComponent | string | - | O componente de origem para conectar (nome do componente, caminho relativo à raiz do projeto de origem, ou id do gerador). Use '.' para selecionar explicitamente o projeto como origem. |
| targetComponent | string | - | O componente de destino para conectar (nome do componente, caminho relativo à raiz do projeto de destino, ou id do gerador). Use '.' para selecionar explicitamente o projeto como destino. |
| preferInstallDependencies | boolean | true | Se deve preferir instalar dependências após a execução do gerador. Defina como false para adiar a instalação ao executar múltiplos geradores em lote (uma instalação ainda é executada se necessário para que os geradores subsequentes possam calcular o grafo de projetos Nx); instale uma vez no final. |
Saída do Gerador
Seção intitulada “Saída do Gerador”Directorypackages/my_service
- project.json Adiciona uma dependência de
my_mcp_server-devno targetdevdo banco de dados - pyproject.toml Adiciona o pacote do banco de dados como uma dependência do workspace
Directorymy_service
Directorymy_mcp_server
- Dockerfile Adiciona o pacote CA do RDS usado para conexões diretas ao Aurora
- project.json Adiciona uma dependência de
Usando o Banco de Dados em Ferramentas MCP
Seção intitulada “Usando o Banco de Dados em Ferramentas MCP”Importe session_context do seu pacote de banco de dados e use-o dentro das suas ferramentas do servidor MCP:
from sqlmodel import selectfrom my_scope.my_db import session_contextfrom my_scope.my_db.models.example import ExampleModel
@mcp.tool()async def list_examples() -> str: """List all example records.""" async with session_context() as session: items = (await session.execute(select(ExampleModel))).all() return str([item.model_dump() for item in items])Múltiplos Bancos de Dados
Seção intitulada “Múltiplos Bancos de Dados”Executar o gerador novamente com um destino diferente adiciona o segundo banco de dados junto ao primeiro. Ambos os contextos de sessão estão disponíveis para todas as ferramentas:
from my_scope.my_db import session_context as my_db_session_contextfrom my_scope.other_db import session_context as other_db_session_contextInfraestrutura
Seção intitulada “Infraestrutura”O construto do servidor MCP gerado implementa IGrantable e IConnectable, então você pode conceder acesso de rede e IAM ao banco de dados diretamente no construto.
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 }, }),});
db.allowDefaultPortFrom(myMcpServer);db.grantConnect(myMcpServer);allowDefaultPortFrom abre a regra do grupo de segurança para que o runtime do servidor MCP possa alcançar a porta do banco de dados. grantConnect concede permissão IAM rds-db:connect à função de execução do servidor.
Execute o servidor MCP dentro da mesma VPC que o banco de dados, conceda a ele rds-db:connect via additional_iam_policy_statements, e abra o caminho de rede com um par de regras de grupo de segurança:
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 lambda_subnet_ids = module.vpc.private_subnet_ids}
module "my_mcp_server" { source = "../../common/terraform/src/app/mcp-servers/my-mcp-server" enable_vpc = true vpc_id = module.vpc.vpc_id subnet_ids = module.vpc.private_subnet_ids
appconfig_application_id = module.runtime_config_appconfig.application_id appconfig_application_arn = module.runtime_config_appconfig.application_arn
additional_iam_policy_statements = [ { Effect = "Allow" Action = ["rds-db:connect"] Resource = [ "arn:aws:rds-db:${data.aws_region.current.region}:${data.aws_caller_identity.current.account_id}:dbuser:${module.my_database.connect_resource_id}/${module.my_database.database_runtime_user}" ] } ]}
resource "aws_vpc_security_group_ingress_rule" "mcp_server_to_database" { security_group_id = module.my_database.security_group_id referenced_security_group_id = module.my_mcp_server.security_group_id from_port = module.my_database.cluster_port to_port = module.my_database.cluster_port ip_protocol = "tcp"}
resource "aws_vpc_security_group_egress_rule" "mcp_server_to_database" { security_group_id = module.my_mcp_server.security_group_id referenced_security_group_id = module.my_database.security_group_id from_port = module.my_database.cluster_port to_port = module.my_database.cluster_port ip_protocol = "tcp"}appconfig_application_id/appconfig_application_arn vêm da aplicação AppConfig de configuração de runtime compartilhada declarada uma vez no seu módulo raiz, não do módulo do banco de dados.
Requisitos SSL ao Conectar Sem RDS Proxy
Seção intitulada “Requisitos SSL ao Conectar Sem RDS Proxy”Quando o servidor MCP se conecta diretamente ao cluster Aurora (sem RDS Proxy), o gerador de conexão atualiza o Dockerfile gerado do servidor MCP para instalar o pacote CA do Amazon RDS no armazenamento de confiança do sistema:
ADD https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem /usr/local/share/ca-certificates/rds-global-bundle.crtRUN update-ca-certificatesAo usar RDS Proxy, você não precisa configurar o pacote CA do RDS no runtime do servidor MCP.
Desenvolvimento Local
Seção intitulada “Desenvolvimento Local”pnpm nx <mcp-server-name>-dev <project-name>yarn nx <mcp-server-name>-dev <project-name>npx nx <mcp-server-name>-dev <project-name>bunx nx <mcp-server-name>-dev <project-name>Isso inicia o servidor MCP e todos os bancos de dados conectados. A variável de ambiente LOCAL_DEV=true faz com que o cliente do banco de dados se conecte ao seu banco de dados Docker local em vez do Aurora.