MapleStats MCP
MapleStats MCP is a read-only MCP server that gives AI agents typed access to Canadian open data — 358 data tools across 69 modules, reached through three meta-tools.
Discover tools by search:
search_toolstakes a plain-language query (English or French) and returns ranked matching tool definitions with full input schemas.plan_queryturns a broad, multi-agency question into an ordered plan (topics, steps, local portals for named provinces/cities, caveats) without calling any external API.Run anything found:
call_toolexecutes a tool by exact name to fetch live public data. All reachable tools are read-only, idempotent and non-destructive; results are typed and errors come back as MCP tool errors (unknown name, invalid arguments, upstream outage).Statistics Canada: tables and series (WDS, SDMX, extra SDMX spaces), classifications, Census Profiles 2001–2021 and census tables 2006–2016, public use microdata (codebooks, weighted tables, tabulation), merchandise trade (CIMT), LODE databases, The Daily, delta files, indicators, surveys, census geography.
Other federal sources: Bank of Canada (Valet series, groups, observations); CMHC housing; weather/climate, pollutant releases (NPRI, GHGRP, NAPS), corporations and IP, regulations, recalls, dairy, animal disease, consumer banking, federal/provincial fiscal tables, health, drugs, medical devices, pesticides, energy, minerals, oceans, grain, forestry, immigration, border wait times, budgets, mergers, elections, earthquakes, Borealis research data.
Wildland fire and electricity: Canadian Wildland Fire Information System hotspots, fire danger and weather stations, burned areas, Alberta Wildfire status; Ontario (IESO) and Quebec (Hydro-Québec) demand, generation, prices and trade; Ontario Energy Board datasets.
Parliament and provincial agencies: MPs, Senate votes, Cabinet, party standings, postal-code-to-official lookup; Alberta Energy Regulator, BC Stats, BC Geographic Warehouse, BC environmental monitoring, DriveBC, Open Alberta, ISQ, NL/Yukon/NWT statistics bureaus, provincial election results.
Open-data portals and municipalities: CKAN, ArcGIS Hub and Socrata catalogues across federal, provincial, territorial and municipal levels (
*_list_portalsnames them), plus Vancouver, Newfoundland and Labrador, Edmonton police, transit and water quality.Transit schedules: static GTFS timetables for STM, OC Transpo, Calgary Transit, VIA Rail, GO Transit, UP Express, BC Transit and Quebec networks, plus ~100 agencies from StatCan's 2025 transit database — stops, routes, departures, hourly frequency.
International context: World Bank World Development Indicators for Canada and peer countries.
Reproducibility helpers:
reproduce_codeemits R, Python, Stata, Julia or Excel Power Query code that fetches the same data from source;reproduce_workbookreturns rows as a formatted Excel workbook;docs://cataloguedocuments every module bilingually.Provenance on every result: source name, exact upstream URL, query time, freshness cadence, coverage limits, licence/attribution and whether it was cached.
Bilingual: most tools accept
lang: "en"|"fr".Flexible deployment: hosted shared instance over HTTP (nothing to install) or local via
uvx maplestats-mcpover stdio; HTTP hosting supports auth tokens, rate limits, concurrency caps, TLS, proxy-header trust, CORS allowlists, response cache sizing, parse workers, tool timeouts and PUMF/delta cache controls.Not covered: CAPP Statistics Handbook, Petrinex, Payments Canada, CanadaBuys, OpenParliament.ca, the TTC's own schedule download and the Saskatchewan GeoHub were excluded because their terms or hosts disallow automated access.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@MapleStats MCPGet Canada's inflation rate from StatCan and generate Python code to plot it"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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/mcpCodex CLI:
codex mcp add maplestats --url https://maplestats-mcp.onrender.com/mcpCursor, 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" } } }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: a ping every 10 minutes keeps it awake, so cold starts are rare, but the first request after an idle 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, and the code stores none of them. Check Render's terms and privacy policy; for full privacy, run it locally. What it logs: FAQ. Other clients: the Connect page.
Related MCP server: Données Québec MCP
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 # updateFor 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 |
| 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 |
| Valet series, groups, observations |
CMHC |
| Housing Market Information Portal and Excel data tables |
Federal agencies |
| 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 |
| NRCan's Canadian Wildland Fire Information System (satellite hotspots, fire danger, weather stations), burned areas, and Alberta Wildfire's live fire status |
Electricity |
| 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 |
| 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 |
| 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) |
| 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 |
| World Bank World Development Indicators for Canada and peer countries (CC BY 4.0) |
Open-data portals |
| Federal, provincial, territorial and municipal catalogues ( |
Other municipal |
| Vancouver, Newfoundland and Labrador, Edmonton police, transit and water quality |
Transit schedules |
| 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.
Env var | Default | Purpose |
|
|
|
|
| HTTP bind address |
| unset, | Bearer token required on |
|
| Per-client rate limit |
|
| In-flight request cap; the excess waits 5 s, then gets 503 |
| unset | TLS in-process |
|
| Rate-limit on |
|
| Proxies that append to |
| project website, localhost | Browser origins allowed on |
|
| Response cache size per TTL bucket |
|
| Estimated memory cap for the response cache, all buckets together |
|
| Threads for parsing Excel and CSV files, and the time one parse may take |
|
| Longest a tool call may run |
|
|
|
| system temp, | Downloaded microdata cache; use a persistent volume when hosted |
| system temp, | CIPO patent table cache |
|
| How much of a Delta File one |
| system temp | Saved Delta File resume points (a few MB per day); |
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.
Available Tools
3 toolscall_toolCall a toolARead-onlyIdempotent
Run one data tool found through search_tools or plan_query.
Use for: executing a tool by exact name with arguments that match the inputSchema search_tools returned for it. Every reachable tool is read-only: it fetches public data from the upstream agency (StatCan, Bank of Canada, open-data portals) and changes nothing. Returns that tool's typed result, including a provenance block (source, URL, query time, freshness). Errors come back as MCP tool errors, not as data: an unknown or misspelled name raises 'Unknown tool' (search again for the exact name), invalid arguments raise a validation error naming the field, and upstream outages or empty matches raise a typed error explaining what to change. search_tools, call_tool and plan_query cannot be called through it; call them directly. Tool calls are subject to the server's timeout (MAPLE_TOOL_TIMEOUT_SECONDS, default 120).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Exact tool name as returned by search_tools or plan_query, e.g. 'boc_get_observations'. | |
| arguments | No | Object matching that tool's inputSchema from search_tools. Omit or pass {} for a tool with no required parameters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=true, idempotent=true, destructive=false, openWorld=true, but the description adds real context beyond them: the provenance block in results (source, URL, query time, freshness), the error taxonomy (unknown tool vs. field-level validation error vs. upstream outage), the meta-tool nesting restriction, and the timeout governed by MAPLE_TOOL_TIMEOUT_SECONDS (default 120). A clearer statement of what happens to partially-succeeded calls or whether the timeout aborts mid-flight would push this to a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then organizes the rest under a clear 'Use for:' framing followed by returns and errors. It is slightly longer than needed — the meta-tool exclusion and the error enumerations each run a bit long — but every sentence carries actionable content and nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter dispatcher with no output schema, the description covers the full picture an agent needs: how to obtain valid input, what comes back (typed result plus provenance), how failures surface, the nesting restriction, and the timeout boundary. Nothing material is left unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3, but the description adds operational meaning the schema cannot: the name value must be an exact string previously surfaced by search_tools/plan_query, and the arguments object is defined by the target tool's own schema rather than this one. The failure mode for a misspelled name is documented, which is genuinely useful for an argument whose valid domain is unbounded.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb (run) and resource (one data tool obtained via search_tools or plan_query), immediately distinguishing it from both siblings. It also explicitly scopes what it cannot do (cannot invoke search_tools, call_tool, or plan_query), so an agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'Use for:' guidance pairs with concrete preconditions ('by exact name with arguments that match the inputSchema search_tools returned'). Exclusions are named and the recovery path for the wrong-name case is spelled out ('search again for the exact name'), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_queryPlan queryARead-onlyIdempotent
Plan which sources answer a question that may span several agencies.
Use for: the first call on a substantive question ("How have rents and interest rates moved in Calgary since 2020?"). Returns the topics it touches, the tools to call for each in order, local portals for any province or city named, and caveats on combining them. Then run the steps with call_tool. Read-only and offline: it matches the question against this server's source map and calls no external API. Use search_tools instead to find a single tool for a narrow, single-source need. lang='fr' gives the labels, purposes, caveats and guidance in French; tool and argument names stay as they are. Keywords: plan, which data source, where to find, combine sources, cross-source, question, research, Canada data. Mots-clés : planifier, quelle source de données, où trouver, combiner des sources, question, recherche, données canadiennes, statistiques.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | en | |
| question | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| places | Yes | |
| topics | Yes | Best match first; at most 4. |
| guidance | Yes | |
| question | Yes | |
| provenance | Yes | Where a result came from and how fresh/complete it is. Embedded in every module's response models (composition, not inheritance) so a tool can return `MyResult(provenance=..., ...)` without fighting Pydantic's model-inheritance rules for extra fields. |
| out_of_scope | No | Set when the question is about a place outside Canada that this server has no data for; topics and fallback steps are then empty. |
| fallback_steps | Yes | Only when no topic matched. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety bar is low. The description still adds real behavioural detail beyond them: it is offline, calls no external API, matches against this server's source map, and returns an ordering of tools plus caveats.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Core purpose and the use/use-instead guidance are front-loaded in the first two paragraphs; nothing essential is buried. The bilingual keyword lists at the end are retrieval scaffolding rather than prose and pad the definition somewhat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the return values need not be fully documented, and the description still summarises what comes back (topics, ordered tools, local portals, caveats). Combined with rich annotations, an agent has everything needed to call it correctly; only the trailing keyword blocks are surplus.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains lang fully (fr localises labels, purposes, caveats and guidance while tool and argument names stay unchanged), and 'question' is self-evident from the example given. The lang explanation is the meaningful addition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (plan) and resource (which sources answer a question), and scopes it as cross-agency/cross-source. It distinguishes itself from both siblings by contrast: call_tool runs the plan's steps and search_tools finds a single tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('the first call on a substantive question', with a concrete example) and when not to ('Use search_tools instead to find a single tool for a narrow, single-source need'). It also hands off downstream behaviour to call_tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_toolsSearch toolsARead-onlyIdempotent
Find the right data tool for one specific need by plain-language search.
Use for: locating a tool when you know roughly what data you want (a StatCan table, Bank of Canada series, a city's open-data portal). Returns the best-matching tool definitions, ranked by relevance, each with its name, description and full input schema, in the same format as list_tools. Read-only; it searches this server's catalogue only and calls no external API. Use plan_query instead when a question may span several sources or you do not know where to start; use call_tool to run a tool once you have its name. Queries in English or French both work. An empty result means no tool matched: rephrase with topic words (e.g. 'housing starts' rather than 'CMHC table').
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | What you need, in plain English or French, e.g. 'Calgary rent index' or 'taux de chômage Québec'. Topic words work better than tool names. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly/openWorld=false/idempotent), and the description adds genuinely new behavior: it searches only this server's catalogue, calls no external API, returns ranked best-matching tool definitions in list_tools format, and defines the empty-result case with recovery advice. These are traits the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by use-for, boundaries, alternatives, and an edge-case recovery line. Every sentence carries distinct operational information with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter search tool with an output schema and full annotation coverage, nothing an agent needs is missing: trigger, scope, return shape, ranking behavior, language support, and failure recovery are all stated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single query parameter is already well documented, so the baseline is 3. The description adds meaningful strategy beyond the schema: queries work in English or French, and topic words beat tool names, which shapes how an agent should phrase the argument.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (find/search) and resource (data tool) plus the scoping constraint that it searches this server's catalogue only. It explicitly names what it is not (plan_query, call_tool), so an agent can distinguish it from siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit 'Use for' trigger, then hands off with conditions: 'use plan_query instead when a question may span several sources or you do not know where to start' and 'use call_tool to run a tool once you have its name.' That is the full when/when-not/alternative set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.2.0- Changed
plan_query2 fields changed- added
Output schema / properties / out_of_scopeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Set when the question is about a place outside Canada that this server has no data for; topics and fallback steps are then empty." +} - added
Output schema / properties / provenance / properties / licenceAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Licence and attribution the upstream publisher requires, when it has one (set for every Statistics Canada result)." +}
2 tool updates
v0.1.1- Changed
call_tool2 fields changed- changed
Input schema / properties / arguments / descriptionPrevious value: -"Arguments to pass to the tool"New value: +"Object matching that tool's inputSchema from search_tools. Omit or pass {} for a tool with no required parameters." - changed
Input schema / properties / name / descriptionPrevious value: -"The name of the tool to call"New value: +"Exact tool name as returned by search_tools or plan_query, e.g. 'boc_get_observations'."
- Changed
search_tools1 field changed- changed
Input schema / properties / query / descriptionPrevious value: -"Natural language query to search for tools"New value: +"What you need, in plain English or French, e.g. 'Calgary rent index' or 'taux de chômage Québec'. Topic words work better than tool names."
3 tool updates
v0.1.0- First observed
call_tool - First observed
plan_query - First observed
search_tools
TDQS
Scored across 3 tools
The three tools occupy distinct roles: plan_query for multi-source research planning, search_tools for locating a single tool, call_tool for execution. The descriptions explicitly cross-reference each other with 'use X instead' guidance, though plan_query and search_tools both serve discovery and could occasionally be confused by an agent unsure of question scope.
All three tools follow a clean verb_noun snake_case pattern (plan_query, search_tools, call_tool) with no mixing of conventions or vague verbs. The naming is fully predictable and readable.
Three tools is at the low end but well-matched to a router/meta-layer server whose real data tools are discovered dynamically rather than enumerated as fixed tools. The plan-search-execute trio is coherent and each earns its place, though the surface is minimal.
The meta-lifecycle is covered: planning (plan_query), discovery (search_tools), and execution (call_tool), plus error handling and provenance described. The main gap is no dedicated catalogue-browsing tool, relying on search_tools and the implied list_tools, which could hinder full-surface exploration.
Maintenance
Related MCP Connectors
Curated gateway to snapshot-versioned Canadian public data services with source provenance.
Statistics Canada (StatCan) WDS MCP — Canadian official statistics (no auth)
IBGE: geography, census, economy and health from the official APIs, with provenance. 23 tools.
Official statistics for AI agents: Eurostat, World Bank, OECD, IMF and WHO data for 150+ countries.
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables MCP-compatible clients to access Canadian statistical data from Statistics Canada via WDS and SDMX APIs, including search, download, and analysis capabilities.25102 PyPI7MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to search, explore, and analyze Québec open data (Données Québec, Ville de Montréal, IGO) via natural language, including SQL queries, geocoding, and spatial operations.1MIT
- AlicenseNot gradedqualityFmaintenanceProvides access to Statistics Canada official statistics without authentication, enabling AI agents to query Canadian economic and demographic data.1 npmMIT
- AlicenseAqualityCmaintenanceProvides LLM agents with live access to Canadian economic and financial data (exchange rates, interest rates, inflation, etc.) through the Bank of Canada Valet API, with no API key required.5MIT