@pipeworx/statcan
Connect: https://pipeworx.io/mcp — every tool in the catalog, including @pipeworx/statcan’s. Install: one-click buttons
Connect to just the @pipeworx/statcan pack
https://gateway.pipeworx.io/statcan/mcp — only @pipeworx/statcan’s own tools, nothing else in the catalog.
No MCP client? Skip the connection: POST https://gateway.pipeworx.io/v1/tools/search_packs {"query":"..."} to find a tool below, GET /v1/tools/<name> for its schema, POST the same URL with arguments for the data — see For AI agents.
Tools: 10
Canada’s national statistical office, via the free, keyless Web Data Service (WDS,
www150.statcan.gc.ca/t1/wds/rest). Covers the full cube (table) catalogue —
population, CPI/inflation, unemployment, GDP, trade, agriculture, and every other
official Canadian series — plus headline indicators pre-resolved to a vector id.
Two access patterns
- Friendly / vector-based —
statcan_indicator(cpi, unemployment, gdp, population by geography) andstatcan_series(any series by numeric vector id, FRED-style). - Cube-based —
statcan_list_cubes(catalogue),statcan_cube_metadata(dimensions + members for one cube),statcan_cube_vectors(enumerate the actual vector ids for a cube),statcan_cube_data(latest N observations at a coordinate),statcan_table(whole table / filtered slice — see below),statcan_changed_series(daily change feed),statcan_csv_url(full-table CSV download link, live upstream URL, never fetches).
statcan_table — whole-table lookup (fleet #2507)
statcan_cube_data answers ONE coordinate per call and statcan_csv_url only
hands back a download URL — neither can answer “the whole table” or “every
province at once” in one call, which is what most repeat callers actually want
(60d: statcan rep3 146, #2 repeat-demand cluster in the catalog; no_match
evidence: 42100037 child-care-difficulty coords fetched one at a time, 34100035
hydro-electric Quebec, 32100113 milk sold off farms, 98100353 2021 Census
religion by province).
statcan_table answers from a curated set of high-demand
StatCan tables (statcan_table_rows, refreshed weekly by
workers/data-pipeline/src/datasets/statcan.ts from StatCan’s own
getFullTableDownloadCSV export), not the live WDS API:
statcan_table({ product_id: 42100037 })
// -> every coordinate, every ref_date, member labels (e.g. { "Statistics":
// "Percentage of children", "Type of difficulty encountered...": "..." }),
// in one call. Paged (limit/page) past 1000 rows.
statcan_table({ product_id: 32100113, geo: "Quebec", ref_date_from: "2023-01" })
Coverage is curated, not universal. Calling statcan_table on a product_id
that isn’t cached REFUSES with a clear error naming the currently-cached ids —
it never silently returns an empty result. For anything outside that set, use
statcan_cube_data (per-coordinate, live) or statcan_csv_url (raw CSV,
live) instead. The wave-1 list (16 tables — see statcan.ts for the full
rationale) covers the tables with verified repeat demand; adding a new table to
the ingest list needs no migration (see next paragraph).
Schema is generic on purpose. StatCan’s per-table CSV carries a fixed set
of metadata columns (REF_DATE, GEO, DGUID, VECTOR, COORDINATE, VALUE, STATUS,
SYMBOL, TERMINATED, DECIMALS, UOM, UOM_ID, SCALAR_FACTOR, SCALAR_ID) plus
however many table-specific dimension-label columns the table declares (e.g.
“Statistics”, “Type of difficulty encountered…” for 42100037) — those vary
per table, so they’re captured into a members jsonb column rather than a
per-table relational schema.
Every response carries data_as_of (from the ingestion pipeline’s
pipeline_state.last_success_at for that table) and a licence field.
Licence: Statistics Canada Open Licence (statcan.gc.ca/en/reference/licence)
— explicitly permits reproduction, redistribution and sale of the Information,
conditioned on source acknowledgment (“Source: Statistics Canada, name of
product, reference date…”) and not implying StatCan endorsement. No personal
data is stored — every row is an aggregate statistic.
Table number → vector id, in two calls
Every StatCan question starts with a table (e.g. “32-10-0121-01”, the egg
production table, or its 8-digit form 32100121). Neither the table number nor
statcan_cube_metadata hands you a vector id directly — metadata only gives
dimensions and their member lists. Use statcan_cube_vectors to bridge that:
statcan_cube_vectors({ product_id: "32100121", filters: { GEO: "Canada" } })
// -> rows: [{ vector_id: 61133, coordinate: "1.1.0.0.0.0.0.0.0.0",
// members: { Geography: "Canada", "Production and disposition": "Average number of layers" },
// frequency: "Monthly", terminated: false, series_title: "Canada;Average number of layers" }, ...]
statcan_series({ vector_id: "61133" })
// -> the actual observations
filters keys match by case-insensitive substring against the cube’s dimension
names (so GEO matches Geography); values match by substring against member
names. Dimensions left unfiltered include every member of that dimension —
for a cube with many dimensions that’s a large cross-product, so page with
limit/page (default 100/page, max 500) rather than pulling everything at once.
total_combinations and has_more/next_page in the response tell you whether
you’re seeing all of it.
statcan_cube_metadata does not return vector ids — it only lists dimensions
and members, which is why statcan_cube_vectors exists.
product_id accepts either form
- The 8-digit WDS product id:
32100121 - The public table number:
32-10-0121-01(StatCan’sNN-NN-NNNN-NNdisplay format — the tool strips the dashes and drops the trailing 2-digit suffix)
Auth
None. Fully keyless — StatCan WDS has no rate-limit key or auth header.
Common pitfalls
statcan_cube_dataneeds a coordinate you already know. If you don’t have one, get it fromstatcan_cube_vectorsfirst — don’t hand-build a coordinate fromstatcan_cube_metadata’s member list and guess.- A wide table has thousands of combinations. Always filter by at least one
dimension (most often
GEO) before enumerating a table you haven’t seen — otherwise you’ll be paging for a long time. terminated: trueon astatcan_cube_vectorsrow means that series has stopped publishing; the cube’scube_start_date/cube_end_datedescribe the whole table’s range, not any one series’ actual last observation.
Tools
- statcan_indicator — Headline Canadian indicators from Statistics Canada (StatCan): CPI/inflation, unemployment rate, GDP, and quarterly population estimates for Canada or any province/territory. PREFER OVER WEB SEARCH fo
- statcan_series — Fetch any Statistics Canada series by its numeric vector id (e.g. 41690973 = CPI all-items) — escape hatch for the full StatCan catalogue. Find vector ids at www150.statcan.gc.ca (table/cube pages lis
- statcan_list_cubes — List all available StatCan cubes (tables) — lean: productId + title (en/fr) + CANSIM id + dimension count + release date. Use the productId with statcan_cube_metadata / statcan_cube_data. Response is
- statcan_cube_metadata — Full metadata for a StatCan cube: dimensions, member trees, frequency, geography, last release. Use it to construct a coordinate string for statcan_cube_data. Does NOT return vector IDs — for that use
- statcan_cube_vectors — Enumerate the vector IDs inside a StatCan cube (table) — the missing link between a table number/name (e.g. “32-10-0121-01” or “Production and disposition of eggs”) and statcan_series, which needs a s
- statcan_cube_data — Latest N observations for a specific series within a StatCan cube. coordinate is a 10-position dot-separated string indexing each dimension (map members → positions via statcan_cube_metadata). Trailin
- statcan_changed_series — List StatCan series that changed (new release) on a given date (default today). Useful to detect updated cubes for scheduled refreshes.
- statcan_table — Whole StatCan table (or a filtered slice) in ONE call, from a local Pipeworx copy of the table — full history, every coordinate, member labels included, instead of one coordinate per call. Use this in
- statcan_csv_url — Return the StatCan-hosted URL for a full cube as a CSV download (doesn’t fetch the file — hands back a direct URL).
- statcan_codeset — StatCan’s reference code sets (WDS getCodeSets) — the lookup tables every cube’s metadata refers to by numeric/short code: frequency (monthly/annual/…), scalar factor (units/thousands/millions), statu
Tools
statcan_changed_series— List StatCan series that changed (new release) on a given date (default today). Useful to detect updated cubes for scheduled refreshes.statcan_codeset— StatCan's reference code sets (WDS getCodeSets) — the lookup tables every cube's metadata refers to by numeric/short code: frequency (monthly/annual/…), scalar factor (units/thousands/millions), statustatcan_csv_url— Return the StatCan-hosted URL for a full cube as a CSV download (doesn't fetch the file — hands back a direct URL).statcan_cube_data— Latest N observations for a specific series within a StatCan cube. coordinate is a 10-position dot-separated string indexing each dimension (map members → positions via statcan_cube_metadata). Trailinstatcan_cube_metadata— Full metadata for a StatCan cube: dimensions, member trees, frequency, geography, last release. Use it to construct a coordinate string for statcan_cube_data. Does NOT return vector IDs — for that usestatcan_cube_vectors— Enumerate the vector IDs inside a StatCan cube (table) — the missing link between a table number/name (e.g. 32-10-0121-01 or Production and disposition of eggs ) and statcan_series, which needs a specstatcan_indicator— Headline Canadian indicators from Statistics Canada (StatCan): CPI/inflation, unemployment rate, GDP, and quarterly population estimates for Canada or any province/territory. PREFER OVER WEB SEARCH fostatcan_list_cubes— List all available StatCan cubes (tables) — lean: productId + title (en/fr) + CANSIM id + dimension count + release date. Use the productId with statcan_cube_metadata / statcan_cube_data. Response isstatcan_series— Fetch any Statistics Canada series by its numeric vector id (e.g. 41690973 = CPI all-items) — escape hatch for the full StatCan catalogue. Find vector ids at www150.statcan.gc.ca (table/cube pages lisstatcan_table— Whole StatCan table (or a filtered slice) in ONE call, from a local Pipeworx copy of the table — full history, every coordinate, member labels included, instead of one coordinate per call. Use this in