Repository navigation
Releases: mathbeal/avenir-mcp
Release list
v0.8.0
get_budget_vs_actual now says what the months before carried over: each category gets a carried_over field, so an overspend is read against what was really available, not only against the month's budget (#163).
The documentation home page has a 20-second tour video, linked from the README (#169), and the demo card names its amounts plainly: what is available, what was budgeted and what is left from earlier months (#168, #170). Links to web.archive.org are replaced by YNAB's own API changelog (#165).
Security: fastmcp 4.1.2 in the plugin lock (#166). CI now fails a release pull request whose number is not the one git-cliff computes (#167).
No change to tool names or existing arguments. See CHANGELOG.md.
v0.7.1
The confirmation before move_money and set_category_budget now says what the category will have available, signed, wherever that differs from what is budgeted (#157). get_spending_trends reads the months up to the current one instead of months budgeted ahead (#151), and reconcile_account looks for duplicates from the plan's day rather than the machine's clock (#161).
Security: fastmcp 4.1.2 (#154), and every lock file in the repository is now audited in CI (#160). avenir-mcp can also run in a container, from a Dockerfile at the root (#158).
The README now starts with the install and what you can ask, with a new demo (#155); tool descriptions explain their parameters and point to the right sibling tool (#153).
No change to tool names or arguments. See CHANGELOG.md.
v0.7.0
Two new ways to install: Claude Desktop installs avenir-mcp from one file, the .mcpb extension (#108), and Claude Code installs it as a plugin, read-only and locked (#143). Cursor, LM Studio and VS Code get a one-click install link (#144); updating the extension is the same drop as installing it (#145).
Also: fastmcp 4.1.1 (#140), certifi and vite raised past their advisories (#141), and one place now records that an undo was applied (#135).
No change to tool names or arguments. See CHANGELOG.md.
v0.6.0
Two new tools and one new kind of split: list_payees shows the labels a bank import left, and rename_payee cleans one up (#111); split_transaction can now split a transfer that leaves the budget for a tracking account (#112). avenir-mcp states which version of YNAB's API it is built and tested against (#99), and Python 3.15 is supported (#61).
Also: transient YNAB failures are retried, but only for requests that cannot create a duplicate (#127); the package ships the PEP 561 py.typed marker its classifier promises (#113).
No change to tool names or arguments. Python code that imported tool functions from avenir_mcp.server should import them from their own module: server now exports its entry points only (#119). See CHANGELOG.md.
v0.5.0
Five new tools for reading the plan over time: get_runway says how many months the money set aside would last (#91); get_savings_rate says how much of the income was kept, month by month (#92); get_underfunded_targets says which targets still need money this month (#93); get_debt_payoff_plan says when the debts would be paid off, avalanche or snowball (#94); get_age_of_money shows YNAB's Age of Money month by month, and its trend (#95).
Also: the site and the repository show a card when shared (#96). No breaking change. See CHANGELOG.md.
v0.4.0
New tool: get_net_worth_trend shows, month by month, what the accounts hold, what is owed on the debt accounts and the net worth (#89).
Breaking: the HTTP transport always requires a token. Without AVENIR_MCP_HTTP_TOKEN, the server makes one at start-up and prints it once on stderr; a read-only HTTP setup without a token gets 401 until its client sends it. stdio is unchanged.
Also: names in confirmation questions stay on one line; the initialize answer reports avenir-mcp's version; fastmcp 4.0.10. The build is reproducible: the published wheel and sdist can be rebuilt bit for bit (see SECURITY.md). The documentation moved to https://avenir-mcp.pages.dev/avenir-mcp/. See CHANGELOG.md.
v0.3.0
At start-up the server checks, at most once a day, whether a newer release is on PyPI, and tells the agent so it can mention it; it never upgrades itself. The check is turned off with AVENIR_MCP_NO_UPDATE_CHECK=1, DO_NOT_TRACK=1 or in CI (#66). On a read-only server, no tool description names a hidden write tool. See CHANGELOG.md.
v0.2.1
avenir-mcp 0.2.0
First beta: tool and argument names may still change until 1.0.
Added
- Set_category_target sets, changes or removes a category's target (#55)
- Find_recurring_charges lists subscriptions and other monthly charges with their yearly cost (#54)
- A "YNAB API terms: self-checked" badge, dated, that turns red when YNAB changes them (#53)
- List_accounts says whether each bank link works and when it was reconciled (#45)
- Flag_transactions marks what the user should check, confirmed and undoable (#47)
- Import_transactions brings in the bank's latest transactions, as Import does (#37)
- Move_money covers an overspent category in one confirmed, undoable step (#36)
- The guide is also the server's instructions (#29)
Documentation
- Make avenir-mcp findable where people look, within YNAB's naming rules (#52)
- The API coverage page also lists what each tool reads and writes (#48)
- Show the demo budget in each page's language (#42)
- The home page chart shows what is left in each category, not a share used (#38)
- README shows the last commit and links to the site in each language (#23)
- French, German, Dutch and Spanish read in full against the source and DeepL (#31)
- Say plan where YNAB now says plan, in the code and in every language (#28)
- A privacy page says what avenir-mcp keeps, for how long, and how to erase it (#27)
- The notice that avenir-mcp is unofficial uses YNAB's exact wording (#26)
- The site in Dutch (#20)
- The site in German (#19)
- The README opens on an ordinary question, not on an attack (#25)
- Two French headings that a back-translation found ambiguous (#22)
- Spanish pages read as Spanish, not as English in Spanish words (#21) (#32)
- Roadmap, from a document to the year's schedules (#17)
- The README shows a real conversation and the forecast chart
Fixed
- Refuse a credit card payment category on a transaction, which YNAB ignores (#59)
- Set_category_target says what YNAB does on credit card and loan categories (#57)
- Configure switches one write gate instead of piling up filters (#51)
- Refuse a NUL character in text sent to YNAB, before asking the user (#46)
- Create_transactions refuses what YNAB refuses, before asking the user (#34)
- The privacy pages say what the journal really keeps (#33)
- Bound months_count and suggest_categories' limit; README links reach the site (#18)
- A schedule covers its payee's longer bank labels in the forecast
- Stay well within YNAB's rate limit, and never retry a 429
Internal
- Remove the 42 pylint suppressions that silenced nothing (#44)
- Check that docstrings match signatures, order included, tests documented (#49)
- Pre-commit runs ruff, typos and zizmor as CI does (#35)
- Check every link of the README and the docs, on pull requests and weekly (#24)
- Snyk ignores two http-cache-semantics flaws in the docs build
- Python 3.15 warns instead of turning pull requests red
Performance
- Normalise each payee once when looking for duplicates (#41)
- Pair transfers by amount instead of comparing every two pending (#40)
- Benchmark the computing functions on a five-year plan (#39)
Tests
avenir-mcp 0.1.0
Added
- Forecast_balance projects YNAB's scheduled transactions
- List_scheduled_transactions says what falls due between two dates
- Find_transactions filters by category and by payee
- Find_transactions finds a payment by dates, amount and account
- Split_transaction splits one transaction across categories, after a yes
- Budget usage names each category's group, and the home chart shows it
- JSON logs for a log collector, and no financial data in any log
- The HTTP transport admits only this machine, and a token for writes
- Https-only API address, a token file, and confirmation only in the client
- Describe every field of every answer, and leave splits and internal categories out
- Evaluate Avenir with a real agent on a demo budget
- Resources and prompts
- Confirm every remaining write, and quiet diagnostics
- Confirm and undo changes to budgeted amounts
- Compact month answers in currency units, and month validation
- Read-only by default, every tool annotated
- Forecast the balance month by month
- Reconcile an account with the bank's balance
- Rename or move a category after a confirmed preview
- Apply categories after a confirmed preview, and undo them
- Suggest categories for all pending transactions in one call
- Recognise a merchant across differently dated bank labels
- First public version of avenir-mcp
Changed
- The forecast's averages can leave out more payees
- YNAB's plans: the client calls /plans, the tools say plan
- Structured data is a pydantic model, and docstrings follow the Google style
- Call the project avenir-mcp everywhere
- Smaller confirmation and forecast functions, as Sonar suggested
- Drop the tools that safer ones replace
Documentation
- YNAB's references, and budgets renamed plans
- Eleven tasks pass with Sonnet, and the comparison keeps compatible models
- The counts after split_transaction and find_transactions, 19 tools
- Find_transactions in the features and the counts
- Split_transaction in the guides, the limits and the counts
- The README shows a badge for each kind of check
- The name avenir-mcp is set apart from the prose
- The roadmap lists the newest milestone first
- The home page's categories follow the page's language
- A chart of August on the home page, drawn from a real answer
- The publisher's name and the EU AI Act in the legal notice
- Legal notice, YNAB's required wording, intended use, and signed-off commits
- A guided site in English, French and Spanish, and ways to contribute
- Starlight in English, French and Spanish
- Documentation site, publishing chain, and a stricter hygiene test
- Set_category_budget no longer writes immediately
Fixed
- The user's agreement in the conversation counts for a confirmation code
- Find_transactions never returns a deleted transaction
- Split_transaction refuses a deleted transaction, before asking
- Every confirmation code says only the user can agree
- Secrets stay masked when printed or logged
- What a real budget showed suggest_categories got wrong
- A reconciliation confirms exactly the transactions it showed
- An id cannot steer a request, and last-used never mixes two budgets
- Bank text shown on one line, and impossible amounts refused
- Drop bank account numbers from normalized payees
- Suggest only assignable categories, learnt in the direction of the money
- Keep the full transaction list across delta syncs
Internal
- Run once per pull request, and macOS on the newest Python only
- Gitleaks looks for secrets in every commit
- Ruff formats, sorts imports and runs bandit's checks
- CodeQL and the OpenSSF Scorecard once public, and an SBOM with each release
- MCP Inspector checks the server as a client sees it
- Declare every package the code imports, and check it with deptry
- Windows is required too
- Renovate keeps dependencies current
- Checks a pull request can be merged on
- Every commit of a pull request is signed off
- Support Python 3.12 and 3.13
- Bound httpx and pydantic below their next major version
- Python 3.14.7, FastMCP 4 and the 2026-07-28 MCP protocol
- Grant each job read access to the code
- Quality workflow, and dependencies free of known advisories
Tests
- A task asks which yearly payment the forecast expects, 17/17
- The demo plan has scheduled transactions, and a task asks what falls due, 16/16
- An evaluation task asks which payments made Restaurants overspent, 15/15
- Every operation of YNAB's API is accounted for
- Three evaluation tasks check the words budget and plan, 14/14
- The multi-model runner stops when the API budget is spent
- A tenth evaluation task finds a payment already categorised, 10/10
- A tenth evaluation task splits a purchase from its receipt, 10/10
- The evaluation runs with models of other providers
- Properties on generated cases, and mutation testing
- The plugin that sets the name avenir-mcp apart has its own tests
- A craftier injected memo, and 9/9 after the security fixes