Skip to content

Releases: Bigred97/rba-mcp

v0.8.7

Choose a tag to compare

@Bigred97 Bigred97 released this 20 May 21:58

[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 called pd.read_csv on 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-rate p50 (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.py pins 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-rate p50 drops from
    4.75 s -> <500 ms; p99 from 6.5 s -> <1.5 s.

0.8.5 — F1 (Daily Cash Rate) curated

Choose a tag to compare

@Bigred97 Bigred97 released this 17 May 23:39

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

Choose a tag to compare

@Bigred97 Bigred97 released this 12 May 20:18

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_datedescribe_table now reports the
    latest non-null observation per series alongside start_date. An
    LLM can answer "is this data fresh?" from a single describe_table
    call without a follow-up latest(). 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-data and f2.1-data entries in tables.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_date populated 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

Choose a tag to compare

@Bigred97 Bigred97 released this 12 May 08:11

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_date and end_date accept 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 is str | int | None and _validate_period coerces
    int → str transparently. Bool is explicitly excluded from coercion
    (since isinstance(True, int) is True in Python) so True/False
    still raise a clean type error rather than becoming "1"/"0".
  • Fix: describe_table populates SeriesDetail.start_date for
    curated tables.
    The non-curated branch already fetched the CSV and
    ran df[sid].first_valid_index(); the curated branch shortcut to
    YAML metadata only and left start_date null 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-mcp for
    Claude Desktop / Cursor.
    Plain uvx 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
    manually uvx --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;
    curated start_date populated). 107 unit tests now (was 103).