@omnifox/mcp-server 0.2.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.
Files changed (52) hide show
  1. package/.env.example +27 -0
  2. package/LICENSE +21 -0
  3. package/README.md +252 -0
  4. package/dist/index.d.ts +9 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +29 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/omnifox/client.d.ts +74 -0
  9. package/dist/omnifox/client.d.ts.map +1 -0
  10. package/dist/omnifox/client.js +295 -0
  11. package/dist/omnifox/client.js.map +1 -0
  12. package/dist/omnifox/types.d.ts +53 -0
  13. package/dist/omnifox/types.d.ts.map +1 -0
  14. package/dist/omnifox/types.js +9 -0
  15. package/dist/omnifox/types.js.map +1 -0
  16. package/dist/server.d.ts +17 -0
  17. package/dist/server.d.ts.map +1 -0
  18. package/dist/server.js +51 -0
  19. package/dist/server.js.map +1 -0
  20. package/dist/tools/comments.d.ts +16 -0
  21. package/dist/tools/comments.d.ts.map +1 -0
  22. package/dist/tools/comments.js +31 -0
  23. package/dist/tools/comments.js.map +1 -0
  24. package/dist/tools/contacts.d.ts +11 -0
  25. package/dist/tools/contacts.d.ts.map +1 -0
  26. package/dist/tools/contacts.js +84 -0
  27. package/dist/tools/contacts.js.map +1 -0
  28. package/dist/tools/conversations.d.ts +13 -0
  29. package/dist/tools/conversations.d.ts.map +1 -0
  30. package/dist/tools/conversations.js +91 -0
  31. package/dist/tools/conversations.js.map +1 -0
  32. package/dist/tools/extras.d.ts +12 -0
  33. package/dist/tools/extras.d.ts.map +1 -0
  34. package/dist/tools/extras.js +105 -0
  35. package/dist/tools/extras.js.map +1 -0
  36. package/dist/tools/messaging.d.ts +18 -0
  37. package/dist/tools/messaging.d.ts.map +1 -0
  38. package/dist/tools/messaging.js +127 -0
  39. package/dist/tools/messaging.js.map +1 -0
  40. package/dist/tools/workspace.d.ts +12 -0
  41. package/dist/tools/workspace.d.ts.map +1 -0
  42. package/dist/tools/workspace.js +110 -0
  43. package/dist/tools/workspace.js.map +1 -0
  44. package/dist/transport/http.d.ts +12 -0
  45. package/dist/transport/http.d.ts.map +1 -0
  46. package/dist/transport/http.js +65 -0
  47. package/dist/transport/http.js.map +1 -0
  48. package/dist/transport/stdio.d.ts +6 -0
  49. package/dist/transport/stdio.d.ts.map +1 -0
  50. package/dist/transport/stdio.js +12 -0
  51. package/dist/transport/stdio.js.map +1 -0
  52. package/package.json +65 -0
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Conversation tools — listing, assignment, status, snooze and follow-up.
3
+ *
4
+ * Two shapes exist for the same idea and they are NOT interchangeable:
5
+ * contact-scoped helpers act on the contact's currently open conversation,
6
+ * while the `/conversations/{id}` routes act on a conversation you already
7
+ * know the id of. Both are exposed, because an agent usually knows one or the
8
+ * other, never both.
9
+ */
10
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
11
+ import type { OmnifoxClient } from "../omnifox/client.js";
12
+ export declare function registerConversationTools(server: McpServer, client: OmnifoxClient): void;
13
+ //# sourceMappingURL=conversations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversations.d.ts","sourceRoot":"","sources":["../../src/tools/conversations.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAU1D,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CA8IxF"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Conversation tools — listing, assignment, status, snooze and follow-up.
3
+ *
4
+ * Two shapes exist for the same idea and they are NOT interchangeable:
5
+ * contact-scoped helpers act on the contact's currently open conversation,
6
+ * while the `/conversations/{id}` routes act on a conversation you already
7
+ * know the id of. Both are exposed, because an agent usually knows one or the
8
+ * other, never both.
9
+ */
10
+ import { z } from "zod";
11
+ const ok = (data) => ({
12
+ content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
13
+ });
14
+ const conversationId = z
15
+ .union([z.number().int().positive(), z.string().regex(/^\d+$/)])
16
+ .describe("Numeric id of the conversation.");
17
+ export function registerConversationTools(server, client) {
18
+ server.tool("list_conversations", "List the conversations of the workspace, most recently updated first. Filter by status to find what needs attention.", {
19
+ status: z
20
+ .enum(["open", "pending", "resolved", "closed", "snoozed"])
21
+ .optional()
22
+ .describe("Filter by lifecycle status."),
23
+ channel_id: z.number().int().optional(),
24
+ tag_id: z.number().int().optional(),
25
+ limit: z.number().int().min(1).max(100).optional(),
26
+ page: z.number().int().min(1).optional(),
27
+ }, async ({ status, channel_id, tag_id, limit, page }) => ok(await client.get("/conversations", client.buildListQuery({ limit, page, extra: { status, channel_id, tag_id } }))));
28
+ server.tool("get_conversation", "Fetch one conversation with its contact, channel, status and assignment. Start here when you have an id and need context before acting.", { id: conversationId }, async ({ id }) => ok(await client.get(`/conversations/${encodeURIComponent(String(id))}`)));
29
+ server.tool("assign_conversation", "Assign a conversation to a user, a team or an AI agent — or unassign it.", {
30
+ id: conversationId,
31
+ assignee_type: z
32
+ .enum(["user", "team", "ai_agent", "none"])
33
+ .describe("Use 'none' to unassign."),
34
+ assignee_id: z
35
+ .number()
36
+ .int()
37
+ .optional()
38
+ .describe("Id of the user / team / AI agent. Omit when assignee_type is 'none'."),
39
+ }, async ({ id, assignee_type, assignee_id }) => ok(await client.post(`/conversations/${encodeURIComponent(String(id))}/assign`, {
40
+ assignee_type,
41
+ ...(assignee_id !== undefined ? { assignee_id } : {}),
42
+ })));
43
+ server.tool("assign_contact_conversation", "Assign the contact's currently OPEN conversation. Use this when you know the contact but not the conversation id.", {
44
+ identifier: z.string().min(1).describe("Contact id or kind:value selector."),
45
+ assignee: z
46
+ .union([z.number().int(), z.string()])
47
+ .nullable()
48
+ .describe("User id, user email, or 'team:<id>' to route to a team. Pass null to unassign."),
49
+ }, async ({ identifier, assignee }) => ok(await client.post(`/contacts/${encodeURIComponent(identifier)}/assignee`, { assignee })));
50
+ server.tool("update_conversation_status", "Reopen, resolve or close a conversation. Closing accepts a resolution label and free-text notes that stay in the thread.", {
51
+ id: conversationId,
52
+ status: z.enum(["open", "resolved", "closed"]),
53
+ resolution: z.string().max(255).optional().describe("Short label stored on close."),
54
+ notes: z.string().max(5000).optional().describe("Free-text closing notes."),
55
+ }, async ({ id, status, resolution, notes }) => {
56
+ const path = status === "open" ? "reopen" : status === "resolved" ? "resolve" : "close";
57
+ const body = status === "closed"
58
+ ? {
59
+ ...(resolution !== undefined ? { resolution } : {}),
60
+ ...(notes !== undefined ? { notes } : {}),
61
+ }
62
+ : undefined;
63
+ return ok(await client.post(`/conversations/${encodeURIComponent(String(id))}/${path}`, body));
64
+ });
65
+ server.tool("update_contact_conversation_status", "Set the status of the contact's open conversation when you only know the contact.", {
66
+ identifier: z.string().min(1).describe("Contact id or kind:value selector."),
67
+ status: z.enum(["open", "close", "closed", "resolved"]),
68
+ category: z.string().max(64).optional(),
69
+ summary: z.string().max(1000).optional(),
70
+ }, async ({ identifier, status, category, summary }) => ok(await client.post(`/contacts/${encodeURIComponent(identifier)}/conversation/status`, {
71
+ status,
72
+ ...(category !== undefined ? { category } : {}),
73
+ ...(summary !== undefined ? { summary } : {}),
74
+ })));
75
+ server.tool("snooze_conversation", "Snooze a conversation so it leaves the queue and comes back later. Use it instead of closing when a follow-up is due.", {
76
+ id: conversationId,
77
+ preset: z
78
+ .enum(["1h", "3h", "tomorrow", "next_week"])
79
+ .optional()
80
+ .describe("Relative snooze. Give this OR snoozed_until."),
81
+ snoozed_until: z
82
+ .string()
83
+ .optional()
84
+ .describe("Absolute ISO-8601 moment to wake the conversation at."),
85
+ }, async ({ id, preset, snoozed_until }) => ok(await client.post(`/conversations/${encodeURIComponent(String(id))}/snooze`, {
86
+ ...(preset ? { preset } : {}),
87
+ ...(snoozed_until ? { snoozed_until } : {}),
88
+ })));
89
+ server.tool("list_conversation_notes", "List the internal notes on a conversation — teammate-only context the customer never saw.", { id: conversationId }, async ({ id }) => ok(await client.get(`/conversations/${encodeURIComponent(String(id))}/notes`)));
90
+ }
91
+ //# sourceMappingURL=conversations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversations.js","sourceRoot":"","sources":["../../src/tools/conversations.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,EAAE,GAAG,CAAC,IAAa,EAAE,EAAE,CAAC,CAAC;IAC7B,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;CAC1E,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,CAAC;KACrB,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;KAC/D,QAAQ,CAAC,iCAAiC,CAAC,CAAC;AAE/C,MAAM,UAAU,yBAAyB,CAAC,MAAiB,EAAE,MAAqB;IAChF,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,sHAAsH,EACtH;QACE,MAAM,EAAE,CAAC;aACN,IAAI,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;aAC1D,QAAQ,EAAE;aACV,QAAQ,CAAC,6BAA6B,CAAC;QAC1C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QACvC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QACnC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;QAClD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;KACzC,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CACpD,EAAE,CACA,MAAM,MAAM,CAAC,GAAG,CACd,gBAAgB,EAChB,MAAM,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,CAC9E,CACF,CACJ,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,yIAAyI,EACzI,EAAE,EAAE,EAAE,cAAc,EAAE,EACtB,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,kBAAkB,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAC3F,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,0EAA0E,EAC1E;QACE,EAAE,EAAE,cAAc;QAClB,aAAa,EAAE,CAAC;aACb,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;aAC1C,QAAQ,CAAC,yBAAyB,CAAC;QACtC,WAAW,EAAE,CAAC;aACX,MAAM,EAAE;aACR,GAAG,EAAE;aACL,QAAQ,EAAE;aACV,QAAQ,CAAC,sEAAsE,CAAC;KACpF,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,WAAW,EAAE,EAAE,EAAE,CAC3C,EAAE,CACA,MAAM,MAAM,CAAC,IAAI,CAAC,kBAAkB,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE;QAC3E,aAAa;QACb,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtD,CAAC,CACH,CACJ,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,6BAA6B,EAC7B,mHAAmH,EACnH;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QAC5E,QAAQ,EAAE,CAAC;aACR,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;aACrC,QAAQ,EAAE;aACV,QAAQ,CACP,gFAAgF,CACjF;KACJ,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,CACjC,EAAE,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,kBAAkB,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAC9F,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,4BAA4B,EAC5B,0HAA0H,EAC1H;QACE,EAAE,EAAE,cAAc;QAClB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC9C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QACnF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;KAC5E,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE;QAC1C,MAAM,IAAI,GACR,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;QAC7E,MAAM,IAAI,GACR,MAAM,KAAK,QAAQ;YACjB,CAAC,CAAC;gBACE,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnD,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC1C;YACH,CAAC,CAAC,SAAS,CAAC;QAChB,OAAO,EAAE,CACP,MAAM,MAAM,CAAC,IAAI,CAAC,kBAAkB,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,CACpF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,oCAAoC,EACpC,mFAAmF,EACnF;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QAC5E,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QACvD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;QACvC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;KACzC,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,CAClD,EAAE,CACA,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,kBAAkB,CAAC,UAAU,CAAC,sBAAsB,EAAE;QACnF,MAAM;QACN,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9C,CAAC,CACH,CACJ,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,uHAAuH,EACvH;QACE,EAAE,EAAE,cAAc;QAClB,MAAM,EAAE,CAAC;aACN,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;aAC3C,QAAQ,EAAE;aACV,QAAQ,CAAC,8CAA8C,CAAC;QAC3D,aAAa,EAAE,CAAC;aACb,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,uDAAuD,CAAC;KACrE,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE,CACtC,EAAE,CACA,MAAM,MAAM,CAAC,IAAI,CAAC,kBAAkB,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE;QAC3E,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5C,CAAC,CACH,CACJ,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,yBAAyB,EACzB,2FAA2F,EAC3F,EAAE,EAAE,EAAE,cAAc,EAAE,EACtB,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,kBAAkB,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CACjG,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The rest of the platform: workflows, broadcasts, webhooks and workspaces.
3
+ *
4
+ * 0.1.0 shipped four tools here that could not work — two hitting
5
+ * `/lifecycle-stages`, which is not a route the API has, one hitting
6
+ * `/channels/{id}/profile`, likewise absent, and a workflow trigger whose body
7
+ * the engine ignored. They are gone or corrected.
8
+ */
9
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
10
+ import type { OmnifoxClient } from "../omnifox/client.js";
11
+ export declare function registerExtraTools(server: McpServer, client: OmnifoxClient): void;
12
+ //# sourceMappingURL=extras.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extras.d.ts","sourceRoot":"","sources":["../../src/tools/extras.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAW1D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAqKjF"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * The rest of the platform: workflows, broadcasts, webhooks and workspaces.
3
+ *
4
+ * 0.1.0 shipped four tools here that could not work — two hitting
5
+ * `/lifecycle-stages`, which is not a route the API has, one hitting
6
+ * `/channels/{id}/profile`, likewise absent, and a workflow trigger whose body
7
+ * the engine ignored. They are gone or corrected.
8
+ */
9
+ import { z } from "zod";
10
+ const ok = (data) => ({
11
+ content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
12
+ });
13
+ const numericId = (what) => z
14
+ .union([z.number().int().positive(), z.string().regex(/^\d+$/)])
15
+ .describe(`Numeric id of the ${what}.`);
16
+ export function registerExtraTools(server, client) {
17
+ // ---------- Workflows ----------
18
+ server.tool("list_workflows", "List the automation workflows of the workspace, with whether each one is currently active.", {
19
+ limit: z.number().int().min(1).max(100).optional(),
20
+ page: z.number().int().min(1).optional(),
21
+ }, async ({ limit, page }) => ok(await client.get("/workflows", client.buildListQuery({ limit, page }))));
22
+ server.tool("trigger_workflow", "Run a workflow now. Whatever you pass as `context` is the trigger data its nodes read.", {
23
+ workflowId: numericId("workflow"),
24
+ context: z
25
+ .record(z.string(), z.unknown())
26
+ .optional()
27
+ .describe("Trigger payload, e.g. { \"conversation_id\": 42 }."),
28
+ force: z
29
+ .boolean()
30
+ .optional()
31
+ .describe("Run even if the workflow is inactive. Without this an inactive one is refused."),
32
+ }, async ({ workflowId, context, force }) => ok(await client.post(`/workflows/${encodeURIComponent(String(workflowId))}/trigger`, {
33
+ context: context ?? {},
34
+ ...(force ? { force: true } : {}),
35
+ })));
36
+ server.tool("set_workflow_active", "Activate or deactivate a workflow. A workflow with no trigger node and at least one action cannot be activated.", { workflowId: numericId("workflow"), active: z.boolean() }, async ({ workflowId, active }) => ok(await client.post(`/workflows/${encodeURIComponent(String(workflowId))}/${active ? "activate" : "deactivate"}`)));
37
+ // ---------- Broadcasts ----------
38
+ server.tool("list_broadcasts", "List the broadcast campaigns of the workspace with their status and delivery counters.", {
39
+ limit: z.number().int().min(1).max(100).optional(),
40
+ page: z.number().int().min(1).optional(),
41
+ }, async ({ limit, page }) => ok(await client.get("/broadcasts", client.buildListQuery({ limit, page }))));
42
+ server.tool("create_broadcast", "Create a broadcast campaign. WhatsApp broadcasts must use an approved template; SMS and email carry their own body.", {
43
+ name: z.string().min(1).max(255),
44
+ channel_id: z.number().int().positive(),
45
+ type: z.enum(["whatsapp_template", "sms", "email"]),
46
+ whatsapp_template_id: z
47
+ .number()
48
+ .int()
49
+ .optional()
50
+ .describe("Required when type is whatsapp_template."),
51
+ message_content: z
52
+ .string()
53
+ .optional()
54
+ .describe("Required for sms and email — the body to send."),
55
+ message_payload: z.record(z.string(), z.unknown()).optional(),
56
+ segment_filters: z
57
+ .record(z.string(), z.unknown())
58
+ .optional()
59
+ .describe("Audience filter, e.g. { \"tag_ids\": [3] }."),
60
+ scheduled_at: z
61
+ .string()
62
+ .optional()
63
+ .describe("ISO-8601 moment in the future. Omit and pass send_now to go immediately."),
64
+ send_now: z.boolean().optional(),
65
+ }, async (params) => ok(await client.post("/broadcasts", params)));
66
+ server.tool("cancel_broadcast", "Cancel a scheduled or running broadcast. Messages already delivered are not recalled.", { id: numericId("broadcast") }, async ({ id }) => ok(await client.post(`/broadcasts/${encodeURIComponent(String(id))}/cancel`)));
67
+ // ---------- Webhooks ----------
68
+ server.tool("register_webhook", "Subscribe an HTTPS endpoint to workspace events. Creating one requires a workspace admin, and the URL must be https.", {
69
+ name: z.string().min(1).max(255),
70
+ url: z.string().url().describe("Must be https — http is refused."),
71
+ events: z
72
+ .array(z.string().min(1))
73
+ .min(1)
74
+ .describe("Event names, e.g. message.received, conversation.assigned, contact.created, " +
75
+ "call.ended, tag.added, broadcast.completed."),
76
+ headers: z
77
+ .record(z.string(), z.string())
78
+ .optional()
79
+ .describe("Extra headers sent with each delivery."),
80
+ is_active: z.boolean().optional(),
81
+ retry_count: z.number().int().min(0).max(10).optional(),
82
+ timeout_seconds: z.number().int().min(5).max(60).optional(),
83
+ }, async (params) => ok(await client.post("/webhooks", params)));
84
+ server.tool("list_webhooks", "List the webhook subscriptions of the workspace and the events each one is signed up for.", {}, async () => ok(await client.get("/webhooks")));
85
+ // ---------- Workspaces ----------
86
+ server.tool("list_workspaces", "List the workspaces this token can reach. Useful first call when the agent serves more than one.", {}, async () => ok(await client.get("/workspaces")));
87
+ // ---------- Reports ----------
88
+ server.tool("get_report", "Read an analytics report over a date range — volume, response times, per-agent performance or an hour-by-hour heatmap.", {
89
+ report: z
90
+ .enum(["overview", "conversations", "agents", "heatmap"])
91
+ .describe("overview = headline stats and trend; conversations = by channel/status/volume; " +
92
+ "agents = per-agent performance; heatmap = volume by weekday and hour."),
93
+ preset: z
94
+ .enum(["today", "yesterday", "7d", "30d", "90d", "this_month", "last_month"])
95
+ .optional()
96
+ .describe("Defaults to the last 30 days."),
97
+ from: z.string().optional().describe("Explicit start date; overridden by preset."),
98
+ to: z.string().optional(),
99
+ }, async ({ report, preset, from, to }) => ok(await client.get(`/reports/${report}`, {
100
+ ...(preset ? { preset } : {}),
101
+ ...(from ? { from } : {}),
102
+ ...(to ? { to } : {}),
103
+ })));
104
+ }
105
+ //# sourceMappingURL=extras.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extras.js","sourceRoot":"","sources":["../../src/tools/extras.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,EAAE,GAAG,CAAC,IAAa,EAAE,EAAE,CAAC,CAAC;IAC7B,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;CAC1E,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE,CACjC,CAAC;KACE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;KAC/D,QAAQ,CAAC,qBAAqB,IAAI,GAAG,CAAC,CAAC;AAE5C,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,MAAqB;IACzE,kCAAkC;IAClC,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,4FAA4F,EAC5F;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;QAClD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;KACzC,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CACxB,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAC7E,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,wFAAwF,EACxF;QACE,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC;QACjC,OAAO,EAAE,CAAC;aACP,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;aAC/B,QAAQ,EAAE;aACV,QAAQ,CAAC,oDAAoD,CAAC;QACjE,KAAK,EAAE,CAAC;aACL,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CAAC,gFAAgF,CAAC;KAC9F,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CACvC,EAAE,CACA,MAAM,MAAM,CAAC,IAAI,CAAC,cAAc,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,UAAU,EAAE;QAChF,OAAO,EAAE,OAAO,IAAI,EAAE;QACtB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClC,CAAC,CACH,CACJ,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,iHAAiH,EACjH,EAAE,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,EAC1D,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,CAC/B,EAAE,CACA,MAAM,MAAM,CAAC,IAAI,CACf,cAAc,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,EAAE,CAC7F,CACF,CACJ,CAAC;IAEF,mCAAmC;IACnC,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,wFAAwF,EACxF;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;QAClD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;KACzC,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CACxB,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAC9E,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,qHAAqH,EACrH;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QAChC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QACvC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,mBAAmB,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACnD,oBAAoB,EAAE,CAAC;aACpB,MAAM,EAAE;aACR,GAAG,EAAE;aACL,QAAQ,EAAE;aACV,QAAQ,CAAC,0CAA0C,CAAC;QACvD,eAAe,EAAE,CAAC;aACf,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,gDAAgD,CAAC;QAC7D,eAAe,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;QAC7D,eAAe,EAAE,CAAC;aACf,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;aAC/B,QAAQ,EAAE;aACV,QAAQ,CAAC,6CAA6C,CAAC;QAC1D,YAAY,EAAE,CAAC;aACZ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,0EAA0E,CAAC;QACvF,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;KACjC,EACD,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAC/D,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,uFAAuF,EACvF,EAAE,EAAE,EAAE,SAAS,CAAC,WAAW,CAAC,EAAE,EAC9B,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CACf,EAAE,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,eAAe,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAChF,CAAC;IAEF,iCAAiC;IACjC,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,sHAAsH,EACtH;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QAChC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QAClE,MAAM,EAAE,CAAC;aACN,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aACxB,GAAG,CAAC,CAAC,CAAC;aACN,QAAQ,CACP,8EAA8E;YAC5E,6CAA6C,CAChD;QACH,OAAO,EAAE,CAAC;aACP,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;aAC9B,QAAQ,EAAE;aACV,QAAQ,CAAC,wCAAwC,CAAC;QACrD,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QACjC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;QACvD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;KAC5D,EACD,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAC7D,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,eAAe,EACf,2FAA2F,EAC3F,EAAE,EACF,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAC9C,CAAC;IAEF,mCAAmC;IACnC,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,kGAAkG,EAClG,EAAE,EACF,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAChD,CAAC;IAEF,gCAAgC;IAChC,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,wHAAwH,EACxH;QACE,MAAM,EAAE,CAAC;aACN,IAAI,CAAC,CAAC,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;aACxD,QAAQ,CACP,iFAAiF;YAC/E,uEAAuE,CAC1E;QACH,MAAM,EAAE,CAAC;aACN,IAAI,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;aAC5E,QAAQ,EAAE;aACV,QAAQ,CAAC,+BAA+B,CAAC;QAC5C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;QAClF,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC1B,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CACrC,EAAE,CACA,MAAM,MAAM,CAAC,GAAG,CAAC,YAAY,MAAM,EAAE,EAAE;QACrC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtB,CAAC,CACH,CACJ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Messaging tools — send and read messages.
3
+ *
4
+ * Omnifox has two send contracts and they do not share a body shape:
5
+ *
6
+ * - `POST /contacts/{id}/message` takes the respond.io-shaped envelope
7
+ * `{channelId, message: {type, ...}}`. Attachments travel as a URL.
8
+ * - `POST /conversations/{id}/messages` takes a flat payload validated by
9
+ * `SendMessageRequest`. Media needs a real multipart upload, which an MCP
10
+ * tool cannot do, so only the text-ish types are exposed there.
11
+ *
12
+ * 0.1.0 posted a camelCase payload to `/contacts/{id}/messages` — a path that
13
+ * does not exist (the route is singular) — so no message ever left.
14
+ */
15
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
16
+ import type { OmnifoxClient } from "../omnifox/client.js";
17
+ export declare function registerMessagingTools(server: McpServer, client: OmnifoxClient): void;
18
+ //# sourceMappingURL=messaging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messaging.d.ts","sourceRoot":"","sources":["../../src/tools/messaging.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAU1D,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAmJrF"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Messaging tools — send and read messages.
3
+ *
4
+ * Omnifox has two send contracts and they do not share a body shape:
5
+ *
6
+ * - `POST /contacts/{id}/message` takes the respond.io-shaped envelope
7
+ * `{channelId, message: {type, ...}}`. Attachments travel as a URL.
8
+ * - `POST /conversations/{id}/messages` takes a flat payload validated by
9
+ * `SendMessageRequest`. Media needs a real multipart upload, which an MCP
10
+ * tool cannot do, so only the text-ish types are exposed there.
11
+ *
12
+ * 0.1.0 posted a camelCase payload to `/contacts/{id}/messages` — a path that
13
+ * does not exist (the route is singular) — so no message ever left.
14
+ */
15
+ import { z } from "zod";
16
+ const ok = (data) => ({
17
+ content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
18
+ });
19
+ const conversationId = z
20
+ .union([z.number().int().positive(), z.string().regex(/^\d+$/)])
21
+ .describe("Numeric id of the conversation.");
22
+ export function registerMessagingTools(server, client) {
23
+ server.tool("send_message", "Send a message to a contact. Reuses their open conversation on that channel or starts one. " +
24
+ "Outside WhatsApp's 24-hour window only a template will be delivered.", {
25
+ identifier: z
26
+ .string()
27
+ .min(1)
28
+ .describe("Contact id, or a kind:value selector like 'phone:+593987654321'."),
29
+ channelId: z
30
+ .number()
31
+ .int()
32
+ .optional()
33
+ .describe("Channel to send through. Omitted, the contact's last active channel is used."),
34
+ type: z
35
+ .enum(["text", "attachment", "quick_reply", "whatsapp_template", "email"])
36
+ .default("text"),
37
+ text: z.string().optional().describe("Body when type is text."),
38
+ attachment: z
39
+ .object({
40
+ type: z.enum(["image", "video", "audio", "file"]),
41
+ url: z.string().url().describe("Publicly reachable URL; Omnifox fetches it."),
42
+ })
43
+ .optional(),
44
+ quickReply: z
45
+ .object({
46
+ title: z.string().describe("Question shown above the buttons."),
47
+ replies: z.array(z.string()).min(1).max(10),
48
+ })
49
+ .optional(),
50
+ template: z
51
+ .object({
52
+ name: z.string().describe("Approved template name — see list_templates."),
53
+ languageCode: z.string().describe("e.g. es, en_US."),
54
+ components: z.array(z.record(z.string(), z.unknown())).optional(),
55
+ })
56
+ .optional(),
57
+ email: z
58
+ .object({
59
+ subject: z.string().optional(),
60
+ html: z.string().optional(),
61
+ text: z.string().optional(),
62
+ cc: z.array(z.string()).optional(),
63
+ bcc: z.array(z.string()).optional(),
64
+ })
65
+ .optional(),
66
+ }, async ({ identifier, channelId, type, text, attachment, quickReply, template, email }) => {
67
+ const message = { type };
68
+ if (type === "text") {
69
+ if (!text)
70
+ throw new Error("send_message: `text` is required when type is text");
71
+ message.text = text;
72
+ }
73
+ else if (type === "attachment") {
74
+ if (!attachment)
75
+ throw new Error("send_message: `attachment` is required when type is attachment");
76
+ message.attachment = attachment;
77
+ }
78
+ else if (type === "quick_reply") {
79
+ if (!quickReply)
80
+ throw new Error("send_message: `quickReply` is required when type is quick_reply");
81
+ message.title = quickReply.title;
82
+ message.replies = quickReply.replies;
83
+ }
84
+ else if (type === "whatsapp_template") {
85
+ if (!template)
86
+ throw new Error("send_message: `template` is required when type is whatsapp_template");
87
+ message.template = template;
88
+ }
89
+ else if (type === "email") {
90
+ Object.assign(message, email ?? {});
91
+ }
92
+ return ok(await client.post(`/contacts/${encodeURIComponent(identifier)}/message`, {
93
+ ...(channelId !== undefined ? { channelId } : {}),
94
+ message,
95
+ }));
96
+ });
97
+ server.tool("send_conversation_message", "Send into a conversation you already know the id of. Use type 'note' for an internal note teammates see but the customer does not.", {
98
+ conversationId,
99
+ type: z.enum(["text", "note"]).default("text"),
100
+ content_text: z.string().min(1),
101
+ mentioned_user_ids: z
102
+ .array(z.number().int())
103
+ .optional()
104
+ .describe("Teammates to @-mention on an internal note."),
105
+ }, async ({ conversationId: id, type, content_text, mentioned_user_ids }) => ok(await client.post(`/conversations/${encodeURIComponent(String(id))}/messages`, {
106
+ type,
107
+ content_text,
108
+ ...(type === "note" ? { is_internal_note: true } : {}),
109
+ ...(mentioned_user_ids?.length ? { mentioned_user_ids } : {}),
110
+ })));
111
+ server.tool("get_message", "Fetch one message with its delivery status. Both ids are required — messages are addressed within their conversation.", { conversationId, messageId: z.union([z.number().int(), z.string().regex(/^\d+$/)]) }, async ({ conversationId: id, messageId }) => ok(await client.get(`/conversations/${encodeURIComponent(String(id))}/messages/${encodeURIComponent(String(messageId))}`)));
112
+ server.tool("list_messages", "List the messages of a conversation, oldest first. Set include_notes to see internal notes interleaved.", {
113
+ conversationId,
114
+ limit: z.number().int().min(1).max(100).optional(),
115
+ page: z.number().int().min(1).optional(),
116
+ include_notes: z
117
+ .boolean()
118
+ .optional()
119
+ .describe("Include internal notes alongside the customer-visible messages."),
120
+ }, async ({ conversationId: id, limit, page, include_notes }) => ok(await client.get(`/conversations/${encodeURIComponent(String(id))}/messages`, client.buildListQuery({
121
+ limit,
122
+ page,
123
+ extra: { include_notes: include_notes ? 1 : undefined },
124
+ }))));
125
+ server.tool("retry_message", "Ask the channel to deliver a failed message again. Only a message in a failed state can be retried.", { conversationId, messageId: z.union([z.number().int(), z.string().regex(/^\d+$/)]) }, async ({ conversationId: id, messageId }) => ok(await client.post(`/conversations/${encodeURIComponent(String(id))}/messages/${encodeURIComponent(String(messageId))}/retry`)));
126
+ }
127
+ //# sourceMappingURL=messaging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messaging.js","sourceRoot":"","sources":["../../src/tools/messaging.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Workspace tools — agents, custom fields, channels, snippets, templates, tags.
3
+ *
4
+ * Every path and body below was checked against the live API. Two corrections
5
+ * over 0.1.0 that mattered: workspace members live at `/agents` (there is no
6
+ * `/users` route), and custom fields are defined with `key`/`label`/
7
+ * `entity_type`, not `name`/`slug`/`required`.
8
+ */
9
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
10
+ import type { OmnifoxClient } from "../omnifox/client.js";
11
+ export declare function registerWorkspaceTools(server: McpServer, client: OmnifoxClient): void;
12
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/tools/workspace.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAY1D,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CA6LrF"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Workspace tools — agents, custom fields, channels, snippets, templates, tags.
3
+ *
4
+ * Every path and body below was checked against the live API. Two corrections
5
+ * over 0.1.0 that mattered: workspace members live at `/agents` (there is no
6
+ * `/users` route), and custom fields are defined with `key`/`label`/
7
+ * `entity_type`, not `name`/`slug`/`required`.
8
+ */
9
+ import { z } from "zod";
10
+ const ok = (data) => ({
11
+ content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
12
+ });
13
+ /** Every id in Omnifox is a positive integer, not a UUID. */
14
+ const id = (what) => z
15
+ .union([z.number().int().positive(), z.string().regex(/^\d+$/)])
16
+ .describe(`Numeric id of the ${what}.`);
17
+ export function registerWorkspaceTools(server, client) {
18
+ // ---------- Agents (workspace members) ----------
19
+ server.tool("list_users", "List the workspace members (human agents) with their availability status.", {
20
+ limit: z.number().int().min(1).max(100).optional(),
21
+ page: z.number().int().min(1).optional(),
22
+ }, async ({ limit, page }) => ok(await client.get("/agents", client.buildListQuery({ limit, page }))));
23
+ server.tool("get_user", "Fetch a single workspace member by id, with their role and current availability.", { id: id("user") }, async ({ id: userId }) => ok(await client.get(`/agents/${encodeURIComponent(String(userId))}`)));
24
+ server.tool("set_user_status", "Set a member's availability: available, busy, away or offline. Routing rules honour it immediately.", {
25
+ id: id("user"),
26
+ status: z.enum(["available", "busy", "away", "offline"]),
27
+ }, async ({ id: userId, status }) => ok(await client.put(`/agents/${encodeURIComponent(String(userId))}/status`, {
28
+ status,
29
+ workspace_id: client.workspaceId,
30
+ })));
31
+ // ---------- Custom fields ----------
32
+ server.tool("list_custom_fields", "List the custom field definitions of the workspace so you know which keys a record accepts.", {
33
+ entity_type: z
34
+ .enum(["contact", "conversation", "deal", "company"])
35
+ .optional()
36
+ .describe("Restrict to the fields defined for one kind of record."),
37
+ limit: z.number().int().min(1).max(100).optional(),
38
+ page: z.number().int().min(1).optional(),
39
+ }, async ({ entity_type, limit, page }) => ok(await client.get("/custom-fields", client.buildListQuery({ limit, page, extra: { entity_type } }))));
40
+ server.tool("get_custom_field", "Fetch a single custom field definition, including its type and its option list.", { id: id("custom field") }, async ({ id: fieldId }) => ok(await client.get(`/custom-fields/${encodeURIComponent(String(fieldId))}`)));
41
+ server.tool("create_custom_field", "Define a new custom field on contacts, conversations, deals or companies. The type cannot be changed once created.", {
42
+ key: z
43
+ .string()
44
+ .regex(/^[a-z0-9_]+$/)
45
+ .describe("snake_case identifier used in API payloads."),
46
+ label: z.string().min(1).describe("Human-readable name shown in the UI."),
47
+ type: z.enum([
48
+ "text",
49
+ "textarea",
50
+ "number",
51
+ "decimal",
52
+ "date",
53
+ "datetime",
54
+ "boolean",
55
+ "select",
56
+ "multiselect",
57
+ "url",
58
+ "email",
59
+ "phone",
60
+ ]),
61
+ entity_type: z
62
+ .enum(["contact", "conversation", "deal", "company"])
63
+ .describe("Which kind of record the field hangs off."),
64
+ options: z
65
+ .array(z.string())
66
+ .optional()
67
+ .describe("Required when type is select or multiselect."),
68
+ is_required: z.boolean().optional(),
69
+ is_filterable: z.boolean().optional(),
70
+ sort_order: z.number().int().min(0).optional(),
71
+ }, async (params) => ok(await client.post("/custom-fields", params)));
72
+ // ---------- Channels & templates ----------
73
+ server.tool("list_channels", "List the connected channels (WhatsApp, Instagram, Messenger, Telegram, webchat, SMS, email, voice).", {
74
+ limit: z.number().int().min(1).max(100).optional(),
75
+ page: z.number().int().min(1).optional(),
76
+ }, async ({ limit, page }) => ok(await client.get("/channels", client.buildListQuery({ limit, page }))));
77
+ server.tool("list_snippets", "List the saved replies (snippets) of the workspace — pre-written answers the team reuses.", {
78
+ scope: z
79
+ .enum(["all", "shared", "mine"])
80
+ .optional()
81
+ .describe("`shared` hides private snippets; `mine` returns only your own."),
82
+ category_id: z.number().int().optional(),
83
+ limit: z.number().int().min(1).max(100).optional(),
84
+ page: z.number().int().min(1).optional(),
85
+ }, async ({ scope, category_id, limit, page }) => ok(await client.get("/snippets", client.buildListQuery({ limit, page, extra: { scope, category_id } }))));
86
+ server.tool("list_templates", "List the approved WhatsApp message templates of a channel. Required to write to a contact outside the 24-hour window.", { channelId: id("channel") }, async ({ channelId }) => ok(await client.get(`/channels/${encodeURIComponent(String(channelId))}/templates`)));
87
+ // ---------- Tags ----------
88
+ server.tool("list_tags", "List the tags of the workspace, so you can attach an existing one instead of inventing a name.", { search: z.string().optional().describe("Filter by name.") }, async ({ search }) => ok(await client.get("/tags", search ? { search } : undefined)));
89
+ server.tool("create_tag", "Create a tag in the workspace. To tag a contact you do not need this first — add_contact_tags creates missing tags itself.", {
90
+ name: z.string().min(1).max(100),
91
+ color: z
92
+ .string()
93
+ .regex(/^#[0-9a-fA-F]{6}$/)
94
+ .optional(),
95
+ description: z.string().max(500).optional(),
96
+ }, async (params) => ok(await client.post("/tags", params)));
97
+ server.tool("update_tag", "Rename, recolor or re-describe a tag. The change applies everywhere the tag is already attached.", {
98
+ id: id("tag"),
99
+ patch: z.object({
100
+ name: z.string().min(1).max(100).optional(),
101
+ color: z
102
+ .string()
103
+ .regex(/^#[0-9a-fA-F]{6}$/)
104
+ .optional(),
105
+ description: z.string().max(500).optional(),
106
+ }),
107
+ }, async ({ id: tagId, patch }) => ok(await client.put(`/tags/${encodeURIComponent(String(tagId))}`, patch)));
108
+ server.tool("delete_tag", "Delete a tag and detach it from every record that carried it. Irreversible.", { id: id("tag") }, async ({ id: tagId }) => ok(await client.delete(`/tags/${encodeURIComponent(String(tagId))}`)));
109
+ }
110
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/tools/workspace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * HTTP transport — POST /mcp + GET /health.
3
+ *
4
+ * Uses the SDK's StreamableHTTPServerTransport in stateless mode so the same
5
+ * express process can fan out across MCP clients (e.g. Composio, k8s).
6
+ */
7
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
8
+ export interface HttpOptions {
9
+ port?: number;
10
+ }
11
+ export declare function startHttp(serverFactory: () => McpServer, opts?: HttpOptions): Promise<void>;
12
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/transport/http.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,SAAS,CAC7B,aAAa,EAAE,MAAM,SAAS,EAC9B,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,IAAI,CAAC,CA8Df"}