Renderz.Studio
El Arsenal
ArquitecturaAvanzado35 minGratis

MCP Servers en Producción

7 servers · 4 patrones de integración · el protocolo que conecta Claude con todo

MCPServersIntegraciones
Guía gratuita · Acceso completo
01

Qué es MCP: el protocolo explicado sin marketing

MCP (Model Context Protocol) es un estándar abierto de Anthropic para conectar Claude con fuentes de datos externas y herramientas. En lugar de pasar todo por el prompt, MCP define una interfaz JSON-RPC para que Claude pueda leer recursos, ejecutar herramientas, y recibir contexto dinámico.

ConceptoQué significaEjemplo
ServerProceso que expone recursos/toolsSupabase MCP, GitHub MCP
ResourceDato que Claude puede leerArchivo, tabla de DB, documento
ToolAcción que Claude puede ejecutarCrear PR, enviar email, query SQL
PromptTemplate reutilizablePrompt de análisis de código
Estructura básica de un MCP server
// mcp-server.ts
import { Server } from "@modelcontextprotocol/sdk/server";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio";

const server = new Server({
  name: "mi-server",
  version: "1.0.0",
}, {
  capabilities: {
    resources: {},
    tools: {},
  },
});

// Registrar tools
server.setRequestHandler("tools/list", async () => ({
  tools: [{
    name: "mi_tool",
    description: "Qué hace este tool",
    inputSchema: {
      type: "object",
      properties: {
        param: { type: "string", description: "..." }
      },
      required: ["param"]
    }
  }]
}));

// Manejar llamadas
server.setRequestHandler("tools/call", async (request) => {
  if (request.params.name === "mi_tool") {
    const result = await ejecutarMiTool(request.params.arguments);
    return { content: [{ type: "text", text: result }] };
  }
});

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

Los 7 servers esenciales

De los 100+ MCP servers disponibles, estos son los 7 que realmente vas a usar en producción.

Claude puede hacer queries SQL directamente a tu Supabase, crear tablas, y modificar datos — todo con RLS respetado.

Configurar en claude_desktop_config.json
{
  "mcpServers": {
    "supabase": {
      "command": "npx",
      "args": ["-y", "@supabase/mcp-server"],
      "env": {
        "SUPABASE_URL": "https://xxx.supabase.co",
        "SUPABASE_SERVICE_KEY": "eyJhbG..."
      }
    }
  }
}

  Tip Pro

Usa el service key solo si necesitás bypass de RLS. Para queries normales, usa la anon key y deja que RLS proteja los datos.
03

Crear tu propio server en 30 minutos

Template completo para un MCP server que conecta con tu API o servicio.

Template completo · mcp-server/index.ts
import { Server } from "@modelcontextprotocol/sdk/server";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio";
import {
  CallToolRequestSchema,
  ListToolsRequestSchema,
  ListResourcesRequestSchema,
  ReadResourceRequestSchema,
} from "@modelcontextprotocol/sdk/types";

// Tu cliente de API
import { MiApiClient } from "./api-client";

const client = new MiApiClient(process.env.API_KEY!);

const server = new Server(
  { name: "mi-api-mcp", version: "1.0.0" },
  { capabilities: { resources: {}, tools: {} } }
);

// TOOLS - acciones que Claude puede ejecutar
server.setRequestHandler(ListToolsRequestSchema, async () => ({
  tools: [
    {
      name: "crear_item",
      description: "Crea un nuevo item en el sistema",
      inputSchema: {
        type: "object",
        properties: {
          nombre: { type: "string", description: "Nombre del item" },
          tipo: { type: "string", enum: ["A", "B", "C"] },
        },
        required: ["nombre", "tipo"],
      },
    },
    {
      name: "buscar_items",
      description: "Busca items por query",
      inputSchema: {
        type: "object",
        properties: {
          query: { type: "string" },
          limit: { type: "number", default: 10 },
        },
        required: ["query"],
      },
    },
  ],
}));

server.setRequestHandler(CallToolRequestSchema, async (request) => {
  const { name, arguments: args } = request.params;

  switch (name) {
    case "crear_item": {
      const result = await client.crearItem(args.nombre, args.tipo);
      return {
        content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
      };
    }
    case "buscar_items": {
      const results = await client.buscar(args.query, args.limit);
      return {
        content: [{ type: "text", text: JSON.stringify(results, null, 2) }],
      };
    }
    default:
      throw new Error(`Tool desconocido: ${name}`);
  }
});

// RESOURCES - datos que Claude puede leer
server.setRequestHandler(ListResourcesRequestSchema, async () => ({
  resources: [
    {
      uri: "mi-api://stats",
      name: "Estadísticas del sistema",
      mimeType: "application/json",
    },
  ],
}));

server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
  if (request.params.uri === "mi-api://stats") {
    const stats = await client.getStats();
    return {
      contents: [{
        uri: request.params.uri,
        mimeType: "application/json",
        text: JSON.stringify(stats, null, 2),
      }],
    };
  }
  throw new Error(`Resource no encontrado: ${request.params.uri}`);
});

// Conectar
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("MCP Server corriendo...");
package.json
{
  "name": "mi-api-mcp",
  "version": "1.0.0",
  "type": "module",
  "bin": { "mi-api-mcp": "./dist/index.js" },
  "scripts": {
    "build": "tsc",
    "start": "node dist/index.js"
  },
  "dependencies": {
    "@modelcontextprotocol/sdk": "^1.0.0"
  },
  "devDependencies": {
    "typescript": "^5.0.0"
  }
}
Agregar a Claude Desktop
{
  "mcpServers": {
    "mi-api": {
      "command": "node",
      "args": ["/path/to/mi-api-mcp/dist/index.js"],
      "env": {
        "API_KEY": "tu-api-key"
      }
    }
  }
}

¿Quieres el sistema completo?

500+ páginas, 25 capítulos, código de producción, acceso a todas las guías del Arsenal.

Curso Completo · €29PayPal · Acceso inmediato
¿Hablamos?