@opencx/mcp 1.11.82 → 1.11.84

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=filter-sessions-dates.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-sessions-dates.spec.d.ts","sourceRoot":"","sources":["../src/filter-sessions-dates.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,89 @@
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
+ // Prod agents kept sending date-only strings ("2026-06-01") to
7
+ // `filter_sessions`, which the backend rejects with 400 "Invalid ISO
8
+ // datetime" on `filters.date.from/to`. The schema now validates full ISO
9
+ // datetimes at the MCP layer so the failure is immediate and names the
10
+ // expected format instead of surfacing as an opaque API 400.
11
+ describe('filter_sessions date validation', () => {
12
+ let client;
13
+ let cleanup;
14
+ let fetchSpy;
15
+ beforeEach(async () => {
16
+ fetchSpy = vi.fn();
17
+ vi.stubGlobal('fetch', fetchSpy);
18
+ const server = createServer('test-api-key', 'https://api.test.com');
19
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
20
+ await server.connect(serverTransport);
21
+ client = new Client({ name: 'test-client', version: '1.0.0' });
22
+ await client.connect(clientTransport);
23
+ cleanup = async () => {
24
+ await client.close();
25
+ await server.close();
26
+ };
27
+ });
28
+ afterEach(async () => {
29
+ await cleanup();
30
+ vi.unstubAllGlobals();
31
+ });
32
+ it('rejects date-only strings before any API call', async () => {
33
+ const result = await client.callTool({
34
+ name: 'filter_sessions',
35
+ arguments: { date_from: '2026-06-01', date_to: '2026-06-08' },
36
+ });
37
+ expect(result.isError).toBe(true);
38
+ const text = JSON.stringify(result.content);
39
+ expect(text).toContain('Invalid datetime');
40
+ expect(text).toContain('date_from');
41
+ expect(fetchSpy).not.toHaveBeenCalled();
42
+ });
43
+ // The backend DTO validates with bare `.datetime()` (UTC `Z` only), so the
44
+ // MCP schema must reject offsets too — `{ offset: true }` here would pass
45
+ // values the backend still 400s on.
46
+ it('rejects timezone-offset datetimes the backend would 400 on', async () => {
47
+ const result = await client.callTool({
48
+ name: 'filter_sessions',
49
+ arguments: { date_from: '2026-06-01T00:00:00+02:00' },
50
+ });
51
+ expect(result.isError).toBe(true);
52
+ expect(JSON.stringify(result.content)).toContain('Invalid datetime');
53
+ expect(fetchSpy).not.toHaveBeenCalled();
54
+ });
55
+ it('still works with no dates at all (most common call)', async () => {
56
+ fetchSpy.mockResolvedValue(new Response(JSON.stringify({ items: [], total: 0 }), { status: 200, statusText: 'OK' }));
57
+ const result = await client.callTool({ name: 'filter_sessions', arguments: {} });
58
+ expect(result.isError).toBeFalsy();
59
+ expect(fetchSpy).toHaveBeenCalledTimes(1);
60
+ const arg = fetchSpy.mock.calls[0]?.[0];
61
+ if (!(arg instanceof Request))
62
+ throw new Error('expected fetch to receive a Request');
63
+ const body = z
64
+ .object({ filters: z.object({ date: z.unknown().optional() }) })
65
+ .parse(JSON.parse(await arg.clone().text()));
66
+ expect(body.filters.date).toBeUndefined();
67
+ });
68
+ it('accepts full ISO 8601 datetimes and forwards them as the date filter', async () => {
69
+ fetchSpy.mockResolvedValue(new Response(JSON.stringify({ items: [], total: 0 }), { status: 200, statusText: 'OK' }));
70
+ const result = await client.callTool({
71
+ name: 'filter_sessions',
72
+ arguments: { date_from: '2026-06-01T00:00:00Z', date_to: '2026-06-08T23:59:59Z' },
73
+ });
74
+ expect(result.isError).toBeFalsy();
75
+ expect(fetchSpy).toHaveBeenCalledTimes(1);
76
+ // openapi-fetch always passes a fully-built Request as the first arg.
77
+ const arg = fetchSpy.mock.calls[0]?.[0];
78
+ if (!(arg instanceof Request))
79
+ throw new Error('expected fetch to receive a Request');
80
+ const body = z
81
+ .object({ filters: z.object({ date: z.object({ from: z.string(), to: z.string() }) }) })
82
+ .parse(JSON.parse(await arg.clone().text()));
83
+ expect(body.filters.date).toEqual({
84
+ from: '2026-06-01T00:00:00Z',
85
+ to: '2026-06-08T23:59:59Z',
86
+ });
87
+ });
88
+ });
89
+ //# sourceMappingURL=filter-sessions-dates.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-sessions-dates.spec.js","sourceRoot":"","sources":["../src/filter-sessions-dates.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=restrictions.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restrictions.spec.d.ts","sourceRoot":"","sources":["../src/restrictions.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,150 @@
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
+ const text = typeof body === 'string' ? body : JSON.stringify(body);
7
+ if (status === 204)
8
+ return new Response(null, { status, statusText });
9
+ return new Response(text, { status, statusText });
10
+ }
11
+ function getRequestUrl(call) {
12
+ const arg = call[0];
13
+ if (arg instanceof Request)
14
+ return arg.url;
15
+ return String(arg);
16
+ }
17
+ function getRequestMethod(call) {
18
+ const arg = call[0];
19
+ if (arg instanceof Request)
20
+ return arg.method;
21
+ const opts = call[1];
22
+ return opts.method ?? 'GET';
23
+ }
24
+ async function getRequestBody(call) {
25
+ const arg = call[0];
26
+ if (arg instanceof Request) {
27
+ const text = await arg.clone().text();
28
+ return text ? JSON.parse(text) : undefined;
29
+ }
30
+ const opts = call[1];
31
+ return opts.body ? JSON.parse(opts.body) : undefined;
32
+ }
33
+ describe('data-source restriction tools', () => {
34
+ let client;
35
+ let cleanup;
36
+ let fetchSpy;
37
+ beforeEach(async () => {
38
+ fetchSpy = vi.fn();
39
+ vi.stubGlobal('fetch', fetchSpy);
40
+ const server = createServer('test-api-key', 'https://api.test.com');
41
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
42
+ await server.connect(serverTransport);
43
+ client = new Client({ name: 'test-client', version: '1.0.0' });
44
+ await client.connect(clientTransport);
45
+ cleanup = async () => {
46
+ await client.close();
47
+ await server.close();
48
+ };
49
+ });
50
+ afterEach(async () => {
51
+ await cleanup();
52
+ vi.restoreAllMocks();
53
+ });
54
+ it('registers the new restriction tools', async () => {
55
+ const { tools } = await client.listTools();
56
+ const names = tools.map((t) => t.name);
57
+ expect(names).toContain('update_datasource');
58
+ expect(names).toContain('list_knowledgebase_items');
59
+ expect(names).toContain('update_knowledgebase_item');
60
+ expect(names).toContain('set_instruction_restrictions');
61
+ });
62
+ it('update_datasource PATCHes channel restrictions', async () => {
63
+ fetchSpy.mockResolvedValueOnce(mockResponse({ id: 'ds-1', restricted_to_channels: ['web'] }));
64
+ const result = await client.callTool({
65
+ name: 'update_datasource',
66
+ arguments: { id: 'ds-1', restricted_to_channels: ['web', 'email'] },
67
+ });
68
+ const call = fetchSpy.mock.calls[0];
69
+ expect(getRequestUrl(call)).toBe('https://api.test.com/crawl/ds-1');
70
+ expect(getRequestMethod(call)).toBe('PATCH');
71
+ expect(await getRequestBody(call)).toEqual({ restricted_to_channels: ['web', 'email'] });
72
+ expect(result.isError).toBeFalsy();
73
+ });
74
+ it('update_datasource rejects an invalid channel before calling the API', async () => {
75
+ const result = await client.callTool({
76
+ name: 'update_datasource',
77
+ arguments: { id: 'ds-1', restricted_to_channels: ['not_a_channel'] },
78
+ });
79
+ expect(result.isError).toBe(true);
80
+ expect(fetchSpy).not.toHaveBeenCalled();
81
+ });
82
+ it('list_knowledgebase_items GETs with filters', async () => {
83
+ fetchSpy.mockResolvedValueOnce(mockResponse({ items: [], pagination: {} }));
84
+ await client.callTool({
85
+ name: 'list_knowledgebase_items',
86
+ arguments: { data_source: 'website', search: 'returns', limit: '50' },
87
+ });
88
+ const call = fetchSpy.mock.calls[0];
89
+ const url = getRequestUrl(call);
90
+ expect(url).toContain('https://api.test.com/knowledgebase-items');
91
+ expect(url).toContain('data_source=website');
92
+ expect(url).toContain('search=returns');
93
+ expect(url).toContain('limit=50');
94
+ expect(getRequestMethod(call)).toBe('GET');
95
+ });
96
+ it('update_knowledgebase_item PUTs segment restrictions', async () => {
97
+ fetchSpy.mockResolvedValueOnce(mockResponse({ id: 'kb-1', restricted_to_segments: ['seg-1'] }));
98
+ const result = await client.callTool({
99
+ name: 'update_knowledgebase_item',
100
+ arguments: { id: 'kb-1', restricted_to_segments: ['seg-1'] },
101
+ });
102
+ const call = fetchSpy.mock.calls[0];
103
+ expect(getRequestUrl(call)).toBe('https://api.test.com/knowledgebase-items/kb-1');
104
+ expect(getRequestMethod(call)).toBe('PUT');
105
+ expect(await getRequestBody(call)).toEqual({ restricted_to_segments: ['seg-1'] });
106
+ expect(result.isError).toBeFalsy();
107
+ });
108
+ it('update_knowledgebase_item PUTs channel + schedule restrictions', async () => {
109
+ fetchSpy.mockResolvedValueOnce(mockResponse({ id: 'kb-1' }));
110
+ const result = await client.callTool({
111
+ name: 'update_knowledgebase_item',
112
+ arguments: {
113
+ id: 'kb-1',
114
+ restricted_to_channels: ['web', 'whatsapp'],
115
+ start_time: '2026-06-01T00:00:00.000Z',
116
+ end_time: null,
117
+ },
118
+ });
119
+ const call = fetchSpy.mock.calls[0];
120
+ expect(getRequestUrl(call)).toBe('https://api.test.com/knowledgebase-items/kb-1');
121
+ expect(getRequestMethod(call)).toBe('PUT');
122
+ expect(await getRequestBody(call)).toEqual({
123
+ restricted_to_channels: ['web', 'whatsapp'],
124
+ start_time: '2026-06-01T00:00:00.000Z',
125
+ end_time: null,
126
+ });
127
+ expect(result.isError).toBeFalsy();
128
+ });
129
+ it('update_knowledgebase_item rejects an invalid channel before calling the API', async () => {
130
+ const result = await client.callTool({
131
+ name: 'update_knowledgebase_item',
132
+ arguments: { id: 'kb-1', restricted_to_channels: ['nope'] },
133
+ });
134
+ expect(result.isError).toBe(true);
135
+ expect(fetchSpy).not.toHaveBeenCalled();
136
+ });
137
+ it('set_instruction_restrictions PUTs to the restrictions endpoint', async () => {
138
+ fetchSpy.mockResolvedValueOnce(mockResponse({ id: 'i-1', restricted_to_segments: ['seg-1'], restricted_to_channels: [] }));
139
+ const result = await client.callTool({
140
+ name: 'set_instruction_restrictions',
141
+ arguments: { id: 'i-1', restricted_to_segments: ['seg-1'] },
142
+ });
143
+ const call = fetchSpy.mock.calls[0];
144
+ expect(getRequestUrl(call)).toBe('https://api.test.com/training/i-1/restrictions');
145
+ expect(getRequestMethod(call)).toBe('PUT');
146
+ expect(await getRequestBody(call)).toEqual({ restricted_to_segments: ['seg-1'] });
147
+ expect(result.isError).toBeFalsy();
148
+ });
149
+ });
150
+ //# sourceMappingURL=restrictions.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restrictions.spec.js","sourceRoot":"","sources":["../src/restrictions.spec.ts"],"names":[],"mappings":"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"}