Releases: AnthonyPuggs/ausecon-mcp-server
v1.11.0 — Derived transparency, cheaper latest-value fetches, hot-path performance
v1.11.0 — Derived transparency, cheaper latest-value fetches, hot-path performance
This release closes the three open items from the latest code review: it makes the
derived layer's alignment method machine-readable, stops the "latest print" path
from downloading full history, and removes wasted work on the request hot path.
All changes are additive and backward-compatible.
Added
alignment_methodon every derived series.metadata.derivednow carries an
explicitalignment_method— one oflocf,exact_month,period_intersection,
oryear_ended_lag— so a consumer can tell how a derived indicator's operands were
aligned (e.g. last-observation-carried-forward, which can bias spreads and ratios
around turning points). Declared on all 16 derived concepts and added to the
response JSON Schema. (#65)
Changed
- Real-rate concepts now state their ex-post basis.
real_cash_rate,
real_10y_bond_yield,real_bank_bill_rate,real_business_lending_rate, and
real_mortgage_ratedescriptions now make explicit that they are ex-post real rates
(nominal less realised year-ended CPI inflation), not the ex-ante Fisher
definition. (#65) - Response contract:
derived_metadatainschemas/response.schema.jsongains a
requiredalignment_methodfield. This is additive — existing fields and tool
signatures are unchanged. (#65)
Performance
- Cheaper latest-value fetches.
get_latest_observationsfor ABS now requests
only the most recent observations upstream via SDMXlastNObservations, keyed
distinctly in the cache, instead of downloading the full dataflow and truncating
client-side. The expertget_abs_datatool is unchanged. (#66) - Hot-path pass. Derived-operand fetches now run concurrently (
asyncio.gather);
payload copying is centralised in the cache (the request hot path drops from two
deep copies to one); cache disk I/O is offloaded off the event loop; and concurrent
identical upstream fetches are coalesced with a single-flight helper so a burst of
duplicate requests hits the source only once. (#67)
Fixed
real_business_lending_ratenow aligns its lending-rate and inflation operands by
(year, month), so the RBA monthly end-of-month series and the ABS monthly CPI
series intersect correctly instead of yielding an empty result.
v1.10.0 - Real-rate, growth & external-sector indicators
v1.10.0 - Real-rate, growth & external-sector indicators
A purely additive release: 7 new derived indicators and 5 new curated
concepts, with no breaking changes to any tool or response shape.
✨ Added
Derived indicators (now 16)
Transparent, formula-based series available via get_derived_series:
| Concept | Formula | Frequency |
|---|---|---|
real_10y_bond_yield |
10y AGS yield − monthly CPI inflation | Monthly |
real_bank_bill_rate |
3m bank bill rate − monthly CPI inflation | Monthly |
real_business_lending_rate |
Small-business lending rate − monthly CPI inflation | Monthly |
broad_money_growth |
Year-ended growth of broad money | Monthly |
employment_growth |
Year-ended growth of employment | Monthly |
misery_index |
Unemployment rate + monthly CPI inflation | Monthly |
terms_of_trade |
100 × export price index / import price index | Quarterly |
Semantic concepts (now 75)
Analyst-friendly shortcuts available via get_economic_series:
Release description (markdown)
v1.10.0 — Real-rate, growth & external-sector indicators
A purely additive release: 7 new derived indicators and 5 new curated
concepts, with no breaking changes to any tool or response shape.
✨ Added
Derived indicators (now 16)
Transparent, formula-based series available via get_derived_series:
| Concept | Formula | Frequency |
|---|---|---|
real_10y_bond_yield |
10y AGS yield − monthly CPI inflation | Monthly |
real_bank_bill_rate |
3m bank bill rate − monthly CPI inflation | Monthly |
real_business_lending_rate |
Small-business lending rate − monthly CPI inflation | Monthly |
broad_money_growth |
Year-ended growth of broad money | Monthly |
employment_growth |
Year-ended growth of employment | Monthly |
misery_index |
Unemployment rate + monthly CPI inflation | Monthly |
terms_of_trade |
100 × export price index / import price index | Quarterly |
Semantic concepts (now 75)
Analyst-friendly shortcuts available via get_economic_series:
export_price_index— ABS International Trade Price Index, exports (all groups)import_price_index— ABS International Trade Price Index, imports (all groups)household_debt_to_income— RBA E2, household debt to annualised disposable incomelabour_productivity— RBA H4, non-farm labour productivity per hour (index)real_twi— RBA F15, real trade-weighted index
🐛 Fixed
- Year-ended growth derivations (
credit_growth,broad_money_growth,
employment_growth) now handle RBA monthly series that arrive as end-of-month
ISO dates (YYYY-MM-DD) in addition to ABSYYYY-MMperiods, instead of
raising a period-format error.
🔁 Compatibility
No breaking changes. All existing tools, concepts, and the
{metadata, series, observations} response contract are unchanged.
v1.9.0 - Legible ABS payloads and leaner responses
v1.9.0 - Legible ABS payloads and leaner responses
This release implements the four High-priority findings from the 11 June code review,
all aimed at what the LLM consumer actually receives: ABS payloads a model can read
without a second lookup, responses that stop repeating themselves, and an MCP server
card that reports the full surface.
✨ ABS responses now carry labels, not codes
ABS data is now requested with format=csvfilewithlabels, so every retrieval returns
human-readable labels instead of bare SDMX codes:
| Field | Before | After |
|---|---|---|
| Series label | 1 / 10001 / 10 / 50 / Q |
Index numbers / All groups CPI / Original / Australia / Quarterly |
unit |
IN |
Index Numbers |
frequency |
Q |
Quarterly |
REGION dimension |
{"code": "50", "label": "50"} |
{"code": "50", "label": "Australia"} |
base_period |
25 |
Sep 2025 = 100.0 |
ABS metadata also gains a title field (e.g. "Consumer Price Index (CPI)"),
matching what RBA payloads already provided.
The labelled layout pairs every code column with an adjacent label column and replaces
DATAFLOW with STRUCTURE/STRUCTURE_ID/STRUCTURE_NAME — verified against the live
API. The parser detects the paired-column layout automatically and still parses the
legacy code-only layout unchanged, with dual-format fixtures proving both paths.
series_id is unaffected — it is still built from dimension codes, so existing
series references keep working.
📉 Per-observation dimensions are gone by default
Every observation used to repeat the full dimension dict already present on its series
descriptor — measured at ~3.5× payload inflation on the most common ABS calls, and it
would have grown further once labels landed. Observations are now slim by default:
{ "date": "2025-Q3", "series_id": "MEASURE=1|INDEX=10001|TSEST=10|REGION=50|FREQ=Q", "value": 141.1 }- Dimensions remain on each series descriptor and are encoded in
series_id. - Pass
include_observation_dimensions=truetoget_abs_data,get_rba_table,
get_apra_data, orget_economic_seriesto restore the per-observation dicts —
served from the same cache, no refetch. - The response schema no longer lists
dimensionsas required on observations; the
property stays defined for the opt-in case.
🛠 The server card now reports the full surface
/.well-known/mcp/server-card.json previously hard-coded "resources": [] and
"prompts": []. It now enumerates everything the server registers:
- 2 resources —
ausecon://catalogue,ausecon://concepts - 3 resource templates — including the previously missing
ausecon://apra/{publication_id}, which now exposes curated APRA catalogue
entries like its ABS and RBA counterparts - 8 prompts — with names, descriptions, and arguments
🧹 Housekeeping
- Removed two git-tracked file-sync collision artefacts (
* 2.py) and added a
repository-hygiene test that rejects the pattern so it cannot recur. - Backfilled the missing 1.7.0, 1.7.1, and 1.8.0 changelog sections and reconciled
server.jsonand the docs with the actual release history.
⚠️ Behavioural changes
- Label-bearing fields change value on ABS responses:
frequencyis now"Quarterly"
rather than"Q",unitis"Index Numbers"rather than"IN", and dimension
labels are human-readable. Consumers matching on short codes should use
dimensions[*].code(unchanged) instead. - Observations no longer include a
dimensionskey unless explicitly requested. - No tool names or existing inputs changed; the new
include_observation_dimensions
parameter is additive and defaults tofalse.series_idconstruction and
chronological observation ordering are unchanged.
🧪 Verification
- 803 tests passing, including new dual-format parser coverage, slim/opt-in service
tests, server-card enumeration tests, and schema validation for both observation shapes. - ABS fixtures regenerated from live
csvfilewithlabelscaptures. - Live smoke against the ABS API confirming labelled, slim, chronologically ordered
CPI retrieval end-to-end.
Full changelog: v1.8.0...v1.9.0
v1.8.0 - Chronological observations, correct last_n, and clearer ABS 404s
v1.8.0 - Chronological observations, correct last_n, and clearer ABS 404s
This release fixes a family of correctness bugs around "latest value" retrieval that
affected every ABS dataset, and makes ABS error handling honest about what a 404 means.
🐛 Fixed: last_n returned the oldest ABS observations
The ABS SDMX API returns CSV rows in arbitrary order, but latest-N selection assumed
chronological input — so last_n=2 on headline_cpi returned 1986-Q2/Q3 instead of the
two most recent quarters. get_latest_observations and get_economic_series inherited
the same bug.
Observations are now sorted by parsed period before selection:
last_nselects the true most recent N observations per series, regardless of
upstream row order.- All retrieval responses are now chronologically ascending — this is a contract
guarantee, documented in the response schema docs. - Date-bound filtering compares parsed periods (interval overlap) instead of raw
strings, so bounds likestart=2025-11-15interact correctly with quarterly data.
A new shared periods.py module handles all five period formats (YYYY, YYYY-QN,
YYYY-SN, YYYY-MM, YYYY-MM-DD), replacing duplicated parsing in derived.py and
bounds.py — and adding the previously missing semester support.
🐛 Fixed: ABS 404s are no longer one opaque error
The ABS API answers HTTP 404 for two very different situations. The server now tells
them apart by response body:
- No data in the requested window (
NoRecordsFound) → returns a valid empty payload
with a plain-Englishmetadata.warningsentry instead of raising. - Unknown / renamed / retired dataflow → raises
AuseconNotFoundErrorwith guidance
to checksearch_datasetsorlist_catalogue. - 404s never fall back to stale cached data anymore; transient 5xx/timeout failures
still do.
📦 Retail Trade (RT) marked as discontinued
The ABS ceased the Retail Trade publication after the June 2025 reference month. The
catalogue entry is now marked ceased (hidden from default discovery, available via
include_ceased=true) with a successor pointer to the Monthly Household Spending
Indicator (household_spending concept, dataflow HSI_M), surfaced through
describe_dataset. The retail_turnover concept still retrieves the full historical
series (1982–2025).
✨ Improvements
- New
metadata.observations_droppedfield records how many observationslast_n
removed;truncatedistrueexactly when this is non-zero. describe_datasetnow reportsceasedandsuccessorfor every dataset.- ABS cache keys use structured encoding, eliminating a theoretical collision between
absent parameters and literal"None"values. - Clearer
last_n/countparameter descriptions on the MCP tool surface.
🧪 Testing
- New regression suite drives a 64-row shuffled ABS fixture end-to-end — the exact
failure mode that production CSVs exhibit and small ordered fixtures could never catch. - Coverage for both 404 paths, the stale-fallback exclusion, semester periods, and
cache-key collisions. - Fixed two pre-existing Windows-only test failures (UTF-8 fixtures read with the
platform default cp1252 encoding).
⚠️ Behavioural changes
- ABS payload observation order changes from upstream-arbitrary to chronologically
ascending (RBA/APRA were already chronological, now guaranteed). - ABS "no results in window" requests return an empty payload instead of raising.
RTno longer appears in defaultsearch_datasets/list_catalogueresults.
No breaking schema changes — all new metadata fields are additive and optional.
v1.7.1 Response Schema Path Fix
v1.7.1 Response Schema Path Fix
- Corrected response schema path which was causing the MCP server to locally disconnect after hitting the
FileNotFoundError: Could not locate response.schema.jsonerror
v1.7.0 APRA Governance and Source-Native Convenience
v1.7.0 - APRA Governance and Source-Native Convenience
This release strengthens APRA governance validation and improves the provenance exposed by the convenience tools, while keeping the public retrieval interface stable.
Highlights
- Added maintainer-facing APRA governance validation for catalogue coverage, trusted XLSX seeds and fallbacks, audit metadata, table/variant wiring, and AASB 17 scope warnings.
- Added
scripts/audit_apra_governance.pywith--checkand--jsonmodes for validating APRA source governance outside ordinary CI. - Extended
list_release_eventsprovenance:- ABS and RBA rows are labelled as
official_calendarevents fromofficial_pagesources. - APRA rows are labelled as
expected_releaseevents fromcadence_estimatesources. - APRA release rows now include cadence, seed freshness, audit timestamp, and governance status metadata where relevant.
- ABS and RBA rows are labelled as
- Extended
describe_datasetwith source-native retrieval guidance:- Exact identifier controls.
- Supported filters and date-bound fields.
- Explicitly unsupported arguments.
- Safe example calls for
get_latest_observationsandget_top_observations. - APRA governance context and framework-break warnings.
- Added
latestselection metadata support alongside existingtop_nmetadata in the response schema.
Compatibility
This is an additive release. Existing MCP tool names and public inputs are unchanged:
get_latest_observationsget_top_observationsdescribe_datasetlist_release_events
The release does not add arbitrary APRA URL inputs, paid/authenticated data access, or weaker source-native identifier controls.
Maintainer Notes
APRA release rows should be interpreted as expected cadence estimates, not official release-calendar dates. ABS and RBA release rows continue to represent official calendar entries.
APRA governance validation remains a maintainer command rather than an ordinary CI gate to avoid upstream APRA landing-page flakiness in routine test runs.
Verification
Validated with targeted APRA governance, release-event, convenience, schema, and repository-hygiene tests; Ruff linting; direct response-schema validation; and a live APRA governance audit using:
UV_CACHE_DIR=.uv-cache PYTHONPATH=src uv run python scripts/audit_apra_governance.py --checkv.1.6.0 - APRA data access and convenience improvements
AusEcon MCP Server v1.6.0
This release adds release-ready convenience tooling and governance improvements for ABS, RBA, and APRA data access while preserving the existing source-native retrieval contract.
Highlights
- Added MCP convenience tools for latest observations, top numeric observations, dataset descriptions, and release-event discovery.
- Added ABS and RBA release-event awareness backed by official release-page parsing.
- Added APRA release-pulse rows based on curated cadence and seed freshness, without presenting APRA as having a central official release calendar.
- Strengthened APRA workbook URL resolution with live landing-page discovery, bundled APRA-hosted HTTPS
.xlsxseed fallbacks, and trusted catalogue fallback metadata. - Scoped APRA AASB 17 framework-break warnings to relevant insurance performance publications only.
- Added local Australian geography alias handling for semantic geography resolution.
- Expanded response-schema metadata support for selection provenance, APRA URL resolution, framework breaks, and warnings.
- Added CodeQL, Dependabot, and Python
3.10-3.13CI coverage.
New MCP Tools
get_latest_observationsget_top_observationsdescribe_datasetlist_release_events
Contract Notes
Existing expert retrieval tools remain available and the {metadata, series, observations} response shape is preserved. Source-native ABS SDMX keys, RBA table and series IDs, and APRA publication, table, and series IDs remain visible.
Verification
uv run --python 3.12 ruff check src tests scriptsuv run --python 3.12 pytest(757 passed)uv run --python 3.12 python scripts/update_docs_reference.py --checknpm --cache .npm-cache run buildfromdocs-siteuv build --wheel --out-dir /private/tmp/ausecon-wheel-check
v1.5.0 - Semantic and Source Expansion
v1.5.0 - Semantic and Source Expansion
This release expands AusEcon MCP’s analyst-facing coverage while preserving the existing {metadata, series, observations} response contract.
Added
-
Added quarterly ABS Household Spending Indicator support via
HSI_Q, including:quarterly_household_spending_currentquarterly_household_spending_volume
-
Added selected RBA source-native table coverage:
a4c1.1c2.1c4.1d14.1f1.1f2.1i5j1
-
Expanded APRA catalogue coverage with additional official publications:
- Quarterly Superannuation Industry Publication
- Quarterly Fund-Level Statistics
- Quarterly General Insurance Performance Statistics
- Quarterly Life Insurance Performance Statistics
- Quarterly Private Health Insurance Performance Statistics
- Quarterly Private Health Insurance Membership Coverage
-
Added APRA-backed semantic concepts for banking, superannuation, insurance, and private health insurance:
adi_capital_ratioadi_liquidity_coverage_ratioadi_residential_mortgage_exposureadi_commercial_property_exposuresuperannuation_total_assetssuperannuation_member_accountsgeneral_insurance_premium_revenuegeneral_insurance_claims_expenselife_insurance_premium_revenuelife_insurance_claims_expensephi_premium_revenuephi_claims_expensephi_membership
-
Added transparent derived concepts:
mortgage_rate_spreadreal_mortgage_ratecredit_to_gdphousehold_spending_growth
Changed
- Extended semantic provenance metadata to support APRA targets through
apra_table_idandapra_series_ids. - Updated semantic bounds handling so APRA-backed semantic concepts accept the same analyst-friendly date bounds as RBA-backed concepts.
- Regenerated the semantic concepts reference, increasing the curated concept count to 70.
- Added APRA period-row workbook parsing support for private health insurance membership-style tables.
Validation
- Full test suite passes:
716 passed. - Ruff checks pass across
src,tests, andscripts. - Diff whitespace check passes with
git diff --check.
Compatibility
This release is backwards-compatible. It does not add new MCP tools and does not change the top-level response shape.
v1.4.1
v1.4.1
Summary
v1.4.1 is a hosted reliability patch for the APRA source-native layer introduced in v1.4.0. It fixes a Render/Smithery runtime issue where large APRA XLSX workbook requests could block the MCP HTTP server long enough for Render health checks to time out and restart the instance.
There are no public API changes.
Fixed
- Moved APRA XLSX parsing off the async event loop so
/healthzand active MCP sessions remain responsive during large workbook parsing. - Changed APRA table requests to parse and cache the requested
table_idseparately instead of always parsing the full publication first. - Improved APRA provider logging with download duration, parse duration, response size, series count, and observation count.
- Reduced hosted workload for APRA requests such as
ADI_PROPERTY_EXPOSURESwithtable_id="tab_1b".
Documentation
- Added hosted-usage guidance recommending
table_idfor APRA XLSX workbook requests. - Updated roadmap and release metadata for v1.4.1.
Verification
- Full unit suite:
593 passed - APRA live integration:
2 passed - Ruff checks passed
- Docs reference check passed
- Docs-site
npm run checkandnpm run buildpassed - Python 3.10 targeted compatibility checks passed
Upgrade Notes
No client changes are required. For best hosted performance, APRA users should provide table_id whenever they know the table they need.
v1.4.0 - Adding APRA Data
v1.4.0 - APRA Source-Native Foundation
v1.4.0 adds APRA as AusEcon MCP’s first third official data source, while preserving the existing read-only MCP contract and {metadata, series, observations} response shape.
What’s New
- Added
get_apra_data(...), a new source-native read-only MCP tool for curated APRA public XLSX publications. - Added APRA catalogue coverage for:
- Monthly ADI Statistics
- Quarterly ADI Performance Statistics
- ADI Centralised Publication
- ADI Property Exposures Statistics
- Extended source filters to support
abs | rba | apraacross catalogue and discovery tools. - Updated README, generated references, docs site, response schema, Smithery/hosted docs, and roadmap wording for ten read-only MCP tools.
Security And Hosted Hardening
- APRA workbook downloads are restricted to trusted APRA HTTPS hosts.
- Added workbook parsing limits for compressed size, uncompressed XLSX size, member count, rows, and columns.
- Added hosted HTTP request-size protection for oversized MCP requests.
- Updated docs-site dependencies to resolve npm audit findings.
Scope Notes
- APRA support is source-native only in this release.
- No APRA-backed semantic
get_economic_seriesconcepts are added yet. - Treasury, ASX, modelling, forecasting, and v2 response-shape work remain deferred.
Validation
Verified with:
- Python unit test suite
- Python 3.10 compatibility test run
- Ruff linting
- Generated docs reference check
- Docs-site type check and production build
- Python and npm dependency audits
- Bounded live APRA integration tests