@opencx/mcp 1.15.58 → 1.15.59

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":"macros.d.ts","sourceRoot":"","sources":["../../src/tools/macros.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAWrD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,QA8FzE"}
1
+ {"version":3,"file":"macros.d.ts","sourceRoot":"","sources":["../../src/tools/macros.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA4CrD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,QA+FzE"}
@@ -1,14 +1,34 @@
1
1
  import { z } from 'zod';
2
2
  import { jsonContent } from '../api-client.js';
3
3
  const macroContentDescription = 'Macro body as HTML, limited to what every channel can carry: <p>, <br>, <strong>, <em>, <s>, <a href>, <ul>/<ol start>/<li>. Other markup is dropped (its text is kept); escape literal < and & as HTML entities, and use <br> or <p> for line breaks. Reference variables with {{variable}} syntax — system variables like {{contact.full_name}} or the org\'s custom variables (see list_macro_variables); unknown references render as empty strings at send time. Inline images: exactly `<img src="<url>">` where <url> is the url returned by upload_image for this organization; any other image markup (extra attributes, another host, a data uri) is rejected.';
4
+ const macroOptionTypes = ['text', 'workflow'];
5
+ const macroOptionsSchema = z
6
+ .array(z.object({
7
+ id: z
8
+ .string()
9
+ .optional()
10
+ .describe("An existing option's id (from get_macro), to keep that option; workflows branching on its id keep working. Omit for a new option."),
11
+ label: z
12
+ .string()
13
+ .trim()
14
+ .min(1)
15
+ .max(20)
16
+ .describe('Button text the customer taps, up to 20 characters. Labels must differ.'),
17
+ type: z
18
+ .enum(macroOptionTypes)
19
+ .describe("`text`: the tap reaches the session as the customer's reply. `workflow`: the tap runs the macro's Macro Option Clicked workflows and the AI doesn't reply."),
20
+ }))
21
+ .max(3)
22
+ .describe('Up to 3 options the customer can tap instead of typing, sent with the macro on channels that show them. A macro with options needs body text.');
4
23
  const macroBodySchema = {
5
24
  category: z.string().describe('Grouping/category the macro is filed under (e.g. "greetings").'),
6
25
  title: z.string().describe('Macro display title shown in the inbox macro picker.'),
7
26
  content: z.string().describe(macroContentDescription),
27
+ options: macroOptionsSchema.optional(),
8
28
  };
9
29
  export function registerMacroTools(server, client) {
10
30
  server.registerTool('list_macros', {
11
- description: 'List all macros (saved replies) for your organization. Macros are reusable agent-reply templates that support {{variable}} placeholders. Each macro may carry attachments (read-only here — authored in the OpenCX dashboard).',
31
+ description: 'List all macros (saved replies) for your organization. Macros are reusable agent-reply templates that support {{variable}} placeholders. Each macro may carry attachments (read-only here — authored in the OpenCX dashboard) and up to 3 tappable options (set with create_macro / update_macro).',
12
32
  annotations: { title: 'List macros', readOnlyHint: true },
13
33
  }, async () => {
14
34
  const data = (await client.GET('/macros')).data;
@@ -32,7 +52,7 @@ export function registerMacroTools(server, client) {
32
52
  return jsonContent(data);
33
53
  });
34
54
  server.registerTool('create_macro', {
35
- description: 'Create a macro (saved reply). Use {{variable}} syntax in content to reference system or custom variables (see list_macro_variables). Attachments cannot be added here — they are authored in the OpenCX dashboard.',
55
+ description: 'Create an org-wide macro (saved reply). Use {{variable}} syntax in content to reference system or custom variables (see list_macro_variables). Optionally add up to 3 tappable options. Attachments cannot be added here — they are authored in the OpenCX dashboard.',
36
56
  inputSchema: macroBodySchema,
37
57
  annotations: { title: 'Create macro', destructiveHint: false },
38
58
  }, async (params) => {
@@ -40,12 +60,13 @@ export function registerMacroTools(server, client) {
40
60
  return jsonContent(data);
41
61
  });
42
62
  server.registerTool('update_macro', {
43
- description: 'Partially update a macro (saved reply) by ID. Only provided fields are changed. Attachments cannot be changed here (dashboard-authored); text-only updates leave them untouched.',
63
+ description: 'Partially update an org-wide macro (saved reply) by ID. Only provided fields are changed. `options` replaces the whole list: pass each option to keep with its `id`, leave an option out to remove it, `[]` removes all; omit `options` to leave them untouched. Attachments cannot be changed here (dashboard-authored); text-only updates leave them untouched.',
44
64
  inputSchema: {
45
65
  id: z.string().describe('Macro ID'),
46
66
  category: macroBodySchema.category.optional(),
47
67
  title: macroBodySchema.title.optional(),
48
68
  content: macroBodySchema.content.optional(),
69
+ options: macroOptionsSchema.optional(),
49
70
  },
50
71
  annotations: { title: 'Update macro', destructiveHint: true },
51
72
  }, async ({ id, ...body }) => {
@@ -1 +1 @@
1
- {"version":3,"file":"macros.js","sourceRoot":"","sources":["../../src/tools/macros.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"macros.js","sourceRoot":"","sources":["../../src/tools/macros.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=macros.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"macros.spec.d.ts","sourceRoot":"","sources":["../../src/tools/macros.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,104 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { connectInMemory, toolTextResultSchema } from '../spec-helpers.js';
3
+ const macro = {
4
+ id: 'macro-1',
5
+ title: 'Account access',
6
+ category: 'general',
7
+ content: '<p>Can we access your account?</p>',
8
+ attachments: [],
9
+ options: [
10
+ { id: 'opt-yes', label: 'Yes', type: 'workflow' },
11
+ { id: 'opt-no', label: 'No', type: 'text' },
12
+ ],
13
+ };
14
+ describe('macro option tools', () => {
15
+ let connection;
16
+ let requests;
17
+ let responses;
18
+ beforeEach(async () => {
19
+ requests = [];
20
+ responses = [];
21
+ vi.stubGlobal('fetch', vi.fn(async (input, init) => {
22
+ requests.push(new Request(input, init));
23
+ const response = responses.shift();
24
+ if (!response)
25
+ throw new Error('Unexpected API request');
26
+ return response;
27
+ }));
28
+ connection = await connectInMemory();
29
+ });
30
+ afterEach(async () => {
31
+ await connection.cleanup();
32
+ vi.unstubAllGlobals();
33
+ });
34
+ it('create_macro sends the options with the macro', async () => {
35
+ responses.push(Response.json(macro, { status: 201 }));
36
+ const result = toolTextResultSchema.parse(await connection.client.callTool({
37
+ name: 'create_macro',
38
+ arguments: {
39
+ title: 'Account access',
40
+ category: 'general',
41
+ content: '<p>Can we access your account?</p>',
42
+ options: [
43
+ { label: ' Yes ', type: 'workflow' },
44
+ { label: 'No', type: 'text' },
45
+ ],
46
+ },
47
+ }));
48
+ expect(result.isError).not.toBe(true);
49
+ expect(requests.map((request) => [request.method, request.url])).toEqual([
50
+ ['POST', 'https://api.test.com/macros'],
51
+ ]);
52
+ expect(await requests.at(0)?.json()).toEqual({
53
+ title: 'Account access',
54
+ category: 'general',
55
+ content: '<p>Can we access your account?</p>',
56
+ options: [
57
+ { label: 'Yes', type: 'workflow' },
58
+ { label: 'No', type: 'text' },
59
+ ],
60
+ });
61
+ });
62
+ it('update_macro passes the full option list with kept ids; a text-only update sends no options key', async () => {
63
+ responses.push(Response.json(macro), Response.json(macro));
64
+ await connection.client.callTool({
65
+ name: 'update_macro',
66
+ arguments: {
67
+ id: 'macro-1',
68
+ options: [
69
+ { id: 'opt-yes', label: 'Yes, go ahead', type: 'workflow' },
70
+ { label: 'Call me', type: 'text' },
71
+ ],
72
+ },
73
+ });
74
+ await connection.client.callTool({
75
+ name: 'update_macro',
76
+ arguments: { id: 'macro-1', title: 'Account access v2' },
77
+ });
78
+ expect(requests.map((request) => [request.method, request.url])).toEqual([
79
+ ['PATCH', 'https://api.test.com/macros/macro-1'],
80
+ ['PATCH', 'https://api.test.com/macros/macro-1'],
81
+ ]);
82
+ expect(await requests.at(0)?.json()).toEqual({
83
+ options: [
84
+ { id: 'opt-yes', label: 'Yes, go ahead', type: 'workflow' },
85
+ { label: 'Call me', type: 'text' },
86
+ ],
87
+ });
88
+ expect(await requests.at(1)?.json()).toEqual({ title: 'Account access v2' });
89
+ });
90
+ it.each([
91
+ ['more than 3 options', ['A', 'B', 'C', 'D'].map((label) => ({ label, type: 'text' }))],
92
+ ['a label over 20 characters', [{ label: 'x'.repeat(21), type: 'text' }]],
93
+ ['a blank label', [{ label: ' ', type: 'text' }]],
94
+ ['an unknown type', [{ label: 'Yes', type: 'button' }]],
95
+ ])('rejects %s before calling the API', async (_name, options) => {
96
+ const result = await connection.client.callTool({
97
+ name: 'create_macro',
98
+ arguments: { title: 'Account access', category: 'general', content: '<p>Hi</p>', options },
99
+ });
100
+ expect(result.isError).toBe(true);
101
+ expect(requests).toHaveLength(0);
102
+ });
103
+ });
104
+ //# sourceMappingURL=macros.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"macros.spec.js","sourceRoot":"","sources":["../../src/tools/macros.spec.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opencx/mcp",
3
- "version": "1.15.58",
3
+ "version": "1.15.59",
4
4
  "private": false,
5
5
  "description": "MCP server for OpenCX — manage contacts, sessions, training, and more from Claude Desktop, Cursor, or any MCP client.",
6
6
  "type": "module",