Skip to content

Unofficial open-source MCP server for YNAB

Your YNAB plan, in plain words.

avenir-mcp lets Claude and other AI agents read, classify, reconcile and forecast your plan. Read-only by default; every change is previewed, confirmed by you, and can be undone.

Terminal
claude mcp add avenir-mcp \
--env YNAB_API_KEY=your-token \
-- uvx avenir-mcp

Works withClaude CodeClaude DesktopCursorVS CodeGemini CLICodex CLILM Studio

17
tools, each doing a whole task
100 %
line and branch coverage
9 / 9
tasks passed by a real agent
1–2
YNAB requests per call, most tools

Tools for tasks, not endpoints

Classify a month of transactions, reconcile an account with the bank, forecast the balance, review a month: each is one tool, not ten API calls for the agent to chain.

Read-only by default

The thirteen write tools are neither listed nor callable until you set AVENIR_MCP_WRITE=1. An agent cannot change what it cannot see.

Answers an agent can read

Currency units, never milliunits. Typed output schemas with a description for every field, pagination, and errors that say what to fix.

Light on YNAB's quota

A local copy of your transactions, refreshed by delta sync: most tools cost one or two of the 200 requests YNAB allows per hour.

  1. 1

    Preview

    avenir-mcp computes the exact change and shows it. Nothing is written yet.

  2. 2

    Confirm

    You say yes in your client, or with a one-time code bound to that preview.

  3. 3

    Undo

    Every applied change is journaled; undo restores it without overwriting later work.

Categories, amounts, reconciliations and created transactions can all be undone. How it works: Confirmation and Journal and undo.

Tools return structured data the agent can rely on — and put into plain words for you.

You: How did August go?

The agent calls get_budget_vs_actual with {"month": "2026-08-01"} and gets, for every category, what was budgeted, what was spent and what is left. Here is that answer on the demo plan, drawn:

What is left in each categoryAugust 2026
BillsRent0.00Electricity0.00Internet0.00Phone0.00EverydayGroceries207.49Transport45.00Restaurants30.90FunTennis58.00Subscriptions0.00Savings goalsHolidays200.00

Answer of get_budget_vs_actual on the demo plan

Show as a table
CategoryBudgetedSpentLeft
Bills · Rent950.00950.000.00
Bills · Electricity64.2064.200.00
Bills · Internet29.9929.990.00
Bills · Phone19.9919.990.00
Everyday · Groceries400.00192.51207.49
Everyday · Transport90.0045.0045.00
Everyday · Restaurants120.0089.1030.90
Fun · Tennis80.0022.0058.00
Fun · Subscriptions13.4913.490.00
Savings goals · Holidays200.000.00200.00

Claude: August stayed within budget everywhere: no category is overspent. The bills are paid, 207.49 is left for groceries and 58.00 for tennis, and the 200.00 set aside for holidays is untouched.

The raw answer
get_budget_vs_actual — demo plan
[
{
"id": "cat-rent",
"name": "Rent",
"group": "Bills",
"budgeted": 950.0,
"actual": 950.0,
"balance": 0.0,
"utilization_pct": 100.0
},
{
"id": "cat-power",
"name": "Electricity",
"group": "Bills",
"budgeted": 64.2,
"actual": 64.2,
"balance": 0.0,
"utilization_pct": 100.0
},
{
"id": "cat-internet",
"name": "Internet",
"group": "Bills",
"budgeted": 29.99,
"actual": 29.99,
"balance": 0.0,
"utilization_pct": 100.0
},
{
"id": "cat-phone",
"name": "Phone",
"group": "Bills",
"budgeted": 19.99,
"actual": 19.99,
"balance": 0.0,
"utilization_pct": 100.0
},
{
"id": "cat-groceries",
"name": "Groceries",
"group": "Everyday",
"budgeted": 400.0,
"actual": 192.51,
"balance": 207.49,
"utilization_pct": 48.1
},
{
"id": "cat-restaurants",
"name": "Restaurants",
"group": "Everyday",
"budgeted": 120.0,
"actual": 89.1,
"balance": 30.9,
"utilization_pct": 74.2
},
{
"id": "cat-transport",
"name": "Transport",
"group": "Everyday",
"budgeted": 90.0,
"actual": 45.0,
"balance": 45.0,
"utilization_pct": 50.0
},
{
"id": "cat-tennis",
"name": "Tennis",
"group": "Fun",
"budgeted": 80.0,
"actual": 22.0,
"balance": 58.0,
"utilization_pct": 27.5
},
{
"id": "cat-subscriptions",
"name": "Subscriptions",
"group": "Fun",
"budgeted": 13.49,
"actual": 13.49,
"balance": 0.0,
"utilization_pct": 100.0
},
{
"id": "cat-holidays",
"name": "Holidays",
"group": "Savings goals",
"budgeted": 200.0,
"actual": 0.0,
"balance": 200.0,
"utilization_pct": 0.0
}
]

Every example in this documentation is a real answer from avenir-mcp on an invented demo plan.

Unofficial project. We are not affiliated, associated, or in any way officially connected with YNAB or any of its subsidiaries or affiliates. The official YNAB website can be found at https://www.ynab.com. The names YNAB and You Need A Budget, as well as related names, tradenames, marks, trademarks, emblems, and images are registered trademarks of YNAB. avenir-mcp is provided as is, without warranty, and is not financial advice. Legal notice · Privacy