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 registerTareas(server) { server.resource("tarea-list", "tarea://list", async (uri) => { log("Recurso solicitado", "tarea-list"); const tareas = await fetchJSON("/api/tareas"); return { contents: [{ uri: uri.href, text: JSON.stringify(tareas) }] }; }); server.resource( "tarea", new ResourceTemplate("tarea://{id}", { list: undefined }), async (uri, { id }) => { log("Recurso solicitado", `tarea ${id}`); const tarea = await fetchJSON(`/api/tareas/${id}`); return { contents: [{ uri: uri.href, text: JSON.stringify(tarea) }] }; } ); server.tool( "create-tarea", "Crea una tarea", { empleado_id: z.number(), planilla_id: z.number().optional(), titulo: z.string(), precio: z.number().optional(), estado: z.string().optional(), observacion: z.string().optional(), fecha: z.string(), tipo: z.string().optional(), fecha_anulado: z.string().optional(), creador_id: z.number().optional(), anulador_id: z.number().optional(), }, async (params) => { log("Tool invocada", "create-tarea", params); const tarea = await fetchJSON("/api/tareas", { method: "POST", body: JSON.stringify(params), }); return { content: [{ type: "text", text: JSON.stringify(tarea) }] }; } ); server.tool( "update-tarea", "Actualiza una tarea", { id: z.number(), empleado_id: z.number().optional(), planilla_id: z.number().optional(), titulo: z.string().optional(), precio: z.number().optional(), estado: z.string().optional(), observacion: z.string().optional(), fecha: z.string().optional(), tipo: z.string().optional(), fecha_anulado: z.string().optional(), anulador_id: z.number().optional(), }, async ({ id, ...updates }) => { log("Tool invocada", "update-tarea", { id, ...updates }); const tarea = await fetchJSON(`/api/tareas/${id}`, { method: "PUT", body: JSON.stringify(updates), }); return { content: [{ type: "text", text: JSON.stringify(tarea) }] }; } ); server.tool( "delete-tarea", "Elimina una tarea", { id: z.number() }, async ({ id }) => { log("Tool invocada", "delete-tarea", { id }); await fetchJSON(`/api/tareas/${id}`, { method: "DELETE" }); return { content: [{ type: "text", text: `Tarea ${id} eliminada` }] }; } ); server.tool( "search-tareas", "Busca tareas. `q` matchea id, empleado_id, planilla_id o título. Si no mandas filtros devuelve los primeros 100 registros.", { q: z.string().optional(), empleado_id: z.number().optional(), planilla_id: z.number().optional(), estado: z.string().optional(), titulo: z.string().optional(), fecha_desde: z.string().optional(), fecha_hasta: z.string().optional(), }, async (params) => { log("Tool invocada", "search-tareas", 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 tareas = await fetchJSON(`/api/tareas/search?${qs.toString()}`); return { content: [{ type: "text", text: JSON.stringify(tareas) }] }; } ); }