Server data from the Official MCP Registry
Tracks U.S. energy projects stuck in permitting: docket status, delay causes, hearing dates.
About
Tracks U.S. energy projects stuck in permitting: docket status, delay causes, hearing dates.
Remote endpoints: streamable-http: https://waitingforpower.com/mcp
Security Report
Valid MCP server (1 strong, 0 medium validity signals). No known CVEs in dependencies. Imported from the Official MCP Registry.
6 tools verified · Open access · No issues found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
Permissions Required
This plugin requests these system permissions. Most are normal for its category.
How to Connect
Remote Plugin
No local installation needed. Your AI client connects to the remote endpoint directly.
Add this to your MCP configuration to connect:
{
"mcpServers": {
"com-waitingforpower-energy-permitting-tracker": {
"url": "https://waitingforpower.com/mcp"
}
}
}Documentation
View on GitHubFrom the project's GitHub README.
WaitingForPower — an Energy Project Tracker
Open source, MIT licensed — see LICENSE. Contributions,
forks, and issues welcome.
Tracks proposed U.S. energy projects — generation, transmission, storage, LNG, and pipelines, every fuel type — and how long each has been waiting for approval, and why.
The argument is structural, not partisan: solar, wind, storage, gas,
nuclear, hydro, LNG, pipelines, and transmission all get stuck in the same
handful of bottlenecks. Every tracked delay is mapped to one of seven named
cause categories (src/lib/data/causeCategories.ts).
The site's policy argument — six specific, bipartisan reform proposals, one
per structural bottleneck, each with a stated problem, proposal, strengths,
weaknesses, and bill links — lives on a single page,
/policies
(src/lib/data/policies.ts), deliberately kept
separate from the neutral cause-category data so "why a project is stuck"
and "what we're arguing should change" aren't the same object.
Quick start
npm install
cp .env.example .env # set DATABASE_URL to your own Postgres instance
npx prisma migrate deploy # applies the committed migrations to your database
npm run ingest:permitting-dashboard # populate from a live, no-key-needed source
npm run dev
Needs a real Postgres connection string in DATABASE_URL — there's no
bundled local database file. The deployed app and local dev both point at
the same hosted Postgres instance for this project (see "Architecture"
below for why); for your own fork, any Postgres works (Neon, Supabase,
Vercel/Prisma Postgres, RDS, local postgres via Docker, etc.).
Data & sourcing
All project data comes from live, re-runnable sources — no hand-curated
one-off research. An earlier version of this project shipped a small
hand-researched seed set; it was removed deliberately in favor of sources
that stay current on their own, rather than a snapshot that goes stale.
See src/lib/ingest/README.md for the full
per-source table, open questions, and how each is scheduled:
| Source | Module | Checked | Source's own publish cadence |
|---|---|---|---|
| EIA-860M "Planned" generator inventory | src/lib/ingest/eia860mPlanned.ts | Cron weekly (13:00 UTC Sundays), /api/cron/ingest-eia | Monthly, ~2-month lag on EIA's end |
| Federal Permitting Dashboard (FAST-41) | src/lib/ingest/permittingDashboard.ts | Cron daily (14:00 UTC), /api/cron/ingest-permitting-dashboard | Live API — no periodic file, effectively real-time |
| LBNL Queued Up | src/lib/ingest/lbnlQueuedUp.ts | Cron weekly (15:00 UTC Sundays), /api/cron/ingest-lbnl | ~Annual |
| ORNL HydroSource hydropower relicensing | src/lib/ingest/ornlHydropowerRelicensing.ts | Cron weekly (16:00 UTC Sundays), /api/cron/ingest-ornl-hydro | ~Annual |
| EIA Natural Gas Pipeline Projects tracker | src/lib/ingest/eiaPipelineProjects.ts | Cron weekly (17:00 UTC Sundays), /api/cron/ingest-eia-pipelines | ~Quarterly |
| Virginia SCC CPCN dockets | src/lib/ingest/vaSccDockets.ts | Cron daily (18:00 UTC), /api/cron/ingest-va-scc. First of a planned per-state series covering state PUC/PSC dockets, the structural bottleneck this site's other sources can't see (see open question #10). | Live API, but only one state so far |
| Texas PUCT CCN dockets | src/lib/ingest/txPuctDockets.ts | Cron daily (18:30 UTC), /api/cron/ingest-tx-puct. Second state in the series — higher-volume than Virginia but with no structured status field, so "still waiting" is inferred from filing history (see file header for how that was calibrated). | Server-rendered HTML, no auth |
| Colorado PUC CPCN dockets | src/lib/ingest/coPucDockets.ts | Cron daily (19:00 UTC), /api/cron/ingest-co-puc. Third state — the cleanest yet: status is a real structured field already present in search results, no filing-history inference needed at all. | Server-rendered HTML, no auth |
| Ohio Power Siting Board cases | src/lib/ingest/ohOpsbCases.ts | Cron daily (19:30 UTC), /api/cron/ingest-oh-opsb. Fourth state — the simplest fetch yet (one unauthenticated JSON request returns the entire case history), and the first source in the series where both status and fuel/project type are real structured fields, not inferred. | Single JSON endpoint, no auth |
| South Carolina PSC siting-certificate dockets | src/lib/ingest/scPscDockets.ts | Cron daily (20:00 UTC), /api/cron/ingest-sc-psc. Fifth state — like Texas, has no reliable status field, but its captions are unusually descriptive (facility type, capacity, county spelled out in the text), and "still waiting" is inferred from an embedded Orders sub-table rather than a full filing-history scan. | Server-rendered HTML, no auth |
| Arizona ACC Line Siting Committee dockets | src/lib/ingest/azAccLineSiting.ts | Cron daily (20:30 UTC), /api/cron/ingest-az-acc. Sixth state — a real JSON API, but with the same "status field lies" problem as South Carolina, independently rediscovered: docketStatus can read "Open" on a docket that's actually been decided. The real signal is a separate decisions array. | Real JSON API, no auth |
| Washington EFSEC facility site-certifications | src/lib/ingest/waEfsecFacilities.ts | Cron daily (21:00 UTC), /api/cron/ingest-wa-efsec. Seventh state — Washington's own utility commission (WUTC) turned out to have no siting-certificate authority at all; the real authority is a separate body, EFSEC, whose small (19-facility) all-time list is ingested directly. The one state so far where the structured status field is the reliable one and a free-text description was the one caught lying. | Server-rendered HTML, no auth |
| New Mexico PRC CCN dockets | src/lib/ingest/nmPrcDockets.ts | Cron daily (21:30 UTC), /api/cron/ingest-nm-prc. Eighth state — a real JSON API behind an Angular SPA front-end, found by capturing the app's own network requests. Its CCN category also catches water-utility certificates and intake-rejected duplicate filings, both filtered out locally; its status field held up under testing, unlike several other states here. | Real JSON API, no auth |
| Illinois ICC CPCN dockets | src/lib/ingest/ilIccDockets.ts | Cron daily (22:00 UTC), /api/cron/ingest-il-icc. Ninth state — its CPCN case-type bucket also catches declaratory-ruling and eminent-domain petitions, filtered locally; capacity is published as voltage (kV), not MW, a first for this series. Its Grain Belt Express docket is the same physical line as an existing Permitting Dashboard entry — the case that surfaced and fixed a real cross-source merge bug, see open question #1. | Server-rendered HTML, no auth |
| Florida PSC + DEP siting certification | src/lib/ingest/flPscDockets.ts | Cron daily (22:30 UTC), /api/cron/ingest-fl-psc. Tenth state — Florida has no CPCN at the PSC at all; siting runs through a separate DEP process the PSC only opens with a small "determination of need" sub-docket. Two agencies' pages are cross-checked against each other, and — unusually for this series — it's the state-docket agency's own status field that lies, while a second agency's page is the reliable one. | Real JSON API (PSC) + server-rendered HTML (DEP), no auth |
| New York DPS Article VII/VIII dockets | src/lib/ingest/nyDpsDockets.ts | Cron daily (23:00 UTC), /api/cron/ingest-ny-dps. Eleventh state — two live siting-certificate tracks (transmission under Article VII, renewable generation under Article VIII/its predecessor § 94-c) in one system, covered by one module. Publishes no status field at all, and the renewable track's grant order isn't even filed as an Order/Decision — it's a plain correspondence filing, found only by scanning every document title regardless of type. | Real JSON API, no auth |
| Nevada PUCN UEPA permit dockets | src/lib/ingest/nvPucnDockets.ts | Cron daily (23:30 UTC), /api/cron/ingest-nv-pucn. Twelfth state — no CPCN; Nevada's equivalent is a Utility Environmental Protection Act permit spanning two separate PUCN systems (a legacy WebForms docket list plus a modern OnBase JSON API). Its multi-phase transmission reviews (an already-"GRANTED" phase followed by a new phase filing months later) required a real "no later substantive filing" check, not just "does any order say GRANTED." | Legacy ASP.NET WebForms + real JSON API (OnBase), no auth |
| Oregon EFSC facility site-certifications | src/lib/ingest/orEfscFacilities.ts | Cron daily (00:00 UTC), /api/cron/ingest-or-efsc. Thirteenth state — like Washington, Oregon's own utility commission has no siting authority; the real body is the Energy Facility Siting Council. Unusually, both of its structured status fields turned out unreliable (37 of 97 facilities disagreed between them) — the real signal is a free-text narrative field instead. One current candidate, Cascade Renewable Transmission, is the same physical HVDC line already tracked via Washington's EFSEC module — merged via manualOverrides.csv. | Real JSON API (SharePoint REST), no auth |
| Massachusetts EFSB dockets | src/lib/ingest/maEfsbDockets.ts | Cron daily (00:30 UTC), /api/cron/ingest-ma-efsb. Fourteenth state — like Washington/Oregon, the state's DPU itself isn't the real siting authority; a board (EFSB) that sits administratively inside DPU issues the actual certificate. Its own "Closed Date" field can stay null for years after a real grant, so resolution is instead inferred from scanning every filed document's own type for a "Final Decision." | Real JSON API, no auth |
| Oklahoma OCC High Voltage Transmission COA dockets | src/lib/ingest/okOccDockets.ts | Cron daily (01:00 UTC), /api/cron/ingest-ok-occ. Fifteenth state — no generic CPCN; Oklahoma's own "CCN" relief type is used almost exclusively by telecom carriers, and the real electric-siting equivalent is a narrower "High Voltage Transmission COA" certificate — only 4 cases have ever been filed under it since 2022, all already resolved as of shipping, a real (not buggy) zero-candidate result. | Real JSON API (Laserfiche WebLink), no auth |
| Utah PSC CPCN dockets | src/lib/ingest/utPscDockets.ts | Cron daily (01:30 UTC), /api/cron/ingest-ut-psc. Sixteenth state — across Utah's entire electric-docket history back to 1987, only 12 dockets are genuine new CPCN applications and all 12 are already granted, another real zero-candidate result (PacifiCorp/Rocky Mountain Power's resource decisions go through Integrated Resource Plan acknowledgment instead). No PDF-parsing dependency exists in this project, so final orders (unstructured PDFs) are read by decompressing their own FlateDecode streams directly with Node's built-in zlib. | Server-rendered HTML, no auth |
| Wisconsin PSC CPCN / Certificate of Authority dockets | src/lib/ingest/wiPscDockets.ts | Cron daily (02:00 UTC), /api/cron/ingest-wi-psc. Seventeenth state — both the large-facility CPCN and smaller-facility Certificate of Authority processes share one docket case-type code. PSC's own "Status" field is a records-retention lifecycle flag, not a case-decision flag — dockets decided 7+ years ago still show "Active" indefinitely; the real signal is a filed order titled "Final Decision." | Server-rendered HTML (ASP.NET WebForms), no auth |
| Kentucky PSC CPCN / Certificate of Construction dockets | src/lib/ingest/kyPscDockets.ts | Cron daily (02:30 UTC), /api/cron/ingest-ky-psc. Eighteenth state — unusually, its "Include Closed" search filter turned out to be reliable, verified both directions against real dockets; used as the primary status signal for the first time in this series, with a text-based grant/deny scan kept as a defensive secondary check anyway. | Server-rendered HTML (ASP.NET MVC), no auth |
| Missouri PSC Certificate of Convenience and Necessity dockets | src/lib/ingest/moPscDockets.ts | Cron daily (03:00 UTC), /api/cron/ingest-mo-psc. Nineteenth state — a real antiforgery-protected AJAX API. A post-run data-quality check against the live DB caught a real bug before shipping: an anchored regex missed real "Order Approving Third/Unanimous Stipulation and Agreement" titles, and an Order/Notice-type filter entirely missed real "Closing File" filings, together leaving several already-resolved 2018/2019 dockets wrongly shown as still waiting. | Real JSON API (ASP.NET Core MVC, antiforgery-protected), no auth |
| Indiana IURC CPCN dockets | src/lib/ingest/inIurcDockets.ts | Cron daily (03:30 UTC), /api/cron/ingest-in-iurc. Twentieth state — the public portal's visible reCAPTCHA is only checked in client-side JS; the real backing API (a separate companion Azure App Service) never receives or validates a token. An "Appealed" case status maps to this site's own "litigation" stage instead of being deleted, since the Commission's Final Order exists but isn't yet legally final. | Real JSON API (separate companion Azure App Service), no auth |
| New Jersey BPU 40:55D-19 determination / CSI siting-waiver dockets | src/lib/ingest/njBpuDockets.ts | Cron daily (04:00 UTC), /api/cron/ingest-nj-bpu. Twenty-first state — New Jersey has no CPCN at all; the closest equivalents are two distinct docket types covered by one module (a 40:55D-19 "reasonably necessary for the public" determination, and a Competitive Solar Incentive Program siting-prohibition waiver). BPU's own "Case Status" field was found stale by nine years on a real docket, so resolution is instead read from the most recent Board Order PDF's own text, decompressed with Node's built-in zlib (no PDF-parsing dependency exists in this project). | Server-rendered HTML (ASP.NET WebForms, Imperva-fronted), no auth |
| Maryland PSC CPCN dockets | src/lib/ingest/mdPscDockets.ts | Cron daily (04:30 UTC), /api/cron/ingest-md-psc. Twenty-second state — no "Status" field at all; "still waiting" is inferred from scanning every filed document for a dispositive Commission/Public Utility Law Judge order, an allow-vs-exclude-list approach needed because real dispositive orders use surprisingly varied phrasing (some with a blank subject beyond the order number itself). A post-run data-quality check caught a real county-extraction bug (a free-form regex swept in preceding caption text) and a genuine source typo ("DORCESTER" for "Dorchester" in one real caption), both fixed before shipping. | Server-rendered HTML (ASP.NET WebForms, cookie-less viewstate-only postback), no auth |
| Connecticut Siting Council (CSC) dockets/petitions | src/lib/ingest/ctCscDockets.ts | Cron daily (05:00 UTC), /api/cron/ingest-ct-csc. Twenty-third state — like Washington/Oregon/Massachusetts, the real siting authority isn't the obvious utility commission (PURA is only a commenter into CSC's own process). CSC has no queryable docket search at all, only hand-typed CMS pages; its own disclaimer that it "may not be able to keep the information ... up to date" was confirmed true by hand (a petition granted in 2013 still listed as open in 2026), so every candidate is cross-checked against CSC's own historical Decision and Order List before being treated as still pending. A structural bug found during this project's own verification step — resolved candidates were silently excluded from the ingestion run rather than passed through with a resolved stage, meaning a project that later resolved would never be deleted from the site — was fixed before shipping. | Server-rendered HTML (hand-authored CMS, no search/API), no auth |
| West Virginia PSC CPCN + Siting Certificate dockets | src/lib/ingest/wvPscDockets.ts | Cron daily (05:30 UTC), /api/cron/ingest-wv-psc. Twenty-fourth state — two docket types (a general CPCN and a separate Siting Certificate for merchant generators), and one of the richest real STATUS datasets in this series: a confirmed real denial, a case resolved via an ALJ Recommended Decision auto-finalizing with no separate Commission order, and a confirmed false-positive (an unrelated attorney-admission motion using the word "granted" in the same docket) that the resolution regex is written to avoid. Also caught a real fuel-classification bug (a hybrid gas+solar filing was tagged "solar" by a fixed keyword-priority order instead of whichever fuel is named first in the caption) and the same "vanished candidate" structural bug found in Connecticut — WV's own search is Active-only, so a case whose Active flag flips to Closed disappears from every future search rather than being caught by the module's own resolution check; fixed by diffing previously-tracked matchKeys against each run's active list. | Server-rendered HTML (decades-old ColdFusion, no auth) |
| Tennessee TPUC CCN dockets | src/lib/ingest/tnTpucDockets.ts | Cron daily (06:00 UTC), /api/cron/ingest-tn-tpuc. Twenty-fifth state — a genuine, confirmed zero-yield source: TVA (a federal instrumentality exempt from TPUC's certificate jurisdiction) supplies the overwhelming majority of Tennessee's generation, and its ~150 local power companies hold exclusive pre-assigned territories, so a new-entrant electric CCN essentially never triggers. Scanning the entire 160-docket active population by hand found zero currently-open electric candidates — every real CCN-type caption is a water utility or telecom filing. Kept live (not dropped) as a "standing watch for a rare event" source, the same convention as ORNL hydro's own thin population, with the same preventive "vanished candidate" fix applied as Connecticut/West Virginia even though nothing exists yet to have gone stale. | Server-rendered static HTML (S3/CloudFront), no auth |
| California Energy Commission (CEC) power plant siting dockets | src/lib/ingest/caCecDockets.ts | Cron daily (06:30 UTC), /api/cron/ingest-ca-cec. Twenty-sixth state — CPUC (the obvious candidate) was tried and correctly deferred: its search form's real submit path is client-side Dynamic Action logic invisible to a plain fetch(), confirmed both via a raw POST replay and a real-browser session where the click never reached the actual search endpoint at all. CEC turned out to be the real siting gate instead — it has exclusive jurisdiction over ≥50MW thermal/geothermal plants and, since AB 205, ≥50MW solar/wind and ≥200MWh storage, and nearly every large project files there rather than at CPUC. A false-positive resolution signal (a local air district's own "Notice of Decision," unrelated to CEC's siting decision) was caught and excluded before shipping, along with the same "vanished candidate" structural bug already found in Connecticut/West Virginia. | Server-rendered HTML (Drupal + ASP.NET WebForms), no auth |
| New Hampshire Site Evaluation Committee (SEC) dockets | src/lib/ingest/nhSecDockets.ts | Cron daily (07:00 UTC), /api/cron/ingest-nh-sec. Twenty-seventh state — the fourth real instance of "the real siting authority isn't the obvious utility commission" (after WA/OR/MA/CT): the PUC's 3 commissioners are only 3 of SEC's 5 statutory members and cannot alone constitute a quorum. A December 2025 restructuring moved SEC's docket records onto the PUC's own website under an "SEC" prefix, which is what makes it look like "the PUC does siting" at first glance. Caught a real false-positive resolution signal before shipping — a docket "rejected" as procedurally incomplete reads exactly like a final denial by keyword match but isn't one, confirmed against a real 190+-filing docket that continued on after its own "rejection." A curl-specific TLS-fingerprint bot block on every nh.gov subdomain (unrelated to Node's own fetch(), which this module actually uses) is documented so a future maintainer doesn't mistake it for a real blocker. | Server-rendered HTML (ASP.NET WebForms), no auth |
| Idaho PUC CPCN dockets | src/lib/ingest/idPucDockets.ts | Cron daily (07:30 UTC), /api/cron/ingest-id-puc. Twenty-eighth state — one of the first to publish a genuinely structured Status field, but since common.ts's RESOLVED_STAGES deletes a project identically whether it's "approved" or "cancelled," Idaho's own open/closed split alone is enough — no order-document text parsing needed here, unlike WV/MD/CT. A real singular/plural regex bug (\bcertificate\b's trailing word boundary silently excluded every "CERTIFICATES OF..." plural caption) undercounted 4 real candidates down to 1, caught by comparing the dry-run's output against a hand-verified count before shipping — the same gap confirmed live in IPUC's own search box. Also caught a real joint-owner duplicate (two utilities each filing their own CPCN for the same physical transmission line), kept as two rows per this project's non-dedup policy. | Server-rendered HTML (ASP.NET-ish CMS), no auth |
| Nebraska Power Review Board (PRB) applications | src/lib/ingest/nePrbDockets.ts | Cron daily (08:00 UTC), /api/cron/ingest-ne-prb. Twenty-ninth state — Nebraska has no investor-owned electric utilities and no PSC jurisdiction over electric certificates at all; the real authority is the Power Review Board, which publishes no case-search tool or docket database of any kind — "still waiting" is inferred entirely from the Board's own meeting minutes prose. Two real structural bugs were found and fixed via a live DB check before shipping: a contested case's facts and its resolution can each live in a different, non-adjacent paragraph than its first/last mention, which an initial "first mention = facts, last mention = status" design got wrong both ways — once garbling a real case's name/fields, once misclassifying a genuinely-granted case as still pending. All 13 real in-scope candidates as of shipping had already resolved (Nebraska's small, mostly-uncontested caseload usually clears within a single Board meeting), a real zero-currently-pending result confirmed by hand, not a scraping gap. | Server-rendered HTML (Drupal, prose-only minutes, no search tool), no auth |
| Louisiana PSC certification dockets | src/lib/ingest/laPscDockets.ts | Cron daily (08:30 UTC), /api/cron/ingest-la-psc. Thirtieth state — no single named CPCN statute (a promising-looking hit, La. R.S. 45:1503, turned out to be a 1968 telecom statute, a real wrong-guess trap caught by reading the actual text); the real gate is a consistent "certification"/"approval to construct" docket practice confirmed against a full, real 191-docket sample with zero false positives. Confirmed New Orleans's exclusion definitively (Entergy New Orleans never appears in LPSC's ~16,900-docket history at all — it's regulated solely by the City Council). LPSC's own Status field lies in an unusually sharp way — it stays "Open" for months or years after a real granting order, since LPSC keeps a docket open for post-approval compliance monitoring. This project's own live-DB verification step caught a real bug the module's original calibration missed: a confirmed-real grant order used a curly Unicode apostrophe ("Judge’s Recommendation") that a straight-ASCII-apostrophe regex silently failed to match, leaving a resolved docket wrongly shown as still pending. | Real JSON API (ASP.NET MVC + Kendo UI), no auth |
| Alabama PSC CPCN dockets | src/lib/ingest/alPscDockets.ts | Cron daily (09:00 UTC), /api/cron/ingest-al-psc. Thirty-first state — Alabama's CPCN statute isn't electric-specific and shares one flat docket-number sequence across every utility type, so scoping runs on client-side content filtering rather than a docket-code prefix. Found a real full-text search indexing gap that would have made the exact kind of very-recently-filed docket this site cares about most systematically invisible — Alabama Power's real, current "Lindsay Hill" CPCN (granted 2025) never appeared in the phrase search at all across a 26-year lookback; fixed with a second, structured-metadata discovery path scoped to Alabama Power's own filings. A real vanished-candidate bug was also found in a new shape: two false positives upserted before a content filter was tightened would have frozen in the DB forever, since content-based rejection (unlike every prior state's status-filter-based version of this bug) never naturally revisits an already-tracked row — fixed the same way, by diffing every matchKey this run reached a confident decision about against what actually got upserted. | Server-rendered HTML (stateful ASP.NET WebForms via session cookie, no ViewState), no auth |
| Arkansas PSC CECPN/CCN dockets | src/lib/ingest/arPscDockets.ts | Cron daily (09:30 UTC), /api/cron/ingest-ar-psc. Thirty-second state — Arkansas has no dedicated per-type case code; every matter (CECPN, CCN, rate cases, complaints, rulemakings, etc.) shares one flat docket-number sequence, with only the "-U" ("Utility") suffix ever carrying a real construction-certificate application, confirmed by sampling a live docket under every other real suffix in use. Also the first state in this series to be re-run live to verify the new Status-filter architecture (see the "Stop hiding resolved projects" commit): 17 real Arkansas dockets now persist at their true stage (11 granted, 1 denied, 5 pending) instead of resolved ones being deleted. | Server-rendered HTML, no auth |
| Delaware PSC Transmission CPCN + Community Energy Facility dockets | src/lib/ingest/dePscDockets.ts | Cron daily (10:00 UTC), /api/cron/ingest-de-psc. Thirty-third state — Delaware's CPCN authority is split across two different statutes; this module deliberately tracks the project-specific one (26 Del. C. §203F, for renewable-interconnection facilities ≥30 MW) plus the non-CPCN "Preliminary Certificate to Operate" gate for Community Solar facilities up to 4 MW, and excludes the entity-level electric-supplier CPCN the same way this series excludes every other state's utility-licensing docket. | Server-rendered HTML (ASP.NET WebForms, cookie-based), no auth |
| Maine DEP Site Law permits | src/lib/ingest/meDepSiteLawPermits.ts | Cron daily (10:30 UTC), /api/cron/ingest-me-dep. Thirty-fourth state — Maine's real construction gate for most large energy projects isn't the PUC's CPCN (35-A M.R.S. §3132, which only covers standalone transmission lines) but DEP's Site Location of Development Act permit, following the same PUC-vs-siting-agency split this series already found in WA/OR/MA/CT/NH. | Real ArcGIS REST endpoint, no auth |
| Rhode Island EFSB major-energy-facility dockets | src/lib/ingest/riEfsbDockets.ts | Cron daily (11:00 UTC), /api/cron/ingest-ri-efsb. Thirty-fifth state — a sixth confirmed instance of the "PUC isn't the real siting authority" pattern this series already found in WA/OR/MA/CT/NH: Rhode Island's license requirement (R.I. Gen. Laws §42-98-4) runs through the Energy Facility Siting Board, a separate three-member body, not the PUC that a first-pass search hints at. | Server-rendered HTML (Drupal/Acquia CMS), no auth |
| Vermont PUC Certificate of Public Good dockets | src/lib/ingest/vtPucDockets.ts | Cron daily (11:30 UTC), /api/cron/ingest-vt-puc. Thirty-sixth state — unlike the WA/OR/MA/CT/NH/RI split found elsewhere in this series, Vermont's PUC genuinely is the real siting authority: 30 V.S.A. §248's Certificate of Public Good is the construction gate for generation, transmission, and storage alike, confirmed directly against the statute text. | Server-rendered HTML (Drupal 7), no auth |
| South Dakota PUC Energy Conversion/Transmission Facility permit dockets | src/lib/ingest/sdPucDockets.ts | Cron daily (12:00 UTC), /api/cron/ingest-sd-puc. Thirty-seventh state — a real, confirmed bug in SD PUC's own site was found and routed around here: the per-docket status badge goes stale after a real grant (a 2021 wind-farm permit still showed "Pending" as of 2026-08-25 despite a 2023 grant order and ongoing construction reports), so this module scans each candidate's own "Orders:" list for real grant/deny/withdraw language instead of trusting that badge. | Server-rendered HTML, no auth |
| North Dakota PSC Energy Conversion/Transmission Facility siting applications | src/lib/ingest/ndPscDockets.ts | Cron daily (12:30 UTC), /api/cron/ingest-nd-psc. Thirty-eighth state — the same "Date Closed field lies" bug found in South Dakota and Louisiana was confirmed here too (a real 2024-granted certificate transfer still shows a blank Date Closed), but with no free-text order summary available anywhere in the HTML at all — resolving it required a first for this series: fetching each candidate's real Commission Order PDF and parsing its actual text (via the new pdf-parse dependency) for grant/deny/dismiss language, confirmed live against both a certificate-transfer grant and a fresh new-facility grant. | Server-rendered HTML + real order PDFs, no auth |
| North Carolina Utilities Commission (NCUC) Electric Generation/Transmission Line Certificate dockets | src/lib/ingest/ncNcucDockets.ts | Cron daily (13:30 UTC), /api/cron/ingest-nc-ncuc. Thirty-ninth state — the first in this series with a real, structured docket-type taxonomy: NCUC's own "EGC"/"ETL" filing-type codes are an exact server-side scope filter, so unlike SC/AZ/TX this module needs no keyword-search-then-locally-filter pass. Cloudflare-fronted and a genuinely non-standard ASP.NET postback engine (a custom __VIEWSTATE1 counter, tracked per page URL, not just per session — confirmed by A/B test that switching search screens without a fresh GET silently serves the previous screen's stale results). The docket's own Status field was confirmed unreliable the same way SC/AZ's are (stays "Open" for years after a real grant), so resolution is instead read from a separate Orders-portal search scoped to each docket number, scanning order titles for a granting/denying signal — calibrated against real grant and denial orders, including a real "denied at this time but docket held open" trap that isn't a final resolution. | Server-rendered HTML (ASP.NET WebForms behind Cloudflare), no auth |
| Wyoming DEQ Industrial Siting Council (ISC) permit dockets | src/lib/ingest/wyIscDockets.ts | Cron daily (14:30 UTC), /api/cron/ingest-wy-isc. Fortieth state — a first for this series: the real docket archive lives in a public Google Drive folder, not on the agency's own site at all (its embedded file-browser widget is confirmed broken site-wide, stuck on "Loading..." forever; the page's own "if this isn't working, click here" fallback link is the real path in). Drive's modern web UI has no stable public JSON listing without an OAuth token or a Cloud API key, but its legacy, unauthenticated embeddedfolderview HTML endpoint (used by many "embed a Drive folder" website plugins) still works. No structured status field exists anywhere in this source; resolution is read from each docket's own filenames, which turned out to use two real, different eras of grant-document naming ("Order" for 2020s dockets, "Permit" — including the source's own real "Pemit" typo — for older ones) plus a third confirmed signal ("Amendment Approval" implies an underlying grant already exists) — an initial version matching only "Order" wrongly showed every older grant, including decades-old already-built plants, as still pending; caught via a live-DB sanity check against real known-operating projects before shipping. Also excludes the many non-energy industrial dockets (soda ash/trona mining, cement, gold mining) this same siting authority also permits, via a keyword allowlist — a real, documented gap. | Google Drive folder (legacy unauthenticated HTML listing endpoint), no auth |
| Georgia PSC electric dockets | src/lib/ingest/gaPscDockets.ts | Cron daily (15:00 UTC), /api/cron/ingest-ga-psc. Forty-first state — Georgia's structure is unlike every other state in this series: individual generation/storage projects don't each file their own siting application; Georgia Power's new resource additions are approved in bulk through periodic RFP/Integrated Resource Plan proceedings, then certified through a single docket per RFP round covering many underlying projects at once. Those certification dockets are tracked as aggregate entries (isAggregateExample: true) rather than invented as fake individual projects. A second real docket category, "Construction Monitoring" (named, already-approved plants like McIntosh and Bowen under active PSC oversight), was deliberately left untracked after confirming live that every such docket arrives already at under_construction — a resolved stage — on first sighting, which this project's existing new-row safeguard in common.ts correctly refuses to seed. Also confirmed live: the search API's own title query parameter is silently ignored server-side, so scoping is done client-side against the full result set, matching the Alabama module's precedent. | Real JSON XHR endpoint (docket-filter-service), no auth |
Every source above — 4 federal/national workbook sources plus the Permitting Dashboard's live API
plus all forty-one state docket modules — runs on Vercel Cron (vercel.json) with no manual
step, staggered by 30 minutes so no two sources' runs overlap. Cadence is matched to how often
each source actually publishes, not one uniform schedule: the 41 state modules and the Permitting
Dashboard run daily, since same-day filings are exactly what the homepage changes feed is
built to surface; the 4 sources whose underlying data only republishes monthly, quarterly, or
annually (EIA-860M, LBNL Queued Up, ORNL HydroSource, EIA's pipeline tracker) stay weekly,
since checking them daily wouldn't catch anything new. This moved off Hobby-plan-driven weekly
checks (see src/lib/ingest/README.md for the full cadence history)
once the site upgraded to Vercel Pro. Every ingestion run upserts by a stable per-source ID (see
the matchKey/manualOverrides.csv identity mechanism in open question #1), so a re-run updates
existing projects in place instead of duplicating them.
Every ingested project links back to its public source (see each project's
detail page). Where a date or figure wasn't confidently available, the
project is marked dateConfidence: "approximate" or carries a
dataQualityNote saying so, rather than presenting invented precision as
fact. Notably absent so far: sub-250MW generation/storage projects (see
each source's capacity floor / scope above — this includes the large
majority of hydropower relicensing dockets, which skew small), and any
cause-category assignment for automatically-ingested projects (none of the
five sources publishes why a project is delayed — see open question #4).
This site only tracks projects still waiting on approval — see
"RESOLVED_STAGES" in src/lib/ingest/README.md for what's deliberately
excluded and why.
Interconnection queue detail. lbnlQueuedUp.ts carries two extra fields
for LBNL-sourced projects, added 2026-08-21: interconnectionQueueStage
(the workbook's own study-phase label, e.g. "Feasibility Study") and
networkUpgradeCostUsd (reserved for a join against LBNL's separate,
irregularly-updated interconnection cost-analysis datasets — not yet
populated by any module). Per explicit product decision, a suspended
interconnection request is treated the same as withdrawn: not shown as
"waiting." Every ingestion run now also actively removes a previously-shown
project the moment a later edition reports it withdrawn, suspended, or
operational, rather than leaving it frozen in its last-known state — see
src/lib/ingest/README.md for the full detail and open question #9.
Open questions
Flagged deliberately rather than guessed at — see also
src/lib/ingest/README.md for the
per-data-source version of this list.
Documentation truncated — see the full README on GitHub.
Reviews
No reviews yet
Be the first to review this server!
More Developer Tools MCP Servers
Paperclip
Freeby Paperclipai · Developer Tools
Trending hip-hop artist momentum scores across four cultural dimensions.
Git
Freeby Modelcontextprotocol · Developer Tools
Read, search, and manipulate Git repositories programmatically
Toleno
Freeby Toleno · Developer Tools
Toleno Network MCP Server — Manage your Toleno mining account with Claude AI using natural language.
mcp-creator-python
Freeby mcp-marketplace · Developer Tools
Create, build, and publish Python MCP servers to PyPI — conversationally.
MCP Marketplace
Freeby mcp-marketplace · Developer Tools
Search and install MCP servers from inside your AI client.
MarkItDown
Freeby Microsoft · Content & Media
Convert files (PDF, Word, Excel, images, audio) to Markdown for LLM consumption
