MCP Servers en Producción
7 servers · 4 patrones de integración · el protocolo que conecta Claude con todo
Mapa rápido · salta al paso que te interese
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.
| Concepto | Qué significa | Ejemplo |
|---|---|---|
| Server | Proceso que expone recursos/tools | Supabase MCP, GitHub MCP |
| Resource | Dato que Claude puede leer | Archivo, tabla de DB, documento |
| Tool | Acción que Claude puede ejecutar | Crear PR, enviar email, query SQL |
| Prompt | Template reutilizable | Prompt de análisis de código |
// 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);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.
{
"mcpServers": {
"supabase": {
"command": "npx",
"args": ["-y", "@supabase/mcp-server"],
"env": {
"SUPABASE_URL": "https://xxx.supabase.co",
"SUPABASE_SERVICE_KEY": "eyJhbG..."
}
}
}
}Tip Pro
Crear tu propio server en 30 minutos
Template completo para un MCP server que conecta con tu API o servicio.
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...");{
"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"
}
}{
"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