Tu primer servidor por stdio
El SDK oficial de TypeScript vive en el repositorio modelcontextprotocol/typescript-sdk y publica el paquete @modelcontextprotocol/server (versión 2.0.0), junto con @modelcontextprotocol/client.
El tutorial oficial arranca así, con Node.js 20 o superior:
npm install @modelcontextprotocol/server zod
npm install -D @types/node typescript
En package.json hace falta "type": "module".
El servidor mínimo
import { McpServer } from "@modelcontextprotocol/server";
import { StdioServerTransport } from "@modelcontextprotocol/server/stdio";
import { z } from "zod";
const server = new McpServer({
name: "weather",
version: "1.0.0",
});
server.registerTool(
"get_alerts",
{
description: "Get weather alerts for a state",
inputSchema: z.object({ /* ... */ }),
},
async (args) => ({ content: [{ type: "text", text: "..." }] }),
);
const transport = new StdioServerTransport();
await server.connect(transport);
Tres piezas: se crea el McpServer con su nombre y versión, se registran herramientas con registerTool(name, config, handler), y se conecta un transporte.
La regla de oro de stdio
En stdio, la salida estándar es el canal del protocolo. Todo mensaje de diagnóstico va a stderr — por eso el tutorial escribe su línea de arranque con console.error(...). Un console.log mal puesto rompe la conexión.
Este servidor no tiene autenticación, y está bien: la especificación dice que las implementaciones stdio no deberían seguir el flujo de autorización, sino tomar las credenciales del entorno.