mcp-resend 1.0.0-1

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 (56) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +257 -0
  3. package/data/embeddings.json +245241 -0
  4. package/dist/config/environment.d.ts +152 -0
  5. package/dist/config/environment.d.ts.map +1 -0
  6. package/dist/config/environment.js +217 -0
  7. package/dist/config/environment.js.map +1 -0
  8. package/dist/index.d.ts +13 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +119 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/services/rate-limiter.d.ts +90 -0
  13. package/dist/services/rate-limiter.d.ts.map +1 -0
  14. package/dist/services/rate-limiter.js +267 -0
  15. package/dist/services/rate-limiter.js.map +1 -0
  16. package/dist/services/tool-registry.d.ts +219 -0
  17. package/dist/services/tool-registry.d.ts.map +1 -0
  18. package/dist/services/tool-registry.js +459 -0
  19. package/dist/services/tool-registry.js.map +1 -0
  20. package/dist/tools/docs/embeddings-loader.d.ts +69 -0
  21. package/dist/tools/docs/embeddings-loader.d.ts.map +1 -0
  22. package/dist/tools/docs/embeddings-loader.js +218 -0
  23. package/dist/tools/docs/embeddings-loader.js.map +1 -0
  24. package/dist/tools/docs/errors.d.ts +75 -0
  25. package/dist/tools/docs/errors.d.ts.map +1 -0
  26. package/dist/tools/docs/errors.js +145 -0
  27. package/dist/tools/docs/errors.js.map +1 -0
  28. package/dist/tools/docs/index.d.ts +11 -0
  29. package/dist/tools/docs/index.d.ts.map +1 -0
  30. package/dist/tools/docs/index.js +14 -0
  31. package/dist/tools/docs/index.js.map +1 -0
  32. package/dist/tools/docs/metrics.d.ts +94 -0
  33. package/dist/tools/docs/metrics.d.ts.map +1 -0
  34. package/dist/tools/docs/metrics.js +174 -0
  35. package/dist/tools/docs/metrics.js.map +1 -0
  36. package/dist/tools/docs/search-docs-tool.d.ts +54 -0
  37. package/dist/tools/docs/search-docs-tool.d.ts.map +1 -0
  38. package/dist/tools/docs/search-docs-tool.js +231 -0
  39. package/dist/tools/docs/search-docs-tool.js.map +1 -0
  40. package/dist/tools/docs/types.d.ts +70 -0
  41. package/dist/tools/docs/types.d.ts.map +1 -0
  42. package/dist/tools/docs/types.js +7 -0
  43. package/dist/tools/docs/types.js.map +1 -0
  44. package/dist/tools/docs/vector-search.d.ts +80 -0
  45. package/dist/tools/docs/vector-search.d.ts.map +1 -0
  46. package/dist/tools/docs/vector-search.js +297 -0
  47. package/dist/tools/docs/vector-search.js.map +1 -0
  48. package/dist/tools/index.d.ts +27 -0
  49. package/dist/tools/index.d.ts.map +1 -0
  50. package/dist/tools/index.js +3413 -0
  51. package/dist/tools/index.js.map +1 -0
  52. package/dist/utils/mcp-errors.d.ts +109 -0
  53. package/dist/utils/mcp-errors.d.ts.map +1 -0
  54. package/dist/utils/mcp-errors.js +306 -0
  55. package/dist/utils/mcp-errors.js.map +1 -0
  56. package/package.json +77 -0
@@ -0,0 +1,459 @@
1
+ /**
2
+ * Tool Registry for Dynamic MCP Tool Discovery
3
+ *
4
+ * Manages tool loading/unloading by tier and scope, enabling dynamic tool discovery
5
+ * and permission-based access control.
6
+ *
7
+ * @module services/tool-registry
8
+ */
9
+ // NOTE: Use console.error for logging - stdout is reserved for MCP protocol
10
+ const log = (message) => console.error(`[tool-registry] ${message}`);
11
+ // ============================================================================
12
+ // Module-Level State
13
+ // ============================================================================
14
+ /**
15
+ * All registered tools, indexed by name.
16
+ */
17
+ const registeredTools = new Map();
18
+ /**
19
+ * Currently enabled tool names.
20
+ */
21
+ const enabledTools = new Set();
22
+ /**
23
+ * MCP Server reference for notifications.
24
+ */
25
+ let serverInstance = null;
26
+ /**
27
+ * Tools organized by tier for efficient loading.
28
+ */
29
+ const toolsByTier = {
30
+ core: [],
31
+ secondary: [],
32
+ tertiary: [],
33
+ };
34
+ // NOTE: Tool tier arrays define which tools belong to each tier
35
+ // These are populated by registerTool() calls during initialization
36
+ /**
37
+ * Core tools - essential functionality (always available).
38
+ */
39
+ export const CORE_TOOLS = [
40
+ "send_email",
41
+ "get_email",
42
+ "list_emails",
43
+ "list_domains",
44
+ "search_resend_documentation",
45
+ ];
46
+ /**
47
+ * Secondary tools - commonly used features.
48
+ */
49
+ export const SECONDARY_TOOLS = [
50
+ // Domain
51
+ "get_domain",
52
+ "create_domain",
53
+ "update_domain",
54
+ "verify_domain",
55
+ // Email
56
+ "update_email",
57
+ "cancel_email",
58
+ // Contact
59
+ "list_contacts",
60
+ "create_contact",
61
+ "get_contact",
62
+ "update_contact",
63
+ // Template
64
+ "list_templates",
65
+ "create_template",
66
+ "get_template",
67
+ "update_template",
68
+ "publish_template",
69
+ "duplicate_template",
70
+ // Webhook
71
+ "list_webhooks",
72
+ "create_webhook",
73
+ "get_webhook",
74
+ "update_webhook",
75
+ // Audience
76
+ "list_audiences",
77
+ "create_audience",
78
+ "get_audience",
79
+ ];
80
+ /**
81
+ * Tertiary tools - advanced/admin features.
82
+ * NOTE: API key operations are EXCLUDED for security reasons.
83
+ */
84
+ export const TERTIARY_TOOLS = [
85
+ // Destructive Operations
86
+ "delete_domain",
87
+ "delete_contact",
88
+ "delete_template",
89
+ "delete_topic",
90
+ "delete_webhook",
91
+ "delete_segment",
92
+ "delete_broadcast",
93
+ "delete_contact_property",
94
+ // Batch Operations
95
+ "send_batch_emails",
96
+ // Broadcast Operations
97
+ "list_broadcasts",
98
+ "create_broadcast",
99
+ "get_broadcast",
100
+ "update_broadcast",
101
+ "send_broadcast",
102
+ // Segment Operations
103
+ "list_segments",
104
+ "create_segment",
105
+ "get_segment",
106
+ "add_contact_to_segment",
107
+ "remove_contact_from_segment",
108
+ // Contact Property Operations
109
+ "list_contact_properties",
110
+ "create_contact_property",
111
+ "get_contact_property",
112
+ "update_contact_property",
113
+ // Inbound Email Operations
114
+ "list_received_emails",
115
+ "get_received_email",
116
+ "list_received_email_attachments",
117
+ "get_received_email_attachment",
118
+ // Sent Email Attachment Operations
119
+ "list_email_attachments",
120
+ "get_email_attachment",
121
+ // Topic Advanced Operations
122
+ "get_topic",
123
+ "update_topic",
124
+ "get_contact_topics",
125
+ "update_contact_topics",
126
+ // Contact Segment Operations
127
+ "list_contact_segments",
128
+ ];
129
+ // ============================================================================
130
+ // Public API
131
+ // ============================================================================
132
+ /**
133
+ * Initialize the tool registry with an MCP server instance.
134
+ *
135
+ * @param server - MCP Server instance for notifications
136
+ * @param tools - Initial tools to register
137
+ *
138
+ * @example
139
+ * ```typescript
140
+ * const server = new Server({ name: "resend-mcp" }, { capabilities: { tools: {} } });
141
+ * initializeRegistry(server, [sendEmailTool, listDomainsTool]);
142
+ * ```
143
+ */
144
+ export function initializeRegistry(server, tools = []) {
145
+ serverInstance = server;
146
+ // Register all provided tools
147
+ for (const tool of tools) {
148
+ registerTool(tool);
149
+ }
150
+ log(`Registry initialized with ${tools.length} tools`);
151
+ }
152
+ /**
153
+ * Register a tool in the registry.
154
+ *
155
+ * @param tool - Tool definition to register
156
+ */
157
+ export function registerTool(tool) {
158
+ if (registeredTools.has(tool.name)) {
159
+ log(`Warning: Overwriting existing tool '${tool.name}'`);
160
+ }
161
+ registeredTools.set(tool.name, tool);
162
+ toolsByTier[tool.tier].push(tool.name);
163
+ log(`Registered tool: ${tool.name} (tier: ${tool.tier})`);
164
+ }
165
+ /**
166
+ * Unregister a tool from the registry.
167
+ *
168
+ * @param name - Tool name to unregister
169
+ */
170
+ export function unregisterTool(name) {
171
+ const tool = registeredTools.get(name);
172
+ if (!tool) {
173
+ return;
174
+ }
175
+ registeredTools.delete(name);
176
+ enabledTools.delete(name);
177
+ // Remove from tier list
178
+ const tierTools = toolsByTier[tool.tier];
179
+ const index = tierTools.indexOf(name);
180
+ if (index >= 0) {
181
+ tierTools.splice(index, 1);
182
+ }
183
+ log(`Unregistered tool: ${name}`);
184
+ }
185
+ /**
186
+ * Load all tools of a specific tier (and lower tiers).
187
+ *
188
+ * @param tier - Tier to load (includes all lower tiers)
189
+ *
190
+ * @example
191
+ * ```typescript
192
+ * loadTier("secondary"); // Loads core + secondary tools
193
+ * ```
194
+ */
195
+ export async function loadTier(tier) {
196
+ const previousCount = enabledTools.size;
197
+ // Always include core tools
198
+ for (const name of toolsByTier.core) {
199
+ if (registeredTools.has(name)) {
200
+ enabledTools.add(name);
201
+ }
202
+ }
203
+ // Include secondary tools if tier is secondary or tertiary
204
+ if (tier === "secondary" || tier === "tertiary") {
205
+ for (const name of toolsByTier.secondary) {
206
+ if (registeredTools.has(name)) {
207
+ enabledTools.add(name);
208
+ }
209
+ }
210
+ }
211
+ // Include tertiary tools if tier is tertiary
212
+ if (tier === "tertiary") {
213
+ for (const name of toolsByTier.tertiary) {
214
+ if (registeredTools.has(name)) {
215
+ enabledTools.add(name);
216
+ }
217
+ }
218
+ }
219
+ const newCount = enabledTools.size;
220
+ log(`Loaded tier '${tier}': ${newCount} tools enabled (was ${previousCount})`);
221
+ // Notify server of tool list change
222
+ await notifyToolsChanged();
223
+ }
224
+ /**
225
+ * Unload all tools of a specific tier (keeps lower tiers).
226
+ *
227
+ * @param tier - Tier to unload
228
+ *
229
+ * @example
230
+ * ```typescript
231
+ * unloadTier("tertiary"); // Removes only tertiary tools
232
+ * ```
233
+ */
234
+ export async function unloadTier(tier) {
235
+ const previousCount = enabledTools.size;
236
+ // Unload specified tier
237
+ for (const name of toolsByTier[tier]) {
238
+ enabledTools.delete(name);
239
+ }
240
+ // If unloading secondary, also unload tertiary
241
+ if (tier === "secondary") {
242
+ for (const name of toolsByTier.tertiary) {
243
+ enabledTools.delete(name);
244
+ }
245
+ }
246
+ // If unloading core, unload everything
247
+ if (tier === "core") {
248
+ for (const name of toolsByTier.secondary) {
249
+ enabledTools.delete(name);
250
+ }
251
+ for (const name of toolsByTier.tertiary) {
252
+ enabledTools.delete(name);
253
+ }
254
+ }
255
+ const newCount = enabledTools.size;
256
+ log(`Unloaded tier '${tier}': ${newCount} tools enabled (was ${previousCount})`);
257
+ // Notify server of tool list change
258
+ await notifyToolsChanged();
259
+ }
260
+ /**
261
+ * Load tools by scope(s).
262
+ *
263
+ * @param scopes - Scopes to enable
264
+ *
265
+ * @example
266
+ * ```typescript
267
+ * loadByScope(["read", "write"]); // Enable tools with read or write scope
268
+ * ```
269
+ */
270
+ export async function loadByScope(scopes) {
271
+ const previousCount = enabledTools.size;
272
+ const scopeSet = new Set(scopes);
273
+ // Enable tools that have at least one matching scope
274
+ for (const [name, tool] of registeredTools) {
275
+ const hasMatchingScope = tool.scopes.some((s) => scopeSet.has(s));
276
+ if (hasMatchingScope) {
277
+ enabledTools.add(name);
278
+ }
279
+ }
280
+ const newCount = enabledTools.size;
281
+ log(`Loaded scopes [${scopes.join(", ")}]: ${newCount} tools enabled (was ${previousCount})`);
282
+ // Notify server of tool list change
283
+ await notifyToolsChanged();
284
+ }
285
+ /**
286
+ * Unload tools by scope(s).
287
+ *
288
+ * @param scopes - Scopes to disable
289
+ */
290
+ export async function unloadByScope(scopes) {
291
+ const previousCount = enabledTools.size;
292
+ const scopeSet = new Set(scopes);
293
+ // Disable tools that have ALL scopes in the provided list
294
+ for (const [name, tool] of registeredTools) {
295
+ const allScopesMatch = tool.scopes.every((s) => scopeSet.has(s));
296
+ if (allScopesMatch) {
297
+ enabledTools.delete(name);
298
+ }
299
+ }
300
+ const newCount = enabledTools.size;
301
+ log(`Unloaded scopes [${scopes.join(", ")}]: ${newCount} tools enabled (was ${previousCount})`);
302
+ // Notify server of tool list change
303
+ await notifyToolsChanged();
304
+ }
305
+ /**
306
+ * Get all currently enabled tools as MCP tool definitions.
307
+ *
308
+ * @returns Array of MCP tool definitions
309
+ */
310
+ export function getEnabledTools() {
311
+ const tools = [];
312
+ for (const name of enabledTools) {
313
+ const tool = registeredTools.get(name);
314
+ if (tool) {
315
+ tools.push({
316
+ name: tool.name,
317
+ description: tool.description,
318
+ inputSchema: tool.inputSchema,
319
+ annotations: tool.annotations,
320
+ });
321
+ }
322
+ }
323
+ return tools;
324
+ }
325
+ /**
326
+ * Check if a tool is currently enabled.
327
+ *
328
+ * @param name - Tool name to check
329
+ * @returns True if tool is enabled
330
+ */
331
+ export function isToolEnabled(name) {
332
+ return enabledTools.has(name);
333
+ }
334
+ /**
335
+ * Get a tool definition by name.
336
+ *
337
+ * @param name - Tool name
338
+ * @returns Tool definition or undefined
339
+ */
340
+ export function getTool(name) {
341
+ return registeredTools.get(name);
342
+ }
343
+ /**
344
+ * Get a tool's execute function if the tool is enabled.
345
+ *
346
+ * @param name - Tool name
347
+ * @returns Execute function or undefined
348
+ */
349
+ export function getToolExecutor(name) {
350
+ if (!enabledTools.has(name)) {
351
+ return undefined;
352
+ }
353
+ return registeredTools.get(name)?.execute;
354
+ }
355
+ /**
356
+ * Get registry statistics for debugging.
357
+ *
358
+ * @returns Registry statistics
359
+ */
360
+ export function getRegistryStats() {
361
+ const stats = {
362
+ totalRegistered: registeredTools.size,
363
+ totalEnabled: enabledTools.size,
364
+ byTier: {
365
+ core: toolsByTier.core.length,
366
+ secondary: toolsByTier.secondary.length,
367
+ tertiary: toolsByTier.tertiary.length,
368
+ },
369
+ enabledByTier: {
370
+ core: 0,
371
+ secondary: 0,
372
+ tertiary: 0,
373
+ },
374
+ enabledTools: [],
375
+ };
376
+ // Count enabled by tier
377
+ for (const name of enabledTools) {
378
+ const tool = registeredTools.get(name);
379
+ if (tool) {
380
+ stats.enabledByTier[tool.tier]++;
381
+ stats.enabledTools.push(name);
382
+ }
383
+ }
384
+ return stats;
385
+ }
386
+ /**
387
+ * Reset the registry to initial state.
388
+ * Useful for testing or reconfiguration.
389
+ */
390
+ export function resetRegistry() {
391
+ registeredTools.clear();
392
+ enabledTools.clear();
393
+ toolsByTier.core = [];
394
+ toolsByTier.secondary = [];
395
+ toolsByTier.tertiary = [];
396
+ serverInstance = null;
397
+ log("Registry reset");
398
+ }
399
+ /**
400
+ * Enable a specific tool by name.
401
+ *
402
+ * @param name - Tool name to enable
403
+ * @returns True if tool was enabled
404
+ */
405
+ export async function enableTool(name) {
406
+ if (!registeredTools.has(name)) {
407
+ log(`Cannot enable unknown tool: ${name}`);
408
+ return false;
409
+ }
410
+ if (enabledTools.has(name)) {
411
+ return true; // Already enabled
412
+ }
413
+ enabledTools.add(name);
414
+ log(`Enabled tool: ${name}`);
415
+ await notifyToolsChanged();
416
+ return true;
417
+ }
418
+ /**
419
+ * Disable a specific tool by name.
420
+ *
421
+ * @param name - Tool name to disable
422
+ * @returns True if tool was disabled
423
+ */
424
+ export async function disableTool(name) {
425
+ if (!enabledTools.has(name)) {
426
+ return true; // Already disabled
427
+ }
428
+ enabledTools.delete(name);
429
+ log(`Disabled tool: ${name}`);
430
+ await notifyToolsChanged();
431
+ return true;
432
+ }
433
+ // ============================================================================
434
+ // Internal Helpers
435
+ // ============================================================================
436
+ /**
437
+ * Send notification that tool list has changed.
438
+ * MCP clients should re-fetch the tool list.
439
+ */
440
+ async function notifyToolsChanged() {
441
+ if (!serverInstance) {
442
+ log("Warning: No server instance for notification");
443
+ return;
444
+ }
445
+ try {
446
+ // NOTE: MCP SDK may require specific notification format
447
+ // The notification name follows MCP spec: "notifications/tools/list_changed"
448
+ await serverInstance.notification({
449
+ method: "notifications/tools/list_changed",
450
+ });
451
+ log("Sent tools/list_changed notification");
452
+ }
453
+ catch (error) {
454
+ // Notification failures are non-fatal
455
+ const message = error instanceof Error ? error.message : String(error);
456
+ log(`Warning: Failed to send notification: ${message}`);
457
+ }
458
+ }
459
+ //# sourceMappingURL=tool-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-registry.js","sourceRoot":"","sources":["../../src/services/tool-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Lazy loader for pre-computed embeddings.
3
+ * Loads embeddings from data/embeddings.json on first access and caches them.
4
+ * Uses ES module path resolution for compatibility with both dev (tsx) and production (node).
5
+ */
6
+ /** Expected schema version - must match build-embeddings.ts INDEX_VERSION */
7
+ export declare const EXPECTED_SCHEMA_VERSION = "1.0.0";
8
+ /** Expected embedding dimensions for Xenova/all-MiniLM-L6-v2 */
9
+ export declare const EXPECTED_DIMENSIONS = 384;
10
+ /**
11
+ * Structure of the embeddings index file.
12
+ * Mirrors the EmbeddingsIndex from scripts/types.ts but defined here
13
+ * to avoid importing build-time dependencies at runtime.
14
+ */
15
+ export interface EmbeddingsIndex {
16
+ version: string;
17
+ model: string;
18
+ dimensions: number;
19
+ generatedAt: string;
20
+ sourceHash: string;
21
+ chunks: EmbeddingChunk[];
22
+ }
23
+ /**
24
+ * A single chunk with its embedding vector.
25
+ */
26
+ export interface EmbeddingChunk {
27
+ id: string;
28
+ section: string;
29
+ content: string;
30
+ tokenCount: number;
31
+ embedding: number[];
32
+ sourceUrl?: string;
33
+ }
34
+ /**
35
+ * Load embeddings asynchronously with caching.
36
+ * Safe to call multiple times; will return cached data after first load.
37
+ * Concurrent calls will share the same loading promise.
38
+ *
39
+ * @returns Promise resolving to the embeddings index
40
+ * @throws Error if embeddings file is missing or invalid
41
+ */
42
+ export declare function loadEmbeddings(): Promise<EmbeddingsIndex>;
43
+ /**
44
+ * Get cached embeddings synchronously.
45
+ * Returns null if embeddings haven't been loaded yet.
46
+ * Use loadEmbeddings() for guaranteed access.
47
+ *
48
+ * @returns The cached embeddings index, or null if not loaded
49
+ */
50
+ export declare function getLoadedEmbeddings(): EmbeddingsIndex | null;
51
+ /**
52
+ * Clear the embeddings cache.
53
+ * Primarily for testing purposes.
54
+ */
55
+ export declare function clearEmbeddingsCache(): void;
56
+ /**
57
+ * Get the freshness warning message if embeddings are stale.
58
+ * Returns null if embeddings are fresh or not yet loaded.
59
+ *
60
+ * @returns Freshness warning message, or null
61
+ */
62
+ export declare function getFreshnessWarning(): string | null;
63
+ /**
64
+ * Check if embeddings are currently loaded.
65
+ *
66
+ * @returns true if embeddings are cached
67
+ */
68
+ export declare function isEmbeddingsLoaded(): boolean;
69
+ //# sourceMappingURL=embeddings-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings-loader.d.ts","sourceRoot":"","sources":["../../../src/tools/docs/embeddings-loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,6EAA6E;AAC7E,eAAO,MAAM,uBAAuB,UAAU,CAAC;AAE/C,gEAAgE;AAChE,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAQvC;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA0LD;;;;;;;GAOG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC,CAwB/D;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,IAAI,eAAe,GAAG,IAAI,CAE5D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAK3C;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAEnD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C"}