Servidor MCP de TypeScript
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.
¿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»Puedes generar un servidor MCP de TypeScript de dos maneras:
Ejecute este generador@aws/nx-plugin:ts#mcp-server
pnpm nx g @aws/nx-plugin:ts#mcp-server yarn nx g @aws/nx-plugin:ts#mcp-server npx nx g @aws/nx-plugin:ts#mcp-server bunx nx g @aws/nx-plugin:ts#mcp-server- 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 - ts#mcp-server - Complete los parámetros requeridos
- Haga clic en
Generate
Construya su comando6
Requerido
infra = agentcore | agentcore-ecr
Opciones
Sección titulada «Opciones»projectRequeridostringEl proyecto al que agregar un servidor MCP
authenuminfra = agentcore | agentcore-ecrPredeterminado:iamEl método utilizado para autenticar con tu servidor MCP. Solo aplicable cuando infra está configurado (se ignora cuando infra es none).
iamcognitoiacenumPredeterminado:inheritEl proveedor de IaC preferido. Por defecto, se hereda de tu selección inicial.
inheritcdkterraforminfraenumPredeterminado:agentcoreEl tipo de infraestructura para alojar tu servidor MCP. agentcore despliega tu código como un zip a un runtime gestionado por AgentCore para el ciclo de construcción y despliegue más rápido. agentcore-ecr construye y aloja una imagen de contenedor en su lugar, para control a nivel de sistema operativo o un pipeline de contenedores establecido. Selecciona none para no alojar.
agentcoreagentcore-ecrnonenamestringEl nombre de tu servidor MCP (predeterminado: mcp-server)
preferInstallDependenciesbooleanPredeterminado:trueSi 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.
Salida del Generador
Sección titulada «Salida del Generador»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 Container image definition (only when
infraisagentcore-ecr)
- project.json Updated with MCP server serve target
Infraestructura
Sección titulada «Infraestructura»La opción infra selecciona cómo se empaqueta y aloja tu código en Amazon Bedrock AgentCore Runtime:
agentcore(predeterminado) utiliza despliegue directo de código: tu código compilado se empaqueta como un.zip, se sube a S3 y se ejecuta en un runtime de lenguaje administrado por AgentCore. No hay imagen de contenedor que construir, no hay repositorio ECR que administrar y no hay imagen que enviar, lo que resulta en un ciclo de compilación e implementación sustancialmente más rápido.agentcore-ecrconstruye una imagen de contenedorarm64a partir de unDockerfileproporcionado y la aloja desde el registro compartidocore/asset-ecr, junto con todos los demás contenedores en el workspace. Elige esta opción cuando necesites control sobre la imagen del sistema operativo — por ejemplo, para instalar bibliotecas nativas del sistema — o cuando tengas un pipeline de contenedores establecido. Esta opción también proporciona un objetivo de escaneo de imagen Trivy (consulta Escaneo de Imágenes a continuación).noneno genera ninguna infraestructura, por lo que el proyecto solo se puede ejecutar localmente.
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
Directoriopackages/common/terraform
Directoriosrc
Directorioapp/ Terraform modules for infrastructure specific to a project/generator
- …
Directoriocore/ Generic modules which are reused by modules in
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
Directoriopackages/common/terraform/src
Directorioapp
Directoriomcp-servers
Directorio<mcp-server-name>
- <mcp-server-name>.tf Module for deploying your MCP Server
Directoriocore
Directorioagent-core
- runtime.tf Generic module for deploying to Bedrock AgentCore Runtime
Directorioagent-core-code (when
infraisagentcore)- runtime.tf Packages your MCP Server’s code and delegates to
agent-core
- runtime.tf Packages your MCP Server’s code and delegates to
Directorioagent-core-container (when
infraisagentcore-ecr)- runtime.tf Builds and publishes your MCP Server’s image and delegates to
agent-core
- runtime.tf Builds and publishes your MCP Server’s image and delegates to
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.
Arquitectura
Sección titulada «Arquitectura»Cuando se despliega en Bedrock AgentCore Runtime, el código de tu servidor se empaqueta como un zip y se ejecuta en el runtime administrado de AgentCore. 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: agentcore-ecr, el servidor MCP se construye en una imagen de contenedor, se envía a Amazon ECR y se ejecuta en AgentCore Runtime. Esto te da control a nivel de sistema operativo sobre el entorno de ejecución, a costa de un ciclo de construcción y despliegue más largo que el empaquetado zip anterior.
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 tu Servidor MCP
Sección titulada «Trabajar con tu Servidor MCP»Agregar Herramientas
Sección titulada «Agregar Herramientas»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:
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';import { z } from 'zod';
export const registerMyTool = (server: McpServer) => { server.registerTool( 'toolName', { description: 'tool description', // Input schema using Zod inputSchema: { param1: z.string(), param2: z.number() }, }, async ({ param1, param2 }) => { // Tool implementation const result = `${param1} ${param2}`; return { content: [{ type: 'text' as const, text: result }], }; }, );};Luego regístrala dentro de createServer en 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;};Agregar Recursos
Sección titulada «Agregar Recursos»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:
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
const fetchSomeData = async (): Promise<string> => 'some dynamic context';
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 }], }; }, );};Regístralo dentro de createServer en server.ts de la misma manera que una herramienta:
import { registerMyResource } from './resources/my-resource.js';
export const createServer = async () => { const server = new McpServer({ name: 'my-server', version: '1.0.0' });
registerMyResource(server);
return server;};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 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"] } }}Recarga en Caliente
Sección titulada «Recarga en Caliente»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"] } }}Configuración Específica del Asistente
Sección titulada «Configuración Específica del Asistente»Por favor, consulta la siguiente documentación para configurar MCP con Asistentes de IA específicos:
Ejecutar tu Servidor MCP
Sección titulada «Ejecutar tu Servidor MCP»Desarrollo Local
Sección titulada «Desarrollo Local»Para ejecutar tu servidor MCP (y todo lo conectado a él, como una base de datos local) localmente, usa el target dev del proyecto:
pnpm nx dev your-projectyarn nx dev your-projectnpx nx dev your-projectbunx nx dev your-projectSi 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:
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 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.
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. 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.
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 tsx --watch para reiniciar automáticamente el servidor cuando los archivos cambian.
Streamable HTTP
Sección titulada «Streamable HTTP»Si deseas ejecutar tu servidor MCP localmente usando transporte Streamable HTTP, puedes usar el target <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 tsx --watch para reiniciar automáticamente el servidor cuando los archivos cambian.
Desplegar tu Servidor MCP en Bedrock AgentCore Runtime
Sección titulada «Desplegar tu Servidor MCP en Bedrock AgentCore Runtime»Infraestructura como Código
Sección titulada «Infraestructura como Código»Si seleccionaste agentcore o agentcore-ecr 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'); }}Se genera un módulo Terraform para ti, 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, junto con el almacén de artefactos compartido que usa su empaquetado. Bajo el empaquetado predeterminado agentcore, el código del servidor se almacena en el bucket de activos compartido, así que instancia el módulo core/asset-bucket una vez por despliegue, como ya lo hacen los módulos Lambda y API:
module "asset_bucket" { source = "../../common/terraform/src/core/asset-bucket"}
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
asset_bucket_name = module.asset_bucket.bucket_name asset_bucket_arn = module.asset_bucket.bucket_arn}Bajo agentcore-ecr la imagen del servidor se publica en el registro de activos compartido en su lugar, así que pasa las salidas de core/asset-ecr en lugar de las del bucket. Un registro sirve a todos los contenedores en el espacio de trabajo, por lo que ningún servidor MCP necesita un repositorio propio:
module "asset_ecr" { source = "../../common/terraform/src/core/asset-ecr"}
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
asset_ecr_repository_url = module.asset_ecr.repository_url asset_ecr_repository_arn = module.asset_ecr.repository_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 (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); }}# MCP Servermodule "my_project_mcp_server" { # Relative path to the generated module in the common/terraform project 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 a la salida 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 con Cognito
Sección titulada «Autenticación con Cognito»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 módulo generado acepta las variables user_pool_id y user_pool_client_ids para la autenticación con 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]}Target Bundle
Sección titulada «Target Bundle»El generador configura automáticamente un target bundle que utiliza Rolldown para crear un paquete de despliegue:
pnpm nx bundle <project-name>yarn nx bundle <project-name>npx nx bundle <project-name>bunx 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.
Target Package
Sección titulada «Target Package»El generador configura un target <your-server-name>-package que ensambla el paquete de código desplegable: el index.js empaquetado más una instalación vendorizada de AWS Distro for OpenTelemetry, que AgentCore requiere que esté presente en el paquete. La infraestructura generada sube este directorio como un .zip — a través de AgentRuntimeArtifact.fromCodeAsset bajo CDK, o archivado en el bucket de activos compartido bajo Terraform.
Target Docker
Sección titulada «Target Docker»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.
Escaneo de Imágenes
Sección titulada «Escaneo de Imágenes»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. El escaneo no se almacena en caché, ya que la imagen que lee vive en el motor de contenedores en lugar de en el disco — por lo que siempre escanea la imagen real, y falla ruidosamente en lugar de reportar un pase en caché para una imagen que ya no está allí. Por lo tanto, cada ejecución toma decenas de segundos por imagen y actualiza la base de datos de vulnerabilidades de Trivy, por lo que necesita acceso a la red. El script raíz trivy proporcionado escanea cada imagen en el workspace:
pnpm trivyyarn trivynpm run trivybun trivySuprimiendo Hallazgos de Trivy
Sección titulada «Suprimiendo Hallazgos de 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):
# 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 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.
Conexiones
Sección titulada «Conexiones»Usa el generador connection para integrar este proyecto con otros en tu espacio de trabajo. Las siguientes conexiones involucran este proyecto: