@opencx/mcp 1.15.16 → 1.15.21
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.
- package/dist/campaign-tools.spec.d.ts +2 -0
- package/dist/campaign-tools.spec.d.ts.map +1 -0
- package/dist/campaign-tools.spec.js +508 -0
- package/dist/campaign-tools.spec.js.map +1 -0
- package/dist/phone-caller-number-tool.spec.d.ts +2 -0
- package/dist/phone-caller-number-tool.spec.d.ts.map +1 -0
- package/dist/phone-caller-number-tool.spec.js +97 -0
- package/dist/phone-caller-number-tool.spec.js.map +1 -0
- package/dist/schema.d.ts +8534 -5770
- package/dist/schema.d.ts.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +10 -2
- package/dist/server.js.map +1 -1
- package/dist/slack-tools.spec.d.ts +2 -0
- package/dist/slack-tools.spec.d.ts.map +1 -0
- package/dist/slack-tools.spec.js +148 -0
- package/dist/slack-tools.spec.js.map +1 -0
- package/dist/tools/campaign-channel.d.ts +4 -0
- package/dist/tools/campaign-channel.d.ts.map +1 -0
- package/dist/tools/campaign-channel.js +250 -0
- package/dist/tools/campaign-channel.js.map +1 -0
- package/dist/tools/campaign-discovery.d.ts +4 -0
- package/dist/tools/campaign-discovery.d.ts.map +1 -0
- package/dist/tools/campaign-discovery.js +70 -0
- package/dist/tools/campaign-discovery.js.map +1 -0
- package/dist/tools/campaign-qualification.d.ts +4 -0
- package/dist/tools/campaign-qualification.d.ts.map +1 -0
- package/dist/tools/campaign-qualification.js +289 -0
- package/dist/tools/campaign-qualification.js.map +1 -0
- package/dist/tools/campaign-spine.d.ts +4 -0
- package/dist/tools/campaign-spine.d.ts.map +1 -0
- package/dist/tools/campaign-spine.js +630 -0
- package/dist/tools/campaign-spine.js.map +1 -0
- package/dist/tools/macros.js +1 -1
- package/dist/tools/macros.js.map +1 -1
- package/dist/tools/phone.d.ts.map +1 -1
- package/dist/tools/phone.js +54 -2
- package/dist/tools/phone.js.map +1 -1
- package/dist/tools/reports.d.ts.map +1 -1
- package/dist/tools/reports.js +1 -0
- package/dist/tools/reports.js.map +1 -1
- package/dist/tools/sla.d.ts.map +1 -1
- package/dist/tools/sla.js +3 -3
- package/dist/tools/sla.js.map +1 -1
- package/dist/tools/slack.d.ts +4 -0
- package/dist/tools/slack.d.ts.map +1 -0
- package/dist/tools/slack.js +76 -0
- package/dist/tools/slack.js.map +1 -0
- package/package.json +1 -1
- package/dist/tools/sequences.d.ts +0 -4
- package/dist/tools/sequences.d.ts.map +0 -1
- package/dist/tools/sequences.js +0 -182
- package/dist/tools/sequences.js.map +0 -1
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
|
|
3
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { createServer } from './server.js';
|
|
6
|
+
// The caller-number attach tool, from the agent's side of the wire. The
|
|
7
|
+
// error-path test exists because of a specific failure: the first cut
|
|
8
|
+
// destructured `{ error }` from the client — unreachable, since the client
|
|
9
|
+
// middleware THROWS on any non-ok response — so a 400 surfaced as a thrown
|
|
10
|
+
// exception ("the tool is broken") instead of explainable data.
|
|
11
|
+
function mockResponse(body, status = 200) {
|
|
12
|
+
return new Response(JSON.stringify(body), { status, statusText: 'X' });
|
|
13
|
+
}
|
|
14
|
+
function requestUrl(call) {
|
|
15
|
+
const arg = call[0];
|
|
16
|
+
return arg instanceof Request ? arg.url : String(arg);
|
|
17
|
+
}
|
|
18
|
+
async function requestBody(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 opts = call[1];
|
|
25
|
+
return opts?.body ? JSON.parse(opts.body) : undefined;
|
|
26
|
+
}
|
|
27
|
+
/** The tool's single text-content JSON payload, parsed — never a cast. */
|
|
28
|
+
function parseToolJson(content) {
|
|
29
|
+
const [first] = z.array(z.object({ type: z.string(), text: z.string() })).parse(content);
|
|
30
|
+
if (!first)
|
|
31
|
+
throw new Error('tool returned no content');
|
|
32
|
+
return z.record(z.string(), z.unknown()).parse(JSON.parse(first.text));
|
|
33
|
+
}
|
|
34
|
+
describe('set_phone_agent_caller_number tool', () => {
|
|
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('is declared, and PUTs the caller number to the right path', async () => {
|
|
56
|
+
fetchSpy.mockResolvedValue(mockResponse({ phone_agent_id: 'agent-1', caller_number: '+15005551234' }));
|
|
57
|
+
const result = await client.callTool({
|
|
58
|
+
name: 'set_phone_agent_caller_number',
|
|
59
|
+
arguments: { phone_agent_id: 'agent-1', caller_number: '+15005551234' },
|
|
60
|
+
});
|
|
61
|
+
expect(result.isError ?? false).toBe(false);
|
|
62
|
+
const call = fetchSpy.mock.calls[0];
|
|
63
|
+
expect(call).toBeDefined();
|
|
64
|
+
expect(requestUrl(call)).toContain('/phone/agent-1/caller-number');
|
|
65
|
+
expect(await requestBody(call)).toEqual({ caller_number: '+15005551234' });
|
|
66
|
+
});
|
|
67
|
+
it('detaches with null', async () => {
|
|
68
|
+
fetchSpy.mockResolvedValue(mockResponse({ phone_agent_id: 'agent-1', caller_number: null }));
|
|
69
|
+
const result = await client.callTool({
|
|
70
|
+
name: 'set_phone_agent_caller_number',
|
|
71
|
+
arguments: { phone_agent_id: 'agent-1', caller_number: null },
|
|
72
|
+
});
|
|
73
|
+
expect(result.isError ?? false).toBe(false);
|
|
74
|
+
expect(await requestBody(fetchSpy.mock.calls[0])).toEqual({ caller_number: null });
|
|
75
|
+
});
|
|
76
|
+
it('a 400 (unverified number) comes back as DATA the agent can explain — not a thrown error', async () => {
|
|
77
|
+
fetchSpy.mockResolvedValue(mockResponse({ message: 'caller_number is not a verified phone number' }, 400));
|
|
78
|
+
const result = await client.callTool({
|
|
79
|
+
name: 'set_phone_agent_caller_number',
|
|
80
|
+
arguments: { phone_agent_id: 'agent-1', caller_number: '+19998887777' },
|
|
81
|
+
});
|
|
82
|
+
// Not the SDK's exception envelope: our own structured refusal.
|
|
83
|
+
const payload = parseToolJson(result.content);
|
|
84
|
+
expect(payload).toMatchObject({ ok: false, status: 400 });
|
|
85
|
+
expect(JSON.stringify(payload)).toContain('not a verified phone number');
|
|
86
|
+
});
|
|
87
|
+
it('a 404 (foreign/missing agent) comes back as data too', async () => {
|
|
88
|
+
fetchSpy.mockResolvedValue(mockResponse({ message: 'Agent not found' }, 404));
|
|
89
|
+
const result = await client.callTool({
|
|
90
|
+
name: 'set_phone_agent_caller_number',
|
|
91
|
+
arguments: { phone_agent_id: 'nope', caller_number: null },
|
|
92
|
+
});
|
|
93
|
+
const payload = parseToolJson(result.content);
|
|
94
|
+
expect(payload).toMatchObject({ ok: false, status: 404 });
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
//# sourceMappingURL=phone-caller-number-tool.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phone-caller-number-tool.spec.js","sourceRoot":"","sources":["../src/phone-caller-number-tool.spec.ts"],"names":[],"mappings":"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"}
|