The AI trade is increasingly a power trade, and the evidence lives in unglamorous public records. Three of them, unified here:
/interconnection-queue/— every generation, storage, and large-load request waiting to connect across all 7 US ISOs (~23k+ requests). The future grid./permits/— data-center construction & air permits across 150+ US jurisdictions. Where hyperscalers are actually pouring concrete./operating-generators/— the as-built US fleet (EIA-860, every plant ≥1 MW, with coordinates). The grid as it exists today.
1 · What's waiting to plug in
Gas projects over 100 MW in PJM's queue flagged as data-center-related load:
import requests
BASE = "https://mlq.ai/api/v1"; H = {"Authorization": "Bearer YOUR_KEY"}
r = requests.get(f"{BASE}/interconnection-queue/", headers=H, params={
"iso": "PJM", "fuel": "gas", "data_center": "true", "min_mw": 100, "limit": 25})
j = r.json()
print(f"{j['count']} matching requests")
for q in j["results"][:10]:
print(f" {q['project_name'] or q['queue_number']:34.34} {q['state']:2} "
f"{q['capacity_mw']:>7,.0f} MW {q['status']:12} COD {q['projected_cod'] or '?'}")
Filters compose: iso, state, fuel, status,
load_type (generation/load/storage), operator, min_mw.
The companion feed /interconnection-queue/changes/ is the diff stream — status
jumps, capacity changes, timeline slips — ideal for a weekly "what moved in the queue" alert.
2 · Who's actually building
Queue requests are intentions; permits are commitments. Microsoft's data-center permits in Virginia:
r = requests.get(f"{BASE}/permits/", headers=H, params={
"state": "VA", "operator": "Microsoft", "limit": 50})
for p in r.json()["results"][:10]:
val = f"${p['construction_value']/1e6:,.0f}M" if p["construction_value"] else "—"
print(f" {p['opened_date']} {p['jurisdiction']:22.22} {p['status']:14.14} "
f"{val:>9} {(p['description_of_work'] or '')[:40]}")
Free-text q= searches descriptions (try q=substation or
q=bloom for on-site fuel cells). One honesty note: jurisdictions often issue several
permits per project carrying the same stated construction value — treat
construction_value as per-permit, not additive, unless you de-duplicate by project.
3 · The grid as built
Existing generation co-located with data centers — the "behind-the-meter" map:
r = requests.get(f"{BASE}/operating-generators/", headers=H, params={
"fuel": "gas", "near_dc": "true", "min_mw": 50, "limit": 25})
for g in r.json()["results"][:10]:
print(f" {g['plant_name']:32.32} {g['state']:2} {g['nameplate_capacity_mw']:>7,.0f} MW "
f"DC {g['nearest_dc_miles']:.1f} mi")
Every generator carries coordinates, balancing authority, status, and vintage — join it to the queue by state/county to see where new capacity lands relative to what exists.
4 · The operator pipeline view
The three datasets share operator/state keys, so one loop builds a
company's whole physical footprint — announced (queue), committed (permits), operating (fleet):
op = "Amazon"
queue = requests.get(f"{BASE}/interconnection-queue/", headers=H,
params={"operator": op, "limit": 500}).json()
permits = requests.get(f"{BASE}/permits/", headers=H,
params={"operator": op, "limit": 500}).json()
fleet = requests.get(f"{BASE}/operating-generators/", headers=H,
params={"operator": op, "limit": 500}).json()
print(f"{op}: {queue['count']} queue requests · {permits['count']} permits · "
f"{fleet['count']} operating units")
Pair this with the same company's financials and you're connecting capex lines to the physical assets they bought — the analysis our own research reports are built on.
Using an agent instead?
Over the MCP: "Using MLQ: total MW of data-center-flagged load in
each ISO's queue, then Virginia's five largest data-center permits this year with their stated
construction values." The interconnection_queue, permits, and
operating_generators tools handle it.