Open source

An open-source civic project by Nshipyard. Not affiliated with the Government of Canada or the City of Toronto.

Geo Concordances

Nshipyard Canada · Project 01

Every neighbourhood boundary, joined across census years.

Toronto's neighbourhoods were re-cut from 140 to 158 for the 2021 census. This is the canonical crosswalk: which old neighbourhoods became which new ones, by exact area overlap, plus ward concordances.

158

neighbourhoods in the current model, each mapped to its 140-model parent

16 → 34

old neighbourhoods split into new ones, with exact area shares

124

neighbourhoods unchanged, verified by full-area overlap

25

wards joined: every neighbourhood sits in exactly one ward

Explorer

Find any neighbourhood, in either model.

Color by:
…

Click any neighbourhood on the map, or search by name or code above, to see its 140-model parent, ward, and split history.

Showcase

The 16 neighbourhoods that became 34.

High-growth areas were split for the 2021 census round. Before this crosswalk, comparing a 2016 neighbourhood series to 2021 and later meant hand-deriving this table. Now it is a download.

Download the crosswalk (CSV)

For developers

Query it from code, or from an agent.

Three consumption paths, same canonical data. REST for applications, OpenAPI for integration, MCP tools over streamable HTTP for AI agents.

Endpoints

GET/api/v1/geo/convert?from=hood_140&to=hood_158&id=077

Convert one code between models

{
  "hood_140": "077",
  "hood_158": [
    { "code": "164", "name": "Wellington Place" },
    { "code": "165", "name": "Harbourfront-CityPlace" },
    { "code": "166", "name": "St Lawrence-East Bayfront-The Islands" }
  ]
}
GET/api/v1/geo/lookup/hood_158/166

Full record: parent, ward, split siblings

{
  "code": "166",
  "name": "St Lawrence-East Bayfront-The Islands",
  "parent140": { "code": "077", "name": "Waterfront Communities-The Island (77)",
                 "share_of_158": 0.9982 },
  "ward": { "code": "10", "name": "Spadina-Fort York" },
  "split": true
}
GET/api/v1/geo/splits

All 16 splits with area shares

{ "count": 16, "splits": [ … ] }

Connect your agent

Put this data to work inside your AI tools.

Pick your harness, copy the prompt, send it to your agent. Your agent runs the setup itself.

Copy and send this to Claude Code

Set up the Toronto Geo Concordances MCP server so I can query it from here.
1. Run: claude mcp add --transport http toronto-geo https://this-site.example/mcp
2. Run `claude mcp list` to confirm it connected.
3. Convert neighbourhood code 077 from the 140 model to the 158 model, and show me the result.

Data

Take the files.

Versioned releases, MIT licensed. CSV for spreadsheets, GeoJSON for maps.

hood158_to_hood140.csv

158 → 140 with area shares and primary flag

Download
hood140_to_hood158.csv

140 → 158 children with area shares

Download
ward25_to_hood158.csv

Every 158 neighbourhood's ward, verified

Download
neighbourhoods_158_simple.geojson

Simplified boundaries for web maps

Download