mcp-typescript-starter
MCP TypeScript Starter
MCP TypeScript Starter es una base orientada a producción para crear un servidor de Model Context Protocol con TypeScript. Incluye una herramienta de ejemplo tipada, transportes stdio y Streamable HTTP, validación estricta, pruebas, un contenedor endurecido y publicación automatizada en GHCR.
Clónalo, sustituye el dominio de ejemplo y conserva la infraestructura que los servidores MCP reales necesitan.
Navegación
Related MCP server: mcp-server-http-streamable
Usar esta plantilla inicial
Haz clic en Usar esta plantilla en GitHub para crear un nuevo servidor MCP con un historial de Git independiente. Después de crearlo, sustituye la herramienta de ejemplo y actualiza la identidad del proyecto siguiendo Personalizar la plantilla inicial.
Haz un fork de este repositorio si quieres aportar mejoras mediante una pull request. Consulta Contribuciones antes de enviar cambios.
Si esta plantilla inicial te ha resultado útil, considera darle una estrella al repositorio. Así ayudas a que otros desarrolladores de TypeScript descubran el proyecto.
Acerca de
La plantilla inicial demuestra el recorrido completo desde una definición validada de herramienta MCP hasta un resultado estructurado visible para el cliente. El servidor utiliza el actual MCP TypeScript SDK modular y el modelo HTTP estándar web de Hono en lugar de un framework de servidor personalizado.
El transporte stdio predeterminado está pensado para clientes locales que inician el servidor como un proceso hijo. Streamable HTTP no tiene estado y crea un nuevo servidor MCP para cada solicitud, por lo que puede replicarse sin almacenamiento de sesión compartido.
El ejemplo realiza un trabajo acotado en memoria. No hay telemetría, base de datos de aplicación, almacenamiento persistente, autenticación ni dependencia de servicios externos.
Características
Registra herramientas con esquemas estrictos de entrada y salida en Zod.
Devuelve tanto contenido legible por humanos como contenido estructurado tipado.
Incluye anotaciones de seguridad MCP precisas.
Admite stdio y Streamable HTTP sin estado.
Usa Hono con validación de Host y Origin contra el rebinding de DNS.
Vincula HTTP al loopback por defecto y exige una lista de permitidos para otras interfaces.
Limita las entradas de las herramientas y los cuerpos de las solicitudes HTTP.
Mantiene stdout exclusivamente para los mensajes del protocolo MCP en modo stdio.
Gestiona SIGINT y SIGTERM con un apagado elegante idempotente.
Se ejecuta como un contenedor no root con soporte para un sistema de archivos raíz de solo lectura.
Prueba la configuración, el cableado de stdio, el comportamiento de MCP, las rutas de Hono y el tráfico HTTP real.
Publica imágenes multiarquitectura solo después de que pasen las comprobaciones de calidad.
Herramientas MCP
echo
Devuelve un mensaje validado y metadatos de cadena opcionales. Es deliberadamente simple para que el repositorio enseñe esquemas, registro, anotaciones y resultados de MCP sin inventar un dominio de negocio.
Ejemplo de entrada:
{
"message": "Hello, MCP!",
"metadata": {
"source": "example-client"
}
}Ejemplo de salida estructurada:
{
"message": "Hello, MCP!",
"metadata": {
"source": "example-client"
}
}Los mensajes están limitados a 10 000 caracteres. Los metadatos aceptan como máximo 20 entradas; las claves están limitadas a 64 caracteres y los valores a 1 024 caracteres.
Pila tecnológica
TypeScript con reglas de proyecto estrictas
Instalación
Requisitos previos
Node.js 24+ y pnpm 11 para el desarrollo local.
Docker y Docker Compose para el despliegue en contenedores.
Docker Compose
El despliegue HTTP recomendado utiliza la imagen multiarquitectura publicada:
ghcr.io/lukegskw/mcp-typescript-starter:latestDescarga el ejemplo de Compose y proporciona el nombre de host que usarán los clientes:
curl -O https://raw.githubusercontent.com/lukegskw/mcp-typescript-starter/main/compose.example.yaml
export MCP_ALLOWED_HOSTS='mcp.example.internal'
docker compose -f compose.example.yaml up -dLos endpoints de Streamable HTTP y de salud estarán disponibles en:
http://<host>:3000/mcp
http://<host>:3000/healthzPara publicar un puerto de host diferente, establece MCP_PUBLISHED_PORT. La aplicación sigue usando el puerto 3000 dentro del contenedor.
La etiqueta latest sigue la compilación exitosa más reciente de la rama predeterminada. Usa una etiqueta de versión o una etiqueta inmutable sha-* para un despliegue y una reversión controlados.
Docker run
docker run -d \
--name mcp-typescript-starter \
--restart unless-stopped \
--read-only \
--user 10001:10001 \
--cap-drop ALL \
--security-opt no-new-privileges:true \
--tmpfs /tmp:size=16m,mode=1777 \
-e MCP_TRANSPORT=streamable-http \
-e MCP_HOST=0.0.0.0 \
-e MCP_ALLOWED_HOSTS=127.0.0.1,localhost,mcp.example.internal \
-p 3000:3000 \
ghcr.io/lukegskw/mcp-typescript-starter:latestCompilar el contenedor desde el código fuente
git clone https://github.com/lukegskw/mcp-typescript-starter.git
cd mcp-typescript-starter
docker buildx build --load -t mcp-typescript-starter:local .Instalación local de Node.js
git clone https://github.com/lukegskw/mcp-typescript-starter.git
cd mcp-typescript-starter
pnpm install --frozen-lockfile
pnpm build
pnpm start -- --transport stdioPara el desarrollo local con Streamable HTTP:
MCP_TRANSPORT=streamable-http pnpm devConfiguración
Variable | Requerida | Predeterminado | Descripción |
| No |
|
|
| No |
| Dirección de vinculación HTTP. |
| No |
| Puerto de escucha HTTP. |
| Fuera del loopback | Ninguno | Lista de permitidos de nombres de host para Host y Origin separados por comas. |
La opción de línea de comandos --transport anula MCP_TRANSPORT. MCP_ALLOWED_HOSTS contiene nombres de host, no URLs; incluye todos los nombres de host que usen los clientes legítimos y las comprobaciones de salud.
El servidor no tiene secretos en su configuración de ejemplo. Añade las credenciales del dominio a través de la plataforma de despliegue o del entorno, nunca como argumentos de herramientas MCP ni en archivos confirmados.
Configuración del cliente MCP
Para un cliente que acepte definiciones de servidor Streamable HTTP:
mcp_servers:
starter:
url: http://127.0.0.1:3000/mcpPara un cliente que inicie un servidor stdio local:
{
"mcpServers": {
"starter": {
"command": "node",
"args": [
"/absolute/path/to/mcp-typescript-starter/dist/main.js",
"--transport",
"stdio"
]
}
}
}Para permitir que un cliente local inicie el contenedor a través de stdio, usa docker run -i --rm y pasa --transport stdio después del nombre de la imagen. -i es necesario para que el cliente pueda intercambiar mensajes MCP a través de la entrada y salida estándar.
Los formatos de configuración de los clientes difieren. Consulta la documentación del cliente para conocer su esquema exacto y reinicia o recarga el cliente después de cambiar la definición de su servidor.
Personalizar la plantilla inicial
Los principales puntos de extensión son deliberadamente directos:
Copia o sustituye
src/tools/echo.ts.Define esquemas estrictos de entrada y salida antes de escribir el controlador.
Registra la herramienta en
src/server.ts.Añade pruebas de comportamiento de MCP y cualquier prueba de integración del dominio.
Sustituye el nombre del paquete, la identidad del servidor, las referencias a la imagen y el contenido del README.
Mantén los módulos de herramientas responsables de sus propios esquemas y controladores. Mantén los módulos de transporte independientes de las herramientas de dominio. Introduce servicios o persistencia solo cuando el comportamiento real lo requiera.
Verificación
Ejecuta la suite completa del repositorio:
pnpm install --frozen-lockfile
pnpm format:check
pnpm lint
pnpm typecheck
pnpm test:unit
pnpm test:integration
pnpm buildPara cambios en el contenedor:
docker buildx build --load -t mcp-typescript-starter:test .Por último, conecta un cliente MCP y confirma que echo aparece listado y devuelve tanto texto como contenido estructurado. En modo HTTP, confirma que /healthz devuelve {"status":"ok"}.
Limitaciones
El ejemplo expone una herramienta y ningún recurso o prompt.
Streamable HTTP no tiene autenticación. Limítalo a loopback, una LAN de confianza, una VPN, una red privada de contenedores o un proxy inverso autenticado.
Las listas de permitidos de Host y Origin previenen clases de ataques de rebinding de DNS, pero no autentican a los llamantes.
El servidor HTTP no tiene estado y no contiene persistencia compartida ni coordinación distribuida.
No se incluyen limitación de tasa, trazado, métricas ni registro específico del dominio.
El repositorio es una plantilla inicial de código fuente, no una librería npm publicada.
Revisa SECURITY.md antes de exponer el transporte HTTP o de informar de un problema de seguridad.
Contribuciones
Las contribuciones son bienvenidas. Antes de abrir una pull request:
pnpm install --frozen-lockfile
pnpm format:check
pnpm lint
pnpm typecheck
pnpm test
pnpm build
docker buildx build --load -t mcp-typescript-starter:test .Los cambios deben preservar el tipado estricto, la validación acotada, los resultados estructurados de MCP, la pureza del protocolo en stdout, los valores predeterminados seguros de HTTP, las pruebas deterministas y la documentación del comportamiento visible para el usuario. No añadas abstracciones sin un caso de uso concreto para ellas.
Licencia
MIT. Consulta LICENSE.
Available Tools
1 toolechoEchoBRead-onlyIdempotent
Echo a validated message and optional string metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | ||
| metadata | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| metadata | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering safety and side-effect expectations. The description adds minimal behavioral context, mainly 'validated', which hints that inputs are checked but not how. No contradiction with annotations; the bar is lower, so a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence with no unnecessary words. The verb is front-loaded, and the optional part is clearly flagged. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a trivial echo tool, the description is nearly sufficient. The output schema exists, and annotations cover read-only/idempotent behavior, so return-value details are not needed. The only gap is vague 'validated' wording, but the tool is simple enough that an agent can invoke it correctly with the given information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It names 'message' and 'optional string metadata', but the schema already provides types and constraints. Calling metadata 'string metadata' is potentially misleading because the schema defines metadata as an object with string values, not a string. This adds little value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('echo') and resource ('a validated message and optional string metadata'), making the core function clear. There are no sibling tools to differentiate from, so the lack of distinction is not a flaw. However, 'validated' is slightly ambiguous — it might imply an extra validation step that is actually handled by the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool or what to prefer it over. There are no siblings, but the description still does not state typical scenarios (e.g., debugging, round-trip testing). The intended usage is only implied by the verb 'echo'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.1.0- First observed
echo
TDQS
Scored across 1 tool
With only one tool, there is no possibility of confusion or overlap. The single 'echo' tool is clearly distinct by virtue of being the only tool available.
The single tool name 'echo' is short, clear, and directly describes its function. Since there is only one tool, naming consistency is trivially satisfied.
One tool feels minimal even for a starter server, but it is a common pattern for a simple template. The count is at the lower edge of being acceptable rather than egregiously insufficient.
The server only provides an echo function, which is useful for testing connectivity but lacks any real domain operations. There are no CRUD or workflow capabilities, representing a significant gap for any practical use beyond a basic demo.
Maintenance
Related MCP Connectors
Enable secure connectivity between Sentry issues and debugging data, and LLM clients, using a Model Context Protocol (MCP) server.
A Model Context Protocol server for Wix AI tools
Ovanek MCP: Model Context Protocol server for Ovanek platform tools; writes are dry-run by default.
Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA stateless Model Context Protocol server that implements a simple echo functionality with resource, tool, and prompt components, enabling LLMs to echo back messages through standardized MCP interactions.1ISC
- AlicenseNot gradedqualityDmaintenanceA minimal Model Context Protocol server that facilitates network-based client connections using Streamable HTTP transport. It provides a greeting tool and is optimized for consistent deployment across local environments, Docker, and Kubernetes.MIT
- AlicenseNot gradedqualityFmaintenanceA robust server implementing the Model Context Protocol with SSE and STDIO transport, enabling real-time communication and extensible tooling for AI models.402 npm4MIT
- AlicenseNot gradedqualityBmaintenanceProvides a production-ready Model Context Protocol server with dual STDIO and Streamable HTTP transports, enabling file operations, memory, database queries, RAG, web search, GitHub integration, background tasks, and prompt-based workflows.MIT