@vulcan-energy/mcp-helper 0.1.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 (74) hide show
  1. package/README.md +154 -0
  2. package/dist/bin/vulcan-mcp-helper.d.ts +9 -0
  3. package/dist/bin/vulcan-mcp-helper.d.ts.map +1 -0
  4. package/dist/bin/vulcan-mcp-helper.js +58 -0
  5. package/dist/bin/vulcan-mcp-helper.js.map +1 -0
  6. package/dist/src/engine/filesystem.d.ts +30 -0
  7. package/dist/src/engine/filesystem.d.ts.map +1 -0
  8. package/dist/src/engine/filesystem.js +61 -0
  9. package/dist/src/engine/filesystem.js.map +1 -0
  10. package/dist/src/engine/wasm.d.ts +23 -0
  11. package/dist/src/engine/wasm.d.ts.map +1 -0
  12. package/dist/src/engine/wasm.js +333 -0
  13. package/dist/src/engine/wasm.js.map +1 -0
  14. package/dist/src/engine/workspace.d.ts +23 -0
  15. package/dist/src/engine/workspace.d.ts.map +1 -0
  16. package/dist/src/engine/workspace.js +82 -0
  17. package/dist/src/engine/workspace.js.map +1 -0
  18. package/dist/src/server.d.ts +8 -0
  19. package/dist/src/server.d.ts.map +1 -0
  20. package/dist/src/server.js +166 -0
  21. package/dist/src/server.js.map +1 -0
  22. package/dist/src/tools/calculateMetrics.d.ts +31 -0
  23. package/dist/src/tools/calculateMetrics.d.ts.map +1 -0
  24. package/dist/src/tools/calculateMetrics.js +347 -0
  25. package/dist/src/tools/calculateMetrics.js.map +1 -0
  26. package/dist/src/tools/createBatchConfig.d.ts +25 -0
  27. package/dist/src/tools/createBatchConfig.d.ts.map +1 -0
  28. package/dist/src/tools/createBatchConfig.js +128 -0
  29. package/dist/src/tools/createBatchConfig.js.map +1 -0
  30. package/dist/src/tools/getBatchStatus.d.ts +23 -0
  31. package/dist/src/tools/getBatchStatus.d.ts.map +1 -0
  32. package/dist/src/tools/getBatchStatus.js +194 -0
  33. package/dist/src/tools/getBatchStatus.js.map +1 -0
  34. package/dist/src/tools/index.d.ts +67 -0
  35. package/dist/src/tools/index.d.ts.map +1 -0
  36. package/dist/src/tools/index.js +361 -0
  37. package/dist/src/tools/index.js.map +1 -0
  38. package/dist/src/tools/listBatchModels.d.ts +25 -0
  39. package/dist/src/tools/listBatchModels.d.ts.map +1 -0
  40. package/dist/src/tools/listBatchModels.js +86 -0
  41. package/dist/src/tools/listBatchModels.js.map +1 -0
  42. package/dist/src/tools/listCsvColumns.d.ts +27 -0
  43. package/dist/src/tools/listCsvColumns.d.ts.map +1 -0
  44. package/dist/src/tools/listCsvColumns.js +93 -0
  45. package/dist/src/tools/listCsvColumns.js.map +1 -0
  46. package/dist/src/tools/listParameters.d.ts +25 -0
  47. package/dist/src/tools/listParameters.d.ts.map +1 -0
  48. package/dist/src/tools/listParameters.js +64 -0
  49. package/dist/src/tools/listParameters.js.map +1 -0
  50. package/dist/src/tools/runBatch.d.ts +19 -0
  51. package/dist/src/tools/runBatch.d.ts.map +1 -0
  52. package/dist/src/tools/runBatch.js +90 -0
  53. package/dist/src/tools/runBatch.js.map +1 -0
  54. package/dist/src/tools/saveParameter.d.ts +23 -0
  55. package/dist/src/tools/saveParameter.d.ts.map +1 -0
  56. package/dist/src/tools/saveParameter.js +87 -0
  57. package/dist/src/tools/saveParameter.js.map +1 -0
  58. package/dist/src/tools/viewParameter.d.ts +18 -0
  59. package/dist/src/tools/viewParameter.d.ts.map +1 -0
  60. package/dist/src/tools/viewParameter.js +51 -0
  61. package/dist/src/tools/viewParameter.js.map +1 -0
  62. package/dist/src/utils/batchConfig.d.ts +32 -0
  63. package/dist/src/utils/batchConfig.d.ts.map +1 -0
  64. package/dist/src/utils/batchConfig.js +130 -0
  65. package/dist/src/utils/batchConfig.js.map +1 -0
  66. package/dist/src/utils/fileLoader.d.ts +21 -0
  67. package/dist/src/utils/fileLoader.d.ts.map +1 -0
  68. package/dist/src/utils/fileLoader.js +86 -0
  69. package/dist/src/utils/fileLoader.js.map +1 -0
  70. package/package.json +47 -0
  71. package/wasm/snippets/wasm-bindgen-rayon-38edf6e439f6d70d/src/workerHelpers.no-bundler.js +77 -0
  72. package/wasm/wasm_version.json +8 -0
  73. package/wasm/wasm_wrapper.js +1190 -0
  74. package/wasm/wasm_wrapper_bg.wasm +0 -0
@@ -0,0 +1,194 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ /**
4
+ * Get the status, progress, and results summary of a batch run
5
+ */
6
+ export async function getBatchStatus(config, args = {}) {
7
+ const { workspace } = config;
8
+ let { job_id, config_name } = args;
9
+ // If config_name is provided but not job_id, find the job_id
10
+ if (config_name && !job_id) {
11
+ const outputDir = path.join(workspace, 'output');
12
+ // Remove .json extension if present
13
+ const cleanConfigName = config_name.replace(/\.json$/, '');
14
+ // Check if any output exists for this config:
15
+ // 1. Batch manifest file: batch_manifest_{config_name}.json
16
+ // 2. Result directories: result_{config_name}_*
17
+ // 3. Progress files with mcp_ prefix (from MCP runs)
18
+ const manifestPath = path.join(outputDir, `batch_manifest_${cleanConfigName}.json`);
19
+ let configOutputExists = false;
20
+ try {
21
+ await fs.access(manifestPath);
22
+ configOutputExists = true;
23
+ }
24
+ catch {
25
+ // Check for result directories
26
+ try {
27
+ const files = await fs.readdir(outputDir);
28
+ const hasResultDir = files.some(f => f.startsWith(`result_${cleanConfigName}_`));
29
+ if (hasResultDir) {
30
+ configOutputExists = true;
31
+ }
32
+ }
33
+ catch {
34
+ // Directory doesn't exist or can't be read
35
+ }
36
+ }
37
+ // Find the most recent progress file for this config
38
+ // Progress files are named progress_{job_id}.json
39
+ // For MCP runs, they start with progress_mcp_
40
+ try {
41
+ const files = await fs.readdir(outputDir);
42
+ // Prefer MCP progress files (progress_mcp_*) but also check all progress files
43
+ const progressFiles = files
44
+ .filter(f => f.startsWith('progress_') && f.endsWith('.json'))
45
+ .map(f => ({
46
+ name: f,
47
+ jobId: f.replace('progress_', '').replace('.json', ''),
48
+ path: path.join(outputDir, f),
49
+ isMcp: f.startsWith('progress_mcp_')
50
+ }));
51
+ // Get file stats to find most recent
52
+ const filesWithStats = await Promise.all(progressFiles.map(async (f) => {
53
+ try {
54
+ const stat = await fs.stat(f.path);
55
+ return { ...f, mtime: stat.mtime };
56
+ }
57
+ catch {
58
+ return { ...f, mtime: new Date(0) };
59
+ }
60
+ }));
61
+ // Sort: MCP files first, then by modification time (most recent first)
62
+ filesWithStats.sort((a, b) => {
63
+ if (a.isMcp && !b.isMcp)
64
+ return -1;
65
+ if (!a.isMcp && b.isMcp)
66
+ return 1;
67
+ return b.mtime.getTime() - a.mtime.getTime();
68
+ });
69
+ // Use the most recent progress file's job_id
70
+ if (filesWithStats.length > 0) {
71
+ job_id = filesWithStats[0].jobId;
72
+ }
73
+ }
74
+ catch (error) {
75
+ const err = error;
76
+ console.warn(`Failed to find job_id for config_name '${config_name}': ${err.message}`);
77
+ }
78
+ // If still no job_id found, return queued status
79
+ if (!job_id) {
80
+ return {
81
+ config_name: cleanConfigName,
82
+ status: 'queued',
83
+ progress: 0,
84
+ passes: 0,
85
+ failures: 0,
86
+ output_dir: path.join(workspace, 'output'),
87
+ error: null,
88
+ batch_progress: undefined,
89
+ sim_progress: undefined
90
+ };
91
+ }
92
+ }
93
+ if (!job_id) {
94
+ throw new Error('Either job_id or config_name is required');
95
+ }
96
+ const outputDir = path.join(workspace, 'output');
97
+ const progressPath = path.join(outputDir, `progress_${job_id}.json`);
98
+ const simProgressPath = path.join(outputDir, `sim_progress_${job_id}.json`);
99
+ // Read progress files
100
+ let batchProgress = null;
101
+ let simProgress = null;
102
+ try {
103
+ const content = await fs.readFile(progressPath, 'utf-8');
104
+ batchProgress = JSON.parse(content);
105
+ }
106
+ catch (error) {
107
+ const err = error;
108
+ if (err.code !== 'ENOENT') {
109
+ console.warn(`Failed to read batch progress: ${err.message}`);
110
+ }
111
+ }
112
+ try {
113
+ const content = await fs.readFile(simProgressPath, 'utf-8');
114
+ simProgress = JSON.parse(content);
115
+ }
116
+ catch (error) {
117
+ const err = error;
118
+ if (err.code !== 'ENOENT') {
119
+ console.warn(`Failed to read simulation progress: ${err.message}`);
120
+ }
121
+ }
122
+ // Determine status
123
+ let status = 'queued';
124
+ let progress = 0;
125
+ let passes = 0;
126
+ let failures = 0;
127
+ let error = null;
128
+ if (batchProgress) {
129
+ // Use batch progress to determine status
130
+ if (batchProgress.status) {
131
+ status = batchProgress.status;
132
+ }
133
+ else if (batchProgress.percentage !== undefined) {
134
+ progress = batchProgress.percentage;
135
+ status = progress >= 100 ? 'completed' : 'running';
136
+ }
137
+ else if (batchProgress.current_combination !== undefined && batchProgress.total_combinations !== undefined) {
138
+ progress = Math.round((batchProgress.current_combination / batchProgress.total_combinations) * 100);
139
+ status = progress >= 100 ? 'completed' : 'running';
140
+ }
141
+ if (batchProgress.error) {
142
+ error = batchProgress.error;
143
+ status = 'error';
144
+ }
145
+ }
146
+ if (simProgress) {
147
+ // Use simulation progress for more detailed status
148
+ if (simProgress.status) {
149
+ status = simProgress.status;
150
+ }
151
+ if (simProgress.passes !== undefined) {
152
+ passes = simProgress.passes;
153
+ }
154
+ if (simProgress.failures !== undefined) {
155
+ failures = simProgress.failures;
156
+ }
157
+ if (simProgress.error) {
158
+ error = simProgress.error;
159
+ status = 'error';
160
+ }
161
+ }
162
+ // If no progress files exist, check if output directory exists
163
+ if (!batchProgress && !simProgress) {
164
+ // Check if job output directory exists
165
+ const jobOutputDir = path.join(outputDir, job_id);
166
+ try {
167
+ const entries = await fs.readdir(jobOutputDir);
168
+ if (entries.length > 0) {
169
+ // Output exists but no progress files - might be completed
170
+ status = 'completed';
171
+ progress = 100;
172
+ }
173
+ else {
174
+ status = 'queued';
175
+ }
176
+ }
177
+ catch {
178
+ status = 'queued';
179
+ }
180
+ }
181
+ return {
182
+ job_id,
183
+ ...(config_name ? { config_name: config_name.replace(/\.json$/, '') } : {}),
184
+ status,
185
+ progress,
186
+ passes,
187
+ failures,
188
+ output_dir: outputDir,
189
+ error,
190
+ batch_progress: batchProgress,
191
+ sim_progress: simProgress
192
+ };
193
+ }
194
+ //# sourceMappingURL=getBatchStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getBatchStatus.js","sourceRoot":"","sources":["../../../src/tools/getBatchStatus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import { z } from 'zod';
2
+ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
3
+ import type { MCPConfig } from '../engine/workspace.js';
4
+ export declare const toolSchemas: {
5
+ vulcan_list_parameters: z.ZodObject<{
6
+ category: z.ZodOptional<z.ZodString>;
7
+ }, z.core.$strip>;
8
+ vulcan_view_parameter: z.ZodObject<{
9
+ category: z.ZodString;
10
+ parameter_id: z.ZodString;
11
+ }, z.core.$strip>;
12
+ vulcan_save_parameter: z.ZodObject<{
13
+ category: z.ZodString;
14
+ parameter_id: z.ZodString;
15
+ content: z.ZodRecord<z.ZodString, z.ZodAny>;
16
+ markdown_content: z.ZodOptional<z.ZodString>;
17
+ }, z.core.$strip>;
18
+ vulcan_create_batch_config: z.ZodObject<{
19
+ config_name: z.ZodString;
20
+ base_model: z.ZodString;
21
+ weather_file: z.ZodString;
22
+ wrapper: z.ZodOptional<z.ZodString>;
23
+ parameters: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
24
+ }, z.core.$strip>;
25
+ vulcan_run_batch: z.ZodObject<{
26
+ config_name: z.ZodString;
27
+ job_id: z.ZodOptional<z.ZodString>;
28
+ }, z.core.$strip>;
29
+ vulcan_get_batch_status: z.ZodObject<{
30
+ job_id: z.ZodOptional<z.ZodString>;
31
+ config_name: z.ZodOptional<z.ZodString>;
32
+ }, z.core.$strip>;
33
+ vulcan_calculate_metrics: z.ZodObject<{
34
+ config_name: z.ZodString;
35
+ model_names: z.ZodArray<z.ZodString>;
36
+ metric_definitions: z.ZodArray<z.ZodObject<{
37
+ id: z.ZodOptional<z.ZodString>;
38
+ name: z.ZodOptional<z.ZodString>;
39
+ column: z.ZodOptional<z.ZodString>;
40
+ function: z.ZodOptional<z.ZodEnum<{
41
+ sum: "sum";
42
+ average: "average";
43
+ peak: "peak";
44
+ min: "min";
45
+ sumIf: "sumIf";
46
+ averageIf: "averageIf";
47
+ countIf: "countIf";
48
+ }>>;
49
+ comparator: z.ZodOptional<z.ZodString>;
50
+ threshold: z.ZodOptional<z.ZodNumber>;
51
+ }, z.core.$strip>>;
52
+ time_range: z.ZodOptional<z.ZodObject<{
53
+ start: z.ZodOptional<z.ZodNumber>;
54
+ end: z.ZodOptional<z.ZodNumber>;
55
+ }, z.core.$strip>>;
56
+ }, z.core.$strip>;
57
+ vulcan_list_csv_columns: z.ZodObject<{
58
+ config_name: z.ZodString;
59
+ model_name: z.ZodString;
60
+ }, z.core.$strip>;
61
+ vulcan_list_batch_models: z.ZodObject<{
62
+ config_name: z.ZodString;
63
+ }, z.core.$strip>;
64
+ };
65
+ export declare const toolDefinitions: Tool[];
66
+ export declare function handleToolCall(name: string, args: any, config: MCPConfig): Promise<any>;
67
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAU/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGxD,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgFvB,CAAC;AAGF,eAAO,MAAM,eAAe,EAAE,IAAI,EAoLjC,CAAC;AAGF,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,GAAG,EACT,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,GAAG,CAAC,CA0Gd"}
@@ -0,0 +1,361 @@
1
+ import { z } from 'zod';
2
+ import { listParameters } from './listParameters.js';
3
+ import { viewParameter } from './viewParameter.js';
4
+ import { saveParameter } from './saveParameter.js';
5
+ import { createBatchConfig } from './createBatchConfig.js';
6
+ import { runBatch } from './runBatch.js';
7
+ import { getBatchStatus } from './getBatchStatus.js';
8
+ import { calculateMetrics } from './calculateMetrics.js';
9
+ import { listCsvColumns } from './listCsvColumns.js';
10
+ import { listBatchModels } from './listBatchModels.js';
11
+ // Tool schemas with Zod
12
+ export const toolSchemas = {
13
+ vulcan_list_parameters: z.object({
14
+ category: z.string().optional().describe('Optional: filter by category name (e.g., "base_json", "heat_source_wet", "controls")'),
15
+ }),
16
+ vulcan_view_parameter: z.object({
17
+ category: z.string().describe('Parameter category (e.g., "heat_source_wet", "controls", "base_json")'),
18
+ parameter_id: z.string().describe('Parameter ID (filename without .json extension)'),
19
+ }),
20
+ vulcan_save_parameter: z.object({
21
+ category: z.string().describe('Parameter category (e.g., "heat_source_wet", "controls")'),
22
+ parameter_id: z.string().describe('Parameter ID (filename without .json extension)'),
23
+ content: z.record(z.string(), z.any()).describe('Parameter JSON content (must be valid JSON object)'),
24
+ markdown_content: z.string().optional().describe('Optional markdown documentation for the parameter'),
25
+ }),
26
+ vulcan_create_batch_config: z.object({
27
+ config_name: z.string().describe('Configuration name (will be saved as {config_name}.json)'),
28
+ base_model: z.string().describe('Base model filename (without .json extension)'),
29
+ weather_file: z.string().describe('Weather file name (with or without .epw extension)'),
30
+ wrapper: z.string().optional().describe('Optional model wrapper (e.g., "fhs_compliance", "passthrough")'),
31
+ parameters: z.preprocess((params) => {
32
+ // Transform any string values to arrays BEFORE validation
33
+ if (!params || typeof params !== 'object' || Array.isArray(params)) {
34
+ return params;
35
+ }
36
+ return Object.fromEntries(Object.entries(params).map(([key, value]) => {
37
+ if (typeof value === 'string') {
38
+ try {
39
+ const parsed = JSON.parse(value);
40
+ return [key, Array.isArray(parsed) ? parsed : [parsed]];
41
+ }
42
+ catch {
43
+ return [key, [value]];
44
+ }
45
+ }
46
+ return [key, Array.isArray(value) ? value : [value]];
47
+ }));
48
+ }, z.record(z.string(), z.array(z.string()))).describe('Object mapping category to array of parameter IDs'),
49
+ }),
50
+ vulcan_run_batch: z.object({
51
+ config_name: z.string().describe('Configuration name (with or without .json extension)'),
52
+ job_id: z.string().optional().describe('Optional custom job ID (defaults to mcp_{uuid})'),
53
+ }),
54
+ vulcan_get_batch_status: z.object({
55
+ job_id: z.string().optional().describe('Job ID returned from vulcan_run_batch'),
56
+ config_name: z.string().optional().describe('Configuration name (alternative to job_id, since config names are unique)'),
57
+ }).refine(data => data.job_id || data.config_name, {
58
+ message: 'Either job_id or config_name must be provided',
59
+ }),
60
+ vulcan_calculate_metrics: z.object({
61
+ config_name: z.string().describe('Configuration name (with or without .json extension)'),
62
+ model_names: z.array(z.string()).describe('Array of model names to calculate metrics for'),
63
+ metric_definitions: z.array(z.object({
64
+ id: z.string().optional(),
65
+ name: z.string().optional(),
66
+ column: z.string().optional(),
67
+ function: z.enum(['sum', 'average', 'peak', 'min', 'sumIf', 'averageIf', 'countIf']).optional(),
68
+ comparator: z.string().optional(),
69
+ threshold: z.number().optional(),
70
+ })).describe('Array of metric definitions'),
71
+ time_range: z.object({
72
+ start: z.number().optional(),
73
+ end: z.number().optional(),
74
+ }).optional().describe('Optional time range filter'),
75
+ }),
76
+ vulcan_list_csv_columns: z.object({
77
+ config_name: z.string().describe('Configuration name (with or without .json extension)'),
78
+ model_name: z.string().describe('Model name (e.g., "scenario_1_0")'),
79
+ }),
80
+ vulcan_list_batch_models: z.object({
81
+ config_name: z.string().describe('Configuration name (with or without .json extension)'),
82
+ }),
83
+ };
84
+ // Tool definitions for MCP
85
+ export const toolDefinitions = [
86
+ {
87
+ name: 'vulcan_list_parameters',
88
+ description: `List available parameter categories and their JSON snippets.
89
+
90
+ Use this to discover what parameters are available before creating batch configurations.
91
+ Returns a catalog of all categories (e.g., base_json, heat_source_wet, controls) and their parameters.
92
+
93
+ Example: Call with category='base_json' to see all base models available.
94
+ See also: vulcan_view_parameter to see details of a specific parameter.`,
95
+ inputSchema: {
96
+ type: 'object',
97
+ properties: {
98
+ category: {
99
+ type: 'string',
100
+ description: 'Optional: filter by category name (e.g., "base_json", "heat_source_wet", "controls")',
101
+ },
102
+ },
103
+ },
104
+ },
105
+ {
106
+ name: 'vulcan_view_parameter',
107
+ description: `View a specific parameter JSON snippet and its markdown documentation.
108
+
109
+ Use this to see the full content of a parameter after discovering it with vulcan_list_parameters.
110
+ Returns both the JSON content and optional markdown documentation if available.
111
+
112
+ Example: View the "hp" parameter in "heat_source_wet" category to see heat pump configuration.
113
+ See also: vulcan_list_parameters to discover available parameters.`,
114
+ inputSchema: {
115
+ type: 'object',
116
+ required: ['category', 'parameter_id'],
117
+ properties: {
118
+ category: { type: 'string' },
119
+ parameter_id: { type: 'string' },
120
+ },
121
+ },
122
+ },
123
+ {
124
+ name: 'vulcan_save_parameter',
125
+ description: `Create or edit a parameter JSON snippet with validation.
126
+
127
+ Use this to create new parameters or modify existing ones. The parameter will be validated
128
+ against the schema and baseline model before saving. Validation ensures the parameter is
129
+ compatible with the HEM engine.
130
+
131
+ Example: Create a new heat pump configuration or modify an existing control schedule.
132
+ See also: vulcan_view_parameter to view existing parameters before editing.`,
133
+ inputSchema: {
134
+ type: 'object',
135
+ required: ['category', 'parameter_id', 'content'],
136
+ properties: {
137
+ category: { type: 'string' },
138
+ parameter_id: { type: 'string' },
139
+ content: { type: 'object' },
140
+ markdown_content: { type: 'string' },
141
+ },
142
+ },
143
+ },
144
+ {
145
+ name: 'vulcan_create_batch_config',
146
+ description: `Create a batch configuration with base model, weather file, wrapper, and parameters.
147
+
148
+ Use this to create a batch simulation configuration that can be executed with vulcan_run_batch.
149
+ The config defines which parameters to combine in a batch run. All parameter files must exist.
150
+
151
+ Example: Create a config comparing different insulation levels with a heat pump system.
152
+ See also: vulcan_list_parameters to discover available parameters, vulcan_run_batch to execute.`,
153
+ inputSchema: {
154
+ type: 'object',
155
+ required: ['config_name', 'base_model', 'weather_file', 'parameters'],
156
+ properties: {
157
+ config_name: { type: 'string' },
158
+ base_model: { type: 'string' },
159
+ weather_file: { type: 'string' },
160
+ wrapper: { type: 'string' },
161
+ parameters: {
162
+ type: 'object',
163
+ additionalProperties: {
164
+ oneOf: [
165
+ { type: 'array', items: { type: 'string' } },
166
+ { type: 'string' } // Allow strings that will be parsed to arrays
167
+ ]
168
+ }
169
+ },
170
+ },
171
+ },
172
+ },
173
+ {
174
+ name: 'vulcan_run_batch',
175
+ description: `Run a batch simulation configuration asynchronously.
176
+
177
+ Use this to execute a batch configuration created with vulcan_create_batch_config.
178
+ The simulation runs in the background and progress can be checked with vulcan_get_batch_status.
179
+
180
+ Example: Run a batch config named "insulation_test" to execute all parameter combinations.
181
+ See also: vulcan_get_batch_status to check progress, vulcan_create_batch_config to create configs.`,
182
+ inputSchema: {
183
+ type: 'object',
184
+ required: ['config_name'],
185
+ properties: {
186
+ config_name: { type: 'string' },
187
+ job_id: { type: 'string' },
188
+ },
189
+ },
190
+ },
191
+ {
192
+ name: 'vulcan_get_batch_status',
193
+ description: `Get the status, progress, and results summary of a batch run.
194
+
195
+ Use this to check the progress of a batch simulation started with vulcan_run_batch.
196
+ Returns current status (queued/running/completed/error), progress percentage, and pass/fail counts.
197
+
198
+ You can provide either job_id (returned from vulcan_run_batch) or config_name (since config names are unique).
199
+
200
+ Example: Check status using config_name "my_batch_config" or job_id "mcp_abc123".
201
+ See also: vulcan_run_batch to start a batch, vulcan_calculate_metrics to analyze results.`,
202
+ inputSchema: {
203
+ type: 'object',
204
+ properties: {
205
+ job_id: { type: 'string', description: 'Job ID returned from vulcan_run_batch' },
206
+ config_name: { type: 'string', description: 'Configuration name (alternative to job_id)' },
207
+ },
208
+ },
209
+ },
210
+ {
211
+ name: 'vulcan_calculate_metrics',
212
+ description: `Calculate metrics by aggregating columns from simulation results.
213
+
214
+ Use this to compute metrics (sum, average, peak, min, cost) from CSV result files after a batch run.
215
+ Supports time range filtering and conditional metrics (sumIf, averageIf).
216
+
217
+ Example: Calculate total electricity consumption and peak demand for all models in a batch.
218
+ See also: vulcan_get_batch_status to check if batch is complete, vulcan_run_batch to start batch.`,
219
+ inputSchema: {
220
+ type: 'object',
221
+ required: ['config_name', 'model_names', 'metric_definitions'],
222
+ properties: {
223
+ config_name: { type: 'string' },
224
+ model_names: { type: 'array', items: { type: 'string' } },
225
+ metric_definitions: { type: 'array' },
226
+ time_range: { type: 'object' },
227
+ },
228
+ },
229
+ },
230
+ {
231
+ name: 'vulcan_list_csv_columns',
232
+ description: `List available columns from a CSV result file.
233
+
234
+ Use this to discover what columns are available in a model's results before calculating metrics.
235
+ Returns column names, units, and their indices.
236
+
237
+ Example: List columns for model "scenario_1_0" in config "my_batch" to see available data columns.
238
+ See also: vulcan_list_batch_models to get model names, vulcan_calculate_metrics to compute metrics.`,
239
+ inputSchema: {
240
+ type: 'object',
241
+ required: ['config_name', 'model_name'],
242
+ properties: {
243
+ config_name: { type: 'string' },
244
+ model_name: { type: 'string' },
245
+ },
246
+ },
247
+ },
248
+ {
249
+ name: 'vulcan_list_batch_models',
250
+ description: `List all model names from a completed batch run.
251
+
252
+ Use this to discover which models were generated by a batch run, so you can use them in vulcan_calculate_metrics.
253
+ Returns all model names that have result CSV files.
254
+
255
+ Example: List models from config "my_batch" to get ["scenario_1_0", "scenario_1_1", ...].
256
+ See also: vulcan_get_batch_status to check if batch is complete, vulcan_calculate_metrics to analyze results.`,
257
+ inputSchema: {
258
+ type: 'object',
259
+ required: ['config_name'],
260
+ properties: {
261
+ config_name: { type: 'string' },
262
+ },
263
+ },
264
+ },
265
+ ];
266
+ // Tool handler function
267
+ export async function handleToolCall(name, args, config) {
268
+ switch (name) {
269
+ case 'vulcan_list_parameters': {
270
+ const params = toolSchemas.vulcan_list_parameters.parse(args);
271
+ return await listParameters(config, params);
272
+ }
273
+ case 'vulcan_view_parameter': {
274
+ const params = toolSchemas.vulcan_view_parameter.parse(args);
275
+ return await viewParameter(config, params);
276
+ }
277
+ case 'vulcan_save_parameter': {
278
+ // Manual validation for save_parameter to avoid Zod issues
279
+ const { category, parameter_id, content, markdown_content } = args || {};
280
+ if (!category || typeof category !== 'string') {
281
+ throw new Error('category is required and must be a string');
282
+ }
283
+ if (!parameter_id || typeof parameter_id !== 'string') {
284
+ throw new Error('parameter_id is required and must be a string');
285
+ }
286
+ if (!content || typeof content !== 'object' || Array.isArray(content)) {
287
+ throw new Error('content is required and must be a JSON object');
288
+ }
289
+ const saveParams = {
290
+ category,
291
+ parameter_id,
292
+ content,
293
+ ...(markdown_content ? { markdown_content } : {}),
294
+ };
295
+ return await saveParameter(config, saveParams);
296
+ }
297
+ case 'vulcan_create_batch_config': {
298
+ // Manual validation and parsing to handle string-to-array conversion
299
+ const { config_name, base_model, weather_file, wrapper, parameters } = args || {};
300
+ if (!config_name || typeof config_name !== 'string') {
301
+ throw new Error('config_name is required and must be a string');
302
+ }
303
+ if (!base_model || typeof base_model !== 'string') {
304
+ throw new Error('base_model is required and must be a string');
305
+ }
306
+ if (!weather_file || typeof weather_file !== 'string') {
307
+ throw new Error('weather_file is required and must be a string');
308
+ }
309
+ // Transform parameters: convert strings to arrays
310
+ let parsedParameters = {};
311
+ if (parameters) {
312
+ if (typeof parameters !== 'object' || Array.isArray(parameters)) {
313
+ throw new Error('parameters must be an object mapping category to array of parameter IDs');
314
+ }
315
+ parsedParameters = Object.fromEntries(Object.entries(parameters).map(([key, value]) => {
316
+ if (typeof value === 'string') {
317
+ try {
318
+ const parsed = JSON.parse(value);
319
+ return [key, Array.isArray(parsed) ? parsed : [parsed]];
320
+ }
321
+ catch {
322
+ return [key, [value]];
323
+ }
324
+ }
325
+ return [key, Array.isArray(value) ? value : [value]];
326
+ }));
327
+ }
328
+ const createParams = {
329
+ config_name,
330
+ base_model,
331
+ weather_file,
332
+ ...(wrapper ? { wrapper } : {}),
333
+ parameters: parsedParameters,
334
+ };
335
+ return await createBatchConfig(config, createParams);
336
+ }
337
+ case 'vulcan_run_batch': {
338
+ const params = toolSchemas.vulcan_run_batch.parse(args);
339
+ return await runBatch(config, params);
340
+ }
341
+ case 'vulcan_get_batch_status': {
342
+ const params = toolSchemas.vulcan_get_batch_status.parse(args);
343
+ return await getBatchStatus(config, params);
344
+ }
345
+ case 'vulcan_calculate_metrics': {
346
+ const params = toolSchemas.vulcan_calculate_metrics.parse(args);
347
+ return await calculateMetrics(config, params);
348
+ }
349
+ case 'vulcan_list_csv_columns': {
350
+ const params = toolSchemas.vulcan_list_csv_columns.parse(args);
351
+ return await listCsvColumns(config, params);
352
+ }
353
+ case 'vulcan_list_batch_models': {
354
+ const params = toolSchemas.vulcan_list_batch_models.parse(args);
355
+ return await listBatchModels(config, params);
356
+ }
357
+ default:
358
+ throw new Error(`Unknown tool: ${name}`);
359
+ }
360
+ }
361
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/index.ts"],"names":[],"mappings":"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"}