Servidor Python MCP
Genera un servidor Python del Model Context Protocol (MCP) para proporcionar contexto a Modelos de Lenguaje Grande (LLMs), y opcionalmente desplegarlo 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 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 proveen contexto o datos
Generar un servidor MCP
Sección titulada «Generar un servidor MCP»Puedes generar un servidor MCP en Python de dos formas:
- 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 | - | The project to add an MCP server to |
| computeType | string | BedrockAgentCoreRuntime | The type of compute to host your MCP server. Select None for no hosting. |
| name | string | - | The name of your MCP server (default: mcp-server) |
| iacProvider | string | Inherit | The preferred IaC provider. By default this is inherited from your initial selection. |
Salida del generador
Sección titulada «Salida del generador»El generador añadirá los siguientes archivos a tu proyecto 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 transmitible, útil para alojar tu servidor MCP
- Dockerfile Punto de entrada para alojar tu servidor MCP (excluido cuando
computeTypese establece 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
Directoriocore
Directorioagent-core
- runtime.ts Constructo CDK genérico para implementar en Bedrock AgentCore Runtime
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
Trabajando con tu servidor MCP
Sección titulada «Trabajando con tu servidor MCP»Añadiendo herramientas
Sección titulada «Añadiendo herramientas»Las herramientas son funciones que el asistente de IA puede llamar para realizar acciones. El servidor MCP en Python usa la biblioteca MCP Python SDK (FastMCP), que provee un enfoque basado en decoradores para definir herramientas.
Puedes añadir nuevas herramientas en el archivo server.py:
@mcp.tool(description="Descripción de tu herramienta")def your_tool_name(param1: str, param2: int) -> str: """Implementación de la herramienta con sugerencias de tipo""" # Tu lógica de herramienta aquí return f"Resultado: {param1} con {param2}"La biblioteca FastMCP maneja automáticamente:
- Validación de tipos basada en las sugerencias de tipo de tu función
- Generación de esquemas JSON para el protocolo MCP
- Manejo de errores y formato de respuestas
Añadiendo recursos
Sección titulada «Añadiendo recursos»Los recursos proveen contexto al asistente de IA. Puedes añadir recursos usando el decorador @mcp.resource:
@mcp.resource("example://static-resource", description="Ejemplo de recurso estático")def static_resource() -> str: """Retorna contenido estático""" return "Este es contenido estático que provee contexto a la IA"
@mcp.resource("dynamic://resource/{item_id}", description="Ejemplo de recurso dinámico")def dynamic_resource(item_id: str) -> str: """Retorna contenido dinámico basado en parámetros""" # Obtiene datos basados en item_id data = fetch_data_for_item(item_id) return f"Contenido dinámico para {item_id}: {data}"Configuración con asistentes de IA
Sección titulada «Configuración 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:
Ejecutando tu servidor MCP
Sección titulada «Ejecutando tu servidor MCP»Inspector
Sección titulada «Inspector»El generador configura un objetivo llamado <your-server-name>-inspect, que inicia el MCP Inspector con la configuración para conectarse a tu servidor MCP usando transporte STDIO.
pnpm nx run your-project:your-server-name-inspectyarn nx run your-project:your-server-name-inspectnpx nx run your-project:your-server-name-inspectbunx nx run your-project:your-server-name-inspectEsto iniciará el inspector en http://localhost:6274. Comienza haciendo clic en el botón “Connect”.
La forma más fácil de probar y usar un servidor MCP es mediante el inspector o configurándolo con un asistente de IA (como se mencionó anteriormente).
Sin embargo, puedes ejecutar tu servidor con transporte STDIO directamente usando el objetivo <your-server-name>-serve-stdio.
pnpm nx run your-project:your-server-name-serve-stdioyarn nx run your-project:your-server-name-serve-stdionpx nx run your-project:your-server-name-serve-stdiobunx nx run your-project:your-server-name-serve-stdioEste comando usa uv run para ejecutar tu servidor MCP con transporte STDIO.
HTTP transmitible
Sección titulada «HTTP transmitible»Si prefieres ejecutar tu servidor MCP localmente usando transporte HTTP transmitible, puedes usar el objetivo <your-server-name>-serve.
pnpm nx run your-project:your-server-name-serveyarn nx run your-project:your-server-name-servenpx nx run your-project:your-server-name-servebunx nx run your-project:your-server-name-serveEste comando usa uv run para ejecutar tu servidor MCP con transporte HTTP, típicamente en el puerto 8000.
Implementación de tu servidor MCP en Bedrock AgentCore Runtime
Sección titulada «Implementación de tu servidor MCP en Bedrock AgentCore Runtime»Infraestructura como Código
Sección titulada «Infraestructura como Código»Si seleccionaste BedrockAgentCoreRuntime para computeType, 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 proyecto, 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.
Puedes usar este módulo de Terraform en un proyecto Terraform:
# 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"}Autenticación
Sección titulada «Autenticación»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 MCP en Bedrock AgentCore Runtime usando el método grantInvoke. Por ejemplo, quizás quieras que un agente generado con el generador py#strands-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.agentCoreRuntime.grantInvoke(agent.agentCoreRuntime); }}# 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"}Para otorgar acceso para invocar tu agente, 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 JWT
Sección titulada «Autenticación Cognito JWT»El siguiente ejemplo demuestra cómo configurar autenticación Cognito para tu agente.
Para configurar autenticación JWT, puedes pasar la propiedad authorizerConfiguration a tu constructo de servidor MCP. Este ejemplo configura un User Pool y Client de Cognito para proteger el servidor MCP:
import { MyProjectMcpServer } from ':my-scope/common-constructs';
export class ExampleStack extends Stack { constructor(scope: Construct, id: string) { const userPool = new UserPool(this, 'UserPool'); const client = userPool.addClient('Client', { authFlows: { userPassword: true, }, });
new MyProjectMcpServer(this, 'MyProjectMcpServer', { authorizerConfiguration: { customJwtAuthorizer: { discoveryUrl: `https://cognito-idp.${Stack.of(userPool).region}.amazonaws.com/${userPool.userPoolId}/.well-known/openid-configuration`, allowedClients: [client.userPoolClientId], }, }, }); }}Para configurar autenticación JWT, puedes editar tu módulo de Servidor MCP para configurar la variable customJWTAuthorizer de la siguiente manera:
data "aws_region" "current" {}
locals { aws_region = data.aws_region.current.name
# Reemplaza con tus IDs de user pool y client o expón como variables user_pool_id = "xxx" user_pool_client_ids = ["yyy"]}
module "agent_core_runtime" { source = "../../../core/agent-core" agent_runtime_name = "MyProjectMcpServer" docker_image_tag = "my-scope-my-project-agent:latest" server_protocol = "MCP" customJWTAuthorizer = { discoveryUrl = "https://cognito-idp.${local.aws_region}.amazonaws.com/${local.user_pool_id}/.well-known/openid-configuration", allowedClients = local.user_pool_client_ids } env = var.env additional_iam_policy_statements = var.additional_iam_policy_statements tags = var.tags}Objetivos de bundle y Docker
Sección titulada «Objetivos de bundle y Docker»Para construir tu servidor MCP para Bedrock AgentCore Runtime, se añade un objetivo bundle a tu proyecto, que:
- Exporta tus dependencias Python a un archivo
requirements.txtusandouv export - Instala dependencias para la plataforma objetivo (
aarch64-manylinux2014) usandouv pip install
También se añade un objetivo docker específico para tu servidor MCP, que:
- Construye una imagen Docker desde el
Dockerfileque ejecuta tu servidor MCP en el puerto8000, según el contrato de protocolo MCP
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.