@portel/photon 1.0.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 (76) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +952 -0
  3. package/dist/base.d.ts +58 -0
  4. package/dist/base.d.ts.map +1 -0
  5. package/dist/base.js +92 -0
  6. package/dist/base.js.map +1 -0
  7. package/dist/cli.d.ts +8 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +1441 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/dependency-manager.d.ts +49 -0
  12. package/dist/dependency-manager.d.ts.map +1 -0
  13. package/dist/dependency-manager.js +165 -0
  14. package/dist/dependency-manager.js.map +1 -0
  15. package/dist/loader.d.ts +86 -0
  16. package/dist/loader.d.ts.map +1 -0
  17. package/dist/loader.js +612 -0
  18. package/dist/loader.js.map +1 -0
  19. package/dist/marketplace-manager.d.ts +261 -0
  20. package/dist/marketplace-manager.d.ts.map +1 -0
  21. package/dist/marketplace-manager.js +767 -0
  22. package/dist/marketplace-manager.js.map +1 -0
  23. package/dist/path-resolver.d.ts +21 -0
  24. package/dist/path-resolver.d.ts.map +1 -0
  25. package/dist/path-resolver.js +71 -0
  26. package/dist/path-resolver.js.map +1 -0
  27. package/dist/photon-doc-extractor.d.ts +89 -0
  28. package/dist/photon-doc-extractor.d.ts.map +1 -0
  29. package/dist/photon-doc-extractor.js +228 -0
  30. package/dist/photon-doc-extractor.js.map +1 -0
  31. package/dist/readme-syncer.d.ts +33 -0
  32. package/dist/readme-syncer.d.ts.map +1 -0
  33. package/dist/readme-syncer.js +93 -0
  34. package/dist/readme-syncer.js.map +1 -0
  35. package/dist/registry-manager.d.ts +76 -0
  36. package/dist/registry-manager.d.ts.map +1 -0
  37. package/dist/registry-manager.js +220 -0
  38. package/dist/registry-manager.js.map +1 -0
  39. package/dist/schema-extractor.d.ts +83 -0
  40. package/dist/schema-extractor.d.ts.map +1 -0
  41. package/dist/schema-extractor.js +396 -0
  42. package/dist/schema-extractor.js.map +1 -0
  43. package/dist/security-scanner.d.ts +52 -0
  44. package/dist/security-scanner.d.ts.map +1 -0
  45. package/dist/security-scanner.js +172 -0
  46. package/dist/security-scanner.js.map +1 -0
  47. package/dist/server.d.ts +73 -0
  48. package/dist/server.d.ts.map +1 -0
  49. package/dist/server.js +474 -0
  50. package/dist/server.js.map +1 -0
  51. package/dist/template-manager.d.ts +56 -0
  52. package/dist/template-manager.d.ts.map +1 -0
  53. package/dist/template-manager.js +509 -0
  54. package/dist/template-manager.js.map +1 -0
  55. package/dist/test-client.d.ts +52 -0
  56. package/dist/test-client.d.ts.map +1 -0
  57. package/dist/test-client.js +168 -0
  58. package/dist/test-client.js.map +1 -0
  59. package/dist/test-marketplace-sources.d.ts +5 -0
  60. package/dist/test-marketplace-sources.d.ts.map +1 -0
  61. package/dist/test-marketplace-sources.js +53 -0
  62. package/dist/test-marketplace-sources.js.map +1 -0
  63. package/dist/types.d.ts +108 -0
  64. package/dist/types.d.ts.map +1 -0
  65. package/dist/types.js +12 -0
  66. package/dist/types.js.map +1 -0
  67. package/dist/version-checker.d.ts +48 -0
  68. package/dist/version-checker.d.ts.map +1 -0
  69. package/dist/version-checker.js +128 -0
  70. package/dist/version-checker.js.map +1 -0
  71. package/dist/watcher.d.ts +26 -0
  72. package/dist/watcher.d.ts.map +1 -0
  73. package/dist/watcher.js +72 -0
  74. package/dist/watcher.js.map +1 -0
  75. package/package.json +79 -0
  76. package/templates/photon.template.ts +55 -0
package/dist/loader.js ADDED
@@ -0,0 +1,612 @@
1
+ /**
2
+ * Photon MCP Loader
3
+ *
4
+ * Loads a single .photon.ts file and extracts tools
5
+ */
6
+ import * as fs from 'fs/promises';
7
+ import * as path from 'path';
8
+ import { pathToFileURL } from 'url';
9
+ import * as crypto from 'crypto';
10
+ import { SchemaExtractor } from './schema-extractor.js';
11
+ import * as os from 'os';
12
+ import { DependencyManager } from './dependency-manager.js';
13
+ export class PhotonLoader {
14
+ dependencyManager;
15
+ verbose;
16
+ constructor(verbose = false) {
17
+ this.dependencyManager = new DependencyManager();
18
+ this.verbose = verbose;
19
+ }
20
+ /**
21
+ * Log message only if verbose mode is enabled
22
+ */
23
+ log(message) {
24
+ if (this.verbose) {
25
+ console.error(message);
26
+ }
27
+ }
28
+ /**
29
+ * Load a single Photon MCP file
30
+ */
31
+ async loadFile(filePath) {
32
+ try {
33
+ // Resolve to absolute path
34
+ const absolutePath = path.resolve(filePath);
35
+ // Check file exists
36
+ await fs.access(absolutePath);
37
+ // Convert file path to file:// URL for ESM imports
38
+ let module;
39
+ if (absolutePath.endsWith('.ts')) {
40
+ // Extract and install dependencies before compilation
41
+ const dependencies = await this.dependencyManager.extractDependencies(absolutePath);
42
+ const mcpName = path.basename(absolutePath, '.ts').replace('.photon', '');
43
+ if (dependencies.length > 0) {
44
+ this.log(`📦 Found ${dependencies.length} dependencies`);
45
+ await this.dependencyManager.ensureDependencies(mcpName, dependencies);
46
+ }
47
+ // Compile TypeScript to JavaScript using esbuild
48
+ const cachedJsPath = await this.compileTypeScript(absolutePath, mcpName);
49
+ const cachedJsUrl = pathToFileURL(cachedJsPath).href;
50
+ // Add cache busting to avoid stale imports
51
+ module = await import(`${cachedJsUrl}?t=${Date.now()}`);
52
+ }
53
+ else {
54
+ // Regular JavaScript import
55
+ const fileUrl = pathToFileURL(absolutePath).href;
56
+ module = await import(`${fileUrl}?t=${Date.now()}`);
57
+ }
58
+ // Find the exported class
59
+ const MCPClass = this.findMCPClass(module);
60
+ if (!MCPClass) {
61
+ throw new Error('No MCP class found in file. Expected a class with async methods.');
62
+ }
63
+ // Get MCP name
64
+ const name = this.getMCPName(MCPClass);
65
+ // Extract constructor parameters from source
66
+ const constructorParams = await this.extractConstructorParams(absolutePath);
67
+ // Resolve values from environment variables
68
+ const { values, configError } = this.resolveConstructorArgs(constructorParams, name);
69
+ // Create instance with injected config
70
+ let instance;
71
+ try {
72
+ instance = new MCPClass(...values);
73
+ }
74
+ catch (error) {
75
+ // Constructor threw an error (likely validation failure)
76
+ // Enhance the error message with config information
77
+ const enhancedError = this.enhanceConstructorError(error, name, constructorParams, configError);
78
+ throw enhancedError;
79
+ }
80
+ // Store config warning for later if there were missing params
81
+ // (constructor didn't throw, but params were missing - they had defaults)
82
+ if (configError) {
83
+ instance._photonConfigError = configError;
84
+ console.error(`⚠️ ${name} loaded with configuration warnings:`);
85
+ console.error(configError);
86
+ }
87
+ // Call lifecycle hook if present with error handling
88
+ if (instance.onInitialize) {
89
+ try {
90
+ await instance.onInitialize();
91
+ }
92
+ catch (error) {
93
+ const initError = new Error(`Initialization failed for ${name}: ${error.message}\n` +
94
+ `\nThe onInitialize() lifecycle hook threw an error.\n` +
95
+ `Check your constructor configuration and initialization logic.`);
96
+ initError.name = 'PhotonInitializationError';
97
+ initError.stack = error.stack;
98
+ throw initError;
99
+ }
100
+ }
101
+ // Extract tools, templates, and statics (with schema override support)
102
+ const { tools, templates, statics } = await this.extractTools(MCPClass, absolutePath);
103
+ const counts = [
104
+ tools.length > 0 ? `${tools.length} tools` : null,
105
+ templates.length > 0 ? `${templates.length} templates` : null,
106
+ statics.length > 0 ? `${statics.length} statics` : null,
107
+ ].filter(Boolean).join(', ');
108
+ this.log(`✅ Loaded: ${name} (${counts})`);
109
+ return {
110
+ name,
111
+ description: `${name} MCP`,
112
+ tools,
113
+ templates,
114
+ statics,
115
+ instance,
116
+ };
117
+ }
118
+ catch (error) {
119
+ console.error(`❌ Failed to load ${filePath}: ${error.message}`);
120
+ throw error;
121
+ }
122
+ }
123
+ /**
124
+ * Reload a Photon MCP file (for hot reload)
125
+ */
126
+ async reloadFile(filePath) {
127
+ // Invalidate the cache for this file
128
+ const absolutePath = path.resolve(filePath);
129
+ if (absolutePath.endsWith('.ts')) {
130
+ // Clear the compiled cache
131
+ const tsContent = await fs.readFile(absolutePath, 'utf-8');
132
+ const hash = crypto.createHash('sha256').update(tsContent).digest('hex').slice(0, 16);
133
+ const mcpName = path.basename(absolutePath, '.ts').replace('.photon', '');
134
+ const cacheDir = path.join(os.homedir(), '.cache', 'photon-mcp', 'dependencies', mcpName);
135
+ const fileName = path.basename(absolutePath, '.ts');
136
+ const cachedJsPath = path.join(cacheDir, `${fileName}.${hash}.mjs`);
137
+ try {
138
+ await fs.unlink(cachedJsPath);
139
+ }
140
+ catch {
141
+ // Ignore if file doesn't exist
142
+ }
143
+ }
144
+ return this.loadFile(filePath);
145
+ }
146
+ /**
147
+ * Compile TypeScript file to JavaScript and cache it
148
+ */
149
+ async compileTypeScript(tsFilePath, mcpName) {
150
+ // Generate cache path based on file content hash
151
+ const tsContent = await fs.readFile(tsFilePath, 'utf-8');
152
+ const hash = crypto.createHash('sha256').update(tsContent).digest('hex').slice(0, 16);
153
+ // Store compiled files in the same directory as dependencies for module resolution
154
+ const cacheDir = path.join(os.homedir(), '.cache', 'photon-mcp', 'dependencies', mcpName);
155
+ const fileName = path.basename(tsFilePath, '.ts');
156
+ const cachedJsPath = path.join(cacheDir, `${fileName}.${hash}.mjs`);
157
+ // Check if cached version exists
158
+ try {
159
+ await fs.access(cachedJsPath);
160
+ this.log(`Using cached compiled version`);
161
+ return cachedJsPath;
162
+ }
163
+ catch {
164
+ // Cache miss - compile it
165
+ }
166
+ // Compile TypeScript to JavaScript
167
+ this.log(`Compiling ${path.basename(tsFilePath)} with esbuild...`);
168
+ const esbuild = await import('esbuild');
169
+ const result = await esbuild.transform(tsContent, {
170
+ loader: 'ts',
171
+ format: 'esm',
172
+ target: 'es2022',
173
+ sourcemap: 'inline'
174
+ });
175
+ // Ensure cache directory exists
176
+ await fs.mkdir(cacheDir, { recursive: true });
177
+ // Write compiled JavaScript to cache
178
+ await fs.writeFile(cachedJsPath, result.code, 'utf-8');
179
+ this.log(`Compiled and cached`);
180
+ return cachedJsPath;
181
+ }
182
+ /**
183
+ * Find the MCP class in a module
184
+ * Looks for default export or any class with async methods
185
+ */
186
+ findMCPClass(module) {
187
+ // Try default export first
188
+ if (module.default && this.isClass(module.default)) {
189
+ if (this.hasAsyncMethods(module.default)) {
190
+ return module.default;
191
+ }
192
+ }
193
+ // Try named exports
194
+ for (const exportedItem of Object.values(module)) {
195
+ if (this.isClass(exportedItem) && this.hasAsyncMethods(exportedItem)) {
196
+ return exportedItem;
197
+ }
198
+ }
199
+ return null;
200
+ }
201
+ /**
202
+ * Check if a function is a class constructor
203
+ */
204
+ isClass(fn) {
205
+ return typeof fn === 'function' && /^\s*class\s+/.test(fn.toString());
206
+ }
207
+ /**
208
+ * Check if a class has async methods
209
+ */
210
+ hasAsyncMethods(ClassConstructor) {
211
+ const prototype = ClassConstructor.prototype;
212
+ for (const key of Object.getOwnPropertyNames(prototype)) {
213
+ if (key === 'constructor')
214
+ continue;
215
+ const descriptor = Object.getOwnPropertyDescriptor(prototype, key);
216
+ if (descriptor && typeof descriptor.value === 'function') {
217
+ // Check if it's an async function
218
+ const fn = descriptor.value;
219
+ if (fn.constructor.name === 'AsyncFunction') {
220
+ return true;
221
+ }
222
+ }
223
+ }
224
+ return false;
225
+ }
226
+ /**
227
+ * Get MCP name from class
228
+ */
229
+ getMCPName(mcpClass) {
230
+ // Try to use PhotonMCP's method if available
231
+ if (typeof mcpClass.getMCPName === 'function') {
232
+ return mcpClass.getMCPName();
233
+ }
234
+ // Fallback: implement convention for plain classes
235
+ // Convert PascalCase to kebab-case (e.g., MyAwesomeMCP → my-awesome-mcp)
236
+ return mcpClass.name
237
+ .replace(/MCP$/, '') // Remove "MCP" suffix if present
238
+ .replace(/([A-Z])/g, '-$1')
239
+ .toLowerCase()
240
+ .replace(/^-/, ''); // Remove leading dash
241
+ }
242
+ /**
243
+ * Get tool methods from class
244
+ */
245
+ getToolMethods(mcpClass) {
246
+ // Try to use PhotonMCP's method if available
247
+ if (typeof mcpClass.getToolMethods === 'function') {
248
+ return mcpClass.getToolMethods();
249
+ }
250
+ // Fallback: implement convention for plain classes
251
+ const prototype = mcpClass.prototype;
252
+ const methods = [];
253
+ Object.getOwnPropertyNames(prototype).forEach((name) => {
254
+ // Skip constructor, private methods (starting with _), and lifecycle hooks
255
+ if (name !== 'constructor' &&
256
+ !name.startsWith('_') &&
257
+ name !== 'onInitialize' &&
258
+ name !== 'onShutdown' &&
259
+ typeof prototype[name] === 'function') {
260
+ methods.push(name);
261
+ }
262
+ });
263
+ return methods;
264
+ }
265
+ /**
266
+ * Extract tools, templates, and statics from a class
267
+ */
268
+ async extractTools(mcpClass, sourceFilePath) {
269
+ const methodNames = this.getToolMethods(mcpClass);
270
+ let tools = [];
271
+ let templates = [];
272
+ let statics = [];
273
+ try {
274
+ // First, try loading from manual schema override file
275
+ const schemaJsonPath = sourceFilePath.replace(/\.ts$/, '.schema.json');
276
+ try {
277
+ const schemaContent = await fs.readFile(schemaJsonPath, 'utf-8');
278
+ const schemas = JSON.parse(schemaContent);
279
+ // Process tools
280
+ if (schemas.tools) {
281
+ for (const schema of schemas.tools) {
282
+ if (methodNames.includes(schema.name)) {
283
+ tools.push({
284
+ name: schema.name,
285
+ description: schema.description || `${schema.name} tool`,
286
+ inputSchema: schema.inputSchema || { type: 'object', properties: {} },
287
+ });
288
+ }
289
+ }
290
+ }
291
+ // Process templates
292
+ if (schemas.templates) {
293
+ for (const schema of schemas.templates) {
294
+ if (methodNames.includes(schema.name)) {
295
+ templates.push({
296
+ name: schema.name,
297
+ description: schema.description || `${schema.name} template`,
298
+ inputSchema: schema.inputSchema || { type: 'object', properties: {} },
299
+ });
300
+ }
301
+ }
302
+ }
303
+ // Process statics
304
+ if (schemas.statics) {
305
+ for (const schema of schemas.statics) {
306
+ if (methodNames.includes(schema.name)) {
307
+ statics.push({
308
+ name: schema.name,
309
+ uri: schema.uri || `static://${schema.name}`,
310
+ description: schema.description || `${schema.name} resource`,
311
+ mimeType: schema.mimeType,
312
+ inputSchema: schema.inputSchema || { type: 'object', properties: {} },
313
+ });
314
+ }
315
+ }
316
+ }
317
+ this.log(`Loaded ${tools.length} tools, ${templates.length} templates, ${statics.length} statics from .schema.json override`);
318
+ return { tools, templates, statics };
319
+ }
320
+ catch (jsonError) {
321
+ // .schema.json doesn't exist, try extracting from .ts source
322
+ if (jsonError.code === 'ENOENT') {
323
+ const extractor = new SchemaExtractor();
324
+ const source = await fs.readFile(sourceFilePath, 'utf-8');
325
+ const metadata = extractor.extractAllFromSource(source);
326
+ // Filter by method names that exist in the class
327
+ tools = metadata.tools.filter(t => methodNames.includes(t.name));
328
+ templates = metadata.templates.filter(t => methodNames.includes(t.name));
329
+ statics = metadata.statics.filter(s => methodNames.includes(s.name));
330
+ this.log(`Extracted ${tools.length} tools, ${templates.length} templates, ${statics.length} statics from source`);
331
+ return { tools, templates, statics };
332
+ }
333
+ throw jsonError;
334
+ }
335
+ }
336
+ catch (error) {
337
+ console.error(`⚠️ Failed to extract schemas: ${error.message}. Using basic tools.`);
338
+ // Fallback: create basic tools without detailed schemas
339
+ for (const methodName of methodNames) {
340
+ tools.push({
341
+ name: methodName,
342
+ description: `${methodName} tool`,
343
+ inputSchema: {
344
+ type: 'object',
345
+ properties: {},
346
+ },
347
+ });
348
+ }
349
+ }
350
+ return { tools, templates, statics };
351
+ }
352
+ /**
353
+ * Extract constructor parameters from source file
354
+ */
355
+ async extractConstructorParams(filePath) {
356
+ try {
357
+ const source = await fs.readFile(filePath, 'utf-8');
358
+ const extractor = new SchemaExtractor();
359
+ return extractor.extractConstructorParams(source);
360
+ }
361
+ catch (error) {
362
+ console.error(`Failed to extract constructor params: ${error.message}`);
363
+ return [];
364
+ }
365
+ }
366
+ /**
367
+ * Resolve constructor arguments from environment variables
368
+ */
369
+ resolveConstructorArgs(params, mcpName) {
370
+ const values = [];
371
+ const missing = [];
372
+ for (const param of params) {
373
+ const envVarName = this.toEnvVarName(mcpName, param.name);
374
+ const envValue = process.env[envVarName];
375
+ if (envValue !== undefined) {
376
+ // Environment variable provided - parse and use it
377
+ values.push(this.parseEnvValue(envValue, param.type));
378
+ }
379
+ else if (param.hasDefault || param.isOptional) {
380
+ // Has default value or is optional - use undefined (constructor default will apply)
381
+ values.push(undefined);
382
+ }
383
+ else {
384
+ // Required parameter missing!
385
+ missing.push({
386
+ paramName: param.name,
387
+ envVarName,
388
+ type: param.type,
389
+ });
390
+ // Push undefined anyway so constructor doesn't break
391
+ values.push(undefined);
392
+ }
393
+ }
394
+ const configError = missing.length > 0
395
+ ? this.generateConfigErrorMessage(mcpName, missing)
396
+ : null;
397
+ return { values, configError };
398
+ }
399
+ /**
400
+ * Convert MCP name and parameter name to environment variable name
401
+ * Example: filesystem, workdir → FILESYSTEM_WORKDIR
402
+ */
403
+ toEnvVarName(mcpName, paramName) {
404
+ const mcpPrefix = mcpName.toUpperCase().replace(/-/g, '_');
405
+ const paramSuffix = paramName
406
+ .replace(/([A-Z])/g, '_$1')
407
+ .toUpperCase()
408
+ .replace(/^_/, '');
409
+ return `${mcpPrefix}_${paramSuffix}`;
410
+ }
411
+ /**
412
+ * Parse environment variable value based on TypeScript type
413
+ */
414
+ parseEnvValue(value, type) {
415
+ switch (type) {
416
+ case 'number':
417
+ return parseFloat(value);
418
+ case 'boolean':
419
+ return value.toLowerCase() === 'true';
420
+ case 'string':
421
+ default:
422
+ return value;
423
+ }
424
+ }
425
+ /**
426
+ * Enhance constructor error with configuration guidance
427
+ */
428
+ enhanceConstructorError(error, mcpName, constructorParams, configError) {
429
+ const originalMessage = error.message;
430
+ // Build detailed env var documentation with examples
431
+ const envVarDocs = constructorParams.map(param => {
432
+ const envVarName = this.toEnvVarName(mcpName, param.name);
433
+ const required = !param.isOptional && !param.hasDefault;
434
+ const status = required ? '[REQUIRED]' : '[OPTIONAL]';
435
+ // Generate helpful example values based on type and name
436
+ const exampleValue = this.generateExampleValue(param.name, param.type);
437
+ const defaultInfo = param.hasDefault
438
+ ? ` (default: ${JSON.stringify(param.defaultValue)})`
439
+ : '';
440
+ let line = ` • ${envVarName} ${status}`;
441
+ line += `\n Type: ${param.type}${defaultInfo}`;
442
+ if (exampleValue) {
443
+ line += `\n Example: ${envVarName}="${exampleValue}"`;
444
+ }
445
+ return line;
446
+ }).join('\n\n');
447
+ // Build example config with placeholder values
448
+ const envExample = {};
449
+ constructorParams.forEach(param => {
450
+ const envVarName = this.toEnvVarName(mcpName, param.name);
451
+ if (!param.isOptional && !param.hasDefault) {
452
+ envExample[envVarName] = this.generateExampleValue(param.name, param.type) || `your-${param.name}`;
453
+ }
454
+ });
455
+ const enhancedMessage = `
456
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
457
+ ❌ Configuration Error: ${mcpName} MCP failed to initialize
458
+
459
+ ${originalMessage}
460
+
461
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
462
+
463
+ 📋 Configuration Parameters:
464
+
465
+ ${envVarDocs}
466
+
467
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
468
+
469
+ 🔧 How to Fix:
470
+
471
+ Option 1: Set environment variables in your MCP client config
472
+ (Claude Desktop, Cursor, etc.)
473
+
474
+ {
475
+ "mcpServers": {
476
+ "${mcpName}": {
477
+ "command": "npx",
478
+ "args": ["@portel/photon", "${mcpName}"],
479
+ "env": ${JSON.stringify(envExample, null, 8).replace(/\n/g, '\n ')}
480
+ }
481
+ }
482
+ }
483
+
484
+ Option 2: Check configuration
485
+ Run: photon mcp ${mcpName} --validate
486
+
487
+ Option 3: Generate config template
488
+ Run: photon mcp ${mcpName} --config
489
+
490
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
491
+ `.trim();
492
+ const enhanced = new Error(enhancedMessage);
493
+ enhanced.name = 'PhotonConfigError';
494
+ enhanced.stack = error.stack;
495
+ return enhanced;
496
+ }
497
+ /**
498
+ * Generate helpful example values based on parameter name and type
499
+ */
500
+ generateExampleValue(paramName, paramType) {
501
+ const lowerName = paramName.toLowerCase();
502
+ // API keys and tokens
503
+ if (lowerName.includes('apikey') || lowerName.includes('api_key')) {
504
+ return 'sk_your_api_key_here';
505
+ }
506
+ if (lowerName.includes('token') || lowerName.includes('secret')) {
507
+ return 'your_secret_token';
508
+ }
509
+ // URLs and endpoints
510
+ if (lowerName.includes('url') || lowerName.includes('endpoint')) {
511
+ return 'https://api.example.com';
512
+ }
513
+ if (lowerName.includes('host') || lowerName.includes('server')) {
514
+ return 'localhost';
515
+ }
516
+ // Ports
517
+ if (lowerName.includes('port')) {
518
+ return '5432';
519
+ }
520
+ // Database
521
+ if (lowerName.includes('database') || lowerName.includes('db')) {
522
+ return 'my_database';
523
+ }
524
+ if (lowerName.includes('user') || lowerName.includes('username')) {
525
+ return 'admin';
526
+ }
527
+ if (lowerName.includes('password')) {
528
+ return 'your_secure_password';
529
+ }
530
+ // Paths
531
+ if (lowerName.includes('path') || lowerName.includes('dir')) {
532
+ return '/path/to/directory';
533
+ }
534
+ // Common names
535
+ if (lowerName.includes('name')) {
536
+ return 'my-service';
537
+ }
538
+ if (lowerName.includes('region')) {
539
+ return 'us-east-1';
540
+ }
541
+ // Type-based defaults
542
+ if (paramType === 'boolean') {
543
+ return 'true';
544
+ }
545
+ if (paramType === 'number') {
546
+ return '3000';
547
+ }
548
+ return null;
549
+ }
550
+ /**
551
+ * Generate user-friendly configuration error message
552
+ */
553
+ generateConfigErrorMessage(mcpName, missing) {
554
+ const envVarList = missing.map(m => ` • ${m.envVarName} (${m.paramName}: ${m.type})`).join('\n');
555
+ const exampleEnv = Object.fromEntries(missing.map(m => [m.envVarName, `<your-${m.paramName}>`]));
556
+ return `
557
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
558
+ ⚠️ Configuration Warning: ${mcpName} MCP
559
+
560
+ Missing required environment variables:
561
+ ${envVarList}
562
+
563
+ Tools will fail until configuration is fixed.
564
+
565
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
566
+
567
+ To fix, add environment variables to your MCP client config:
568
+
569
+ {
570
+ "mcpServers": {
571
+ "${mcpName}": {
572
+ "command": "npx",
573
+ "args": ["@portel/photon", "${mcpName}"],
574
+ "env": ${JSON.stringify(exampleEnv, null, 8).replace(/\n/g, '\n ')}
575
+ }
576
+ }
577
+ }
578
+
579
+ Or run: photon ${mcpName} --config
580
+
581
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
582
+ `.trim();
583
+ }
584
+ /**
585
+ * Execute a tool on the loaded MCP instance
586
+ */
587
+ async executeTool(mcp, toolName, parameters) {
588
+ try {
589
+ // Check for configuration errors before executing tool
590
+ if (mcp.instance._photonConfigError) {
591
+ throw new Error(mcp.instance._photonConfigError);
592
+ }
593
+ // Check if instance has PhotonMCP's executeTool method
594
+ if (typeof mcp.instance.executeTool === 'function') {
595
+ return await mcp.instance.executeTool(toolName, parameters);
596
+ }
597
+ else {
598
+ // Plain class - call method directly
599
+ const method = mcp.instance[toolName];
600
+ if (!method || typeof method !== 'function') {
601
+ throw new Error(`Tool not found: ${toolName}`);
602
+ }
603
+ return await method.call(mcp.instance, parameters);
604
+ }
605
+ }
606
+ catch (error) {
607
+ console.error(`Tool execution failed: ${toolName} - ${error.message}`);
608
+ throw error;
609
+ }
610
+ }
611
+ }
612
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}