Australian Prudential Regulation Authority
This MCP server provides plain-English access to Australian Prudential Regulation Authority (APRA) statistics, covering banking, superannuation, and insurance data for every prudentially-regulated entity in Australia, quarter by quarter.
Core Tools:
search_datasets: Fuzzy-search the curated catalog by keyword (e.g., "bank capital", "superannuation", "insurance premium").list_curated: Enumerate all 7 available curated dataset IDs.describe_dataset: Get metadata including filterable dimensions, returnable measures, units, period coverage, source URLs, and framework break information.get_data: Query observations with dimension filters, measure selection, date ranges (YYYY-MM-DD, YYYY-Qx, YYYY), and output formats (records, series, or CSV).latest: Retrieve the most recent observation per measure — ideal for current snapshots like "What's CBA's current CET1 ratio?"top_n: Rank entities by a measure and return the top or bottom N rows — e.g., "Top 10 banks by total capital" or "5 super funds with the most members."
Available Datasets:
ID | Description |
| Per-bank CET1, Tier 1, Total capital, and RWA |
| Per-bank RWA by risk type (credit, operational, market, IRRBB) |
| Fund-by-fund members, benefits, and demographics |
| Post-AASB17 general insurance (Sep 2023 → latest) |
| Pre-AASB17 general insurance archive (Dec 2002 → Jun 2023) |
| Post-AASB17 life insurance (Sep 2023 → latest) |
| Pre-AASB17 life insurance archive (Jun 2008 → Jun 2023) |
Notable Features:
Insurance datasets are split at the AASB-17 reporting break (Q3 2023) to prevent accidental splicing of incomparable data.
A 3-tier URL resolution system (live scrape → bundled manifest → YAML default) ensures data freshness even if APRA's landing page changes.
State/territory filters accept multiple formats (codes, names, ISO codes, postcodes) via the
aus-identitylibrary.
apra-mcp
mcp-name: io.ausdata/apra-mcp
MCP server for Australian Prudential Regulation Authority statistics. Plain-English access to per-bank capital ratios, fund-by-fund superannuation, and post-AASB17 life + general insurance — every prudentially-regulated entity in Australia, every quarter, from a single uvx command.
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).
"What's CBA's CET1 ratio?"
"Which super fund has the most members?"
"Top 10 banks by total capital, latest quarter"
"Gross written premium for the general insurance industry, post-AASB17"
"Largest life insurance product groups by claims"Sister to abs-mcp, rba-mcp, ato-mcp, and au-weather-mcp.
Install
uvx --upgrade apra-mcpClaude Desktop
{
"mcpServers": {
"apra": { "command": "uvx", "args": ["--upgrade", "apra-mcp"] }
}
}Claude Code
claude mcp add apra --command uvx --args -- --upgrade apra-mcpRelated MCP server: ato-mcp
What it exposes
Six tools, all plain-English in, structured out:
Tool | Purpose |
| Fuzzy-search the curated catalog by keyword |
| List a dataset's filterable dimensions and returnable measures |
| Query with |
| Last observation per measure (shortcut) |
| Rank rows by a measure, return top (or bottom) N |
| Enumerate the curated dataset IDs |
Every response is the same shape — dataset_id, dataset_name, query, period, unit, row_count, records, apra_url, download_url, framework (insurance only), attribution, stale flag, server_version — across every curated dataset.
Curated datasets (7 in v0.1)
ID | What it is | Period |
| Per-bank CET1 / Tier 1 / Total capital + RWA | latest quarter snapshot |
| Per-bank RWA by risk type (credit / operational / market / IRRBB) | latest quarter snapshot |
| Fund-by-fund members, benefits, demographics | latest quarter snapshot |
| Long-format general insurance (post-AASB17, ~24k rows × 10 quarters) | Sep 2023 → latest |
| General insurance archive (pre-AASB17) | Dec 2002 → Jun 2023 |
| Long-format life insurance (post-AASB17, ~10k rows × 10 quarters) | Sep 2023 → latest |
| Life insurance archive (pre-AASB17) | Jun 2008 → Jun 2023 |
Snapshot vs time-series. ADI and Super datasets ship the most recent reporting quarter only (APRA refreshes the file each quarter). The four insurance datasets are long time series in a single file. Pass
start_period/end_periodas ISO dates (2025-12-31), bare years (2024), year-months (2025-06), or quarter shorthand (2025-Q4) — all normalised internally.
Cross-source compatibility. The
state_territoryfilter onINSURANCE_GENERALaccepts canonical state codes ("NSW"), full names ("New South Wales"), case-insensitive variants ("nsw"), ISO 3166-2 ("AU-NSW"), and 4-digit postcodes ("2000"→ New South Wales). Powered byaus-identity— the same input format works across abs-mcp, ato-mcp, apra-mcp, aihw-mcp, and asic-mcp.
Reliability — 3-tier URL resolution
APRA publishes XLSX at date-versioned paths that change every quarter. apra-mcp resolves them through three tiers:
Live scrape — fetch the canonical APRA landing page (with ETag conditional-GET so refreshes between releases cost zero bytes), regex-extract the .xlsx href matching the dataset's filename pattern, pick the latest-dated match. Cached 6h.
Bundled seed manifest — when the live scrape fails, fall back to
data/seed_urls.jsonshipped in the wheel. CI refreshes the manifest daily. The response is flaggedstale: truewith an honest reason.YAML default — last-resort URL from the curated YAML.
Net effect: a fresh uvx apra-mcp always gets the current quarter; a 3-month-old install still works because the seed manifest is refreshed and --upgrade pulls a new wheel.
Framework break (insurance only)
APRA changed the reporting framework on 1 July 2023 (AASB 17 Insurance Contracts + capital framework revision). Pre- and post-break data are not directly comparable — APRA's own guidance is explicit. apra-mcp ships paired datasets:
INSURANCE_GENERAL(post-AASB17) +INSURANCE_GENERAL_HISTORICAL(pre-AASB17)LIFE_INSURANCE(post-AASB17) +LIFE_INSURANCE_HISTORICAL(pre-AASB17)
Every response on an insurance dataset includes a framework block surfacing the break + a historical_dataset cross-reference, so agents see the warning before splicing series.
Attribution
Data sourced from the Australian Prudential Regulation Authority. Licensed under Creative Commons Attribution 3.0 Australia (CC BY 3.0 AU). apra-mcp is MIT-licensed; APRA's data carries the upstream CC-BY 3.0 AU licence, echoed in every response's attribution field.
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 — 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 — this one. Banks, super, insurance.
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
Development
git clone https://github.com/Bigred97/apra-mcp.git
cd apra-mcp
uv venv
uv pip install -e ".[dev]"
pytest # unit tests
pytest -m live # integration tests against apra.gov.auIssues and contributions welcome: github.com/Bigred97/apra-mcp/issues.
Available Tools
6 toolsdescribe_datasetA
Describe a dataset's filterable dimensions, returnable measures, units, source, and (for insurance) framework break info.
Use this before calling get_data on a new dataset — it tells you the valid filter keys ('institution', 'sector', 'data_item'), the valid enumerated filter values ('cba', 'major_banks'), the measure aliases ('cet1_ratio', 'total_capital'), and the canonical source URL.
For insurance datasets, the response includes a framework block
documenting the Q3-2023 AASB-17 break.
Returns: DatasetDetail with id, name, description, period_coverage, list of dimensions, list of measures, source_url, download_url, and optional framework info.
| Name | Required | Description | Default |
|---|---|---|---|
| dataset_id | Yes | Curated dataset ID. Use the search endpoint or search tool to discover, or the list-curated endpoint/tool to enumerate. Case-insensitive. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| measures | No | |
| framework | No | |
| dimensions | No | |
| is_curated | Yes | |
| source_url | Yes | |
| description | Yes | |
| download_url | No | |
| period_coverage | No | |
| update_frequency | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must bear the burden. It states the tool returns a DatasetDetail with specific fields, implying a read-only operation. However, it does not mention authentication, rate limits, or safety guarantees, which would 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 with paragraphs and bullet points, effectively front-loading the purpose. It is concise with no redundant information, though slightly verbose in listing return fields.
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 single parameter and presence of an output schema, the description sufficiently explains the tool's purpose, usage, and return structure. It covers the key aspects for an agent to correctly invoke it.
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 dataset_id having a description and examples. The description adds context (case-insensitive, curated) but does not significantly augment the schema beyond that. 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 clearly states the tool describes a dataset's filterable dimensions, measures, units, source, and framework break info. It uses specific verbs and resources, distinguishing it from siblings 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 advises using this tool before get_data on a new dataset, detailing the information it provides. While it does not list explicit exclusions or alternatives, the guidance is clear and contextually sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dataA
Query a curated APRA dataset and return observations.
Examples: # CBA's CET1 ratio over time resp = await get_data( "ADI_KEY_STATS", filters={"institution": "cba"}, measures="cet1_ratio", )
# Major banks' total capital, last 5 quarters
resp = await get_data(
"ADI_KEY_STATS",
filters={"sector": "major_banks"},
measures="total_capital",
start_period="2024-01-01",
)
# Total industry gross written premium (general insurance)
resp = await get_data(
"INSURANCE_GENERAL",
filters={"data_item": "Gross written premium",
"industry_segment": "total_industry"},
)
# AustralianSuper member account counts
resp = await get_data(
"SUPER_FUND_LEVEL",
filters={"fund_name": "australian_super"},
measures=["total_member_accounts", "total_members_benefits"],
)Returns: DataResponse with records (or csv), unit, period bounds, row_count, source URL, the actual download_url used, optional framework info (insurance only), and CC-BY 3.0 AU attribution.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Response shape. 'records' (default): flat list of observations. 'series': grouped by measure. 'csv': pandas CSV string in `csv` field. | records |
| filters | No | Dimension filters. Keys are plain-English aliases from the dataset's describe_dataset response. Values are matched against the source data; pass a list to OR across values. Permissive dimensions (e.g. institution, fund_name, data_item) accept any string — including substring search via trailing '*' (e.g. {'institution': 'macquarie*'}). | |
| measures | No | Which measure(s) to return. Plain-English keys from describe_dataset. Omit to return all measures. For long-format datasets (insurance), the single measure is 'value' and the semantic metric lives in the 'data_item' dimension filter. | |
| dataset_id | Yes | Curated dataset ID. Use the search or list-curated endpoint/tool to discover. | |
| end_period | No | Inclusive end period. Same format as start_period. | |
| start_period | No | Inclusive start period. Format: 'YYYY-MM-DD' (e.g. '2024-01-01'), 'YYYY-Qx' (e.g. '2024-Q1'), or 'YYYY'. Matched against the dataset's period_column (quarter-end date). Bare int years like 2024 are coerced to '2024' automatically. |
Output Schema
| Name | Required | Description |
|---|---|---|
| csv | No | |
| unit | No | |
| query | No | |
| stale | No | |
| period | No | |
| source | No | |
| records | No | |
| apra_url | Yes | Click-through URL for this dataset's source page. apra-mcp legacy name — prefer source_url (canonical) for new code. Both fields are populated identically. |
| framework | No | |
| row_count | No | |
| dataset_id | Yes | |
| source_url | Yes | Canonical click-through URL. Same value as apra_url; both populated for backward compat. |
| attribution | No | |
| dataset_name | Yes | |
| download_url | No | |
| 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 must bear the full transparency burden. It states it returns observations and lists return fields but does not disclose read-only behavior, rate limits, or error conditions. While informative on output, it lacks explicit behavioral traits beyond what is obvious.
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 a clear purpose statement, but the inclusion of four example blocks and a returns list makes it longer than necessary. While examples are helpful, the description could be more concise to improve readability.
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 (6 parameters, output schema present), the description provides examples and lists return fields, which is nearly complete. It does not mention pagination or limits, but the return structure is adequately described. Overall, it is well-rounded for a data retrieval 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%, so the baseline is 3. The description adds examples that illustrate parameter usage, but the schema already contains detailed descriptions and examples. The additional value is marginal; the description does not significantly clarify parameter semantics 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 the tool queries a curated APRA dataset and returns observations, using a specific verb ('Query') and resource ('APRA dataset'). This distinguishes it from siblings like search_datasets (discovery) and describe_dataset (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?
The description provides multiple examples showing common use cases but does not explicitly state when to use this tool versus alternatives. Sibling names imply differentiation, but no direct 'when-not' or alternative references are given.
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 per measure for a dataset.
Trims to the single latest period per measure across the filtered slice
— useful for "what's CBA's current CET1?" style questions without having
to think about start_period. Wide-layout entity-level datasets
(INSURANCE_GENERAL etc.) are capped at limit rows.
Examples: # Latest CBA capital ratios resp = await latest("ADI_KEY_STATS", filters={"institution": "cba"})
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows to return. Wide-layout entity-level datasets (INSURANCE_GENERAL ~2,000 rows per quarter) can blow an agent's context window without a cap. Pass filters to narrow to one entity; raise `limit` only if you genuinely need a bulk dump. Truncated responses set DataResponse.truncated_at to the original row count. | |
| filters | No | Same filter shape as get_data. Useful for narrowing to one entity. | |
| measures | No | Same as get_data. | |
| dataset_id | Yes | Curated dataset ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| csv | No | |
| unit | No | |
| query | No | |
| stale | No | |
| period | No | |
| source | No | |
| records | No | |
| apra_url | Yes | Click-through URL for this dataset's source page. apra-mcp legacy name — prefer source_url (canonical) for new code. Both fields are populated identically. |
| framework | No | |
| row_count | No | |
| dataset_id | Yes | |
| source_url | Yes | Canonical click-through URL. Same value as apra_url; both populated for backward compat. |
| attribution | No | |
| dataset_name | Yes | |
| download_url | No | |
| 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; the description fully explains the trimming logic, row cap for wide-layout datasets, and truncated response indicator, exceeding basic expectations.
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?
Every sentence adds value: purpose, trimming logic, row cap note, and example. No redundancy, front-loaded with 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?
Covers purpose, use case, behavior, and example adequately. With an output schema existing, return values need no further explanation. Minor improvement could include error handling, but not essential.
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 context for limit (capping, truncation), filters (same shape as get_data), and measures (referencing get_data), raising it to 4.
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 per measure for a dataset.' with examples like 'Latest CBA capital ratios,' clearly distinguishing it from siblings such as get_data (raw data) and top_n (top values).
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 advises use for 'current value' queries without specifying periods, but does not explicitly exclude alternatives or list when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_curatedA
List every curated dataset ID in this version of apra-mcp.
Returns: Sorted list of dataset IDs.
| 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, the description must disclose behaviors. It says the tool returns a sorted list, which implies a read operation, but does not mention potential performance impacts, auth needs, or pagination (if any). For a simple list tool, this is minimally adequate.
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?
Two concise sentences with no fluff: first states purpose and scope, second states return format. Every word earns its place.
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 zero parameters and an output schema, the description covers the essential information: it lists all curated dataset IDs, sorted. No gaps remain for an agent to understand its function.
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?
There are no parameters, so schema coverage is 100%. The description adds no extra meaning, but baseline for 0 parameters is 4. No improvements needed.
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 lists every curated dataset ID, using the specific verb 'List' and specifying the resource. It distinguishes itself from siblings like describe_dataset (which describes one) and search_datasets (which filters), even without 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?
No guidance is given on when to use this tool versus alternatives such as search_datasets or top_n. The description simply states what it does, without any context for selection or exclusions.
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 the curated APRA dataset catalog.
All datasets ship hand-curated in v0.1: per-bank capital ratios, per-bank risk-weighted assets, fund-by-fund superannuation, and post-AASB17 life + general insurance (with separate historical archives for the pre-Q3-2023 reporting framework).
Examples: # Find the dataset for bank capital ratios results = await search_datasets("bank capital cet1") # → [{id: 'ADI_KEY_STATS', name: 'ADI Key Statistics — entity-level...', ...}]
# Discover what's available on insurance
results = await search_datasets("insurance premium")Returns: List of DatasetSummary (id, name, description, update_frequency, is_curated), ranked by relevance.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return, ranked by relevance. | |
| query | Yes | Free-text search query. Matches against dataset IDs, names, descriptions, and curated 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 explains that the search is fuzzy, case-insensitive, and returns ranked results. It does not explicitly state read-only or safe behavior, but the examples and return type imply no destructive side effects. Could be more transparent about permissions or performance.
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 purpose, list of included datasets, examples, and return type. It is slightly verbose but each section serves a purpose. Front-loading the main verb and resource is effective.
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 and the description's explanation of return fields (DatasetSummary), the description is fairly complete. It covers the tool's scope, usage, and examples, though it could benefit from mentioning if there are any limitations or prerequisites.
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%, with clear descriptions for both 'query' and 'limit' parameters. The tool description adds examples and context about the catalog but does not significantly enhance 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's a fuzzy-search tool for a curated APRA dataset catalog, lists example datasets, and provides usage examples. It distinguishes from siblings like describe_dataset and list_curated by focusing on discovery via free-text search.
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 when to use (to find datasets) but does not explicitly contrast with sibling tools or state when not to use it. No direct guidance on alternatives, leaving the agent to infer context.
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.
The single most common agent workflow: "show me the top 10 X by Y". top_n does the rank server-side and returns only the requested rows.
Examples: # Biggest 10 banks by total capital, latest quarter top_n("ADI_KEY_STATS", "total_capital", n=10, filters={"period": "2025-12-31"})
# Most members per super fund (latest)
top_n("SUPER_FUND_LEVEL", "total_member_accounts", n=10,
filters={"period": "2025-12-31"})
# 5 lowest CET1 ratios in the latest quarter
top_n("ADI_KEY_STATS", "cet1_ratio", n=5, direction="bottom",
filters={"period": "2025-12-31"})Returns:
DataResponse with at most n records, sorted by measure in the
requested direction. Other fields match get_data.
| Name | Required | Description | Default |
|---|---|---|---|
| n | No | How many top (or bottom) rows to return. | |
| filters | No | Optional dimension filters, same shape as get_data. Typically you'll pin a single period to make rank meaningful (e.g. {'period': '2025-12-31'} for the latest quarter). | |
| measure | Yes | Plain-English measure key to rank by. Use the describe endpoint or describe tool to see available measures. | |
| direction | No | 'top' returns the N rows with the LARGEST measure values (biggest bank, highest capital, largest fund). 'bottom' returns the SMALLEST. | top |
| dataset_id | Yes | Curated dataset ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| csv | No | |
| unit | No | |
| query | No | |
| stale | No | |
| period | No | |
| source | No | |
| records | No | |
| apra_url | Yes | Click-through URL for this dataset's source page. apra-mcp legacy name — prefer source_url (canonical) for new code. Both fields are populated identically. |
| framework | No | |
| row_count | No | |
| dataset_id | Yes | |
| source_url | Yes | Canonical click-through URL. Same value as apra_url; both populated for backward compat. |
| attribution | No | |
| dataset_name | Yes | |
| download_url | No | |
| 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?
With no annotations, the description fully discloses behavior: server-side ranking, limited rows, sorted by measure in requested direction, and return shape matching get_data. No contradictions or omissions.
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?
Sparse yet complete: one sentence for purpose, concise explanation, three clear examples, and one-line return note. Every sentence contributes meaning with no 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?
Covers workflow, parameters, examples, return behavior, and even references related tools (describe). Given five parameters and output schema, this is fully self-contained guidance.
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 significant value with practical examples, context (e.g., pinning a period), and references to describe tool. The inline examples demonstrate usage tying parameters together.
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 N rows with largest/smallest value of a measure, using specific verbs and resource. It distinguishes itself from siblings like get_data by focusing on ranking and limiting results server-side.
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 calls it the 'single most common agent workflow' and provides examples, implying when to use. However, it lacks explicit guidance on when not to use or alternatives, which would elevate it to a 5.
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.
6 tool updates
v0.8.19- Added
describe_dataset - Added
get_data - Added
latest - Added
list_curated - Added
search_datasets - Added
top_n
6 tool updates
v0.8.17- Removed
describe_dataset - Removed
get_data - Removed
latest - Removed
list_curated - Removed
search_datasets - Removed
top_n
3 tool updates
v0.1.1- Changed
get_data1 field changed- changed
Output schema / properties / attribution / defaultPrevious value: -"Source: Australian Prudential Regulation Authority. Licensed under Creative Commons Attribution 4.0 International (https://creativecommons.org/licenses/by/4.0/)."New value: +"Source: Australian Prudential Regulation Authority. Licensed under Creative Commons Attribution 3.0 Australia (https://creativecommons.org/licenses/by/3.0/au/)."
- Changed
latest1 field changed- changed
Output schema / properties / attribution / defaultPrevious value: -"Source: Australian Prudential Regulation Authority. Licensed under Creative Commons Attribution 4.0 International (https://creativecommons.org/licenses/by/4.0/)."New value: +"Source: Australian Prudential Regulation Authority. Licensed under Creative Commons Attribution 3.0 Australia (https://creativecommons.org/licenses/by/3.0/au/)."
- Changed
top_n1 field changed- changed
Output schema / properties / attribution / defaultPrevious value: -"Source: Australian Prudential Regulation Authority. Licensed under Creative Commons Attribution 4.0 International (https://creativecommons.org/licenses/by/4.0/)."New value: +"Source: Australian Prudential Regulation Authority. Licensed under Creative Commons Attribution 3.0 Australia (https://creativecommons.org/licenses/by/3.0/au/)."
6 tool updates
v0.1.0- First observed
describe_dataset - First observed
get_data - First observed
latest - First observed
list_curated - First observed
search_datasets - First observed
top_n
TDQS
Scored across 6 tools
Each tool has a distinct and clearly defined purpose: describe_dataset for metadata, get_data for querying, latest for most recent values, list_curated for dataset IDs, search_datasets for discovery, and top_n for ranking. There is no overlap or ambiguity between tool functions.
All tool names follow a consistent snake_case verb_noun or verb pattern (e.g., describe_dataset, get_data, list_curated, search_datasets). Even 'latest' functions as a verb in context. No mixing of conventions.
Six tools is appropriate for the server's purpose of querying curated APRA datasets. It covers discovery, metadata, data retrieval, latest observations, and top ranking without being excessive or thin.
The tool set provides a complete workflow for interacting with curated datasets: search and list to find datasets, describe to understand structure, get_data for arbitrary queries, latest for current values, and top_n for ranking. No essential operations are missing.
Maintenance
Related MCP Connectors
Australian economic data from the ABS, RBA, and APRA: CPI, GDP, cash rate, labour, and more.
- RedbarkOAuthcom.redbark
Live AU/NZ bank (CDR) and brokerage data for AI agents, plus management of Redbark syncs and rules
RBA MCP — Reserve Bank of Australia statistics (free, no auth).
Australian property and suburb data: valuations, sales, rents, schools, risk and zoning.
Related MCP Servers
- AlicenseAqualityBmaintenanceOne-call Australian economic data plumbing via the RBA — cited responses for rates and macro series, not a data broker.698 PyPIMIT
- AlicenseAqualityBmaintenanceOne-call Australian tax data plumbing via the ATO — cited responses for tax and super context, not a data broker.7124 PyPIMIT
- AlicenseAqualityAmaintenanceMCP server for structured Australian macroeconomic and financial data from the Australian Bureau of Statistics (ABS), the Reserve Bank of Australia (RBA), and the Australian Prudential Regulation Authority (APRA).214114 PyPI4MIT
- AlicenseAqualityFmaintenanceCited Australian stats via the ausdata.io gateway — stable AU.* series IDs, source_url + retrieved_at on every response. Free tier. Not a data broker; upgrade for Embed / signed / webhooks.2876 npm2MIT