@omnifox/mcp-server 0.2.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAQ/E,eAAO,MAAM,WAAW,uBAAuB,CAAC;AAChD,eAAO,MAAM,cAAc,UAAU,CAAC;AAEtC,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,aAAa,CAAC,EAAE,oBAAoB,CAAC;CACtC;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,GAAE,kBAAuB,GAAG,SAAS,CAuCpE"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAU/E,eAAO,MAAM,WAAW,uBAAuB,CAAC;AAChD,eAAO,MAAM,cAAc,UAAU,CAAC;AAEtC,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,aAAa,CAAC,EAAE,oBAAoB,CAAC;CACtC;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,GAAE,kBAAuB,GAAG,SAAS,CAyCpE"}
package/dist/server.js CHANGED
@@ -8,6 +8,8 @@ import { registerMessagingTools } from "./tools/messaging.js";
8
8
  import { registerConversationTools } from "./tools/conversations.js";
9
9
  import { registerCommentTools } from "./tools/comments.js";
10
10
  import { registerWorkspaceTools } from "./tools/workspace.js";
11
+ import { registerCalendarTools } from "./tools/calendar.js";
12
+ import { registerCatalogTools } from "./tools/catalog.js";
11
13
  import { registerExtraTools } from "./tools/extras.js";
12
14
  export const SERVER_NAME = "omnifox-mcp-server";
13
15
  export const SERVER_VERSION = "0.2.2";
@@ -45,6 +47,8 @@ export function buildServer(opts = {}) {
45
47
  registerConversationTools(server, client);
46
48
  registerCommentTools(server, client);
47
49
  registerWorkspaceTools(server, client);
50
+ registerCalendarTools(server, client);
51
+ registerCatalogTools(server, client);
48
52
  registerExtraTools(server, client);
49
53
  return server;
50
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,aAAa,EAA6B,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,CAAC,MAAM,WAAW,GAAG,oBAAoB,CAAC;AAChD,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AAOtC;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,OAA2B,EAAE;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAEpE,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;QACE,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,cAAc;KACxB,EACD;QACE,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;YACT,OAAO,EAAE,EAAE;SACZ;QACD,YAAY,EACV,kEAAkE;YAClE,yEAAyE;YACzE,+CAA+C;YAC/C,sEAAsE;YACtE,uEAAuE;YACvE,2DAA2D;YAC3D,wEAAwE;YACxE,wEAAwE;YACxE,wEAAwE;YACxE,qCAAqC;YACrC,yEAAyE;YACzE,yEAAyE;YACzE,wEAAwE;YACxE,yEAAyE;KAC5E,CACF,CAAC;IAEF,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEnC,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,aAAa,EAA6B,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,CAAC,MAAM,WAAW,GAAG,oBAAoB,CAAC;AAChD,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AAOtC;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,OAA2B,EAAE;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAEpE,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;QACE,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,cAAc;KACxB,EACD;QACE,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;YACT,OAAO,EAAE,EAAE;SACZ;QACD,YAAY,EACV,kEAAkE;YAClE,yEAAyE;YACzE,+CAA+C;YAC/C,sEAAsE;YACtE,uEAAuE;YACvE,2DAA2D;YAC3D,wEAAwE;YACxE,wEAAwE;YACxE,wEAAwE;YACxE,qCAAqC;YACrC,yEAAyE;YACzE,yEAAyE;YACzE,wEAAwE;YACxE,yEAAyE;KAC5E,CACF,CAAC;IAEF,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEnC,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Calendar tools — citas, horarios libres y quién atiende.
3
+ *
4
+ * Hasta ahora el MCP sabía de contactos, conversaciones y mensajes pero no
5
+ * tenía nada de calendario: un asistente conectado por MCP podía leer una
6
+ * conversación entera sobre una cita y no podía ni consultar si había hueco.
7
+ *
8
+ * Los nombres de campo son los que valida la API — snake_case, igual que en el
9
+ * resto del paquete.
10
+ *
11
+ * ── UNA REGLA ───────────────────────────────────────────────────────────
12
+ * Nada de inventar horarios: `list_free_slots` primero, y recién con un
13
+ * `start` devuelto por él se llama a `book_appointment`. Las descripciones lo
14
+ * dicen explícitamente porque son lo único que el modelo lee antes de decidir.
15
+ */
16
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
17
+ import type { OmnifoxClient } from "../omnifox/client.js";
18
+ export declare function registerCalendarTools(server: McpServer, client: OmnifoxClient): void;
19
+ //# sourceMappingURL=calendar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../src/tools/calendar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAM1D,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CA4JpF"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Calendar tools — citas, horarios libres y quién atiende.
3
+ *
4
+ * Hasta ahora el MCP sabía de contactos, conversaciones y mensajes pero no
5
+ * tenía nada de calendario: un asistente conectado por MCP podía leer una
6
+ * conversación entera sobre una cita y no podía ni consultar si había hueco.
7
+ *
8
+ * Los nombres de campo son los que valida la API — snake_case, igual que en el
9
+ * resto del paquete.
10
+ *
11
+ * ── UNA REGLA ───────────────────────────────────────────────────────────
12
+ * Nada de inventar horarios: `list_free_slots` primero, y recién con un
13
+ * `start` devuelto por él se llama a `book_appointment`. Las descripciones lo
14
+ * dicen explícitamente porque son lo único que el modelo lee antes de decidir.
15
+ */
16
+ import { z } from "zod";
17
+ const ok = (data) => ({
18
+ content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
19
+ });
20
+ export function registerCalendarTools(server, client) {
21
+ server.tool("list_calendars", "List the workspace's booking calendars. Use it once to learn the calendar ids before asking for slots.", {}, async () => ok(await client.get("/calendar/calendars")));
22
+ server.tool("list_services", "List bookable services (appointment types) with their duration, capacity and booking policies.", {}, async () => ok(await client.get("/calendar/services")));
23
+ server.tool("list_resources", "List the people, rooms and equipment that appointments occupy — each with its own working hours. " +
24
+ "Use it when the customer asks for someone specific ('with Dr. Pérez') or for a particular room.", {
25
+ kind: z.enum(["person", "space", "equipment"]).optional(),
26
+ }, async (params) => ok(await client.get("/calendar/resources", params)));
27
+ server.tool("list_sites", "List the locations (branches) where the business works.", {}, async () => ok(await client.get("/calendar/sites")));
28
+ server.tool("list_free_slots", "Free appointment slots for a service between two dates. ALWAYS call this before offering or booking " +
29
+ "a time — never invent one. Each slot names the resource that covers it, so you can tell the " +
30
+ "customer who they would be seeing.", {
31
+ service_id: z.number().int().describe("Which service. See list_services."),
32
+ from: z.string().describe("Start of the search window (ISO-8601 or YYYY-MM-DD)."),
33
+ to: z.string().describe("End of the search window (ISO-8601 or YYYY-MM-DD)."),
34
+ resource_ids: z
35
+ .array(z.number().int())
36
+ .optional()
37
+ .describe("Limit to these resources — the customer asked for someone specific."),
38
+ site_id: z.number().int().optional().describe("Limit to one location. See list_sites."),
39
+ }, async (params) => ok(await client.get("/calendar/resources/availability", params)));
40
+ server.tool("book_appointment", "Book an appointment. Pass a `starts_at` exactly as returned by list_free_slots. " +
41
+ "If the slot was taken in the meantime you get a 409 — offer another time instead of retrying.", {
42
+ calendar_id: z.number().int(),
43
+ starts_at: z.string().describe("Exact slot start, as returned by list_free_slots."),
44
+ service_id: z.number().int().optional(),
45
+ contact_id: z.number().int().optional().describe("Who the appointment is for."),
46
+ title: z.string().max(255).optional(),
47
+ notes: z.string().optional(),
48
+ resource_ids: z
49
+ .array(z.number().int())
50
+ .optional()
51
+ .describe("Which resources it occupies (the professional, the room)."),
52
+ capacity: z.number().int().min(1).optional().describe(">1 turns it into a class with seats."),
53
+ allow_waitlist: z.boolean().optional(),
54
+ }, async (params) => ok(await client.post("/calendar/appointments", params)));
55
+ server.tool("list_appointments", "List appointments in a date range, optionally for one calendar.", {
56
+ from: z.string().optional(),
57
+ to: z.string().optional(),
58
+ calendar_id: z.number().int().optional(),
59
+ }, async (params) => ok(await client.get("/calendar/appointments", params)));
60
+ server.tool("reschedule_appointment", "Move an appointment to a new start time, keeping its duration. Returns 409 if the new slot is busy.", {
61
+ appointment_id: z.number().int(),
62
+ starts_at: z.string().describe("New start, as returned by list_free_slots."),
63
+ }, async ({ appointment_id, starts_at }) => ok(await client.put(`/calendar/appointments/${appointment_id}`, { starts_at })));
64
+ server.tool("cancel_appointment", "Cancel an appointment. Everyone enrolled is cancelled too, and the freed slot fires the " +
65
+ "'slot freed' automation so the business can offer it to someone else.", {
66
+ appointment_id: z.number().int(),
67
+ reason: z.string().max(255).optional(),
68
+ }, async ({ appointment_id, reason }) => ok(await client.post(`/calendar/appointments/${appointment_id}/cancel`, { reason })));
69
+ server.tool("list_enrollments", "Who is signed up for an appointment or class — including the waiting list, attendance and payment " +
70
+ "status of each person.", { appointment_id: z.number().int() }, async ({ appointment_id }) => ok(await client.get(`/calendar/appointments/${appointment_id}/enrollments`)));
71
+ server.tool("enroll_contact", "Sign a contact up for an appointment or class. If it is full and the event allows it, they go on " +
72
+ "the waiting list and move up automatically when somebody cancels.", {
73
+ appointment_id: z.number().int(),
74
+ contact_id: z.number().int().optional(),
75
+ name: z.string().max(160).optional().describe("For someone who is not a contact (a class roster)."),
76
+ phone: z.string().max(32).optional(),
77
+ email: z.string().email().max(191).optional(),
78
+ allow_waitlist: z.boolean().optional().describe("Accept the waiting list if it is full."),
79
+ }, async ({ appointment_id, ...body }) => ok(await client.post(`/calendar/appointments/${appointment_id}/enrollments`, body)));
80
+ server.tool("mark_attendance", "Mark whether an enrolled person showed up. Per person, not per event: in a class of twelve, one " +
81
+ "person missing is not twelve people missing.", {
82
+ enrollment_id: z.number().int(),
83
+ status: z.enum(["attended", "no_show"]),
84
+ }, async ({ enrollment_id, status }) => ok(await client.post(`/calendar/enrollments/${enrollment_id}/attendance`, { status })));
85
+ server.tool("cancel_enrollment", "Take one person off an appointment or class without cancelling it for everybody. Frees their seat " +
86
+ "and moves up whoever was first on the waiting list.", {
87
+ enrollment_id: z.number().int(),
88
+ reason: z.string().max(255).optional(),
89
+ }, async ({ enrollment_id, reason }) => ok(await client.post(`/calendar/enrollments/${enrollment_id}/cancel`, { reason })));
90
+ }
91
+ //# sourceMappingURL=calendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.js","sourceRoot":"","sources":["../../src/tools/calendar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Catálogo y pedidos — lo que el negocio vende y lo que le compraron.
3
+ *
4
+ * Hasta ahora el MCP sabía de contactos, conversaciones, mensajes y calendario:
5
+ * un asistente conectado por acá podía leer una conversación entera sobre un
6
+ * producto y no podía ni decir su precio, mucho menos anotar el pedido.
7
+ *
8
+ * ── DOS REGLAS QUE LAS DESCRIPCIONES REPITEN A PROPÓSITO ────────────────
9
+ * 1. Los precios y los totales salen del servidor. El modelo dice QUÉ y
10
+ * CUÁNTO; lo que sale a cobrar lo calcula la API con el catálogo y los
11
+ * impuestos del espacio de trabajo. Si el total viajara desde acá,
12
+ * bastaría con que un cliente escribiera "me lo llevo a un dólar".
13
+ * 2. Nada de inventar productos: `search_products` primero, y el pedido se
14
+ * arma con los ids que devolvió.
15
+ *
16
+ * Las descripciones son lo único que el modelo lee antes de decidir, así que
17
+ * dicen lo que NO debe hacer, no solo lo que hace.
18
+ */
19
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
20
+ import type { OmnifoxClient } from "../omnifox/client.js";
21
+ export declare function registerCatalogTools(server: McpServer, client: OmnifoxClient): void;
22
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/tools/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAW1D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAsKnF"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Catálogo y pedidos — lo que el negocio vende y lo que le compraron.
3
+ *
4
+ * Hasta ahora el MCP sabía de contactos, conversaciones, mensajes y calendario:
5
+ * un asistente conectado por acá podía leer una conversación entera sobre un
6
+ * producto y no podía ni decir su precio, mucho menos anotar el pedido.
7
+ *
8
+ * ── DOS REGLAS QUE LAS DESCRIPCIONES REPITEN A PROPÓSITO ────────────────
9
+ * 1. Los precios y los totales salen del servidor. El modelo dice QUÉ y
10
+ * CUÁNTO; lo que sale a cobrar lo calcula la API con el catálogo y los
11
+ * impuestos del espacio de trabajo. Si el total viajara desde acá,
12
+ * bastaría con que un cliente escribiera "me lo llevo a un dólar".
13
+ * 2. Nada de inventar productos: `search_products` primero, y el pedido se
14
+ * arma con los ids que devolvió.
15
+ *
16
+ * Las descripciones son lo único que el modelo lee antes de decidir, así que
17
+ * dicen lo que NO debe hacer, no solo lo que hace.
18
+ */
19
+ import { z } from "zod";
20
+ const ok = (data) => ({
21
+ content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
22
+ });
23
+ const numericId = (what) => z
24
+ .union([z.number().int().positive(), z.string().regex(/^\d+$/)])
25
+ .describe(`Numeric id of the ${what}.`);
26
+ export function registerCatalogTools(server, client) {
27
+ // ---------- Productos ----------
28
+ server.tool("search_products", "Search the business catalog by name, SKU, category or description. " +
29
+ "Call this BEFORE talking about any price or availability, and before creating an order — " +
30
+ "never quote a price that did not come from here, and never mention a product that is not in the results. " +
31
+ "`stock: null` means the business does not track stock for that product; it does NOT mean zero. " +
32
+ "`is_orderable: false` means it can be shown but not ordered.", {
33
+ search: z.string().optional().describe("Words the customer used: 'white paint', 'SKU-123'."),
34
+ category: z.string().optional(),
35
+ active: z.boolean().optional().describe("Defaults to every product; pass true for on-sale only."),
36
+ per_page: z.number().int().min(1).max(100).optional(),
37
+ }, async (params) => ok(await client.get("/products", params)));
38
+ server.tool("get_product", "Read one catalog product in full: price, unit of measure, tax rate, stock, photo and whether it can be ordered.", { product_id: numericId("product") }, async ({ product_id }) => ok(await client.get(`/products/${product_id}`)));
39
+ server.tool("create_product", "Add a product to the catalog. Leave `stock` out entirely when the business does not track stock — " +
40
+ "sending 0 tells everyone the product is sold out.", {
41
+ name: z.string().min(1),
42
+ unit_price: z.number().min(0).describe("Price per unit, in the workspace currency."),
43
+ sku: z.string().optional(),
44
+ description: z.string().optional(),
45
+ category: z.string().optional(),
46
+ currency: z.string().length(3).optional(),
47
+ tax_rate: z.number().min(0).max(100).optional(),
48
+ unit: z.string().optional().describe("kilo, metre, box, hour — how the price is read."),
49
+ image_url: z.string().url().optional(),
50
+ stock: z.number().int().optional(),
51
+ is_orderable: z.boolean().optional(),
52
+ is_active: z.boolean().optional(),
53
+ }, async (params) => ok(await client.post("/products", params)));
54
+ server.tool("update_product", "Change a catalog product. Only the fields you send are touched.", {
55
+ product_id: numericId("product"),
56
+ name: z.string().optional(),
57
+ unit_price: z.number().min(0).optional(),
58
+ sku: z.string().optional(),
59
+ description: z.string().optional(),
60
+ category: z.string().optional(),
61
+ tax_rate: z.number().min(0).max(100).optional(),
62
+ unit: z.string().optional(),
63
+ image_url: z.string().url().optional(),
64
+ stock: z.number().int().optional(),
65
+ is_orderable: z.boolean().optional(),
66
+ is_active: z.boolean().optional(),
67
+ }, async ({ product_id, ...rest }) => ok(await client.put(`/products/${product_id}`, rest)));
68
+ // ---------- Pedidos ----------
69
+ server.tool("list_orders", "List the workspace's orders, newest first. Filter by status to get only what is still open.", {
70
+ status: z
71
+ .string()
72
+ .optional()
73
+ .describe("Comma-separated: pending, confirmed, preparing, ready, shipped, delivered, cancelled."),
74
+ payment_status: z.enum(["unpaid", "partial", "paid", "refunded"]).optional(),
75
+ contact_id: z.number().int().optional(),
76
+ search: z.string().optional().describe("Order number, customer name or phone."),
77
+ per_page: z.number().int().min(1).max(100).optional(),
78
+ }, async (params) => ok(await client.get("/orders", params)));
79
+ server.tool("get_order", "Read one order in full: its lines, totals, delivery details and the history of who moved it when.", { order_id: numericId("order") }, async ({ order_id }) => ok(await client.get(`/orders/${order_id}`)));
80
+ server.tool("create_order", "Create an order from catalog products. Use it only after the customer confirmed what they want and how many. " +
81
+ "Search the catalog first and pass the product ids from those results. " +
82
+ "Do NOT send prices or totals: the server prices every line from the catalog and applies the workspace's " +
83
+ "tax and delivery rules — the total it returns is the only one you may tell the customer. " +
84
+ "If the workspace requires confirmation, the order comes back as `pending`, not confirmed.", {
85
+ items: z
86
+ .array(z.object({
87
+ product_id: z.number().int().positive(),
88
+ quantity: z.number().min(0.001).default(1),
89
+ options: z
90
+ .record(z.string(), z.string())
91
+ .optional()
92
+ .describe("Line choices: {'nota': 'no onions'}, {'talla': 'M'}."),
93
+ }))
94
+ .min(1),
95
+ contact_id: z.number().int().optional().describe("Links the order to the customer's record."),
96
+ conversation_id: z.number().int().optional(),
97
+ fulfillment: z.enum(["pickup", "delivery", "digital"]).optional(),
98
+ delivery_address: z.string().optional().describe("Required by most businesses when fulfillment is delivery."),
99
+ customer_name: z.string().optional(),
100
+ customer_phone: z.string().optional(),
101
+ customer_email: z.string().optional(),
102
+ customer_tax_id: z.string().optional().describe("RUC/NIT/CUIT, when the business invoices."),
103
+ customer_notes: z.string().optional().describe("What the customer asked for, in their words."),
104
+ }, async (params) => ok(await client.post("/orders", params)));
105
+ server.tool("set_order_status", "Move an order along: confirmed → preparing → ready → shipped → delivered, or cancel it. " +
106
+ "The server refuses impossible jumps (a cancelled order never goes back), moves stock accordingly " +
107
+ "and records who did it. Confirming is what commits the business, so do not confirm on the customer's behalf " +
108
+ "unless you were asked to.", {
109
+ order_id: numericId("order"),
110
+ status: z.enum([
111
+ "pending",
112
+ "confirmed",
113
+ "preparing",
114
+ "ready",
115
+ "shipped",
116
+ "delivered",
117
+ "cancelled",
118
+ ]),
119
+ reason: z.string().optional().describe("Why — mostly for cancellations."),
120
+ }, async ({ order_id, ...rest }) => ok(await client.post(`/orders/${order_id}/status`, rest)));
121
+ server.tool("record_order_payment", "Record money received against an order. Partial amounts are fine — the payment status is derived from the total.", {
122
+ order_id: numericId("order"),
123
+ amount: z.number().min(0.01),
124
+ method: z.string().optional().describe("cash, transfer, card…"),
125
+ }, async ({ order_id, ...rest }) => ok(await client.post(`/orders/${order_id}/payment`, rest)));
126
+ server.tool("get_catalog_settings", "Read how this workspace sells: whether it takes orders at all, how it taxes, whether orders need confirmation, " +
127
+ "which delivery modes it offers, what customer details it requires and how it tracks stock. " +
128
+ "Read this before assuming any of it — every business answers differently.", {}, async () => ok(await client.get("/catalog/settings")));
129
+ }
130
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/tools/catalog.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@omnifox/mcp-server",
3
- "version": "0.2.2",
4
- "description": "Official Omnifox.io Model Context Protocol (MCP) server \u2014 48 tools over the Omnifox v1 REST API for Claude, Cursor, Continue and any MCP client. Every tool verified end-to-end against a live workspace.",
3
+ "version": "0.4.0",
4
+ "description": "Official Omnifox.io Model Context Protocol (MCP) server — 48 tools over the Omnifox v1 REST API for Claude, Cursor, Continue and any MCP client. Every tool verified end-to-end against a live workspace.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "author": "Omnifox.io",
@@ -62,4 +62,4 @@
62
62
  "publishConfig": {
63
63
  "access": "public"
64
64
  }
65
- }
65
+ }