MapleStats MCP
Canadian open data: StatCan, Census, PUMFs, Bank of Canada, CMHC and open-data portals (EN/FR).
التثبيت
أضف هذا إلى إعدادات MCP في عميلك (Claude Desktop: claude_desktop_config.json، وCursor: .cursor/mcp.json، ويستخدم VS Code وغيره الصيغة نفسها «mcpServers»).
claude mcp add --transport http maplestats-mcp 'https://maplestats-mcp.onrender.com/mcp'
{
"mcpServers": {
"maplestats-mcp": {
"type": "http",
"url": "https://maplestats-mcp.onrender.com/mcp"
}
}
}
maplestats-mcpclaude mcp add maplestats-mcp -e 'MAPLE_TOOL_TIMEOUT_SECONDS=<MAPLE_TOOL_TIMEOUT_SECONDS>' -e 'MAPLE_PUMF_CACHE_DIR=<MAPLE_PUMF_CACHE_DIR>' -- uvx maplestats-mcp==0.4.2
{
"mcpServers": {
"maplestats-mcp": {
"command": "uvx",
"args": [
"maplestats-mcp==0.4.2"
],
"env": {
"MAPLE_TOOL_TIMEOUT_SECONDS": "<MAPLE_TOOL_TIMEOUT_SECONDS>",
"MAPLE_PUMF_CACHE_DIR": "<MAPLE_PUMF_CACHE_DIR>"
}
}
}
}
متغيرات البيئة
MAPLE_TOOL_TIMEOUT_SECONDSLongest a tool call may run before it fails (default 120).MAPLE_PUMF_CACHE_DIRFolder for downloaded PUMF microdata (default: system temp).
التوثيق
مأخوذ من ملف README للمشروع على GitHub ويُحدَّث أسبوعيًا. تفتح الروابط على GitHub.
المحتويات
MapleStats MCP
One MCP server for Canadian open data.
MapleStats MCP gives AI agents (Claude, Cursor and any MCP client) typed access to Canadian open data through one server: Statistics Canada (tables, Census, public use microdata), the Bank of Canada, CMHC, federal agencies, and federal, provincial, territorial and municipal open-data portals, in English and French. Every result carries its source.
MapleStats MCP donne aux agents IA un accès structuré aux données ouvertes canadiennes par un seul serveur, en français et en anglais.
Project vision: docs/PROJECT_GUIDE.md.
Source coverage: docs/ROADMAP.md.
Website: https://maplestats.danielstats.io/.
The easiest way: ask your agent
- Copy this prompt.
- Paste it into Claude Code, Codex, Cursor or any agent that can run commands on your computer.
- Restart the agent when it says so, then ask for data.
Connect the MapleStats MCP server to this agent. Follow the setup steps in https://github.com/dsanchezp18/maplestats-mcp
Instructions for the agent doing the setup
The default is the hosted server: nothing to install, no account, no key.
- Register this remote (HTTP) MCP server under the name
maplestats:- Claude Code:
claude mcp add --transport http --scope user maplestats https://maplestats-mcp.onrender.com/mcp - Codex CLI:
codex mcp add maplestats --url https://maplestats-mcp.onrender.com/mcp - Cursor, Claude Desktop and other
mcpServersclients: add the entry below to the client's config file (Cursor:~/.cursor/mcp.json; Claude Desktop:~/Library/Application Support/Claude/claude_desktop_config.jsonon macOS,%APPDATA%\Claude\claude_desktop_config.jsonon Windows), keeping any servers already there. - claude.ai and the Claude phone app: on the web, open Settings →
Connectors → Add custom connector, name it
MapleStats, and enterhttps://maplestats-mcp.onrender.com/mcp. Then switch it on from the tools menu in a chat, on the web or in the phone app. Claude asks for approval before each call by default; every tool is read-only, so set them to always allow in the connector's tool permissions. - ChatGPT (web): turn on Settings → Security and login → Developer mode, then create a developer-mode app for a remote MCP server with the same address and No Authentication. Every tool is read-only, so ChatGPT should not ask to confirm calls. OpenAI documents this feature for the web.
- A whole organization: on Claude Team or Enterprise, an Owner adds it once under Organization settings → Connectors → Add custom connector, and each member then connects it. On ChatGPT Business, Enterprise or Edu, an admin turns on Developer mode (Workspace Settings → Permissions & Roles → Connected Data), creates the app, and publishes it (Workspace settings → Apps → Drafts → Publish). The hosted server is a shared free instance, so a large organization should run its own copy.
- VS Code: the same entry under a
serverskey, with"type": "http", in.vscode/mcp.json.
{ "mcpServers": { "maplestats": { "url": "https://maplestats-mcp.onrender.com/mcp" } } } - Claude Code:
- Tell the user to restart or reload the client, then check that the
search_toolstool is listed. - Only if the client cannot use remote servers, or the user wants the
microdata tabulation tool or everything kept on their own machine, run it
locally instead:
claude mcp add --scope user maplestats -- uvx maplestats-mcp(needs uv), or the equivalentuvx maplestats-mcpentry for other clients (see Install).
The hosted server is a free instance, so the first request after a quiet spell can take up to a minute. Each client gets 60 requests a minute, and the microdata tabulation tool is switched off there. Your agent's tool calls (a search phrase, a table number) reach the server and its host, Render. The code keeps no log of them, but its in-memory cache can hold a search phrase or filter in a key or a response until the entry expires or the server restarts. Check Render's terms and privacy policy; for full privacy, run it locally. What it logs: FAQ. Other clients: the Connect page.
Install locally (optional)
Prefer to run it on your machine? It works over stdio with no account or key.
uvx maplestats-mcp # run without installing
uv tool install maplestats-mcp # or install the command once (pip works too)
uv tool upgrade maplestats-mcp # update
For the development version: uv tool install git+https://github.com/dsanchezp18/maplestats-mcp.git.
If you installed the command, use "command": "maplestats-mcp" with no
args in the JSON above. On Windows, make sure the directory where uv
installs tools is on PATH, and restart the client afterwards.
Using it
Tools are found through search rather than listed flat: call
search_tools with a plain-language query (English or French), then
call_tool with the name it returns.
{"name": "search_tools", "arguments": {"query": "consumer price index"}}
{"name": "call_tool", "arguments": {"name": "wds_search_cubes", "arguments": {"query": "consumer price index"}}}
plan_query turns a question into an ordered, multi-source plan, and
reproduce_code writes the R, Python, Stata or Julia script (or an Excel
Power Query) that fetches the same data straight from the source;
reproduce_workbook returns the rows as a formatted Excel workbook. Every tool accepts lang: "en"|"fr";
some sources only publish English content (for example Yukon's CKAN portal,
the World Bank's indicator definitions and the PMPRB), so there lang
changes the labels MapleStats adds, not the source's own text. Every response
has a provenance block: source, URL, query time, freshness and limits.
docs://catalogue describes every module in both languages. The guided
prompts take lang too, and each docs://<module>/... resource has a French
twin at docs://<module>/fr/... (for example docs://statcan/fr/pieges).
What it covers
357 tools in 70 modules. Run docs://catalogue for the full, bilingual list.
| Area | Tool prefixes | Covers |
|---|---|---|
| Statistics Canada | wds_, sdmx_, sdmx_space_, rdaas_, cimt_, statcan_* | Tables and series, the extra SDMX spaces (energy information, shared data), classifications, Census Profiles 2001–2021, public use microdata (codebooks, weighted tables), merchandise trade by commodity (CIMT), open databases (LODE), The Daily, delta files, indicators, surveys, census geography |
| Bank of Canada | boc_ | Valet series, groups, observations |
| CMHC | cmhc_, cmhc_dt_ | Housing Market Information Portal and Excel data tables |
| Federal agencies | eccc_, eccc_coverages_, eccc_datamart_, ised_*, gazette_, tc_recalls_, recalls_, cdc_, cfia_, fcac_, finance_, cihi_, phac_infobase_, hc_*, pmra_, pmprb_, gc_infobase_, cer_, nrcan_*, dfo_iwls_, cgc_, nfd_, ircc_*, cbsa_, pbo_, competition_bureau_, elections_results_, elections_financial_returns_, cra_digital_economy_registry_, earthquakes_, borealis_ | Weather, climate and gridded climate projections, pollutant releases and emissions (NPRI, GHGRP, NAPS), corporations and IP, regulations, recalls, dairy, animal disease, consumer banking, federal and provincial fiscal tables, health, drugs, natural health products, medical devices, adverse reactions, pesticides, spending, energy, mineral production, oceans, grain, forestry, immigration, border wait times, budgets, mergers, elections, earthquakes, university-library data tables |
| Wildland fire | cwfis_, nrcan_nbac_, ab_wildfire_ | NRCan's Canadian Wildland Fire Information System (satellite hotspots, fire danger, weather stations), burned areas, and Alberta Wildfire's live fire status |
| Electricity | electricity_ontario_, electricity_quebec_, oeb_ | IESO (Ontario) demand, generation and prices; Hydro-Québec demand, generation and trade (CC BY-NC 4.0: credit Hydro-Québec, non-commercial use only); Ontario Energy Board datasets |
| Parliament and elected officials | ourcommons_, senate_, represent_ | MPs and their roles, party standings, Cabinet, Senate votes; elected officials and districts for a postal code via Open North's Represent (unofficial) |
| Provincial agencies | aer_, bcgw_, bc_stats_, bc_env_, bc_lobbyists_, drivebc_, ab_economic_, ab_opendata_, isq_, nl_stats_, yukon_stats_, nwt_stats_, elections_provincial_ | Alberta Energy Regulator, BC Geographic Warehouse, BC Stats Excel tables, BC environmental monitoring (air quality, snow, groundwater, streamflow), BC lobbyists registry, DriveBC road events, Alberta Economic Dashboard, Open Alberta files, Institut de la statistique du Québec, the Newfoundland and Labrador, Yukon and Northwest Territories statistics bureaus, provincial general election results (Quebec, Alberta, British Columbia, Saskatchewan, Manitoba) |
| Housing (links only) | crea_ | Links, release timing and terms for CREA's MLS® Home Price Index; no values, because CREA's terms allow private, non-commercial analysis only |
| International | worldbank_ | World Bank World Development Indicators for Canada and peer countries (CC BY 4.0) |
| Open-data portals | ckan_, arcgis_hub_, socrata_ + portal | Federal, provincial, territorial and municipal catalogues (*_list_portals names each one) |
| Other municipal | opendatasoft_vancouver_, nl_opendata_, eps_, ets_, epcor_ | Vancouver, Newfoundland and Labrador, Edmonton police, transit and water quality |
| Transit schedules | transit_ + agency | Static GTFS timetables of the STM (buses), OC Transpo, Calgary Transit, VIA Rail, GO Transit, UP Express, the BC Transit systems and the Quebec networks listed on Données Québec (exo, RTC, STL, STS and others), plus further agencies from Statistics Canada's 2025 Canadian Public Transit Network Database: stops, routes, scheduled departures, frequency by hour |
Other federal series (CRA, OSFI, ISED insolvency) are ordinary
open.canada.ca datasets, reachable with
ckan_search_datasets(portal="federal", fq="organization:<org>").
Not covered: CAPP's Statistics Handbook, Petrinex and Payments Canada were not built, because their terms or download hosts do not permit automated access. CanadaBuys, OpenParliament.ca and the Toronto Transit Commission's own schedule download were removed for the same reason (the TTC schedule is still served from Statistics Canada's national transit database), and the Saskatchewan GeoHub portal was removed. The 2006-2016 census data tables and the 2016 Census Profile service were removed because Statistics Canada's www12 host answers automated clients with a bot challenge, 503 errors or timeouts (the 2021 profile and the WDS tables remain). Justice Laws (federal statutes and regulations) is out of scope, because legislation text is not data this server carries, and the Saskatchewan Bureau of Statistics' Provincial Economic Accounts were not built: they are under Crown copyright, for non-commercial reuse only, and the site's terms bar automated access. The roadmap records each decision.
Development
uv sync # install
uv run ruff check src tests # lint
uv run ruff format src tests # format
uv run pyright # type check
uv run pytest # unit tests (mocked, no network)
.\scripts\verify.ps1 runs that gate plus every scripts/smoke_test*.py
against the live APIs. The website is generated from the tool registry:
uv run python scripts/build_site.py writes build/site/. See
AGENTS.md
for the contributor guide and how to add a source module.
Hosting
MAPLE_TRANSPORT=http MAPLE_HOST=0.0.0.0 MAPLE_PORT=8000 uv run maplestats-mcp
serves HTTP instead of stdio; docker compose up --build does the same in
Docker. Docker is optional and unnecessary on a personal computer. If the
server is exposed beyond your machine, set MAPLE_AUTH_TOKEN and keep
MAPLE_REQUIRE_AUTH=1. GET /health reports uptime and version. GET /stats
is public, needs no token and reports calls per tool name and day, each tool's
p50 and p95 duration, and each upstream host's error counts and circuit-breaker
state (see MAPLE_USAGE_STATS and MAPLE_BREAKER below). After repeated
failures (timeouts, connection errors, 5xx answers, Cloudflare challenges) a
host is paused for a cooldown: its tools fail at once with an "unavailable"
error that says when to retry, instead of waiting for another timeout. The
docs://status resource lists the paused hosts.
| Env var | Default | Purpose |
|---|---|---|
MAPLE_TRANSPORT | stdio | stdio for local clients, http for hosting |
MAPLE_HOST / MAPLE_PORT | 127.0.0.1 / 8000 | HTTP bind address |
MAPLE_AUTH_TOKEN, MAPLE_REQUIRE_AUTH | unset, 0 | Bearer token required on /mcp; refuse to start without one if 1. docker-compose.yml defaults MAPLE_REQUIRE_AUTH to 1 |
MAPLE_RATE_LIMIT_REQUESTS / MAPLE_RATE_LIMIT_WINDOW_SECONDS | 120 / 60 | Per-client rate limit |
MAPLE_MAX_CONCURRENT_REQUESTS | 8 | In-flight request cap; the excess waits 5 s, then gets 503 |
MAPLE_SSL_CERTFILE / MAPLE_SSL_KEYFILE | unset | TLS in-process |
MAPLE_TRUST_PROXY_HEADERS | 0 | Rate-limit on X-Forwarded-For; only behind a proxy that sets it |
MAPLE_TRUSTED_PROXY_HOPS | 1 | Proxies that append to X-Forwarded-For; the client address is read that many entries from the right |
MAPLE_ALLOWED_ORIGINS | project website, localhost | Browser origins allowed on /mcp (comma-separated, *. and :* wildcards); others get 403, clients without an Origin are allowed |
MAPLE_CACHE_MAX_ENTRIES | 2000 | Response cache size per TTL bucket |
MAPLE_CACHE_MAX_MB | 128 | Estimated memory cap for the response cache, all buckets together |
MAPLE_PARSE_WORKERS / MAPLE_PARSE_TIMEOUT_SECONDS | 4 / 60 | Threads for parsing Excel and CSV files, and the time one parse may take |
MAPLE_TOOL_TIMEOUT_SECONDS | 120 | Longest a tool call may run |
MAPLE_BREAKER | 1 | Pause requests to an upstream host after repeated failures; 0 sends every request |
MAPLE_BREAKER_FAILURES / MAPLE_BREAKER_WINDOW_SECONDS / MAPLE_BREAKER_COOLDOWN_SECONDS | 5 / 300 / 60 | Failures in a row, within the window, that pause a host, and how long before one probe request is sent |
MAPLE_PUMF_TABULATE | 1 | 0 hides statcan_pumf_tabulate (it downloads whole PUMF ZIPs); search, listings and codebooks stay |
MAPLE_PUMF_CACHE_DIR, MAPLE_PUMF_CACHE_MAX_GB | system temp, 5 | Downloaded microdata cache; use a persistent volume when hosted |
MAPLE_CLIENT_IP_HEADER | unset | Header the outermost proxy sets to the caller's own address (Cloudflare's CF-Connecting-IP), used for the per-client rate limit when MAPLE_TRUST_PROXY_HEADERS is on; set it only when every request passes through that proxy |
MAPLE_DUCKDB_MEMORY_LIMIT | unset | Memory limit for DuckDB queries over downloaded files (patents, open databases, microdata), such as 256MB; beyond it DuckDB spills to the temporary folder. Set it on a small hosted instance |
MAPLE_LODE_CACHE_DIR, MAPLE_LODE_CACHE_MAX_GB | system temp, 3 | Where StatCan open-database (LODE) archives are unpacked, and the size cap (least recently used files go first); use a persistent volume when hosted |
MAPLE_LODE_MAX_DOWNLOAD_MB | 300 | Largest open-database archive one call may download; 0 turns downloads off |
MAPLE_IP_HORIZONS_CACHE_DIR, MAPLE_IP_HORIZONS_CACHE_MAX_GB | system temp, 3 | CIPO patent table cache |
MAPLE_EXPORT_DIR | Downloads folder (home folder if there is none) | Where reproduce_workbook saves Excel workbooks on a local server |
MAPLE_USAGE_STATS | 1 | Counts calls and durations per tool name and UTC day, and upstream errors per host (never arguments or client addresses), in memory, and serves them at the public /stats route; 0 turns both off |
MAPLE_DELTA_MAX_SCAN_MB / MAPLE_DELTA_MAX_SCAN_SECONDS | 400 / 75 | How much of a Delta File one statcan_delta_read_table call streams (seconds kept 30 under the tool timeout) |
MAPLE_DELTA_INDEX_DIR | system temp | Saved Delta File resume points (a few MB per day); off keeps them in memory only |
License
MIT. Third-party notices are in THIRD_PARTY_NOTICES.md.
Security and conduct
Report a vulnerability privately through GitHub's
private vulnerability reporting;
see SECURITY.md. Changes are recorded in
CHANGELOG.md, and community expectations in
CODE_OF_CONDUCT.md.
Acknowledgments
MapleStats owes its architecture to EcuDataMCP, the MCP server for Ecuador's open data that I help maintain with DweskZ and its other contributors. Its approach to Canadian data owes much to the R developers who got there first: Jens von Bergmann (mountainMath) and his co-authors, including Dmitry Shkolnik (dshkol), Thierry Warin (statcanR), Valentin Lucet (rgovcan), and others. Thanks to them, and to everyone who publishes Canadian data in the open.
For other ways to get Canadian data, see the alternatives.
الأسئلة الشائعة
ما هو MapleStats MCP؟
Canadian open data: StatCan, Census, PUMFs, Bank of Canada, CMHC and open-data portals (EN/FR).
كيف أثبّت MapleStats MCP؟
يعمل كخادم بعيد. في Claude Code: claude mcp add --transport http maplestats-mcp 'https://maplestats-mcp.onrender.com/mcp'. وفي العملاء الآخرين، الصق إعداد JSON من هذه الصفحة في إعدادات MCP الخاصة بهم.
هل يحتاج MapleStats MCP إلى مفتاح API؟
لا يذكر إدراجه في السجل أي مفتاح أو سر إلزامي. قد تتطلب بعض الميزات حسابًا لدى الخدمة التي يتصل بها.
هل MapleStats MCP مفتوح المصدر؟
نعم. شيفرته متاحة على GitHub بترخيص MIT.
من يصون MapleStats MCP؟
ينشره dsanchezp18. يدرجه AI.tn لكنه لا يصونه ولا يوصي به.
من سجل MCP الرسمي. الإدراج ليس توصية: راجع شيفرة الخادم وصلاحياته قبل منحه الوصول إلى بياناتك.