v0.4.0 — reconciliation, and a request budget you can see
Reconciliation, a request budget an agent can pace itself against, and the
tool-surface changes that came out of a twenty-one-month audit of a real plan.
62 read-only tools, 84 with writes enabled.
-
A
reconcilefamily.reconcile_previewcompares an account's cleared
balance as of a statement date against the statement, and reports the four
queues that explain a difference.transactions_match_statementpairs the rows
of a bank export with the register on exact amount within a date tolerance, and
names what is left over on each side.reconcile_applymarks the agreed
transactions reconciled and posts the adjustment as one journaled write, whose
revert undoes both halves together. -
The request budget is visible. Every response now carries
requests_used_this_hourandrequests_remaining, the way an HTTP API returns
X-RateLimit-Remaining— an agent paces itself against a number it already
has.pinganswers whether the server is reachable without touching YNAB,
which is what you need while waiting out a rate limit. Rate-limit errors carry
retry_atas an absolute timestamp besideretry_after, and say that the
quota belongs to the token and is shared with your own YNAB apps. -
adjust_byon both assignment writes: "add $4,500 to this category"
without reading the current figure first. It is read-modify-write and not an
atomic delta — YNAB offers neither a delta nor a conditional update — so
expected_budgetedis there to refuse the write when the amount read is not
the one you expected. That catches a caller acting on a stale figure; it does
not close the gap between the read and the write, and the descriptions say so. -
triage_pending_importsfinds imported card authorisations that never posted —
the onestriage_unmatched_manualcannot see, because they have an import id. -
analysis_unassigned_transfersandanalysis_assignment_patternsfor two
traps a person never notices and a script sees instantly: transfers between
on-budget accounts that funded nothing, and assignments that quietly add a
category's own inflow to a fixed base. -
transactions_bulk_updatecost one YNAB request per transaction while its
description implied otherwise. The write was always a single PATCH; the cost
was in capturing the state a revert would restore, one GET at a time. It now
reads the batch in one call, so a batch of two costs what a batch of three
hundred costs. -
Bulk write responses no longer echo the full transactions. Pass
return_transactions=truefor the previous shape. -
months_listomits months with no income and no activity, the way YNAB's own
month picker does.include_empty=truereturns them. -
Transaction list items omit null and empty fields, and
fieldsprojects them
further. A missingcategory_idtherefore means the transaction is
uncategorized.
YNAB's API has no route that sets an account's last_reconciled_at. Transactions
marked reconciled genuinely are reconciled, but the YNAB app will still show the
date of the last reconciliation done there. Every tool that could mislead on this
says so in its description and in its response.
Also includes the move to the mcp 2.x SDK.