Skip to main content
Glama
Bigred97

Australian Prudential Regulation Authority

apra-mcp

mcp-name: io.ausdata/apra-mcp

PyPI Python License Tests CodeQL Glama MCP server quality

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-mcp

Claude Desktop

{
  "mcpServers": {
    "apra": { "command": "uvx", "args": ["--upgrade", "apra-mcp"] }
  }
}

Claude Code

claude mcp add apra --command uvx --args -- --upgrade apra-mcp

Related MCP server: ato-mcp

What it exposes

Six tools, all plain-English in, structured out:

Tool

Purpose

search_datasets

Fuzzy-search the curated catalog by keyword

describe_dataset

List a dataset's filterable dimensions and returnable measures

get_data

Query with filters, measures, period range, output format

latest

Last observation per measure (shortcut)

top_n

Rank rows by a measure, return top (or bottom) N

list_curated

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

ADI_KEY_STATS

Per-bank CET1 / Tier 1 / Total capital + RWA

latest quarter snapshot

ADI_RISK_WEIGHTED_ASSETS

Per-bank RWA by risk type (credit / operational / market / IRRBB)

latest quarter snapshot

SUPER_FUND_LEVEL

Fund-by-fund members, benefits, demographics

latest quarter snapshot

INSURANCE_GENERAL

Long-format general insurance (post-AASB17, ~24k rows × 10 quarters)

Sep 2023 → latest

INSURANCE_GENERAL_HISTORICAL

General insurance archive (pre-AASB17)

Dec 2002 → Jun 2023

LIFE_INSURANCE

Long-format life insurance (post-AASB17, ~10k rows × 10 quarters)

Sep 2023 → latest

LIFE_INSURANCE_HISTORICAL

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_period as 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_territory filter on INSURANCE_GENERAL accepts 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 by aus-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:

  1. 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.

  2. Bundled seed manifest — when the live scrape fails, fall back to data/seed_urls.json shipped in the wheel. CI refreshes the manifest daily. The response is flagged stale: true with an honest reason.

  3. 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.au

Issues and contributions welcome: github.com/Bigred97/apra-mcp/issues.

Available Tools

6 tools
describe_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataset_idYesCurated dataset ID. Use the search endpoint or search tool to discover, or the list-curated endpoint/tool to enumerate. Case-insensitive.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
nameYes
measuresNo
frameworkNo
dimensionsNo
is_curatedYes
source_urlYes
descriptionYes
download_urlNo
period_coverageNo
update_frequencyNo

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNoResponse shape. 'records' (default): flat list of observations. 'series': grouped by measure. 'csv': pandas CSV string in `csv` field.records
filtersNoDimension 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*'}).
measuresNoWhich 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_idYesCurated dataset ID. Use the search or list-curated endpoint/tool to discover.
end_periodNoInclusive end period. Same format as start_period.
start_periodNoInclusive 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

ParametersJSON Schema
NameRequiredDescription
csvNo
unitNo
queryNo
staleNo
periodNo
sourceNo
recordsNo
apra_urlYesClick-through URL for this dataset's source page. apra-mcp legacy name — prefer source_url (canonical) for new code. Both fields are populated identically.
frameworkNo
row_countNo
dataset_idYes
source_urlYesCanonical click-through URL. Same value as apra_url; both populated for backward compat.
attributionNo
dataset_nameYes
download_urlNo
retrieved_atYes
stale_reasonNo
truncated_atNo
server_versionNo

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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"})

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum 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.
filtersNoSame filter shape as get_data. Useful for narrowing to one entity.
measuresNoSame as get_data.
dataset_idYesCurated dataset ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription
csvNo
unitNo
queryNo
staleNo
periodNo
sourceNo
recordsNo
apra_urlYesClick-through URL for this dataset's source page. apra-mcp legacy name — prefer source_url (canonical) for new code. Both fields are populated identically.
frameworkNo
row_countNo
dataset_idYes
source_urlYesCanonical click-through URL. Same value as apra_url; both populated for backward compat.
attributionNo
dataset_nameYes
download_urlNo
retrieved_atYes
stale_reasonNo
truncated_atNo
server_versionNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return, ranked by relevance.
queryYesFree-text search query. Matches against dataset IDs, names, descriptions, and curated search keywords. Case-insensitive.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nNoHow many top (or bottom) rows to return.
filtersNoOptional 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).
measureYesPlain-English measure key to rank by. Use the describe endpoint or describe tool to see available measures.
directionNo'top' returns the N rows with the LARGEST measure values (biggest bank, highest capital, largest fund). 'bottom' returns the SMALLEST.top
dataset_idYesCurated dataset ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription
csvNo
unitNo
queryNo
staleNo
periodNo
sourceNo
recordsNo
apra_urlYesClick-through URL for this dataset's source page. apra-mcp legacy name — prefer source_url (canonical) for new code. Both fields are populated identically.
frameworkNo
row_countNo
dataset_idYes
source_urlYesCanonical click-through URL. Same value as apra_url; both populated for backward compat.
attributionNo
dataset_nameYes
download_urlNo
retrieved_atYes
stale_reasonNo
truncated_atNo
server_versionNo

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 6 tool updatesv0.8.19
    • Addeddescribe_dataset
    • Addedget_data
    • Addedlatest
    • Addedlist_curated
    • Addedsearch_datasets
    • Addedtop_n
  2. 6 tool updatesv0.8.17
    • Removeddescribe_dataset
    • Removedget_data
    • Removedlatest
    • Removedlist_curated
    • Removedsearch_datasets
    • Removedtop_n
  3. 3 tool updatesv0.1.1
    • Changedget_data1 field changed
      • changedOutput schema / properties / attribution / default
        Previous 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/)."
    • Changedlatest1 field changed
      • changedOutput schema / properties / attribution / default
        Previous 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/)."
    • Changedtop_n1 field changed
      • changedOutput schema / properties / attribution / default
        Previous 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/)."
  4. 6 tool updatesv0.1.0
    • First observeddescribe_dataset
    • First observedget_data
    • First observedlatest
    • First observedlist_curated
    • First observedsearch_datasets
    • First observedtop_n

TDQS

A4.2/5.0

Scored across 6 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    One-call Australian tax data plumbing via the ATO — cited responses for tax and super context, not a data broker.
    7
    124 PyPI
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    MCP 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).
    2
    14
    114 PyPI
    4
    MIT
  • A
    license
    A
    quality
    F
    maintenance
    Cited 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.
    28
    76 npm
    2
    MIT