Saltar al contenido
Lección 2 de 5

Construyendo Tu Primer Servidor MCP

3 min read

Configurando el Proyecto

Vamos a construir un MCP server real desde cero usando TypeScript. Comienza inicializando tu proyecto:

mkdir my-mcp-server && cd my-mcp-server
npm init -y
npm install @modelcontextprotocol/sdk zod
npm install -D typescript @types/node
npx tsc --init

Configura "module": "node16" y "moduleResolution": "node16" en tu tsconfig.json. Los MCP servers usan ES modules, así que agrega "type": "module" a tu package.json.

Definiendo Tu Primer Tool

Crea src/index.ts. El SDK proporciona una clase McpServer que maneja todos los detalles del protocolo:

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";

const server = new McpServer({
  name: "my-first-server",
  version: "1.0.0",
});

server.tool(
  "get-weather",
  "Get current weather for a city",
  { city: z.string().describe("City name") },
  async ({ city }) => {
    // En producción, llama a una API real de clima
    return {
      content: [
        { type: "text", text: `Weather in ${city}: 22°C, partly cloudy` },
      ],
    };
  }
);

El método server.tool() toma cuatro argumentos: un nombre, una descripción (usada por el modelo de IA para decidir cuándo llamarlo), un schema Zod para validación de entrada, y una función handler async.

Agregando Resources

Los resources le dan al modelo acceso de lectura a datos. Agreguemos un resource de configuración:

server.resource(
  "config",
  "app://config/current",
  { description: "Current application configuration" },
  async () => ({
    contents: [
      {
        uri: "app://config/current",
        text: JSON.stringify({ env: "production", debug: false }),
        mimeType: "application/json",
      },
    ],
  })
);

Conectando el Transporte

El paso final es conectar el transporte e iniciar el server:

const transport = new StdioServerTransport();
await server.connect(transport);

Compila con npx tsc y tu server está listo.

Testeando con MCP Inspector

Antes de conectar a un host real, prueba con el MCP Inspector — una herramienta basada en navegador para depurar MCP servers:

npx @modelcontextprotocol/inspector node dist/index.js

El Inspector muestra todos los tools, resources y prompts registrados. Puedes invocarlos interactivamente y ver el ciclo completo de request/response.

Conectando a Claude Desktop

Agrega tu server al archivo de configuración de Claude Desktop (claude_desktop_config.json):

{
  "mcpServers": {
    "my-first-server": {
      "command": "node",
      "args": ["/ruta/absoluta/a/dist/index.js"]
    }
  }
}

Reinicia Claude Desktop y tus tools aparecen automáticamente. Claude los llamará cuando sean relevantes para la conversación.

Conectando a Claude Code

Para Claude Code, agrega el server al .mcp.json de tu proyecto:

{
  "mcpServers": {
    "my-first-server": {
      "command": "node",
      "args": ["./dist/index.js"]
    }
  }
}

Claude Code lo detecta inmediatamente — tus tools están disponibles en el flujo de trabajo de código.

Ejemplos en Producción

Los servers de clima simples están bien para aprender, pero los MCP servers escalan a uso serio en producción. MCP-Vanguard expone 89 tools de seguridad — desde escaneo de vulnerabilidades hasta threat intelligence — todo a través de un único MCP server. InfraOps-MCP proporciona 92 tools de gestión de infraestructura para Docker, monitoreo de sistemas, networking y más.

Estos proyectos demuestran el patrón: toma el tooling y expertise existente de tu equipo, envuélvelo en MCP tools bien tipados con descripciones claras, y de repente todo tu flujo de trabajo potenciado por IA tiene acceso a ello.

En la siguiente lección, exploraremos cómo diseñar los agentes que usan estos tools de forma efectiva.