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 and open for sign-in.

GET /address_data — 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
{
  "match": {
    "display_name": "1, West Court Square, Decatur, DeKalb County, Georgia, 30030, United States",
    "latitude": 33.7750619, "longitude": -84.2971945,
    "rank_address": 30,
    "geoid": "13089022501"
  },
  "payload": {
    "tract": { /* 85 columns */ },
    "puma":  { /* 483 columns */ },
    "county": { /* 193 columns */ },
    "state": { /* 120 columns */ }
  }
  // The match is echoed back so you can check what was geocoded;
  // the payload is the tract's attributes and its wider geographies.
}
v0.0.1
Alpha, pre-release
checking…
Data version, live from /health
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

Live today

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 and 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.

/fields now serves the column list live, with how many tracts carry each one — 233 of the 881 have no value anywhere, which the catalog marks; there is no batch endpoint and no account dashboard. On the agent side, the variable dictionary the MCP tools lean on is seeded rather than reviewed. The pricing page is a draft, labeled as such.

Data catalog

Where the data comes from.

Every source the ETL pipeline in this repo ingests, with the number of columns each one puts into an address lookup. Counted from the same schema the catalog lists, so these numbers and that page cannot disagree. Two of them supply no columns and are load-bearing anyway: the tract geometry and the geocoder.

See all 881 fields

Early, and built in the open.

This is a two-person project. One half of it is public: nmetl, the graph engine the pipeline runs on. The FastOpenData half — the API, this site, the ETL configuration — is not open yet, so the engine repository is what there is to read today.