@opencx/mcp 1.15.12 → 1.15.14

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=add-session-comment.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-session-comment.spec.d.ts","sourceRoot":"","sources":["../src/add-session-comment.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,108 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
3
+ import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
4
+ import { createServer } from './server.js';
5
+ function mockResponse(body, status = 200, statusText = 'OK') {
6
+ return new Response(JSON.stringify(body), { status, statusText });
7
+ }
8
+ function getRequestUrl(call) {
9
+ const arg = call[0];
10
+ if (arg instanceof Request)
11
+ return arg.url;
12
+ return String(arg);
13
+ }
14
+ function getRequestMethod(call) {
15
+ const arg = call[0];
16
+ if (arg instanceof Request)
17
+ return arg.method;
18
+ const opts = call[1];
19
+ return opts.method ?? 'GET';
20
+ }
21
+ async function getRequestBody(call) {
22
+ const arg = call[0];
23
+ if (arg instanceof Request) {
24
+ const text = await arg.clone().text();
25
+ return text ? JSON.parse(text) : undefined;
26
+ }
27
+ const opts = call[1];
28
+ return opts.body ? JSON.parse(opts.body) : undefined;
29
+ }
30
+ describe('add_session_comment tool', () => {
31
+ let client;
32
+ let cleanup;
33
+ let fetchSpy;
34
+ beforeEach(async () => {
35
+ fetchSpy = vi.fn();
36
+ vi.stubGlobal('fetch', fetchSpy);
37
+ const server = createServer('test-api-key', 'https://api.test.com');
38
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
39
+ await server.connect(serverTransport);
40
+ client = new Client({ name: 'test-client', version: '1.0.0' });
41
+ await client.connect(clientTransport);
42
+ cleanup = async () => {
43
+ await client.close();
44
+ await server.close();
45
+ };
46
+ });
47
+ afterEach(async () => {
48
+ await cleanup();
49
+ vi.unstubAllGlobals();
50
+ });
51
+ it('sends thread_id when provided (threaded comment)', async () => {
52
+ const created = { uuid: 'comment-uuid', comment_thread_id: 'thread-uuid' };
53
+ fetchSpy.mockResolvedValueOnce(mockResponse(created, 201, 'Created'));
54
+ await client.callTool({
55
+ name: 'add_session_comment',
56
+ arguments: {
57
+ session_id: 'session-1',
58
+ thread_id: '4f9df1e2-95d7-4b83-a9be-7d2f0a2f7f11',
59
+ content: 'threaded note',
60
+ agent_id: 42,
61
+ },
62
+ });
63
+ expect(fetchSpy).toHaveBeenCalledOnce();
64
+ const call = fetchSpy.mock.calls[0];
65
+ expect(getRequestUrl(call)).toBe('https://api.test.com/chat/sessions/session-1/comments');
66
+ expect(getRequestMethod(call)).toBe('POST');
67
+ expect(await getRequestBody(call)).toEqual({
68
+ thread_id: '4f9df1e2-95d7-4b83-a9be-7d2f0a2f7f11',
69
+ content: 'threaded note',
70
+ agent_id: 42,
71
+ });
72
+ });
73
+ it('omits thread_id entirely when not provided (session-level note)', async () => {
74
+ const created = { uuid: 'comment-uuid', comment_thread_id: null };
75
+ fetchSpy.mockResolvedValueOnce(mockResponse(created, 201, 'Created'));
76
+ await client.callTool({
77
+ name: 'add_session_comment',
78
+ arguments: {
79
+ session_id: 'session-1',
80
+ content: 'session-level note',
81
+ agent_id: 42,
82
+ },
83
+ });
84
+ expect(fetchSpy).toHaveBeenCalledOnce();
85
+ const call = fetchSpy.mock.calls[0];
86
+ expect(getRequestUrl(call)).toBe('https://api.test.com/chat/sessions/session-1/comments');
87
+ expect(getRequestMethod(call)).toBe('POST');
88
+ const body = await getRequestBody(call);
89
+ expect(body).toEqual({ content: 'session-level note', agent_id: 42 });
90
+ // The key must be ABSENT, not undefined/null — the public API treats a
91
+ // missing thread_id as "session-level note".
92
+ expect(Object.keys(body)).not.toContain('thread_id');
93
+ });
94
+ it('rejects a non-uuid thread_id at the tool input layer', async () => {
95
+ const result = await client.callTool({
96
+ name: 'add_session_comment',
97
+ arguments: {
98
+ session_id: 'session-1',
99
+ thread_id: 'not-a-uuid',
100
+ content: 'bad thread',
101
+ agent_id: 42,
102
+ },
103
+ });
104
+ expect(result.isError).toBe(true);
105
+ expect(fetchSpy).not.toHaveBeenCalled();
106
+ });
107
+ });
108
+ //# sourceMappingURL=add-session-comment.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-session-comment.spec.js","sourceRoot":"","sources":["../src/add-session-comment.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=phone-tools.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phone-tools.spec.d.ts","sourceRoot":"","sources":["../src/phone-tools.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,156 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
3
+ import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
4
+ import { createServer } from './server.js';
5
+ function mockResponse(body, status = 200) {
6
+ return new Response(JSON.stringify(body), { status, statusText: 'OK' });
7
+ }
8
+ function getRequestUrl(call) {
9
+ const arg = call[0];
10
+ return arg instanceof Request ? arg.url : String(arg);
11
+ }
12
+ function getRequestMethod(call) {
13
+ const arg = call[0];
14
+ if (arg instanceof Request)
15
+ return arg.method;
16
+ return call[1].method ?? 'GET';
17
+ }
18
+ async function getRequestBody(call) {
19
+ const arg = call[0];
20
+ if (arg instanceof Request) {
21
+ const text = await arg.clone().text();
22
+ return text ? JSON.parse(text) : undefined;
23
+ }
24
+ const body = call[1].body;
25
+ return body ? JSON.parse(body) : undefined;
26
+ }
27
+ const agentFixture = {
28
+ id: 'agent-1',
29
+ name: 'Agent',
30
+ model: 'oppie-vox-livekit',
31
+ actionIds: [],
32
+ transfer_destination_ids: [],
33
+ };
34
+ describe('phone tools', () => {
35
+ let client;
36
+ let cleanup;
37
+ let fetchSpy;
38
+ beforeEach(async () => {
39
+ fetchSpy = vi.fn();
40
+ vi.stubGlobal('fetch', fetchSpy);
41
+ const server = createServer('test-api-key', 'https://api.test.com');
42
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
43
+ await server.connect(serverTransport);
44
+ client = new Client({ name: 'test-client', version: '1.0.0' });
45
+ await client.connect(clientTransport);
46
+ cleanup = async () => {
47
+ await client.close();
48
+ await server.close();
49
+ };
50
+ });
51
+ afterEach(async () => {
52
+ await cleanup();
53
+ vi.restoreAllMocks();
54
+ });
55
+ it('list_transfer_destinations reads GET /phone/transfer-destinations', async () => {
56
+ fetchSpy.mockResolvedValueOnce(mockResponse([{ id: 'dest-1', name: 'Support', type: 'phone', hasSipPassword: false }]));
57
+ const result = await client.callTool({ name: 'list_transfer_destinations', arguments: {} });
58
+ expect(result.isError).toBeFalsy();
59
+ const call = fetchSpy.mock.calls[0];
60
+ expect(getRequestUrl(call)).toBe('https://api.test.com/phone/transfer-destinations');
61
+ expect(getRequestMethod(call)).toBe('GET');
62
+ expect(JSON.stringify(result.content)).toContain('dest-1');
63
+ });
64
+ it('create_phone_agent forwards actions, destinations and voice tuning fields verbatim', async () => {
65
+ fetchSpy.mockResolvedValueOnce(mockResponse(agentFixture));
66
+ const result = await client.callTool({
67
+ name: 'create_phone_agent',
68
+ arguments: {
69
+ name: 'Agent',
70
+ actionIds: ['act-1'],
71
+ transfer_destination_ids: ['dest-1'],
72
+ failover_transfer_destination_id: 'dest-1',
73
+ tts_speed_pct: 83,
74
+ stt_keyterms: ['OpenCX'],
75
+ recording_enabled: true,
76
+ },
77
+ });
78
+ expect(result.isError).toBeFalsy();
79
+ const call = fetchSpy.mock.calls[0];
80
+ expect(getRequestUrl(call)).toBe('https://api.test.com/phone');
81
+ expect(getRequestMethod(call)).toBe('POST');
82
+ expect(await getRequestBody(call)).toEqual({
83
+ name: 'Agent',
84
+ actionIds: ['act-1'],
85
+ transfer_destination_ids: ['dest-1'],
86
+ failover_transfer_destination_id: 'dest-1',
87
+ tts_speed_pct: 83,
88
+ stt_keyterms: ['OpenCX'],
89
+ recording_enabled: true,
90
+ });
91
+ });
92
+ it('create/update no longer expose the legacy handoff_phone_number / use_org_knowledgebase inputs', async () => {
93
+ const { tools } = await client.listTools();
94
+ for (const name of ['create_phone_agent', 'update_phone_agent']) {
95
+ const tool = tools.find((t) => t.name === name);
96
+ expect(tool, name).toBeDefined();
97
+ const properties = Object.keys(tool?.inputSchema.properties ?? {});
98
+ expect(properties).not.toContain('handoff_phone_number');
99
+ expect(properties).not.toContain('use_org_knowledgebase');
100
+ expect(properties).toEqual(expect.arrayContaining(['actionIds', 'transfer_destination_ids', 'tts_speed_pct']));
101
+ }
102
+ });
103
+ it('update_phone_agent PATCHes only the supplied fields', async () => {
104
+ fetchSpy.mockResolvedValueOnce(mockResponse(agentFixture));
105
+ await client.callTool({
106
+ name: 'update_phone_agent',
107
+ arguments: { phone_agent_id: 'agent-1', transfer_destination_ids: [] },
108
+ });
109
+ const call = fetchSpy.mock.calls[0];
110
+ expect(getRequestUrl(call)).toBe('https://api.test.com/phone/agent-1');
111
+ expect(getRequestMethod(call)).toBe('PATCH');
112
+ expect(await getRequestBody(call)).toEqual({ transfer_destination_ids: [] });
113
+ });
114
+ it('make_outbound_call maps session_custom_data / extra_instructions onto the API body', async () => {
115
+ fetchSpy.mockResolvedValueOnce(mockResponse({ sessionId: 's-1', callId: 'c-1' }));
116
+ const result = await client.callTool({
117
+ name: 'make_outbound_call',
118
+ arguments: {
119
+ phone_agent_id: 'agent-1',
120
+ phone_number: '+15551234567',
121
+ session_custom_data: { npsScore: 3, business: 'Cafe', owner: true },
122
+ extra_instructions: 'Ask about the last order.',
123
+ },
124
+ });
125
+ expect(result.isError).toBeFalsy();
126
+ const call = fetchSpy.mock.calls[0];
127
+ expect(getRequestUrl(call)).toBe('https://api.test.com/phone/outbound-call');
128
+ expect(await getRequestBody(call)).toEqual({
129
+ phoneAgentId: 'agent-1',
130
+ contact: { phoneNumber: '+15551234567' },
131
+ sessionCustomData: { npsScore: 3, business: 'Cafe', owner: true },
132
+ extraInstructions: 'Ask about the last order.',
133
+ });
134
+ });
135
+ it('make_outbound_call omits the optional extras when not provided', async () => {
136
+ fetchSpy.mockResolvedValueOnce(mockResponse({ sessionId: 's-1', callId: 'c-1' }));
137
+ await client.callTool({
138
+ name: 'make_outbound_call',
139
+ arguments: { phone_agent_id: 'agent-1', contact_id: 'contact-1' },
140
+ });
141
+ const call = fetchSpy.mock.calls[0];
142
+ expect(await getRequestBody(call)).toEqual({
143
+ phoneAgentId: 'agent-1',
144
+ contact: { id: 'contact-1' },
145
+ });
146
+ });
147
+ it('make_outbound_call rejects a call with neither contact nor number without hitting the API', async () => {
148
+ const result = await client.callTool({
149
+ name: 'make_outbound_call',
150
+ arguments: { phone_agent_id: 'agent-1' },
151
+ });
152
+ expect(result.isError).toBe(true);
153
+ expect(fetchSpy).not.toHaveBeenCalled();
154
+ });
155
+ });
156
+ //# sourceMappingURL=phone-tools.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phone-tools.spec.js","sourceRoot":"","sources":["../src/phone-tools.spec.ts"],"names":[],"mappings":"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"}