Releases: Bigred97/rba-mcp
Release list
v0.8.7
[0.8.7] — 2026-05-19
Fixed
-
Parsed-DataFrame cache below the byte cache — 12x speedup on warm
F-table reads (Bug 7, 2026-05-19 latency diagnostic)._get_data_impl
previously calledpd.read_csvon the cached CSV bytes for every
invocation. The byte cache hit in <10 ms but parsing the 300 KB F1
CSV with ragged-row handling + numeric coercion took 5+ seconds on a
shared CPU. Net effect:rba.F1.latest()p50 = 5.2 s warm, which
set the floor for the ausdata-api/v1/real-cash-ratep50 (4.75 s
warm) and bumped p99 to 6.5 s.Added an LRU-bounded
(csv_filename, md5(body)) -> (header, DataFrame)
cache layer between the byte cache and the parser. Bounded at 10
entries (~300 MB worst case at 30 MB/parsed-frame). Cache is
module-global (shared across worker threads) because every thread
parses the same upstream bytes to the same DataFrame — sharing the
parse is a strict win on the gateway hot-path. Fresh upstream
publications miss cleanly via the md5 key.Also routes
describe_table()through the shared cache so describing
a recently-fetched table is ~10 ms instead of seconds.New
reset_df_cache_for_tests()helper for clean test isolation
(mirrors asic-mcp's parquet-cache reset pattern). New
tests/test_df_cache_hits_on_same_csv.pypins the cache behaviour:
N identical-bytes calls trigger exactly 1 parse; differing bytes
re-parse; LRU caps at_DF_CACHE_MAX_ENTRIES; reset clears state.Expected impact at ausdata-api:
/v1/real-cash-ratep50 drops from
4.75 s -> <500 ms; p99 from 6.5 s -> <1.5 s.
0.8.5 — F1 (Daily Cash Rate) curated
Customer-sim flagged that rba.F1.1.latest() returns the month-end snapshot (4.10%) instead of the current cash rate (4.35%, set 2026-05-06). Added F1 as curated — F1.latest() returns the freshest daily reading. 184 unit tests pass.
rba-mcp 0.1.9 — describe_table freshness + yield-curve search routing
0.1.9 (2026-05-13)
Loop-audit value pass — three low-effort, high-value polish wins surfaced
by a focused review of the customer-facing surface.
- New:
SeriesDetail.end_date—describe_tablenow reports the
latest non-null observation per series alongsidestart_date. An
LLM can answer "is this data fresh?" from a singledescribe_table
call without a follow-uplatest(). Populated via
df[col].last_valid_index()in both curated and non-curated branches. - Search: F2 / F2.1 keywords expanded. Added
yield curve,
bond yields,australian government securities,ags, and short
bond tenors (2 year bond,3 year bond,5 year bond) to the
f2-dataandf2.1-dataentries intables.yaml. A user asking
"what's the Australian yield curve?" now lands on F2 / F2.1
immediately. Verified via two new search routing tests. - Search ranker: phrase-match bonus (+20). Added alongside the
existing curated +30 bonus. If the full query phrase appears as a
substring in a table's haystack, that table gets +20. Lets strong
non-curated matches (like "yield curve" → F2) compete with the
curated boost when a query is highly specific to a non-curated
table; curated tables that ALSO phrase-match still stack both
bonuses, so common queries route correctly. - Tests: +4 regressions —
end_datepopulated for curated +
non-curated, "yield curve" → F2 routing, "bond yields" → F2
routing. 111 unit tests now (was 107).
rba-mcp 0.1.8 — customer-flow audit fixes
0.1.8 (2026-05-12)
Customer-flow audit fixes — surfaced when running rba-mcp against Claude
Desktop end-to-end. Two real UX gaps + a major distribution-side warning.
- Fix:
start_dateandend_dateaccept int years. MCP / LLM clients
often send a year as a JSON number (start_date=2024) instead of a
string ("2024"). Pre-0.1.8 this errored at the Pydantic boundary
with a verbose "Input should be a valid string" message. Now: the
Annotated type isstr | int | Noneand_validate_periodcoerces
int → str transparently. Bool is explicitly excluded from coercion
(sinceisinstance(True, int)isTruein Python) soTrue/False
still raise a clean type error rather than becoming "1"/"0". - Fix:
describe_tablepopulatesSeriesDetail.start_datefor
curated tables. The non-curated branch already fetched the CSV and
randf[sid].first_valid_index(); the curated branch shortcut to
YAML metadata only and leftstart_datenull on every curated
series. The LLM needs this to pick a sensible date range without
trial-and-error queries — e.g. F11 starts 2010, F11.1 starts 2023.
Now both branches populate the field. - README + example configs: recommend
uvx --upgrade rba-mcpfor
Claude Desktop / Cursor. Plainuvx rba-mcp(no flag) uses
whatever wheel is cached and the long-lived MCP child process holds
it — new PyPI releases never reach a running install until the user
manuallyuvx --refreshes and fully quits Claude Desktop. Found in
the wild during a customer-flow audit: an install was running 0.1.2
against PyPI 0.1.7, five releases of fixes never adopted.--upgrade
makes uvx check PyPI on each launch. Same fix shipped to abs-mcp's
example configs. - Tests: +4 regressions in
tests/test_stress_regressions.py
(int year accepted; int = str equivalence; bool still rejected;
curatedstart_datepopulated). 107 unit tests now (was 103).