@cyanheads/nasa-power-mcp-server 0.1.1 → 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.
Files changed (64) hide show
  1. package/AGENTS.md +15 -13
  2. package/CLAUDE.md +15 -13
  3. package/README.md +72 -43
  4. package/changelog/0.2.x/0.2.0.md +23 -0
  5. package/dist/index.js +6 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/mcp-server/tools/definitions/comparison-contracts.d.ts +125 -366
  8. package/dist/mcp-server/tools/definitions/comparison-contracts.d.ts.map +1 -1
  9. package/dist/mcp-server/tools/definitions/comparison-contracts.js +14 -4
  10. package/dist/mcp-server/tools/definitions/comparison-contracts.js.map +1 -1
  11. package/dist/mcp-server/tools/definitions/nasa-power-compare-locations.tool.d.ts +175 -300
  12. package/dist/mcp-server/tools/definitions/nasa-power-compare-locations.tool.d.ts.map +1 -1
  13. package/dist/mcp-server/tools/definitions/nasa-power-compare-locations.tool.js +1 -1
  14. package/dist/mcp-server/tools/definitions/nasa-power-compare-locations.tool.js.map +1 -1
  15. package/dist/mcp-server/tools/definitions/nasa-power-dataframe-drop.tool.js +1 -1
  16. package/dist/mcp-server/tools/definitions/nasa-power-dataframe-drop.tool.js.map +1 -1
  17. package/dist/mcp-server/tools/definitions/nasa-power-dataframe-query.tool.d.ts +3 -1
  18. package/dist/mcp-server/tools/definitions/nasa-power-dataframe-query.tool.d.ts.map +1 -1
  19. package/dist/mcp-server/tools/definitions/nasa-power-dataframe-query.tool.js +7 -2
  20. package/dist/mcp-server/tools/definitions/nasa-power-dataframe-query.tool.js.map +1 -1
  21. package/dist/mcp-server/tools/definitions/nasa-power-get-climatology.tool.d.ts +73 -162
  22. package/dist/mcp-server/tools/definitions/nasa-power-get-climatology.tool.d.ts.map +1 -1
  23. package/dist/mcp-server/tools/definitions/nasa-power-get-climatology.tool.js +10 -4
  24. package/dist/mcp-server/tools/definitions/nasa-power-get-climatology.tool.js.map +1 -1
  25. package/dist/mcp-server/tools/definitions/nasa-power-get-region.tool.d.ts +10 -47
  26. package/dist/mcp-server/tools/definitions/nasa-power-get-region.tool.d.ts.map +1 -1
  27. package/dist/mcp-server/tools/definitions/nasa-power-get-timeseries.tool.d.ts +84 -136
  28. package/dist/mcp-server/tools/definitions/nasa-power-get-timeseries.tool.d.ts.map +1 -1
  29. package/dist/mcp-server/tools/definitions/nasa-power-list-reference.tool.d.ts.map +1 -1
  30. package/dist/mcp-server/tools/definitions/nasa-power-list-reference.tool.js +26 -24
  31. package/dist/mcp-server/tools/definitions/nasa-power-list-reference.tool.js.map +1 -1
  32. package/dist/mcp-server/tools/definitions/nasa-power-search-parameters.tool.d.ts.map +1 -1
  33. package/dist/mcp-server/tools/definitions/nasa-power-search-parameters.tool.js +17 -8
  34. package/dist/mcp-server/tools/definitions/nasa-power-search-parameters.tool.js.map +1 -1
  35. package/dist/mcp-server/tools/definitions/point-contracts.d.ts +38 -280
  36. package/dist/mcp-server/tools/definitions/point-contracts.d.ts.map +1 -1
  37. package/dist/services/canvas/canvas-service.d.ts +13 -3
  38. package/dist/services/canvas/canvas-service.d.ts.map +1 -1
  39. package/dist/services/canvas/canvas-service.js +198 -63
  40. package/dist/services/canvas/canvas-service.js.map +1 -1
  41. package/dist/services/canvas/errors.d.ts.map +1 -1
  42. package/dist/services/canvas/errors.js +20 -8
  43. package/dist/services/canvas/errors.js.map +1 -1
  44. package/dist/services/canvas/types.d.ts +54 -1
  45. package/dist/services/canvas/types.d.ts.map +1 -1
  46. package/dist/services/canvas/types.js +6 -1
  47. package/dist/services/canvas/types.js.map +1 -1
  48. package/dist/services/power/errors.js +1 -1
  49. package/dist/services/power/errors.js.map +1 -1
  50. package/dist/services/power/normalize.js +2 -2
  51. package/dist/services/power/normalize.js.map +1 -1
  52. package/dist/services/power/power-service.d.ts.map +1 -1
  53. package/dist/services/power/power-service.js +8 -7
  54. package/dist/services/power/power-service.js.map +1 -1
  55. package/dist/services/power/presets.d.ts +23 -0
  56. package/dist/services/power/presets.d.ts.map +1 -1
  57. package/dist/services/power/presets.js +27 -1
  58. package/dist/services/power/presets.js.map +1 -1
  59. package/dist/services/power/types.d.ts +410 -191
  60. package/dist/services/power/types.d.ts.map +1 -1
  61. package/dist/services/power/types.js +59 -5
  62. package/dist/services/power/types.js.map +1 -1
  63. package/package.json +1 -1
  64. package/server.json +8 -8
@@ -3,7 +3,7 @@ import { z } from '@cyanheads/mcp-ts-core';
3
3
  import { type CompareRequest } from '../../../services/power/index.js';
4
4
  /** Full per-site provenance survives analytical staging. */
5
5
  export declare const ComparisonOutputSchema: z.ZodObject<{
6
- request: z.ZodDiscriminatedUnion<[z.ZodObject<{
6
+ request: z.ZodObject<{
7
7
  community: z.ZodDefault<z.ZodEnum<{
8
8
  AG: "AG";
9
9
  RE: "RE";
@@ -22,174 +22,48 @@ export declare const ComparisonOutputSchema: z.ZodObject<{
22
22
  windSurface: z.ZodOptional<z.ZodEnum<{
23
23
  "airport ice": "airport ice";
24
24
  airport_ice: "airport_ice";
25
+ airportgrass: "airportgrass";
25
26
  airportice: "airportice";
26
- grass: "grass";
27
+ openwater: "openwater";
28
+ seaice: "seaice";
29
+ vegtype_1: "vegtype_1";
30
+ vegtype_10: "vegtype_10";
31
+ vegtype_11: "vegtype_11";
32
+ vegtype_12: "vegtype_12";
33
+ vegtype_2: "vegtype_2";
34
+ vegtype_20: "vegtype_20";
35
+ vegtype_3: "vegtype_3";
36
+ vegtype_4: "vegtype_4";
37
+ vegtype_5: "vegtype_5";
38
+ vegtype_6: "vegtype_6";
39
+ vegtype_7: "vegtype_7";
40
+ vegtype_8: "vegtype_8";
41
+ vegtype_9: "vegtype_9";
27
42
  }>>;
28
- temporalResolution: z.ZodLiteral<"hourly">;
29
- startDate: z.ZodString;
30
- endDate: z.ZodString;
31
- locations: z.ZodArray<z.ZodObject<{
32
- latitude: z.ZodNumber;
33
- longitude: z.ZodNumber;
34
- label: z.ZodString;
35
- }, z.core.$strict>>;
36
- sort: z.ZodOptional<z.ZodObject<{
37
- parameter: z.ZodString;
38
- direction: z.ZodEnum<{
39
- asc: "asc";
40
- desc: "desc";
41
- }>;
42
- }, z.core.$strict>>;
43
- selection: z.ZodDefault<z.ZodDiscriminatedUnion<[z.ZodObject<{
44
- mode: z.ZodLiteral<"preset">;
45
- preset: z.ZodEnum<{
46
- agroclimatology: "agroclimatology";
47
- building_hvac: "building_hvac";
48
- solar_pv: "solar_pv";
49
- water_balance: "water_balance";
50
- wind_turbine: "wind_turbine";
51
- }>;
52
- }, z.core.$strict>, z.ZodObject<{
53
- mode: z.ZodLiteral<"parameters">;
54
- parameters: z.ZodArray<z.ZodString>;
55
- }, z.core.$strict>], "mode">>;
56
- }, z.core.$strict>, z.ZodObject<{
57
- community: z.ZodDefault<z.ZodEnum<{
58
- AG: "AG";
59
- RE: "RE";
60
- SB: "SB";
61
- }>>;
62
- units: z.ZodDefault<z.ZodEnum<{
63
- imperial: "imperial";
64
- metric: "metric";
65
- }>>;
66
- timeStandard: z.ZodDefault<z.ZodEnum<{
67
- LST: "LST";
68
- UTC: "UTC";
69
- }>>;
70
- selection: z.ZodDefault<z.ZodDiscriminatedUnion<[z.ZodObject<{
71
- mode: z.ZodLiteral<"preset">;
72
- preset: z.ZodEnum<{
73
- agroclimatology: "agroclimatology";
74
- building_hvac: "building_hvac";
75
- solar_pv: "solar_pv";
76
- water_balance: "water_balance";
77
- wind_turbine: "wind_turbine";
78
- }>;
79
- }, z.core.$strict>, z.ZodObject<{
80
- mode: z.ZodLiteral<"parameters">;
81
- parameters: z.ZodArray<z.ZodString>;
82
- }, z.core.$strict>], "mode">>;
83
- siteElevation: z.ZodOptional<z.ZodNumber>;
84
- windElevation: z.ZodOptional<z.ZodNumber>;
85
- windSurface: z.ZodOptional<z.ZodEnum<{
86
- "airport ice": "airport ice";
87
- airport_ice: "airport_ice";
88
- airportice: "airportice";
89
- grass: "grass";
90
- }>>;
91
- startDate: z.ZodString;
92
- endDate: z.ZodString;
93
- locations: z.ZodArray<z.ZodObject<{
94
- latitude: z.ZodNumber;
95
- longitude: z.ZodNumber;
96
- label: z.ZodString;
97
- }, z.core.$strict>>;
98
- sort: z.ZodOptional<z.ZodObject<{
99
- parameter: z.ZodString;
100
- direction: z.ZodEnum<{
101
- asc: "asc";
102
- desc: "desc";
103
- }>;
104
- }, z.core.$strict>>;
105
- temporalResolution: z.ZodLiteral<"daily">;
106
- }, z.core.$strict>, z.ZodObject<{
107
- community: z.ZodDefault<z.ZodEnum<{
108
- AG: "AG";
109
- RE: "RE";
110
- SB: "SB";
111
- }>>;
112
- units: z.ZodDefault<z.ZodEnum<{
113
- imperial: "imperial";
114
- metric: "metric";
115
- }>>;
116
- timeStandard: z.ZodDefault<z.ZodEnum<{
117
- LST: "LST";
118
- UTC: "UTC";
119
- }>>;
120
- selection: z.ZodDefault<z.ZodDiscriminatedUnion<[z.ZodObject<{
121
- mode: z.ZodLiteral<"preset">;
122
- preset: z.ZodEnum<{
123
- agroclimatology: "agroclimatology";
124
- building_hvac: "building_hvac";
125
- solar_pv: "solar_pv";
126
- water_balance: "water_balance";
127
- wind_turbine: "wind_turbine";
128
- }>;
129
- }, z.core.$strict>, z.ZodObject<{
130
- mode: z.ZodLiteral<"parameters">;
131
- parameters: z.ZodArray<z.ZodString>;
132
- }, z.core.$strict>], "mode">>;
133
- siteElevation: z.ZodOptional<z.ZodNumber>;
134
- windElevation: z.ZodOptional<z.ZodNumber>;
135
- windSurface: z.ZodOptional<z.ZodEnum<{
136
- "airport ice": "airport ice";
137
- airport_ice: "airport_ice";
138
- airportice: "airportice";
139
- grass: "grass";
140
- }>>;
141
- temporalResolution: z.ZodLiteral<"monthly">;
142
- startYear: z.ZodNumber;
143
- endYear: z.ZodNumber;
144
- locations: z.ZodArray<z.ZodObject<{
145
- latitude: z.ZodNumber;
146
- longitude: z.ZodNumber;
147
- label: z.ZodString;
148
- }, z.core.$strict>>;
149
- sort: z.ZodOptional<z.ZodObject<{
150
- parameter: z.ZodString;
151
- direction: z.ZodEnum<{
152
- asc: "asc";
153
- desc: "desc";
43
+ temporalResolution: z.ZodEnum<{
44
+ climatology: "climatology";
45
+ daily: "daily";
46
+ hourly: "hourly";
47
+ monthly: "monthly";
48
+ }>;
49
+ startDate: z.ZodOptional<z.ZodString>;
50
+ endDate: z.ZodOptional<z.ZodString>;
51
+ startYear: z.ZodOptional<z.ZodNumber>;
52
+ endYear: z.ZodOptional<z.ZodNumber>;
53
+ selection: z.ZodObject<{
54
+ mode: z.ZodEnum<{
55
+ parameters: "parameters";
56
+ preset: "preset";
154
57
  }>;
155
- }, z.core.$strict>>;
156
- }, z.core.$strict>, z.ZodObject<{
157
- community: z.ZodDefault<z.ZodEnum<{
158
- AG: "AG";
159
- RE: "RE";
160
- SB: "SB";
161
- }>>;
162
- units: z.ZodDefault<z.ZodEnum<{
163
- imperial: "imperial";
164
- metric: "metric";
165
- }>>;
166
- timeStandard: z.ZodDefault<z.ZodEnum<{
167
- LST: "LST";
168
- UTC: "UTC";
169
- }>>;
170
- selection: z.ZodDefault<z.ZodDiscriminatedUnion<[z.ZodObject<{
171
- mode: z.ZodLiteral<"preset">;
172
- preset: z.ZodEnum<{
58
+ preset: z.ZodOptional<z.ZodEnum<{
173
59
  agroclimatology: "agroclimatology";
174
60
  building_hvac: "building_hvac";
175
61
  solar_pv: "solar_pv";
176
62
  water_balance: "water_balance";
177
63
  wind_turbine: "wind_turbine";
178
- }>;
179
- }, z.core.$strict>, z.ZodObject<{
180
- mode: z.ZodLiteral<"parameters">;
181
- parameters: z.ZodArray<z.ZodString>;
182
- }, z.core.$strict>], "mode">>;
183
- siteElevation: z.ZodOptional<z.ZodNumber>;
184
- windElevation: z.ZodOptional<z.ZodNumber>;
185
- windSurface: z.ZodOptional<z.ZodEnum<{
186
- "airport ice": "airport ice";
187
- airport_ice: "airport_ice";
188
- airportice: "airportice";
189
- grass: "grass";
190
- }>>;
191
- startYear: z.ZodOptional<z.ZodNumber>;
192
- endYear: z.ZodOptional<z.ZodNumber>;
64
+ }>>;
65
+ parameters: z.ZodOptional<z.ZodArray<z.ZodString>>;
66
+ }, z.core.$strip>;
193
67
  locations: z.ZodArray<z.ZodObject<{
194
68
  latitude: z.ZodNumber;
195
69
  longitude: z.ZodNumber;
@@ -202,8 +76,7 @@ export declare const ComparisonOutputSchema: z.ZodObject<{
202
76
  desc: "desc";
203
77
  }>;
204
78
  }, z.core.$strict>>;
205
- temporalResolution: z.ZodDefault<z.ZodLiteral<"climatology">>;
206
- }, z.core.$strict>], "temporalResolution">;
79
+ }, z.core.$strip>;
207
80
  metadata: z.ZodObject<{
208
81
  fetchedAt: z.ZodString;
209
82
  endpointUrls: z.ZodArray<z.ZodString>;
@@ -219,7 +92,7 @@ export declare const ComparisonOutputSchema: z.ZodObject<{
219
92
  extra: z.ZodRecord<z.ZodString, z.ZodType<import("../../../services/power/index.js").JsonValue, unknown, z.core.$ZodTypeInternals<import("../../../services/power/index.js").JsonValue, unknown>>>;
220
93
  }, z.core.$strip>>;
221
94
  locations: z.ZodArray<z.ZodObject<{
222
- request: z.ZodDiscriminatedUnion<[z.ZodObject<{
95
+ request: z.ZodObject<{
223
96
  community: z.ZodDefault<z.ZodEnum<{
224
97
  AG: "AG";
225
98
  RE: "RE";
@@ -240,146 +113,49 @@ export declare const ComparisonOutputSchema: z.ZodObject<{
240
113
  windSurface: z.ZodOptional<z.ZodEnum<{
241
114
  "airport ice": "airport ice";
242
115
  airport_ice: "airport_ice";
116
+ airportgrass: "airportgrass";
243
117
  airportice: "airportice";
244
- grass: "grass";
118
+ openwater: "openwater";
119
+ seaice: "seaice";
120
+ vegtype_1: "vegtype_1";
121
+ vegtype_10: "vegtype_10";
122
+ vegtype_11: "vegtype_11";
123
+ vegtype_12: "vegtype_12";
124
+ vegtype_2: "vegtype_2";
125
+ vegtype_20: "vegtype_20";
126
+ vegtype_3: "vegtype_3";
127
+ vegtype_4: "vegtype_4";
128
+ vegtype_5: "vegtype_5";
129
+ vegtype_6: "vegtype_6";
130
+ vegtype_7: "vegtype_7";
131
+ vegtype_8: "vegtype_8";
132
+ vegtype_9: "vegtype_9";
245
133
  }>>;
246
- temporalResolution: z.ZodLiteral<"hourly">;
247
- startDate: z.ZodString;
248
- endDate: z.ZodString;
249
- selection: z.ZodDefault<z.ZodDiscriminatedUnion<[z.ZodObject<{
250
- mode: z.ZodLiteral<"preset">;
251
- preset: z.ZodEnum<{
252
- agroclimatology: "agroclimatology";
253
- building_hvac: "building_hvac";
254
- solar_pv: "solar_pv";
255
- water_balance: "water_balance";
256
- wind_turbine: "wind_turbine";
134
+ temporalResolution: z.ZodEnum<{
135
+ climatology: "climatology";
136
+ daily: "daily";
137
+ hourly: "hourly";
138
+ monthly: "monthly";
139
+ }>;
140
+ startDate: z.ZodOptional<z.ZodString>;
141
+ endDate: z.ZodOptional<z.ZodString>;
142
+ startYear: z.ZodOptional<z.ZodNumber>;
143
+ endYear: z.ZodOptional<z.ZodNumber>;
144
+ selection: z.ZodObject<{
145
+ mode: z.ZodEnum<{
146
+ parameters: "parameters";
147
+ preset: "preset";
257
148
  }>;
258
- }, z.core.$strict>, z.ZodObject<{
259
- mode: z.ZodLiteral<"parameters">;
260
- parameters: z.ZodArray<z.ZodString>;
261
- }, z.core.$strict>], "mode">>;
262
- }, z.core.$strict>, z.ZodObject<{
263
- community: z.ZodDefault<z.ZodEnum<{
264
- AG: "AG";
265
- RE: "RE";
266
- SB: "SB";
267
- }>>;
268
- units: z.ZodDefault<z.ZodEnum<{
269
- imperial: "imperial";
270
- metric: "metric";
271
- }>>;
272
- timeStandard: z.ZodDefault<z.ZodEnum<{
273
- LST: "LST";
274
- UTC: "UTC";
275
- }>>;
276
- latitude: z.ZodNumber;
277
- longitude: z.ZodNumber;
278
- selection: z.ZodDefault<z.ZodDiscriminatedUnion<[z.ZodObject<{
279
- mode: z.ZodLiteral<"preset">;
280
- preset: z.ZodEnum<{
149
+ preset: z.ZodOptional<z.ZodEnum<{
281
150
  agroclimatology: "agroclimatology";
282
151
  building_hvac: "building_hvac";
283
152
  solar_pv: "solar_pv";
284
153
  water_balance: "water_balance";
285
154
  wind_turbine: "wind_turbine";
286
- }>;
287
- }, z.core.$strict>, z.ZodObject<{
288
- mode: z.ZodLiteral<"parameters">;
289
- parameters: z.ZodArray<z.ZodString>;
290
- }, z.core.$strict>], "mode">>;
291
- siteElevation: z.ZodOptional<z.ZodNumber>;
292
- windElevation: z.ZodOptional<z.ZodNumber>;
293
- windSurface: z.ZodOptional<z.ZodEnum<{
294
- "airport ice": "airport ice";
295
- airport_ice: "airport_ice";
296
- airportice: "airportice";
297
- grass: "grass";
298
- }>>;
299
- temporalResolution: z.ZodDefault<z.ZodLiteral<"daily">>;
300
- startDate: z.ZodString;
301
- endDate: z.ZodString;
302
- }, z.core.$strict>, z.ZodObject<{
303
- community: z.ZodDefault<z.ZodEnum<{
304
- AG: "AG";
305
- RE: "RE";
306
- SB: "SB";
307
- }>>;
308
- units: z.ZodDefault<z.ZodEnum<{
309
- imperial: "imperial";
310
- metric: "metric";
311
- }>>;
312
- timeStandard: z.ZodDefault<z.ZodEnum<{
313
- LST: "LST";
314
- UTC: "UTC";
315
- }>>;
316
- latitude: z.ZodNumber;
317
- longitude: z.ZodNumber;
318
- selection: z.ZodDefault<z.ZodDiscriminatedUnion<[z.ZodObject<{
319
- mode: z.ZodLiteral<"preset">;
320
- preset: z.ZodEnum<{
321
- agroclimatology: "agroclimatology";
322
- building_hvac: "building_hvac";
323
- solar_pv: "solar_pv";
324
- water_balance: "water_balance";
325
- wind_turbine: "wind_turbine";
326
- }>;
327
- }, z.core.$strict>, z.ZodObject<{
328
- mode: z.ZodLiteral<"parameters">;
329
- parameters: z.ZodArray<z.ZodString>;
330
- }, z.core.$strict>], "mode">>;
331
- siteElevation: z.ZodOptional<z.ZodNumber>;
332
- windElevation: z.ZodOptional<z.ZodNumber>;
333
- windSurface: z.ZodOptional<z.ZodEnum<{
334
- "airport ice": "airport ice";
335
- airport_ice: "airport_ice";
336
- airportice: "airportice";
337
- grass: "grass";
338
- }>>;
339
- temporalResolution: z.ZodLiteral<"monthly">;
340
- startYear: z.ZodNumber;
341
- endYear: z.ZodNumber;
342
- }, z.core.$strict>, z.ZodObject<{
343
- community: z.ZodDefault<z.ZodEnum<{
344
- AG: "AG";
345
- RE: "RE";
346
- SB: "SB";
347
- }>>;
348
- units: z.ZodDefault<z.ZodEnum<{
349
- imperial: "imperial";
350
- metric: "metric";
351
- }>>;
352
- timeStandard: z.ZodDefault<z.ZodEnum<{
353
- LST: "LST";
354
- UTC: "UTC";
355
- }>>;
356
- latitude: z.ZodNumber;
357
- longitude: z.ZodNumber;
358
- selection: z.ZodDefault<z.ZodDiscriminatedUnion<[z.ZodObject<{
359
- mode: z.ZodLiteral<"preset">;
360
- preset: z.ZodEnum<{
361
- agroclimatology: "agroclimatology";
362
- building_hvac: "building_hvac";
363
- solar_pv: "solar_pv";
364
- water_balance: "water_balance";
365
- wind_turbine: "wind_turbine";
366
- }>;
367
- }, z.core.$strict>, z.ZodObject<{
368
- mode: z.ZodLiteral<"parameters">;
369
- parameters: z.ZodArray<z.ZodString>;
370
- }, z.core.$strict>], "mode">>;
371
- siteElevation: z.ZodOptional<z.ZodNumber>;
372
- windElevation: z.ZodOptional<z.ZodNumber>;
373
- windSurface: z.ZodOptional<z.ZodEnum<{
374
- "airport ice": "airport ice";
375
- airport_ice: "airport_ice";
376
- airportice: "airportice";
377
- grass: "grass";
378
- }>>;
379
- temporalResolution: z.ZodLiteral<"climatology">;
380
- startYear: z.ZodOptional<z.ZodNumber>;
381
- endYear: z.ZodOptional<z.ZodNumber>;
382
- }, z.core.$strict>], "temporalResolution">;
155
+ }>>;
156
+ parameters: z.ZodOptional<z.ZodArray<z.ZodString>>;
157
+ }, z.core.$strip>;
158
+ }, z.core.$strip>;
383
159
  metadata: z.ZodObject<{
384
160
  endpointUrl: z.ZodString;
385
161
  fetchedAt: z.ZodString;
@@ -452,6 +228,7 @@ export declare const ComparisonOutputSchema: z.ZodObject<{
452
228
  label: z.ZodString;
453
229
  latitude: z.ZodNumber;
454
230
  longitude: z.ZodNumber;
231
+ summaryCount: z.ZodOptional<z.ZodNumber>;
455
232
  sortMetric: z.ZodNullable<z.ZodNumber>;
456
233
  }, z.core.$strip>>;
457
234
  failed: z.ZodArray<z.ZodObject<{
@@ -543,6 +320,44 @@ export declare const ComparisonOutputSchema: z.ZodObject<{
543
320
  describeTool: z.ZodLiteral<"nasa_power_dataframe_describe">;
544
321
  queryTool: z.ZodLiteral<"nasa_power_dataframe_query">;
545
322
  }, z.core.$strip>>;
323
+ summaryDatasets: z.ZodOptional<z.ZodObject<{
324
+ buckets: z.ZodObject<{
325
+ canvas_id: z.ZodString;
326
+ table: z.ZodString;
327
+ rowCount: z.ZodNumber;
328
+ expiresAt: z.ZodString;
329
+ columns: z.ZodArray<z.ZodObject<{
330
+ name: z.ZodString;
331
+ type: z.ZodString;
332
+ nullable: z.ZodBoolean;
333
+ units: z.ZodOptional<z.ZodString>;
334
+ valueKind: z.ZodOptional<z.ZodEnum<{
335
+ number: "number";
336
+ orientation: "orientation";
337
+ }>>;
338
+ }, z.core.$strip>>;
339
+ describeTool: z.ZodLiteral<"nasa_power_dataframe_describe">;
340
+ queryTool: z.ZodLiteral<"nasa_power_dataframe_query">;
341
+ }, z.core.$strip>;
342
+ locations: z.ZodObject<{
343
+ canvas_id: z.ZodString;
344
+ table: z.ZodString;
345
+ rowCount: z.ZodNumber;
346
+ expiresAt: z.ZodString;
347
+ columns: z.ZodArray<z.ZodObject<{
348
+ name: z.ZodString;
349
+ type: z.ZodString;
350
+ nullable: z.ZodBoolean;
351
+ units: z.ZodOptional<z.ZodString>;
352
+ valueKind: z.ZodOptional<z.ZodEnum<{
353
+ number: "number";
354
+ orientation: "orientation";
355
+ }>>;
356
+ }, z.core.$strip>>;
357
+ describeTool: z.ZodLiteral<"nasa_power_dataframe_describe">;
358
+ queryTool: z.ZodLiteral<"nasa_power_dataframe_query">;
359
+ }, z.core.$strip>;
360
+ }, z.core.$strip>>;
546
361
  }, z.core.$strip>;
547
362
  /** Sequential sites share references, pacing, attempts, decoded bytes and deadline. */
548
363
  export declare function presentComparison(request: CompareRequest, canvasId: string | undefined, ctx: Context): Promise<import("../../../services/canvas/index.js").PresentedDataset<{
@@ -552,7 +367,7 @@ export declare function presentComparison(request: CompareRequest, canvasId: str
552
367
  timeStandard: "LST" | "UTC";
553
368
  siteElevation?: number | undefined;
554
369
  windElevation?: number | undefined;
555
- windSurface?: "airport ice" | "airport_ice" | "airportice" | "grass" | undefined;
370
+ windSurface?: "airport ice" | "airport_ice" | "airportgrass" | "airportice" | "openwater" | "seaice" | "vegtype_1" | "vegtype_10" | "vegtype_11" | "vegtype_12" | "vegtype_2" | "vegtype_20" | "vegtype_3" | "vegtype_4" | "vegtype_5" | "vegtype_6" | "vegtype_7" | "vegtype_8" | "vegtype_9" | undefined;
556
371
  temporalResolution: "hourly";
557
372
  startDate: string;
558
373
  endDate: string;
@@ -585,7 +400,7 @@ export declare function presentComparison(request: CompareRequest, canvasId: str
585
400
  };
586
401
  siteElevation?: number | undefined;
587
402
  windElevation?: number | undefined;
588
- windSurface?: "airport ice" | "airport_ice" | "airportice" | "grass" | undefined;
403
+ windSurface?: "airport ice" | "airport_ice" | "airportgrass" | "airportice" | "openwater" | "seaice" | "vegtype_1" | "vegtype_10" | "vegtype_11" | "vegtype_12" | "vegtype_2" | "vegtype_20" | "vegtype_3" | "vegtype_4" | "vegtype_5" | "vegtype_6" | "vegtype_7" | "vegtype_8" | "vegtype_9" | undefined;
589
404
  startDate: string;
590
405
  endDate: string;
591
406
  locations: {
@@ -611,7 +426,7 @@ export declare function presentComparison(request: CompareRequest, canvasId: str
611
426
  };
612
427
  siteElevation?: number | undefined;
613
428
  windElevation?: number | undefined;
614
- windSurface?: "airport ice" | "airport_ice" | "airportice" | "grass" | undefined;
429
+ windSurface?: "airport ice" | "airport_ice" | "airportgrass" | "airportice" | "openwater" | "seaice" | "vegtype_1" | "vegtype_10" | "vegtype_11" | "vegtype_12" | "vegtype_2" | "vegtype_20" | "vegtype_3" | "vegtype_4" | "vegtype_5" | "vegtype_6" | "vegtype_7" | "vegtype_8" | "vegtype_9" | undefined;
615
430
  temporalResolution: "monthly";
616
431
  startYear: number;
617
432
  endYear: number;
@@ -637,7 +452,7 @@ export declare function presentComparison(request: CompareRequest, canvasId: str
637
452
  };
638
453
  siteElevation?: number | undefined;
639
454
  windElevation?: number | undefined;
640
- windSurface?: "airport ice" | "airport_ice" | "airportice" | "grass" | undefined;
455
+ windSurface?: "airport ice" | "airport_ice" | "airportgrass" | "airportice" | "openwater" | "seaice" | "vegtype_1" | "vegtype_10" | "vegtype_11" | "vegtype_12" | "vegtype_2" | "vegtype_20" | "vegtype_3" | "vegtype_4" | "vegtype_5" | "vegtype_6" | "vegtype_7" | "vegtype_8" | "vegtype_9" | undefined;
641
456
  startYear?: number | undefined;
642
457
  endYear?: number | undefined;
643
458
  locations: {
@@ -670,74 +485,17 @@ export declare function presentComparison(request: CompareRequest, canvasId: str
670
485
  longitude: number;
671
486
  siteElevation?: number | undefined;
672
487
  windElevation?: number | undefined;
673
- windSurface?: "airport ice" | "airport_ice" | "airportice" | "grass" | undefined;
674
- temporalResolution: "hourly";
675
- startDate: string;
676
- endDate: string;
677
- selection: {
678
- mode: "preset";
679
- preset: "agroclimatology" | "building_hvac" | "solar_pv" | "water_balance" | "wind_turbine";
680
- } | {
681
- mode: "parameters";
682
- parameters: string[];
683
- };
684
- } | {
685
- community: "AG" | "RE" | "SB";
686
- units: "imperial" | "metric";
687
- timeStandard: "LST" | "UTC";
688
- latitude: number;
689
- longitude: number;
690
- selection: {
691
- mode: "preset";
692
- preset: "agroclimatology" | "building_hvac" | "solar_pv" | "water_balance" | "wind_turbine";
693
- } | {
694
- mode: "parameters";
695
- parameters: string[];
696
- };
697
- siteElevation?: number | undefined;
698
- windElevation?: number | undefined;
699
- windSurface?: "airport ice" | "airport_ice" | "airportice" | "grass" | undefined;
700
- temporalResolution: "daily";
701
- startDate: string;
702
- endDate: string;
703
- } | {
704
- community: "AG" | "RE" | "SB";
705
- units: "imperial" | "metric";
706
- timeStandard: "LST" | "UTC";
707
- latitude: number;
708
- longitude: number;
709
- selection: {
710
- mode: "preset";
711
- preset: "agroclimatology" | "building_hvac" | "solar_pv" | "water_balance" | "wind_turbine";
712
- } | {
713
- mode: "parameters";
714
- parameters: string[];
715
- };
716
- siteElevation?: number | undefined;
717
- windElevation?: number | undefined;
718
- windSurface?: "airport ice" | "airport_ice" | "airportice" | "grass" | undefined;
719
- temporalResolution: "monthly";
720
- startYear: number;
721
- endYear: number;
722
- } | {
723
- community: "AG" | "RE" | "SB";
724
- units: "imperial" | "metric";
725
- timeStandard: "LST" | "UTC";
726
- latitude: number;
727
- longitude: number;
728
- selection: {
729
- mode: "preset";
730
- preset: "agroclimatology" | "building_hvac" | "solar_pv" | "water_balance" | "wind_turbine";
731
- } | {
732
- mode: "parameters";
733
- parameters: string[];
734
- };
735
- siteElevation?: number | undefined;
736
- windElevation?: number | undefined;
737
- windSurface?: "airport ice" | "airport_ice" | "airportice" | "grass" | undefined;
738
- temporalResolution: "climatology";
488
+ windSurface?: "airport ice" | "airport_ice" | "airportgrass" | "airportice" | "openwater" | "seaice" | "vegtype_1" | "vegtype_10" | "vegtype_11" | "vegtype_12" | "vegtype_2" | "vegtype_20" | "vegtype_3" | "vegtype_4" | "vegtype_5" | "vegtype_6" | "vegtype_7" | "vegtype_8" | "vegtype_9" | undefined;
489
+ temporalResolution: "climatology" | "daily" | "hourly" | "monthly";
490
+ startDate?: string | undefined;
491
+ endDate?: string | undefined;
739
492
  startYear?: number | undefined;
740
493
  endYear?: number | undefined;
494
+ selection: {
495
+ mode: "parameters" | "preset";
496
+ preset?: "agroclimatology" | "building_hvac" | "solar_pv" | "water_balance" | "wind_turbine" | undefined;
497
+ parameters?: string[] | undefined;
498
+ };
741
499
  };
742
500
  metadata: {
743
501
  endpointUrl: string;
@@ -798,6 +556,7 @@ export declare function presentComparison(request: CompareRequest, canvasId: str
798
556
  label: string;
799
557
  latitude: number;
800
558
  longitude: number;
559
+ summaryCount?: number | undefined;
801
560
  sortMetric: number | null;
802
561
  }[];
803
562
  failed: {
@@ -1 +1 @@
1
- {"version":3,"file":"comparison-contracts.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/comparison-contracts.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAI3C,OAAO,EACL,KAAK,cAAc,EAcpB,MAAM,2BAA2B,CAAC;AAsCnC,4DAA4D;AAC5D,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAkDjC,CAAC;AAEH,uFAAuF;AACvF,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,GAAG,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAqLJ,SAAS;QACT,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAoBD,MAAM;cACP,aAAa;;;;;;;;;;;;;;;IAWhC"}
1
+ {"version":3,"file":"comparison-contracts.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/comparison-contracts.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAI3C,OAAO,EACL,KAAK,cAAc,EAcpB,MAAM,2BAA2B,CAAC;AA2CnC,4DAA4D;AAC5D,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAuDjC,CAAC;AAEH,uFAAuF;AACvF,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,GAAG,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAyLJ,SAAS;QACT,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAoBD,MAAM;cACP,aAAa;;;;;;;;;;;;;;;IAWhC"}
@@ -3,8 +3,8 @@ import { createHash } from 'node:crypto';
3
3
  import { z } from '@cyanheads/mcp-ts-core';
4
4
  import { JsonRpcErrorCode, McpError } from '@cyanheads/mcp-ts-core/errors';
5
5
  import { POWER_LIMITS } from '../../../config/server-config.js';
6
- import { getCanvasService } from '../../../services/canvas/index.js';
7
- import { CompareRequestSchema, DatasetHandleSchema, describePowerError, getPowerService, ObservationRowSchema, PowerDatasetSchema, powerError, requestedParameters, summarizeBuckets, } from '../../../services/power/index.js';
6
+ import { getCanvasService, SummaryDatasetsSchema } from '../../../services/canvas/index.js';
7
+ import { DatasetHandleSchema, describePowerError, getPowerService, NormalizedCompareRequestSchema, ObservationRowSchema, PowerDatasetSchema, powerError, requestedParameters, summarizeBuckets, } from '../../../services/power/index.js';
8
8
  const IdentitySchema = z.object({
9
9
  locationId: z.string().describe('Stable identity assigned by input position'),
10
10
  label: z.string().describe('Verbatim caller label, possibly duplicated'),
@@ -36,6 +36,11 @@ const BucketSchema = z.object({
36
36
  mean: z.number().nullable().describe('Valid-only arithmetic mean, null without valid values'),
37
37
  });
38
38
  const LocationSchema = IdentitySchema.extend(PowerDatasetSchema.omit({ rows: true }).shape).extend({
39
+ summaryCount: z
40
+ .number()
41
+ .int()
42
+ .optional()
43
+ .describe('Exact number of summaries for this location when summaries are previews'),
39
44
  sortMetric: z
40
45
  .number()
41
46
  .nullable()
@@ -43,7 +48,7 @@ const LocationSchema = IdentitySchema.extend(PowerDatasetSchema.omit({ rows: tru
43
48
  });
44
49
  /** Full per-site provenance survives analytical staging. */
45
50
  export const ComparisonOutputSchema = z.object({
46
- request: CompareRequestSchema.describe('Normalized shared request and original location order'),
51
+ request: NormalizedCompareRequestSchema.describe('Normalized shared request and original location order'),
47
52
  metadata: z
48
53
  .object({
49
54
  fetchedAt: z.string().describe('Comparison assembly access time'),
@@ -88,9 +93,14 @@ export const ComparisonOutputSchema = z.object({
88
93
  .describe('Complete observations or bounded preview when staged'),
89
94
  rowCount: z.number().int().describe('Exact full merged observation count'),
90
95
  dataset: DatasetHandleSchema.nullable().describe('Full-table handle on overflow, otherwise null'),
96
+ summaryDatasets: SummaryDatasetsSchema.optional().describe('Full summary handles when summary arrays are bounded previews; summaryIndex restores original order'),
91
97
  });
92
98
  /** Sequential sites share references, pacing, attempts, decoded bytes and deadline. */
93
99
  export function presentComparison(request, canvasId, ctx) {
100
+ if (request.selection.mode === 'parameters')
101
+ request.selection.parameters = [...new Set(request.selection.parameters)];
102
+ if (request.windSurface === 'airport_ice' || request.windSurface === 'airport ice')
103
+ request.windSurface = 'airportice';
94
104
  return getCanvasService().withProducer('comparison', ctx, async (producerCtx) => {
95
105
  const power = getPowerService();
96
106
  const budget = power.createCallBudget(producerCtx, true);
@@ -236,7 +246,7 @@ export function presentComparison(request, canvasId, ctx) {
236
246
  ? -1
237
247
  : (sort.direction === 'asc' ? 1 : -1) * (a.sortMetric - b.sortMetric));
238
248
  callCtx.signal.throwIfAborted();
239
- return getCanvasService().present({
249
+ return getCanvasService().presentComparison({
240
250
  request,
241
251
  metadata: {
242
252
  fetchedAt: new Date().toISOString(),