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 registerAsistencias(server) { server.resource("asistencia-list", "asistencia://list", async (uri) => { log("Recurso solicitado", "asistencia-list"); const asistencias = await fetchJSON("/api/asistencias"); return { contents: [{ uri: uri.href, text: JSON.stringify(asistencias) }] }; }); server.resource( "asistencia", new ResourceTemplate("asistencia://{id}", { list: undefined }), async (uri, { id }) => { log("Recurso solicitado", `asistencia ${id}`); const asistencia = await fetchJSON(`/api/asistencias/${id}`); return { contents: [{ uri: uri.href, text: JSON.stringify(asistencia) }] }; } ); server.tool( "create-asistencia", "Crea una asistencia", { empleado_id: z.number(), entrada: z.string().optional(), salida: z.string().optional(), historial: z.string().optional(), observacion: z.string().optional(), estado: z.string().optional(), fecha_anulado: z.string().optional(), creador_id: z.number().optional(), modificado_id: z.number().optional(), anulador_id: z.number().optional(), }, async (params) => { log("Tool invocada", "create-asistencia", params); const asistencia = await fetchJSON("/api/asistencias", { method: "POST", body: JSON.stringify(params), }); return { content: [{ type: "text", text: JSON.stringify(asistencia) }] }; } ); server.tool( "update-asistencia", "Actualiza una asistencia", { id: z.number(), empleado_id: z.number().optional(), entrada: z.string().optional(), salida: z.string().optional(), historial: z.string().optional(), observacion: z.string().optional(), estado: z.string().optional(), fecha_anulado: z.string().optional(), modificado_id: z.number().optional(), anulador_id: z.number().optional(), }, async ({ id, ...updates }) => { log("Tool invocada", "update-asistencia", { id, ...updates }); const asistencia = await fetchJSON(`/api/asistencias/${id}`, { method: "PUT", body: JSON.stringify(updates), }); return { content: [{ type: "text", text: JSON.stringify(asistencia) }] }; } ); server.tool( "delete-asistencia", "Elimina una asistencia", { id: z.number() }, async ({ id }) => { log("Tool invocada", "delete-asistencia", { id }); await fetchJSON(`/api/asistencias/${id}`, { method: "DELETE" }); return { content: [{ type: "text", text: `Asistencia ${id} eliminada` }] }; } ); server.tool( "search-asistencias", "Busca asistencias. `q` matchea id o empleado_id. Si no se envĂ­an argumentos se devuelven los primeros 100 registros.", { q: z.string().optional(), empleado_id: z.number().optional(), estado: z.string().optional(), entrada_desde: z.string().optional(), entrada_hasta: z.string().optional(), salida_desde: z.string().optional(), salida_hasta: z.string().optional(), }, async (params) => { log("Tool invocada", "search-asistencias", 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 asistencias = await fetchJSON(`/api/asistencias/search?${qs.toString()}`); console.log("tool terminada ", JSON.stringify(asistencias)); return { content: [{ type: "text", text: JSON.stringify(asistencias) }] }; } ); }