Statistics Canada MCP Server
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., "@Statistics Canada MCP Serversearch for labour force statistics"
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.
Statistics Canada MCP Server
MCP server and CLI for Statistics Canada's Web Data Service (WDS) and SDMX REST API. Gives any MCP client — Claude, Cursor, VS Code Copilot, Gemini — structured access to Canadian statistical data. Includes a standalone statcan CLI for direct downloads without an LLM.
Hosted on Render — no install required for most users. See Quick Start.
⚠️ LLMs may fabricate data. Always verify important figures against official Statistics Canada sources.
Table of Contents
Related MCP server: mcp-statcan
Quick Start
Pick the option that fits you. You don't need to install anything for Option 1.
Option 1 — Use the hosted server (recommended)
Connect directly to the public server on Render. No uv, no terminal, no local setup.
Claude Desktop / Claude.ai
Open Settings → Connectors → Add Custom Connector
Name:
mcp-statcanURL:
https://mcp-statcan.onrender.com/mcpSave and restart
Claude Code
claude mcp add statcan --transport http https://mcp-statcan.onrender.com/mcp --scope globalThe hosted server provides all WDS + SDMX tools. Database tools (SQLite) require local setup (Option 3) — they are intentionally excluded from the shared server.
Option 2 — Self-host HTTP (WDS + SDMX, no DB)
Run a local server with the same tools as the hosted version.
Step 1 — Install uv:
# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows (PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"Step 2 — Start the server:
uvx statcan-mcp-server --transport http
# Listening at http://localhost:8000Step 3 — Connect your client to http://localhost:8000/mcp.
Option 3 — Full local setup (WDS + SDMX + SQLite)
Everything from Option 2, plus database tools for storing and querying data with SQL. Runs via stdio.
Step 1 — Install uv (same as above).
Step 2 — Configure your client with the stdio snippets in Setup by Client below.
uvx downloads and runs the server automatically on first use.
Option 4 — statcan CLI (no LLM needed)
Download StatCan data directly from the terminal. See statcan CLI.
uvx statcan-mcp-server # installs the package
statcan search "labour force"
statcan download 14-10-0287-01 --last 12 --output lfs.csvExamples
Chat examples
Dataset | Query | Demo | Source |
Canada's Greenhouse Gas Emissions | "Create a simple visualization for greenhouse emissions for Canada as a whole over the last 4 years" | Chat | Table 38-10-0097-01 |
Canada's International Trade in Services | "Create a quick analysis for international trade in services for the last 6 months with a visualization" | Chat | Table 12-10-0144-01 |
Ontario Building Construction Price Index | "Generate a visualization for Ontario's Building Price index from Q4 2023 to Q4 2024" | Chat | Table 18-10-0289-01 |
Canadian Unemployment Dashboard | "Create a Canadian Unemployment Dashboard using statcan mcp" | Chat | Table 14-10-0287-01 |
Dashboard examples
Title | Link | Source |
Canada's Critical Minerals Economy | Dashboard | Table 36-10-0708-01 |
Price of Everything: CPI Dashboard 2015–2026 | Dashboard | Table 18-10-0004-01 |
Canada's Biomedical & Biotech Industries | Dashboard | Table 27-10-0297-01 |
Setup by Client
Hosted server (Option 1)
Claude Desktop — Settings → Connectors → Add Custom Connector
Name:
mcp-statcanURL:
https://mcp-statcan.onrender.com/mcp
Claude Code
claude mcp add statcan --transport http https://mcp-statcan.onrender.com/mcp --scope globalCursor — .cursor/mcp.json (project) or ~/.cursor/mcp.json (global):
{
"mcpServers": {
"statcan": {
"url": "https://mcp-statcan.onrender.com/mcp"
}
}
}VS Code (GitHub Copilot) — .vscode/mcp.json:
{
"servers": {
"statcan": {
"type": "http",
"url": "https://mcp-statcan.onrender.com/mcp"
}
}
}Self-hosted HTTP (Option 2)
Start
uvx statcan-mcp-server --transport httpfirst, then configure your client.
Most clients need mcp-proxy to bridge stdio ↔ HTTP. Claude Code connects natively.
Claude Desktop — Settings → Developer → Edit Config:
{
"mcpServers": {
"statcan": {
"command": "uvx",
"args": ["mcp-proxy", "--transport", "streamablehttp", "http://localhost:8000/mcp"]
}
}
}Claude Code
claude mcp add statcan --transport http http://localhost:8000/mcp --scope globalCursor / VS Code / Gemini — same mcp-proxy wrapper, pointing to http://localhost:8000/mcp.
Full local / stdio (Option 3)
Claude Desktop — Settings → Developer → Edit Config:
{
"mcpServers": {
"statcan": {
"command": "uvx",
"args": ["statcan-mcp-server", "--db-path", "/Users/<you>/.statcan-mcp/statcan_data.db"]
}
}
}Pass
--db-pathwith an absolute path. Claude Desktop overrides the subprocessHOMEenv var, which can break default path resolution.
Claude Code
claude mcp add statcan --scope global -- uvx statcan-mcp-serverCursor / VS Code / Gemini — use uvx statcan-mcp-server as the stdio command.
How Claude.ai Uses This Server
Claude.ai (web) has no bash sandbox — it can't run shell commands. Instead, it uses MCP tools for discovery and its Python script tool to fetch data without bloating the context window.
The pattern:
1. MCP tools (small payloads — metadata only):
search_cubes_by_title("labour force") → productId
get_sdmx_structure(productId=...) → dimension layout + codes
get_sdmx_key_for_dimension(...) → OR key for large dimensions
2. Python script (data never enters context):
url = "https://mcp-statcan.onrender.com/files/sdmx/<pid>/<key>?lastNObservations=12"
→ validate URL domain → write to ./statcan_<pid>.csv → print summary only
3. Follow-up script (analysis from local file):
rows = list(csv.DictReader(open("./statcan_<pid>.csv")))
→ filter / sort / aggregate → print only the resultget_sdmx_data on the hosted server always returns a download_csv URL instead of inline data — data stays out of the context window regardless of response size.
Claude Code (bash sandbox) uses the statcan CLI instead:
statcan search "labour force"
statcan download 14-10-0287-01 --last 12 --output ./lfs.csv
awk -F',' 'NR>1 && $1=="Canada"' ./lfs.csv | sort -t',' -rn -k5 | head -10MCP Prompts
The server ships five prompts accessible as slash commands in supported clients. Each has dual instructions — Claude Code (bash) and Claude.ai web (Python script).
Prompt | What it teaches |
| End-to-end: search → structure → build key → fetch to local file → analyze |
| SDMX key syntax: wildcards, OR keys, time parameters, download URL format |
| Download a specific table: CLI commands + Python script alternative |
| Sample before committing: 3-period fetch, column layout, size estimate |
| Multi-series download and cross-series comparison |
Usage in Claude Code:
/statcan-data-lookup topic="consumer price index" analysis_goal="trend last 5 years"
/statcan-download product_id=18100004 last_n=24statcan CLI
A standalone CLI for downloading StatCan data without an LLM. Outputs pipe-friendly CSV/JSON to stdout; progress and errors go to stderr.
Install:
pip install statcan-mcp-server # or: uvx statcan-mcp-server (no install)Commands:
statcan search <term> Search tables by keyword
statcan metadata <product-id> Show table structure (dimensions + members)
statcan download <product-id> Download observations via SDMX
statcan vector <vector-id>... Download one or more vector series
statcan codeset Show StatCan code definitions (UOM, frequency, etc.)Common usage:
# Find a table
statcan search "consumer price index"
statcan search "labour force" --max-results 10 --format json
# Inspect structure before downloading
statcan metadata 18-10-0004-01
statcan metadata 18100004 --full # show all dimension members
# Download data
statcan download 18-10-0004-01 --last 12 --output cpi.csv
statcan download 18-10-0004-01 --key "1.1.1" --start 2020-01 --end 2024-12
statcan download 18-10-0004-01 --last 5 --dry-run # preview SDMX URL
# Download by vector ID
statcan vector v41690973 --last 24 --output series.csv
statcan vector v41690973 v41690974 --last 12 --output multi.csv
# Decode numeric codes
statcan codeset --type uom
statcan codeset --type frequency --format jsonOutput formats: csv (default for download/vector), table (default for search/metadata/codeset), json
Pipe patterns:
# Top 10 by value
statcan download 14-10-0287-01 --last 1 --format csv \
| awk -F',' 'NR>1' | sort -t',' -k5 -rn | head -10
# Extract unique geographies
statcan download 14-10-0287-01 --last 1 --format csv \
| awk -F',' 'NR>1 {print $1}' | sort -u
# Chain search → download
PID=$(statcan search "CPI" --format json | python3 -c "import sys,json; print(json.load(sys.stdin)[0]['Product ID'])")
statcan download $PID --last 12 --output cpi.csvFor the complete CLI reference see cli.md.
Features & Tools
SDMX Tools — server-side filtered data fetch
Only the slice you request is returned. No downloading full tables.
Tool | Description |
| Dimension codelists + key syntax for a table. Call before |
| Filtered observations by |
| Observations for a single vectorId via SDMX. |
| All leaf member IDs for a large dimension as a ready-to-paste OR key. Use when a dimension has >30 codes (e.g. NOC, CMAs). |
Key syntax (passed to get_sdmx_data):
"1.2.1"— Geography=1, Gender=2, Age=1".2.1"— all geographies (wildcard), Gender=2, Age=1"1+2.2.1"— Geography 1 or 2, Gender=2, Age=1
Note: Wildcard (
.) on dimensions with >30 codes returns a sparse, unpredictable sample. Useget_sdmx_key_for_dimensionto get the correct OR key.
WDS Discovery & Metadata
Tool | Description |
| Full-text search across all StatCan tables. AND logic, capped at 25 results. |
| Paginated table inventory ( |
| Dimension info, member lists, date ranges. |
| Decode StatCan numeric codes (frequency, UOM, scalar factor, status). |
WDS Series Resolution & Change Detection
Tool | Description |
| Resolve |
| Resolve a vectorId to productId, coordinate, titles, frequency. |
| Tables updated on a specific date. |
| Series updated on a specific date. |
| Data points that changed for a coordinate. |
| Data points that changed for a vectorId. |
| Multiple vectors filtered by release date range. |
Composite & Database Tools (local/stdio mode only)
These tools are not available on the hosted Render server — SQLite is per-process and not shared across users.
Tool | Description |
| Fetch vectors by reference period range and store to SQLite. |
| Fetch full cube metadata into SQLite — browse all members and vectorIds with SQL. |
| Read-only SQL against the local SQLite database. |
| Create or append to a table. |
| Database utilities. |
Typical workflow
Claude.ai web (hosted server):
1. search_cubes_by_title("unemployment rate")
→ productId e.g. 14100287
2. get_sdmx_structure(productId=14100287)
→ dimension positions + sample codes
3. get_sdmx_key_for_dimension(productId=14100287, dimension_position=3)
→ or_key for large dimensions
4. get_sdmx_data(productId=14100287, key=".2.1", lastNObservations=24)
→ returns download_csv URL
5. Python script: validate URL domain → write to ./statcan_14100287.csv → analyze → print summaryClaude Code (bash sandbox):
statcan search "unemployment rate"
statcan metadata 14100287
statcan download 14-10-0287-01 --last 24 --output ./lfs.csv
awk -F',' 'NR>1 && $1=="Canada"' ./lfs.csv | sort -t',' -rn -k5 | head -10Project Structure
src/
├── api/
│ ├── cube/
│ │ ├── discovery.py # search_cubes_by_title, get_all_cubes_list
│ │ ├── metadata.py # get_cube_metadata
│ │ └── series.py # get_series_info, change detection
│ ├── vector/
│ │ └── vector_tools.py # vector series, bulk range fetch
│ ├── sdmx/
│ │ └── sdmx_tools.py # get_sdmx_structure, get_sdmx_data, get_sdmx_key_for_dimension
│ ├── composite_tools.py # fetch_vectors_to_database, store_cube_metadata (stdio only)
│ └── metadata_tools.py # get_code_sets
├── cli/
│ ├── main.py # statcan CLI entry point (Typer app)
│ ├── output.py # write_output, format helpers
│ └── commands/
│ ├── search.py # statcan search
│ ├── metadata.py # statcan metadata
│ ├── download.py # statcan download
│ ├── vector.py # statcan vector
│ └── codeset.py # statcan codeset
├── db/ # SQLite connection, schema, queries (stdio only)
├── models/ # Pydantic input models
├── util/
│ ├── registry.py # ToolRegistry — @decorator → MCP Tool schema
│ ├── truncation.py # Response truncation + pagination guidance
│ ├── sdmx_json.py # SDMX-JSON → tabular rows
│ └── cache.py # 1-hour TTL cache for cube list
├── config.py # BASE_URL, SDMX_BASE_URL, RENDER_BASE_URL, TRANSPORT, PORT
└── server.py # create_server(), MCP Prompts, HTTP routes (/files/sdmx/), CLIKnown Issues
Issue | Status | Workaround |
"Unable to open database file" on Claude Desktop | Active | Pass |
SSL verification disabled | Active |
|
| Active | Use one or the other, not both |
OR syntax for Geography dimension unreliable | Active | Use wildcard ( |
Wildcard returns sparse data for large dimensions | Mitigated | Use |
Context overflow may cause data fabrication | Mitigated | Hosted server returns |
Available Tools
25 toolscreate_table_from_dataA
Creates a new SQLite table from the provided data AND immediately inserts all rows. Infers column names and types from the first item in the data list. WARNING: Overwrites the table if it already exists.
Use this as a single step to store fetched API data — no need to call insert_data_into_table afterwards. Use insert_data_into_table only to append more rows to an already-existing table.
Args: table_input: Object containing table_name and data (list of dicts).
Returns: Dict[str, Any]: A summary with table name, columns created, and rows inserted.
IMPORTANT: The database is persistent and does NOT clean itself automatically. This tool overwrites the table if it exists, giving you a clean slate each call.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Data to insert, as a list of dictionaries. | |
| table_name | Yes | Name for the SQL table (alphanumeric and underscores recommended). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It discloses critical behaviors: overwriting existing tables ('WARNING: Overwrites the table if it already exists'), persistence without auto-cleanup, column inference from the first data item, and immediate row insertion. This goes well beyond a minimal description.
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?
The description is front-loaded with the core purpose and contains useful sections (warning, usage, returns). It is slightly redundant—'IMPORTANT' repeats the overwrite warning—and the inaccurate 'Args' section adds confusion. Overall it is well-structured but could be tightened.
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 mutating database tool with no annotations and no output schema, the description covers the essential aspects: what it does, how it infers schema, overwriting behavior, return summary, and distinction from append tool. It lacks details on error handling or atomicity, but is sufficient for most agent use cases.
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?
The schema already covers both parameters (100% coverage). However, the description's 'Args' line says 'table_input: Object containing table_name and data', which contradicts the schema's flat structure of top-level table_name and data. This could mislead the agent into passing a nested object, and no additional parameter semantics are provided.
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 description opens with a specific verb+resource: 'Creates a new SQLite table from the provided data AND immediately inserts all rows.' This clearly distinguishes it from the sibling insert_data_into_table by stating it is a single-step operation and explicitly directs users to the alternative for appending rows.
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 when-to-use guidance is provided: 'Use this as a single step to store fetched API data — no need to call insert_data_into_table afterwards. Use insert_data_into_table only to append more rows to an already-existing table.' This names the alternative tool and specifies the exact use case for each.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drop_tableA
Permanently deletes (drops) a table from the SQLite database.
Use this to free up space or remove tables that are no longer needed. This action is irreversible — all data in the table will be lost.
Args: table_name_input: Object containing the table_name to drop.
Returns: Dict[str, Any]: A dictionary indicating success or an error message.
| Name | Required | Description | Default |
|---|---|---|---|
| table_name | Yes | Name of the SQL table. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It explicitly discloses the irreversible nature and complete data loss ('This action is irreversible — all data in the table will be lost'), which is critical for a destructive operation. It also mentions the return format. However, it does not detail other side effects like cascading deletes or error conditions, so it is not a perfect 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?
The description is concise and front-loads the primary purpose, followed by usage context, a warning, and then parameter/return details. However, the 'Args' section contains a naming mismatch ('table_name_input' vs 'table_name') that detracts from clarity, preventing a perfect score.
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 destructive tool with no output schema, the description adequately covers the key behavioral context (irreversibility, data loss), the return type (success or error), and the use case. It does not discuss edge cases like table non-existence or permission requirements, but given the tool's simplicity, this is sufficient. A score of 4 is appropriate.
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?
The schema already covers 100% of the single parameter (table_name) with a clear description. The tool description's 'Args' section introduces 'table_name_input' instead of the schema's 'table_name', which is a minor inconsistency. It adds little semantic value beyond what the schema provides, so a baseline score of 3 applies.
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 description clearly states the tool 'permanently deletes (drops) a table from the SQLite database', using a specific verb and resource. It also explains the use case ('free up space or remove tables that are no longer needed'), which distinguishes it from the many read-oriented sibling tools.
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?
The description provides clear context on when to use the tool ('free up space or remove tables that are no longer needed'), but it does not explicitly contrast it with alternatives or mention when not to use it. This is a clear context without exclusions, fitting the '4' level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_vectors_to_databaseA
PREFERRED tool for multi-series analysis. Fetches data for multiple StatCan vector IDs in a single API call and immediately stores the results in a SQLite table — no separate create/insert steps needed.
*** USE THIS TOOL whenever you need data for multiple provinces, age groups, industries, or any other breakdown. It replaces the slow pattern of calling get_data_from_cube_pid_coord_and_latest_n_periods once per series. ***
Typical workflow:
search_cubes_by_title("unemployment rate") → find productId
get_cube_metadata(productId=...) → find vectorIds for each series you want
fetch_vectors_to_database( vectorIds=["v111","v222","v333"], table_name="unemployment_by_province", startRefPeriod="2023-01-01", endRefPeriod="2024-12-31" ) ← single call fetches + stores everything
query_database("SELECT * FROM unemployment_by_province") → analyze
Args: input_data.vectorIds: List of vector IDs to fetch (strings, e.g. ["111","222"]). input_data.table_name: SQLite table to create and populate. input_data.startRefPeriod: Optional start date (YYYY-MM-DD). input_data.endRefPeriod: Optional end date (YYYY-MM-DD).
Returns: Dict with table name, columns, rows_inserted, and a 5-row sample so you can verify the data looks right before querying.
IMPORTANT: In your final response cite the vectorIds and reference period used.
| Name | Required | Description | Default |
|---|---|---|---|
| vectorIds | Yes | List of StatCan vector IDs to fetch (e.g. ['111', '222', '333']). Get these from get_cube_metadata → dimension members → vectorId field. | |
| table_name | Yes | Name of the SQLite table to create and populate. Use snake_case, e.g. 'unemployment_by_province'. | |
| sample_size | No | Number of sample rows to include in the response preview. Default 5. | |
| endRefPeriod | No | End of the reference period to fetch, inclusive. Format: YYYY-MM-DD. | |
| startRefPeriod | No | Start of the reference period to fetch, inclusive. Format: YYYY-MM-DD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries full burden. It discloses the side effect (SQLite table write), the return format (dict with table_name, columns, rows_inserted, sample), and a specific instruction to cite vectorIds and reference period in the final response. However, it does not state behavior if the table already exists or whether the operation is transactional, which is a modest gap.
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?
The description is well-structured with clear sections (preferred usage, workflow, args, returns, important note) and front-loads the core purpose. It is somewhat verbose but every section serves a purpose; there is minimal redundancy (e.g., 'single call' is repeated) which keeps it from a perfect 5.
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?
With 5 parameters, no output schema, and no annotations, the description is remarkably complete: it explains the return value shape, gives a concrete code example, defines the workflow, and includes an important citation instruction. It gives an agent everything needed to invoke the tool correctly and interpret results.
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%, and the schema already explains each parameter (vectorIds, table_name, sample_size, startRefPeriod, endRefPeriod). The description's Args block restates the same information without adding substantive detail beyond what the schema provides, so the baseline of 3 applies.
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 description clearly states a specific action: 'Fetches data for multiple StatCan vector IDs in a single API call and immediately stores the results in a SQLite table'. It explicitly contrasts with the slower per-series pattern, distinguishing it from sibling tools like get_data_from_cube_pid_coord_and_latest_n_periods and create_table_from_data + insert_data_into_table.
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?
The description provides explicit when-to-use guidance: 'USE THIS TOOL whenever you need data for multiple provinces, age groups, industries, or any other breakdown.' It also provides a step-by-step workflow showing the tool's place in the pipeline and names the alternative it replaces, giving the agent clear decision criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_all_cubes_listA
Provides a complete inventory of data tables available via the API, including dimension-level details. Disables SSL Verification. Corresponds to: GET /getAllCubesList
Results are paginated. Default returns first 100 cubes. Use offset/limit to page through. Prefer search_cubes_by_title if you know what you're looking for.
IMPORTANT: In your final response to the user, you MUST cite the source of your data. For cubes, this means including the ProductId (pid) and the Title.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max cubes to return. Default 100. | |
| offset | No | Number of cubes to skip (for pagination). Default 0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries full weight. It discloses critical behavioral traits: SSL is disabled (a security-relevant warning), results are paginated, and the final response must cite the ProductId and Title. This is exemplary transparency for a listing tool.
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?
The description is well-structured and front-loaded: it states the core purpose first, then adds endpoint mapping, behavioral notes, pagination, alternative, and a final citation requirement. Every sentence contributes new information without redundancy. It is compact yet complete.
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?
Despite the lack of annotations and output schema, the description covers all essential operational aspects: what the tool returns, pagination with defaults, the SSL warning, the preferred alternative, and citation requirements. For a list endpoint with only two parameters, this is remarkably complete.
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?
The input schema fully documents both parameters (limit and offset) with defaults and descriptions. The description only reiterates the pagination pattern already captured in the schema, adding no new semantic meaning. Baseline 3 is appropriate because the schema handles parameter semantics completely.
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 description clearly states the tool provides a complete inventory of data tables with dimension-level details, and it explicitly distinguishes itself from the sibling search_cubes_by_title by positioning itself as the broad-list alternative. The specific verb 'provides' and resource 'data tables' make the purpose unambiguous.
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?
The description gives clear usage context: it is for browsing the full inventory, with pagination instructions. It explicitly says to prefer search_cubes_by_title when looking for a specific cube, providing an alternative. This exceeds the minimum and fully clarifies when to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_all_cubes_list_liteA
Provides a complete inventory of data tables available via the API, excluding dimension or footnote information (lighter version). Disables SSL Verification. Corresponds to: GET /getAllCubesListLite
Results are paginated. Default returns first 100 cubes. Use offset/limit to page through. Prefer search_cubes_by_title if you know what you're looking for.
IMPORTANT: In your final response to the user, you MUST cite the source of your data. For cubes, this means including the ProductId (pid) and the Title.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max cubes to return. Default 100. | |
| offset | No | Number of cubes to skip (for pagination). Default 0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosure. It reveals important behaviors: disables SSL verification, excludes dimension/footnote info, paginates with defaults, and mandates source citation. However, it omits details about response structure or error semantics, which would further enhance transparency.
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?
The description is well-structured: it opens with the main purpose, then key caveats, then pagination details, followed by a clear alternative, and ends with an important citation requirement. Every sentence earns its place, and the information is front-loaded.
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 listing tool with no output schema, the description is complete. It covers the tool's scope (inventory of tables), exclusions (dimension/footnote), pagination behavior, a relevant alternative, and a required citation practice. No critical gaps remain.
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 description only reinforces the existing parameter documentation (offset/limit for pagination). It adds no new meaning beyond the schema's own descriptions, so the baseline of 3 applies.
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 description clearly states the tool's primary function: 'Provides a complete inventory of data tables available via the API', and differentiates it from siblings by noting it excludes dimension/footnote information ('lighter version'). It also explicitly mentions the corresponding endpoint, reinforcing its specific purpose.
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?
The description provides explicit usage guidance by stating 'Prefer search_cubes_by_title if you know what you're looking for,' which names an alternative and gives a clear condition for choosing it. It also explains pagination usage with offset/limit, giving actionable context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bulk_vector_data_by_rangeA
Fetches bulk data for multiple vectors filtered by release date range (YYYY-MM-DDTHH:MM), NOT by reference period. Use this when you want data released within a specific date/time window (e.g., "all updates released yesterday").
*** IMPORTANT: release date vs reference period ***
Use THIS tool when you want: "data released between date A and date B"
Use get_sdmx_vector_data (startPeriod/endPeriod) when you want: "data for the time period YYYY to YYYY" get_sdmx_vector_data is more reliable and filters by reference period, not release date.
*** LARGE RESPONSE WARNING *** This tool can return hundreds of flattened data points. If the response exceeds context limits, narrow the request: use fewer vectorIds, or use offset/limit pagination to page through results in smaller chunks.
Response is pre-flattened: each element is one data point with vectorId, productId, coordinate, and all value fields injected at the top level.
Disables SSL Verification. Corresponds to: POST /getBulkVectorDataByRange
Returns: List[Dict[str, Any]]: Flat list of data point dicts, each tagged with vectorId, productId, and coordinate. Raises: httpx.HTTPStatusError: If the API returns an error status code. ValueError: If the API response format is unexpected or no vectors return SUCCESS. Exception: For other network or unexpected errors.
IMPORTANT: In your final response to the user, you MUST cite the source of your data. For vector data, this means including the VectorId and Release Time.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max rows to return. Default 50. Set higher to get more rows. | |
| offset | No | Number of rows to skip (for pagination). Default 0. | |
| vectorIds | Yes | List of integer vector IDs (e.g. [42076, 41690973]). | |
| endDataPointReleaseDate | No | ||
| startDataPointReleaseDate | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses that SSL verification is disabled, describes the response pre-flattened format, lists all raised exceptions (HTTPStatusError, ValueError, Exception), and mandates citing VectorId and Release Time in responses. This is thorough for a read-only data fetch tool.
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?
The description is relatively long but every section adds value: warnings about release-date confusion, large responses, SSL, return format, exceptions, and citation requirement. The use of headings and bullet points improves scannability, making the length justified.
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?
The description is fully self-contained for a complex tool: it explains the core distinction from siblings, the response structure, error conditions, pagination advice, and a mandatory citation rule. Since there is no output schema and no annotations, this description provides all necessary context for an agent to select and invoke the tool correctly.
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 covers 60% of parameters (limit, offset, vectorIds). The description adds crucial semantic clarity for the two date parameters (start/endDataPointReleaseDate) by explaining they are release dates formatted as YYYY-MM-DDTHH:MM, and clarifies how limit/offset relate to pagination. This compensates well for the schema gap.
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 description clearly states the tool fetches bulk data for multiple vectors filtered by release date range, explicitly distinguishing it from get_sdmx_vector_data which filters by reference period. The verb 'fetches' is specific and the resource/scope is well-defined.
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?
The description provides explicit guidance on when to use this tool (data released within a date/time window) versus when to use get_sdmx_vector_data (reference period), and even notes that get_sdmx_vector_data is more reliable. It also warns about large responses and recommends narrowing with fewer vectorIds or using offset/limit pagination.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_changed_cube_listA
Get the list of data tables/cubes that were updated on a specific date (YYYY-MM-DD). Disables SSL Verification. Corresponds to: GET /getChangedCubeList/{date}
Returns: List[Dict[str, Any]]: A list of dictionaries describing changed cube objects.
IMPORTANT: In your final response to the user, you MUST cite the source of your data. For changed cubes, this means including the ProductId (pid) and Title.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important behavioral traits including disabled SSL verification, the corresponding REST endpoint, and a mandatory citation requirement with ProductId and Title. With no annotations provided, this information is valuable for safe and correct use.
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?
The description is well-structured with a clear lead sentence, endpoint mapping, return type, and an important usage note. Every line contributes meaningful information without redundancy.
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 simple one-parameter GET tool, the description adequately covers the operation, return type, and data attribution requirements. It lacks explicit alternative guidance and error handling details, but is otherwise complete for the tool's complexity.
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?
The schema only specifies a date string, while the description adds the required format (YYYY-MM-DD) and clarifies that the date refers to the update date. This compensates for the 0% schema coverage and provides essential context for the single parameter.
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 description clearly states the tool retrieves a list of data tables/cubes that were updated on a specific date, using a specific verb and resource. The 'changed' qualifier distinguishes it from sibling tools like get_all_cubes_list and get_changed_series_list.
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?
The description implies usage for date-specific changed cubes but does not explicitly mention alternatives or when not to use this tool. There is no direct comparison with sibling tools such as get_all_cubes_list or get_changed_series_list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_changed_series_data_from_cube_pid_coordA
Retrieves changed series data (data points that have changed) using Cube ProductId and Coordinate string. Coordinates are automatically padded to 10 dimensions. Disables SSL Verification. Corresponds to: POST /getChangedSeriesDataFromCubePidCoord
Returns: Dict[str, Any]: A dictionary containing the changed series data object. Raises: httpx.HTTPStatusError: If the API returns an error status code. ValueError: If the API response format is unexpected or status is not SUCCESS. Exception: For other network or unexpected errors.
IMPORTANT: In your final response to the user, you MUST cite the source of your data. For changed series data, this means including the VectorId, ProductId (pid), and Coordinate.
| Name | Required | Description | Default |
|---|---|---|---|
| productId | Yes | ||
| coordinate | Yes | Coordinate string (e.g., '1.1'). Padding to 10 dimensions is handled automatically. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses several notable behaviors: automatic padding to 10 dimensions, disabling SSL verification, the return type (Dict[str, Any]), and specific exceptions (httpx.HTTPStatusError, ValueError, Exception). It also includes an important citation requirement for the final response. This is strong transparency for a read operation, though it does not mention any potential side effects or permission requirements.
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?
The description is well-structured and appropriately sized for a tool with error handling and usage notes. It starts with the core purpose, then lists the endpoint, return type, exceptions, and an important usage note. The only redundancy is the coordinate padding mention, which also appears in the schema, but this does not significantly detract from the overall clarity.
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 tool with no output schema and no annotations, the description provides a good amount of context: it explains the purpose, endpoint, return type, error conditions, and a critical citation requirement. It lacks a concrete example of the return value and does not discuss rate limits or pagination, but given the tool's simplicity and the presence of exception documentation, it is reasonably complete.
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 50%, with coordinate having a description but productId having none. The tool description adds semantic meaning by clarifying that productId is a 'Cube ProductId' (a cube identifier) and mentions coordinate padding, which partially compensates for the schema gap. However, it does not explain how to obtain or validate productId, leaving some ambiguity. The coordinate format is already covered in the schema, so the description adds limited extra value.
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 description clearly states the tool's action: 'Retrieves changed series data (data points that have changed) using Cube ProductId and Coordinate string.' This is a specific verb and resource, and the mention of using both ProductId and Coordinate distinguishes it from sibling tools like get_changed_series_data_from_vector and get_changed_series_list.
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?
The description implies usage by specifying the input method (ProductId and Coordinate) and references the corresponding POST endpoint. However, it does not explicitly state when to use this tool over alternatives such as get_changed_series_data_from_vector, nor does it provide exclusions or alternative suggestions. The guidance is mostly implicit from the tool name and description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_changed_series_data_from_vectorB
Get changed series data (data points that have changed) for a series identified by Vector ID. Disables SSL Verification. Corresponds to: POST /getChangedSeriesDataFromVector
Returns: Dict[str, Any]: A dictionary containing the changed series data object. Raises: httpx.HTTPStatusError: If the API returns an error status code. ValueError: If the API response format is unexpected or status is not SUCCESS. Exception: For other network or unexpected errors.
IMPORTANT: In your final response to the user, you MUST cite the source of your data. For changed series data, this means including the VectorId.
| Name | Required | Description | Default |
|---|---|---|---|
| vectorId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and discloses key behaviors: it 'Disables SSL Verification,' notes the HTTP endpoint, specifies return type, and lists possible exceptions. It also includes an important instruction about citing the VectorId, which is useful context beyond basic functionality.
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?
The description is well-structured with sections for purpose, endpoint, returns, raises, and an important note. It is slightly verbose but each sentence serves a purpose, though the phrase 'data points that have changed' is redundant with the tool name.
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 tool with one parameter, no annotations, and no output schema, the description covers purpose, security behavior, endpoint, return type, exceptions, and a usage instruction. It lacks parameter semantics and detailed return structure, but overall provides a solid context for invocation.
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%, yet the description does not explain the 'vectorId' parameter beyond its name. It repeats 'Vector ID' without providing details on format, range, or how to obtain it, adding no semantic value over the schema.
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 description clearly states 'Get changed series data (data points that have changed) for a series identified by Vector ID,' specifying a distinct verb, resource, and identifier. It differentiates from siblings like get_changed_series_data_from_cube_pid_coord, which uses a different identification method.
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?
The description provides no guidance on when to use this tool versus alternatives, nor mentions any sibling tools or exclusions. It only describes the operation itself, leaving the agent to infer applicability from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_changed_series_listA
Get the list of series (vectorId, productId, coordinate, releaseTime) that were updated on a specific date (YYYY-MM-DD). Disables SSL Verification. Corresponds to: GET /getChangedSeriesList/{date}
Returns: List[Dict[str, Any]]: A list of dictionaries describing changed series objects. Raises: httpx.HTTPStatusError: If the API returns an error status code. ValueError: If date format is invalid or API response format is unexpected. Exception: For other network or unexpected errors.
IMPORTANT: In your final response to the user, you MUST cite the source of your data. For changed series, this means including the VectorId.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so description fully carries the burden. Discloses SSL verification disabled, lists exception types, and mandates citation of VectorId. This goes beyond basic read-op disclosure.
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?
Starts with the main purpose, then adds relevant details. A bit verbose with the exception list, but all sentences contribute to understanding. Well-organized.
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-param tool with no output schema, description covers return type, fields, and exceptions. Could include an example, but overall complete enough.
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 only has a bare string 'date' with 0% coverage. Description adds the required format (YYYY-MM-DD) and endpoint path, making the parameter's meaning clear.
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?
Clearly states it gets the list of series updated on a date, with specific fields (vectorId, productId, coordinate, releaseTime) and the endpoint. Distinguishes from siblings like get_changed_cube_list by focusing on series.
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?
Provides clear context: use to get a list of changed series for a specific date. No explicit alternatives or exclusions, but the scope is well-defined and the endpoint is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_code_setsA
Retrieves definitions for various code sets used by the API (e.g., frequency, units of measure). Corresponds to: GET /getCodeSets
Returns: Dict[str, Any]: Dictionary containing code set definitions (scalar, frequency, etc.). Raises: httpx.HTTPStatusError: If the API returns an error status code. ValueError: If the API response format is unexpected. Exception: For other network or unexpected errors.
IMPORTANT: In your final response to the user, you MUST cite the source of your data. For code sets, this means specifying which code set table or definition is being used.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses return type and possible exceptions (httpx.HTTPStatusError, ValueError) and a citation requirement, but does not explicitly state read-only behavior or any auth requirements.
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?
The description is moderately sized with a clear first sentence and structured sections for returns/raises/notes. It is not overly verbose but includes standard exception boilerplate.
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?
Given the lack of annotations and output schema, the description provides return type and error types, but does not detail the dictionary structure or list available code sets, leaving some gaps for a complete understanding.
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?
Input schema has 0 parameters, so baseline is 4. The description adds no parameter-specific information, which is appropriate.
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 description clearly states 'Retrieves definitions for various code sets used by the API' with examples, making the purpose unambiguous and distinguishing it from sibling tools that deal with cubes, tables, or SDMX.
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?
The description provides no explicit when-to-use guidance or alternative tools, though the purpose implies usage for code set definitions. No exclusions or alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cube_metadataA
Retrieves detailed metadata for a specific data table/cube using its ProductId. Includes dimension info, titles, date ranges, codes, etc. Disables SSL Verification. Corresponds to: POST /getCubeMetadata
Start with summary=True (default). The summary strips noise (French translations, archive codes, footnotes) and shows only 3 sample members per dimension with _next_steps guidance. Safe for all context window sizes. Set summary=False only if you need the full raw member list or all API fields.
To browse dimension codes for get_sdmx_data key construction, use get_sdmx_structure. To resolve a coordinate to a vectorId, use get_series_info.
Returns: Dict[str, Any]: The metadata object for the specified cube on success. Raises: httpx.HTTPStatusError: If the API returns an error status code. ValueError: If the API response format is unexpected or status is not SUCCESS. Exception: For other network or unexpected errors.
IMPORTANT: In your final response to the user, you MUST cite the source of your data. For cubes, this means including the ProductId (pid) and the Title.
| Name | Required | Description | Default |
|---|---|---|---|
| summary | No | When True (default), returns a compact summary: essential cube metadata, dimension names, 3 sample members per dimension, and _next_steps guidance. Set to False only when you need the full raw member list or all API fields. | |
| productId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses a notable behavior: 'Disables SSL Verification.' It also explains the summary mode's behavior (strips French translations, shows 3 sample members, adds _next_steps) and explicitly warns about safe context window sizes. It lists exceptions and even adds a mandatory citation instruction. While it could explicitly state read-only intent, the retriever verb and non-mutating nature are clear enough.
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?
The description is reasonably sized for the tool's complexity and front-loaded with the primary purpose. Each section (endpoint mapping, summary guidance, alternatives, return/raises, citation note) adds value. It is slightly verbose with repetitive emphasis (e.g., summary=True repeated), but overall well-organized and efficient.
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?
Given no output schema and no annotations, the description compensates well. It describes the return type (Dict[str, Any]), explains the summary vs. full modes, lists exceptions, and provides situational guidance (e.g., safe for all context window sizes). The mention of _next_steps guidance and citation requirements gives operational completeness. Nothing essential is missing for an agent to invoke and use the tool correctly.
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 only 50% (summary is described, productId is not). The description goes beyond the schema by thoroughly explaining the summary parameter: 'strips noise (French translations, archive codes, footnotes) and shows only 3 sample members per dimension with _next_steps guidance.' The productId parameter is only mentioned as 'using its ProductId', but the endpoint mapping and citation note ('including the ProductId (pid) and the Title') give additional context. Given the strong added meaning for summary, this is above baseline.
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 description opens with a clear statement of purpose: 'Retrieves detailed metadata for a specific data table/cube using its ProductId.' It lists specific content (dimension info, titles, date ranges, codes) and maps to a concrete endpoint (POST /getCubeMetadata). Sibling differentiation is also explicit via references to get_sdmx_structure and get_series_info, making it easy to distinguish from related tools.
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?
The description provides explicit when-to-use guidance: 'Start with summary=True (default)... Set summary=False only if you need the full raw member list or all API fields.' It also names alternatives for adjacent tasks: 'To browse dimension codes... use get_sdmx_structure. To resolve a coordinate to a vectorId, use get_series_info.' This covers both usage context and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sdmx_dataA
Fetch filtered time-series observations from a StatCan table via SDMX REST.
Filtering is done server-side — only the requested slice is returned. Call get_sdmx_structure first to see dimension positions and valid codes.
Key syntax (dot-separated codes in dimension position order): "1.2.1" = Geography=1 (Canada), Gender=2 (Men+), Age=1 (All ages) ".2.1" = all geographies, Gender=2, Age=1 (wildcard — preferred for multi-geo) "1+2.2.1" = Geography 1 or 2, Gender=2, Age=1 (OR)
IMPORTANT — key position codes:
Use member IDs from get_cube_metadata(), NOT SDMX codelist positions from get_sdmx_structure(). Member IDs and SDMX codelist codes are the same numbers.
Wildcard (omit a position) returns a SPARSE SAMPLE for large dimensions — do NOT use wildcard for dimensions with >30 codes (e.g. NOC occupations, CMA geographies). Use explicit member IDs joined with '+' instead.
To get all leaf IDs for a large dimension as a ready-to-use OR string, call get_sdmx_key_for_dimension(productId, dimension_position) first.
Time filtering (use one or the other, not both): lastNObservations=12 → last 12 periods (e.g. 1 year of monthly data) startPeriod="2020" → from 2020 onwards (annual); "2020-01" for monthly endPeriod="2023-12" → up to Dec 2023
LIMITATION: StatCan rejects combining lastNObservations with startPeriod/endPeriod (returns 406). NOTE: OR syntax (+) triggers a StatCan SDMX-JSON encoding bug (non-positional series keys). This is automatically corrected before rows are returned, so all OR-ed dimension labels should be present.
Output rows contain: dimension values, "period", "value", SCALAR_FACTOR, UOM, VECTOR_ID, STATUS, and other SDMX attributes.
Rows are returned inline, capped at MAX_SDMX_ROWS (500). For larger result sets, narrow the key or use startPeriod/endPeriod/lastNObservations.
IMPORTANT: In your final response to the user, you MUST cite the source of your data. This means including the _sdmx_url, table information and productId/key in your response.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Dot-separated dimension codes in position order (e.g. '1.2.1'). Use '+' for OR ('1+2.2.1' = Geography 1 or 2). Omit a value for wildcard ('.2.1' = all geographies, Gender=2, Age=1). Code numbers match WDS memberIds — no translation needed. Call get_sdmx_structure first to see dimension positions and valid codes. | |
| endPeriod | No | End period in YYYY or YYYY-MM format. | |
| productId | Yes | ||
| startPeriod | No | Start period in YYYY or YYYY-MM format. | |
| lastNObservations | No | Return only the last N observations per series (e.g. 12 for one year of monthly data). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and excels. It discloses server-side filtering, sparse-sample wildcard behavior, the OR-syntax bug and auto-correction, the 406 error when combining lastNObservations with start/endPeriod, the 500-row cap, and the required source citation. This is exemplary behavioral disclosure.
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?
The description is long but exceptionally well-structured with clear sections, examples, warnings, and limitations. Every sentence conveys actionable information; there is no filler. The front-loaded purpose and bolded IMPORTANT notes make it easy to scan and use.
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?
Given the tool's complexity, 5 parameters, no annotations, and no output schema, this description is remarkably complete. It covers input construction, time filtering, output fields, row caps, error behavior, helper-tool usage, and even user-facing citation obligations. It leaves no critical operational gap.
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 80% and the schema already documents key syntax and time parameters. The description adds valuable semantics on top: wildcard sparse sampling, member-ID versus codelist positions, lastNObservations=12 means one year of monthly data, and the rejection when combining time filters. However, productId remains undocumented in both schema and description, which prevents a perfect score.
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 description opens with a specific verb and resource: 'Fetch filtered time-series observations from a StatCan table via SDMX REST.' It immediately clarifies the server-side filtering behavior and distinguishes itself from structural/helper tools by requiring get_sdmx_structure first. This clearly positions the tool among siblings.
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?
The description provides explicit when-to-use and how-to-use guidance: call get_sdmx_structure first, use member IDs instead of SDMX codelist positions, and use get_sdmx_key_for_dimension for large dimensions. It also warns against wildcard use for dimensions with >30 codes and explains time-filter combinations and restrictions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sdmx_key_for_dimensionA
Return all leaf member IDs for a single dimension as a ready-to-use OR key string.
Use this before get_sdmx_data when a dimension has many codes (e.g. 162 NOC minor groups, hundreds of CMA geographies). Avoids the need to call get_cube_metadata and manually parse a large JSON response.
Leaf codes are codes with no children — the lowest-level members in a hierarchy. For flat (non-hierarchical) codelists every code is a leaf.
Example: get_sdmx_key_for_dimension(productId=98100452, dimension_position=6) → { "dimension_id": "Occupation_...", "dimension_name": "Occupation - Minor group - NOC 2021", "position": 6, "leaf_count": 162, "total_count": 309, "or_key": "7+11+12+13+16+18+21+23+...", "note": "Paste or_key at position 6 in your get_sdmx_data key." }
Then use the or_key directly: get_sdmx_data(productId=98100452, key="7.3.1.1.1..1", ...)
| Name | Required | Description | Default |
|---|---|---|---|
| productId | Yes | ||
| dimension_position | Yes | 1-based position of the dimension in the SDMX key (use get_sdmx_structure to find positions). E.g. position=6 for the 6th dot-separated slot. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It explains what 'leaf' means and shows the return structure via example, including the 'or_key' field and its role in the get_sdmx_data key. It does not mention edge cases or error behavior, but core behavior is transparent.
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?
The description is well-structured: purpose, use case, definition, example, and integration. Every sentence earns its place, including the example which clarifies expected input/output. Front-loaded with the main action, making it easy to scan.
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?
Despite no output schema, the example provides a complete picture of the return value. The description covers why to use it, when to use it, how it works, and how to apply the result in get_sdmx_data. It is self-contained for the target task.
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 only 50% (only dimension_position has description). The description compensates by showing productId in the example and explaining dimension_position via the 'Paste or_key at position 6' note. However, productId itself lacks a direct description beyond the example.
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 description opens with a specific verb ('Return') and resource ('leaf member IDs for a single dimension as a ready-to-use OR key string'). It clearly distinguishes itself from siblings like get_sdmx_data (which consumes the key) and get_cube_metadata (which it explicitly avoids).
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?
States exactly when to use it: 'before get_sdmx_data when a dimension has many codes.' It also explains the benefit of avoiding get_cube_metadata, providing an explicit alternative. Includes a concrete example showing how to integrate with get_sdmx_data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sdmx_rowsA
Fetch SDMX observations and always return rows inline — use this when you need to embed data in an artifact or widget.
Use this tool when you need rows embedded directly in an artifact or widget:
Building a chart, table, or widget artifact that needs data at construction time
Sorting/filtering a small result set before embedding
Same key syntax and time parameters as get_sdmx_data — see that tool's description for key construction rules and wildcard warnings.
Rows are capped at MAX_SDMX_ROWS. For large dimensions use get_sdmx_key_for_dimension to build a precise OR key before calling this.
IMPORTANT: In your final response to the user, cite the _sdmx_url, table productId, and key used.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Dot-separated dimension codes in position order (e.g. '1.2.1'). Use '+' for OR ('1+2.2.1' = Geography 1 or 2). Omit a value for wildcard ('.2.1' = all geographies, Gender=2, Age=1). Code numbers match WDS memberIds — no translation needed. Call get_sdmx_structure first to see dimension positions and valid codes. | |
| endPeriod | No | End period in YYYY or YYYY-MM format. | |
| productId | Yes | ||
| startPeriod | No | Start period in YYYY or YYYY-MM format. | |
| lastNObservations | No | Return only the last N observations per series (e.g. 12 for one year of monthly data). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description takes on full behavioral disclosure. It reveals that rows are capped at MAX_SDMX_ROWS, that output is always inline, and that the final response must cite specific fields. It does not mention permissions or error handling, but for a read-only fetch operation these are less critical. The cap and citation requirements are valuable context beyond what annotations would provide.
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?
The description is moderately long but well-organized with bullet points and clear sections. Each sentence adds value: purpose, use cases, syntax reference, row cap, and citation requirement. It could be trimmed slightly but remains efficient for a tool with multiple important constraints.
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?
The tool has no output schema, but the description explains the inline return format, row cap, and citation requirement. It also gives usage context and alternatives. It does not mention error handling or authentication, but for a straightforward fetch operation this is largely sufficient. The complexity is moderate, and the description covers the essential operational details.
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 80%, so most parameters (key, startPeriod, endPeriod, lastNObservations) already have detailed descriptions in the schema. The description adds a cross-reference to get_sdmx_data for key syntax and wildcard warnings, which is helpful, but it does not explain each parameter individually. Baseline 3 is appropriate given the schema's strong coverage.
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 description starts with a specific verb+resource: 'Fetch SDMX observations and always return rows inline' and immediately states the intended use case ('use this when you need to embed data in an artifact or widget'). This clearly distinguishes it from siblings like get_sdmx_data or get_sdmx_vector_data by emphasizing the inline return behavior.
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?
It explicitly tells when to use the tool with concrete examples (building a chart/table/widget, sorting/filtering a small result set). It also points to an alternative for large dimensions (get_sdmx_key_for_dimension) and references get_sdmx_data for syntax rules, providing clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sdmx_structureA
Fetch the Data Structure Definition (DSD) for a StatCan table via SDMX REST.
Returns dimension codelists with code IDs, names, and parent hierarchy. Use this BEFORE get_sdmx_data to understand the key syntax for that table.
Each dimension entry includes:
id: dimension identifier (e.g. "Geography")
position: its slot in the dot-separated key string (1-based)
codelist: the SDMX codelist ID (e.g. "CL_Geography")
codes: list of {id, name, ?parent} — truncated to 10 for large codelists
_code_count / _truncated: total size and truncation flag
Key construction rules:
"1.2.1" = position-1 code 1, position-2 code 2, position-3 code 1
".2.1" = wildcard position 1 (all geographies), Gender=2, Age=1
"1+2.2.1" = Geography 1 or 2 (OR syntax)
WDS memberIds == SDMX codelist codes — no translation needed
IMPORTANT: In your final response to the user, you MUST cite the source of your data. This means including the _sdmx_url.
| Name | Required | Description | Default |
|---|---|---|---|
| productId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and discharges it well: it discloses truncation behavior (codes truncated to 10, _code_count and _truncated flags), key syntax including wildcard and OR operators, and the mandatory requirement to cite _sdmx_url in the final response. This goes far beyond a generic 'fetch data' statement.
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?
The description is longer than average but well-structured with a lead sentence, a bullet list for dimension entries, and key construction rules. Each section adds needed domain knowledge (truncation, key syntax, citation). It earns its length, though a few details (like the truncated-code note) could arguably be trimmed.
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?
Given the absence of an output schema and annotations, the description covers the essential return shape, truncation, key syntax, and source-citation requirement. The only notable gap is the unexplained productId parameter, which prevents full completeness for an agent trying to invoke the tool blindly.
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?
The input schema only exposes productId (integer) with no description and coverage is 0%. The description refers to 'a StatCan table' but never explicitly maps productId to the table identifier or explains how to discover valid values. The schema and description leave the single parameter under-documented.
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 description opens with a specific verb-resource pairing: 'Fetch the Data Structure Definition (DSD) for a StatCan table via SDMX REST.' It clearly distinguishes this from sibling tools by stating it should be used before get_sdmx_data and by describing the DSD-specific output (dimension codelists, code IDs, parent hierarchy).
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 states 'Use this BEFORE get_sdmx_data to understand the key syntax for that table,' giving clear contextual placement. It also includes key construction rules that explain how the output is consumed downstream. It does not mention conditions where one would not use it or alternative tools, so slightly below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sdmx_vector_dataA
Fetch time-series observations for a single StatCan vector via SDMX REST.
Simpler alternative to get_sdmx_data when you already know the vectorId. Use get_series_info_from_cube_pid_coord or get_cube_metadata to find vectorIds.
Time filtering (use one or the other, not both): lastNObservations=5 → last 5 periods startPeriod="2020-01" → from Jan 2020 (monthly); "2020" for annual endPeriod="2023-12" → up to Dec 2023
LIMITATION: StatCan rejects combining lastNObservations with startPeriod/endPeriod (returns 406).
Output rows contain: dimension values, "period", "value", SCALAR_FACTOR, UOM, VECTOR_ID, STATUS, and other SDMX attributes.
IMPORTANT: In your final response to the user, you MUST cite the source of your data. This means including the _sdmx_url,and vectorId in your response.
| Name | Required | Description | Default |
|---|---|---|---|
| vectorId | Yes | ||
| endPeriod | No | End period in YYYY or YYYY-MM format. | |
| startPeriod | No | Start period in YYYY or YYYY-MM format. | |
| lastNObservations | No | Return only the last N observations (e.g. 5 for last 5 periods). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the transparency burden. It discloses a specific limitation ('StatCan rejects combining lastNObservations with startPeriod/endPeriod returns 406'), describes the output rows, and includes a mandatory citation requirement. It does not discuss rate limits or auth, but for a read-only fetch operation, the disclosed information is substantial.
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?
The description is somewhat long but well-structured with clear sections for purpose, alternatives, time filtering, limitation, output, and citation. Every section adds necessary information, though it could be tightened without losing content. Front-loading the core purpose and alternative helps quick scanning.
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?
Given the tool's complexity, lack of output schema, and multiple sibling tools, the description covers all essential aspects: what it does, when to use it, how to find parameters, parameter constraints, output structure, and a critical legal/citation requirement. It is sufficiently complete for an agent to invoke it correctly.
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 75%, and the description adds meaningful context beyond the schema: it gives concrete examples for startPeriod and endPeriod formats (monthly vs annual), demonstrates lastNObservations usage, and warns against combining mutually exclusive filters. The schema already describes most fields, so the description complements rather than repeats.
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 description clearly states the tool's function: 'Fetch time-series observations for a single StatCan vector via SDMX REST.' It also distinguishes this tool from its sibling by calling it a 'Simpler alternative to get_sdmx_data when you already know the vectorId,' which directly addresses the key differentiation.
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 usage guidance is given: it names alternative siblings for finding vectorIds ('Use get_series_info_from_cube_pid_coord or get_cube_metadata to find vectorIds') and clarifies when this tool is appropriate versus get_sdmx_data. It also provides concrete examples for parameter usage, making the decision process clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_series_infoA
Resolve one or more {productId, coordinate} pairs to series metadata (vectorId, titles, frequency, UOM, etc.) in a single API call.
Use this to find vectorIds before fetching data with get_sdmx_data or get_sdmx_vector_data. Pass one item or many — same tool either way. Coordinates are automatically padded to 10 dimensions. Corresponds to: POST /getSeriesInfoFromCubePidCoord (accepts array)
NOTE: Response fields like scalarFactorCode, frequencyCode, and memberUomCode use StatCan numeric codes. Call get_code_sets() to decode them (e.g. frequencyCode 6 = "Monthly", scalarFactorCode 0 = "Units").
Returns: List of series metadata dicts, paginated with _guidance if >50 results. Raises: httpx.HTTPStatusError: If the API returns an error status code. ValueError: If no items return SUCCESS. Exception: For other network or unexpected errors.
IMPORTANT: In your final response cite the ProductId and Coordinate for each series.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | List of {productId, coordinate} pairs to fetch series info for in a single batch call. | |
| limit | No | Max results to return. Default 50. | |
| offset | No | Number of results to skip (for pagination). Default 0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it delivers: it discloses batch behavior (one or many), automatic coordinate padding, pagination via _guidance, numeric code decoding requirements, and specific exception types. This goes beyond basic expectations and gives the agent a reliable mental model of the tool's behavior.
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?
The description is well-organized with sections for purpose, usage, notes, returns, raises, and an important reminder. It is slightly verbose for an agent-facing description, but every section adds meaningful value and no sentences are purely filler, so it earns a 4 rather than a 5.
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?
Despite having no output schema, the description fully explains what the tool returns (list of series metadata dicts, paginated with _guidance) and explicitly lists all error types with conditions. This makes the tool self-contained for an agent to invoke and interpret results correctly, especially with the important note about citing ProductId and Coordinate.
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%, with item and coordinate descriptions already stating the batch and padding behavior. The description repeats 'Coordinates are automatically padded' and 'Pass one item or many', but adds no new parameter-level semantics beyond what the schema already provides, so the baseline score of 3 is appropriate.
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 description uses a specific verb ('Resolve') and clearly defines the resource as '{productId, coordinate} pairs' mapped to 'series metadata' including vectorId, titles, frequency, and UOM. It explicitly states the primary use case ('find vectorIds before fetching data'), effectively distinguishing it from sibling tools like get_series_info_from_vector.
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?
It provides clear context: 'Use this to find vectorIds before fetching data with get_sdmx_data or get_sdmx_vector_data.' This tells the agent when to use the tool, but it does not explicitly mention when not to use it or suggest alternative tools for exclusion scenarios, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_series_info_from_vectorA
Request series metadata (productId, coordinate, titles, frequency, etc.) by Vector ID. Disables SSL Verification. Corresponds to: POST /getSeriesInfoFromVector
Returns: Dict[str, Any]: A dictionary containing the series metadata object. Raises: httpx.HTTPStatusError: If the API returns an error status code. ValueError: If the API response format is unexpected or status is not SUCCESS. Exception: For other network or unexpected errors.
IMPORTANT: In your final response to the user, you MUST cite the source of your data. For series info, this means including the VectorId, ProductId (pid), and Coordinate.
| Name | Required | Description | Default |
|---|---|---|---|
| vectorId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full transparency burden. It uniquely discloses 'Disables SSL Verification', documents expected return type, and lists error scenarios. It does not address auth or rate limits, but the safety profile is reasonably conveyed.
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?
The description is well-organized with a lead sentence, endpoint, return, exceptions, and a prominent citation note. No filler; each section adds operational value.
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 parameter-light tool with no output schema, the description is thorough: it explains what metadata is returned, the output type, exceptions, transport behavior (SSL), and a mandatory citation requirement. This is sufficient for successful invocation.
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?
The schema provides only an integer 'vectorId' with no description (0% coverage). The description adds that this ID selects the series and must be cited in the final response, giving it a functional role. It does not explain how to obtain or validate a vectorId.
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 description clearly states the action—requesting series metadata—and identifies the resource/identifier (Vector ID). It also specifies the endpoint, making it distinct from sibling get_series_info even without an explicit comparison.
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?
The description implies the tool is used when you have a Vector ID to fetch metadata, but it does not explicitly state when to prefer it over siblings like get_series_info, nor does it list exclusions/alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_table_schemaB
Retrieves the schema (column names and types) for a specific table.
Args: table_name_input: Object containing the table_name.
Returns: Dict[str, Any]: Dictionary describing the schema or an error message.
| Name | Required | Description | Default |
|---|---|---|---|
| table_name | Yes | Name of the SQL table. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the burden of behavioral disclosure. It does mention that the return is a 'Dict[str, Any]' describing the schema 'or an error message', giving some insight into error handling. However, it does not specify whether the table must exist, what happens on missing tables, or any side effects (though the operation is read-only). This is adequate but not rich.
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?
The description is concise and front-loaded with the purpose. However, the Args section is redundant and inconsistent with the schema, and the Returns section could be more compact. It is brief overall but contains a small structural flaw that prevents a perfect score.
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 simple one-parameter tool, the description provides the return type and error possibility. Yet it omits any detail about the shape of the schema dictionary (e.g., whether it includes column names, data types, constraints) and does not clarify behavior for non-existent tables. Given the lack of an output schema, this is a moderate gap.
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?
Although the schema covers the parameter fully (table_name as a string), the description's Args section is misleading: it says 'table_name_input: Object containing the table_name', which contradicts the schema that expects a direct string. This introduces ambiguity and fails to add meaningful semantic value beyond the schema.
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 description uses a specific verb ('Retrieves') and clearly states the resource ('the schema (column names and types) for a specific table'). This unambiguously differentiates it from sibling tools like list_tables (which lists tables) and query_database (which fetches data).
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?
There is no explicit or implicit guidance on when to use this tool versus alternatives. No mention of 'use this when you need a table structure' or references to sibling tools like list_tables or query_database. The only context is the tool's purpose, which does not qualify as usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
insert_data_into_tableA
Appends rows (list of dicts) into an ALREADY EXISTING SQLite table. Use this only to add more data to a table that was previously created.
For the common "fetch API data then store" workflow, use create_table_from_data or fetch_vectors_to_database instead — both create the table AND insert data in a single call, so you do NOT need to call this tool after them.
This tool is useful when:
You want to merge data from multiple API calls into one table
You're appending new time periods to an existing dataset
Args: table_input: Object containing table_name and data (list of dicts).
Returns: Dict[str, str]: A dictionary indicating success (with row count) or failure.
IMPORTANT: In your final response to the user, you MUST cite the source of the data you are inserting if it comes from an API call (e.g., "Data from Product ID 123456").
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Data to insert, as a list of dictionaries. | |
| table_name | Yes | Name for the SQL table (alphanumeric and underscores recommended). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the table must already exist, that the operation appends rows, and that it returns a success/failure dict. It also adds an important caveat about citing the data source. However, it doesn't cover error scenarios such as non-existent tables or schema mismatches, keeping it slightly below a perfect score.
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?
The description is well-structured and front-loaded with the primary purpose. It includes separate sections for usage, arguments, returns, and an important note. It is reasonably concise, though the inaccurate parameter explanation slightly reduces clarity, keeping it from a perfect score.
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?
The description covers purpose, usage, return type, and an agent instruction about citing sources. However, the inaccurate parameter description and lack of error handling details leave gaps. Given the tool's simplicity, the description is adequate but could be more accurate and thorough, so a score of 3 is appropriate.
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?
Although the schema has 100% coverage for both parameters, the description's Args section inaccurately describes a single 'table_input' object containing table_name and data, while the actual schema defines flat top-level properties. This misleading parameter explanation actively harms understanding rather than adding value, warranting a score below the 3 baseline.
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 description clearly states the tool 'Appends rows (list of dicts) into an ALREADY EXISTING SQLite table.' It uses a specific verb and resource, and explicitly distinguishes itself from sibling tools like create_table_from_data and fetch_vectors_to_database by emphasizing it is only for adding data to an existing table.
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?
Provides explicit when-to-use guidance: useful for merging data from multiple API calls or appending new time periods. It also explicitly says when NOT to use it, directing users to alternative tools that both create and insert in one call, making the usage context unmistakable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tablesA
Lists all user-created tables in the SQLite database.
Returns: Dict[str, Any]: Dictionary containing a list of table names or an error message.
IMPORTANT: The database is persistent. Use this to check for old tables that might need cleaning.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden; it adds key context that the database is persistent and that only user-created tables are returned, with an error message on failure. It implies a read-only operation by the verb 'Lists' but does not explicitly state non-destructive behavior.
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?
Three short sentences plus a return type declaration; every sentence earns its place. The important note about persistence and cleaning is relevant rather than 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 zero-parameter, no-output-schema tool, the description covers the result shape, the scope (user-created tables), and an important operational caution. No critical information is missing.
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?
The tool has no parameters, so the description needs no parameter details. The baseline of 4 applies, and the description adds sufficient contextual information for a parameterless tool.
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 description uses the specific verb 'Lists' and identifies the resource as 'user-created tables in the SQLite database,' clearly distinguishing it from schema/drop/query siblings. It also states the return type, making the tool's core function unambiguous.
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?
It explicitly says to use this for checking old tables that might need cleaning, providing a concrete use case. However, it does not mention alternatives or when not to use it, so it lacks explicit exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_databaseA
Executes a read-only SQL query (SELECT or PRAGMA) against the database and returns the results. WARNING: Potential security risk! Avoid using this tool with untrusted input or queries that modify data (INSERT, UPDATE, DELETE). Prefer more specific tools like list_tables or get_table_schema when possible. Results may be truncated.
Args: query_input: Object containing the sql_query string.
Returns: Dict[str, Any]: Dictionary with 'columns', 'rows' (list of dicts), and optionally a 'message', or an error message.
IMPORTANT: In your final response to the user, you MUST cite the source of your data (e.g., "Query results from table 'my_analysis'").
| Name | Required | Description | Default |
|---|---|---|---|
| sql_query | Yes | The SQL query to execute. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses security risk, potential truncation of results, the return shape, and the requirement to cite data source. However, it does not elaborate on how the tool enforces read-only or handles errors beyond mentioning an error message.
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?
The description is well-structured with a warning, usage preference, args, returns, and citation instruction. It is somewhat verbose but each section serves a purpose. The inaccurate Args line detracts from conciseness.
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?
Given no output schema, the description provides essential context: security warning, truncation, return format, and citation requirement. It is sufficient for selecting and invoking the tool, though minor parameter confusion and lack of error-handling details leave some gaps.
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?
The schema fully covers the single parameter with 'The SQL query to execute.' However, the description's 'Args: query_input: Object containing the sql_query string' suggests a nested object structure that contradicts the actual schema, which expects a top-level 'sql_query' string. This mismatch could mislead the agent on how to invoke the tool.
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 description clearly states it 'Executes a read-only SQL query (SELECT or PRAGMA) against the database and returns the results' — a specific verb and resource with explicit scope. It also distinguishes itself from siblings by naming alternatives like list_tables and get_table_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?
It explicitly advises to avoid untrusted input and queries that modify data, and recommends using more specific tools when possible. This gives clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_cubes_by_titleA
Searches for data cubes/tables where the English or French title contains the provided search term (case-insensitive). Returns a list of matching cubes in the 'lite' format (excluding dimensions/footnotes).
Multiple keywords use AND logic (e.g., "tobacco smoking age" finds cubes containing ALL three words). Results are capped at max_results (default 25).
IMPORTANT: In your final response to the user, you MUST cite the source of your data. For cubes, this means including the ProductId (pid) and the Title.
Raises: httpx.HTTPStatusError: If the underlying API call fails. Exception: For other network or unexpected errors during the fetch.
| Name | Required | Description | Default |
|---|---|---|---|
| max_results | No | Max matching cubes to return. Default 25. | |
| search_term | Yes | Text to search for in cube titles. Multiple keywords use AND logic. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It reveals important traits: case-insensitive matching, lite format exclusion, AND logic, result capping, error types, and a mandatory citation requirement. This is substantial coverage beyond the basic search functionality, though it doesn't cover authentication or rate limits.
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?
The description is well-structured with distinct paragraphs for purpose, behavior, citation requirement, and errors. Each sentence contributes unique information without fluff or repetition. It is appropriately sized for the complexity.
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?
Given no output schema, the description explains the return format (lite format, excluding dimensions/footnotes) and error conditions. It doesn't enumerate the lite format fields, but that is a known concept from sibling tools. The description is complete enough for an agent to invoke the tool effectively.
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% with both parameters described, so baseline is 3. The description adds extra semantics for search_term (English/French title, case-insensitive) and reiterates AND logic, which adds value beyond the schema. It also clarifies the default behavior of max_results.
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 description clearly states the verb 'searches' and the resource 'data cubes/tables', specifying that it searches English or French titles case-insensitively. This distinguishes it from sibling tools like get_all_cubes_list_lite, which return full lists without search capability. The scope is unambiguous.
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?
The description provides clear context for when to use this tool: when searching for cubes by title. It explains AND logic and the max_results cap, which informs usage. Though it doesn't explicitly name alternatives, the context is sufficient to guide selection among sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
store_cube_metadataA
Fetches FULL metadata for a cube and stores it into two normalized SQLite tables (_statcan_dimensions, _statcan_members) without returning the full data to the context window.
Use this when you need to browse all dimension members or look up vectorIds. The summary returned by get_cube_metadata only shows 5 members per dimension — call this tool first, then use SQL to drill into specific dimensions.
Typical workflow:
store_cube_metadata(productId=1234567) → stores all members + vectorIds, returns compact summary
query_database("SELECT * FROM _statcan_dimensions WHERE pid = 1234567") → see all dimension names and member counts
query_database("SELECT member_name_en, vector_id FROM _statcan_members WHERE pid = 1234567 AND dim_index = 2") → browse all members for a specific dimension
fetch_vectors_to_database(vectorIds=[...], ...) → fetch the data
Tables are shared across multiple pids — calling this for a new pid adds rows without affecting data for other pids already stored.
Returns a compact summary: dimension names + member counts + example SQL.
IMPORTANT: Cite the productId and cubeTitleEn in your final response.
| Name | Required | Description | Default |
|---|---|---|---|
| productId | Yes | The StatCan cube ProductId whose full metadata to fetch and store. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the tool writes to SQLite tables, does not return full data, returns a compact summary, and that tables are shared across pids with rows added without affecting other pids. It also notes the citation requirement. This is thorough and transparent.
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?
The description is longer than a simple one-liner, but it is well-structured with a clear opening sentence, a 'Use this when' section, a numbered workflow, and an important note. No sentence is wasted; the length is proportional to the tool's complexity.
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?
Despite having only one parameter and no output schema, the description is extremely complete: it explains the storage side effects, the return summary, how to follow up with SQL queries, and the required citation. The integrated workflow makes it a self-contained guide.
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% for productId, so the baseline is 3. The description adds extra context by showing an example invocation (productId=1234567) and explaining how productId maps to the pid column in the stored tables, which is useful beyond the schema's basic type description.
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 description explicitly states the tool 'Fetches FULL metadata for a cube and stores it into two normalized SQLite tables...' and distinguishes it from get_cube_metadata which only shows 5 members per dimension. This clearly identifies the tool's unique role.
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?
The description says 'Use this when you need to browse all dimension members or look up vectorIds' and explicitly contrasts with get_cube_metadata, while also providing a numbered workflow involving query_database and fetch_vectors_to_database, giving clear when-to-use and alternative guidance.
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.
25 tool updates
v0.7.15- First observed
create_table_from_data - First observed
drop_table - First observed
fetch_vectors_to_database - First observed
get_all_cubes_list - First observed
get_all_cubes_list_lite - First observed
get_bulk_vector_data_by_range - First observed
get_changed_cube_list - First observed
get_changed_series_data_from_cube_pid_coord - First observed
get_changed_series_data_from_vector - First observed
get_changed_series_list - First observed
get_code_sets - First observed
get_cube_metadata - First observed
get_sdmx_data - First observed
get_sdmx_key_for_dimension - First observed
get_sdmx_rows - First observed
get_sdmx_structure - First observed
get_sdmx_vector_data - First observed
get_series_info - First observed
get_series_info_from_vector - First observed
get_table_schema - First observed
insert_data_into_table - First observed
list_tables - First observed
query_database - First observed
search_cubes_by_title - First observed
store_cube_metadata
TDQS
Scored across 25 tools
Multiple tools overlap in purpose, e.g., get_all_cubes_list vs get_all_cubes_list_lite, get_sdmx_data vs get_sdmx_rows, get_series_info vs get_series_info_from_vector, and two changed-series-data tools that differ only by identifier type. The detailed descriptions help, but the boundaries between these tools are subtle enough that an agent could easily pick the wrong one.
Most tools follow a snake_case verb_noun pattern (get_, list_, create_, insert_, etc.), but the SDMX family is inconsistent: get_sdmx_data, get_sdmx_rows, get_sdmx_vector_data, and get_sdmx_structure all sound like data retrieval tools, and get_series_info vs get_series_info_from_vector is confusingly similar. Naming is readable but not perfectly predictable.
At 25 tools, the server sits at the high end of 'feels heavy'. The scope is broad (Statistics Canada API plus SQLite persistence), which justifies many tools, but some functions could be merged (e.g., get_sdmx_data and get_sdmx_rows) to reduce redundancy and cognitive load.
The tool surface covers the full data lifecycle: cube discovery, search, metadata, series info, SDMX data, vector access, changed-data tracking, code-set definitions, plus a full SQLite persistence layer for storing and querying results. Minor gaps exist (e.g., no direct batch-metadata fetch, and lastNObservations can't combine with date ranges), but no critical dead ends.
Maintenance
Related MCP Connectors
Statistics Canada (StatCan) WDS MCP — Canadian official statistics (no auth)
Statistics Netherlands (CBS / StatLine) OData MCP.
Australian Bureau of Statistics (ABS) Data API MCP.
Curated gateway to snapshot-versioned Canadian public data services with source provenance.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables browsing and managing CKAN data portals through MCP-compatible clients like Claude Desktop.15Mozilla Public 2.0
- AlicenseNot gradedqualityCmaintenanceMCP server providing access to Statistics Canada time-series data via web data.7 npmMIT
- AlicenseNot gradedqualityFmaintenanceProvides access to Statistics Canada official statistics without authentication, enabling AI agents to query Canadian economic and demographic data.2 npmMIT
- AlicenseNot gradedqualityBmaintenanceAn MCP server that lets AI assistants discover and retrieve official statistics from SDMX services, returning actual data observations rather than just query URLs.Apache 2.0