@opencx/mcp 1.6.0 → 1.8.0

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=api-client.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.spec.d.ts","sourceRoot":"","sources":["../src/api-client.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,139 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { ApiError, safePath, OpenCXClient } from './api-client.js';
3
+ describe('ApiError', () => {
4
+ it('stores status, statusText, and body', () => {
5
+ const err = new ApiError(404, 'Not Found', '{"error":"missing"}');
6
+ expect(err.status).toBe(404);
7
+ expect(err.statusText).toBe('Not Found');
8
+ expect(err.body).toBe('{"error":"missing"}');
9
+ expect(err.name).toBe('ApiError');
10
+ expect(err.message).toContain('404');
11
+ });
12
+ });
13
+ describe('safePath', () => {
14
+ it('allows a normal id', () => {
15
+ expect(safePath('abc-123')).toBe('abc-123');
16
+ });
17
+ it('allows a uuid', () => {
18
+ const uuid = '550e8400-e29b-41d4-a716-446655440000';
19
+ expect(safePath(uuid)).toBe(uuid);
20
+ });
21
+ it('rejects empty string', () => {
22
+ expect(() => safePath('')).toThrow('Invalid path parameter');
23
+ });
24
+ it('rejects forward slashes', () => {
25
+ expect(() => safePath('../../etc/passwd')).toThrow('Invalid path parameter');
26
+ });
27
+ it('rejects backslashes', () => {
28
+ expect(() => safePath('foo\\bar')).toThrow('Invalid path parameter');
29
+ });
30
+ it('rejects bare ..', () => {
31
+ expect(() => safePath('..')).toThrow('Invalid path parameter');
32
+ });
33
+ it('rejects encoded slashes', () => {
34
+ expect(() => safePath('..%2F..%2Fetc')).toThrow('Invalid path parameter');
35
+ });
36
+ });
37
+ describe('OpenCXClient', () => {
38
+ let fetchSpy;
39
+ beforeEach(() => {
40
+ fetchSpy = vi.fn();
41
+ vi.stubGlobal('fetch', fetchSpy);
42
+ });
43
+ afterEach(() => {
44
+ vi.restoreAllMocks();
45
+ });
46
+ function mockResponse(body, status = 200) {
47
+ fetchSpy.mockResolvedValueOnce({
48
+ ok: status >= 200 && status < 300,
49
+ status,
50
+ statusText: status === 200 ? 'OK' : 'Bad Request',
51
+ text: () => Promise.resolve(JSON.stringify(body)),
52
+ });
53
+ }
54
+ it('strips trailing slash from baseUrl', () => {
55
+ const client = new OpenCXClient('key-123', 'https://api.example.com/');
56
+ mockResponse({ ok: true });
57
+ void client.get('/test');
58
+ expect(fetchSpy).toHaveBeenCalledWith('https://api.example.com/test', expect.objectContaining({ method: 'GET' }));
59
+ });
60
+ it('sets Authorization header with Bearer token', () => {
61
+ const client = new OpenCXClient('my-api-key', 'https://api.example.com');
62
+ mockResponse({ ok: true });
63
+ void client.get('/test');
64
+ expect(fetchSpy).toHaveBeenCalledWith(expect.anything(), expect.objectContaining({
65
+ headers: expect.objectContaining({
66
+ Authorization: 'Bearer my-api-key',
67
+ 'Content-Type': 'application/json',
68
+ }),
69
+ }));
70
+ });
71
+ it('GET appends query params', async () => {
72
+ const client = new OpenCXClient('key', 'https://api.example.com');
73
+ mockResponse({ items: [] });
74
+ await client.get('/contacts/', { cursor: 'abc', empty: undefined });
75
+ const url = fetchSpy.mock.calls[0][0];
76
+ expect(url).toBe('https://api.example.com/contacts/?cursor=abc');
77
+ });
78
+ it('POST sends JSON body', async () => {
79
+ const client = new OpenCXClient('key', 'https://api.example.com');
80
+ mockResponse({ id: '1' });
81
+ await client.post('/contacts/', { name: 'Alice' });
82
+ const opts = fetchSpy.mock.calls[0][1];
83
+ expect(opts.method).toBe('POST');
84
+ expect(opts.body).toBe(JSON.stringify({ name: 'Alice' }));
85
+ });
86
+ it('PATCH sends JSON body', async () => {
87
+ const client = new OpenCXClient('key', 'https://api.example.com');
88
+ mockResponse({ id: '1' });
89
+ await client.patch('/contacts/1', { name: 'Bob' });
90
+ const opts = fetchSpy.mock.calls[0][1];
91
+ expect(opts.method).toBe('PATCH');
92
+ });
93
+ it('PUT sends JSON body', async () => {
94
+ const client = new OpenCXClient('key', 'https://api.example.com');
95
+ mockResponse({ ok: true });
96
+ await client.put('/settings', { value: true });
97
+ const opts = fetchSpy.mock.calls[0][1];
98
+ expect(opts.method).toBe('PUT');
99
+ });
100
+ it('DELETE sends no body', async () => {
101
+ const client = new OpenCXClient('key', 'https://api.example.com');
102
+ mockResponse({});
103
+ await client.delete('/contacts/1');
104
+ const opts = fetchSpy.mock.calls[0][1];
105
+ expect(opts.method).toBe('DELETE');
106
+ expect(opts.body).toBeUndefined();
107
+ });
108
+ it('throws ApiError on non-ok response', async () => {
109
+ const client = new OpenCXClient('key', 'https://api.example.com');
110
+ fetchSpy.mockResolvedValueOnce({
111
+ ok: false,
112
+ status: 401,
113
+ statusText: 'Unauthorized',
114
+ text: () => Promise.resolve('invalid key'),
115
+ });
116
+ await expect(client.get('/org/')).rejects.toThrow(ApiError);
117
+ await expect((async () => {
118
+ fetchSpy.mockResolvedValueOnce({
119
+ ok: false,
120
+ status: 401,
121
+ statusText: 'Unauthorized',
122
+ text: () => Promise.resolve('invalid key'),
123
+ });
124
+ return client.get('/org/');
125
+ })()).rejects.toMatchObject({ status: 401, body: 'invalid key' });
126
+ });
127
+ it('returns undefined for empty response body', async () => {
128
+ const client = new OpenCXClient('key', 'https://api.example.com');
129
+ fetchSpy.mockResolvedValueOnce({
130
+ ok: true,
131
+ status: 204,
132
+ statusText: 'No Content',
133
+ text: () => Promise.resolve(''),
134
+ });
135
+ const result = await client.delete('/contacts/1');
136
+ expect(result).toBeUndefined();
137
+ });
138
+ });
139
+ //# sourceMappingURL=api-client.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.spec.js","sourceRoot":"","sources":["../src/api-client.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEnE,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,qBAAqB,CAAC,CAAC;QAClE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC7C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE;QACvB,MAAM,IAAI,GAAG,sCAAsC,CAAC;QACpD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;QACzB,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAI,QAAkC,CAAC;IAEvC,UAAU,CAAC,GAAG,EAAE;QACd,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACnB,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,SAAS,YAAY,CAAC,IAAa,EAAE,MAAM,GAAG,GAAG;QAC/C,QAAQ,CAAC,qBAAqB,CAAC;YAC7B,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;YACjC,MAAM;YACN,UAAU,EAAE,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa;YACjD,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;SAClD,CAAC,CAAC;IACL,CAAC;IAED,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,SAAS,EAAE,0BAA0B,CAAC,CAAC;QACvE,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAE3B,KAAK,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAEzB,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CACnC,8BAA8B,EAC9B,MAAM,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAC3C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,YAAY,EAAE,yBAAyB,CAAC,CAAC;QACzE,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAE3B,KAAK,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAEzB,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CACnC,MAAM,CAAC,QAAQ,EAAE,EACjB,MAAM,CAAC,gBAAgB,CAAC;YACtB,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC;gBAC/B,aAAa,EAAE,mBAAmB;gBAClC,cAAc,EAAE,kBAAkB;aACnC,CAAC;SACH,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;QAClE,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAE5B,MAAM,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAEpE,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC;QAChD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QACpC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;QAClE,YAAY,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QAE1B,MAAM,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAEnD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAgB,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;QAClE,YAAY,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QAE1B,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAEnD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAgB,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;QAClE,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAE3B,MAAM,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAE/C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAgB,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QACpC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;QAClE,YAAY,CAAC,EAAE,CAAC,CAAC;QAEjB,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAEnC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAgB,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;QAClE,QAAQ,CAAC,qBAAqB,CAAC;YAC7B,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,cAAc;YAC1B,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;SAC3C,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5D,MAAM,MAAM,CACV,CAAC,KAAK,IAAI,EAAE;YACV,QAAQ,CAAC,qBAAqB,CAAC;gBAC7B,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG;gBACX,UAAU,EAAE,cAAc;gBAC1B,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;aAC3C,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC,CAAC,EAAE,CACL,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;QAClE,QAAQ,CAAC,qBAAqB,CAAC;YAC7B,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,YAAY;YACxB,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;SAChC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAuBpE,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CA8BvE"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAwBpE,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CA+BvE"}
package/dist/server.js CHANGED
@@ -19,6 +19,7 @@ import { registerTagTools } from './tools/tags.js';
19
19
  import { registerCsatTools } from './tools/csat.js';
20
20
  import { registerWhatsAppTools } from './tools/whatsapp.js';
21
21
  import { registerHandoffAnalyticsTools } from './tools/handoff-analytics.js';
22
+ import { registerSlaAnalyticsTools } from './tools/sla-analytics.js';
22
23
  import { registerWorkflowTools } from './tools/workflows.js';
23
24
  export function createServer(apiKey, baseUrl) {
24
25
  const server = new McpServer({
@@ -45,6 +46,7 @@ export function createServer(apiKey, baseUrl) {
45
46
  registerCsatTools(server, client);
46
47
  registerWhatsAppTools(server, client);
47
48
  registerHandoffAnalyticsTools(server, client);
49
+ registerSlaAnalyticsTools(server, client);
48
50
  registerWorkflowTools(server, client);
49
51
  return server;
50
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.spec.d.ts","sourceRoot":"","sources":["../src/server.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,109 @@
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
+ const EXPECTED_TOOL_PREFIXES = [
6
+ 'list_contacts',
7
+ 'create_contact',
8
+ 'get_organization',
9
+ 'search',
10
+ 'list_sessions',
11
+ 'list_training_scenarios',
12
+ 'list_actions',
13
+ 'list_teams',
14
+ ];
15
+ describe('MCP Server', () => {
16
+ let client;
17
+ let cleanup;
18
+ let fetchSpy;
19
+ beforeEach(async () => {
20
+ fetchSpy = vi.fn();
21
+ vi.stubGlobal('fetch', fetchSpy);
22
+ const server = createServer('test-api-key', 'https://api.test.com');
23
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
24
+ await server.connect(serverTransport);
25
+ client = new Client({ name: 'test-client', version: '1.0.0' });
26
+ await client.connect(clientTransport);
27
+ cleanup = async () => {
28
+ await client.close();
29
+ await server.close();
30
+ };
31
+ });
32
+ afterEach(async () => {
33
+ await cleanup();
34
+ vi.restoreAllMocks();
35
+ });
36
+ it('completes the MCP handshake', () => {
37
+ const version = client.getServerVersion();
38
+ expect(version).toBeDefined();
39
+ expect(version?.name).toBe('OpenCX');
40
+ });
41
+ it('registers tools that are discoverable via listTools', async () => {
42
+ const { tools } = await client.listTools();
43
+ expect(tools.length).toBeGreaterThan(0);
44
+ const toolNames = tools.map((t) => t.name);
45
+ for (const prefix of EXPECTED_TOOL_PREFIXES) {
46
+ expect(toolNames).toContain(prefix);
47
+ }
48
+ });
49
+ it('every tool has a description and input schema', async () => {
50
+ const { tools } = await client.listTools();
51
+ for (const tool of tools) {
52
+ expect(tool.description, `${tool.name} has no description`).toBeTruthy();
53
+ expect(tool.inputSchema, `${tool.name} has no input schema`).toBeDefined();
54
+ expect(tool.inputSchema.type).toBe('object');
55
+ }
56
+ });
57
+ it('calls a tool that proxies to the API client', async () => {
58
+ fetchSpy.mockResolvedValueOnce({
59
+ ok: true,
60
+ status: 200,
61
+ statusText: 'OK',
62
+ text: () => Promise.resolve(JSON.stringify({ name: 'Test Org' })),
63
+ });
64
+ const result = await client.callTool({
65
+ name: 'get_organization',
66
+ arguments: {},
67
+ });
68
+ expect(fetchSpy).toHaveBeenCalledOnce();
69
+ const [url, opts] = fetchSpy.mock.calls[0];
70
+ expect(url).toBe('https://api.test.com/org/');
71
+ expect(opts.headers['Authorization']).toBe('Bearer test-api-key');
72
+ expect(result.content).toBeDefined();
73
+ const content = result.content;
74
+ expect(content[0].type).toBe('text');
75
+ expect(JSON.parse(content[0].text)).toEqual({ name: 'Test Org' });
76
+ });
77
+ it('returns isError when the API returns non-ok', async () => {
78
+ fetchSpy.mockResolvedValueOnce({
79
+ ok: false,
80
+ status: 500,
81
+ statusText: 'Internal Server Error',
82
+ text: () => Promise.resolve('boom'),
83
+ });
84
+ const result = await client.callTool({
85
+ name: 'get_organization',
86
+ arguments: {},
87
+ });
88
+ expect(result.isError).toBe(true);
89
+ const content = result.content;
90
+ expect(content[0].text).toContain('500');
91
+ });
92
+ it('passes arguments through to the API', async () => {
93
+ fetchSpy.mockResolvedValueOnce({
94
+ ok: true,
95
+ status: 200,
96
+ statusText: 'OK',
97
+ text: () => Promise.resolve(JSON.stringify({ id: '1', name: 'Updated Org' })),
98
+ });
99
+ await client.callTool({
100
+ name: 'update_organization',
101
+ arguments: { name: 'New Name' },
102
+ });
103
+ expect(fetchSpy).toHaveBeenCalledOnce();
104
+ const [, opts] = fetchSpy.mock.calls[0];
105
+ expect(opts.method).toBe('PATCH');
106
+ expect(JSON.parse(opts.body)).toEqual({ name: 'New Name' });
107
+ });
108
+ });
109
+ //# sourceMappingURL=server.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.spec.js","sourceRoot":"","sources":["../src/server.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { OpenCXClient } from '../api-client.js';
3
+ export declare function registerSlaAnalyticsTools(server: McpServer, client: OpenCXClient): void;
4
+ //# sourceMappingURL=sla-analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sla-analytics.d.ts","sourceRoot":"","sources":["../../src/tools/sla-analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAkBhD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,QAqFhF"}
@@ -0,0 +1,80 @@
1
+ import { z } from 'zod';
2
+ const slaFilters = {
3
+ from: z.string().describe('Start date in ISO 8601 format (e.g. "2025-01-01")'),
4
+ to: z.string().describe('End date in ISO 8601 format (e.g. "2025-01-31")'),
5
+ timezone: z
6
+ .string()
7
+ .optional()
8
+ .describe('IANA timezone for date boundaries (e.g. "America/New_York"). Defaults to UTC.'),
9
+ policy_id: z.string().optional().describe('Filter by SLA policy ID'),
10
+ team_id: z.string().optional().describe('Filter by team ID'),
11
+ channel: z
12
+ .string()
13
+ .optional()
14
+ .describe('Filter by channel (e.g. "web", "whatsapp", "email", "phone")'),
15
+ agent_id: z.string().optional().describe('Filter by agent ID'),
16
+ };
17
+ export function registerSlaAnalyticsTools(server, client) {
18
+ server.tool('get_sla_analytics_overview', 'Get SLA analytics overview including compliance rates (overall, first reply, next reply, resolution), coverage rate, and response/resolution time percentiles (p50, p90, p95) for a date range.', slaFilters, async (params) => {
19
+ const data = await client.get('/sla/analytics', {
20
+ from: params.from,
21
+ to: params.to,
22
+ timezone: params.timezone,
23
+ policy_id: params.policy_id,
24
+ team_id: params.team_id,
25
+ channel: params.channel,
26
+ agent_id: params.agent_id,
27
+ });
28
+ return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
29
+ });
30
+ server.tool('get_sla_analytics_breakdown', 'Get SLA compliance rates grouped by policy, team, agent, or channel. Each group includes session count, compliance metrics, and time percentiles.', {
31
+ ...slaFilters,
32
+ group_by: z
33
+ .enum(['policy', 'team', 'agent', 'channel'])
34
+ .describe('Dimension to group results by'),
35
+ }, async (params) => {
36
+ const data = await client.get('/sla/analytics/breakdown', {
37
+ from: params.from,
38
+ to: params.to,
39
+ timezone: params.timezone,
40
+ policy_id: params.policy_id,
41
+ team_id: params.team_id,
42
+ channel: params.channel,
43
+ agent_id: params.agent_id,
44
+ group_by: params.group_by,
45
+ });
46
+ return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
47
+ });
48
+ server.tool('get_sla_analytics_trend', 'Get SLA compliance rates over time, grouped by day or week. Returns a time series of compliance metrics and percentiles for each period.', {
49
+ ...slaFilters,
50
+ granularity: z
51
+ .enum(['day', 'week'])
52
+ .optional()
53
+ .describe('Time granularity for the trend data. Defaults to "day".'),
54
+ }, async (params) => {
55
+ const data = await client.get('/sla/analytics/trend', {
56
+ from: params.from,
57
+ to: params.to,
58
+ timezone: params.timezone,
59
+ policy_id: params.policy_id,
60
+ team_id: params.team_id,
61
+ channel: params.channel,
62
+ agent_id: params.agent_id,
63
+ granularity: params.granularity,
64
+ });
65
+ return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
66
+ });
67
+ server.tool('get_sla_breach_heatmap', 'Get a heatmap of SLA breaches by hour of day (0-23) and day of week (0=Sunday to 6=Saturday). Useful for identifying patterns in when SLA breaches occur.', slaFilters, async (params) => {
68
+ const data = await client.get('/sla/analytics/breach-heatmap', {
69
+ from: params.from,
70
+ to: params.to,
71
+ timezone: params.timezone,
72
+ policy_id: params.policy_id,
73
+ team_id: params.team_id,
74
+ channel: params.channel,
75
+ agent_id: params.agent_id,
76
+ });
77
+ return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
78
+ });
79
+ }
80
+ //# sourceMappingURL=sla-analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sla-analytics.js","sourceRoot":"","sources":["../../src/tools/sla-analytics.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../src/tools/workflows.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAY,MAAM,kBAAkB,CAAC;AAE1D,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,QAwE5E"}
1
+ {"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../src/tools/workflows.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAY,MAAM,kBAAkB,CAAC;AAgF1D,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,QAgM5E"}
@@ -1,30 +1,174 @@
1
1
  import { z } from 'zod';
2
2
  import { safePath } from '../api-client.js';
3
+ const TRIGGER_TYPES = [
4
+ 'manual-trigger',
5
+ 'ai-trigger',
6
+ 'cron-trigger',
7
+ 'form-trigger',
8
+ 'webhook',
9
+ 'contact-created',
10
+ 'phone-call-started',
11
+ 'phone-call-finished',
12
+ 'ticket-created',
13
+ 'ticket-reassigned',
14
+ 'ticket-resolved',
15
+ 'ticket-handoff',
16
+ 'pre-ticket-handoff',
17
+ 'ticket-tag-added',
18
+ 'ticket-inactive',
19
+ 'sequence-completed',
20
+ 'csat-score-submit',
21
+ 'prohibited-topic-detected',
22
+ 'sla-first-reply-breached',
23
+ 'sla-next-reply-breached',
24
+ 'sla-resolution-breached',
25
+ ];
26
+ const triggerTypeSchema = z
27
+ .enum(TRIGGER_TYPES)
28
+ .describe('What starts the workflow. Common: "manual-trigger" (on-demand), "ai-trigger" (AI-initiated), ' +
29
+ '"webhook" (HTTP), "cron-trigger" (scheduled). Event-based: "ticket-created", "contact-created", etc. ' +
30
+ 'Call list_workflow_definitions to see all available types.');
31
+ const actionStepSchema = z
32
+ .object({
33
+ $kind: z.literal('Action'),
34
+ id: z.string().describe('Unique step ID (e.g. "step_1"). Used in references like {{step_1.output.field}}'),
35
+ type: z
36
+ .string()
37
+ .describe('Action type from list_workflow_definitions (e.g. "ask-ai", "hold-value", "send-webhook", "tag-ticket")'),
38
+ name: z.string().describe('Display name for this step'),
39
+ input: z
40
+ .record(z.string(), z.unknown())
41
+ .describe('Input fields for this action. See input_fields from list_workflow_definitions for available fields.'),
42
+ })
43
+ .describe('An action step that performs a single operation');
44
+ const conditionSchema = z
45
+ .object({
46
+ operatorName: z
47
+ .string()
48
+ .describe('Comparison operator: "equals", "not_equals", "contains", "not_contains", "greater_than", "less_than", "is_empty", "is_not_empty", "and", "or"'),
49
+ left: z.unknown().describe('Left operand — static value or {{step_id.output.field}} reference'),
50
+ right: z.unknown().optional().describe('Right operand (not needed for unary operators like is_empty)'),
51
+ })
52
+ .describe('A condition for if-else/switch blocks');
53
+ const blockStepSchema = z
54
+ .object({
55
+ $kind: z.literal('Block'),
56
+ type: z.enum(['if-else', 'switch']).describe('Block type'),
57
+ id: z.string().describe('Unique block ID'),
58
+ inputs: z.object({
59
+ condition: conditionSchema,
60
+ }),
61
+ branches: z
62
+ .record(z.string(), z.array(z.record(z.string(), z.unknown())))
63
+ .describe('Branch name → array of steps. For if-else: "then" and "else". For switch: "branch_0", "branch_1", "default".'),
64
+ })
65
+ .describe('A control-flow block (if-else or switch) that branches execution');
66
+ const workflowBlockSchema = z
67
+ .union([actionStepSchema, blockStepSchema])
68
+ .describe('A workflow step: either an Action or a Block');
3
69
  export function registerWorkflowTools(server, client) {
4
- server.tool('list_workflows', 'List all workflows in your organization. Workflows automate multi-step processes triggered by events, schedules, webhooks, or manual action. Returns the latest version of each workflow with its name, trigger type, and active status.', {}, async () => {
70
+ server.tool('list_workflow_definitions', 'List all available workflow action types (with their input/output field schemas), trigger types, and block types. ' +
71
+ 'ALWAYS call this first before creating a workflow — it tells you exactly what action types exist, ' +
72
+ 'what input fields each action expects, and what output fields you can reference with {{step_id.output.field}}.', {}, async () => {
73
+ const data = await client.get('/workflows/definitions');
74
+ return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
75
+ });
76
+ server.tool('validate_workflow', 'Validate workflow blocks without creating a workflow. Returns issues and action types used. ' +
77
+ 'Use before create_workflow to catch errors early.', {
78
+ trigger_type: triggerTypeSchema,
79
+ workflow_blocks: z.array(workflowBlockSchema).describe('Workflow blocks to validate'),
80
+ }, async ({ trigger_type, workflow_blocks }) => {
81
+ const data = await client.post('/workflows/validate', {
82
+ trigger_type,
83
+ workflow_blocks,
84
+ });
85
+ return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
86
+ });
87
+ server.tool('create_workflow', 'Create a new workflow. Created as an inactive draft — use activate_workflow to make it live. ' +
88
+ 'IMPORTANT: Call list_workflow_definitions first to see available action types and their input fields.', {
89
+ name: z.string().describe('Workflow name'),
90
+ description: z.string().optional().describe('Workflow description'),
91
+ trigger_type: triggerTypeSchema,
92
+ trigger_configuration: z
93
+ .record(z.string(), z.unknown())
94
+ .optional()
95
+ .describe('Trigger-specific config (e.g. cron expression for cron-trigger)'),
96
+ trigger_constraints: z
97
+ .record(z.string(), z.unknown())
98
+ .optional()
99
+ .describe('JSON Logic constraints that must be satisfied for the trigger to fire'),
100
+ workflow_blocks: z
101
+ .array(workflowBlockSchema)
102
+ .describe('Workflow steps and blocks. Use {{step_id.output.field}} to reference earlier step outputs.'),
103
+ }, async ({ name, description, trigger_type, trigger_configuration, trigger_constraints, workflow_blocks }) => {
104
+ const data = await client.post('/workflows/', {
105
+ name,
106
+ description,
107
+ trigger_type,
108
+ trigger_configuration: trigger_configuration ?? null,
109
+ trigger_constraints: trigger_constraints ?? null,
110
+ workflow_blocks,
111
+ });
112
+ return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
113
+ });
114
+ server.tool('list_workflows', 'List all workflows in your organization. Returns the latest version of each with name, trigger type, and active status.', {}, async () => {
5
115
  const data = await client.get('/workflows/');
6
116
  return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
7
117
  });
8
- server.tool('get_workflow', 'Get a specific workflow by its UUID, including active status, trigger type, version number, and description.', { workflow_id: z.string().describe('The workflow UUID') }, async ({ workflow_id }) => {
118
+ server.tool('get_workflow', 'Get a specific workflow by UUID, including its blocks, trigger configuration, active status, and version number.', { workflow_id: z.string().describe('The workflow UUID') }, async ({ workflow_id }) => {
9
119
  const data = await client.get(`/workflows/${safePath(workflow_id)}`);
10
120
  return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
11
121
  });
12
- server.tool('trigger_workflow', 'Manually trigger a workflow. The workflow must have trigger type "manual-trigger" and be active. Runs asynchronously in the background.', { workflow_id: z.string().describe('The workflow UUID to trigger') }, async ({ workflow_id }) => {
122
+ server.tool('update_workflow', 'Update a workflow by creating a new version. Only provided fields change; omitted fields carry over. ' +
123
+ 'New version is inactive — use activate_workflow to make it live.', {
124
+ workflow_id: z.string().describe('The workflow UUID to update'),
125
+ name: z.string().optional().describe('New workflow name'),
126
+ description: z.string().optional().describe('New workflow description'),
127
+ trigger_type: triggerTypeSchema.optional(),
128
+ trigger_configuration: z
129
+ .record(z.string(), z.unknown())
130
+ .optional()
131
+ .describe('New trigger configuration'),
132
+ trigger_constraints: z
133
+ .record(z.string(), z.unknown())
134
+ .optional()
135
+ .describe('New trigger constraints'),
136
+ workflow_blocks: z
137
+ .array(workflowBlockSchema)
138
+ .optional()
139
+ .describe('New workflow blocks (replaces existing)'),
140
+ }, async ({ workflow_id, ...body }) => {
141
+ const data = await client.patch(`/workflows/${safePath(workflow_id)}`, body);
142
+ return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
143
+ });
144
+ server.tool('delete_workflow', 'Delete a workflow and all its versions. Active versions are deactivated first. Cannot be undone.', { workflow_id: z.string().describe('The workflow UUID to delete') }, async ({ workflow_id }) => {
145
+ const data = await client.delete(`/workflows/${safePath(workflow_id)}`);
146
+ return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
147
+ });
148
+ server.tool('activate_workflow', 'Activate the latest version of a workflow. Any previously active version is deactivated.', { workflow_id: z.string().describe('The workflow UUID to activate') }, async ({ workflow_id }) => {
149
+ const data = await client.post(`/workflows/${safePath(workflow_id)}/activate`);
150
+ return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
151
+ });
152
+ server.tool('deactivate_workflow', 'Deactivate the currently active version of a workflow.', { workflow_id: z.string().describe('The workflow UUID to deactivate') }, async ({ workflow_id }) => {
153
+ const data = await client.post(`/workflows/${safePath(workflow_id)}/deactivate`);
154
+ return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
155
+ });
156
+ server.tool('trigger_workflow', 'Manually trigger a workflow. Must be "manual-trigger" type and active. Runs in background.', { workflow_id: z.string().describe('The workflow UUID to trigger') }, async ({ workflow_id }) => {
13
157
  await client.post(`/workflows/${safePath(workflow_id)}/trigger`);
14
158
  return { content: [{ type: 'text', text: `Workflow ${workflow_id} triggered.` }] };
15
159
  });
16
- server.tool('list_workflow_runs', 'List execution runs for a workflow with optional filters. See which runs succeeded, failed, or are in progress.', {
160
+ server.tool('list_workflow_runs', 'List execution runs for a workflow with optional filters.', {
17
161
  workflow_id: z.string().describe('The workflow UUID'),
18
162
  page: z.number().optional().describe('Page number (default: 1)'),
19
163
  limit: z.number().optional().describe('Results per page (default: 20, max: 50)'),
20
164
  status: z
21
165
  .string()
22
166
  .optional()
23
- .describe('Comma-separated statuses to filter: completed, failed, in_progress, canceled, idle'),
167
+ .describe('Comma-separated: completed, failed, in_progress, canceled, idle'),
24
168
  trigger_cause: z
25
169
  .string()
26
170
  .optional()
27
- .describe('Comma-separated causes to filter: manual, automatic, scheduled'),
171
+ .describe('Comma-separated: manual, automatic, scheduled'),
28
172
  }, async ({ workflow_id, page, limit, status, trigger_cause }) => {
29
173
  const data = await client.get(`/workflows/${safePath(workflow_id)}/runs`, {
30
174
  page: page?.toString(),
@@ -34,7 +178,7 @@ export function registerWorkflowTools(server, client) {
34
178
  });
35
179
  return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
36
180
  });
37
- server.tool('get_workflow_run', 'Get details of a specific workflow run including status, duration, trigger cause, and timestamps.', {
181
+ server.tool('get_workflow_run', 'Get details of a specific workflow run.', {
38
182
  workflow_id: z.string().describe('The workflow UUID'),
39
183
  run_id: z.string().describe('The run UUID'),
40
184
  }, async ({ workflow_id, run_id }) => {
@@ -1 +1 @@
1
- {"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../src/tools/workflows.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../src/tools/workflows.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.6.0",
3
+ "version": "1.8.0",
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",
@@ -31,11 +31,13 @@
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/node": "^25.3.0",
34
- "typescript": "^5.9.3"
34
+ "typescript": "^5.9.3",
35
+ "vitest": "^4.0.17"
35
36
  },
36
37
  "scripts": {
37
38
  "build": "tsc",
38
39
  "dev": "tsc --watch",
39
- "start": "node dist/index.js"
40
+ "start": "node dist/index.js",
41
+ "test": "vitest run"
40
42
  }
41
43
  }