template-mcp
template-mcp
Plantilla de servidor MCP (Model Context Protocol) con TypeScript, validación Zod y soporte de transporte dual (stdio/HTTP). Compatible con cualquier cliente MCP: Claude Code, Claude Desktop, Cursor, VS Code Copilot, Windsurf, Cline y más.
Características
Transporte dual: stdio (local) y HTTP transmitible (remoto)
TypeScript estricto con módulos ESM
Validación Zod para esquemas de entrada de herramientas
Validación de entorno Joi (fallo rápido al iniciar)
Registro Pino en stderr (seguro para stdio)
Arquitectura modular: herramientas, recursos y prompts como módulos separados
Patrón de fábrica:
createServer()para facilitar las pruebasSuite de pruebas completa con transporte en memoria del SDK de MCP
Herramientas de calidad: ESLint + Prettier + Husky + lint-staged
Listo para Docker: compilación multietapa
CI/CD: pipeline de GitHub Actions
Related MCP server: xmcp Application
Inicio rápido
pnpm install
pnpm devScripts
Script | Descripción |
| Iniciar con recarga en caliente (tsx watch) |
| Compilar TypeScript + resolver alias |
| Ejecutar servidor compilado |
| Ejecutar pruebas |
| Analizar código fuente |
| Comprobar tipos sin emitir |
Configuración
Copia .env.example a .env y ajusta:
Variable | Predeterminado | Descripción |
|
| Transporte: |
|
| Puerto HTTP (solo para transporte |
|
| Nivel de registro de Pino |
|
| Entorno |
Estructura del proyecto
src/
├── main.ts # Entrypoint: transport selection
├── server.ts # createServer() factory
├── config/ # Env validation + constants
├── common/ # Logger, error helpers, types
├── tools/ # MCP tools (callable by LLMs)
├── resources/ # MCP resources (read-only data)
└── prompts/ # MCP prompts (reusable templates)Añadir una nueva herramienta
Crea
src/tools/my-tool.tool.ts:
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { z } from 'zod';
export function registerMyTool(server: McpServer): void {
server.registerTool(
'my_tool',
{
title: 'My Tool',
description: 'What this tool does',
inputSchema: {
param: z.string().describe('Parameter description'),
},
annotations: {
readOnlyHint: true,
destructiveHint: false,
idempotentHint: true,
openWorldHint: false,
},
},
async ({ param }) => ({
content: [{ type: 'text', text: `Result: ${param}` }],
}),
);
}Regístrala en
src/tools/index.ts:
import { registerMyTool } from './my-tool.tool.js';
export function registerTools(server: McpServer): void {
registerGreetTool(server);
registerMyTool(server); // add here
}Añade pruebas en
src/tools/__tests__/my-tool.tool.spec.ts
Configuración del cliente
Claude Code
Añade a .claude/settings.json:
{
"mcpServers": {
"template-mcp": {
"command": "node",
"args": ["/absolute/path/to/template-mcp/dist/main.js"]
}
}
}Claude Desktop
Añade a claude_desktop_config.json:
{
"mcpServers": {
"template-mcp": {
"command": "node",
"args": ["/absolute/path/to/template-mcp/dist/main.js"]
}
}
}Cursor
Añade en Cursor Settings > MCP Servers:
{
"mcpServers": {
"template-mcp": {
"command": "node",
"args": ["/absolute/path/to/template-mcp/dist/main.js"]
}
}
}VS Code (Copilot)
Añade a .vscode/settings.json:
{
"mcp": {
"servers": {
"template-mcp": {
"command": "node",
"args": ["/absolute/path/to/template-mcp/dist/main.js"]
}
}
}
}Docker
# Build
docker build -t template-mcp .
# Run (HTTP mode, used for remote access)
docker run -p 3000:3000 template-mcpStack tecnológico
Node.js 22 + TypeScript (estricto, ESM)
MCP SDK v1 (
@modelcontextprotocol/sdk)Zod (validación de entrada de herramientas)
Joi (validación de entorno)
Pino (registro en stderr)
Vitest (pruebas)
ESLint + Prettier + Husky
Verificación
Todo lo siguiente está comprobado y funcionando al 100%.
Calidad de código
Check | Comando |
Lint + formato |
|
Tipado estricto |
|
Build (tsc + alias) |
|
Tests unitarios (11/11)
pnpm testSuite | Cubre |
| Listado, estilos casual/formal/enthusiastic, rechazo de nombre vacío |
| Listado, campos JSON (name, version, uptime, timestamp) |
| Listado, estilos brief/bullet-points, coerción numérica, defaults |
Sin red ni puertos — usa InMemoryTransport del SDK.
Runtime — transporte stdio (modo por defecto)
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0.0"}}}' \
| MCP_TRANSPORT=stdio node dist/main.jsRespuesta JSON-RPC en stdout, logs en stderr.
Runtime — transporte HTTP
MCP_TRANSPORT=http PORT=3100 node dist/main.js &
# Initialize → capturar Mcp-Session-Id del header
# tools/list, resources/list, prompts/list, tools/call greet, resources/read info://serverEndpoint verificado | Resultado esperado |
|
|
| JSON con name, version, uptime, nodeVersion, timestamp |
Docker
docker build -t template-mcp . # multi-stage: base → deps → build → production
docker run -p 3000:3000 template-mcp # arranca en HTTP modeCI (GitHub Actions)
pnpm install → pnpm lint → pnpm build → pnpm test
Corre en cada push y PR a main/master.
Pipeline de commits (local)
git commit → husky → lint-staged → eslint --fix + prettier --write (solo archivos staged)
Gaps conocidos
HTTP transport sin tests automáticos (medio): los unit tests usan
InMemoryTransport; el transporte HTTP (StreamableHTTPServerTransport) solo se verificó manualmente con curl. Para producción remota añadir tests de integración con sesión realIntegración con cliente MCP (medio): verificar manualmente agregando a
.claude/settings.jsono Cursor y confirmando que tools/resources/prompts aparecen en el clienteTool inputs extremos (bajo): strings muy largos, unicode malformado — Zod los rechaza pero el error response no está testeado vía HTTP
Sesiones concurrentes (bajo): fuera del scope de un template
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Tools
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA TypeScript-based template for rapidly developing MCP servers with modular tool architecture, built-in validation using Zod schemas, and comprehensive error handling.9MIT
- FlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server template designed for building structured tools, prompts, and resources with built-in support for HTTP and STDIO transports. It provides a standardized framework for developers to create and deploy AI-driven services using TypeScript and Zod schema validation.9
- AlicenseNot gradedqualityBmaintenanceA feature-complete MCP server template in TypeScript demonstrating tools, resources, prompts, and both stdio and HTTP transports.8MIT
- AlicenseNot gradedqualityDmaintenanceA minimal TypeScript MCP server template with example tool, Zod validation, stdio transport, and dotenv setup.78MIT
Related MCP Connectors
A TypeScript MCP server for Home Assistant, enabling programmatic management of entities, automati…
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Freddymhs/template-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server