Servidor MCP de Python
Genere un servidor de Model Context Protocol (MCP) de Python para proporcionar contexto a Modelos de Lenguaje Grande (LLMs), y opcionalmente despliéguelo en Amazon Bedrock AgentCore.
¿Qué es MCP?
Sección titulada «¿Qué es MCP?»El Model Context Protocol (MCP) es un estándar abierto que permite a los asistentes de IA interactuar con herramientas y recursos externos. Proporciona una forma consistente para que los LLMs puedan:
- Ejecutar herramientas (funciones) que realizan acciones o recuperan información
- Acceder a recursos que proporcionan contexto o datos
Generar un Servidor MCP
Sección titulada «Generar un Servidor MCP»Puede generar un servidor MCP de Python de dos maneras:
- Instale el Nx Console VSCode Plugin si aún no lo ha hecho
- Abra la consola Nx en VSCode
- Haga clic en
Generate (UI)en la sección "Common Nx Commands" - Busque
@aws/nx-plugin - py#mcp-server - Complete los parámetros requeridos
- Haga clic en
Generate
pnpm nx g @aws/nx-plugin:py#mcp-serveryarn nx g @aws/nx-plugin:py#mcp-servernpx nx g @aws/nx-plugin:py#mcp-serverbunx nx g @aws/nx-plugin:py#mcp-serverTambién puede realizar una ejecución en seco para ver qué archivos se cambiarían
pnpm nx g @aws/nx-plugin:py#mcp-server --dry-runyarn nx g @aws/nx-plugin:py#mcp-server --dry-runnpx nx g @aws/nx-plugin:py#mcp-server --dry-runbunx nx g @aws/nx-plugin:py#mcp-server --dry-runOpciones
Sección titulada «Opciones»| Parámetro | Tipo | Predeterminado | Descripción |
|---|---|---|---|
| project Requerido | string | - | El proyecto al que agregar un servidor MCP |
| name | string | - | El nombre de tu servidor MCP (predeterminado: mcp-server) |
| auth | iam | cognito | iam | El método utilizado para autenticar con tu servidor MCP. Solo aplicable cuando infra está configurado (se ignora cuando infra es none). |
| iac | inherit | cdk | terraform | inherit | El proveedor de IaC preferido. Por defecto, se hereda de tu selección inicial. |
| infra | agentcore | none | agentcore | El tipo de infraestructura para alojar tu servidor MCP. Selecciona none para no tener alojamiento. |
| preferInstallDependencies | boolean | true | Si se prefiere instalar las dependencias después de que se ejecute el generador. Establecer en false para diferir la instalación al procesar múltiples generadores en lote (la instalación aún se ejecuta si es necesario para que los generadores subsiguientes puedan calcular el grafo de proyectos de Nx); instalar una vez al final. |
Salida del Generador
Sección titulada «Salida del Generador»El generador agregará los siguientes archivos a su proyecto de Python existente:
Directorioyour-project/
Directorioyour_module/
Directoriomcp_server/ (o nombre personalizado si se especifica)
- __init__.py Inicialización del paquete Python
- server.py Definición principal del servidor con herramientas y recursos de ejemplo
- stdio.py Punto de entrada para transporte STDIO, útil para servidores MCP locales simples
- http.py Punto de entrada para transporte HTTP transmisible, útil para alojar su servidor MCP
- Dockerfile Punto de entrada para alojar su servidor MCP (excluido cuando
infraestá configurado enNone)
- pyproject.toml Actualizado con dependencias MCP
- project.json Actualizado con objetivos de servicio del servidor MCP
Infraestructura
Sección titulada «Infraestructura»Dado que este generador proporciona infraestructura como código basada en tu proveedor de iacProvider seleccionado, creará un proyecto en packages/common que incluye los constructos CDK o módulos de Terraform correspondientes.
El proyecto común de infraestructura como código tiene la siguiente estructura:
Directoriopackages/common/constructs
Directoriosrc
Directorioapp/ Constructos para infraestructura específica de un proyecto/generador
- …
Directoriocore/ Constructos genéricos reutilizados por los constructos en
app- …
- index.ts Punto de entrada que exporta los constructos de
app
- project.json Objetivos de compilación y configuración del proyecto
Directoriopackages/common/terraform
Directoriosrc
Directorioapp/ Módulos de Terraform para infraestructura específica de un proyecto/generador
- …
Directoriocore/ Módulos genéricos reutilizados por los módulos en
app- …
- project.json Objetivos de compilación y configuración del proyecto
Para implementar tu MCP Server, se generan los siguientes archivos:
Directoriopackages/common/constructs/src
Directorioapp
Directoriomcp-servers
Directorio<project-name>
- <project-name>.ts Constructo CDK para implementar tu MCP Server
- Dockerfile Archivo Docker passthrough utilizado por el constructo CDK
Directoriopackages/common/terraform/src
Directorioapp
Directoriomcp-servers
Directorio<project-name>
- <project-name>.tf Módulo para implementar tu MCP Server
Directoriocore
Directorioagent-core
- runtime.tf Módulo genérico para implementar en Bedrock AgentCore Runtime
Si seleccionó none para infra, no se generan construcciones de CDK ni módulos de Terraform — el servidor MCP está configurado solo para uso local STDIO / HTTP. La opción auth se ignora en este modo ya que no hay un punto de conexión alojado para autenticar.
Arquitectura
Sección titulada «Arquitectura»Cuando se implementa en Bedrock AgentCore Runtime, el servidor MCP se construye en una imagen de contenedor, se envía a Amazon ECR y se ejecuta en AgentCore Runtime. Los asistentes de IA invocan el endpoint del plano de datos de AgentCore Runtime, que reenvía las llamadas tools/* y resources/* a tu servidor a través del transporte HTTP transmisible.
Con infra: None, no se genera infraestructura de AWS. El servidor MCP está configurado solo para transportes STDIO y HTTP locales, y es consumido por asistentes de IA que se ejecutan en la misma máquina.
Trabajar con su Servidor MCP
Sección titulada «Trabajar con su Servidor MCP»Agregar Herramientas
Sección titulada «Agregar Herramientas»Las herramientas son funciones que el asistente de IA puede llamar para realizar acciones. El servidor MCP de Python utiliza la biblioteca MCP Python SDK (FastMCP), que proporciona un enfoque simple basado en decoradores para definir herramientas.
Puede agregar nuevas herramientas en el archivo server.py:
@mcp.tool(description="Your tool description")def your_tool_name(param1: str, param2: int) -> str: """Tool implementation with type hints""" # Your tool logic here return f"Result: {param1} with {param2}"La biblioteca FastMCP maneja automáticamente:
- Validación de tipos basada en las anotaciones de tipo de su función
- Generación de esquema JSON para el protocolo MCP
- Manejo de errores y formato de respuesta
Agregar Recursos
Sección titulada «Agregar Recursos»Los recursos proporcionan contexto al asistente de IA. Puede agregar recursos usando el decorador @mcp.resource:
@mcp.resource("example://static-resource", description="Static resource example")def static_resource() -> str: """Return static content""" return "This is static content that provides context to the AI"
@mcp.resource("dynamic://resource/{item_id}", description="Dynamic resource example")def dynamic_resource(item_id: str) -> str: """Return dynamic content based on parameters""" # Fetch data based on item_id data = fetch_data_for_item(item_id) return f"Dynamic content for {item_id}: {data}"Configurar con Asistentes de IA
Sección titulada «Configurar con Asistentes de IA»Archivos de configuración
Sección titulada «Archivos de configuración»La mayoría de los asistentes de IA que admiten MCP utilizan un enfoque de configuración similar. Deberás crear o actualizar un archivo de configuración con los detalles de tu servidor MCP:
{ "mcpServers": { "your-mcp-server": { "command": "uv", "args": [ "run", "python", "-m", "my_module.mcp_server.stdio" ], "env": { "VIRTUAL_ENV": "/path/to/your/project/.venv" } } }}Configuración específica del asistente
Sección titulada «Configuración específica del asistente»Consulta la siguiente documentación para configurar MCP con asistentes de IA específicos:
Ejecutar su Servidor MCP
Sección titulada «Ejecutar su Servidor MCP»Desarrollo Local
Sección titulada «Desarrollo Local»Para ejecutar su servidor MCP (y todo lo conectado a él, como una base de datos local) localmente, use el objetivo dev del proyecto:
pnpm nx dev your-projectyarn nx dev your-projectnpx nx dev your-projectbunx nx dev your-projectSi ha agregado múltiples componentes a su proyecto (servidores MCP, agentes, etc.), esto los inicia todos. Para ejecutar solo este servidor MCP, apunte a su objetivo <your-server-name>-dev:
pnpm nx your-server-name-dev your-projectyarn nx your-server-name-dev your-projectnpx nx your-server-name-dev your-projectbunx nx your-server-name-dev your-projectInspector
Sección titulada «Inspector»El generador configura un objetivo llamado <your-server-name>-inspect, que inicia su servidor MCP localmente (a través del objetivo <your-server-name>-dev, incluyendo cualquier dependencia conectada como una base de datos local) y lanza el MCP Inspector preconfigurado para conectarse a él a través de transporte HTTP transmisible.
pnpm nx your-server-name-inspect your-projectyarn nx your-server-name-inspect your-projectnpx nx your-server-name-inspect your-projectbunx nx your-server-name-inspect your-projectEsto iniciará el inspector en http://localhost:6274. Comience haciendo clic en el botón “Connect”.
La forma más fácil de probar y usar un servidor MCP es usando el inspector o configurándolo con un asistente de IA (como se indicó anteriormente).
Sin embargo, puede ejecutar su servidor con transporte STDIO directamente usando el objetivo <your-server-name>-serve-stdio.
pnpm nx your-server-name-serve-stdio your-projectyarn nx your-server-name-serve-stdio your-projectnpx nx your-server-name-serve-stdio your-projectbunx nx your-server-name-serve-stdio your-projectEste comando usa uv run para ejecutar su servidor MCP con transporte STDIO.
Streamable HTTP
Sección titulada «Streamable HTTP»Si desea ejecutar su servidor MCP localmente usando transporte HTTP transmisible, puede usar el objetivo <your-server-name>-serve.
pnpm nx your-server-name-serve your-projectyarn nx your-server-name-serve your-projectnpx nx your-server-name-serve your-projectbunx nx your-server-name-serve your-projectEste comando usa uv run uvicorn --reload para ejecutar su servidor MCP con transporte HTTP (típicamente en el puerto 8000), y se reinicia automáticamente cuando los archivos cambian.
Desplegar su Servidor MCP en Bedrock AgentCore Runtime
Sección titulada «Desplegar su Servidor MCP en Bedrock AgentCore Runtime»Infraestructura como Código
Sección titulada «Infraestructura como Código»Si seleccionaste agentcore para infra, se generará la infraestructura correspondiente de CDK o Terraform que puedes usar para desplegar tu servidor MCP en Amazon Bedrock AgentCore Runtime.
Se genera un constructo CDK para tu Servidor MCP, nombrado según el name que elegiste al ejecutar el generador, o <ProjectName>McpServer por defecto.
Puedes usar este constructo CDK en una aplicación CDK:
import { MyProjectMcpServer } from ':my-scope/common-constructs';
export class ExampleStack extends Stack { constructor(scope: Construct, id: string) { // Agrega el servidor MCP a tu stack new MyProjectMcpServer(this, 'MyProjectMcpServer'); }}Se genera un módulo de Terraform para tu proyecto, nombrado según el name que elegiste al ejecutar el generador, o <ProjectName>-mcp-server por defecto.
Pasa las salidas del módulo compartido runtime_config_appconfig al módulo del servidor MCP:
module "my_project_mcp_server" { source = "../../common/terraform/src/app/mcp-servers/my-project-mcp-server"
appconfig_application_id = module.runtime_config_appconfig.application_id appconfig_application_arn = module.runtime_config_appconfig.application_arn}Autenticación
Sección titulada «Autenticación»El generador proporciona una opción auth para configurar la autenticación de tu servidor MCP. Puedes elegir entre autenticación IAM (por defecto) o Cognito al generar tu servidor MCP.
Por defecto, tu servidor MCP estará protegido con autenticación IAM. Simplemente despliégalo sin argumentos adicionales:
import { MyProjectMcpServer } from ':my-scope/common-constructs';
export class ExampleStack extends Stack { constructor(scope: Construct, id: string) { new MyProjectMcpServer(this, 'MyProjectMcpServer'); }}Puedes otorgar acceso para invocar tu servidor MCP en Bedrock AgentCore Runtime usando el método grantInvokeAccess. Por ejemplo, quizás quieras que un agente generado con el generador py#agent pueda llamar a tu servidor MCP:
import { MyProjectAgent, MyProjectMcpServer } from ':my-scope/common-constructs';
export class ExampleStack extends Stack { constructor(scope: Construct, id: string) { const agent = new MyProjectAgent(this, 'MyProjectAgent'); const mcpServer = new MyProjectMcpServer(this, 'MyProjectMcpServer');
mcpServer.grantInvokeAccess(agent); }}# Servidor MCPmodule "my_project_mcp_server" { # Ruta relativa al módulo generado en el proyecto common/terraform source = "../../common/terraform/src/app/mcp-servers/my-project-mcp-server"
appconfig_application_id = module.runtime_config_appconfig.application_id appconfig_application_arn = module.runtime_config_appconfig.application_arn}Para otorgar acceso para invocar tu servidor MCP, necesitarás agregar una política como la siguiente, haciendo referencia al output module.my_project_mcp_server.agent_core_runtime_arn:
{ Effect = "Allow" Action = [ "bedrock-agentcore:InvokeAgentRuntime" ] Resource = [ module.my_project_mcp_server.agent_core_runtime_arn, "${module.my_project_mcp_server.agent_core_runtime_arn}/*" ]}Autenticación Cognito
Sección titulada «Autenticación Cognito»Cuando seleccionas autenticación Cognito, el generador configura el servidor MCP para usar Cognito para la autenticación.
El constructo generado acepta una propiedad identity que configura la autenticación Cognito:
import { MyProjectMcpServer, UserIdentity } from ':my-scope/common-constructs';
export class ExampleStack extends Stack { constructor(scope: Construct, id: string) { const identity = new UserIdentity(this, 'Identity');
new MyProjectMcpServer(this, 'MyProjectMcpServer', { identity, }); }}El constructo UserIdentity puede generarse usando el generador ts#website#auth, o puedes crear tu propio UserPool y UserPoolClient de CDK.
El módulo generado acepta las variables user_pool_id y user_pool_client_ids para la autenticación Cognito:
module "user_identity" { source = "../../common/terraform/src/core/user-identity"}
module "my_project_mcp_server" { source = "../../common/terraform/src/app/mcp-servers/my-project-mcp-server"
appconfig_application_id = module.runtime_config_appconfig.application_id appconfig_application_arn = module.runtime_config_appconfig.application_arn
user_pool_id = module.user_identity.user_pool_id user_pool_client_ids = [module.user_identity.user_pool_client_id]}Objetivos de Bundle y Docker
Sección titulada «Objetivos de Bundle y Docker»Para construir su servidor MCP para Bedrock AgentCore Runtime, se agrega un objetivo bundle a su proyecto, que:
- Exporta sus dependencias de Python a un archivo
requirements.txtusandouv export - Instala dependencias para la plataforma de destino (
aarch64-manylinux_2_28) usandouv pip install
También se agrega un objetivo docker específico para su servidor MCP, que copia el Dockerfile y los artefactos empaquetados en un directorio de contexto de docker. Esto coloca el Dockerfile junto con la salida construida, permitiendo que CDK construya la imagen de Docker directamente usando AgentRuntimeArtifact.fromAsset.
Escaneo de Imágenes
Sección titulada «Escaneo de Imágenes»La imagen Docker construida para este proyecto se escanea en busca de vulnerabilidades como parte de la construcción usando Trivy, ejecutándose desde la imagen Trivy alojada en ECR.
Se agrega un target trivy a tu proyecto que escanea la imagen construida y falla la construcción si se encuentra alguna vulnerabilidad de severidad HIGH o CRITICAL. El Dockerfile generado utiliza una imagen base sin vulnerabilidades corregibles conocidas de estas severidades al momento de la generación, y actualiza las herramientas incluidas (como npm) para mantenerlo así.
El escaneo utiliza el mismo motor de contenedores que tu construcción de imagen (docker o finch), por lo que no se requieren herramientas adicionales. Dado que el escaneo solo se vuelve a ejecutar cuando la imagen cambia, una imagen sin cambios no se vuelve a escanear.
Supresión de Hallazgos de Trivy
Sección titulada «Supresión de Hallazgos de Trivy»Puede haber casos en los que desees suprimir una vulnerabilidad específica, por ejemplo, cuando aún no hay una corrección disponible y has evaluado el riesgo como aceptable.
Agrega el ID de vulnerabilidad (uno por línea) al archivo .trivyignore en la raíz de tu proyecto (es decir, junto a tu project.json):
# node-tar arbitrary file write - not exploitable in our usageCVE-2024-XXXXXPara más detalles sobre el filtrado de hallazgos, consulta la documentación de filtrado de Trivy.
Observabilidad
Sección titulada «Observabilidad»Tu servidor MCP se configura automáticamente con observabilidad utilizando la AWS Distro for Open Telemetry (ADOT), mediante la configuración de auto-instrumentación en tu Dockerfile.
Puedes encontrar trazas en la consola de AWS CloudWatch seleccionando “GenAI Observability” en el menú. Ten en cuenta que para que las trazas se rellenen, deberás habilitar Transaction Search.
Para más detalles, consulta la documentación de AgentCore sobre observabilidad.
Conexiones
Sección titulada «Conexiones»Usa el generador connection para integrar este proyecto con otros en tu workspace. Las siguientes conexiones involucran este proyecto: