@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.
- package/LICENSE +21 -0
- package/README.md +952 -0
- package/dist/base.d.ts +58 -0
- package/dist/base.d.ts.map +1 -0
- package/dist/base.js +92 -0
- package/dist/base.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1441 -0
- package/dist/cli.js.map +1 -0
- package/dist/dependency-manager.d.ts +49 -0
- package/dist/dependency-manager.d.ts.map +1 -0
- package/dist/dependency-manager.js +165 -0
- package/dist/dependency-manager.js.map +1 -0
- package/dist/loader.d.ts +86 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +612 -0
- package/dist/loader.js.map +1 -0
- package/dist/marketplace-manager.d.ts +261 -0
- package/dist/marketplace-manager.d.ts.map +1 -0
- package/dist/marketplace-manager.js +767 -0
- package/dist/marketplace-manager.js.map +1 -0
- package/dist/path-resolver.d.ts +21 -0
- package/dist/path-resolver.d.ts.map +1 -0
- package/dist/path-resolver.js +71 -0
- package/dist/path-resolver.js.map +1 -0
- package/dist/photon-doc-extractor.d.ts +89 -0
- package/dist/photon-doc-extractor.d.ts.map +1 -0
- package/dist/photon-doc-extractor.js +228 -0
- package/dist/photon-doc-extractor.js.map +1 -0
- package/dist/readme-syncer.d.ts +33 -0
- package/dist/readme-syncer.d.ts.map +1 -0
- package/dist/readme-syncer.js +93 -0
- package/dist/readme-syncer.js.map +1 -0
- package/dist/registry-manager.d.ts +76 -0
- package/dist/registry-manager.d.ts.map +1 -0
- package/dist/registry-manager.js +220 -0
- package/dist/registry-manager.js.map +1 -0
- package/dist/schema-extractor.d.ts +83 -0
- package/dist/schema-extractor.d.ts.map +1 -0
- package/dist/schema-extractor.js +396 -0
- package/dist/schema-extractor.js.map +1 -0
- package/dist/security-scanner.d.ts +52 -0
- package/dist/security-scanner.d.ts.map +1 -0
- package/dist/security-scanner.js +172 -0
- package/dist/security-scanner.js.map +1 -0
- package/dist/server.d.ts +73 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +474 -0
- package/dist/server.js.map +1 -0
- package/dist/template-manager.d.ts +56 -0
- package/dist/template-manager.d.ts.map +1 -0
- package/dist/template-manager.js +509 -0
- package/dist/template-manager.js.map +1 -0
- package/dist/test-client.d.ts +52 -0
- package/dist/test-client.d.ts.map +1 -0
- package/dist/test-client.js +168 -0
- package/dist/test-client.js.map +1 -0
- package/dist/test-marketplace-sources.d.ts +5 -0
- package/dist/test-marketplace-sources.d.ts.map +1 -0
- package/dist/test-marketplace-sources.js +53 -0
- package/dist/test-marketplace-sources.js.map +1 -0
- package/dist/types.d.ts +108 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/dist/version-checker.d.ts +48 -0
- package/dist/version-checker.d.ts.map +1 -0
- package/dist/version-checker.js +128 -0
- package/dist/version-checker.js.map +1 -0
- package/dist/watcher.d.ts +26 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +72 -0
- package/dist/watcher.js.map +1 -0
- package/package.json +79 -0
- 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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"}
|