exascale.build — Agent API
The agent-facing surface: how an agent discovers, queries, and verifies exascale.build data. The shape is constant — it grows by capabilities, not by new verb-shapes. Each capability's full reference is generated and linked below.
The shape: four verbs
Two are shared across all data; two are per-capability. Every interaction is one of these:
| Verb | Tool (MCP) | REST | Purpose |
|---|---|---|---|
| Discover | list_capabilities_v1 (shared) |
GET /v1/capabilities |
what data is available |
| Describe | describe_<capability>_v1 |
GET /v1/<capability>/schema |
valid filters, groupings, metrics, codebooks |
| Query | query_<capability>_v1 |
POST /v1/<capability>/query |
cited numbers |
| Verify | get_source_evidence_v1 (shared) |
POST /v1/evidence/source-row |
the raw source row behind any citation |
The flow
discover -> describe -> query -> verify
(what's (how to (cited (prove a number
here?) ask?) numbers) from the raw cell)
Request / response anatomy
A query takes one params object — filters × group_by × measures × lifecycle facet — and returns:
as_of— the pinned snapshot date (same query, same result)summary.totals— the authoritative answer for the full matched queryrows[]— each withgroup,metrics, andlineage.citation_refcitations{}— the deduped evidence map; every number traces to exact source rows
verify re-opens the cited raw file, re-hashes it, and returns the literal source cells. Exact filters, metrics, and worked examples per capability live in the reference docs below and each capability-schema.json.
Invariants
- Versioned tool names (
_v1); a breaking change gets a new name, never a silent rename. - A citation on every value (
source,as_of,source_url, down to the source row). - Idempotent reads: every response pins
as_of. - JSON only out of the surface — no HTML, XLSX, or PDF.
- One contract, parity transports: REST and MCP return identical payloads.
- Errors tell the agent what to do next — structured
{code, message}with the right status.
Platform principles: README.md · the trust doctrine + pipeline behind these answers: how-it-works.md.
Capabilities
| Capability | Status | Query primitive | Reference |
|---|---|---|---|
power.capacity |
available | query_power_capacity_v1 |
power-capacity-v1.md |
power.generation |
available | query_power_generation_v1 |
power-generation-v1.md |
power.asset_ownership |
available | query_power_asset_ownership_v1 |
power-asset_ownership-v1.md |
power.fuel_cost |
available | query_power_fuel_cost_v1 |
power-fuel_cost-v1.md |
power.plant_costs |
available | query_power_plant_costs_v1 |
power-plant-costs-v1.md |
natural_gas.prices |
available | query_natural_gas_prices_v1 |
natural-gas-prices-v1.md |
power.demand |
available | query_power_demand_v1 |
power-demand-v1.md |
power.demand_rollup |
available | query_power_demand_rollup_v1 |
power-demand_rollup-v1.md |
power.retail_sales |
available | query_power_retail_sales_v1 |
power-retail_sales-v1.md |
power.interconnection_queue |
available | query_power_interconnection_queue_v1 |
power-interconnection_queue-v1.md |
power.interconnection_queue_pjm |
available | query_power_interconnection_queue_pjm_v1 |
power-interconnection_queue_pjm-v1.md |
power.interconnection_queue_pjm_cycle |
available | query_power_interconnection_queue_pjm_cycle_v1 |
power-interconnection_queue_pjm_cycle-v1.md |
power.interconnection_queue_caiso |
available | query_power_interconnection_queue_caiso_v1 |
power-interconnection_queue_caiso-v1.md |
power.interconnection_queue_nyiso |
available | query_power_interconnection_queue_nyiso_v1 |
power-interconnection_queue_nyiso-v1.md |
power.interconnection_queue_isone |
available | query_power_interconnection_queue_isone_v1 |
power-interconnection_queue_isone-v1.md |
power.interconnection_queue_ercot |
available | query_power_interconnection_queue_ercot_v1 |
power-interconnection_queue_ercot-v1.md |
power.interconnection_queue_spp |
available | query_power_interconnection_queue_spp_v1 |
power-interconnection_queue_spp-v1.md |
power.price_ercot |
available | query_power_price_ercot_v1 |
power-price_ercot-v1.md |
power.capacity_accreditation_pjm |
available | query_power_capacity_accreditation_pjm_v1 |
power-capacity-accreditation-pjm-v1.md |
power.capacity_market_pjm |
available | query_power_capacity_market_pjm_v1 |
power-capacity-market-pjm-v1.md |
ai_infrastructure.construction |
available | query_ai_infrastructure_construction_v1 |
ai_infrastructure-construction-v1.md |
ai_infrastructure.employment |
available | query_ai_infrastructure_employment_v1 |
ai_infrastructure-employment-v1.md |
ai_infrastructure.trade |
available | query_ai_infrastructure_trade_v1 |
ai_infrastructure-trade-v1.md |
ai_infrastructure.equipment_trade |
available | query_ai_infrastructure_equipment_trade_v1 |
ai_infrastructure-equipment_trade-v1.md |
ai_infrastructure.production |
available | query_ai_infrastructure_production_v1 |
ai_infrastructure-production-v1.md |
robotics.trade |
available | query_robotics_trade_v1 |
robotics-trade-v1.md |
robotics.adoption |
available | query_robotics_adoption_v1 |
robotics-adoption-v1.md |
space.satellite_filings |
available | query_space_satellite_filings_v1 |
space-satellite_filings-v1.md |
New capabilities appear here automatically — each block adds one row and one generated reference, reached through the same four verbs.
Wiring your agent
Connect the MCP endpoint: https://api.exascale.build/mcp. The server's own instructions cover discovery and verification, but the one decision your harness controls is whether the agent reaches for this data at all — model world knowledge is silent about its own staleness, and an agent that answers US power questions from memory looks identical to one that queried. Pinning that behavior takes one paragraph in your agent's system prompt:
For US power-sector questions (capacity, generation, demand, retail sales), always query the exascale.build tools rather than answering from memory — the served data is current and every value carries a source citation. Cite the returned
as_ofwith each number, and if you state anything the tools did not return, mark it as uncited context.
Copy it verbatim or adapt it; the load-bearing parts are always query, cite as_of, and mark uncited context.
Running the surface
uv run python -m core.mcp_server # MCP (stdio); per-capability setup in each reference
uv run python -m core.rest --port 8080 # REST
Shared REST routes: GET /v1/health, GET /v1/capabilities, POST /v1/evidence/source-row.