@opencx/mcp 1.15.40 → 1.15.41

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=help-center-content-tools.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help-center-content-tools.spec.d.ts","sourceRoot":"","sources":["../src/help-center-content-tools.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,399 @@
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
+ /**
6
+ * The per-article and per-topic help-center tools.
7
+ *
8
+ * The risk in a set of thin wrappers is all in the wiring — a language sent
9
+ * as a query when the route wants it in the path, a body sent to a route that
10
+ * takes none, a null dropped on the way out — so these check the request that
11
+ * actually goes out.
12
+ */
13
+ describe('help-center content tools', () => {
14
+ let client;
15
+ let cleanup;
16
+ let fetchSpy;
17
+ const HC = 'ce9f2b58-0000-4000-8000-000000000001';
18
+ const ARTICLE = 'ce9f2b58-0000-4000-8000-000000000002';
19
+ const TOPIC = 'ce9f2b58-0000-4000-8000-000000000003';
20
+ const OTHER_TOPIC = 'ce9f2b58-0000-4000-8000-000000000004';
21
+ const TERM = 'ce9f2b58-0000-4000-8000-000000000005';
22
+ const okResponse = () => new Response(JSON.stringify({ ok: true }), { status: 200, statusText: 'OK' });
23
+ const requestOf = (call) => {
24
+ const arg = fetchSpy.mock.calls[call]?.[0];
25
+ if (!(arg instanceof Request))
26
+ throw new Error('expected fetch to receive a Request');
27
+ return arg;
28
+ };
29
+ const callTool = async (name, args) => {
30
+ fetchSpy.mockResolvedValue(okResponse());
31
+ const result = await client.callTool({ name, arguments: args });
32
+ expect(result.isError).toBeFalsy();
33
+ return requestOf(0);
34
+ };
35
+ beforeEach(async () => {
36
+ fetchSpy = vi.fn();
37
+ vi.stubGlobal('fetch', fetchSpy);
38
+ const server = createServer('test-api-key', 'https://api.test.com');
39
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
40
+ await server.connect(serverTransport);
41
+ client = new Client({ name: 'test-client', version: '1.0.0' });
42
+ await client.connect(clientTransport);
43
+ cleanup = async () => {
44
+ await client.close();
45
+ await server.close();
46
+ };
47
+ });
48
+ afterEach(async () => {
49
+ await cleanup();
50
+ vi.unstubAllGlobals();
51
+ });
52
+ it('registers a tool for every article and topic operation the API exposes', async () => {
53
+ const { tools } = await client.listTools();
54
+ const names = tools.map((tool) => tool.name);
55
+ for (const name of [
56
+ 'list_help_center_articles',
57
+ 'get_help_center_article',
58
+ 'list_help_center_article_versions',
59
+ 'create_help_center_article',
60
+ 'update_help_center_article',
61
+ 'delete_help_center_article',
62
+ 'publish_help_center_article',
63
+ 'unpublish_help_center_article',
64
+ 'retranslate_help_center_article',
65
+ 'restore_help_center_article',
66
+ 'get_help_center_article_language_states',
67
+ 'list_help_center_topics',
68
+ 'get_help_center_topic',
69
+ 'create_help_center_topic',
70
+ 'update_help_center_topic',
71
+ 'delete_help_center_topic',
72
+ 'restore_help_center_topic',
73
+ 'retranslate_help_center_topic',
74
+ 'get_help_center',
75
+ 'update_help_center',
76
+ 'list_help_center_translation_jobs',
77
+ 'update_help_center_languages',
78
+ 'list_help_center_glossary_terms',
79
+ 'create_help_center_glossary_term',
80
+ 'import_help_center_glossary_terms',
81
+ 'update_help_center_glossary_term',
82
+ 'delete_help_center_glossary_term',
83
+ 'get_help_center_tree',
84
+ 'move_help_center_article',
85
+ 'move_help_center_topic',
86
+ 'reorder_help_center_tree',
87
+ ]) {
88
+ expect(names).toContain(name);
89
+ }
90
+ // The control for the loop above: a name in the same family that nothing
91
+ // registers, so `toContain` is reading a real list rather than passing on
92
+ // an empty one. Drafts arrive with the reviewed-edit release.
93
+ expect(names).not.toContain('get_help_center_article_draft');
94
+ });
95
+ it('offers no whole-tree tool, so an edit cannot become a replacement', async () => {
96
+ const { tools } = await client.listTools();
97
+ const names = tools.map((tool) => tool.name);
98
+ // `sync_help_center_content` replaced the entire tree and deleted whatever
99
+ // the payload left out; `export_help_center_content` returned a dump of
100
+ // published content only, which hides exactly the drafts an editing agent
101
+ // needs to see. Both are gone from the agent's reach. The HTTP routes
102
+ // stay, so a customer's own bulk import is unaffected.
103
+ expect(names).not.toContain('sync_help_center_content');
104
+ expect(names).not.toContain('export_help_center_content');
105
+ // The control: the help-center family is still registered, so the two
106
+ // assertions above are not passing on an empty tool list.
107
+ expect(names).toContain('list_help_centers');
108
+ expect(names).toContain('list_help_center_media');
109
+ });
110
+ describe('reading', () => {
111
+ it('asks for a language as a query parameter', async () => {
112
+ const request = await callTool('get_help_center_article', {
113
+ help_center_id: HC,
114
+ entity_id: ARTICLE,
115
+ language_code: 'ar',
116
+ });
117
+ expect(request.method).toBe('GET');
118
+ expect(request.url).toBe(`https://api.test.com/hc/${HC}/articles/${ARTICLE}?language_code=ar`);
119
+ });
120
+ it('omits the language entirely when none was given, so the route picks the primary one', async () => {
121
+ const request = await callTool('get_help_center_article', {
122
+ help_center_id: HC,
123
+ entity_id: ARTICLE,
124
+ });
125
+ expect(request.url).toBe(`https://api.test.com/hc/${HC}/articles/${ARTICLE}`);
126
+ expect(request.url).not.toContain('language_code');
127
+ });
128
+ });
129
+ describe('writing', () => {
130
+ it('sends the whole article body on an update', async () => {
131
+ const request = await callTool('update_help_center_article', {
132
+ help_center_id: HC,
133
+ entity_id: ARTICLE,
134
+ title: 'Refunds',
135
+ content_markdown: '# Refunds\n\nWithin 14 days.',
136
+ language_code: 'en',
137
+ });
138
+ expect(request.method).toBe('PUT');
139
+ expect(request.url).toBe(`https://api.test.com/hc/${HC}/articles/${ARTICLE}`);
140
+ expect(JSON.parse(await request.clone().text())).toEqual({
141
+ title: 'Refunds',
142
+ content_markdown: '# Refunds\n\nWithin 14 days.',
143
+ language_code: 'en',
144
+ });
145
+ });
146
+ it('creates an article inside the topic it was given', async () => {
147
+ const request = await callTool('create_help_center_article', {
148
+ help_center_id: HC,
149
+ category_entity_id: TOPIC,
150
+ title: 'Refunds',
151
+ });
152
+ expect(request.method).toBe('POST');
153
+ expect(request.url).toBe(`https://api.test.com/hc/${HC}/articles`);
154
+ expect(JSON.parse(await request.clone().text())).toEqual({
155
+ category_entity_id: TOPIC,
156
+ title: 'Refunds',
157
+ });
158
+ });
159
+ });
160
+ describe('publishing', () => {
161
+ it('publishes one language through the locale route, with the language in the path', async () => {
162
+ const request = await callTool('publish_help_center_article', {
163
+ help_center_id: HC,
164
+ entity_id: ARTICLE,
165
+ language_code: 'ar',
166
+ });
167
+ expect(request.method).toBe('POST');
168
+ expect(request.url).toBe(`https://api.test.com/hc/${HC}/articles/${ARTICLE}/locales/ar/publish`);
169
+ expect(JSON.parse(await request.clone().text())).toEqual({});
170
+ });
171
+ it('publishes every language through the all-locales route when none is named', async () => {
172
+ const request = await callTool('publish_help_center_article', {
173
+ help_center_id: HC,
174
+ entity_id: ARTICLE,
175
+ });
176
+ // One tool, two routes: the presence of a language is what chooses,
177
+ // which is why this pair has to be asserted and not just the first one.
178
+ expect(request.url).toBe(`https://api.test.com/hc/${HC}/articles/${ARTICLE}/publish`);
179
+ expect(request.url).not.toContain('/locales/');
180
+ });
181
+ it('unpublishes one language when asked for one', async () => {
182
+ const request = await callTool('unpublish_help_center_article', {
183
+ help_center_id: HC,
184
+ entity_id: ARTICLE,
185
+ language_code: 'ar',
186
+ });
187
+ expect(JSON.parse(await request.clone().text())).toEqual({ language_code: 'ar' });
188
+ });
189
+ it('unpublishes every language when none is named', async () => {
190
+ const request = await callTool('unpublish_help_center_article', {
191
+ help_center_id: HC,
192
+ entity_id: ARTICLE,
193
+ });
194
+ // An empty body is what the route reads as "all of them". Sending
195
+ // `language_code: undefined` would serialise to the same thing, so the
196
+ // assertion above is what proves the two calls differ.
197
+ expect(JSON.parse(await request.clone().text())).toEqual({});
198
+ });
199
+ });
200
+ describe('topics', () => {
201
+ it('re-homes a deleted topic\u2019s contents only when a destination was named', async () => {
202
+ const rehomed = await callTool('delete_help_center_topic', {
203
+ help_center_id: HC,
204
+ category_entity_id: TOPIC,
205
+ move_contents_to: OTHER_TOPIC,
206
+ });
207
+ expect(rehomed.method).toBe('DELETE');
208
+ expect(rehomed.url).toBe(`https://api.test.com/hc/${HC}/categories/${TOPIC}?move_contents_to=${OTHER_TOPIC}`);
209
+ fetchSpy.mockClear();
210
+ const plain = await callTool('delete_help_center_topic', {
211
+ help_center_id: HC,
212
+ category_entity_id: TOPIC,
213
+ });
214
+ expect(plain.url).toBe(`https://api.test.com/hc/${HC}/categories/${TOPIC}`);
215
+ expect(plain.url).not.toContain('move_contents_to');
216
+ });
217
+ it('edits a topic in one language without touching where it sits', async () => {
218
+ const request = await callTool('update_help_center_topic', {
219
+ help_center_id: HC,
220
+ category_entity_id: TOPIC,
221
+ name: 'Facturation',
222
+ language_code: 'fr',
223
+ });
224
+ // Editing and moving are separate routes now: an edit must never carry
225
+ // a parent, or a rename would silently re-home the topic.
226
+ expect(JSON.parse(await request.clone().text())).toEqual({
227
+ name: 'Facturation',
228
+ language_code: 'fr',
229
+ });
230
+ });
231
+ it('moves a topic to the top level with an explicit null parent', async () => {
232
+ const request = await callTool('move_help_center_topic', {
233
+ help_center_id: HC,
234
+ category_entity_id: TOPIC,
235
+ parent_category_entity_id: null,
236
+ language_code: 'en',
237
+ position: 0,
238
+ });
239
+ expect(request.url).toBe(`https://api.test.com/hc/${HC}/structure/move-topic`);
240
+ // null and omitted mean different things here: null moves the topic to
241
+ // the top level, so it has to survive JSON serialization.
242
+ expect(JSON.parse(await request.clone().text())).toEqual({
243
+ category_entity_id: TOPIC,
244
+ parent_category_entity_id: null,
245
+ language_code: 'en',
246
+ position: 0,
247
+ });
248
+ });
249
+ });
250
+ describe('the help center itself', () => {
251
+ it('sends only the fields it was given, so an unnamed setting is left alone', async () => {
252
+ const request = await callTool('update_help_center', {
253
+ help_center_id: HC,
254
+ custom_css: '.hc-article h2 { color: rebeccapurple }',
255
+ });
256
+ expect(request.method).toBe('PUT');
257
+ expect(request.url).toBe(`https://api.test.com/hc/${HC}`);
258
+ expect(JSON.parse(await request.clone().text())).toEqual({
259
+ custom_css: '.hc-article h2 { color: rebeccapurple }',
260
+ });
261
+ });
262
+ it('clears a setting with an explicit null rather than dropping it', async () => {
263
+ const request = await callTool('update_help_center', {
264
+ help_center_id: HC,
265
+ custom_head_scripts: null,
266
+ });
267
+ expect(JSON.parse(await request.clone().text())).toEqual({ custom_head_scripts: null });
268
+ });
269
+ it('sends localizations whole, since the route replaces the stored map', async () => {
270
+ const request = await callTool('update_help_center', {
271
+ help_center_id: HC,
272
+ localizations: { en: { title: 'Help' }, ar: { title: 'المساعدة', description: null } },
273
+ });
274
+ expect(JSON.parse(await request.clone().text())).toEqual({
275
+ localizations: { en: { title: 'Help' }, ar: { title: 'المساعدة', description: null } },
276
+ });
277
+ });
278
+ it('puts the language settings on their own route, not on the help center', async () => {
279
+ const request = await callTool('update_help_center_languages', {
280
+ help_center_id: HC,
281
+ enabled_languages: ['en', 'ar'],
282
+ auto_translate: 'off',
283
+ });
284
+ expect(request.url).toBe(`https://api.test.com/hc/${HC}/languages`);
285
+ expect(JSON.parse(await request.clone().text())).toEqual({
286
+ enabled_languages: ['en', 'ar'],
287
+ auto_translate: 'off',
288
+ });
289
+ });
290
+ it('imports the organization glossary with no body of its own', async () => {
291
+ const request = await callTool('import_help_center_glossary_terms', { help_center_id: HC });
292
+ expect(request.method).toBe('POST');
293
+ expect(request.url).toBe(`https://api.test.com/hc/${HC}/glossary/import-from-translation`);
294
+ expect(await request.clone().text()).toBe('');
295
+ });
296
+ it('addresses a glossary term by id under its help center', async () => {
297
+ const request = await callTool('update_help_center_glossary_term', {
298
+ help_center_id: HC,
299
+ term_id: TERM,
300
+ definition: 'Always rendered in Latin script.',
301
+ });
302
+ expect(request.method).toBe('PUT');
303
+ expect(request.url).toBe(`https://api.test.com/hc/${HC}/glossary/${TERM}`);
304
+ expect(JSON.parse(await request.clone().text())).toEqual({
305
+ definition: 'Always rendered in Latin script.',
306
+ });
307
+ });
308
+ });
309
+ describe('structure', () => {
310
+ it('sends the language in the body, not as a query, for a move', async () => {
311
+ const request = await callTool('move_help_center_article', {
312
+ help_center_id: HC,
313
+ article_entity_id: ARTICLE,
314
+ category_entity_id: TOPIC,
315
+ language_code: 'ar',
316
+ position: 2,
317
+ });
318
+ expect(request.method).toBe('POST');
319
+ expect(request.url).toBe(`https://api.test.com/hc/${HC}/structure/move-article`);
320
+ expect(request.url).not.toContain('language_code');
321
+ expect(JSON.parse(await request.clone().text())).toEqual({
322
+ article_entity_id: ARTICLE,
323
+ category_entity_id: TOPIC,
324
+ language_code: 'ar',
325
+ position: 2,
326
+ });
327
+ });
328
+ it('reads the tree for one named language', async () => {
329
+ const request = await callTool('get_help_center_tree', {
330
+ help_center_id: HC,
331
+ language_code: 'ar',
332
+ });
333
+ expect(request.method).toBe('GET');
334
+ expect(request.url).toBe(`https://api.test.com/hc/${HC}/structure/tree?language_code=ar`);
335
+ });
336
+ it('keeps the order it was given when reordering', async () => {
337
+ const request = await callTool('reorder_help_center_tree', {
338
+ help_center_id: HC,
339
+ parent_category_entity_id: TOPIC,
340
+ language_code: 'en',
341
+ ordered_ids: [OTHER_TOPIC, ARTICLE],
342
+ });
343
+ expect(JSON.parse(await request.clone().text())).toEqual({
344
+ parent_category_entity_id: TOPIC,
345
+ language_code: 'en',
346
+ ordered_ids: [OTHER_TOPIC, ARTICLE],
347
+ });
348
+ });
349
+ });
350
+ describe('retranslation', () => {
351
+ it('names the language for a single-language retranslate', async () => {
352
+ const request = await callTool('retranslate_help_center_article', {
353
+ help_center_id: HC,
354
+ entity_id: ARTICLE,
355
+ language_code: 'fr',
356
+ });
357
+ expect(request.url).toBe(`https://api.test.com/hc/${HC}/articles/${ARTICLE}/retranslate`);
358
+ expect(JSON.parse(await request.clone().text())).toEqual({ language_code: 'fr' });
359
+ });
360
+ it('falls through to retranslate-all, which takes no body, when no language is named', async () => {
361
+ const request = await callTool('retranslate_help_center_article', {
362
+ help_center_id: HC,
363
+ entity_id: ARTICLE,
364
+ });
365
+ expect(request.url).toBe(`https://api.test.com/hc/${HC}/articles/${ARTICLE}/retranslate-all`);
366
+ expect(await request.clone().text()).toBe('');
367
+ });
368
+ });
369
+ describe('the descriptions the model reads before calling', () => {
370
+ it('warns on every tool that changes what readers see', async () => {
371
+ const { tools } = await client.listTools();
372
+ const describedBy = (name) => tools.find((tool) => tool.name === name)?.description ?? '';
373
+ // These are the actions the spec puts behind an explicit request: they
374
+ // change the live site or overwrite someone's translation.
375
+ for (const name of [
376
+ 'publish_help_center_article',
377
+ 'unpublish_help_center_article',
378
+ 'delete_help_center_article',
379
+ 'retranslate_help_center_article',
380
+ 'delete_help_center_topic',
381
+ 'retranslate_help_center_topic',
382
+ ]) {
383
+ expect(describedBy(name)).toMatch(/ONLY\b/);
384
+ }
385
+ // Custom CSS and head scripts run on every page for every reader, so
386
+ // the tool that writes them says so rather than reading as a settings edit.
387
+ expect(describedBy('update_help_center')).toMatch(/every reader/);
388
+ // Two routes REPLACE rather than merge; sending a partial silently drops
389
+ // what was left out, so both descriptions have to say so in the clear.
390
+ expect(describedBy('update_help_center')).toMatch(/REPLACE/);
391
+ expect(describedBy('update_help_center_languages')).toMatch(/REPLACES/);
392
+ // The control: reading and drafting carry no such warning, so the match
393
+ // above is finding real text rather than something every description has.
394
+ expect(describedBy('list_help_center_articles')).not.toMatch(/ONLY\b/);
395
+ expect(describedBy('create_help_center_article')).not.toMatch(/ONLY\b/);
396
+ });
397
+ });
398
+ });
399
+ //# sourceMappingURL=help-center-content-tools.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help-center-content-tools.spec.js","sourceRoot":"","sources":["../src/help-center-content-tools.spec.ts"],"names":[],"mappings":"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"}