@ampeco/public-api-mcp 0.2.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 +734 -0
- package/dist/build/flattener.d.ts +39 -0
- package/dist/build/flattener.d.ts.map +1 -0
- package/dist/build/flattener.js +193 -0
- package/dist/build/flattener.js.map +1 -0
- package/dist/build/index.d.ts +13 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +175 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/optimizer.d.ts +32 -0
- package/dist/build/optimizer.d.ts.map +1 -0
- package/dist/build/optimizer.js +222 -0
- package/dist/build/optimizer.js.map +1 -0
- package/dist/build/parser.d.ts +35 -0
- package/dist/build/parser.d.ts.map +1 -0
- package/dist/build/parser.js +83 -0
- package/dist/build/parser.js.map +1 -0
- package/dist/build/types.d.ts +91 -0
- package/dist/build/types.d.ts.map +1 -0
- package/dist/build/types.js +5 -0
- package/dist/build/types.js.map +1 -0
- package/dist/build/zod-generator.d.ts +34 -0
- package/dist/build/zod-generator.d.ts.map +1 -0
- package/dist/build/zod-generator.js +317 -0
- package/dist/build/zod-generator.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +99 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/generated/build-stats.json +7 -0
- package/dist/generated/endpoints.json +32181 -0
- package/dist/generated/schemas.d.ts +8157 -0
- package/dist/generated/schemas.d.ts.map +1 -0
- package/dist/generated/schemas.js +2726 -0
- package/dist/generated/schemas.js.map +1 -0
- package/dist/generated/schemas.ts +3171 -0
- package/dist/server/factory.d.ts +11 -0
- package/dist/server/factory.d.ts.map +1 -0
- package/dist/server/factory.js +450 -0
- package/dist/server/factory.js.map +1 -0
- package/dist/server/factory.test.d.ts +5 -0
- package/dist/server/factory.test.d.ts.map +1 -0
- package/dist/server/factory.test.js +77 -0
- package/dist/server/factory.test.js.map +1 -0
- package/dist/server/http.d.ts +10 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +110 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/index.d.ts +8 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +1502 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/loader.d.ts +10 -0
- package/dist/server/loader.d.ts.map +1 -0
- package/dist/server/loader.js +19 -0
- package/dist/server/loader.js.map +1 -0
- package/dist/server/prompts.d.ts +6 -0
- package/dist/server/prompts.d.ts.map +1 -0
- package/dist/server/prompts.js +462 -0
- package/dist/server/prompts.js.map +1 -0
- package/dist/server/stdio.d.ts +10 -0
- package/dist/server/stdio.d.ts.map +1 -0
- package/dist/server/stdio.js +25 -0
- package/dist/server/stdio.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zod Schema Generation Module
|
|
3
|
+
*
|
|
4
|
+
* This module handles:
|
|
5
|
+
* - Converting OpenAPI schemas to Zod validation schemas
|
|
6
|
+
* - Supporting complex types, enums, unions, and validation rules
|
|
7
|
+
* - Enabling runtime type safety and parameter validation
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Generate Zod schema code from OpenAPI JSON schema
|
|
11
|
+
*
|
|
12
|
+
* @param schema - OpenAPI JSON schema
|
|
13
|
+
* @returns Zod schema as a string of TypeScript code
|
|
14
|
+
*/
|
|
15
|
+
export function generateZodSchema(schema) {
|
|
16
|
+
if (!schema) {
|
|
17
|
+
return "z.unknown()";
|
|
18
|
+
}
|
|
19
|
+
// Handle references (should be dereferenced already, but just in case)
|
|
20
|
+
if (schema.$ref) {
|
|
21
|
+
console.warn(`[ZodGen] Found unresolved reference: ${schema.$ref}`);
|
|
22
|
+
return "z.unknown()";
|
|
23
|
+
}
|
|
24
|
+
// Handle nullable
|
|
25
|
+
const nullable = schema.nullable === true;
|
|
26
|
+
let zodSchema = generateZodSchemaCore(schema);
|
|
27
|
+
// Add nullable wrapper if needed
|
|
28
|
+
if (nullable) {
|
|
29
|
+
zodSchema = `${zodSchema}.nullable()`;
|
|
30
|
+
}
|
|
31
|
+
return zodSchema;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Generate core Zod schema without nullable wrapper
|
|
35
|
+
*
|
|
36
|
+
* @param schema - OpenAPI JSON schema
|
|
37
|
+
* @returns Zod schema string
|
|
38
|
+
*/
|
|
39
|
+
function generateZodSchemaCore(schema) {
|
|
40
|
+
// Handle allOf (should be flattened already, but handle it)
|
|
41
|
+
if (schema.allOf) {
|
|
42
|
+
const schemas = schema.allOf.map((s) => generateZodSchemaCore(s));
|
|
43
|
+
return `z.intersection(${schemas.join(", ")})`;
|
|
44
|
+
}
|
|
45
|
+
// Handle anyOf
|
|
46
|
+
if (schema.anyOf) {
|
|
47
|
+
const schemas = schema.anyOf.map((s) => generateZodSchemaCore(s));
|
|
48
|
+
// Zod union requires at least 2 schemas
|
|
49
|
+
if (schemas.length === 1) {
|
|
50
|
+
return schemas[0];
|
|
51
|
+
}
|
|
52
|
+
return `z.union([${schemas.join(", ")}])`;
|
|
53
|
+
}
|
|
54
|
+
// Handle oneOf
|
|
55
|
+
if (schema.oneOf) {
|
|
56
|
+
const schemas = schema.oneOf.map((s) => generateZodSchemaCore(s));
|
|
57
|
+
// Zod union requires at least 2 schemas
|
|
58
|
+
if (schemas.length === 1) {
|
|
59
|
+
return schemas[0];
|
|
60
|
+
}
|
|
61
|
+
return `z.union([${schemas.join(", ")}])`;
|
|
62
|
+
}
|
|
63
|
+
// Handle enum
|
|
64
|
+
if (schema.enum) {
|
|
65
|
+
// Check if all enum values are strings
|
|
66
|
+
const allStrings = schema.enum.every((v) => typeof v === "string");
|
|
67
|
+
if (allStrings && schema.enum.length >= 1) {
|
|
68
|
+
const enumValues = schema.enum.map((v) => JSON.stringify(v)).join(", ");
|
|
69
|
+
return `z.enum([${enumValues}])`;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
// Fall back to union of literals for mixed types or non-string enums
|
|
73
|
+
const literalValues = schema.enum.map((v) => {
|
|
74
|
+
if (v === null)
|
|
75
|
+
return "z.null()";
|
|
76
|
+
if (typeof v === "number")
|
|
77
|
+
return `z.literal(${v})`;
|
|
78
|
+
return `z.literal(${JSON.stringify(v)})`;
|
|
79
|
+
}).join(", ");
|
|
80
|
+
if (schema.enum.length === 1) {
|
|
81
|
+
return literalValues;
|
|
82
|
+
}
|
|
83
|
+
return `z.union([${literalValues}])`;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Handle type-specific schemas
|
|
87
|
+
switch (schema.type) {
|
|
88
|
+
case "string":
|
|
89
|
+
return generateStringSchema(schema);
|
|
90
|
+
case "number":
|
|
91
|
+
case "integer":
|
|
92
|
+
return generateNumberSchema(schema);
|
|
93
|
+
case "boolean":
|
|
94
|
+
return "z.boolean()";
|
|
95
|
+
case "array":
|
|
96
|
+
return generateArraySchema(schema);
|
|
97
|
+
case "object":
|
|
98
|
+
return generateObjectSchema(schema);
|
|
99
|
+
case "null":
|
|
100
|
+
return "z.null()";
|
|
101
|
+
default:
|
|
102
|
+
// No type specified, try to infer from other properties
|
|
103
|
+
if (schema.properties) {
|
|
104
|
+
return generateObjectSchema(schema);
|
|
105
|
+
}
|
|
106
|
+
if (schema.items) {
|
|
107
|
+
return generateArraySchema(schema);
|
|
108
|
+
}
|
|
109
|
+
return "z.unknown()";
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Generate Zod string schema with validation
|
|
114
|
+
*/
|
|
115
|
+
function generateStringSchema(schema) {
|
|
116
|
+
let zodSchema = "z.string()";
|
|
117
|
+
// Add format validation
|
|
118
|
+
if (schema.format) {
|
|
119
|
+
switch (schema.format) {
|
|
120
|
+
case "email":
|
|
121
|
+
zodSchema += ".email()";
|
|
122
|
+
break;
|
|
123
|
+
case "uri":
|
|
124
|
+
case "url":
|
|
125
|
+
zodSchema += ".url()";
|
|
126
|
+
break;
|
|
127
|
+
case "uuid":
|
|
128
|
+
zodSchema += ".uuid()";
|
|
129
|
+
break;
|
|
130
|
+
case "date-time":
|
|
131
|
+
zodSchema += ".datetime()";
|
|
132
|
+
break;
|
|
133
|
+
// Note: Other formats like "date", "time" could be added with custom validation
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Add length validation
|
|
137
|
+
if (schema.minLength !== undefined) {
|
|
138
|
+
zodSchema += `.min(${schema.minLength})`;
|
|
139
|
+
}
|
|
140
|
+
if (schema.maxLength !== undefined) {
|
|
141
|
+
zodSchema += `.max(${schema.maxLength})`;
|
|
142
|
+
}
|
|
143
|
+
// Add pattern validation
|
|
144
|
+
if (schema.pattern) {
|
|
145
|
+
const escapedPattern = schema.pattern.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
|
|
146
|
+
zodSchema += `.regex(new RegExp("${escapedPattern}"))`;
|
|
147
|
+
}
|
|
148
|
+
return zodSchema;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Generate Zod number schema with validation
|
|
152
|
+
*/
|
|
153
|
+
function generateNumberSchema(schema) {
|
|
154
|
+
let zodSchema = schema.type === "integer" ? "z.number().int()" : "z.number()";
|
|
155
|
+
// Add range validation
|
|
156
|
+
if (schema.minimum !== undefined) {
|
|
157
|
+
if (schema.exclusiveMinimum) {
|
|
158
|
+
zodSchema += `.gt(${schema.minimum})`;
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
zodSchema += `.min(${schema.minimum})`;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (schema.maximum !== undefined) {
|
|
165
|
+
if (schema.exclusiveMaximum) {
|
|
166
|
+
zodSchema += `.lt(${schema.maximum})`;
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
zodSchema += `.max(${schema.maximum})`;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Add multiple of validation
|
|
173
|
+
if (schema.multipleOf !== undefined) {
|
|
174
|
+
zodSchema += `.multipleOf(${schema.multipleOf})`;
|
|
175
|
+
}
|
|
176
|
+
return zodSchema;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Generate Zod array schema
|
|
180
|
+
*/
|
|
181
|
+
function generateArraySchema(schema) {
|
|
182
|
+
const itemsSchema = schema.items ? generateZodSchemaCore(schema.items) : "z.unknown()";
|
|
183
|
+
let zodSchema = `z.array(${itemsSchema})`;
|
|
184
|
+
// Add array length validation
|
|
185
|
+
if (schema.minItems !== undefined) {
|
|
186
|
+
zodSchema += `.min(${schema.minItems})`;
|
|
187
|
+
}
|
|
188
|
+
if (schema.maxItems !== undefined) {
|
|
189
|
+
zodSchema += `.max(${schema.maxItems})`;
|
|
190
|
+
}
|
|
191
|
+
return zodSchema;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Generate Zod object schema
|
|
195
|
+
*/
|
|
196
|
+
function generateObjectSchema(schema) {
|
|
197
|
+
if (!schema.properties || Object.keys(schema.properties).length === 0) {
|
|
198
|
+
// Empty object or additionalProperties only
|
|
199
|
+
if (schema.additionalProperties) {
|
|
200
|
+
if (schema.additionalProperties === true) {
|
|
201
|
+
return "z.record(z.unknown())";
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
const valueSchema = generateZodSchemaCore(schema.additionalProperties);
|
|
205
|
+
return `z.record(${valueSchema})`;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return "z.object({})";
|
|
209
|
+
}
|
|
210
|
+
const properties = [];
|
|
211
|
+
const required = new Set(schema.required || []);
|
|
212
|
+
for (const [propName, propSchema] of Object.entries(schema.properties)) {
|
|
213
|
+
const isRequired = required.has(propName);
|
|
214
|
+
let propZodSchema = generateZodSchemaCore(propSchema);
|
|
215
|
+
// Make optional if not required
|
|
216
|
+
if (!isRequired) {
|
|
217
|
+
propZodSchema += ".optional()";
|
|
218
|
+
}
|
|
219
|
+
// Escape property name if needed
|
|
220
|
+
const safePropName = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(propName)
|
|
221
|
+
? propName
|
|
222
|
+
: JSON.stringify(propName);
|
|
223
|
+
properties.push(`${safePropName}: ${propZodSchema}`);
|
|
224
|
+
}
|
|
225
|
+
let zodSchema = `z.object({\n ${properties.join(",\n ")}\n})`;
|
|
226
|
+
// Handle additionalProperties
|
|
227
|
+
if (schema.additionalProperties === false) {
|
|
228
|
+
zodSchema += ".strict()";
|
|
229
|
+
}
|
|
230
|
+
else if (schema.additionalProperties && schema.additionalProperties !== true) {
|
|
231
|
+
// passthrough() allows additional properties without validation
|
|
232
|
+
zodSchema += ".passthrough()";
|
|
233
|
+
}
|
|
234
|
+
return zodSchema;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Generate Zod schema for request parameters
|
|
238
|
+
*
|
|
239
|
+
* @param parameters - Array of parameter definitions
|
|
240
|
+
* @returns Object with Zod schemas for different parameter locations
|
|
241
|
+
*/
|
|
242
|
+
export function generateParameterSchemas(parameters) {
|
|
243
|
+
const byLocation = {
|
|
244
|
+
path: [],
|
|
245
|
+
query: [],
|
|
246
|
+
header: [],
|
|
247
|
+
};
|
|
248
|
+
// Group parameters by location
|
|
249
|
+
for (const param of parameters) {
|
|
250
|
+
if (param.in && byLocation[param.in]) {
|
|
251
|
+
byLocation[param.in].push(param);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
const result = {};
|
|
255
|
+
// Generate schema for each location
|
|
256
|
+
for (const [location, params] of Object.entries(byLocation)) {
|
|
257
|
+
if (params.length === 0)
|
|
258
|
+
continue;
|
|
259
|
+
const properties = [];
|
|
260
|
+
const required = new Set(params.filter((p) => p.required).map((p) => p.name));
|
|
261
|
+
for (const param of params) {
|
|
262
|
+
const isRequired = required.has(param.name);
|
|
263
|
+
let paramSchema = param.schema ? generateZodSchemaCore(param.schema) : "z.string()";
|
|
264
|
+
if (!isRequired) {
|
|
265
|
+
paramSchema += ".optional()";
|
|
266
|
+
}
|
|
267
|
+
const safeName = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(param.name)
|
|
268
|
+
? param.name
|
|
269
|
+
: JSON.stringify(param.name);
|
|
270
|
+
properties.push(`${safeName}: ${paramSchema}`);
|
|
271
|
+
}
|
|
272
|
+
result[location] = `z.object({\n ${properties.join(",\n ")}\n})`;
|
|
273
|
+
}
|
|
274
|
+
return result;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Generate complete Zod schemas file for all endpoints
|
|
278
|
+
*
|
|
279
|
+
* @param endpoints - Array of optimized endpoints
|
|
280
|
+
* @returns TypeScript code for Zod schemas
|
|
281
|
+
*/
|
|
282
|
+
export function generateZodSchemasFile(endpoints) {
|
|
283
|
+
const lines = [
|
|
284
|
+
'import { z } from "zod";',
|
|
285
|
+
"",
|
|
286
|
+
"// Auto-generated Zod schemas from OpenAPI specification",
|
|
287
|
+
"// Do not edit manually - regenerate with build script",
|
|
288
|
+
"",
|
|
289
|
+
];
|
|
290
|
+
for (const endpoint of endpoints) {
|
|
291
|
+
const safeOperationId = endpoint.operationId
|
|
292
|
+
?.replace(/[^a-zA-Z0-9]/g, "_")
|
|
293
|
+
.replace(/^(\d)/, "_$1") || `${endpoint.method}_${endpoint.path.replace(/[^a-zA-Z0-9]/g, "_")}`;
|
|
294
|
+
lines.push(`// ${endpoint.method} ${endpoint.path}`);
|
|
295
|
+
// Generate parameter schemas
|
|
296
|
+
if (endpoint.parameters && endpoint.parameters.length > 0) {
|
|
297
|
+
const paramSchemas = generateParameterSchemas(endpoint.parameters);
|
|
298
|
+
if (paramSchemas.path) {
|
|
299
|
+
lines.push(`export const ${safeOperationId}PathParams = ${paramSchemas.path};`);
|
|
300
|
+
}
|
|
301
|
+
if (paramSchemas.query) {
|
|
302
|
+
lines.push(`export const ${safeOperationId}QueryParams = ${paramSchemas.query};`);
|
|
303
|
+
}
|
|
304
|
+
if (paramSchemas.header) {
|
|
305
|
+
lines.push(`export const ${safeOperationId}HeaderParams = ${paramSchemas.header};`);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
// Generate request body schema
|
|
309
|
+
if (endpoint.requestBody?.content?.["application/json"]?.schema) {
|
|
310
|
+
const bodySchema = generateZodSchema(endpoint.requestBody.content["application/json"].schema);
|
|
311
|
+
lines.push(`export const ${safeOperationId}Body = ${bodySchema};`);
|
|
312
|
+
}
|
|
313
|
+
lines.push("");
|
|
314
|
+
}
|
|
315
|
+
return lines.join("\n");
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=zod-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod-generator.js","sourceRoot":"","sources":["../../src/build/zod-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;GAGG"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLI Entry Point for MCP Server
|
|
4
|
+
* Supports both stdio and HTTP modes
|
|
5
|
+
*/
|
|
6
|
+
import { parseArgs } from 'node:util';
|
|
7
|
+
import { startStdioServer } from '../server/stdio.js';
|
|
8
|
+
import { startHttpServer } from '../server/http.js';
|
|
9
|
+
function printHelp() {
|
|
10
|
+
console.log(`
|
|
11
|
+
AMPECO Public API MCP Server
|
|
12
|
+
|
|
13
|
+
Usage:
|
|
14
|
+
ampeco-api-mcp [options]
|
|
15
|
+
|
|
16
|
+
Options:
|
|
17
|
+
--stdio Run in stdio mode (for Claude Desktop, NPX)
|
|
18
|
+
--http Run in HTTP mode (for remote access)
|
|
19
|
+
--hostname <url> Target API hostname (required for stdio mode)
|
|
20
|
+
--token <token> Bearer token for API authentication (stdio mode)
|
|
21
|
+
--port <port> Port for HTTP server (default: 3000)
|
|
22
|
+
--help Show this help message
|
|
23
|
+
|
|
24
|
+
Examples:
|
|
25
|
+
Stdio mode (local):
|
|
26
|
+
ampeco-api-mcp --stdio --hostname http://demo.charge.alex2.dev.ampeco.tech --token $AMPECO_TOKEN
|
|
27
|
+
|
|
28
|
+
HTTP mode (remote):
|
|
29
|
+
ampeco-api-mcp --http --port 3001
|
|
30
|
+
|
|
31
|
+
Environment Variables:
|
|
32
|
+
AMPECO_BEARER_TOKEN Bearer token (alternative to --token)
|
|
33
|
+
|
|
34
|
+
Notes:
|
|
35
|
+
- Stdio mode uses stderr for all logging to avoid interfering with MCP protocol
|
|
36
|
+
- For development, use 'npm run dev:stdio' which redirects build logs to stderr
|
|
37
|
+
- For production, run 'npm run build' first, then use the compiled CLI
|
|
38
|
+
`);
|
|
39
|
+
}
|
|
40
|
+
async function main() {
|
|
41
|
+
const { values } = parseArgs({
|
|
42
|
+
options: {
|
|
43
|
+
stdio: { type: 'boolean', default: false },
|
|
44
|
+
http: { type: 'boolean', default: false },
|
|
45
|
+
port: { type: 'string', default: '3000' },
|
|
46
|
+
hostname: { type: 'string' },
|
|
47
|
+
token: { type: 'string' },
|
|
48
|
+
help: { type: 'boolean', default: false },
|
|
49
|
+
},
|
|
50
|
+
allowPositionals: false,
|
|
51
|
+
});
|
|
52
|
+
if (values.help) {
|
|
53
|
+
printHelp();
|
|
54
|
+
process.exit(0);
|
|
55
|
+
}
|
|
56
|
+
// Validate arguments
|
|
57
|
+
if (values.stdio && values.http) {
|
|
58
|
+
console.error('Error: Cannot specify both --stdio and --http');
|
|
59
|
+
console.error('\nUsage:');
|
|
60
|
+
console.error(' Stdio mode: ampeco-api-mcp --stdio --hostname <hostname> [--token <token>]');
|
|
61
|
+
console.error(' HTTP mode: ampeco-api-mcp --http [--port <port>]');
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
// Default to stdio if neither specified (for NPX compatibility)
|
|
65
|
+
const useStdio = values.stdio || !values.http;
|
|
66
|
+
if (useStdio) {
|
|
67
|
+
// Stdio mode: requires hostname and token
|
|
68
|
+
if (!values.hostname) {
|
|
69
|
+
console.error('Error: --hostname is required in stdio mode');
|
|
70
|
+
console.error('\nUsage:');
|
|
71
|
+
console.error(' ampeco-api-mcp --stdio --hostname <hostname> [--token <token>]');
|
|
72
|
+
console.error('\nExample:');
|
|
73
|
+
console.error(' ampeco-api-mcp --stdio --hostname http://demo.charge.alex2.dev.ampeco.tech --token $AMPECO_TOKEN');
|
|
74
|
+
console.error('\nNote: Token can also be provided via AMPECO_BEARER_TOKEN environment variable');
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
const token = values.token || process.env.AMPECO_BEARER_TOKEN || '';
|
|
78
|
+
if (!token) {
|
|
79
|
+
console.error('Warning: No bearer token provided. API requests may fail without authentication.');
|
|
80
|
+
console.error('Provide token via --token argument or AMPECO_BEARER_TOKEN environment variable.\n');
|
|
81
|
+
}
|
|
82
|
+
await startStdioServer(token, values.hostname);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
// HTTP mode: requires port
|
|
86
|
+
const port = parseInt(values.port || '3000', 10);
|
|
87
|
+
if (isNaN(port) || port < 1 || port > 65535) {
|
|
88
|
+
console.error(`Error: Invalid port number: ${values.port}`);
|
|
89
|
+
console.error('Port must be a number between 1 and 65535');
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
await startHttpServer(port);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
main().catch((error) => {
|
|
96
|
+
console.error('Fatal error:', error);
|
|
97
|
+
process.exit(1);
|
|
98
|
+
});
|
|
99
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|