@zavudev/sdk-mcp 0.23.0 → 0.25.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.
Files changed (70) hide show
  1. package/README.md +3 -3
  2. package/code-tool.d.mts +4 -1
  3. package/code-tool.d.mts.map +1 -1
  4. package/code-tool.d.ts +4 -1
  5. package/code-tool.d.ts.map +1 -1
  6. package/code-tool.js +17 -4
  7. package/code-tool.js.map +1 -1
  8. package/code-tool.mjs +18 -5
  9. package/code-tool.mjs.map +1 -1
  10. package/headers.d.mts +1 -1
  11. package/headers.d.mts.map +1 -1
  12. package/headers.d.ts +1 -1
  13. package/headers.d.ts.map +1 -1
  14. package/headers.js +4 -1
  15. package/headers.js.map +1 -1
  16. package/headers.mjs +4 -1
  17. package/headers.mjs.map +1 -1
  18. package/http.d.mts +8 -3
  19. package/http.d.mts.map +1 -1
  20. package/http.d.ts +8 -3
  21. package/http.d.ts.map +1 -1
  22. package/http.js +27 -10
  23. package/http.js.map +1 -1
  24. package/http.mjs +27 -10
  25. package/http.mjs.map +1 -1
  26. package/index.js +6 -2
  27. package/index.js.map +1 -1
  28. package/index.mjs +6 -2
  29. package/index.mjs.map +1 -1
  30. package/methods.d.mts +10 -0
  31. package/methods.d.mts.map +1 -0
  32. package/methods.d.ts +10 -0
  33. package/methods.d.ts.map +1 -0
  34. package/methods.js +526 -0
  35. package/methods.js.map +1 -0
  36. package/methods.mjs +522 -0
  37. package/methods.mjs.map +1 -0
  38. package/options.d.mts +4 -0
  39. package/options.d.mts.map +1 -1
  40. package/options.d.ts +4 -0
  41. package/options.d.ts.map +1 -1
  42. package/options.js +31 -12
  43. package/options.js.map +1 -1
  44. package/options.mjs +31 -12
  45. package/options.mjs.map +1 -1
  46. package/package.json +15 -2
  47. package/server.d.mts +3 -3
  48. package/server.d.mts.map +1 -1
  49. package/server.d.ts +3 -3
  50. package/server.d.ts.map +1 -1
  51. package/server.js +47 -8
  52. package/server.js.map +1 -1
  53. package/server.mjs +45 -7
  54. package/server.mjs.map +1 -1
  55. package/src/code-tool.ts +28 -5
  56. package/src/headers.ts +3 -1
  57. package/src/http.ts +37 -13
  58. package/src/index.ts +6 -2
  59. package/src/methods.ts +546 -0
  60. package/src/options.ts +38 -12
  61. package/src/server.ts +56 -8
  62. package/src/stdio.ts +4 -3
  63. package/stdio.d.mts +2 -1
  64. package/stdio.d.mts.map +1 -1
  65. package/stdio.d.ts +2 -1
  66. package/stdio.d.ts.map +1 -1
  67. package/stdio.js +3 -3
  68. package/stdio.js.map +1 -1
  69. package/stdio.mjs +3 -3
  70. package/stdio.mjs.map +1 -1
package/src/methods.ts ADDED
@@ -0,0 +1,546 @@
1
+ import { McpOptions } from './options';
2
+
3
+ export type SdkMethod = {
4
+ clientCallName: string;
5
+ fullyQualifiedName: string;
6
+ httpMethod?: 'get' | 'post' | 'put' | 'patch' | 'delete' | 'query';
7
+ httpPath?: string;
8
+ };
9
+
10
+ export const sdkMethods: SdkMethod[] = [
11
+ {
12
+ clientCallName: 'client.messages.retrieve',
13
+ fullyQualifiedName: 'messages.retrieve',
14
+ httpMethod: 'get',
15
+ httpPath: '/v1/messages/{messageId}',
16
+ },
17
+ {
18
+ clientCallName: 'client.messages.list',
19
+ fullyQualifiedName: 'messages.list',
20
+ httpMethod: 'get',
21
+ httpPath: '/v1/messages',
22
+ },
23
+ {
24
+ clientCallName: 'client.messages.react',
25
+ fullyQualifiedName: 'messages.react',
26
+ httpMethod: 'post',
27
+ httpPath: '/v1/messages/{messageId}/reactions',
28
+ },
29
+ {
30
+ clientCallName: 'client.messages.send',
31
+ fullyQualifiedName: 'messages.send',
32
+ httpMethod: 'post',
33
+ httpPath: '/v1/messages',
34
+ },
35
+ {
36
+ clientCallName: 'client.templates.create',
37
+ fullyQualifiedName: 'templates.create',
38
+ httpMethod: 'post',
39
+ httpPath: '/v1/templates',
40
+ },
41
+ {
42
+ clientCallName: 'client.templates.retrieve',
43
+ fullyQualifiedName: 'templates.retrieve',
44
+ httpMethod: 'get',
45
+ httpPath: '/v1/templates/{templateId}',
46
+ },
47
+ {
48
+ clientCallName: 'client.templates.list',
49
+ fullyQualifiedName: 'templates.list',
50
+ httpMethod: 'get',
51
+ httpPath: '/v1/templates',
52
+ },
53
+ {
54
+ clientCallName: 'client.templates.delete',
55
+ fullyQualifiedName: 'templates.delete',
56
+ httpMethod: 'delete',
57
+ httpPath: '/v1/templates/{templateId}',
58
+ },
59
+ {
60
+ clientCallName: 'client.templates.submit',
61
+ fullyQualifiedName: 'templates.submit',
62
+ httpMethod: 'post',
63
+ httpPath: '/v1/templates/{templateId}/submit',
64
+ },
65
+ {
66
+ clientCallName: 'client.senders.create',
67
+ fullyQualifiedName: 'senders.create',
68
+ httpMethod: 'post',
69
+ httpPath: '/v1/senders',
70
+ },
71
+ {
72
+ clientCallName: 'client.senders.retrieve',
73
+ fullyQualifiedName: 'senders.retrieve',
74
+ httpMethod: 'get',
75
+ httpPath: '/v1/senders/{senderId}',
76
+ },
77
+ {
78
+ clientCallName: 'client.senders.update',
79
+ fullyQualifiedName: 'senders.update',
80
+ httpMethod: 'patch',
81
+ httpPath: '/v1/senders/{senderId}',
82
+ },
83
+ {
84
+ clientCallName: 'client.senders.list',
85
+ fullyQualifiedName: 'senders.list',
86
+ httpMethod: 'get',
87
+ httpPath: '/v1/senders',
88
+ },
89
+ {
90
+ clientCallName: 'client.senders.delete',
91
+ fullyQualifiedName: 'senders.delete',
92
+ httpMethod: 'delete',
93
+ httpPath: '/v1/senders/{senderId}',
94
+ },
95
+ {
96
+ clientCallName: 'client.senders.getProfile',
97
+ fullyQualifiedName: 'senders.getProfile',
98
+ httpMethod: 'get',
99
+ httpPath: '/v1/senders/{senderId}/profile',
100
+ },
101
+ {
102
+ clientCallName: 'client.senders.regenerateWebhookSecret',
103
+ fullyQualifiedName: 'senders.regenerateWebhookSecret',
104
+ httpMethod: 'post',
105
+ httpPath: '/v1/senders/{senderId}/webhook/secret',
106
+ },
107
+ {
108
+ clientCallName: 'client.senders.updateProfile',
109
+ fullyQualifiedName: 'senders.updateProfile',
110
+ httpMethod: 'patch',
111
+ httpPath: '/v1/senders/{senderId}/profile',
112
+ },
113
+ {
114
+ clientCallName: 'client.senders.uploadProfilePicture',
115
+ fullyQualifiedName: 'senders.uploadProfilePicture',
116
+ httpMethod: 'post',
117
+ httpPath: '/v1/senders/{senderId}/profile/picture',
118
+ },
119
+ {
120
+ clientCallName: 'client.senders.agent.create',
121
+ fullyQualifiedName: 'senders.agent.create',
122
+ httpMethod: 'post',
123
+ httpPath: '/v1/senders/{senderId}/agent',
124
+ },
125
+ {
126
+ clientCallName: 'client.senders.agent.retrieve',
127
+ fullyQualifiedName: 'senders.agent.retrieve',
128
+ httpMethod: 'get',
129
+ httpPath: '/v1/senders/{senderId}/agent',
130
+ },
131
+ {
132
+ clientCallName: 'client.senders.agent.update',
133
+ fullyQualifiedName: 'senders.agent.update',
134
+ httpMethod: 'patch',
135
+ httpPath: '/v1/senders/{senderId}/agent',
136
+ },
137
+ {
138
+ clientCallName: 'client.senders.agent.delete',
139
+ fullyQualifiedName: 'senders.agent.delete',
140
+ httpMethod: 'delete',
141
+ httpPath: '/v1/senders/{senderId}/agent',
142
+ },
143
+ {
144
+ clientCallName: 'client.senders.agent.stats',
145
+ fullyQualifiedName: 'senders.agent.stats',
146
+ httpMethod: 'get',
147
+ httpPath: '/v1/senders/{senderId}/agent/stats',
148
+ },
149
+ {
150
+ clientCallName: 'client.senders.agent.executions.list',
151
+ fullyQualifiedName: 'senders.agent.executions.list',
152
+ httpMethod: 'get',
153
+ httpPath: '/v1/senders/{senderId}/agent/executions',
154
+ },
155
+ {
156
+ clientCallName: 'client.senders.agent.flows.create',
157
+ fullyQualifiedName: 'senders.agent.flows.create',
158
+ httpMethod: 'post',
159
+ httpPath: '/v1/senders/{senderId}/agent/flows',
160
+ },
161
+ {
162
+ clientCallName: 'client.senders.agent.flows.retrieve',
163
+ fullyQualifiedName: 'senders.agent.flows.retrieve',
164
+ httpMethod: 'get',
165
+ httpPath: '/v1/senders/{senderId}/agent/flows/{flowId}',
166
+ },
167
+ {
168
+ clientCallName: 'client.senders.agent.flows.update',
169
+ fullyQualifiedName: 'senders.agent.flows.update',
170
+ httpMethod: 'patch',
171
+ httpPath: '/v1/senders/{senderId}/agent/flows/{flowId}',
172
+ },
173
+ {
174
+ clientCallName: 'client.senders.agent.flows.list',
175
+ fullyQualifiedName: 'senders.agent.flows.list',
176
+ httpMethod: 'get',
177
+ httpPath: '/v1/senders/{senderId}/agent/flows',
178
+ },
179
+ {
180
+ clientCallName: 'client.senders.agent.flows.delete',
181
+ fullyQualifiedName: 'senders.agent.flows.delete',
182
+ httpMethod: 'delete',
183
+ httpPath: '/v1/senders/{senderId}/agent/flows/{flowId}',
184
+ },
185
+ {
186
+ clientCallName: 'client.senders.agent.flows.duplicate',
187
+ fullyQualifiedName: 'senders.agent.flows.duplicate',
188
+ httpMethod: 'post',
189
+ httpPath: '/v1/senders/{senderId}/agent/flows/{flowId}/duplicate',
190
+ },
191
+ {
192
+ clientCallName: 'client.senders.agent.tools.create',
193
+ fullyQualifiedName: 'senders.agent.tools.create',
194
+ httpMethod: 'post',
195
+ httpPath: '/v1/senders/{senderId}/agent/tools',
196
+ },
197
+ {
198
+ clientCallName: 'client.senders.agent.tools.retrieve',
199
+ fullyQualifiedName: 'senders.agent.tools.retrieve',
200
+ httpMethod: 'get',
201
+ httpPath: '/v1/senders/{senderId}/agent/tools/{toolId}',
202
+ },
203
+ {
204
+ clientCallName: 'client.senders.agent.tools.update',
205
+ fullyQualifiedName: 'senders.agent.tools.update',
206
+ httpMethod: 'patch',
207
+ httpPath: '/v1/senders/{senderId}/agent/tools/{toolId}',
208
+ },
209
+ {
210
+ clientCallName: 'client.senders.agent.tools.list',
211
+ fullyQualifiedName: 'senders.agent.tools.list',
212
+ httpMethod: 'get',
213
+ httpPath: '/v1/senders/{senderId}/agent/tools',
214
+ },
215
+ {
216
+ clientCallName: 'client.senders.agent.tools.delete',
217
+ fullyQualifiedName: 'senders.agent.tools.delete',
218
+ httpMethod: 'delete',
219
+ httpPath: '/v1/senders/{senderId}/agent/tools/{toolId}',
220
+ },
221
+ {
222
+ clientCallName: 'client.senders.agent.tools.test',
223
+ fullyQualifiedName: 'senders.agent.tools.test',
224
+ httpMethod: 'post',
225
+ httpPath: '/v1/senders/{senderId}/agent/tools/{toolId}/test',
226
+ },
227
+ {
228
+ clientCallName: 'client.senders.agent.knowledgeBases.create',
229
+ fullyQualifiedName: 'senders.agent.knowledgeBases.create',
230
+ httpMethod: 'post',
231
+ httpPath: '/v1/senders/{senderId}/agent/knowledge-bases',
232
+ },
233
+ {
234
+ clientCallName: 'client.senders.agent.knowledgeBases.retrieve',
235
+ fullyQualifiedName: 'senders.agent.knowledgeBases.retrieve',
236
+ httpMethod: 'get',
237
+ httpPath: '/v1/senders/{senderId}/agent/knowledge-bases/{kbId}',
238
+ },
239
+ {
240
+ clientCallName: 'client.senders.agent.knowledgeBases.update',
241
+ fullyQualifiedName: 'senders.agent.knowledgeBases.update',
242
+ httpMethod: 'patch',
243
+ httpPath: '/v1/senders/{senderId}/agent/knowledge-bases/{kbId}',
244
+ },
245
+ {
246
+ clientCallName: 'client.senders.agent.knowledgeBases.list',
247
+ fullyQualifiedName: 'senders.agent.knowledgeBases.list',
248
+ httpMethod: 'get',
249
+ httpPath: '/v1/senders/{senderId}/agent/knowledge-bases',
250
+ },
251
+ {
252
+ clientCallName: 'client.senders.agent.knowledgeBases.delete',
253
+ fullyQualifiedName: 'senders.agent.knowledgeBases.delete',
254
+ httpMethod: 'delete',
255
+ httpPath: '/v1/senders/{senderId}/agent/knowledge-bases/{kbId}',
256
+ },
257
+ {
258
+ clientCallName: 'client.senders.agent.knowledgeBases.documents.create',
259
+ fullyQualifiedName: 'senders.agent.knowledgeBases.documents.create',
260
+ httpMethod: 'post',
261
+ httpPath: '/v1/senders/{senderId}/agent/knowledge-bases/{kbId}/documents',
262
+ },
263
+ {
264
+ clientCallName: 'client.senders.agent.knowledgeBases.documents.list',
265
+ fullyQualifiedName: 'senders.agent.knowledgeBases.documents.list',
266
+ httpMethod: 'get',
267
+ httpPath: '/v1/senders/{senderId}/agent/knowledge-bases/{kbId}/documents',
268
+ },
269
+ {
270
+ clientCallName: 'client.senders.agent.knowledgeBases.documents.delete',
271
+ fullyQualifiedName: 'senders.agent.knowledgeBases.documents.delete',
272
+ httpMethod: 'delete',
273
+ httpPath: '/v1/senders/{senderId}/agent/knowledge-bases/{kbId}/documents/{docId}',
274
+ },
275
+ {
276
+ clientCallName: 'client.contacts.retrieve',
277
+ fullyQualifiedName: 'contacts.retrieve',
278
+ httpMethod: 'get',
279
+ httpPath: '/v1/contacts/{contactId}',
280
+ },
281
+ {
282
+ clientCallName: 'client.contacts.update',
283
+ fullyQualifiedName: 'contacts.update',
284
+ httpMethod: 'patch',
285
+ httpPath: '/v1/contacts/{contactId}',
286
+ },
287
+ {
288
+ clientCallName: 'client.contacts.list',
289
+ fullyQualifiedName: 'contacts.list',
290
+ httpMethod: 'get',
291
+ httpPath: '/v1/contacts',
292
+ },
293
+ {
294
+ clientCallName: 'client.contacts.retrieveByPhone',
295
+ fullyQualifiedName: 'contacts.retrieveByPhone',
296
+ httpMethod: 'get',
297
+ httpPath: '/v1/contacts/phone/{phoneNumber}',
298
+ },
299
+ {
300
+ clientCallName: 'client.broadcasts.create',
301
+ fullyQualifiedName: 'broadcasts.create',
302
+ httpMethod: 'post',
303
+ httpPath: '/v1/broadcasts',
304
+ },
305
+ {
306
+ clientCallName: 'client.broadcasts.retrieve',
307
+ fullyQualifiedName: 'broadcasts.retrieve',
308
+ httpMethod: 'get',
309
+ httpPath: '/v1/broadcasts/{broadcastId}',
310
+ },
311
+ {
312
+ clientCallName: 'client.broadcasts.update',
313
+ fullyQualifiedName: 'broadcasts.update',
314
+ httpMethod: 'patch',
315
+ httpPath: '/v1/broadcasts/{broadcastId}',
316
+ },
317
+ {
318
+ clientCallName: 'client.broadcasts.list',
319
+ fullyQualifiedName: 'broadcasts.list',
320
+ httpMethod: 'get',
321
+ httpPath: '/v1/broadcasts',
322
+ },
323
+ {
324
+ clientCallName: 'client.broadcasts.delete',
325
+ fullyQualifiedName: 'broadcasts.delete',
326
+ httpMethod: 'delete',
327
+ httpPath: '/v1/broadcasts/{broadcastId}',
328
+ },
329
+ {
330
+ clientCallName: 'client.broadcasts.cancel',
331
+ fullyQualifiedName: 'broadcasts.cancel',
332
+ httpMethod: 'post',
333
+ httpPath: '/v1/broadcasts/{broadcastId}/cancel',
334
+ },
335
+ {
336
+ clientCallName: 'client.broadcasts.progress',
337
+ fullyQualifiedName: 'broadcasts.progress',
338
+ httpMethod: 'get',
339
+ httpPath: '/v1/broadcasts/{broadcastId}/progress',
340
+ },
341
+ {
342
+ clientCallName: 'client.broadcasts.reschedule',
343
+ fullyQualifiedName: 'broadcasts.reschedule',
344
+ httpMethod: 'patch',
345
+ httpPath: '/v1/broadcasts/{broadcastId}/schedule',
346
+ },
347
+ {
348
+ clientCallName: 'client.broadcasts.send',
349
+ fullyQualifiedName: 'broadcasts.send',
350
+ httpMethod: 'post',
351
+ httpPath: '/v1/broadcasts/{broadcastId}/send',
352
+ },
353
+ {
354
+ clientCallName: 'client.broadcasts.contacts.list',
355
+ fullyQualifiedName: 'broadcasts.contacts.list',
356
+ httpMethod: 'get',
357
+ httpPath: '/v1/broadcasts/{broadcastId}/contacts',
358
+ },
359
+ {
360
+ clientCallName: 'client.broadcasts.contacts.add',
361
+ fullyQualifiedName: 'broadcasts.contacts.add',
362
+ httpMethod: 'post',
363
+ httpPath: '/v1/broadcasts/{broadcastId}/contacts',
364
+ },
365
+ {
366
+ clientCallName: 'client.broadcasts.contacts.remove',
367
+ fullyQualifiedName: 'broadcasts.contacts.remove',
368
+ httpMethod: 'delete',
369
+ httpPath: '/v1/broadcasts/{broadcastId}/contacts/{contactId}',
370
+ },
371
+ {
372
+ clientCallName: 'client.introspect.validatePhone',
373
+ fullyQualifiedName: 'introspect.validatePhone',
374
+ httpMethod: 'post',
375
+ httpPath: '/v1/introspect/phone',
376
+ },
377
+ {
378
+ clientCallName: 'client.phoneNumbers.retrieve',
379
+ fullyQualifiedName: 'phoneNumbers.retrieve',
380
+ httpMethod: 'get',
381
+ httpPath: '/v1/phone-numbers/{phoneNumberId}',
382
+ },
383
+ {
384
+ clientCallName: 'client.phoneNumbers.update',
385
+ fullyQualifiedName: 'phoneNumbers.update',
386
+ httpMethod: 'patch',
387
+ httpPath: '/v1/phone-numbers/{phoneNumberId}',
388
+ },
389
+ {
390
+ clientCallName: 'client.phoneNumbers.list',
391
+ fullyQualifiedName: 'phoneNumbers.list',
392
+ httpMethod: 'get',
393
+ httpPath: '/v1/phone-numbers',
394
+ },
395
+ {
396
+ clientCallName: 'client.phoneNumbers.purchase',
397
+ fullyQualifiedName: 'phoneNumbers.purchase',
398
+ httpMethod: 'post',
399
+ httpPath: '/v1/phone-numbers',
400
+ },
401
+ {
402
+ clientCallName: 'client.phoneNumbers.release',
403
+ fullyQualifiedName: 'phoneNumbers.release',
404
+ httpMethod: 'delete',
405
+ httpPath: '/v1/phone-numbers/{phoneNumberId}',
406
+ },
407
+ {
408
+ clientCallName: 'client.phoneNumbers.requirements',
409
+ fullyQualifiedName: 'phoneNumbers.requirements',
410
+ httpMethod: 'get',
411
+ httpPath: '/v1/phone-numbers/requirements',
412
+ },
413
+ {
414
+ clientCallName: 'client.phoneNumbers.searchAvailable',
415
+ fullyQualifiedName: 'phoneNumbers.searchAvailable',
416
+ httpMethod: 'get',
417
+ httpPath: '/v1/phone-numbers/available',
418
+ },
419
+ {
420
+ clientCallName: 'client.addresses.create',
421
+ fullyQualifiedName: 'addresses.create',
422
+ httpMethod: 'post',
423
+ httpPath: '/v1/addresses',
424
+ },
425
+ {
426
+ clientCallName: 'client.addresses.retrieve',
427
+ fullyQualifiedName: 'addresses.retrieve',
428
+ httpMethod: 'get',
429
+ httpPath: '/v1/addresses/{addressId}',
430
+ },
431
+ {
432
+ clientCallName: 'client.addresses.list',
433
+ fullyQualifiedName: 'addresses.list',
434
+ httpMethod: 'get',
435
+ httpPath: '/v1/addresses',
436
+ },
437
+ {
438
+ clientCallName: 'client.addresses.delete',
439
+ fullyQualifiedName: 'addresses.delete',
440
+ httpMethod: 'delete',
441
+ httpPath: '/v1/addresses/{addressId}',
442
+ },
443
+ {
444
+ clientCallName: 'client.regulatoryDocuments.create',
445
+ fullyQualifiedName: 'regulatoryDocuments.create',
446
+ httpMethod: 'post',
447
+ httpPath: '/v1/documents',
448
+ },
449
+ {
450
+ clientCallName: 'client.regulatoryDocuments.retrieve',
451
+ fullyQualifiedName: 'regulatoryDocuments.retrieve',
452
+ httpMethod: 'get',
453
+ httpPath: '/v1/documents/{documentId}',
454
+ },
455
+ {
456
+ clientCallName: 'client.regulatoryDocuments.list',
457
+ fullyQualifiedName: 'regulatoryDocuments.list',
458
+ httpMethod: 'get',
459
+ httpPath: '/v1/documents',
460
+ },
461
+ {
462
+ clientCallName: 'client.regulatoryDocuments.delete',
463
+ fullyQualifiedName: 'regulatoryDocuments.delete',
464
+ httpMethod: 'delete',
465
+ httpPath: '/v1/documents/{documentId}',
466
+ },
467
+ {
468
+ clientCallName: 'client.regulatoryDocuments.uploadURL',
469
+ fullyQualifiedName: 'regulatoryDocuments.uploadURL',
470
+ httpMethod: 'post',
471
+ httpPath: '/v1/documents/upload-url',
472
+ },
473
+ ];
474
+
475
+ function allowedMethodsForCodeTool(options: McpOptions | undefined): SdkMethod[] | undefined {
476
+ if (!options) {
477
+ return undefined;
478
+ }
479
+
480
+ let allowedMethods: SdkMethod[];
481
+
482
+ if (options.codeAllowHttpGets || options.codeAllowedMethods) {
483
+ // Start with nothing allowed and then add into it from options
484
+ let allowedMethodsSet = new Set<SdkMethod>();
485
+
486
+ if (options.codeAllowHttpGets) {
487
+ // Add all methods that map to an HTTP GET
488
+ sdkMethods
489
+ .filter((method) => method.httpMethod === 'get')
490
+ .forEach((method) => allowedMethodsSet.add(method));
491
+ }
492
+
493
+ if (options.codeAllowedMethods) {
494
+ // Add all methods that match any of the allowed regexps
495
+ const allowedRegexps = options.codeAllowedMethods.map((pattern) => {
496
+ try {
497
+ return new RegExp(pattern);
498
+ } catch (e) {
499
+ throw new Error(
500
+ `Invalid regex pattern for allowed method: "${pattern}": ${e instanceof Error ? e.message : e}`,
501
+ );
502
+ }
503
+ });
504
+
505
+ sdkMethods
506
+ .filter((method) => allowedRegexps.some((regexp) => regexp.test(method.fullyQualifiedName)))
507
+ .forEach((method) => allowedMethodsSet.add(method));
508
+ }
509
+
510
+ allowedMethods = Array.from(allowedMethodsSet);
511
+ } else {
512
+ // Start with everything allowed
513
+ allowedMethods = [...sdkMethods];
514
+ }
515
+
516
+ if (options.codeBlockedMethods) {
517
+ // Filter down based on blocked regexps
518
+ const blockedRegexps = options.codeBlockedMethods.map((pattern) => {
519
+ try {
520
+ return new RegExp(pattern);
521
+ } catch (e) {
522
+ throw new Error(
523
+ `Invalid regex pattern for blocked method: "${pattern}": ${e instanceof Error ? e.message : e}`,
524
+ );
525
+ }
526
+ });
527
+
528
+ allowedMethods = allowedMethods.filter(
529
+ (method) => !blockedRegexps.some((regexp) => regexp.test(method.fullyQualifiedName)),
530
+ );
531
+ }
532
+
533
+ return allowedMethods;
534
+ }
535
+
536
+ export function blockedMethodsForCodeTool(options: McpOptions | undefined): SdkMethod[] | undefined {
537
+ const allowedMethods = allowedMethodsForCodeTool(options);
538
+ if (!allowedMethods) {
539
+ return undefined;
540
+ }
541
+
542
+ const allowedSet = new Set(allowedMethods.map((method) => method.fullyQualifiedName));
543
+
544
+ // Return any methods that are not explicitly allowed
545
+ return sdkMethods.filter((method) => !allowedSet.has(method.fullyQualifiedName));
546
+ }
package/src/options.ts CHANGED
@@ -4,6 +4,7 @@ import { hideBin } from 'yargs/helpers';
4
4
  import z from 'zod';
5
5
 
6
6
  export type CLIOptions = McpOptions & {
7
+ debug: boolean;
7
8
  transport: 'stdio' | 'http';
8
9
  port: number | undefined;
9
10
  socket: string | undefined;
@@ -11,36 +12,57 @@ export type CLIOptions = McpOptions & {
11
12
 
12
13
  export type McpOptions = {
13
14
  includeDocsTools?: boolean | undefined;
15
+ codeAllowHttpGets?: boolean | undefined;
16
+ codeAllowedMethods?: string[] | undefined;
17
+ codeBlockedMethods?: string[] | undefined;
14
18
  };
15
19
 
16
20
  export function parseCLIOptions(): CLIOptions {
17
21
  const opts = yargs(hideBin(process.argv))
18
- .option('tools', {
22
+ .option('code-allow-http-gets', {
23
+ type: 'boolean',
24
+ description:
25
+ 'Allow all code tool methods that map to HTTP GET operations. If all code-allow-* flags are unset, then everything is allowed.',
26
+ })
27
+ .option('code-allowed-methods', {
19
28
  type: 'string',
20
29
  array: true,
21
- choices: ['code', 'docs'],
22
- description: 'Use dynamic tools or all tools',
30
+ description:
31
+ 'Methods to explicitly allow for code tool. Evaluated as regular expressions against method fully qualified names. If all code-allow-* flags are unset, then everything is allowed.',
23
32
  })
24
- .option('no-tools', {
33
+ .option('code-blocked-methods', {
25
34
  type: 'string',
26
35
  array: true,
27
- choices: ['code', 'docs'],
28
- description: 'Do not use any dynamic or all tools',
36
+ description:
37
+ 'Methods to explicitly block for code tool. Evaluated as regular expressions against method fully qualified names. If all code-allow-* flags are unset, then everything is allowed.',
29
38
  })
30
- .option('transport', {
39
+ .option('debug', { type: 'boolean', description: 'Enable debug logging' })
40
+ .option('no-tools', {
31
41
  type: 'string',
32
- choices: ['stdio', 'http'],
33
- default: 'stdio',
34
- description: 'What transport to use; stdio for local servers or http for remote servers',
42
+ array: true,
43
+ choices: ['code', 'docs'],
44
+ description: 'Tools to explicitly disable',
35
45
  })
36
46
  .option('port', {
37
47
  type: 'number',
48
+ default: 3000,
38
49
  description: 'Port to serve on if using http transport',
39
50
  })
40
- .option('socket', {
51
+ .option('socket', { type: 'string', description: 'Unix socket to serve on if using http transport' })
52
+ .option('tools', {
53
+ type: 'string',
54
+ array: true,
55
+ choices: ['code', 'docs'],
56
+ description: 'Tools to explicitly enable',
57
+ })
58
+ .option('transport', {
41
59
  type: 'string',
42
- description: 'Unix socket to serve on if using http transport',
60
+ choices: ['stdio', 'http'],
61
+ default: 'stdio',
62
+ description: 'What transport to use; stdio for local servers or http for remote servers',
43
63
  })
64
+ .env('MCP_SERVER')
65
+ .version(true)
44
66
  .help();
45
67
 
46
68
  const argv = opts.parseSync();
@@ -56,6 +78,10 @@ export function parseCLIOptions(): CLIOptions {
56
78
 
57
79
  return {
58
80
  ...(includeDocsTools !== undefined && { includeDocsTools }),
81
+ debug: !!argv.debug,
82
+ codeAllowHttpGets: argv.codeAllowHttpGets,
83
+ codeAllowedMethods: argv.codeAllowedMethods,
84
+ codeBlockedMethods: argv.codeBlockedMethods,
59
85
  transport,
60
86
  port: argv.port,
61
87
  socket: argv.socket,