Skip to main content
Glama

BusCalc — Business & Trade Calculations

Weather operational impact calculations

buscalc_weather_operational_calculations
Read-onlyIdempotent

Opportunity probability windows with native-source-period precipitation bounds (no independence assumption), air/apparent-temperature screening and explicit official-alert context; supplied-data work-window and limiting-condition analysis, conditional disruption costs, forecast revision decision impact on common valid hours, heating/cooling degree-hours with explicit load assumptions, rain capture volume, approximate dew point, paired temperature bias/MAE/RMSE, and mobilization/revisit economics. Up to 48 hourly periods, 24 per revision snapshot or opportunity analysis, 48 native probability/thermal periods, 50 supplied alerts and 200 temperature pairs; 16 KB API body limit also applies. Missing weather stays null; no safety clearance, fabricated observation, expected loss or agency endorsement. Returns replayable receipt. Put tool fields inside inputs. Supply units or modelVersion only when listed in inputSchema. Follow its required fields and exact choices. Do not pass the REST calculator field inside MCP arguments.

Example tool call

This call uses example arguments supplied in the tool’s input schema.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "inputs": {
        "mode": "windows",
        "figures": {
          "crew": 2,
          "endHour": 18,
          "maxTempF": 90,
          "minTempF": 40,
          "fixedCost": 0,
          "maxPrecip": 30,
          "startHour": 8,
          "hourlyCost": 30,
          "maxWindMph": 15,
          "maxHumidity": 85,
          "requiredHours": 2
        },
        "periods": [
          {
            "endTime": "2026-11-05T09:00:00-06:00",
            "windMph": 5,
            "humidity": 60,
            "startTime": "2026-11-05T08:00:00-06:00",
            "temperatureF": 60,
            "precipProbability": 10
          },
          {
            "endTime": "2026-11-05T10:00:00-06:00",
            "windMph": 5,
            "humidity": 60,
            "startTime": "2026-11-05T09:00:00-06:00",
            "temperatureF": 61,
            "precipProbability": 10
          },
          {
            "endTime": "2026-11-05T11:00:00-06:00",
            "windMph": 5,
            "humidity": 60,
            "startTime": "2026-11-05T10:00:00-06:00",
            "temperatureF": 62,
            "precipProbability": 10
          },
          {
            "endTime": "2026-11-05T12:00:00-06:00",
            "windMph": 20,
            "humidity": 60,
            "startTime": "2026-11-05T11:00:00-06:00",
            "temperatureF": 63,
            "precipProbability": 10
          },
          {
            "endTime": "2026-11-05T13:00:00-06:00",
            "windMph": 5,
            "humidity": 60,
            "startTime": "2026-11-05T12:00:00-06:00",
            "temperatureF": 64,
            "precipProbability": 60
          },
          {
            "endTime": "2026-11-05T14:00:00-06:00",
            "windMph": 5,
            "humidity": 60,
            "startTime": "2026-11-05T13:00:00-06:00",
            "temperatureF": 65,
            "precipProbability": 10
          },
          {
            "endTime": "2026-11-05T15:00:00-06:00",
            "windMph": 5,
            "humidity": 60,
            "startTime": "2026-11-05T14:00:00-06:00",
            "temperatureF": 66,
            "precipProbability": 10
          },
          {
            "endTime": "2026-11-05T16:00:00-06:00",
            "windMph": 5,
            "humidity": 60,
            "startTime": "2026-11-05T15:00:00-06:00",
            "temperatureF": 67,
            "precipProbability": 10
          }
        ]
      }
    },
    "name": "buscalc_weather_operational_calculations"
  }
}

Input Schema

NameRequiredDescriptionDefault
unitsNo
inputsYes
modelVersionNo

Output Schema

NameRequiredDescriptionDefault
unitsNo
inputsYes
receiptYes
resultsYes
sourceURLYes
calculatorYes
modelVersionYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / inputs / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "figures": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "crew": {
      -            "description": "Crew members exposed to a nonmatching hour. ",
      -            "maximum": 10000,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "endHour": {
      -            "description": "Local working-day end hour (1–24). ",
      -            "maximum": 24,
      -            "minimum": 1,
      -            "type": "number"
      -          },
      -          "fixedCost": {
      -            "description": "Other fixed disruption scenario cost (USD). ",
      -            "maximum": 1000000000,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "hourlyCost": {
      -            "description": "Entered cost per crew member per nonmatching hour (USD). ",
      -            "maximum": 1000000000,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "maxHumidity": {
      -            "description": "Maximum entered relative humidity (%). ",
      -            "maximum": 100,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "maxPrecip": {
      -            "description": "Maximum entered precipitation probability (%). Probability is not rainfall amount or probability of a business loss.",
      -            "maximum": 100,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "maxTempF": {
      -            "description": "Maximum entered temperature (°F). ",
      -            "maximum": 150,
      -            "minimum": -150,
      -            "type": "number"
      -          },
      -          "maxWindMph": {
      -            "description": "Maximum entered sustained wind (mph). ",
      -            "maximum": 300,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "minTempF": {
      -            "description": "Minimum entered temperature (°F). ",
      -            "maximum": 150,
      -            "minimum": -150,
      -            "type": "number"
      -          },
      -          "requiredHours": {
      -            "description": "Required uninterrupted whole hours. ",
      -            "maximum": 24,
      -            "minimum": 1,
      -            "type": "number"
      -          },
      -          "startHour": {
      -            "description": "Local working-day start hour (0–23). ",
      -            "maximum": 23,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "minTempF",
      -          "maxTempF",
      -          "maxWindMph",
      -          "maxPrecip",
      -          "maxHumidity",
      -          "startHour",
      -          "endHour",
      -          "requiredHours",
      -          "crew",
      -          "hourlyCost",
      -          "fixedCost"
      -        ],
      -        "type": "object"
      -      },
      -      "mode": {
      -        "const": "windows",
      -        "type": "string"
      -      },
      -      "periods": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "endTime": {
      -              "format": "date-time",
      -              "type": "string"
      -            },
      -            "humidity": {
      -              "oneOf": [
      -                {
      -                  "maximum": 100,
      -                  "minimum": 0,
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "precipProbability": {
      -              "oneOf": [
      -                {
      -                  "maximum": 100,
      -                  "minimum": 0,
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "startTime": {
      -              "format": "date-time",
      -              "type": "string"
      -            },
      -            "temperatureF": {
      -              "oneOf": [
      -                {
      -                  "maximum": 150,
      -                  "minimum": -150,
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "windMph": {
      -              "oneOf": [
      -                {
      -                  "maximum": 400,
      -                  "minimum": 0,
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            }
      -          },
      -          "required": [
      -            "startTime",
      -            "endTime",
      -            "temperatureF",
      -            "windMph",
      -            "precipProbability",
      -            "humidity"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 48,
      -        "minItems": 1,
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "mode",
      -      "figures",
      -      "periods"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "figures": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "baseF": {
      -            "description": "Balance-point temperature (°F). ",
      -            "maximum": 150,
      -            "minimum": -100,
      -            "type": "number"
      -          },
      -          "cop": {
      -            "description": "Heating system COP or efficiency as a ratio. Electric resistance: 1; heat-pump COP must match conditions. Combustion efficiency is below 1; output is input-energy equivalent, not metered fuel.",
      -            "maximum": 20,
      -            "minimum": 0.01,
      -            "type": "number"
      -          },
      -          "heatLoss": {
      -            "description": "Entered building heat-loss coefficient (kW thermal per °F). An engineering/site-specific input. Degree-hours alone do not establish actual building energy use.",
      -            "maximum": 100000,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "price": {
      -            "description": "Entered input-energy price (USD/kWh). ",
      -            "maximum": 1000000000,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "baseF",
      -          "heatLoss",
      -          "cop",
      -          "price"
      -        ],
      -        "type": "object"
      -      },
      -      "mode": {
      -        "const": "degreehours",
      -        "type": "string"
      -      },
      -      "periods": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "endTime": {
      -              "format": "date-time",
      -              "type": "string"
      -            },
      -            "humidity": {
      -              "oneOf": [
      -                {
      -                  "maximum": 100,
      -                  "minimum": 0,
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "precipProbability": {
      -              "oneOf": [
      -                {
      -                  "maximum": 100,
      -                  "minimum": 0,
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "startTime": {
      -              "format": "date-time",
      -              "type": "string"
      -            },
      -            "temperatureF": {
      -              "oneOf": [
      -                {
      -                  "maximum": 150,
      -                  "minimum": -150,
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "windMph": {
      -              "oneOf": [
      -                {
      -                  "maximum": 400,
      -                  "minimum": 0,
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            }
      -          },
      -          "required": [
      -            "startTime",
      -            "endTime",
      -            "temperatureF",
      -            "windMph",
      -            "precipProbability",
      -            "humidity"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 48,
      -        "minItems": 1,
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "mode",
      -      "figures",
      -      "periods"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "figures": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "areaSqft": {
      -            "description": "Catchment area (square feet). ",
      -            "maximum": 1000000000,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "capacity": {
      -            "description": "Available storage capacity (US gallons). ",
      -            "maximum": 1000000000,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "capture": {
      -            "description": "Collectible fraction (%). ",
      -            "maximum": 100,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "rainInches": {
      -            "description": "Entered rain depth (inches). Enter a measured or explicitly chosen scenario depth. Never substitute precipitation probability.",
      -            "maximum": 100,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "rainInches",
      -          "areaSqft",
      -          "capture",
      -          "capacity"
      -        ],
      -        "type": "object"
      -      },
      -      "mode": {
      -        "const": "rainfall",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "mode",
      -      "figures"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "figures": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "humidity": {
      -            "description": "Relative humidity (%). ",
      -            "maximum": 100,
      -            "minimum": 0.1,
      -            "type": "number"
      -          },
      -          "surfaceF": {
      -            "description": "Measured surface temperature (°F). ",
      -            "maximum": 200,
      -            "minimum": -100,
      -            "type": "number"
      -          },
      -          "temperatureF": {
      -            "description": "Air temperature (°F). ",
      -            "maximum": 140,
      -            "minimum": -40,
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "temperatureF",
      -          "humidity",
      -          "surfaceF"
      -        ],
      -        "type": "object"
      -      },
      -      "mode": {
      -        "const": "drying",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "mode",
      -      "figures"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "earlierPeriods": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "endTime": {
      -              "format": "date-time",
      -              "type": "string"
      -            },
      -            "humidity": {
      -              "oneOf": [
      -                {
      -                  "maximum": 100,
      -                  "minimum": 0,
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "precipProbability": {
      -              "oneOf": [
      -                {
      -                  "maximum": 100,
      -                  "minimum": 0,
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "startTime": {
      -              "format": "date-time",
      -              "type": "string"
      -            },
      -            "temperatureF": {
      -              "oneOf": [
      -                {
      -                  "maximum": 150,
      -                  "minimum": -150,
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "windMph": {
      -              "oneOf": [
      -                {
      -                  "maximum": 400,
      -                  "minimum": 0,
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            }
      -          },
      -          "required": [
      -            "startTime",
      -            "endTime",
      -            "temperatureF",
      -            "windMph",
      -            "precipProbability",
      -            "humidity"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 24,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "figures": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "crew": {
      -            "description": "Crew members exposed to a nonmatching hour. ",
      -            "maximum": 10000,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "endHour": {
      -            "description": "Local working-day end hour (1–24). ",
      -            "maximum": 24,
      -            "minimum": 1,
      -            "type": "number"
      -          },
      -          "fixedCost": {
      -            "description": "Other fixed disruption scenario cost (USD). ",
      -            "maximum": 1000000000,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "hourlyCost": {
      -            "description": "Entered cost per crew member per nonmatching hour (USD). ",
      -            "maximum": 1000000000,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "maxHumidity": {
      -            "description": "Maximum entered relative humidity (%). ",
      -            "maximum": 100,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "maxPrecip": {
      -            "description": "Maximum entered precipitation probability (%). Probability is not rainfall amount or probability of a business loss.",
      -            "maximum": 100,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "maxTempF": {
      -            "description": "Maximum entered temperature (°F). ",
      -            "maximum": 150,
      -            "minimum": -150,
      -            "type": "number"
      -          },
      -          "maxWindMph": {
      -            "description": "Maximum entered sustained wind (mph). ",
      -            "maximum": 300,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "minTempF": {
      -            "description": "Minimum entered temperature (°F). ",
      -            "maximum": 150,
      -            "minimum": -150,
      -            "type": "number"
      -          },
      -          "requiredHours": {
      -            "description": "Required uninterrupted whole hours. ",
      -            "maximum": 24,
      -            "minimum": 1,
      -            "type": "number"
      -          },
      -          "startHour": {
      -            "description": "Local working-day start hour (0–23). ",
      -            "maximum": 23,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "minTempF",
      -          "maxTempF",
      -          "maxWindMph",
      -          "maxPrecip",
      -          "maxHumidity",
      -          "startHour",
      -          "endHour",
      -          "requiredHours",
      -          "crew",
      -          "hourlyCost",
      -          "fixedCost"
      -        ],
      -        "type": "object"
      -      },
      -      "mode": {
      -        "const": "revision",
      -        "type": "string"
      -      },
      -      "periods": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "endTime": {
      -              "format": "date-time",
      -              "type": "string"
      -            },
      -            "humidity": {
      -              "oneOf": [
      -                {
      -                  "maximum": 100,
      -                  "minimum": 0,
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "precipProbability": {
      -              "oneOf": [
      -                {
      -                  "maximum": 100,
      -                  "minimum": 0,
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "startTime": {
      -              "format": "date-time",
      -              "type": "string"
      -            },
      -            "temperatureF": {
      -              "oneOf": [
      -                {
      -                  "maximum": 150,
      -                  "minimum": -150,
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            },
      -            "windMph": {
      -              "oneOf": [
      -                {
      -                  "maximum": 400,
      -                  "minimum": 0,
      -                  "type": "number"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ]
      -            }
      -          },
      -          "required": [
      -            "startTime",
      -            "endTime",
      -            "temperatureF",
      -            "windMph",
      -            "precipProbability",
      -            "humidity"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 24,
      -        "minItems": 1,
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "mode",
      -      "figures",
      -      "periods",
      -      "earlierPeriods"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "figures": {
      -        "additionalProperties": false,
      -        "properties": {},
      -        "required": [],
      -        "type": "object"
      -      },
      -      "mode": {
      -        "const": "verification",
      -        "type": "string"
      -      },
      -      "pairs": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "forecastF": {
      -              "maximum": 150,
      -              "minimum": -150,
      -              "type": "number"
      -            },
      -            "issuedAt": {
      -              "format": "date-time",
      -              "type": "string"
      -            },
      -            "observedF": {
      -              "maximum": 150,
      -              "minimum": -150,
      -              "type": "number"
      -            },
      -            "validTime": {
      -              "format": "date-time",
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "issuedAt",
      -            "validTime",
      -            "forecastF",
      -            "observedF"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 200,
      -        "minItems": 1,
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "mode",
      -      "figures",
      -      "pairs"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "figures": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "cleanup": {
      -            "description": "Cleanup hours per visit. ",
      -            "maximum": 1000000000,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "contribution": {
      -            "description": "Contribution per PRODUCTIVE elapsed crew-hour (USD). Already net of productive labor, materials and other productive variable costs. Travel/setup/cleanup costs are deducted separately here.",
      -            "maximum": 1000000000,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "crew": {
      -            "description": "Crew members travelling, setting up and cleaning up. ",
      -            "maximum": 10000,
      -            "minimum": 1,
      -            "type": "number"
      -          },
      -          "jobHours": {
      -            "description": "Required PRODUCTIVE elapsed job hours with full crew. Elapsed hours with the stated full crew, not the sum of person-hours.",
      -            "maximum": 100000,
      -            "minimum": 0.01,
      -            "type": "number"
      -          },
      -          "miles": {
      -            "description": "Round-trip vehicle miles per visit. ",
      -            "maximum": 1000000000,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "otherVisit": {
      -            "description": "Other incremental cost per visit (USD). ",
      -            "maximum": 1000000000,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "setup": {
      -            "description": "Setup hours per visit. ",
      -            "maximum": 1000000000,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "travelHours": {
      -            "description": "Round-trip travel hours per visit. ",
      -            "maximum": 1000000000,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "vehicleRate": {
      -            "description": "Vehicle cost per mile (USD). ",
      -            "maximum": 1000000000,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "wage": {
      -            "description": "Loaded cost per crew member per hour (USD). ",
      -            "maximum": 1000000000,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "windowHours": {
      -            "description": "Usable consecutive on-site hours per visit. A supplied scenario, not a guaranteed forecast window. Every visit assumes this same window.",
      -            "maximum": 10000,
      -            "minimum": 0.01,
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "jobHours",
      -          "windowHours",
      -          "setup",
      -          "cleanup",
      -          "travelHours",
      -          "miles",
      -          "vehicleRate",
      -          "crew",
      -          "wage",
      -          "contribution",
      -          "otherVisit"
      -        ],
      -        "type": "object"
      -      },
      -      "mode": {
      -        "const": "visits",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "mode",
      -      "figures"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "figures": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "crew": {
      +            "description": "Crew members exposed to a nonmatching hour. ",
      +            "maximum": 10000,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "endHour": {
      +            "description": "Local working-day end hour (1–24). ",
      +            "maximum": 24,
      +            "minimum": 1,
      +            "type": "number"
      +          },
      +          "fixedCost": {
      +            "description": "Other fixed disruption scenario cost (USD). ",
      +            "maximum": 1000000000,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "hourlyCost": {
      +            "description": "Entered cost per crew member per nonmatching hour (USD). ",
      +            "maximum": 1000000000,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "maxHumidity": {
      +            "description": "Maximum entered relative humidity (%). ",
      +            "maximum": 100,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "maxPrecip": {
      +            "description": "Maximum entered precipitation probability (%). Probability is not rainfall amount or probability of a business loss.",
      +            "maximum": 100,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "maxTempF": {
      +            "description": "Maximum entered temperature (°F). ",
      +            "maximum": 150,
      +            "minimum": -150,
      +            "type": "number"
      +          },
      +          "maxWindMph": {
      +            "description": "Maximum entered sustained wind (mph). ",
      +            "maximum": 300,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "minTempF": {
      +            "description": "Minimum entered temperature (°F). ",
      +            "maximum": 150,
      +            "minimum": -150,
      +            "type": "number"
      +          },
      +          "requiredHours": {
      +            "description": "Required uninterrupted whole hours. ",
      +            "maximum": 24,
      +            "minimum": 1,
      +            "type": "number"
      +          },
      +          "startHour": {
      +            "description": "Local working-day start hour (0–23). ",
      +            "maximum": 23,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "minTempF",
      +          "maxTempF",
      +          "maxWindMph",
      +          "maxPrecip",
      +          "maxHumidity",
      +          "startHour",
      +          "endHour",
      +          "requiredHours",
      +          "crew",
      +          "hourlyCost",
      +          "fixedCost"
      +        ],
      +        "type": "object"
      +      },
      +      "mode": {
      +        "const": "windows",
      +        "type": "string"
      +      },
      +      "periods": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "endTime": {
      +              "format": "date-time",
      +              "type": "string"
      +            },
      +            "humidity": {
      +              "oneOf": [
      +                {
      +                  "maximum": 100,
      +                  "minimum": 0,
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "precipProbability": {
      +              "oneOf": [
      +                {
      +                  "maximum": 100,
      +                  "minimum": 0,
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "startTime": {
      +              "format": "date-time",
      +              "type": "string"
      +            },
      +            "temperatureF": {
      +              "oneOf": [
      +                {
      +                  "maximum": 150,
      +                  "minimum": -150,
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "windMph": {
      +              "oneOf": [
      +                {
      +                  "maximum": 400,
      +                  "minimum": 0,
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            }
      +          },
      +          "required": [
      +            "startTime",
      +            "endTime",
      +            "temperatureF",
      +            "windMph",
      +            "precipProbability",
      +            "humidity"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 48,
      +        "minItems": 1,
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "mode",
      +      "figures",
      +      "periods"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "figures": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "baseF": {
      +            "description": "Balance-point temperature (°F). ",
      +            "maximum": 150,
      +            "minimum": -100,
      +            "type": "number"
      +          },
      +          "cop": {
      +            "description": "Heating system COP or efficiency as a ratio. Electric resistance: 1; heat-pump COP must match conditions. Combustion efficiency is below 1; output is input-energy equivalent, not metered fuel.",
      +            "maximum": 20,
      +            "minimum": 0.01,
      +            "type": "number"
      +          },
      +          "heatLoss": {
      +            "description": "Entered building heat-loss coefficient (kW thermal per °F). An engineering/site-specific input. Degree-hours alone do not establish actual building energy use.",
      +            "maximum": 100000,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "price": {
      +            "description": "Entered input-energy price (USD/kWh). ",
      +            "maximum": 1000000000,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "baseF",
      +          "heatLoss",
      +          "cop",
      +          "price"
      +        ],
      +        "type": "object"
      +      },
      +      "mode": {
      +        "const": "degreehours",
      +        "type": "string"
      +      },
      +      "periods": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "endTime": {
      +              "format": "date-time",
      +              "type": "string"
      +            },
      +            "humidity": {
      +              "oneOf": [
      +                {
      +                  "maximum": 100,
      +                  "minimum": 0,
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "precipProbability": {
      +              "oneOf": [
      +                {
      +                  "maximum": 100,
      +                  "minimum": 0,
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "startTime": {
      +              "format": "date-time",
      +              "type": "string"
      +            },
      +            "temperatureF": {
      +              "oneOf": [
      +                {
      +                  "maximum": 150,
      +                  "minimum": -150,
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "windMph": {
      +              "oneOf": [
      +                {
      +                  "maximum": 400,
      +                  "minimum": 0,
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            }
      +          },
      +          "required": [
      +            "startTime",
      +            "endTime",
      +            "temperatureF",
      +            "windMph",
      +            "precipProbability",
      +            "humidity"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 48,
      +        "minItems": 1,
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "mode",
      +      "figures",
      +      "periods"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "figures": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "areaSqft": {
      +            "description": "Catchment area (square feet). ",
      +            "maximum": 1000000000,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "capacity": {
      +            "description": "Available storage capacity (US gallons). ",
      +            "maximum": 1000000000,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "capture": {
      +            "description": "Collectible fraction (%). ",
      +            "maximum": 100,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "rainInches": {
      +            "description": "Entered rain depth (inches). Enter a measured or explicitly chosen scenario depth. Never substitute precipitation probability.",
      +            "maximum": 100,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "rainInches",
      +          "areaSqft",
      +          "capture",
      +          "capacity"
      +        ],
      +        "type": "object"
      +      },
      +      "mode": {
      +        "const": "rainfall",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "mode",
      +      "figures"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "figures": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "humidity": {
      +            "description": "Relative humidity (%). ",
      +            "maximum": 100,
      +            "minimum": 0.1,
      +            "type": "number"
      +          },
      +          "surfaceF": {
      +            "description": "Measured surface temperature (°F). ",
      +            "maximum": 200,
      +            "minimum": -100,
      +            "type": "number"
      +          },
      +          "temperatureF": {
      +            "description": "Air temperature (°F). ",
      +            "maximum": 140,
      +            "minimum": -40,
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "temperatureF",
      +          "humidity",
      +          "surfaceF"
      +        ],
      +        "type": "object"
      +      },
      +      "mode": {
      +        "const": "drying",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "mode",
      +      "figures"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "earlierPeriods": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "endTime": {
      +              "format": "date-time",
      +              "type": "string"
      +            },
      +            "humidity": {
      +              "oneOf": [
      +                {
      +                  "maximum": 100,
      +                  "minimum": 0,
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "precipProbability": {
      +              "oneOf": [
      +                {
      +                  "maximum": 100,
      +                  "minimum": 0,
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "startTime": {
      +              "format": "date-time",
      +              "type": "string"
      +            },
      +            "temperatureF": {
      +              "oneOf": [
      +                {
      +                  "maximum": 150,
      +                  "minimum": -150,
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "windMph": {
      +              "oneOf": [
      +                {
      +                  "maximum": 400,
      +                  "minimum": 0,
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            }
      +          },
      +          "required": [
      +            "startTime",
      +            "endTime",
      +            "temperatureF",
      +            "windMph",
      +            "precipProbability",
      +            "humidity"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 24,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "figures": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "crew": {
      +            "description": "Crew members exposed to a nonmatching hour. ",
      +            "maximum": 10000,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "endHour": {
      +            "description": "Local working-day end hour (1–24). ",
      +            "maximum": 24,
      +            "minimum": 1,
      +            "type": "number"
      +          },
      +          "fixedCost": {
      +            "description": "Other fixed disruption scenario cost (USD). ",
      +            "maximum": 1000000000,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "hourlyCost": {
      +            "description": "Entered cost per crew member per nonmatching hour (USD). ",
      +            "maximum": 1000000000,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "maxHumidity": {
      +            "description": "Maximum entered relative humidity (%). ",
      +            "maximum": 100,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "maxPrecip": {
      +            "description": "Maximum entered precipitation probability (%). Probability is not rainfall amount or probability of a business loss.",
      +            "maximum": 100,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "maxTempF": {
      +            "description": "Maximum entered temperature (°F). ",
      +            "maximum": 150,
      +            "minimum": -150,
      +            "type": "number"
      +          },
      +          "maxWindMph": {
      +            "description": "Maximum entered sustained wind (mph). ",
      +            "maximum": 300,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "minTempF": {
      +            "description": "Minimum entered temperature (°F). ",
      +            "maximum": 150,
      +            "minimum": -150,
      +            "type": "number"
      +          },
      +          "requiredHours": {
      +            "description": "Required uninterrupted whole hours. ",
      +            "maximum": 24,
      +            "minimum": 1,
      +            "type": "number"
      +          },
      +          "startHour": {
      +            "description": "Local working-day start hour (0–23). ",
      +            "maximum": 23,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "minTempF",
      +          "maxTempF",
      +          "maxWindMph",
      +          "maxPrecip",
      +          "maxHumidity",
      +          "startHour",
      +          "endHour",
      +          "requiredHours",
      +          "crew",
      +          "hourlyCost",
      +          "fixedCost"
      +        ],
      +        "type": "object"
      +      },
      +      "mode": {
      +        "const": "revision",
      +        "type": "string"
      +      },
      +      "periods": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "endTime": {
      +              "format": "date-time",
      +              "type": "string"
      +            },
      +            "humidity": {
      +              "oneOf": [
      +                {
      +                  "maximum": 100,
      +                  "minimum": 0,
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "precipProbability": {
      +              "oneOf": [
      +                {
      +                  "maximum": 100,
      +                  "minimum": 0,
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "startTime": {
      +              "format": "date-time",
      +              "type": "string"
      +            },
      +            "temperatureF": {
      +              "oneOf": [
      +                {
      +                  "maximum": 150,
      +                  "minimum": -150,
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "windMph": {
      +              "oneOf": [
      +                {
      +                  "maximum": 400,
      +                  "minimum": 0,
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            }
      +          },
      +          "required": [
      +            "startTime",
      +            "endTime",
      +            "temperatureF",
      +            "windMph",
      +            "precipProbability",
      +            "humidity"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 24,
      +        "minItems": 1,
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "mode",
      +      "figures",
      +      "periods",
      +      "earlierPeriods"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "figures": {
      +        "additionalProperties": false,
      +        "properties": {},
      +        "required": [],
      +        "type": "object"
      +      },
      +      "mode": {
      +        "const": "verification",
      +        "type": "string"
      +      },
      +      "pairs": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "forecastF": {
      +              "maximum": 150,
      +              "minimum": -150,
      +              "type": "number"
      +            },
      +            "issuedAt": {
      +              "format": "date-time",
      +              "type": "string"
      +            },
      +            "observedF": {
      +              "maximum": 150,
      +              "minimum": -150,
      +              "type": "number"
      +            },
      +            "validTime": {
      +              "format": "date-time",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "issuedAt",
      +            "validTime",
      +            "forecastF",
      +            "observedF"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 200,
      +        "minItems": 1,
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "mode",
      +      "figures",
      +      "pairs"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "figures": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "cleanup": {
      +            "description": "Cleanup hours per visit. ",
      +            "maximum": 1000000000,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "contribution": {
      +            "description": "Contribution per PRODUCTIVE elapsed crew-hour (USD). Already net of productive labor, materials and other productive variable costs. Travel/setup/cleanup costs are deducted separately here.",
      +            "maximum": 1000000000,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "crew": {
      +            "description": "Crew members travelling, setting up and cleaning up. ",
      +            "maximum": 10000,
      +            "minimum": 1,
      +            "type": "number"
      +          },
      +          "jobHours": {
      +            "description": "Required PRODUCTIVE elapsed job hours with full crew. Elapsed hours with the stated full crew, not the sum of person-hours.",
      +            "maximum": 100000,
      +            "minimum": 0.01,
      +            "type": "number"
      +          },
      +          "miles": {
      +            "description": "Round-trip vehicle miles per visit. ",
      +            "maximum": 1000000000,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "otherVisit": {
      +            "description": "Other incremental cost per visit (USD). ",
      +            "maximum": 1000000000,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "setup": {
      +            "description": "Setup hours per visit. ",
      +            "maximum": 1000000000,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "travelHours": {
      +            "description": "Round-trip travel hours per visit. ",
      +            "maximum": 1000000000,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "vehicleRate": {
      +            "description": "Vehicle cost per mile (USD). ",
      +            "maximum": 1000000000,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "wage": {
      +            "description": "Loaded cost per crew member per hour (USD). ",
      +            "maximum": 1000000000,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "windowHours": {
      +            "description": "Usable consecutive on-site hours per visit. A supplied scenario, not a guaranteed forecast window. Every visit assumes this same window.",
      +            "maximum": 10000,
      +            "minimum": 0.01,
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "jobHours",
      +          "windowHours",
      +          "setup",
      +          "cleanup",
      +          "travelHours",
      +          "miles",
      +          "vehicleRate",
      +          "crew",
      +          "wage",
      +          "contribution",
      +          "otherVisit"
      +        ],
      +        "type": "object"
      +      },
      +      "mode": {
      +        "const": "visits",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "mode",
      +      "figures"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "figures": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "endHour": {
      +            "description": "Local working-day end hour (1–24). ",
      +            "maximum": 24,
      +            "minimum": 1,
      +            "type": "number"
      +          },
      +          "maxFeelsF": {
      +            "description": "Maximum entered apparent temperature (°F). Illustrative screening limit. On-site WBGT, workload, clothing, acclimatization and sun exposure also matter.",
      +            "maximum": 200,
      +            "minimum": -150,
      +            "type": "number"
      +          },
      +          "maxHumidity": {
      +            "description": "Maximum entered relative humidity (%). ",
      +            "maximum": 100,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "maxTempF": {
      +            "description": "Maximum entered temperature (°F). ",
      +            "maximum": 150,
      +            "minimum": -150,
      +            "type": "number"
      +          },
      +          "maxWindMph": {
      +            "description": "Maximum entered sustained wind (mph). ",
      +            "maximum": 300,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "minFeelsF": {
      +            "description": "Minimum entered apparent temperature (°F). Illustrative screening limit, not a universal cold-exposure or safe-work threshold.",
      +            "maximum": 200,
      +            "minimum": -150,
      +            "type": "number"
      +          },
      +          "minTempF": {
      +            "description": "Minimum entered temperature (°F). ",
      +            "maximum": 150,
      +            "minimum": -150,
      +            "type": "number"
      +          },
      +          "requiredHours": {
      +            "description": "Required uninterrupted whole hours. ",
      +            "maximum": 24,
      +            "minimum": 1,
      +            "type": "number"
      +          },
      +          "startHour": {
      +            "description": "Local working-day start hour (0–23). ",
      +            "maximum": 23,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "minTempF",
      +          "maxTempF",
      +          "maxWindMph",
      +          "maxHumidity",
      +          "startHour",
      +          "endHour",
      +          "requiredHours",
      +          "minFeelsF",
      +          "maxFeelsF"
      +        ],
      +        "type": "object"
      +      },
      +      "hazards": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "alerts": {
      +            "items": {
      +              "additionalProperties": false,
      +              "properties": {
      +                "effective": {
      +                  "format": "date-time",
      +                  "type": "string"
      +                },
      +                "event": {
      +                  "maxLength": 150,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "expires": {
      +                  "format": "date-time",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "event",
      +                "effective",
      +                "expires"
      +              ],
      +              "type": "object"
      +            },
      +            "maxItems": 50,
      +            "type": "array"
      +          },
      +          "checkedAt": {
      +            "format": "date-time",
      +            "type": "string"
      +          },
      +          "status": {
      +            "enum": [
      +              "available",
      +              "unavailable"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "status",
      +          "checkedAt",
      +          "alerts"
      +        ],
      +        "type": "object"
      +      },
      +      "mode": {
      +        "const": "opportunity",
      +        "type": "string"
      +      },
      +      "periods": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "endTime": {
      +              "format": "date-time",
      +              "type": "string"
      +            },
      +            "humidity": {
      +              "oneOf": [
      +                {
      +                  "maximum": 100,
      +                  "minimum": 0,
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "precipProbability": {
      +              "oneOf": [
      +                {
      +                  "maximum": 100,
      +                  "minimum": 0,
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "startTime": {
      +              "format": "date-time",
      +              "type": "string"
      +            },
      +            "temperatureF": {
      +              "oneOf": [
      +                {
      +                  "maximum": 150,
      +                  "minimum": -150,
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "windMph": {
      +              "oneOf": [
      +                {
      +                  "maximum": 400,
      +                  "minimum": 0,
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            }
      +          },
      +          "required": [
      +            "startTime",
      +            "endTime",
      +            "temperatureF",
      +            "windMph",
      +            "precipProbability",
      +            "humidity"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 24,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "probabilityPeriods": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "endTime": {
      +              "format": "date-time",
      +              "type": "string"
      +            },
      +            "precipProbability": {
      +              "oneOf": [
      +                {
      +                  "maximum": 100,
      +                  "minimum": 0,
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "startTime": {
      +              "format": "date-time",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "startTime",
      +            "endTime",
      +            "precipProbability"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 48,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "thermalPeriods": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "apparentTemperatureF": {
      +              "oneOf": [
      +                {
      +                  "maximum": 200,
      +                  "minimum": -150,
      +                  "type": "number"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            },
      +            "endTime": {
      +              "format": "date-time",
      +              "type": "string"
      +            },
      +            "startTime": {
      +              "format": "date-time",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "startTime",
      +            "endTime",
      +            "apparentTemperatureF"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 48,
      +        "minItems": 1,
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "mode",
      +      "figures",
      +      "periods",
      +      "probabilityPeriods",
      +      "thermalPeriods",
      +      "hazards"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Added

TDQS

C2.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive/closed-world, and the description adds real context on top: hard capacity ceilings (48 hourly periods, 24 per revision snapshot, 48 native probability/thermal periods, 50 alerts, 200 temperature pairs, 16 KB body limit), missing-weather null behavior, and a replayable receipt. That is exactly the kind of behavioral detail annotations cannot carry. It stops short of describing response structure or error behavior beyond limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core sentence is a single sprawling list of a dozen disparate calculations crammed together, with no grouping by mode and no front-loaded statement of what the tool is. The tail is boilerplate instruction text ('Follow its required fields and exact choices') that reads as prompt scaffolding rather than tool documentation. Every constraint earns its place; the feature marathon does not.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a seven-mode mega-calculator with zero top-level schema description coverage, the definition is missing the one thing an agent needs most: what each mode does and which fields it requires. Limits, null semantics and wrapper rules are covered, but mode selection is undocumented. An agent cannot confidently pick between 'windows', 'revision', 'opportunity' or 'degreehours' from this text.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The critical structural parameter is `mode`, a seven-value enum, and the description never mentions it or maps its feature list onto those modes. It does add wrapper guidance ('put tool fields inside inputs', don't pass the REST calculator field) which is genuinely useful beyond the schema, but coverage of the nested figures/periods requirements is left entirely to the schema. With reported schema description coverage at 0% at the top level, this is a substantial shortfall.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description enumerates specific computed quantities (precipitation bounds, degree-hours, rain capture, dew point, bias/MAE/RMSE, revisit economics), so the general purpose is inferable. But it never names the `mode` discriminator or the seven distinct calculation families as modes, and it does not distinguish the tool from siblings like buscalc_weather_data_lookup or buscalc_utility_energy_calculations. The purpose reads as a feature dump rather than a clear verb+resource with scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance: no statement of which mode fits which question, no prerequisites, and no routing to or away from sibling tools. The only conditional-sounding text ('Supply units or modelVersion only when listed in inputSchema') is packaging advice, not usage selection. Disclaimers about what the tool does not do ('no safety clearance... no agency endorsement') are the only boundary-setting.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources