Saltearse al contenido

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.

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

Puedes generar un servidor MCP en Python de dos formas:

  1. Instale el Nx Console VSCode Plugin si aún no lo ha hecho
  2. Abra la consola Nx en VSCode
  3. Haga clic en Generate (UI) en la sección "Common Nx Commands"
  4. Busque @aws/nx-plugin - py#mcp-server
  5. Complete los parámetros requeridos
    • Haga clic en Generate
    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 CDK The preferred IaC provider

    El generador añadirá los siguientes archivos a tu proyecto Python existente:

    • Directoryyour-project/
      • Directoryyour_module/
        • Directorymcp_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 computeType se establece en None)
      • pyproject.toml Actualizado con dependencias MCP
      • project.json Actualizado con objetivos de servicio del servidor MCP

    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:

    • Directorypackages/common/constructs
      • Directorysrc
        • Directoryapp/ Constructos para infraestructura específica de un proyecto/generador
        • Directorycore/ 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

    Para implementar tu MCP Server, se generan los siguientes archivos:

    • Directorypackages/common/constructs/src
      • Directoryapp
        • Directorymcp-servers
          • Directory<project-name>
            • <project-name>.ts Constructo CDK para implementar tu MCP Server
            • Dockerfile Archivo Docker passthrough utilizado por el constructo CDK
      • Directorycore
        • Directoryagent-core
          • runtime.ts Constructo CDK genérico para implementar en Bedrock AgentCore Runtime

    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

    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}"

    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"
    }
    }
    }
    }

    Consulta la siguiente documentación para configurar MCP con asistentes de IA específicos:

    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.

    Terminal window
    pnpm nx run your-project:your-server-name-inspect

    Esto 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.

    Terminal window
    pnpm nx run your-project:your-server-name-serve-stdio

    Este comando usa uv run para ejecutar tu servidor MCP con transporte STDIO.

    Si prefieres ejecutar tu servidor MCP localmente usando transporte HTTP transmitible, puedes usar el objetivo <your-server-name>-serve-http.

    Terminal window
    pnpm nx run your-project:your-server-name-serve-http

    Este 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»

    Si seleccionaste BedrockAgentCoreRuntime para computeType, se generará la infraestructura relevante de CDK o Terraform que puedes usar para desplegar tu servidor MCP en Amazon Bedrock AgentCore Runtime.

    Se genera un constructo de CDK para tu proyecto, nombrado según el name que elegiste al ejecutar el generador, o <ProjectName>McpServer por defecto.

    Puedes usar este constructo de 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 pila
    new MyProjectMcpServer(this, 'MyProjectMcpServer');
    }
    }

    Por defecto, tu servidor MCP estará protegido usando 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);
    }
    }

    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 grupo de usuarios y cliente 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 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.txt usando uv export
    • Instala dependencias para la plataforma objetivo (aarch64-manylinux2014) usando uv pip install

    También se añade un objetivo docker específico para tu servidor MCP, que:

    • Construye una imagen Docker desde el Dockerfile que ejecuta tu servidor MCP en el puerto 8000, según el contrato de protocolo MCP

    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.