Australian Bureau of Statistics
This server gives LLMs live access to Australian Bureau of Statistics data via five core tools plus a release calendar, translating plain-English queries into SDMX for curated economic indicators.
Query current or historical data on 10 curated datasets (unemployment, CPI, GDP, building approvals, population, etc.) using plain-English filters like
region: "nsw"— no SDMX codes neededGet the latest observation for any indicator with a fast
latest()call (e.g., "current unemployment rate")Rank entities by a measure at the latest period via
top_n()(e.g., top 5 states by unemployment, bottom 3 industries by wage growth)Search and discover datasets via fuzzy text (
search_datasets), and inspect dimensions/valid values (describe_dataset)Retrieve data in multiple formats: records, grouped series, or CSV (
get_data)List all curated dataflows with plain-English support (
list_curated)Check the upcoming ABS release calendar (
release_calendar) to know what's published nextAccess ~1,200 raw ABS dataflows beyond the curated ones, just pass raw SDMX codes
Every response includes source URLs, units, periods, and CC-BY attribution for verifiable answers
abs-mcp
mcp-name: io.ausdata/abs-mcp
Ask Claude about the Australian economy and get real, current numbers — not "I don't have access to that data." This MCP server gives Claude (and other MCP clients like Cursor) live access to the ABS Data API, with curated mappings for the 10 most-asked Australian economic indicators.
Hosted access? For cross-source queries, webhooks, an always-on REST API, and a uniform response envelope across all 9 sources, see ausdata.io — free tier available (500 calls/mo, no card).

Behind the scenes it wraps SDMX 2.1, but you never see SDMX codes — just plain-English filters like region: "nsw" and measure: "unemployment_rate". Five tools, ten curated dataflows (Labour Force, CPI, Wage Price Index, Job Vacancies, Average Weekly Earnings, GDP / National Accounts, quarterly + annual Estimated Resident Population, Building Approvals, Lending Indicators), and 1,200+ other ABS dataflows accessible via raw codes.
Companion to rba-mcp (Reserve Bank of Australia — cash rate, FX, lending rates), ato-mcp (Australian Taxation Office — postcode-level personal tax, company tax by industry, corporate tax transparency, ACNC charity register), and au-weather-mcp (Australian weather — 21 curated locations + postcode/place-name lookup, current observations, 16-day forecasts, 80yr historical archive). Install all four for the full AU macro / regulator / tax / climate stack.
What you can ask
Once installed, your LLM can answer questions like:
Question | Real response (verified) |
What's the unemployment rate in NSW? | 4.27% (Mar 2026) |
AU annual CPI inflation? | 4.60% (Mar 2026) |
AU annual wage growth? | 3.40% (Q4 2025) |
Average weekly earnings in Australia? | $1,562 (Sep–Oct 2025) |
AU GDP quarterly growth? | 0.80% (Q4 2025) |
AU GDP per capita? | $24,900/qtr (Q4 2025) |
Job vacancies in NSW? | 101,200 (Q1 2026) |
Dwelling approvals in NSW? | 4,400/month (Mar 2026) |
New NSW housing loan commitments? | $19.7B (Q4 2025) |
Quarterly population of Australia? | 27.7M (Q3 2025) |
Every answer comes with the period, units, and a link back to the ABS source page. Comparisons and time-series queries work just as well — see Worked examples below.
Related MCP server: FRED Macroeconomic Data MCP Server
Install
# After publish:
uvx --upgrade abs-mcp
# Local dev install:
uv pip install -e .Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"abs": {
"command": "uvx",
"args": ["--upgrade", "abs-mcp"]
}
}
}Why
--upgrade?uvx abs-mcp(without the flag) uses whatever wheel is cached and never adopts new PyPI releases on its own — Claude Desktop's MCP child process keeps running the same wheel until you fully quit the app and refresh the cache by hand.--upgrademakes uvx check PyPI on each launch and pull a newer release if one exists. To verify which version is currently serving you, look at theserver_versionfield on anyDataResponse(added in 0.2.10).
For a local checkout (before PyPI publish):
{
"mcpServers": {
"abs": {
"command": "uv",
"args": ["run", "--directory", "/absolute/path/to/abs-mcp", "abs-mcp"]
}
}
}Restart Claude Desktop. The abs server appears in the tools panel with five tools.
Cursor
Add to ~/.cursor/mcp.json (or workspace .cursor/mcp.json):
{
"mcpServers": {
"abs": {
"command": "uvx",
"args": ["--upgrade", "abs-mcp"]
}
}
}Tools
Tool | What it does |
| Fuzzy-search ABS dataflow names. Returns the top matches. |
| Plain-English description of a dataflow's dimensions and values. |
| Query a dataflow with filters. Returns clean records (default), grouped series, or CSV. |
| Just the most recent observation(s) — wraps |
| Rank rows of a curated dataflow by a measure (e.g. |
| The ten dataflow IDs that have hand-curated plain-English support. |
Curated dataflows
For these curated dataflows, filters accepts plain-English values (e.g. "region": "nsw" instead of "REGION": "1"):
LF — Labour Force, monthly: employment, unemployment, participation by state/sex
CPI — Consumer Price Index, quarterly inflation (cat 6401.0 — the headline rate)
CPI_MONTHLY — Monthly CPI Indicator (cat 6484.0), full sub-category and per-city breakdown
WPI — Wage Price Index, quarterly wage growth by industry/sector/state
PPI_FD — Producer Price Index Final Demand, quarterly producer inflation
JV — Job Vacancies, quarterly labour demand by industry/sector/state
AWE — Average Weekly Earnings, half-yearly by industry/sector/state
ANA_AGG — National Accounts: GDP, GDP per capita, terms of trade, real income (Australia, quarterly)
ABS_ANNUAL_ERP_ASGS2021 — Estimated Resident Population, annual by state and sub-state geography
ERP_Q — Quarterly Estimated Resident Population, by state/sex/age
BUILDING_APPROVALS — Building Approvals (cat 8731.0), monthly by state/capital region, building type (houses / townhouses / apartments / total dwellings / non-residential) and measure (number / value). The property-economist "Building Index" series.
BA_GCCSA — Building Approvals, monthly by state/capital region and building type (raw GCCSA dimension surface;
BUILDING_APPROVALSis the cleaner alias)BA_LGA2024 — Building Approvals at the council (Local Government Area) level, monthly, ~570 councils — far more granular than BA_GCCSA's 8-capital geography. Pass
region=an LGA code (e.g."10050"Albury,"22750"Greater Geelong,"31000"Brisbane) for council-by-council approvals; defaults to Brisbane. Council-level only — for state / national totals useBUILDING_APPROVALS. Resolves to ABS's currentBA_LGA2025SDMX dataflow so the series stays live.BUILDING_ACTIVITY — Building Activity (cat 8752.0), quarterly dwelling units completed / commenced / under construction plus value of work, by state and building type. The trailing-reality counterpart to
BUILDING_APPROVALS— pair the two for approvals-vs-completions, and addNOMfor the supply-vs-migration story.NOM — Net Overseas Migration (cat 3412.0), financial-year arrivals/departures/net by state and age. The dominant rents-vs-migration series; publishes the headline net figure to the latest FY.
ABS_NOM_VISA_CY — NOM by visa subclass (calendar year, student / skilled / working holiday / permanent streams)
LEND_HOUSING — Lending Indicators, quarterly new housing loan commitments by purpose, lender, and state
HSI_M — Monthly Household Spending Indicator (ABS-blessed retail-trade replacement), COICOP category × discretionary × state
RT — Retail Trade (43-year historical series, ceased Jul 2025)
C21_G01_POA / C21_G02_POA / C21_G02_SA2 — Census 2021 selected characteristics and medians by postcode / SA2
Any other ABS dataflow still works — pass raw SDMX dimension IDs and codes.
Worked examples
Cross-source compatibility. All location filters accept canonical state codes (
"NSW"), full names ("New South Wales"), case-insensitive variants ("nsw"), ISO 3166-2 ("AU-NSW"), and 4-digit postcodes ("2000"→ NSW). Powered byaus-identity— the same input format works across abs-mcp, ato-mcp, apra-mcp, aihw-mcp, and asic-mcp.
"What's the current unemployment rate in NSW?"
Claude calls:
latest(dataset_id="LF", filters={"region": "nsw", "measure": "unemployment_rate"})Returns:
{
"dataset_id": "LF",
"dataset_name": "Labour Force",
"query": {"region": "nsw", "measure": "unemployment_rate"},
"period": {"start": "2026-03", "end": "2026-03"},
"unit": "Percent",
"records": [
{
"period": "2026-03",
"value": 4.27,
"dimensions": {"measure": "Unemployment rate", "region": "New South Wales", "sex": "Persons"},
"unit": "Percent"
}
],
"source": "Australian Bureau of Statistics",
"retrieved_at": "2026-05-11T03:14:22Z",
"abs_url": "https://www.abs.gov.au/statistics/labour/employment-and-unemployment/labour-force-australia"
}"Show me NSW housing approvals over the last two years"
get_data(dataset_id="BA_GCCSA", filters={"region": "nsw", "measure": "dwelling_units"}, start_period="2024")"Compare monthly CPI inflation in Sydney vs Melbourne"
get_data(dataset_id="CPI_MONTHLY", filters={"region": ["sydney", "melbourne"], "measure": "change_year"}, start_period="2023")(CPI itself publishes only the national weighted average at quarterly cadence; the monthly indicator carries per-city series.)
Period formats
ABS uses different period formats per dataflow. Pass start_period / end_period in the matching format:
Dataflows | Frequency | Format | Example |
LF, BA_GCCSA, BUILDING_APPROVALS | Monthly |
|
|
BUILDING_ACTIVITY | Quarterly |
|
|
CPI, WPI, PPI_FD, JV, ANA_AGG, LEND_HOUSING, ERP_Q | Quarterly |
|
|
CPI_MONTHLY, HSI_M | Monthly |
|
|
AWE | Half-yearly |
|
|
NOM (financial year), ABS_ANNUAL_ERP_ASGS2021 | Annual |
|
|
Verifying your install
The running MCP server reports its version on every DataResponse:
{ ..., "server_version": "0.2.11", ... }If you see a value below the latest on PyPI, your uvx cache is stale. Either switch to ["--upgrade", "abs-mcp"] in your config (recommended), or refresh manually:
uvx --refresh abs-mcp --help
# Then fully quit and relaunch Claude Desktop (Cmd+Q — window-close is not enough).Claude Desktop's MCP child processes are long-lived; refreshing the wheel cache does not restart an already-running server. Cold app launch is required.
Development
git clone https://github.com/Bigred97/abs-mcp.git
cd abs-mcp
uv sync --extra dev
uv pip install -e .
# Unit tests (no network)
uv run pytest
# Live integration tests (hits real ABS API)
uv run pytest -m liveThe SQLite cache lives at ~/.abs-mcp/cache.db. Catalogue refreshes every 24h, codelists every 7 days, data responses every hour, latest 15 minutes. Delete the file to force a refresh.
How it works
When you ask Claude an ABS question, it picks the right tool, fills in the curated filters, and calls the live ABS API. You see the reasoning + tool call inline:

Claude does the picking; this server does the SDMX translation, unit attribution, and clean response shaping. You don't have to know what M13.3.1599.20.1.M means — and neither does Claude.
How it differs from existing ABS MCP servers
The one existing community option (seansoreilly/abs) exposes a single query_dataset tool that passes raw SDMX through. This package offers semantic tools and curated mappings for the highest-value dataflows so an LLM can answer real questions without you needing to know what M13.3.1599.20.1.M means.
Sister MCPs (Australian Public Data portfolio)
Want all 9 sources behind one REST API? The hosted gateway at ausdata.io adds cross-source joins, full history, webhooks, and HMAC-signed responses on top of these MCPs — free tier (500 calls/mo, no card).
abs-mcp — this one. Australian Bureau of Statistics (CPI, unemployment, ERP, building approvals)
rba-mcp — Reserve Bank of Australia (cash rate, lending stats, exchange rates)
ato-mcp — Australian Taxation Office (tax stats, ACNC charities)
apra-mcp — Australian Prudential Regulation Authority (banking, insurance, super)
aihw-mcp — Australian Institute of Health and Welfare
asic-mcp — Australian Securities and Investments Commission (company registers)
aemo-mcp — Australian Energy Market Operator (NEM dispatch, spot prices, generation)
au-weather-mcp — Open-Meteo (Bureau of Meteorology aggregator)
wgea-mcp — Workplace Gender Equality Agency
aus-identity — Postcode / state / ABN normalisation helper used by all sisters
Changelog
See CHANGELOG.md for release history.
License
MIT — Harry Vass, 2026.
Available Tools
7 toolsdescribe_datasetA
Describe an ABS dataflow's filter dimensions, value codes, and source.
For curated dataflows (LF, CPI, ANA_AGG, AWE, BA_GCCSA, ERP_Q, JV, LEND_HOUSING, WPI, ABS_ANNUAL_ERP_ASGS2021), returns plain-English dimension names + curated value keys + the ABS source URL.
For other dataflows (~1,200 in total), returns raw SDMX dimensions and codelists translated to the same response shape — pass raw SDMX codes to get_data when querying these.
Examples: # Curated path — plain-English values detail = await describe_dataset("LF") # detail.dimensions = [{'name': 'region', 'values': [{'key': 'nsw', # 'sdmx_code': '1'}, {'key': 'vic', 'sdmx_code': '2'}, ...]}, ...]
# Raw path — full SDMX codelist
detail = await describe_dataset("ALC") # Apparent Consumption of Alcohol
# detail.is_curated == False; values are raw SDMX codesWhen to use: - Before calling get_data on an unfamiliar dataflow — to discover valid filter dim names and value keys - To get the canonical source URL on the ABS site - To see whether a dataflow is curated (plain-English) or raw SDMX
Returns: DatasetDetail with id, name, description, is_curated flag, the list of filter dimensions (name, sdmx_id, values), and abs_url.
| Name | Required | Description | Default |
|---|---|---|---|
| dataset_id | Yes | ABS dataflow ID. Use search_datasets to discover, or list_curated to enumerate the 10 dataflows with plain-English support. Case-insensitive — 'lf', 'LF', and ' LF ' all resolve to 'LF'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| abs_url | Yes | |
| dimensions | Yes | |
| is_curated | Yes | |
| description | Yes | |
| hidden_defaults | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description covers key behaviors: curated vs. raw paths, case-insensitivity, and whitespace trimming. It lacks discussion of side effects or authorization, but as a metadata-read operation, these are implicitly safe.
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, examples, and bullet points, making it easy to scan. While slightly verbose, it remains clear and front-loaded with the core purpose.
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 single parameter and the presence of an output schema, the description comprehensively covers behavior, return shape, and usage scenarios. It is complete for an effective tool 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 coverage is 100%, yet the description adds significant value: it explains case-insensitivity, trimming, and how to discover valid IDs via search_datasets or list_curated. Examples reinforce correct usage.
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 purpose: describing an ABS dataflow's filter dimensions, value codes, and source. It distinguishes between curated and raw dataflows, providing specific examples (LF, CPI, etc.) and contrasting with sibling tools like get_data and search_datasets.
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 explicitly tells when to use the tool, e.g., before calling get_data on an unfamiliar dataflow or to get the source URL. It does not provide explicit 'when not to use' guidance or direct comparisons to alternatives, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dataA
Query an ABS dataflow and return observations.
Pass filters and/or a period range — unfiltered queries on large dataflows can return tens of thousands of observations.
Curated dataflows accept plain-English filter keys and values that
are translated to SDMX codes server-side. For example, on LF:
{"region": "nsw", "measure": "unemployment_rate"} resolves to
SDMX key M13.3.1599.20.1.M with hidden-dim defaults auto-applied.
Examples: # NSW unemployment monthly for 2024 resp = await get_data( "LF", filters={"region": "nsw", "measure": "unemployment_rate"}, start_period="2024", end_period="2024-12", ) # → resp.records[0]: period='2024-01', value=4.8, unit='Percent'
# Multi-state comparison
resp = await get_data(
"LF",
filters={"region": ["nsw","vic","qld"], "measure": "unemployment_rate"},
start_period="2024",
format="csv",
)
# → resp.csv contains 36 rows (3 states × 12 months)
# Australia quarterly CPI annual change
resp = await get_data(
"CPI",
filters={"region": "australia", "measure": "change_year"},
start_period="2020",
)When to use: - You want observations over a time range (use latest() for the most-recent only) - You want a multi-state or multi-measure comparison via list filters - You want a CSV for downstream charting / spreadsheet tools
Returns: DataResponse with records (list of {period, value, dimensions, unit}), unit (when homogeneous), period bounds, the resolved query echo, the ABS source URL, and the CC-BY 4.0 attribution string.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Response shape. 'records' (default): flat list of observations. 'series': observations grouped by dimension key for chart-friendly shapes. 'csv': returns the table as a CSV string in the `csv` field with records empty. | records |
| filters | No | Dimension filters. For curated dataflows: plain-English keys and values, e.g. {'region': 'nsw', 'measure': 'unemployment_rate'}. For raw dataflows: SDMX dimension IDs and codes. Pass a list as the value to query multiple values for a dimension. Whitespace is stripped; empty list / empty value rejected with a hint. | |
| dataset_id | Yes | ABS dataflow ID like 'LF', 'CPI'. Use search_datasets to discover. | |
| end_period | No | Inclusive end period. Same format as start_period. | |
| start_period | No | Inclusive start period. Format follows the dataflow's cadence: annual 'YYYY' (e.g. '2020'), monthly 'YYYY-MM' (e.g. '2024-03'), quarterly 'YYYY-Q1', half-yearly 'YYYY-S1', daily 'YYYY-MM-DD'. An int year (e.g. 2024) is also accepted and treated as 'YYYY'. URL-unsafe characters (?, &, /, etc.) are rejected at the boundary. |
Output Schema
| Name | Required | Description |
|---|---|---|
| csv | No | |
| unit | No | |
| query | No | |
| stale | No | |
| period | No | |
| source | No | |
| abs_url | Yes | Click-through URL for this dataset's source page. abs-mcp legacy name — prefer source_url (canonical) for new code. Both fields are populated identically. |
| records | No | |
| row_count | No | Number of observation rows in records. |
| dataset_id | Yes | |
| source_url | Yes | Canonical click-through URL. Same value as abs_url; both populated for backward compat. |
| attribution | No | |
| dataset_name | Yes | |
| retrieved_at | Yes | |
| stale_reason | No | |
| truncated_at | No | |
| server_version | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, but description comprehensively covers behavioral traits: plain-English filter translation, response format options, large data warning, return structure details.
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?
Well-organized with sections, examples, and a concise returns list. No wasted words despite being thorough.
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 output schema present, description covers all necessary context: parameters, usage, return fields, and boundary conditions.
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% but description adds substantial value: explains filter semantics, period format, dataset_id discovery, and format differences.
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?
Cleary states it queries ABS dataflows and returns observations, with detailed examples and distinction from sibling tool 'latest'.
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 describes when to use (time range, multi-state/measure, CSV) and when not (use latest() for single record). Warns about unfiltered queries returning large data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
latestA
Return the most recent observation(s) for a dataflow.
Wraps get_data with lastNObservations=1 and a 15-minute cache TTL (vs 1 hour for general data calls). Use this for "what's the current X?" questions — it's a cheap, fast call: warm-cache p50 ~22ms, cold-cache ~200ms.
Examples: # Latest NSW unemployment rate resp = await latest("LF", {"region": "nsw", "measure": "unemployment_rate"}) # → resp.records[0]: period='2026-03', value=4.61, unit='Percent'
# Latest Australia headline annual inflation
resp = await latest("CPI", {"region": "australia", "measure": "change_year"})
# → resp.records[0]: period='2026-Q1', value=4.6, unit='Percent'
# Latest Greater Sydney population
resp = await latest("ABS_ANNUAL_ERP_ASGS2021",
{"region": "greater_sydney", "region_type": "gccsa"})
# → resp.records[0]: period='2025', value=5640000, unit='Persons'When to use: - You want "the current value" of an indicator (most common workflow) - You're answering a "what's the unemployment rate?" style question - You want sub-50ms warm-cache latency for chat/agent integration
Returns: DataResponse with one most-recent observation per matched dimension combination. Same envelope as get_data.
| Name | Required | Description | Default |
|---|---|---|---|
| filters | No | Dimension filters. For curated dataflows: plain-English keys and values. Without filters, expect one observation per dimension combination (often hundreds) — pass at least region + measure for a clean single number. | |
| dataset_id | Yes | ABS dataflow ID. Use search_datasets to discover. |
Output Schema
| Name | Required | Description |
|---|---|---|
| csv | No | |
| unit | No | |
| query | No | |
| stale | No | |
| period | No | |
| source | No | |
| abs_url | Yes | Click-through URL for this dataset's source page. abs-mcp legacy name — prefer source_url (canonical) for new code. Both fields are populated identically. |
| records | No | |
| row_count | No | Number of observation rows in records. |
| dataset_id | Yes | |
| source_url | Yes | Canonical click-through URL. Same value as abs_url; both populated for backward compat. |
| attribution | No | |
| dataset_name | Yes | |
| retrieved_at | Yes | |
| stale_reason | No | |
| truncated_at | No | |
| server_version | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description details cache TTL (15 min vs 1 hour for get_data), performance metrics (p50 ~22ms warm), and warns about many observations without filters. Full disclosure of behavioral traits.
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?
Well-structured with sections for description, technical details, examples, usage guidance, and returns. Front-loaded with purpose. Every sentence adds value; no fluff.
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?
Output schema present (not shown), so return explanation not needed. Covers limitations, performance, and use cases. Examples cover multiple domains. 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?
Schema coverage is 100%, but description adds context beyond schema: explains that filters must narrow results (e.g., 'pass at least region + measure') and provides rich examples. Adds value beyond 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 explicitly states 'Return the most recent observation(s) for a dataflow' and distinguishes it from siblings like get_data (wraps with lastNObservations=1) and top_n. Examples further clarify its 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?
Includes a dedicated 'When to use' section listing scenarios (current value, performance) and implies alternatives (get_data for more observations). Clear guidance on when to apply.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_curatedA
List the 10 ABS dataflow IDs with hand-curated plain-English support.
These are the dataflows where get_data accepts plain-English filter
keys ({"region": "nsw"}) and describe_dataset returns rich
human-readable metadata. All other ABS dataflows (~1,200) are still
accessible via get_data with raw SDMX dimension IDs and codes.
The 10 curated dataflows: - LF — Labour Force (unemployment, employment, participation) - CPI — Consumer Price Index (inflation) - WPI — Wage Price Index (wage growth) - AWE — Average Weekly Earnings - JV — Job Vacancies - BA_GCCSA — Building Approvals (by Greater Capital City) - LEND_HOUSING — Lending Indicators / Housing Finance - ANA_AGG — National Accounts (GDP) - ERP_Q — Estimated Resident Population (quarterly) - ABS_ANNUAL_ERP_ASGS2021 — Population (annual; supports SA2/SA3/SA4)
Example: ids = list_curated() # → ['ABS_ANNUAL_ERP_ASGS2021', 'ANA_AGG', 'AWE', 'BA_GCCSA', 'CPI', # 'ERP_Q', 'JV', 'LEND_HOUSING', 'LF', 'WPI']
When to use: - You want to know which dataflows have plain-English support - You're enumerating capabilities programmatically (e.g. building a UI) - You're showing users a "supported topics" list
Returns: Sorted list of dataflow IDs. Always 10 entries today.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must disclose behavior. It states the output is a sorted list of exactly 10 dataflow IDs, and provides the specific IDs. It also notes this is consistent ('Always 10 entries today'). This is sufficient transparency for a read-only list operation.
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 well-structured: a one-sentence purpose, bulleted list of dataflows, example, usage scenarios, and return description. Every sentence adds value, and the most critical 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?
Given the simplicity of the tool (list with no parameters) and no annotations, the description fully covers what an agent needs: purpose, which dataflows, example output, and when to use. No gaps were identified.
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 zero parameters, and schema coverage is 100% (empty schema). The description does not need to add parameter details. It provides relevant context about the fixed list without wasting space. This exceeds the baseline of 3 for high schema 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 explicitly states the tool lists the 10 curated ABS dataflow IDs with plain-English support. It distinguishes itself from siblings like get_data (raw SDMX) and describe_dataset (metadata). Specific verb 'list' and resource 'curated dataflows' clearly define 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 includes a 'When to use' section with three clear scenarios (e.g., knowing which dataflows have plain-English support, enumerating capabilities). While it does not explicitly state when not to use, the context of sibling tools and the description implying other dataflows use get_data with raw codes provides implicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
release_calendarA
Upcoming ABS publication schedule (data releases).
Scrapes the official ABS release calendar
(https://www.abs.gov.au/release-calendar/future-releases-calendar) and
returns each scheduled publication with its release timestamp, title,
reference period, and — when the title maps to a curated abs-mcp
dataset — the dataset_id an agent can plug into get_data or
latest. Curated mappings cover the 10 datasets in list_curated()
plus a handful of commonly-watched non-curated catalogues (Retail
Trade, International Trade in Goods, etc., where dataset_id stays
null but publication_id carries the ABS catalogue number).
release_at is returned with Sydney's local UTC offset (+10:00 AEST
or +11:00 AEDT) — what ABS publishes against. The DST switch is
naive (month-based), within an hour of correct at the changeover
boundary; downstream code should treat the offset as authoritative
rather than re-deriving local time.
Examples: # Next 7 days cal = await release_calendar(7) for r in cal.releases: print(r.release_at, r.title, r.dataset_id)
# Filter to curated datasets only
cal = await release_calendar(30)
curated_releases = [r for r in cal.releases if r.dataset_id]When to use: - Building a webhook / notification feed (ABS publishes at 11:30 AEST) - "What's next from the ABS?" agent answers - Pre-warming caches the morning of a known release
Returns:
ReleaseCalendarResponse — same envelope shape as rba-mcp's
release_calendar for portfolio interop. Sorted ascending by
release_at. stale=True + stale_reason is set when the live
HTML scrape failed and a cached payload was served past TTL.
| Name | Required | Description | Default |
|---|---|---|---|
| days_ahead | No | Horizon in days. Returns ABS publications scheduled to release between now and `now + days_ahead`. Default 30 covers the typical monthly + quarterly cadence. |
Output Schema
| Name | Required | Description |
|---|---|---|
| stale | No | |
| source | No | |
| releases | No | |
| row_count | Yes | |
| source_url | No | |
| attribution | No | |
| horizon_days | Yes | |
| retrieved_at | Yes | |
| stale_reason | No | |
| server_version | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries behavioral disclosure. It details timezone handling with Sydney offset and DST naivety, caching behavior with stale flag, mapping to dataset_id for curated datasets, and output shape. No hidden traits.
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 first, then details, examples, when-to-use, and return format. Every sentence adds value; no fluff. Front-loaded with the core action.
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 (scraping, timezone, caching, mappings) and the presence of an output schema, the description covers all necessary context: source, fields, behavior edge cases, and integration with sibling tools. No 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 sole parameter `days_ahead` has full schema coverage (100%) with description, default, range, and examples. The description adds context about the horizon covering 'typical monthly + quarterly cadence', which enhances understanding 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 clearly states it returns the upcoming ABS publication schedule, names the source URL, and describes the returned fields. It distinguishes itself from sibling tools by focusing on the release calendar, not data retrieval or searching.
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 dedicated 'When to use' section explicitly lists scenarios: building webhooks, agent answers for 'What's next?', and cache pre-warming. It also notes portfolio interop with rba-mcp, providing clear context for appropriate use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_datasetsA
Fuzzy-search ABS dataflow names, descriptions, and keywords.
Use this when you don't know the exact dataset ID. The 10 curated dataflows (LF, CPI, ANA_AGG, etc.) get a relevance boost so common queries like "unemployment" or "gdp" return the right dataset at rank #1 — not one of ABS's 800+ census tables that mention these keywords incidentally.
Examples: # Discover which dataflow answers "what's NSW unemployment?" results = await search_datasets("unemployment") # → [{id: 'LF', name: 'Labour Force', is_curated: True}, ...]
# Broader topic exploration
results = await search_datasets("housing", limit=5)
# → top 5 housing-related dataflows, curated firstWhen to use: - You have a natural-language question and need to identify the dataset - You want to discover what ABS publishes on a topic - You're not sure if a topic has a plain-English (curated) mapping yet
Returns: List of DatasetSummary (id, name, description, is_curated), ranked by relevance. Curated dataflows surface above raw SDMX dataflows.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return, ranked by relevance. Curated dataflows get a +25 score bonus so they surface above ABS's ~800 census tables for common queries. | |
| query | Yes | Free-text search query. Matches against dataflow IDs, names, descriptions, and each curated YAML's search_keywords. Case-insensitive. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully explains behavior: fuzzy matching, boosted curated dataflows, relevance ranking, and return type. Minor omission: does not clarify if authentication or side effects exist, but that's acceptable for a search 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: purpose first, then usage, examples, when-to-use, returns. It is front-loaded and each sentence adds value. A minor redundancy exists between the first 'Use this when...' and the 'When to use' list.
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 simplicity (2 params) and the presence of an output schema, the description covers all needed aspects: functionality, usage context, behavioral details, examples, and return type. It is complete for an agent to use 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 100%, so baseline is 3. The description adds value by explaining the +25 score bonus for curated dataflows and providing examples, exceeding what the schema alone offers.
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 'Fuzzy-search ABS dataflow names, descriptions, and keywords.' It specifies the verb (fuzzy-search) and resources (dataflow names, descriptions, keywords), and differentiates from sibling tools like describe_dataset and get_data by noting it's for when you don't know the exact ID.
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 explicitly says 'Use this when you don't know the exact dataset ID' and provides a list of when-to-use scenarios. However, it does not explicitly say when not to use it or contrast with specific sibling tools like list_curated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
top_nA
Return the N rows with the largest (or smallest) value of a measure.
Ranks across the most-recent available period only (uses lastNObservations=1 under the hood) so the result is a clean "top N entities at the latest period" view — not noisy historical highs.
This is the most common agent workflow: "show me the top 10 X by Y". Without this tool, an agent would call get_data, receive the full time series, and then sort/slice locally — wasting tokens and turns. top_n does the rank server-side and returns only the requested rows.
Examples: # 5 states with the highest current unemployment rate top_n("LF", "unemployment_rate", n=5)
# 10 GCCSAs with the largest populations
top_n("ABS_ANNUAL_ERP_ASGS2021", "estimated_resident_population",
n=10, filters={"region_type": "gccsa"})
# 3 industries with the lowest wage growth
top_n("WPI", "wage_price_index", n=3, direction="bottom")Returns:
DataResponse with at most n records, sorted by measure value
in the requested direction. Other fields (period, unit, attribution)
match a regular get_data call.
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | How many top (or bottom) rows to return. | |
| filters | No | Optional additional dimension filters, same shape as get_data. Do NOT include the 'measure' key here — that is supplied via the `measure` parameter. | |
| measure | Yes | Plain-English measure key to rank by — one of the curated measure values for this dataflow. Use the describe endpoint or describe tool to see available measures. | |
| direction | No | 'top' returns the N rows with the LARGEST measure values (highest unemployment_rate, biggest population, etc.). 'bottom' returns the SMALLEST. | top |
| dataset_id | Yes | ABS dataflow ID. Must be a curated dataflow with a 'measure' dimension. Use the list-curated endpoint or list tool to enumerate. |
Output Schema
| Name | Required | Description |
|---|---|---|
| csv | No | |
| unit | No | |
| query | No | |
| stale | No | |
| period | No | |
| source | No | |
| abs_url | Yes | Click-through URL for this dataset's source page. abs-mcp legacy name — prefer source_url (canonical) for new code. Both fields are populated identically. |
| records | No | |
| row_count | No | Number of observation rows in records. |
| dataset_id | Yes | |
| source_url | Yes | Canonical click-through URL. Same value as abs_url; both populated for backward compat. |
| attribution | No | |
| dataset_name | Yes | |
| retrieved_at | Yes | |
| stale_reason | No | |
| truncated_at | No | |
| server_version | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description fully covers behavioral aspects: it uses lastNObservations=1, ranks only the most-recent period, performs server-side ranking, and returns a DataResponse. This provides complete transparency for an agent.
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 rationale, examples, and return format. Every sentence adds value, and it is appropriately concise without omitting necessary details.
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 presence of an output schema, the description adequately explains the return shape (DataResponse with at most n records, sorted) and mentions other fields. It covers all relevant aspects for a ranking tool.
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%, establishing a baseline of 3. The description enhances understanding with examples, clarifies the 'direction' parameter, and warns not to include 'measure' in filters, adding 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 clearly defines the tool's function: returning top or bottom N rows by a measure. It distinguishes from siblings like get_data by highlighting server-side ranking and efficiency, and provides concrete examples.
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 explains when to use ('most common agent workflow') and contrasts with get_data to avoid wasteful local sorting. While it lacks explicit 'when not to use' statements, the context and alternatives are clear.
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.
7 tool updates
v0.13.2- Added
describe_dataset - Added
get_data - Added
latest - Added
list_curated - Added
release_calendar - Added
search_datasets - Added
top_n
5 tool updates
v0.11.10- Removed
describe_dataset - Removed
get_data - Removed
latest - Removed
list_curated - Removed
search_datasets
2 tool updates
v0.2.12- Changed
describe_dataset1 field changed- added
Output schema / properties / hidden_defaultsAdded value: +{ + "items": { + "properties": { + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "name": { + "type": "string" + }, + "sdmx_id": { + "type": "string" + }, + "values": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "label": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "sdmx_code": { + "type": "string" + } + }, + "required": [ + "key", + "sdmx_code" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "name", + "sdmx_id", + "values" + ], + "type": "object" + }, + "type": "array" +}
- Changed
get_data5 fields changed- changed
Input schema / properties / end_period / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / end_period / examplesPrevious value: -[ - "2025", - "2025-12", - "2025-Q4" -]New value: +[ + "2025", + "2025-12", + "2025-Q4", + 2025 +] - changed
Input schema / properties / start_period / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / start_period / descriptionPrevious value: -"Inclusive start period. Format follows the dataflow's cadence: annual 'YYYY' (e.g. '2020'), monthly 'YYYY-MM' (e.g. '2024-03'), quarterly 'YYYY-Q1', half-yearly 'YYYY-S1', daily 'YYYY-MM-DD'. URL-unsafe characters (?, &, /, etc.) are rejected at the boundary."New value: +"Inclusive start period. Format follows the dataflow's cadence: annual 'YYYY' (e.g. '2020'), monthly 'YYYY-MM' (e.g. '2024-03'), quarterly 'YYYY-Q1', half-yearly 'YYYY-S1', daily 'YYYY-MM-DD'. An int year (e.g. 2024) is also accepted and treated as 'YYYY'. URL-unsafe characters (?, &, /, etc.) are rejected at the boundary." - changed
Input schema / properties / start_period / examplesPrevious value: -[ - "2020", - "2024-03", - "2024-Q1", - "2024-S1" -]New value: +[ + "2020", + "2024-03", + "2024-Q1", + "2024-S1", + 2020 +]
4 tool updates
v0.2.11- Changed
describe_dataset2 fields changed- added
Input schema / properties / dataset_id / descriptionAdded value: +"ABS dataflow ID. Use search_datasets to discover, or list_curated to enumerate the 10 dataflows with plain-English support. Case-insensitive — 'lf', 'LF', and ' LF ' all resolve to 'LF'." - added
Input schema / properties / dataset_id / examplesAdded value: +[ + "LF", + "CPI", + "LEND_HOUSING", + "ANA_AGG", + "ABS_ANNUAL_ERP_ASGS2021" +]
- Changed
get_data12 fields changed- added
Input schema / properties / dataset_id / descriptionAdded value: +"ABS dataflow ID like 'LF', 'CPI'. Use search_datasets to discover." - added
Input schema / properties / dataset_id / examplesAdded value: +[ + "LF", + "CPI", + "LEND_HOUSING", + "ANA_AGG" +] - added
Input schema / properties / end_period / descriptionAdded value: +"Inclusive end period. Same format as start_period." - added
Input schema / properties / end_period / examplesAdded value: +[ + "2025", + "2025-12", + "2025-Q4" +] - added
Input schema / properties / filters / descriptionAdded value: +"Dimension filters. For curated dataflows: plain-English keys and values, e.g. {'region': 'nsw', 'measure': 'unemployment_rate'}. For raw dataflows: SDMX dimension IDs and codes. Pass a list as the value to query multiple values for a dimension. Whitespace is stripped; empty list / empty value rejected with a hint." - added
Input schema / properties / filters / examplesAdded value: +[ + { + "measure": "unemployment_rate", + "region": "nsw" + }, + { + "measure": "employed_persons", + "region": [ + "nsw", + "vic", + "qld" + ] + }, + { + "measure": "change_year", + "region": "australia" + } +] - added
Input schema / properties / format / descriptionAdded value: +"Response shape. 'records' (default): flat list of observations. 'series': observations grouped by dimension key for chart-friendly shapes. 'csv': returns the table as a CSV string in the `csv` field with records empty." - added
Input schema / properties / format / examplesAdded value: +[ + "records", + "series", + "csv" +] - added
Input schema / properties / start_period / descriptionAdded value: +"Inclusive start period. Format follows the dataflow's cadence: annual 'YYYY' (e.g. '2020'), monthly 'YYYY-MM' (e.g. '2024-03'), quarterly 'YYYY-Q1', half-yearly 'YYYY-S1', daily 'YYYY-MM-DD'. URL-unsafe characters (?, &, /, etc.) are rejected at the boundary." - added
Input schema / properties / start_period / examplesAdded value: +[ + "2020", + "2024-03", + "2024-Q1", + "2024-S1" +] - added
Output schema / properties / attributionAdded value: +{ + "default": "Data sourced from the Australian Bureau of Statistics and licensed under Creative Commons Attribution 4.0 International (CC BY 4.0). https://www.abs.gov.au/about/copyright-and-creative-commons", + "type": "string" +} - added
Output schema / properties / server_versionAdded value: +{ + "type": "string" +}
- Changed
latest6 fields changed- added
Input schema / properties / dataset_id / descriptionAdded value: +"ABS dataflow ID. Use search_datasets to discover." - added
Input schema / properties / dataset_id / examplesAdded value: +[ + "LF", + "CPI", + "ANA_AGG", + "LEND_HOUSING" +] - added
Input schema / properties / filters / descriptionAdded value: +"Dimension filters. For curated dataflows: plain-English keys and values. Without filters, expect one observation per dimension combination (often hundreds) — pass at least region + measure for a clean single number." - added
Input schema / properties / filters / examplesAdded value: +[ + { + "measure": "unemployment_rate", + "region": "nsw" + }, + { + "measure": "change_year", + "region": "australia" + }, + { + "region": "1GSYD", + "region_type": "gccsa" + } +] - added
Output schema / properties / attributionAdded value: +{ + "default": "Data sourced from the Australian Bureau of Statistics and licensed under Creative Commons Attribution 4.0 International (CC BY 4.0). https://www.abs.gov.au/about/copyright-and-creative-commons", + "type": "string" +} - added
Output schema / properties / server_versionAdded value: +{ + "type": "string" +}
- Changed
search_datasets6 fields changed- added
Input schema / properties / limit / descriptionAdded value: +"Maximum number of results to return, ranked by relevance. Curated dataflows get a +25 score bonus so they surface above ABS's ~800 census tables for common queries." - added
Input schema / properties / limit / examplesAdded value: +[ + 5, + 10, + 20 +] - added
Input schema / properties / limit / maximumAdded value: +100 - added
Input schema / properties / limit / minimumAdded value: +1 - added
Input schema / properties / query / descriptionAdded value: +"Free-text search query. Matches against dataflow IDs, names, descriptions, and each curated YAML's search_keywords. Case-insensitive." - added
Input schema / properties / query / examplesAdded value: +[ + "unemployment", + "inflation", + "gdp", + "housing finance", + "wage growth" +]
5 tool updates
v0.2.9- First observed
describe_dataset - First observed
get_data - First observed
latest - First observed
list_curated - First observed
search_datasets
TDQS
Scored across 7 tools
Each tool has a clearly distinct purpose: describe for metadata, get_data for historical data, latest for current, list_curated for curated IDs, release_calendar for schedule, search for discovery, top_n for ranking. No overlap in functionality.
Most tool names follow a verb_noun pattern (describe_dataset, search_datasets, list_curated), but get_data, top_n, and release_calendar use different forms. However, all are snake_case and descriptive, making them predictable.
Seven tools cover the essential operations for a statistics bureau server: metadata discovery, data retrieval, listing curated sources, release schedule, and search. The scope is neither too broad nor too narrow.
The tool set covers querying, latest values, ranking, metadata description, search, and release calendar. For a read-only statistical data portal, this is comprehensive; no obvious gaps for common workflows.
Maintenance
Related MCP Connectors
Australian economic data from the ABS, RBA, and APRA: CPI, GDP, cash rate, labour, and more.
Australian Bureau of Statistics (ABS) Data API MCP.
Macro data for AI agents: GDP, inflation, unemployment and more (World Bank, US BLS). No keys.
Macro data for AI agents: GDP, inflation, unemployment and more (World Bank, US BLS). No keys.
Related MCP Servers
- FlicenseCqualityFmaintenanceProvides access to the Australian Bureau of Statistics (ABS) Data API. This server allows AI assistants to query and analyze ABS statistical data.19-
- FlicenseNot gradedqualityDmaintenanceProvides access to Federal Reserve Economic Data (FRED) through Claude and other LLM clients, enabling users to search for, retrieve, and visualize economic indicators like GDP, employment, and inflation data.8-
- AlicenseAqualityBmaintenanceOne-call Australian economic data plumbing via the RBA — cited responses for rates and macro series, not a data broker.6MIT
- AlicenseNot gradedqualityCmaintenanceWraps the Bureau of Labor Statistics public API v2 to provide economic data through natural language queries or direct tool calls.1 npmMIT