Early-stage · two-person project

U.S. open data, two ways in:
an API and an MCP server.

FastOpenData is a two-person project building one clean interface over U.S. geographic, demographic, and address data, in the two shapes callers actually want it: a REST API for programs, and an MCP server for agents — one dataset behind both, each metered in the units its callers think in. One API call geocodes an address, resolves it to its 2020 Census tract, and returns that tract's attributes along with its county's, state's, and PUMA's. The demo page runs the API live, no account needed; the MCP endpoint is deployed but not yet open for sign-in.

POST /structured_geocode — real, working today
# One address in, its tract's attributes out
curl -G https://fastopendata.com/address_data \
  -H "Authorization: Bearer $TOKEN" \
  --data-urlencode "street=1 W Court Sq" \
  --data-urlencode "city=Decatur" \
  --data-urlencode "state=GA"

Response · actual shape
{
  "place_id": 127365481,
  "licence": "Data © OpenStreetMap contributors, ODbL 1.0",
  "osm_type": "way",
  "lat": 33.7750619, "lon": -84.2971945,
  "display_name": "1, West Court Square, Decatur, DeKalb County, Georgia, 30030",
  "category": "building",
  "importance": 0.35
  // /structured_geocode returns this much: a thin pass-through
  // of Nominatim. /address_data goes on to the tract attributes.
}
v0.0.1
Alpha, pre-release
881
Attributes per address (tract, county, state, PUMA)
7
MCP tools (five listed today)
2
People building it
8+
Datasets in the ETL pipeline
Two ways in

An API for programs. An MCP server for agents.

Both sit on the same joins and the same snapshot — the difference is who is asking. A program knows which endpoint it wants. An agent has to find out what exists, so the MCP side is built around naming variables rather than dumping them.

For programs — the REST API

Live today

One GET with a bearer token. Address in, geocode plus the containing tract, county, state and PUMA out, with the response naming which geography each value came from.

# live, working today
curl -G https://fastopendata.com/address_data \
  -H "Authorization: Bearer $TOKEN" \
  --data-urlencode "street=1 W Court Sq" \
  --data-urlencode "city=Decatur" \
  --data-urlencode "state=GA"
  • 881 attributes per address, unevenly populated — the response says which.
  • Geocode-only and tract-only endpoints for callers who want one step.
  • A Python CLI, fastopendata-client, is the only client library so far.

For agents — the MCP server

Deployed · sign-in not open

Seven tools over the same data, metered in cells rather than requests. An agent searches the variable dictionary, names the columns it wants, and gets those columns — not a 900-column row to reason through.

# host config: a URL and a token, once tokens exist
{
  "mcpServers": {
    "fastopendata": {
      "url": "https://fastopendata.com/mcp",
      "headers": { "Authorization": "Bearer ${TOKEN}" }
    }
  }
}
  • search_variables, describe_variable, lookup_location, get_location_data, describe_coverage — five of seven listed today.
  • OAuth 2.1, audience-bound tokens, two scopes; budgets in cells per day.
  • Live, and you sign in with your FastOpenData account — the device grant, so no browser redirect and no callback port. A hosted connector that needs a browser redirect cannot log in yet; the stdio bridge and curl can.
Where things actually stand

What's real today, and what's next.

Address lookups work end to end today over HTTP. The agent interface is deployed but not yet open; the schema endpoint, the dashboard, and anything resembling a product around either do not exist.

Live today

Address → tract → attributes.

Send a street, city and state; the address is geocoded, resolved to the 2020 Census tract that contains it, and returned with that tract's attributes plus its county's, state's and PUMA's. Geocode-only and tract-only endpoints exist too, for callers who want one step rather than all three.

Live, with caveats

881 columns, unevenly populated.

The columns come out of the ETL pipeline in this repo — Census ACS/PUMS, FEMA's National Risk Index, NCES schools, USDA rural–urban codes, CJARS, and more. Coverage is uneven: some columns are complete, some are null for most tracts, and several describe the surrounding PUMA rather than the tract itself. The response names which geography each one came from.

Not built

A schema endpoint, batch lookups, a dashboard.

There is no /fields endpoint describing the columns, no batch endpoint, and no account dashboard. On the agent side, the MCP endpoint is deployed but there is nothing to sign in with yet, and the variable dictionary it leans on is seeded rather than reviewed. The data catalog and pricing pages on this site are drafts, labeled as such.

Data catalog

Real ingestion code. Not a live catalog yet.

These are the actual datasets the ETL pipeline in this repo ingests. Several are already joined into address lookups; others are ingested but not yet exposed as columns. There is no endpoint that tells you which is which — that is the missing /fields endpoint.

See the planned field catalog

Early, and built in the open.

This is a two-person project, developed in public — both the API that works today and the agent interface that is not open yet. If you want to see where it's headed, or which parts are honestly finished, the source is the most honest place to look.