Saltearse al contenido

Servidor MCP de TypeScript

Genera un servidor TypeScript del Model Context Protocol (MCP) para proporcionar contexto a Modelos de Lenguaje Grande (LLMs), con opción de desplegarlo en Amazon Bedrock AgentCore.

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 proveen contexto o datos

Puedes generar un servidor MCP en TypeScript 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 - ts#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 Inherit The preferred IaC provider. By default this is inherited from your initial selection.

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

    • Directoryyour-project/
      • Directorysrc/
        • Directorymcp-server/ (o nombre personalizado si se especifica)
          • index.ts Exporta tu servidor
          • server.ts Definición principal del servidor
          • stdio.ts Punto de entrada para transporte STDIO, útil para servidores MCP locales simples
          • http.ts Punto de entrada para transporte HTTP transmitible, útil para alojar tu servidor MCP
          • Directorytools/
            • add.ts Herramienta de ejemplo
          • Directoryresources/
            • sample-guidance.ts Recurso de ejemplo
          • Dockerfile Punto de entrada para alojar tu servidor MCP (excluido cuando computeType se establece en None)
      • package.json Actualizado con entrada bin y dependencias MCP
      • project.json Actualizado con objetivo serve 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. Puedes añadir nuevas herramientas en el archivo server.ts:

    server.tool("toolName", "tool description",
    { param1: z.string(), param2: z.number() }, // Esquema de entrada usando Zod
    async ({ param1, param2 }) => {
    // Implementación de la herramienta
    return {
    content: [{ type: "text", text: "Result" }]
    };
    }
    );

    Los recursos proveen contexto al asistente de IA. Puedes añadir recursos estáticos desde archivos o recursos dinámicos:

    const exampleContext = 'algun contexto para retornar';
    server.resource('resource-name', 'example://resource', async (uri) => ({
    contents: [{ uri: uri.href, text: exampleContext }],
    }));
    // Recurso dinámico
    server.resource('dynamic-resource', 'dynamic://resource', async (uri) => {
    const data = await fetchSomeData();
    return {
    contents: [{ uri: uri.href, text: 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": "npx",
    "args": ["tsx", "/path/to/your-mcp-server/stdio.ts"]
    }
    }
    }

    Durante el desarrollo de tu servidor MCP, puedes configurar el flag --watch para que el asistente de IA siempre vea las versiones más recientes de las herramientas/recursos:

    {
    "mcpServers": {
    "your-mcp-server": {
    "command": "npx",
    "args": ["tsx", "--watch", "/path/to/your-mcp-server/stdio.ts"]
    }
    }
    }

    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ó arriba).

    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 tsx --watch para reiniciar automáticamente el servidor cuando cambien los archivos.

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

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

    Este comando usa tsx --watch para reiniciar automáticamente el servidor cuando cambien los archivos.

    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');
    }
    }

    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);
    }
    }

    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],
    },
    },
    });
    }
    }

    El generador configura automáticamente un objetivo bundle que utiliza Rolldown para crear un paquete de despliegue:

    Terminal window
    pnpm nx run <project-name>:bundle

    La configuración de Rolldown se encuentra en rolldown.config.ts, con una entrada por cada bundle a generar. Rolldown gestiona la creación de múltiples bundles en paralelo si están definidos.

    El objetivo bundle usa http.ts como punto de entrada para el servidor MCP HTTP transmisible que se aloja en Bedrock AgentCore Runtime.

    El generador configura un objetivo <your-server-name>-docker que ejecuta el servidor MCP HTTP transmisible empaquetado en el puerto 8000 según el contrato de protocolo MCP.

    También se genera un objetivo docker que ejecuta la construcción docker para todos los servidores MCP si tienes múltiples definidos.

    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.