@opencx/mcp 1.15.30 → 1.15.31

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=inbox-view-tools.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox-view-tools.spec.d.ts","sourceRoot":"","sources":["../src/inbox-view-tools.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,152 @@
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 { z } from 'zod';
5
+ import { createServer } from './server.js';
6
+ describe('inbox view tools', () => {
7
+ let client;
8
+ let cleanup;
9
+ let fetchSpy;
10
+ const okResponse = () => new Response(JSON.stringify({ id: 'e4d9b2b0-0000-4000-8000-000000000000' }), {
11
+ status: 200,
12
+ statusText: 'OK',
13
+ });
14
+ const requestOf = (call) => {
15
+ const arg = fetchSpy.mock.calls[call]?.[0];
16
+ if (!(arg instanceof Request))
17
+ throw new Error('expected fetch to receive a Request');
18
+ return arg;
19
+ };
20
+ beforeEach(async () => {
21
+ fetchSpy = vi.fn();
22
+ vi.stubGlobal('fetch', fetchSpy);
23
+ const server = createServer('test-api-key', 'https://api.test.com');
24
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
25
+ await server.connect(serverTransport);
26
+ client = new Client({ name: 'test-client', version: '1.0.0' });
27
+ await client.connect(clientTransport);
28
+ cleanup = async () => {
29
+ await client.close();
30
+ await server.close();
31
+ };
32
+ });
33
+ afterEach(async () => {
34
+ await cleanup();
35
+ vi.unstubAllGlobals();
36
+ });
37
+ it('registers the four inbox view tools', async () => {
38
+ const { tools } = await client.listTools();
39
+ const names = tools.map((tool) => tool.name);
40
+ expect(names).toContain('list_inbox_views');
41
+ expect(names).toContain('create_inbox_view');
42
+ expect(names).toContain('update_inbox_view');
43
+ expect(names).toContain('delete_inbox_view');
44
+ });
45
+ it('creates a view with the filter set and share lists the caller gave', async () => {
46
+ fetchSpy.mockResolvedValue(okResponse());
47
+ const result = await client.callTool({
48
+ name: 'create_inbox_view',
49
+ arguments: {
50
+ name: 'Phone — needs a human',
51
+ filters: { channels: ['phone_voice'], status: [0], waiting_on: 'human_agents' },
52
+ shared_with_team_ids: ['team-1'],
53
+ },
54
+ });
55
+ expect(result.isError).toBeFalsy();
56
+ const request = requestOf(0);
57
+ expect(request.method).toBe('POST');
58
+ expect(request.url).toBe('https://api.test.com/inbox-views');
59
+ const body = z
60
+ .object({
61
+ name: z.string(),
62
+ filters: z.object({
63
+ channels: z.array(z.string()),
64
+ status: z.array(z.number()),
65
+ waiting_on: z.string(),
66
+ }),
67
+ shared_with_user_ids: z.array(z.number()),
68
+ shared_with_team_ids: z.array(z.string()),
69
+ })
70
+ .parse(JSON.parse(await request.clone().text()));
71
+ expect(body).toEqual({
72
+ name: 'Phone — needs a human',
73
+ filters: { channels: ['phone_voice'], status: [0], waiting_on: 'human_agents' },
74
+ // The route's own defaults, spelled out so the generated body type is satisfied.
75
+ shared_with_user_ids: [],
76
+ shared_with_team_ids: ['team-1'],
77
+ });
78
+ });
79
+ it('sends an empty filter set for a view over every session', async () => {
80
+ fetchSpy.mockResolvedValue(okResponse());
81
+ const result = await client.callTool({
82
+ name: 'create_inbox_view',
83
+ arguments: { name: 'Everything' },
84
+ });
85
+ expect(result.isError).toBeFalsy();
86
+ const body = z
87
+ .object({ filters: z.record(z.string(), z.unknown()) })
88
+ .parse(JSON.parse(await requestOf(0).clone().text()));
89
+ expect(body.filters).toEqual({});
90
+ });
91
+ it('carries the saved-view-only $current_user token and date preset through', async () => {
92
+ fetchSpy.mockResolvedValue(okResponse());
93
+ const result = await client.callTool({
94
+ name: 'create_inbox_view',
95
+ arguments: {
96
+ name: 'Mine today',
97
+ filters: { assignees: ['$current_user'], date: { preset: 'today' } },
98
+ },
99
+ });
100
+ expect(result.isError).toBeFalsy();
101
+ const body = z
102
+ .object({
103
+ filters: z.object({
104
+ assignees: z.array(z.union([z.number(), z.string()])),
105
+ date: z.object({ preset: z.string() }),
106
+ }),
107
+ })
108
+ .parse(JSON.parse(await requestOf(0).clone().text()));
109
+ expect(body.filters.assignees).toEqual(['$current_user']);
110
+ expect(body.filters.date).toEqual({ preset: 'today' });
111
+ });
112
+ it('rejects an unknown assignee token before any API call', async () => {
113
+ const result = await client.callTool({
114
+ name: 'create_inbox_view',
115
+ arguments: { name: 'Typo', filters: { assignees: ['$curent_user'] } },
116
+ });
117
+ expect(result.isError).toBe(true);
118
+ expect(fetchSpy).not.toHaveBeenCalled();
119
+ });
120
+ it('patches by id without putting the id in the body', async () => {
121
+ fetchSpy.mockResolvedValue(okResponse());
122
+ const result = await client.callTool({
123
+ name: 'update_inbox_view',
124
+ arguments: {
125
+ id: 'e4d9b2b0-0000-4000-8000-000000000000',
126
+ name: 'Phone — escalations',
127
+ group_by: null,
128
+ },
129
+ });
130
+ expect(result.isError).toBeFalsy();
131
+ const request = requestOf(0);
132
+ expect(request.method).toBe('PATCH');
133
+ expect(request.url).toBe('https://api.test.com/inbox-views/e4d9b2b0-0000-4000-8000-000000000000');
134
+ const body = z
135
+ .object({ name: z.string(), group_by: z.null() })
136
+ .strict()
137
+ .parse(JSON.parse(await request.clone().text()));
138
+ expect(body).toEqual({ name: 'Phone — escalations', group_by: null });
139
+ });
140
+ it('deletes by id', async () => {
141
+ fetchSpy.mockResolvedValue(okResponse());
142
+ const result = await client.callTool({
143
+ name: 'delete_inbox_view',
144
+ arguments: { id: 'e4d9b2b0-0000-4000-8000-000000000000' },
145
+ });
146
+ expect(result.isError).toBeFalsy();
147
+ const request = requestOf(0);
148
+ expect(request.method).toBe('DELETE');
149
+ expect(request.url).toBe('https://api.test.com/inbox-views/e4d9b2b0-0000-4000-8000-000000000000');
150
+ });
151
+ });
152
+ //# sourceMappingURL=inbox-view-tools.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox-view-tools.spec.js","sourceRoot":"","sources":["../src/inbox-view-tools.spec.ts"],"names":[],"mappings":"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"}