Open the map →
For Claude, Grok and anything else with a tool loop

Point an agent straight at the data.

Everything here is static files over HTTPS with range requests — no API key, no rate limit, no login. An agent can read the catalogue, query 272,354 scored line sections without downloading the file, and build its own exports.

Start here

1

Fetch the catalogue

One document describing every dataset: URL, format, row count, byte size, SHA-256, and a description of every column. It is generated by the build from the files that actually shipped, so it cannot drift from reality.

# the single entry point
curl -s https://sce.weleber.net/data/out/dist/catalog.json | jq '.datasets[].name'
2

Or read the short version

llms.txt is the same thing in about forty lines of prose, including the rules on how these numbers may and may not be characterised.

3

Query it in place

The GeoParquet files are HTTP range-readable. DuckDB will pull only the row groups and columns a query touches, so a GROUP BY over 272,354 sections costs a few hundred kilobytes rather than the 46 MB file.

Datasets

All EPSG:3310 (NAD83 / California Albers). Lengths, areas and distances were computed in that projection — reproject at the point of display, not before.

DatasetRowsGrainFormats
line_section_index272,354 One scored SCE ICA line section. The product. parquet · csv
circuit_index3,005 Distribution circuit rollup. parquet · csv
substation_index574 Substation rollup. parquet · csv
service_territory1 The clip boundary every count sits inside. parquet · geojson
cost cube8 levels Meters per (geography × install class), plus the polygon scalars the cost model multiplies against. Census levels are generated from one pass over the fact table, so they cannot disagree. tract · bg · county · circuit · substation · place
cost_model41 controls Every rate, its range, and its provenance label. json
parcels4,133,590 Every assessor parcel inside net SCE territory, with its estimated service points, install class, dwelling units and build year. The finest grain published. Citation required — name the county as author. pmtiles · report
vector tiles4 archives PMTiles, range-readable. Parcels, the cube at six geographies, the difficulty index, and the basemap. parcels · cube · index · basemap

Query without downloading

DuckDB, over HTTPS. Nothing is installed on our side and nothing is cached on yours.

INSTALL httpfs; LOAD httpfs;

-- the ten circuits carrying the most meters, and how hard they are
SELECT circuit_name, substation_name,
       meters_est, route_km, difficulty_index, cost_multiplier, confidence
FROM 'https://sce.weleber.net/data/out/dist/circuit_index.parquet'
ORDER BY meters_est DESC LIMIT 10;

-- where the multifamily access problem actually is
SELECT county_fips,
       sum(meters_est)                        AS meters,
       sum(meters_est * mf_share) / sum(meters_est) AS mf_share
FROM 'https://sce.weleber.net/data/out/dist/line_section_index.parquet'
GROUP BY 1 ORDER BY meters DESC;

-- hardest substations, restricted to sections where the index is reliable
SELECT substation_name, sum(meters_est) AS meters,
       avg(difficulty_index) AS idx
FROM 'https://sce.weleber.net/data/out/dist/line_section_index.parquet'
WHERE index_reliable
GROUP BY 1 HAVING meters > 5000 ORDER BY idx DESC LIMIT 15;

Python, if you want geometry:

import geopandas as gpd

gdf = gpd.read_parquet("https://sce.weleber.net/data/out/dist/circuit_index.parquet")
print(gdf.crs)                      # EPSG:3310
hard = gdf.nlargest(20, "difficulty_index")
hard.to_file("hardest_circuits.gpkg", driver="GPKG")

MCP endpoint

A read-only Model Context Protocol server, so Claude Code connects to the dataset natively instead of being handed URLs. It exposes a fixed set of tools over the same files described above — there is no write path and no arbitrary filesystem access.

# Claude Code
claude mcp add --transport http sce https://sce.weleber.net/mcp

# or, in .mcp.json
{ "mcpServers": { "sce": {
    "type": "http",
    "url": "https://sce.weleber.net/mcp" } } }

Tools it exposes:

ToolDoes
catalogThe full catalogue — datasets, columns, provenance, the rules below.
describeColumn names, types and descriptions for one dataset.
queryRead-only SQL over the published tables. Row-capped and time-limited.
headlineThe build's top-line figures and the measured/inferred/modelled mix.
cost_modelEvery control, its range and its provenance label.

Status: checking… · GET the endpoint for a machine-readable description of it.

A chat session with web browsing cannot reach this, and that is not a fault in the endpoint. MCP is JSON-RPC over HTTP POST with streamable-http framing; opening the URL is a GET, which is not part of the protocol. A browsing tool will report it as unreachable or unsafe no matter what the server does. You need an MCP client, or a configured connector.

For OpenAI, remote MCP goes through the Responses API tool type rather than the browsing tool:

{
  "model": "gpt-5",
  "tools": [{
    "type": "mcp",
    "server_label": "sce",
    "server_url": "https://sce.weleber.net/mcp",
    "require_approval": "never"
  }],
  "input": "Which SCE substations carry the most meters, and how hard are they?"
}

In the ChatGPT app it has to be added as a connector; the built-in web tool will not do it. And if all you have is HTTP, nothing here needs MCP at all — every tool above is backed by the static files in the table, and catalog.json is the same content the catalog tool returns.

Before you quote a number

Meters are estimated service connections — not parcels, and not dwelling units. The three differ substantially: 4,133,590 parcels carry 4,808,866 estimated service points, because a multifamily parcel holds many and a vacant one holds none.
Every count is labelled measured, inferred or modelled. 39.9% rests on a published assessor unit count, 13.8% on a structure count, 46.3% on a fitted use-code rate. Do not average the three into one figure, and do not present a modelled number as a measured one.
Locations are modelled everywhere. Meters sit at a parcel representative point, because the national address-point service is blocked. A measured count with a modelled location is the normal case here — they are separate claims and the data labels them separately.
difficulty_index and cost_multiplier are ordinal within this build. Components are percentile ranks over this set of sections and the weights are informed judgement, not fitted parameters. They rank sections against each other; they do not transfer to another dataset or another build.
No rate in the cost model is measured. Every one is a control with a range and a provenance label of bidder, benchmark or judgement. Any total derived from them inherits that status.
Parcel geometry is published, and it is a public record. California parcel geometry is disclosable under the CPRA — Sierra Club v. Superior Court (Orange County) (2013) held that a county parcel base map is a public record at the cost of duplication, and that access may not be conditioned on a restrictive licence. All 4,133,590 parcels inside SCE territory ship at parcel grain. The scope is county-authored parcel geometry only; it does not extend to Overture or the National Address Database, which carry their own terms.
Citation is a condition, not a courtesy. California parcel geometry is a public record under the CPRA and is republished here on that basis — provided the county is named as author, with the endpoint and retrieval date. CITATION.md carries the full table; source_register.json is the machine-readable form. Where a county is served through a third-party host, cite the county, not the host.