# apra-mcp

mcp-name: io.ausdata/apra-mcp

[![PyPI](https://img.shields.io/pypi/v/apra-mcp.svg)](https://pypi.org/project/apra-mcp/)
[![Python](https://img.shields.io/pypi/pyversions/apra-mcp.svg)](https://pypi.org/project/apra-mcp/)
[![License](https://img.shields.io/pypi/l/apra-mcp.svg)](https://github.com/Bigred97/apra-mcp/blob/main/LICENSE)
[![Tests](https://github.com/Bigred97/apra-mcp/actions/workflows/test.yml/badge.svg)](https://github.com/Bigred97/apra-mcp/actions/workflows/test.yml)
[![CodeQL](https://github.com/Bigred97/apra-mcp/actions/workflows/codeql.yml/badge.svg)](https://github.com/Bigred97/apra-mcp/actions/workflows/codeql.yml)
[![Glama MCP server quality](https://glama.ai/mcp/servers/Bigred97/apra-mcp/badges/score.svg)](https://glama.ai/mcp/servers/Bigred97/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](https://ausdata.io)** — free tier available (500 calls/mo, no card).

```text
"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](https://github.com/Bigred97/abs-mcp), [rba-mcp](https://github.com/Bigred97/rba-mcp), [ato-mcp](https://github.com/Bigred97/ato-mcp), and [au-weather-mcp](https://github.com/Bigred97/au-weather-mcp).

---

## Install

```bash
uvx --upgrade apra-mcp
```

### Claude Desktop

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

### Claude Code

```bash
claude mcp add apra --command uvx --args -- --upgrade apra-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`](https://pypi.org/project/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)](https://creativecommons.org/licenses/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](https://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](https://pypi.org/project/abs-mcp/) — Australian Bureau of Statistics (CPI, unemployment, ERP, building approvals)
- [rba-mcp](https://pypi.org/project/rba-mcp/) — Reserve Bank of Australia (cash rate, lending stats, exchange rates)
- [ato-mcp](https://pypi.org/project/ato-mcp/) — Australian Taxation Office (tax stats, ACNC charities)
- **apra-mcp** — this one. Banks, super, insurance.
- [aihw-mcp](https://pypi.org/project/aihw-mcp/) — Australian Institute of Health and Welfare
- [asic-mcp](https://pypi.org/project/asic-mcp/) — Australian Securities and Investments Commission (company registers)
- [aemo-mcp](https://pypi.org/project/aemo-mcp/) — Australian Energy Market Operator (NEM dispatch, spot prices, generation)
- [au-weather-mcp](https://pypi.org/project/au-weather-mcp/) — Open-Meteo (Bureau of Meteorology aggregator)
- [wgea-mcp](https://pypi.org/project/wgea-mcp/) — Workplace Gender Equality Agency
- [aus-identity](https://pypi.org/project/aus-identity/) — Postcode / state / ABN normalisation helper used by all sisters

---

## Development

```bash
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](https://github.com/Bigred97/apra-mcp/issues).
