{
  "tools": [
    {
      "name": "gridforge_qualify",
      "description": "Free. Seven numbers about an existing air-cooled hall in, one answer out: which physical constraint binds first when you try to deploy AI racks in it, how many racks fit as found, and which item sets the energisation date. Use this to triage a portfolio before paying for anything.",
      "endpoint": "/v1/qualify",
      "method": "POST",
      "tier": "public",
      "units": 0,
      "returns": "binding constraint, racks as found and after relief, the item that sets the date, and the inputs nobody has measured. No capital cost, no lead times: those are the paid engagement.",
      "inputSchema": {
        "type": "object",
        "required": [
          "contracted_MW",
          "current_site_peak_MW",
          "busway_ampacity_A",
          "tapoff_max_A"
        ],
        "properties": {
          "contracted_MW": {
            "type": "number",
            "description": "Contracted grid capacity, MW."
          },
          "current_site_peak_MW": {
            "type": "number",
            "description": "Current site peak demand, MW."
          },
          "current_it_load_MW": {
            "type": "number",
            "description": "Current IT load, MW."
          },
          "busway_ampacity_A": {
            "type": "number",
            "description": "Installed busway ampacity, A."
          },
          "tapoff_max_A": {
            "type": "number",
            "description": "Largest installed tap-off rating, A."
          },
          "plant_supply_C": {
            "type": "number",
            "description": "Chilled-water design supply temperature, \u00b0C."
          },
          "positions_available": {
            "type": "integer",
            "description": "Rack positions that can be released."
          },
          "objective": {
            "type": "string",
            "enum": [
              "max_compute",
              "min_cost",
              "fastest"
            ],
            "default": "max_compute",
            "description": "What the recommendation optimises for."
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "gridforge_screen",
      "description": "Density Screen. A full intake in, a screening read out: every constraint evaluated, the headroom ladder, and which relief unlocks the most racks per euro.",
      "endpoint": "/v1/screen",
      "method": "POST",
      "tier": "client",
      "units": 1,
      "returns": "screen payload, or the rendered screening document.",
      "inputSchema": {
        "type": "object",
        "required": [
          "intake"
        ],
        "properties": {
          "intake": {
            "type": "object",
            "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
            "additionalProperties": true
          },
          "objective": {
            "type": "string",
            "enum": [
              "max_compute",
              "min_cost",
              "fastest"
            ],
            "default": "max_compute",
            "description": "What the recommendation optimises for."
          },
          "format": {
            "type": "string",
            "enum": [
              "json",
              "md",
              "html"
            ],
            "default": "json"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "gridforge_compare",
      "description": "Time-to-Power scenario comparison. A full intake in; the scenarios it defines out, side by side: racks as found and after relief, the constraint that binds, the date to full capacity with its low/high band and evidence class, capital and what is unpriced, and how each differs from the baseline. A scenario with an unknown lead time gets no date and a reason, never a small number; nothing is ranked on a figure it does not have. Same solve as gridforge_screen, same inputs, same numbers.",
      "endpoint": "/v1/compare",
      "method": "POST",
      "tier": "client",
      "units": 1,
      "returns": "gridforge/ttp-compare/1: scenarios[], ranking, grade, caveats, request_digest, provenance.",
      "inputSchema": {
        "type": "object",
        "required": [
          "intake"
        ],
        "properties": {
          "intake": {
            "type": "object",
            "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
            "additionalProperties": true
          },
          "objective": {
            "type": "string",
            "enum": [
              "max_compute",
              "min_cost",
              "fastest"
            ],
            "default": "max_compute",
            "description": "What the recommendation optimises for."
          },
          "scenarios": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "minItems": 2,
            "description": "Scenario ids to compare, from the intake's own set (retained_air, rdhx, hybrid_dlc, full_dlc, full_dlc_btm). Default: all the intake defines."
          },
          "baseline": {
            "type": "string",
            "description": "Scenario id the others are compared with. Default: the first."
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "gridforge_study",
      "description": "Capacity & Density Envelope Study. Five architectures compared, the full headroom ladder with costs and lead times, time-to-power, sensitivity, economics, and the provenance of every number. format='csv' returns the working files a client's own engineer can rebuild the answer from.",
      "endpoint": "/v1/study",
      "method": "POST",
      "tier": "client",
      "units": 5,
      "returns": "the model pack, a rendered document, or the CSV working files.",
      "inputSchema": {
        "type": "object",
        "required": [
          "intake"
        ],
        "properties": {
          "intake": {
            "type": "object",
            "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
            "additionalProperties": true
          },
          "objective": {
            "type": "string",
            "enum": [
              "max_compute",
              "min_cost",
              "fastest"
            ],
            "default": "max_compute",
            "description": "What the recommendation optimises for."
          },
          "format": {
            "type": "string",
            "enum": [
              "json",
              "md",
              "html",
              "csv"
            ],
            "default": "json"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "gridforge_portfolio",
      "description": "Rank halls. Many intakes in, an ordered list out: racks, weeks to power, capex per rack and what binds first for each. Bills one unit per hall.",
      "endpoint": "/v1/portfolio",
      "method": "POST",
      "tier": "client",
      "units": 1,
      "returns": "halls ranked against the objective, with the total deployable rack count.",
      "inputSchema": {
        "type": "object",
        "required": [
          "intakes"
        ],
        "properties": {
          "intakes": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
              "additionalProperties": true
            },
            "minItems": 1
          },
          "objective": {
            "type": "string",
            "enum": [
              "max_compute",
              "min_cost",
              "fastest"
            ],
            "default": "max_compute",
            "description": "What the recommendation optimises for."
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "gridforge_diff",
      "description": "What moved, and which input moved it. Two intakes (or a recorded envelope state and a new intake) in, an attributed change note out, including the part the single-input probes do not explain, reported as a residual rather than distributed.",
      "endpoint": "/v1/diff",
      "method": "POST",
      "tier": "client",
      "units": 2,
      "returns": "headline, racks/weeks/capex deltas, ranked drivers, explained and residual.",
      "inputSchema": {
        "type": "object",
        "required": [
          "after"
        ],
        "properties": {
          "before": {
            "type": "object",
            "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
            "additionalProperties": true
          },
          "previous_state": {
            "type": "object",
            "additionalProperties": true,
            "description": "A recorded envelope state from an earlier run."
          },
          "after": {
            "type": "object",
            "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
            "additionalProperties": true
          },
          "objective": {
            "type": "string",
            "enum": [
              "max_compute",
              "min_cost",
              "fastest"
            ],
            "default": "max_compute",
            "description": "What the recommendation optimises for."
          },
          "attribute": {
            "type": "boolean",
            "default": true
          },
          "format": {
            "type": "string",
            "enum": [
              "json",
              "md",
              "html"
            ],
            "default": "json"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "gridforge_spec",
      "description": "Turn a binding constraint into a tender-ready technical specification: every numeric requirement derived from the capacity model and naming the constraint it came from, quoted at the site's own conditions rather than a manufacturer's reference condition, plus a machine-readable response schedule. Pass list=true to see which reliefs on the ladder can be tendered.",
      "endpoint": "/v1/spec",
      "method": "POST",
      "tier": "client",
      "units": 3,
      "returns": "the specification document, what it is sized for, and the response template a supplier fills in.",
      "inputSchema": {
        "type": "object",
        "required": [
          "intake"
        ],
        "properties": {
          "intake": {
            "type": "object",
            "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
            "additionalProperties": true
          },
          "constraint": {
            "type": "string",
            "description": "constraint id to tender for"
          },
          "scenario": {
            "type": "string"
          },
          "list": {
            "type": "boolean",
            "default": false
          },
          "reference": {
            "type": "string"
          },
          "objective": {
            "type": "string",
            "enum": [
              "max_compute",
              "min_cost",
              "fastest"
            ],
            "default": "max_compute",
            "description": "What the recommendation optimises for."
          },
          "format": {
            "type": "string",
            "enum": [
              "html",
              "md"
            ],
            "default": "html"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "gridforge_bids",
      "description": "Compare supplier responses against the capacity model: what each bid does to the energisation date and to deployable rack count, not only what it costs. A non-compliant bid is never ranked above a compliant one.",
      "endpoint": "/v1/bids",
      "method": "POST",
      "tier": "client",
      "units": 2,
      "returns": "ranked bids with scores, schedule impact, and optional cost-library lines.",
      "inputSchema": {
        "type": "object",
        "required": [
          "intake",
          "responses"
        ],
        "properties": {
          "intake": {
            "type": "object",
            "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
            "additionalProperties": true
          },
          "responses": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "constraint": {
            "type": "string"
          },
          "scenario": {
            "type": "string"
          },
          "ingest": {
            "type": "boolean",
            "default": false,
            "description": "also return the cost-library lines the winning response implies"
          },
          "evidence_only": {
            "type": "boolean",
            "default": false,
            "description": "return the validated or invalid quote lines instead of a ranking; nothing is accepted until a person reviews it"
          },
          "basis": {
            "type": "string",
            "enum": [
              "budgetary_quote",
              "firm_quote",
              "contracted"
            ],
            "default": "budgetary_quote"
          },
          "region": {
            "type": "string"
          },
          "objective": {
            "type": "string",
            "enum": [
              "max_compute",
              "min_cost",
              "fastest"
            ],
            "default": "max_compute",
            "description": "What the recommendation optimises for."
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "gridforge_power_assess",
      "description": "The Power Readiness Case: what is stopping this site reaching the target capacity, what fixes it, what that costs, what it does to the schedule, and what to do next. Composes the same solved scenario as gridforge_screen/gridforge_study into one decision object: current deployable racks vs. the target, the binding constraint, every priced and dated rung on the headroom ladder, the critical-path dependencies that set the earliest credible energisation date, the calibration state behind every number, and one deterministic next action. Never invents a price, a lead time or a date \u2014 every figure traces to the engine or an explicit input, with its evidence class attached.",
      "endpoint": "/v1/power/assess",
      "method": "POST",
      "tier": "client",
      "units": 5,
      "returns": "capacity (current/target/gap), binding_constraint, headroom_ladder (every relief priced and dated), time_to_power (critical item and dependencies), evidence (calibration state, evidence classes used), and next_action.",
      "inputSchema": {
        "type": "object",
        "required": [
          "intake"
        ],
        "properties": {
          "intake": {
            "type": "object",
            "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
            "additionalProperties": true
          },
          "target_racks": {
            "type": "integer",
            "description": "the rack count the customer actually needs; omit to size the gap against what the full headroom ladder itself can reach"
          },
          "objective": {
            "type": "string",
            "enum": [
              "max_compute",
              "min_cost",
              "fastest"
            ],
            "default": "max_compute",
            "description": "What the recommendation optimises for."
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "gridforge_power_deploy_assess",
      "description": "The BTM Power Deployment Assessment: given a real load profile and the generation/BESS units actually on the table, compares GRID ONLY, GRID + GENERATION, GRID + BESS and GRID + BESS + GENERATION under one deterministic N/N+1/N+2/2N contingency test each, with CAPEX and lead time read from whatever the request declared (never priced at zero when a unit is uncosted \u2014 that architecture is marked not-yet-comparable instead). Answers 'what combination of grid, generation and storage gets this load to firm power by this date, and what does each option cost.' Never invents a price, a lead time, or a PASS \u2014 a generator with no declared availability escalates a would-be PASS to REQUIRES_ENGINEERING_STUDY rather than assuming perfect reliability.",
      "endpoint": "/v1/power/deploy/assess",
      "method": "POST",
      "tier": "client",
      "units": 5,
      "returns": "load_profile summary (peak/mean/load-factor/ramp/step-events, with its own evidence class), capacity (grid-only vs. target, the gap), architectures (each with contingency status, CAPEX, lead time, whether fully costed, readiness_gates \u2014 interconnection/protection/fuel/permitting/electrical/reliability, each PASS/FAIL/MISSING_DATA/REQUIRES_ENGINEERING_STUDY/REQUIRES_LICENSED_REVIEW/NOT_APPLICABLE with its reason and what's missing \u2014 plus rfq_ready [enough data to prepare an RFQ], external_clearances_required [who still has to sign off \u2014 protection, utility, permitting], and execution_ready [cleared to build, which on-site generation/storage architectures will almost never show as true from screening alone]), and next_action, which names a missing readiness field before it ever says 'proceed to RFQ', always separates RFQ-readiness from build clearance, and states which objective was used, why, and the trade-off against the runner-up architecture \u2014 never a silent 'cheapest wins'.",
      "inputSchema": {
        "type": "object",
        "required": [
          "load_profile",
          "grid_firm_MW",
          "target_MW"
        ],
        "properties": {
          "load_profile": {
            "type": "object",
            "description": "either {csv: 'timestamp,kW\\n...'} from a real interval export, or {flat_kW: n} for a screening-level single-figure assumption (explicitly weaker evidence).",
            "properties": {
              "csv": {
                "type": "string"
              },
              "source": {
                "type": "string"
              },
              "flat_kW": {
                "type": "number"
              },
              "flat_hours": {
                "type": "number"
              }
            }
          },
          "grid_firm_MW": {
            "type": "number",
            "description": "firm import available from the grid connection today"
          },
          "target_MW": {
            "type": "number",
            "description": "the firm power required"
          },
          "ride_through_hours": {
            "type": "number",
            "description": "the outage duration a battery must be sized against; defaults to 2h if omitted"
          },
          "redundancy": {
            "type": "string",
            "enum": [
              "N",
              "N+1",
              "N+2",
              "2N"
            ],
            "default": "N"
          },
          "objective": {
            "type": "string",
            "enum": [
              "max_compute",
              "min_cost",
              "fastest"
            ],
            "default": "max_compute",
            "description": "What the architecture ranking optimises for: max_compute (most firm capacity), min_cost (lowest CAPEX among architectures that pass their own contingency test), or fastest (shortest critical-path lead time). The winner is never chosen by lowest cost silently \u2014 next_action always states which objective was used and the trade-off against the runner-up."
          },
          "generation": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "nameplate_MW"
              ],
              "properties": {
                "id": {
                  "type": "string"
                },
                "kind": {
                  "type": "string"
                },
                "nameplate_MW": {
                  "type": "number"
                },
                "capex_eur": {
                  "type": "number"
                },
                "lead_time_weeks": {
                  "type": "number"
                },
                "fuel_type": {
                  "type": "string",
                  "description": "e.g. 'natural gas' \u2014 feeds the fuel readiness gate; omitting it leaves that gate MISSING_DATA"
                }
              }
            }
          },
          "bess": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "power_MW",
                "energy_MWh"
              ],
              "properties": {
                "id": {
                  "type": "string"
                },
                "power_MW": {
                  "type": "number"
                },
                "energy_MWh": {
                  "type": "number"
                },
                "capex_eur": {
                  "type": "number"
                },
                "lead_time_weeks": {
                  "type": "number"
                },
                "grid_forming": {
                  "type": "boolean",
                  "description": "feeds the electrical readiness gate \u2014 more than one grid-forming source across the architecture requires a controls arbitration study"
                }
              }
            }
          },
          "interconnection": {
            "type": "object",
            "description": "utility, pcc_voltage_kV, import_capacity_MW \u2014 feeds the interconnection readiness gate. Omitting it leaves that gate MISSING_DATA, never a guessed PASS.",
            "properties": {
              "utility": {
                "type": "string"
              },
              "pcc_voltage_kV": {
                "type": "number"
              },
              "import_capacity_MW": {
                "type": "number"
              }
            }
          },
          "permitting": {
            "type": "object",
            "description": "e.g. {emissions_status, noise_status} \u2014 feeds the permitting readiness gate.",
            "additionalProperties": {
              "type": "string"
            }
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "gridforge_power_deploy_spec",
      "description": "A tender-ready technical specification for a BTM architecture's generation and storage units: every numeric requirement (nameplate rating, availability/forced-outage rate, start-up time, ramp rate, fuel, BESS power/energy/SOC window) derived from the declared unit and traceable to it, plus a weighted evaluation matrix and a machine-readable response schedule. Same request shape as gridforge_power_deploy_assess \u2014 this is what 'proceed to procurement' in that tool's next_action actually produces.",
      "endpoint": "/v1/power/deploy/spec",
      "method": "POST",
      "tier": "client",
      "units": 3,
      "returns": "the specification document, or its summary and response template as JSON.",
      "inputSchema": {
        "type": "object",
        "required": [
          "load_profile",
          "grid_firm_MW",
          "target_MW"
        ],
        "properties": {
          "architecture": {
            "type": "string",
            "description": "one of the compared architecture labels, e.g. 'GRID + BESS + GENERATION'; selects the units tendered"
          },
          "require_rfq_ready": {
            "type": "boolean",
            "description": "refuse unless the engine itself finds this architecture RFQ-ready"
          },
          "project": {
            "type": "string"
          },
          "load_profile": {
            "type": "object",
            "description": "unused by this tool but part of the shared request shape; pass {flat_kW: 0} if omitting a real profile"
          },
          "grid_firm_MW": {
            "type": "number"
          },
          "target_MW": {
            "type": "number"
          },
          "generation": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "bess": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "format": {
            "type": "string",
            "enum": [
              "json",
              "html",
              "md"
            ],
            "default": "html"
          },
          "reference": {
            "type": "string"
          },
          "return_by": {
            "type": "string"
          },
          "contact": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "gridforge_power_deploy_bids",
      "description": "Rank supplier responses to a BTM tender package (gridforge_power_deploy_spec) with the same comparison rules as gridforge_bids: mandatory non-compliance is never outranked by price, incomplete responses are disqualified not guessed at, and installation method and evidence quality are left to an engineer. Send the same deployment request and architecture the package was built from, plus the completed response schedules.",
      "endpoint": "/v1/power/deploy/bids",
      "method": "POST",
      "tier": "client",
      "units": 2,
      "returns": "the ranked comparison, the leading compliant supplier (or null) and the note.",
      "inputSchema": {
        "type": "object",
        "required": [
          "load_profile",
          "grid_firm_MW",
          "target_MW",
          "responses"
        ],
        "properties": {
          "architecture": {
            "type": "string"
          },
          "project": {
            "type": "string"
          },
          "load_profile": {
            "type": "object"
          },
          "grid_firm_MW": {
            "type": "number"
          },
          "target_MW": {
            "type": "number"
          },
          "generation": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "bess": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "responses": {
            "type": "array",
            "items": {
              "type": "object"
            }
          }
        },
        "additionalProperties": false
      }
    },
    {
      "name": "gridforge_proposal",
      "description": "A priced proposal for a named engagement, built from what the engine already found.",
      "endpoint": "/v1/proposal",
      "method": "POST",
      "tier": "client",
      "units": 2,
      "returns": "the proposal document and the engagement's catalogue price.",
      "inputSchema": {
        "type": "object",
        "required": [
          "intake"
        ],
        "properties": {
          "intake": {
            "type": "object",
            "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
            "additionalProperties": true
          },
          "engagement": {
            "type": "string",
            "default": "density_screen"
          },
          "objective": {
            "type": "string",
            "enum": [
              "max_compute",
              "min_cost",
              "fastest"
            ],
            "default": "max_compute",
            "description": "What the recommendation optimises for."
          },
          "valid_days": {
            "type": "integer",
            "default": 30
          },
          "format": {
            "type": "string",
            "enum": [
              "html",
              "md"
            ],
            "default": "html"
          }
        },
        "additionalProperties": false
      }
    }
  ],
  "openai": [
    {
      "type": "function",
      "function": {
        "name": "gridforge_qualify",
        "description": "Free. Seven numbers about an existing air-cooled hall in, one answer out: which physical constraint binds first when you try to deploy AI racks in it, how many racks fit as found, and which item sets the energisation date. Use this to triage a portfolio before paying for anything.",
        "parameters": {
          "type": "object",
          "required": [
            "contracted_MW",
            "current_site_peak_MW",
            "busway_ampacity_A",
            "tapoff_max_A"
          ],
          "properties": {
            "contracted_MW": {
              "type": "number",
              "description": "Contracted grid capacity, MW."
            },
            "current_site_peak_MW": {
              "type": "number",
              "description": "Current site peak demand, MW."
            },
            "current_it_load_MW": {
              "type": "number",
              "description": "Current IT load, MW."
            },
            "busway_ampacity_A": {
              "type": "number",
              "description": "Installed busway ampacity, A."
            },
            "tapoff_max_A": {
              "type": "number",
              "description": "Largest installed tap-off rating, A."
            },
            "plant_supply_C": {
              "type": "number",
              "description": "Chilled-water design supply temperature, \u00b0C."
            },
            "positions_available": {
              "type": "integer",
              "description": "Rack positions that can be released."
            },
            "objective": {
              "type": "string",
              "enum": [
                "max_compute",
                "min_cost",
                "fastest"
              ],
              "default": "max_compute",
              "description": "What the recommendation optimises for."
            }
          },
          "additionalProperties": false
        }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "gridforge_screen",
        "description": "Density Screen. A full intake in, a screening read out: every constraint evaluated, the headroom ladder, and which relief unlocks the most racks per euro.",
        "parameters": {
          "type": "object",
          "required": [
            "intake"
          ],
          "properties": {
            "intake": {
              "type": "object",
              "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
              "additionalProperties": true
            },
            "objective": {
              "type": "string",
              "enum": [
                "max_compute",
                "min_cost",
                "fastest"
              ],
              "default": "max_compute",
              "description": "What the recommendation optimises for."
            },
            "format": {
              "type": "string",
              "enum": [
                "json",
                "md",
                "html"
              ],
              "default": "json"
            }
          },
          "additionalProperties": false
        }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "gridforge_compare",
        "description": "Time-to-Power scenario comparison. A full intake in; the scenarios it defines out, side by side: racks as found and after relief, the constraint that binds, the date to full capacity with its low/high band and evidence class, capital and what is unpriced, and how each differs from the baseline. A scenario with an unknown lead time gets no date and a reason, never a small number; nothing is ranked on a figure it does not have. Same solve as gridforge_screen, same inputs, same numbers.",
        "parameters": {
          "type": "object",
          "required": [
            "intake"
          ],
          "properties": {
            "intake": {
              "type": "object",
              "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
              "additionalProperties": true
            },
            "objective": {
              "type": "string",
              "enum": [
                "max_compute",
                "min_cost",
                "fastest"
              ],
              "default": "max_compute",
              "description": "What the recommendation optimises for."
            },
            "scenarios": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "minItems": 2,
              "description": "Scenario ids to compare, from the intake's own set (retained_air, rdhx, hybrid_dlc, full_dlc, full_dlc_btm). Default: all the intake defines."
            },
            "baseline": {
              "type": "string",
              "description": "Scenario id the others are compared with. Default: the first."
            }
          },
          "additionalProperties": false
        }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "gridforge_study",
        "description": "Capacity & Density Envelope Study. Five architectures compared, the full headroom ladder with costs and lead times, time-to-power, sensitivity, economics, and the provenance of every number. format='csv' returns the working files a client's own engineer can rebuild the answer from.",
        "parameters": {
          "type": "object",
          "required": [
            "intake"
          ],
          "properties": {
            "intake": {
              "type": "object",
              "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
              "additionalProperties": true
            },
            "objective": {
              "type": "string",
              "enum": [
                "max_compute",
                "min_cost",
                "fastest"
              ],
              "default": "max_compute",
              "description": "What the recommendation optimises for."
            },
            "format": {
              "type": "string",
              "enum": [
                "json",
                "md",
                "html",
                "csv"
              ],
              "default": "json"
            }
          },
          "additionalProperties": false
        }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "gridforge_portfolio",
        "description": "Rank halls. Many intakes in, an ordered list out: racks, weeks to power, capex per rack and what binds first for each. Bills one unit per hall.",
        "parameters": {
          "type": "object",
          "required": [
            "intakes"
          ],
          "properties": {
            "intakes": {
              "type": "array",
              "items": {
                "type": "object",
                "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
                "additionalProperties": true
              },
              "minItems": 1
            },
            "objective": {
              "type": "string",
              "enum": [
                "max_compute",
                "min_cost",
                "fastest"
              ],
              "default": "max_compute",
              "description": "What the recommendation optimises for."
            }
          },
          "additionalProperties": false
        }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "gridforge_diff",
        "description": "What moved, and which input moved it. Two intakes (or a recorded envelope state and a new intake) in, an attributed change note out, including the part the single-input probes do not explain, reported as a residual rather than distributed.",
        "parameters": {
          "type": "object",
          "required": [
            "after"
          ],
          "properties": {
            "before": {
              "type": "object",
              "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
              "additionalProperties": true
            },
            "previous_state": {
              "type": "object",
              "additionalProperties": true,
              "description": "A recorded envelope state from an earlier run."
            },
            "after": {
              "type": "object",
              "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
              "additionalProperties": true
            },
            "objective": {
              "type": "string",
              "enum": [
                "max_compute",
                "min_cost",
                "fastest"
              ],
              "default": "max_compute",
              "description": "What the recommendation optimises for."
            },
            "attribute": {
              "type": "boolean",
              "default": true
            },
            "format": {
              "type": "string",
              "enum": [
                "json",
                "md",
                "html"
              ],
              "default": "json"
            }
          },
          "additionalProperties": false
        }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "gridforge_spec",
        "description": "Turn a binding constraint into a tender-ready technical specification: every numeric requirement derived from the capacity model and naming the constraint it came from, quoted at the site's own conditions rather than a manufacturer's reference condition, plus a machine-readable response schedule. Pass list=true to see which reliefs on the ladder can be tendered.",
        "parameters": {
          "type": "object",
          "required": [
            "intake"
          ],
          "properties": {
            "intake": {
              "type": "object",
              "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
              "additionalProperties": true
            },
            "constraint": {
              "type": "string",
              "description": "constraint id to tender for"
            },
            "scenario": {
              "type": "string"
            },
            "list": {
              "type": "boolean",
              "default": false
            },
            "reference": {
              "type": "string"
            },
            "objective": {
              "type": "string",
              "enum": [
                "max_compute",
                "min_cost",
                "fastest"
              ],
              "default": "max_compute",
              "description": "What the recommendation optimises for."
            },
            "format": {
              "type": "string",
              "enum": [
                "html",
                "md"
              ],
              "default": "html"
            }
          },
          "additionalProperties": false
        }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "gridforge_bids",
        "description": "Compare supplier responses against the capacity model: what each bid does to the energisation date and to deployable rack count, not only what it costs. A non-compliant bid is never ranked above a compliant one.",
        "parameters": {
          "type": "object",
          "required": [
            "intake",
            "responses"
          ],
          "properties": {
            "intake": {
              "type": "object",
              "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
              "additionalProperties": true
            },
            "responses": {
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "object",
                "additionalProperties": true
              }
            },
            "constraint": {
              "type": "string"
            },
            "scenario": {
              "type": "string"
            },
            "ingest": {
              "type": "boolean",
              "default": false,
              "description": "also return the cost-library lines the winning response implies"
            },
            "evidence_only": {
              "type": "boolean",
              "default": false,
              "description": "return the validated or invalid quote lines instead of a ranking; nothing is accepted until a person reviews it"
            },
            "basis": {
              "type": "string",
              "enum": [
                "budgetary_quote",
                "firm_quote",
                "contracted"
              ],
              "default": "budgetary_quote"
            },
            "region": {
              "type": "string"
            },
            "objective": {
              "type": "string",
              "enum": [
                "max_compute",
                "min_cost",
                "fastest"
              ],
              "default": "max_compute",
              "description": "What the recommendation optimises for."
            }
          },
          "additionalProperties": false
        }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "gridforge_power_assess",
        "description": "The Power Readiness Case: what is stopping this site reaching the target capacity, what fixes it, what that costs, what it does to the schedule, and what to do next. Composes the same solved scenario as gridforge_screen/gridforge_study into one decision object: current deployable racks vs. the target, the binding constraint, every priced and dated rung on the headroom ladder, the critical-path dependencies that set the earliest credible energisation date, the calibration state behind every number, and one deterministic next action. Never invents a price, a lead time or a date \u2014 every figure traces to the engine or an explicit input, with its evidence class attached.",
        "parameters": {
          "type": "object",
          "required": [
            "intake"
          ],
          "properties": {
            "intake": {
              "type": "object",
              "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
              "additionalProperties": true
            },
            "target_racks": {
              "type": "integer",
              "description": "the rack count the customer actually needs; omit to size the gap against what the full headroom ladder itself can reach"
            },
            "objective": {
              "type": "string",
              "enum": [
                "max_compute",
                "min_cost",
                "fastest"
              ],
              "default": "max_compute",
              "description": "What the recommendation optimises for."
            }
          },
          "additionalProperties": false
        }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "gridforge_power_deploy_assess",
        "description": "The BTM Power Deployment Assessment: given a real load profile and the generation/BESS units actually on the table, compares GRID ONLY, GRID + GENERATION, GRID + BESS and GRID + BESS + GENERATION under one deterministic N/N+1/N+2/2N contingency test each, with CAPEX and lead time read from whatever the request declared (never priced at zero when a unit is uncosted \u2014 that architecture is marked not-yet-comparable instead). Answers 'what combination of grid, generation and storage gets this load to firm power by this date, and what does each option cost.' Never invents a price, a lead time, or a PASS \u2014 a generator with no declared availability escalates a would-be PASS to REQUIRES_ENGINEERING_STUDY rather than assuming perfect reliability.",
        "parameters": {
          "type": "object",
          "required": [
            "load_profile",
            "grid_firm_MW",
            "target_MW"
          ],
          "properties": {
            "load_profile": {
              "type": "object",
              "description": "either {csv: 'timestamp,kW\\n...'} from a real interval export, or {flat_kW: n} for a screening-level single-figure assumption (explicitly weaker evidence).",
              "properties": {
                "csv": {
                  "type": "string"
                },
                "source": {
                  "type": "string"
                },
                "flat_kW": {
                  "type": "number"
                },
                "flat_hours": {
                  "type": "number"
                }
              }
            },
            "grid_firm_MW": {
              "type": "number",
              "description": "firm import available from the grid connection today"
            },
            "target_MW": {
              "type": "number",
              "description": "the firm power required"
            },
            "ride_through_hours": {
              "type": "number",
              "description": "the outage duration a battery must be sized against; defaults to 2h if omitted"
            },
            "redundancy": {
              "type": "string",
              "enum": [
                "N",
                "N+1",
                "N+2",
                "2N"
              ],
              "default": "N"
            },
            "objective": {
              "type": "string",
              "enum": [
                "max_compute",
                "min_cost",
                "fastest"
              ],
              "default": "max_compute",
              "description": "What the architecture ranking optimises for: max_compute (most firm capacity), min_cost (lowest CAPEX among architectures that pass their own contingency test), or fastest (shortest critical-path lead time). The winner is never chosen by lowest cost silently \u2014 next_action always states which objective was used and the trade-off against the runner-up."
            },
            "generation": {
              "type": "array",
              "items": {
                "type": "object",
                "required": [
                  "id",
                  "nameplate_MW"
                ],
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "kind": {
                    "type": "string"
                  },
                  "nameplate_MW": {
                    "type": "number"
                  },
                  "capex_eur": {
                    "type": "number"
                  },
                  "lead_time_weeks": {
                    "type": "number"
                  },
                  "fuel_type": {
                    "type": "string",
                    "description": "e.g. 'natural gas' \u2014 feeds the fuel readiness gate; omitting it leaves that gate MISSING_DATA"
                  }
                }
              }
            },
            "bess": {
              "type": "array",
              "items": {
                "type": "object",
                "required": [
                  "id",
                  "power_MW",
                  "energy_MWh"
                ],
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "power_MW": {
                    "type": "number"
                  },
                  "energy_MWh": {
                    "type": "number"
                  },
                  "capex_eur": {
                    "type": "number"
                  },
                  "lead_time_weeks": {
                    "type": "number"
                  },
                  "grid_forming": {
                    "type": "boolean",
                    "description": "feeds the electrical readiness gate \u2014 more than one grid-forming source across the architecture requires a controls arbitration study"
                  }
                }
              }
            },
            "interconnection": {
              "type": "object",
              "description": "utility, pcc_voltage_kV, import_capacity_MW \u2014 feeds the interconnection readiness gate. Omitting it leaves that gate MISSING_DATA, never a guessed PASS.",
              "properties": {
                "utility": {
                  "type": "string"
                },
                "pcc_voltage_kV": {
                  "type": "number"
                },
                "import_capacity_MW": {
                  "type": "number"
                }
              }
            },
            "permitting": {
              "type": "object",
              "description": "e.g. {emissions_status, noise_status} \u2014 feeds the permitting readiness gate.",
              "additionalProperties": {
                "type": "string"
              }
            }
          },
          "additionalProperties": false
        }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "gridforge_power_deploy_spec",
        "description": "A tender-ready technical specification for a BTM architecture's generation and storage units: every numeric requirement (nameplate rating, availability/forced-outage rate, start-up time, ramp rate, fuel, BESS power/energy/SOC window) derived from the declared unit and traceable to it, plus a weighted evaluation matrix and a machine-readable response schedule. Same request shape as gridforge_power_deploy_assess \u2014 this is what 'proceed to procurement' in that tool's next_action actually produces.",
        "parameters": {
          "type": "object",
          "required": [
            "load_profile",
            "grid_firm_MW",
            "target_MW"
          ],
          "properties": {
            "architecture": {
              "type": "string",
              "description": "one of the compared architecture labels, e.g. 'GRID + BESS + GENERATION'; selects the units tendered"
            },
            "require_rfq_ready": {
              "type": "boolean",
              "description": "refuse unless the engine itself finds this architecture RFQ-ready"
            },
            "project": {
              "type": "string"
            },
            "load_profile": {
              "type": "object",
              "description": "unused by this tool but part of the shared request shape; pass {flat_kW: 0} if omitting a real profile"
            },
            "grid_firm_MW": {
              "type": "number"
            },
            "target_MW": {
              "type": "number"
            },
            "generation": {
              "type": "array",
              "items": {
                "type": "object"
              }
            },
            "bess": {
              "type": "array",
              "items": {
                "type": "object"
              }
            },
            "format": {
              "type": "string",
              "enum": [
                "json",
                "html",
                "md"
              ],
              "default": "html"
            },
            "reference": {
              "type": "string"
            },
            "return_by": {
              "type": "string"
            },
            "contact": {
              "type": "string"
            }
          },
          "additionalProperties": false
        }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "gridforge_power_deploy_bids",
        "description": "Rank supplier responses to a BTM tender package (gridforge_power_deploy_spec) with the same comparison rules as gridforge_bids: mandatory non-compliance is never outranked by price, incomplete responses are disqualified not guessed at, and installation method and evidence quality are left to an engineer. Send the same deployment request and architecture the package was built from, plus the completed response schedules.",
        "parameters": {
          "type": "object",
          "required": [
            "load_profile",
            "grid_firm_MW",
            "target_MW",
            "responses"
          ],
          "properties": {
            "architecture": {
              "type": "string"
            },
            "project": {
              "type": "string"
            },
            "load_profile": {
              "type": "object"
            },
            "grid_firm_MW": {
              "type": "number"
            },
            "target_MW": {
              "type": "number"
            },
            "generation": {
              "type": "array",
              "items": {
                "type": "object"
              }
            },
            "bess": {
              "type": "array",
              "items": {
                "type": "object"
              }
            },
            "responses": {
              "type": "array",
              "items": {
                "type": "object"
              }
            }
          },
          "additionalProperties": false
        }
      }
    },
    {
      "type": "function",
      "function": {
        "name": "gridforge_proposal",
        "description": "A priced proposal for a named engagement, built from what the engine already found.",
        "parameters": {
          "type": "object",
          "required": [
            "intake"
          ],
          "properties": {
            "intake": {
              "type": "object",
              "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
              "additionalProperties": true
            },
            "engagement": {
              "type": "string",
              "default": "density_screen"
            },
            "objective": {
              "type": "string",
              "enum": [
                "max_compute",
                "min_cost",
                "fastest"
              ],
              "default": "max_compute",
              "description": "What the recommendation optimises for."
            },
            "valid_days": {
              "type": "integer",
              "default": 30
            },
            "format": {
              "type": "string",
              "enum": [
                "html",
                "md"
              ],
              "default": "html"
            }
          },
          "additionalProperties": false
        }
      }
    }
  ],
  "mcp": {
    "endpoint": "/mcp",
    "protocol": "jsonrpc-2.0",
    "protocolVersion": "2025-06-18",
    "tools": [
      {
        "name": "gridforge_qualify",
        "description": "Free. Seven numbers about an existing air-cooled hall in, one answer out: which physical constraint binds first when you try to deploy AI racks in it, how many racks fit as found, and which item sets the energisation date. Use this to triage a portfolio before paying for anything.",
        "inputSchema": {
          "type": "object",
          "required": [
            "contracted_MW",
            "current_site_peak_MW",
            "busway_ampacity_A",
            "tapoff_max_A"
          ],
          "properties": {
            "contracted_MW": {
              "type": "number",
              "description": "Contracted grid capacity, MW."
            },
            "current_site_peak_MW": {
              "type": "number",
              "description": "Current site peak demand, MW."
            },
            "current_it_load_MW": {
              "type": "number",
              "description": "Current IT load, MW."
            },
            "busway_ampacity_A": {
              "type": "number",
              "description": "Installed busway ampacity, A."
            },
            "tapoff_max_A": {
              "type": "number",
              "description": "Largest installed tap-off rating, A."
            },
            "plant_supply_C": {
              "type": "number",
              "description": "Chilled-water design supply temperature, \u00b0C."
            },
            "positions_available": {
              "type": "integer",
              "description": "Rack positions that can be released."
            },
            "objective": {
              "type": "string",
              "enum": [
                "max_compute",
                "min_cost",
                "fastest"
              ],
              "default": "max_compute",
              "description": "What the recommendation optimises for."
            }
          },
          "additionalProperties": false
        },
        "_meta": {
          "gridforge/units": 0,
          "gridforge/tier": "public",
          "gridforge/endpoint": "/v1/qualify"
        }
      },
      {
        "name": "gridforge_screen",
        "description": "Density Screen. A full intake in, a screening read out: every constraint evaluated, the headroom ladder, and which relief unlocks the most racks per euro.",
        "inputSchema": {
          "type": "object",
          "required": [
            "intake"
          ],
          "properties": {
            "intake": {
              "type": "object",
              "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
              "additionalProperties": true
            },
            "objective": {
              "type": "string",
              "enum": [
                "max_compute",
                "min_cost",
                "fastest"
              ],
              "default": "max_compute",
              "description": "What the recommendation optimises for."
            },
            "format": {
              "type": "string",
              "enum": [
                "json",
                "md",
                "html"
              ],
              "default": "json"
            }
          },
          "additionalProperties": false
        },
        "_meta": {
          "gridforge/units": 1,
          "gridforge/tier": "client",
          "gridforge/endpoint": "/v1/screen"
        }
      },
      {
        "name": "gridforge_compare",
        "description": "Time-to-Power scenario comparison. A full intake in; the scenarios it defines out, side by side: racks as found and after relief, the constraint that binds, the date to full capacity with its low/high band and evidence class, capital and what is unpriced, and how each differs from the baseline. A scenario with an unknown lead time gets no date and a reason, never a small number; nothing is ranked on a figure it does not have. Same solve as gridforge_screen, same inputs, same numbers.",
        "inputSchema": {
          "type": "object",
          "required": [
            "intake"
          ],
          "properties": {
            "intake": {
              "type": "object",
              "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
              "additionalProperties": true
            },
            "objective": {
              "type": "string",
              "enum": [
                "max_compute",
                "min_cost",
                "fastest"
              ],
              "default": "max_compute",
              "description": "What the recommendation optimises for."
            },
            "scenarios": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "minItems": 2,
              "description": "Scenario ids to compare, from the intake's own set (retained_air, rdhx, hybrid_dlc, full_dlc, full_dlc_btm). Default: all the intake defines."
            },
            "baseline": {
              "type": "string",
              "description": "Scenario id the others are compared with. Default: the first."
            }
          },
          "additionalProperties": false
        },
        "_meta": {
          "gridforge/units": 1,
          "gridforge/tier": "client",
          "gridforge/endpoint": "/v1/compare"
        }
      },
      {
        "name": "gridforge_study",
        "description": "Capacity & Density Envelope Study. Five architectures compared, the full headroom ladder with costs and lead times, time-to-power, sensitivity, economics, and the provenance of every number. format='csv' returns the working files a client's own engineer can rebuild the answer from.",
        "inputSchema": {
          "type": "object",
          "required": [
            "intake"
          ],
          "properties": {
            "intake": {
              "type": "object",
              "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
              "additionalProperties": true
            },
            "objective": {
              "type": "string",
              "enum": [
                "max_compute",
                "min_cost",
                "fastest"
              ],
              "default": "max_compute",
              "description": "What the recommendation optimises for."
            },
            "format": {
              "type": "string",
              "enum": [
                "json",
                "md",
                "html",
                "csv"
              ],
              "default": "json"
            }
          },
          "additionalProperties": false
        },
        "_meta": {
          "gridforge/units": 5,
          "gridforge/tier": "client",
          "gridforge/endpoint": "/v1/study"
        }
      },
      {
        "name": "gridforge_portfolio",
        "description": "Rank halls. Many intakes in, an ordered list out: racks, weeks to power, capex per rack and what binds first for each. Bills one unit per hall.",
        "inputSchema": {
          "type": "object",
          "required": [
            "intakes"
          ],
          "properties": {
            "intakes": {
              "type": "array",
              "items": {
                "type": "object",
                "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
                "additionalProperties": true
              },
              "minItems": 1
            },
            "objective": {
              "type": "string",
              "enum": [
                "max_compute",
                "min_cost",
                "fastest"
              ],
              "default": "max_compute",
              "description": "What the recommendation optimises for."
            }
          },
          "additionalProperties": false
        },
        "_meta": {
          "gridforge/units": 1,
          "gridforge/tier": "client",
          "gridforge/endpoint": "/v1/portfolio"
        }
      },
      {
        "name": "gridforge_diff",
        "description": "What moved, and which input moved it. Two intakes (or a recorded envelope state and a new intake) in, an attributed change note out, including the part the single-input probes do not explain, reported as a residual rather than distributed.",
        "inputSchema": {
          "type": "object",
          "required": [
            "after"
          ],
          "properties": {
            "before": {
              "type": "object",
              "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
              "additionalProperties": true
            },
            "previous_state": {
              "type": "object",
              "additionalProperties": true,
              "description": "A recorded envelope state from an earlier run."
            },
            "after": {
              "type": "object",
              "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
              "additionalProperties": true
            },
            "objective": {
              "type": "string",
              "enum": [
                "max_compute",
                "min_cost",
                "fastest"
              ],
              "default": "max_compute",
              "description": "What the recommendation optimises for."
            },
            "attribute": {
              "type": "boolean",
              "default": true
            },
            "format": {
              "type": "string",
              "enum": [
                "json",
                "md",
                "html"
              ],
              "default": "json"
            }
          },
          "additionalProperties": false
        },
        "_meta": {
          "gridforge/units": 2,
          "gridforge/tier": "client",
          "gridforge/endpoint": "/v1/diff"
        }
      },
      {
        "name": "gridforge_spec",
        "description": "Turn a binding constraint into a tender-ready technical specification: every numeric requirement derived from the capacity model and naming the constraint it came from, quoted at the site's own conditions rather than a manufacturer's reference condition, plus a machine-readable response schedule. Pass list=true to see which reliefs on the ladder can be tendered.",
        "inputSchema": {
          "type": "object",
          "required": [
            "intake"
          ],
          "properties": {
            "intake": {
              "type": "object",
              "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
              "additionalProperties": true
            },
            "constraint": {
              "type": "string",
              "description": "constraint id to tender for"
            },
            "scenario": {
              "type": "string"
            },
            "list": {
              "type": "boolean",
              "default": false
            },
            "reference": {
              "type": "string"
            },
            "objective": {
              "type": "string",
              "enum": [
                "max_compute",
                "min_cost",
                "fastest"
              ],
              "default": "max_compute",
              "description": "What the recommendation optimises for."
            },
            "format": {
              "type": "string",
              "enum": [
                "html",
                "md"
              ],
              "default": "html"
            }
          },
          "additionalProperties": false
        },
        "_meta": {
          "gridforge/units": 3,
          "gridforge/tier": "client",
          "gridforge/endpoint": "/v1/spec"
        }
      },
      {
        "name": "gridforge_bids",
        "description": "Compare supplier responses against the capacity model: what each bid does to the energisation date and to deployable rack count, not only what it costs. A non-compliant bid is never ranked above a compliant one.",
        "inputSchema": {
          "type": "object",
          "required": [
            "intake",
            "responses"
          ],
          "properties": {
            "intake": {
              "type": "object",
              "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
              "additionalProperties": true
            },
            "responses": {
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "object",
                "additionalProperties": true
              }
            },
            "constraint": {
              "type": "string"
            },
            "scenario": {
              "type": "string"
            },
            "ingest": {
              "type": "boolean",
              "default": false,
              "description": "also return the cost-library lines the winning response implies"
            },
            "evidence_only": {
              "type": "boolean",
              "default": false,
              "description": "return the validated or invalid quote lines instead of a ranking; nothing is accepted until a person reviews it"
            },
            "basis": {
              "type": "string",
              "enum": [
                "budgetary_quote",
                "firm_quote",
                "contracted"
              ],
              "default": "budgetary_quote"
            },
            "region": {
              "type": "string"
            },
            "objective": {
              "type": "string",
              "enum": [
                "max_compute",
                "min_cost",
                "fastest"
              ],
              "default": "max_compute",
              "description": "What the recommendation optimises for."
            }
          },
          "additionalProperties": false
        },
        "_meta": {
          "gridforge/units": 2,
          "gridforge/tier": "client",
          "gridforge/endpoint": "/v1/bids"
        }
      },
      {
        "name": "gridforge_power_assess",
        "description": "The Power Readiness Case: what is stopping this site reaching the target capacity, what fixes it, what that costs, what it does to the schedule, and what to do next. Composes the same solved scenario as gridforge_screen/gridforge_study into one decision object: current deployable racks vs. the target, the binding constraint, every priced and dated rung on the headroom ladder, the critical-path dependencies that set the earliest credible energisation date, the calibration state behind every number, and one deterministic next action. Never invents a price, a lead time or a date \u2014 every figure traces to the engine or an explicit input, with its evidence class attached.",
        "inputSchema": {
          "type": "object",
          "required": [
            "intake"
          ],
          "properties": {
            "intake": {
              "type": "object",
              "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
              "additionalProperties": true
            },
            "target_racks": {
              "type": "integer",
              "description": "the rack count the customer actually needs; omit to size the gap against what the full headroom ladder itself can reach"
            },
            "objective": {
              "type": "string",
              "enum": [
                "max_compute",
                "min_cost",
                "fastest"
              ],
              "default": "max_compute",
              "description": "What the recommendation optimises for."
            }
          },
          "additionalProperties": false
        },
        "_meta": {
          "gridforge/units": 5,
          "gridforge/tier": "client",
          "gridforge/endpoint": "/v1/power/assess"
        }
      },
      {
        "name": "gridforge_power_deploy_assess",
        "description": "The BTM Power Deployment Assessment: given a real load profile and the generation/BESS units actually on the table, compares GRID ONLY, GRID + GENERATION, GRID + BESS and GRID + BESS + GENERATION under one deterministic N/N+1/N+2/2N contingency test each, with CAPEX and lead time read from whatever the request declared (never priced at zero when a unit is uncosted \u2014 that architecture is marked not-yet-comparable instead). Answers 'what combination of grid, generation and storage gets this load to firm power by this date, and what does each option cost.' Never invents a price, a lead time, or a PASS \u2014 a generator with no declared availability escalates a would-be PASS to REQUIRES_ENGINEERING_STUDY rather than assuming perfect reliability.",
        "inputSchema": {
          "type": "object",
          "required": [
            "load_profile",
            "grid_firm_MW",
            "target_MW"
          ],
          "properties": {
            "load_profile": {
              "type": "object",
              "description": "either {csv: 'timestamp,kW\\n...'} from a real interval export, or {flat_kW: n} for a screening-level single-figure assumption (explicitly weaker evidence).",
              "properties": {
                "csv": {
                  "type": "string"
                },
                "source": {
                  "type": "string"
                },
                "flat_kW": {
                  "type": "number"
                },
                "flat_hours": {
                  "type": "number"
                }
              }
            },
            "grid_firm_MW": {
              "type": "number",
              "description": "firm import available from the grid connection today"
            },
            "target_MW": {
              "type": "number",
              "description": "the firm power required"
            },
            "ride_through_hours": {
              "type": "number",
              "description": "the outage duration a battery must be sized against; defaults to 2h if omitted"
            },
            "redundancy": {
              "type": "string",
              "enum": [
                "N",
                "N+1",
                "N+2",
                "2N"
              ],
              "default": "N"
            },
            "objective": {
              "type": "string",
              "enum": [
                "max_compute",
                "min_cost",
                "fastest"
              ],
              "default": "max_compute",
              "description": "What the architecture ranking optimises for: max_compute (most firm capacity), min_cost (lowest CAPEX among architectures that pass their own contingency test), or fastest (shortest critical-path lead time). The winner is never chosen by lowest cost silently \u2014 next_action always states which objective was used and the trade-off against the runner-up."
            },
            "generation": {
              "type": "array",
              "items": {
                "type": "object",
                "required": [
                  "id",
                  "nameplate_MW"
                ],
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "kind": {
                    "type": "string"
                  },
                  "nameplate_MW": {
                    "type": "number"
                  },
                  "capex_eur": {
                    "type": "number"
                  },
                  "lead_time_weeks": {
                    "type": "number"
                  },
                  "fuel_type": {
                    "type": "string",
                    "description": "e.g. 'natural gas' \u2014 feeds the fuel readiness gate; omitting it leaves that gate MISSING_DATA"
                  }
                }
              }
            },
            "bess": {
              "type": "array",
              "items": {
                "type": "object",
                "required": [
                  "id",
                  "power_MW",
                  "energy_MWh"
                ],
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "power_MW": {
                    "type": "number"
                  },
                  "energy_MWh": {
                    "type": "number"
                  },
                  "capex_eur": {
                    "type": "number"
                  },
                  "lead_time_weeks": {
                    "type": "number"
                  },
                  "grid_forming": {
                    "type": "boolean",
                    "description": "feeds the electrical readiness gate \u2014 more than one grid-forming source across the architecture requires a controls arbitration study"
                  }
                }
              }
            },
            "interconnection": {
              "type": "object",
              "description": "utility, pcc_voltage_kV, import_capacity_MW \u2014 feeds the interconnection readiness gate. Omitting it leaves that gate MISSING_DATA, never a guessed PASS.",
              "properties": {
                "utility": {
                  "type": "string"
                },
                "pcc_voltage_kV": {
                  "type": "number"
                },
                "import_capacity_MW": {
                  "type": "number"
                }
              }
            },
            "permitting": {
              "type": "object",
              "description": "e.g. {emissions_status, noise_status} \u2014 feeds the permitting readiness gate.",
              "additionalProperties": {
                "type": "string"
              }
            }
          },
          "additionalProperties": false
        },
        "_meta": {
          "gridforge/units": 5,
          "gridforge/tier": "client",
          "gridforge/endpoint": "/v1/power/deploy/assess"
        }
      },
      {
        "name": "gridforge_power_deploy_spec",
        "description": "A tender-ready technical specification for a BTM architecture's generation and storage units: every numeric requirement (nameplate rating, availability/forced-outage rate, start-up time, ramp rate, fuel, BESS power/energy/SOC window) derived from the declared unit and traceable to it, plus a weighted evaluation matrix and a machine-readable response schedule. Same request shape as gridforge_power_deploy_assess \u2014 this is what 'proceed to procurement' in that tool's next_action actually produces.",
        "inputSchema": {
          "type": "object",
          "required": [
            "load_profile",
            "grid_firm_MW",
            "target_MW"
          ],
          "properties": {
            "architecture": {
              "type": "string",
              "description": "one of the compared architecture labels, e.g. 'GRID + BESS + GENERATION'; selects the units tendered"
            },
            "require_rfq_ready": {
              "type": "boolean",
              "description": "refuse unless the engine itself finds this architecture RFQ-ready"
            },
            "project": {
              "type": "string"
            },
            "load_profile": {
              "type": "object",
              "description": "unused by this tool but part of the shared request shape; pass {flat_kW: 0} if omitting a real profile"
            },
            "grid_firm_MW": {
              "type": "number"
            },
            "target_MW": {
              "type": "number"
            },
            "generation": {
              "type": "array",
              "items": {
                "type": "object"
              }
            },
            "bess": {
              "type": "array",
              "items": {
                "type": "object"
              }
            },
            "format": {
              "type": "string",
              "enum": [
                "json",
                "html",
                "md"
              ],
              "default": "html"
            },
            "reference": {
              "type": "string"
            },
            "return_by": {
              "type": "string"
            },
            "contact": {
              "type": "string"
            }
          },
          "additionalProperties": false
        },
        "_meta": {
          "gridforge/units": 3,
          "gridforge/tier": "client",
          "gridforge/endpoint": "/v1/power/deploy/spec"
        }
      },
      {
        "name": "gridforge_power_deploy_bids",
        "description": "Rank supplier responses to a BTM tender package (gridforge_power_deploy_spec) with the same comparison rules as gridforge_bids: mandatory non-compliance is never outranked by price, incomplete responses are disqualified not guessed at, and installation method and evidence quality are left to an engineer. Send the same deployment request and architecture the package was built from, plus the completed response schedules.",
        "inputSchema": {
          "type": "object",
          "required": [
            "load_profile",
            "grid_firm_MW",
            "target_MW",
            "responses"
          ],
          "properties": {
            "architecture": {
              "type": "string"
            },
            "project": {
              "type": "string"
            },
            "load_profile": {
              "type": "object"
            },
            "grid_firm_MW": {
              "type": "number"
            },
            "target_MW": {
              "type": "number"
            },
            "generation": {
              "type": "array",
              "items": {
                "type": "object"
              }
            },
            "bess": {
              "type": "array",
              "items": {
                "type": "object"
              }
            },
            "responses": {
              "type": "array",
              "items": {
                "type": "object"
              }
            }
          },
          "additionalProperties": false
        },
        "_meta": {
          "gridforge/units": 2,
          "gridforge/tier": "client",
          "gridforge/endpoint": "/v1/power/deploy/bids"
        }
      },
      {
        "name": "gridforge_proposal",
        "description": "A priced proposal for a named engagement, built from what the engine already found.",
        "inputSchema": {
          "type": "object",
          "required": [
            "intake"
          ],
          "properties": {
            "intake": {
              "type": "object",
              "description": "A GridForge intake document. GET /v1/intake/template for the blank form with every field, or supply a sparse one \u2014 anything absent is filled from library defaults and reported as an assumption.",
              "additionalProperties": true
            },
            "engagement": {
              "type": "string",
              "default": "density_screen"
            },
            "objective": {
              "type": "string",
              "enum": [
                "max_compute",
                "min_cost",
                "fastest"
              ],
              "default": "max_compute",
              "description": "What the recommendation optimises for."
            },
            "valid_days": {
              "type": "integer",
              "default": 30
            },
            "format": {
              "type": "string",
              "enum": [
                "html",
                "md"
              ],
              "default": "html"
            }
          },
          "additionalProperties": false
        },
        "_meta": {
          "gridforge/units": 2,
          "gridforge/tier": "client",
          "gridforge/endpoint": "/v1/proposal"
        }
      }
    ]
  },
  "auth": {
    "header": "X-API-Key",
    "note": "gridforge_qualify is free and needs no key. Everything else meters."
  },
  "evidence_note": "Every numeric field in a response carries an evidence class (E0 assumed \u2026 E7 observed in operation) and a provenance digest. An agent consuming these must not present an E0 or E1 figure as a property of the physical asset. The calibration block states how far this engine has been reconciled against site data; where it says uncalibrated, it means uncalibrated."
}
