Ir al contenido

Servidor MCP de TypeScript

Filter this guidePick generator option values to hide sections that don't apply.

Genera un servidor TypeScript Model Context Protocol (MCP) para proporcionar contexto a Modelos de Lenguaje Grande (LLMs), y opcionalmente despliégalo 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 proporcionan contexto o datos

Puedes generar un servidor MCP de TypeScript de dos maneras:

Terminal window
pnpm nx g @aws/nx-plugin:ts#mcp-server
También puede realizar una ejecución en seco para ver qué archivos se cambiarían
Terminal window
pnpm nx g @aws/nx-plugin:ts#mcp-server --dry-run
ParámetroTipoPredeterminadoDescripción
project Requeridostring-El proyecto al que agregar un servidor MCP
name string-El nombre de tu servidor MCP (predeterminado: mcp-server)
auth iam | cognitoiamEl método utilizado para autenticar con tu servidor MCP. Solo aplicable cuando infra está configurado (se ignora cuando infra es none).
iac inherit | cdk | terraforminheritEl proveedor de IaC preferido. Por defecto, se hereda de tu selección inicial.
infra agentcore | noneagentcoreEl tipo de infraestructura para alojar tu servidor MCP. Selecciona none para no tener alojamiento.
preferInstallDependencies booleantrueSi se prefiere instalar las dependencias después de que se ejecute el generador. Establece en false para diferir la instalación cuando se ejecutan múltiples generadores en lote (la instalación aún se ejecuta si es necesario para que los generadores subsecuentes puedan calcular el grafo de proyectos de Nx); instala una vez al final.

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

  • Directorioyour-project/
    • Directoriosrc/
      • Directoriomcp-server/ (o nombre personalizado si se especifica)
        • index.ts Exports your server
        • server.ts Main server definition
        • stdio.ts Entry point for STDIO transport, useful for simple local MCP servers
        • http.ts Entry point for Streamable HTTP transport, useful for hosting your MCP server
        • Directoriotools/
          • divide.ts Sample tool
        • Directorioresources/
          • sample-guidance.ts Sample resource
        • Dockerfile Entry point for hosting your MCP server (excluded when infra is set to None)
    • project.json Updated with MCP server serve target
infra = agentcore

Dado que este generador proporciona infraestructura como código basada en tu iac elegido, creará un proyecto en packages/common que incluye las construcciones CDK o módulos Terraform relevantes.

El proyecto común de infraestructura como código está estructurado de la siguiente manera:

  • Directoriopackages/common/constructs
    • Directoriosrc
      • Directorioapp/ Constructs for infrastructure specific to a project/generator
      • Directoriocore/ Generic constructs which are reused by constructs in app
      • index.ts Entry point exporting constructs from app
    • project.json Project build targets and configuration

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

  • Directoriopackages/common/constructs/src
    • Directorioapp
      • Directoriomcp-servers
        • Directorio<mcp-server-name>
          • <mcp-server-name>.ts CDK construct for deploying your MCP Server
infra = none

Si seleccionaste none para infra, no se generan construcciones CDK ni módulos 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 endpoint alojado para autenticar.

Cuando se despliega 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.

AI AssistantECRMCP Server(AgentCore Runtime)CloudWatch(Logs, Metrics) StreamableHTTP Containerimage

Las herramientas son funciones que el asistente de IA puede llamar para realizar acciones. Cada herramienta vive en su propio archivo bajo tools/ que exporta una función register<Name>Tool, que luego llamas desde server.ts. Por ejemplo, agrega tools/my-tool.ts:

tools/my-tool.ts
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { z } from 'zod';
export const registerMyTool = (server: McpServer) => {
server.registerTool("toolName", {
description: "tool description",
inputSchema: { param1: z.string(), param2: z.number() } // Input schema using Zod
},
async ({ param1, param2 }) => {
// Tool implementation
return {
content: [{ type: "text", text: "Result" }]
};
}
);
};

Luego regístrala dentro de createServer en server.ts:

server.ts
import { registerMyTool } from './tools/my-tool.js';
export const createServer = async () => {
const server = new McpServer({ name: 'my-server', version: '1.0.0' });
registerMyTool(server);
return server;
};

Los recursos proporcionan contexto al asistente de IA. Al igual que las herramientas, cada recurso vive en su propio archivo bajo resources/ que exporta una función register<Name>Resource llamada desde server.ts. Puedes agregar recursos estáticos desde archivos o recursos dinámicos:

resources/my-resource.ts
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
export const registerMyResource = (server: McpServer) => {
const exampleContext = 'some context to return';
server.registerResource('resource-name', 'example://resource', {}, async (uri) => ({
contents: [{ uri: uri.href, text: exampleContext }],
}));
// Dynamic resource
server.registerResource('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 soportan MCP utilizan un enfoque de configuración similar. Necesitará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"]
}
}
}

Mientras desarrollas tu servidor MCP, es posible que desees configurar la bandera --watch para que el asistente de IA siempre vea las últimas versiones de herramientas/recursos:

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

Por favor, consulta la siguiente documentación para configurar MCP con Asistentes de IA específicos:

Para ejecutar tu servidor MCP (y todo lo conectado a él, como una base de datos local) localmente, usa el target dev del proyecto:

Terminal window
pnpm nx dev your-project

Si has agregado múltiples componentes a tu proyecto (servidores MCP, agentes, etc.), esto los inicia todos. Para ejecutar solo este servidor MCP, apunta a su target <your-server-name>-dev:

Terminal window
pnpm nx your-server-name-dev your-project

El generador configura un target llamado <your-server-name>-inspect, que inicia tu servidor MCP localmente (a través del target <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 del transporte Streamable HTTP.

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

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 usando el inspector o configurándolo con un asistente de IA (como se indicó anteriormente).

Sin embargo, puedes ejecutar tu servidor con transporte STDIO directamente usando el target <your-server-name>-serve-stdio.

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

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

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

Terminal window
pnpm nx your-server-name-serve your-project

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

infra = agentcore

Desplegar tu Servidor MCP en Bedrock AgentCore Runtime

Sección titulada «Desplegar tu Servidor MCP en Bedrock AgentCore Runtime»

Si seleccionaste agentcore para infra, se genera la infraestructura relevante 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) {
// Add the MCP server to your stack
new MyProjectMcpServer(this, 'MyProjectMcpServer');
}
}

El generador proporciona una opción auth para configurar la autenticación de tu servidor MCP. Puedes elegir entre autenticación IAM (predeterminada) o Cognito al generar tu servidor MCP.

Por defecto, tu servidor MCP estará asegurado usando autenticación IAM, simplemente despliégalo sin ningún argumento:

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, es posible que desees que un agente generado con el generador py#agent llame 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);
}
}

Cuando seleccionas autenticación Cognito, el generador configura el servidor MCP para usar Cognito para la autenticación.

El constructo generado acepta una prop identity que configura la autenticación con 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 ser generado usando el generador ts#website#auth, o puedes crear tu propio UserPool y UserPoolClient de CDK.

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

Terminal window
pnpm nx bundle <project-name>

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 target bundle usa http.ts como punto de entrada para el servidor MCP Streamable HTTP para alojar en Bedrock AgentCore Runtime.

El generador configura un target <your-server-name>-docker que copia el Dockerfile desde el directorio fuente de tu servidor MCP al directorio de salida del bundle. Esto coloca el Dockerfile junto con los artefactos empaquetados, permitiendo que CDK construya la imagen Docker directamente usando AgentRuntimeArtifact.fromAsset.

También se genera un target docker que prepara el contexto docker para todos los servidores MCP si tienes múltiples definidos.

La imagen Docker construida para este proyecto puede ser escaneada en busca de vulnerabilidades 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 termina con código distinto de cero si se encuentra alguna vulnerabilidad de severidad HIGH o CRITICAL. El Dockerfile generado usa 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 usa 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. El script raíz trivy proporcionado escanea cada imagen en el workspace:

Terminal window
pnpm trivy

Puede haber instancias en las 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):

.trivyignore
# node-tar arbitrary file write - not exploitable in our usage
CVE-2024-XXXXX

Para más detalles sobre el filtrado de hallazgos, consulta la documentación de filtrado de Trivy.

Tu servidor MCP está configurado automáticamente con observabilidad utilizando 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 completen necesitarás habilitar Transaction Search.

Para más detalles, consulta la documentación de AgentCore sobre observabilidad.

Usa el generador connection para integrar este proyecto con otros en tu espacio de trabajo. Las siguientes conexiones involucran este proyecto:

Strands AgentsTypeScriptModel Context Protocol
TypeScript Agent to MCPConnect a TypeScript Agent to an MCP server
Strands AgentsPythonModel Context Protocol
Python Agent to MCPConnect a Python Agent to an MCP server
Model Context ProtocolAmazon Aurora
MCP Server to Relational DatabaseConnect a TypeScript MCP Server to an Aurora relational database
Model Context ProtocolAmazon DynamoDB
MCP Server to TypeScript DynamoDBConnect a TypeScript MCP Server to a DynamoDB table
Amazon Bedrock AgentCore GatewayModel Context Protocol
AgentCore Gateway to MCP ServerAggregate an MCP server behind an AgentCore Gateway