import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js"; import { z } from "zod"; import { fetchJSON } from "../lib/api.js"; const log = (...args) => console.log("[MCP]", ...args); export default function registerEmpleados(server) { server.resource("empleado-list", "empleado://list", async (uri) => { log("Recurso solicitado", "empleado-list"); const empleados = await fetchJSON("/api/empleados"); return { contents: [{ uri: uri.href, text: JSON.stringify(empleados) }] }; }); server.resource( "empleado", new ResourceTemplate("empleado://{id}", { list: undefined }), async (uri, { id }) => { log("Recurso solicitado", `empleado ${id}`); const empleado = await fetchJSON(`/api/empleados/${id}`); return { contents: [{ uri: uri.href, text: JSON.stringify(empleado) }] }; } ); server.tool( "create-empleado", "Crea un empleado", { name: z.string(), cedula: z.number(), telefono: z.string().optional(), ubicacion: z.string().optional(), grupo_estudio: z.string().optional(), avatar_url: z.string().optional(), idciat: z.string().optional(), }, async (params) => { log("Tool invocada", "create-empleado", params); const empleado = await fetchJSON("/api/empleados", { method: "POST", body: JSON.stringify(params), }); return { content: [{ type: "text", text: JSON.stringify(empleado) }] }; } ); server.tool( "update-empleado", "Actualiza un empleado existente", { id: z.number(), name: z.string().optional(), cedula: z.number().optional(), telefono: z.string().optional(), ubicacion: z.string().optional(), grupo_estudio: z.string().optional(), avatar_url: z.string().optional(), idciat: z.number().optional(), }, async ({ id, ...updates }) => { log("Tool invocada", "update-empleado", { id, ...updates }); const empleado = await fetchJSON(`/api/empleados/${id}`, { method: "PUT", body: JSON.stringify(updates), }); return { content: [{ type: "text", text: JSON.stringify(empleado) }] }; } ); server.tool( "delete-empleado", "Elimina un empleado", { id: z.number() }, async ({ id }) => { log("Tool invocada", "delete-empleado", { id }); await fetchJSON(`/api/empleados/${id}`, { method: "DELETE" }); return { content: [{ type: "text", text: `Empleado ${id} eliminado` }] }; } ); server.tool( "search-empleados", "Busca empleados. `q` matchea id, cédula o nombre. Si no envías argumentos se devuelven los primeros 100 registros.", { q: z.string().optional(), name: z.string().optional(), cedula: z.number().optional(), telefono: z.string().optional(), ubicacion: z.string().optional(), grupo_estudio: z.string().optional(), idciat: z.string().optional(), }, async (params) => { log("Tool invocada", "search-empleados", params); const qs = new URLSearchParams( Object.entries(params) .filter(([, v]) => v !== undefined) .map(([k, v]) => [k, String(v)]) ); if (qs.toString() === "") qs.append("limit", "100"); const empleados = await fetchJSON(`/api/empleados/search?${qs.toString()}`); return { content: [{ type: "text", text: JSON.stringify(empleados) }] }; } ); }