Skip to main content
Glama
YNAB MCP Server
by chrisguidry

you-need-an-mcp

An MCP server that lets an LLM read and manage a YNAB plan. It can answer questions about accounts, categories, spending, and scheduled transactions, and it can enter and edit transactions, assign and move money, and manage scheduled transactions. YNAB now calls budgets "plans", and so does this server.

Setup

1. Install Dependencies

uv sync

2. Get YNAB Access Token

To use this MCP server, you need a YNAB Personal Access Token:

  1. Log into your YNAB account at https://app.ynab.com

  2. Go to Account Settings (click your email in the top right corner)

  3. Click on Developer Settings in the left sidebar

  4. Click New Token

  5. Enter a token name (e.g., "MCP Server")

  6. Click Generate

  7. Copy the generated token (you won't be able to see it again)

3. Set Environment Variables

export YNAB_ACCESS_TOKEN=your_token_here

Set the plan ID used by all tools (required). It is the ID in the address of your plan in YNAB's web app: https://app.ynab.com/<plan-id>/....

export YNAB_PLAN=your_plan_id_here

To serve only the tools that read the plan, set YNAB_READ_ONLY to any non-empty value. The tools that change the plan are then not offered at all.

export YNAB_READ_ONLY=1

4. Run the Server

uv run python server.py

Windows / Managed Machines

If uvx or you-need-an-mcp.exe fails with Access is denied (os error 5), endpoint security may be blocking the generated console-script executable. Launch the server through the environment's python.exe instead.

For a source checkout, after installing dependencies with uv sync --locked, run these PowerShell commands from the repository directory:

$env:YNAB_ACCESS_TOKEN = "<your-token>"
$env:YNAB_PLAN = "<your-plan-id>"
& .\.venv\Scripts\python.exe -m server

For a persistent tool installation of a version with module-launch support (uv tool install git+https://github.com/chrisguidry/you-need-an-mcp.git), locate the interpreter using uv tool dir rather than assuming a fixed installation path:

$toolDirectory = uv tool dir
$python = Join-Path $toolDirectory "you-need-an-mcp\Scripts\python.exe"
& $python -I -m server

To register that installed environment with Claude Code, replace the placeholders with your configuration:

claude mcp add ynab --scope user `
  -e "YNAB_ACCESS_TOKEN=<your-token>" -e "YNAB_PLAN=<your-plan-id>" `
  -- $python -I -m server

The module launch runs the same MCP server as the console-script entry point. For installed tools, -I prevents an unrelated server.py in the current directory from shadowing the installed module. It requires an installed environment and permission to execute its interpreter. If endpoint security also prevents installation or interpreter execution, use your organization's approved setup process.

Related MCP server: YNAB MCP Server

Available Tools

Every tool is tagged read or write, and carries MCP annotations that tell a client whether it only reads, adds, changes, or deletes, so the client can ask you before a change. All amounts are in your plan's currency, not milliunits.

Plan and months

  • get_plan - The plan's name, the months it covers, and its currency format

  • get_plan_month - One month's income, assigned, activity, Ready to Assign, age of money, and categories

  • list_plan_months - Every month's totals, newest first

  • get_month_category - One category's amounts and target for a month

Accounts

  • list_accounts - Accounts with balances, optionally including closed ones

  • create_account - Add an account that you track by hand

Categories and assigning money

  • list_categories / list_category_groups - Categories by group, with this month's assigned, activity, available, and target

  • create_category, update_category - Add or change a category and its target

  • create_category_group, rename_category_group - Manage category groups

  • assign_money - Assign more to a category from Ready to Assign, or take some back

  • set_assigned - Set exactly what a category has assigned

  • move_money - Move assigned money from one category to another

  • list_money_movements - The history of money assigned and moved

Payees

  • list_payees, find_payee - Browse or search payees

  • create_payee, rename_payee - Manage payees

Transactions

  • list_transactions - Filter by account, category, payee, dates, amounts, unapproved or uncategorized status, and text

  • get_transaction - One transaction, with its splits

  • create_transactions - Enter spending, income, transfers, and splits

  • update_transactions - Approve, categorize, and fix transactions in bulk

  • delete_transaction - Delete a transaction

  • import_transactions - Import new transactions from linked banks now

Scheduled transactions

  • list_scheduled_transactions, get_scheduled_transaction - Upcoming bills and income

  • create_scheduled_transaction, update_scheduled_transaction, delete_scheduled_transaction - Manage schedules

  • enter_scheduled_transaction - Enter a scheduled transaction now, before its date, and move the schedule to its next date

YNAB's API cannot create or change split scheduled transactions, and it cannot attach receipts to transactions.

Pagination

Every listing tool takes limit and offset. Check pagination.has_more, and raise offset by limit to get the next page.

Security Note

Keep your YNAB access token secure and never commit it to version control. The token can read and change everything in your YNAB account. Use YNAB_READ_ONLY when you want the server to only read.

Available Tools

32 tools
assign_moneyAssign moneyA
Destructive

Assign more money to a category from Ready to Assign, or take some back.

This adds to what is already assigned: assigning 100 to a category with 250 assigned leaves 350 assigned. A negative amount returns money to Ready to Assign. Calling this twice assigns twice, so do not retry it blindly after an error; check the category with get_month_category first.

For categories with NEED targets that refill each month, the full target is usually assigned every month, whatever is available.

Inputs: amount (required), category_id (required), month. Returns: The categories an assignment changed.

create_accountCreate accountA

Create an account that the user tracks by hand, such as cash or a new savings account. The account is not connected to a bank.

Inputs: name (required), type (required), balance (required). Returns: A YNAB account with balance information. All amounts are in currency units with…

create_categoryCreate categoryC

Create a category in a category group, optionally with a target.

Inputs: name (required), category_group_id (required), note, target_date, +3 more. Returns: A YNAB category with its amounts and target for one month.

create_category_groupCreate category groupB

Create an empty category group.

Inputs: name (required). Returns: A category group's identity, as YNAB returns it after a change.

create_payeeCreate payeeA

Create a payee.

A new transaction can also create its payee by giving payee_name, so this is only needed to set up a payee before any transaction uses it.

Inputs: name (required). Returns: A YNAB payee (person, company, or entity that receives payments).

create_scheduled_transactionCreate scheduled transactionC

Schedule a transaction: a bill, a paycheck, or a regular transfer.

Inputs: date (required), amount (required), frequency (required), account_id (required), +6 more. Returns: A YNAB scheduled transaction with its frequency and dates.

create_transactionsCreate transactionsA

Create one or more transactions in one request.

Use this to enter spending from a receipt, record income, enter a transfer between accounts, or add a split transaction. Calling this twice enters the transactions twice.

Example entries:

  • Spending: account_id=, date=2024-03-02, amount=-43.17, payee_name="Kroger", category_id=

  • Income: amount=2500, payee_name="Acme Payroll", category_id=<Inflow: Ready to Assign>

  • Transfer: account_id=, amount=-200, transfer_account_id=, no category

  • Split: amount=-80, payee_name="Target", no category, splits=[ {amount: -50, category_id: }, {amount: -30, category_id: }]

Inputs: transactions (required). Returns: result

delete_scheduled_transactionDelete scheduled transactionA
DestructiveIdempotent

Delete a scheduled transaction, so it stops happening. Transactions it already entered stay. Confirm with the user before deleting.

Inputs: scheduled_transaction_id (required). Returns: A YNAB scheduled transaction with its frequency and dates.

delete_transactionDelete transactionA
DestructiveIdempotent

Delete a transaction. Confirm with the user before deleting.

Inputs: transaction_id (required). Returns: A YNAB transaction with full details.

enter_scheduled_transactionEnter scheduled transactionA
Destructive

Enter a scheduled transaction now, before its date, like YNAB's "Enter Now". Use this when a bill is paid early or a paycheck arrives early.

This creates the transaction and moves the schedule to the occurrence after its next one. A schedule that happens only once is deleted. Split scheduled transactions, and those that repeat "twiceAMonth", cannot be entered this way; enter them in YNAB. Calling this twice enters two occurrences.

Inputs: scheduled_transaction_id (required), date, memo, amount. Returns: A scheduled transaction that was entered, and what became of its schedule.

find_payeeFind payeeA
Read-only

Find payees whose names contain a search term, ignoring case.

Example queries this tool can answer:

  • "Find Amazon payee ID" (use name_search="amazon")

  • "Show me all Starbucks locations" (use name_search="starbucks")

  • "Find payees with 'grocery' in the name" (use name_search="grocery")

Inputs: name_search (required), limit. Returns: Response for list_payees and find_payee tools.

get_month_categoryGet month categoryA
Read-only

Get one category's assigned, activity, available, and target for a month.

Inputs: category_id (required), month. Returns: A YNAB category with its amounts and target for one month.

get_planGet planA
Read-only

Get the plan's name, the months it covers, and its currency and date formats. Use the currency format to write amounts the way the user sees them in YNAB.

Inputs: no named parameters. Returns: The plan this server works on.

get_plan_monthGet plan monthB
Read-only

Get one month of the plan: income, assigned, activity, Ready to Assign, age of money, and each visible category's amounts for that month.

Inputs: limit, month, offset. Returns: One plan month with its totals and its categories.

get_scheduled_transactionGet scheduled transactionC
Read-only

Get one scheduled transaction.

Inputs: scheduled_transaction_id (required). Returns: A YNAB scheduled transaction with its frequency and dates.

get_transactionGet transactionA
Read-only

Get one transaction, including the parts of a split.

Inputs: transaction_id (required). Returns: A YNAB transaction with full details.

import_transactionsImport transactionsA

Ask YNAB to import new transactions from the plan's linked bank accounts now, instead of waiting for its next scheduled import.

Imported transactions arrive unapproved. Find them with list_transactions and status="unapproved".

Inputs: no named parameters. Returns: What an import from linked accounts brought in.

list_accountsList accountsA
Read-only

List the plan's accounts with their balances.

Each account includes its transfer_payee_id: use it as the payee of a transaction to transfer money into that account.

Inputs: limit, offset, include_closed. Returns: Response for list_accounts tool.

list_categoriesList categoriesA
Read-only

List the plan's categories with this month's amounts and targets.

Only returns visible categories. Hidden and deleted categories are excluded. Categories come in the order the plan shows them, group by group.

Inputs: limit, offset. Returns: Response for list_categories tool.

list_category_groupsList category groupsA
Read-only

List the plan's category groups with this month's totals.

Lighter than list_categories when only the overview by group is needed.

Inputs: no named parameters. Returns: result

list_money_movementsList money movementsA
Read-only

List the history of money assigned and moved between categories.

Use this to explain why a category's assigned amount changed: each entry says how much moved, from where, to where, and when.

Inputs: limit, month, offset. Returns: Response for list_money_movements tool.

list_payeesList payeesA
Read-only

List the plan's payees, sorted by name.

Payees are the people and businesses money goes to and comes from. To find a particular payee, find_payee is much faster than paging through this list. Deleted payees are excluded.

Inputs: limit, offset. Returns: Response for list_payees and find_payee tools.

list_plan_monthsList plan monthsA
Read-only

List the plan's months with their totals, newest first.

Use this for trends over time: income, assigned, and activity by month, how Ready to Assign changed, and how age of money moved.

Inputs: limit, offset. Returns: Response for list_plan_months tool.

list_scheduled_transactionsList scheduled transactionsA
Read-only

List scheduled transactions, soonest first, with filters that can be combined.

Example queries this tool can answer:

  • "Show me all monthly recurring expenses" (use frequency="monthly")

  • "What bills are due in the next 7 days?" (use upcoming_days=7)

  • "List all Netflix subscriptions" (find the payee first, then use payee_id)

  • "Show scheduled income over $100" (use min_amount=100)

Inputs: limit, offset, payee_id, frequency, +5 more. Returns: Response for list_scheduled_transactions tool.

list_transactionsList transactionsA
Read-only

List transactions, newest first, with filters that can be combined.

Example queries this tool can answer:

  • "Show me all transactions over $50 in Dining Out this year" → category_id=, max_amount=-50, since_date=2024-01-01

  • "What do I still need to review?" → status="unapproved"

  • "What hasn't been categorized?" → status="uncategorized"

  • "How much did we spend at Amazon in March?" → payee_id=, since_date=2024-03-01, until_date=2024-03-31

  • "Find the soccer registration fee" → text_search="soccer"

Filtering by category or payee returns each part of a split transaction as its own row, with parent_transaction_id set.

Inputs: limit, offset, status, payee_id, +7 more. Returns: Response for list_transactions tool.

move_moneyMove moneyA
Destructive

Move assigned money from one category to another within a month.

This is how to cover overspending or reallocate: it takes the amount off one category's assigned amount and adds it to the other's. Ready to Assign does not change. If YNAB rejects the second change, the first is put back before the error is reported.

Inputs: amount (required), to_category_id (required), from_category_id (required), month. Returns: The categories an assignment changed.

rename_category_groupRename category groupC
DestructiveIdempotent

Rename a category group.

Inputs: name (required), category_group_id (required). Returns: A category group's identity, as YNAB returns it after a change.

rename_payeeRename payeeA
DestructiveIdempotent

Rename a payee. Every transaction with this payee shows the new name.

Inputs: name (required), payee_id (required). Returns: A YNAB payee (person, company, or entity that receives payments).

set_assignedSet assigned amountA
DestructiveIdempotent

Set exactly how much is assigned to a category in a month.

Unlike assign_money, this replaces the assigned amount, so it is safe to retry. Ready to Assign absorbs the difference.

Inputs: amount (required), category_id (required), month. Returns: The categories an assignment changed.

update_categoryUpdate categoryA
DestructiveIdempotent

Rename a category, change its note, move it to another group, or set its target. Only the fields given change.

To change what is assigned to a category, use assign_money or set_assigned.

Inputs: category_id (required), name, note, target_date, +4 more. Returns: A YNAB category with its amounts and target for one month.

update_scheduled_transactionUpdate scheduled transactionA
DestructiveIdempotent

Change a scheduled transaction. Fields left out do not change.

Use this when a bill's amount changes, it moves to another day or account, or it repeats on a new schedule. Split scheduled transactions cannot be changed through YNAB's API.

Inputs: scheduled_transaction_id (required), date, memo, amount, +7 more. Returns: A YNAB scheduled transaction with its frequency and dates.

update_transactionsUpdate transactionsA
DestructiveIdempotent

Change one or more existing transactions in one request.

Each change names a transaction and only the fields to change; every other field stays as it is. This is the tool for reviewing transactions: approve them, categorize them, fix payees, set memos, flag them, or mark them cleared.

Example changes:

  • Approve and categorize: {id: , approved: true, category_id: }

  • Fix the payee: {id: , payee_name: "Costco"}

  • Clear the memo and the flag: {id: , memo: "", clear_flag: true}

Inputs: changes (required). Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.5/5.0

    Scored across 32 tools

    Disambiguation5/5

    Tools are organized by resource and action, and near-neighbors are explicitly contrasted: assign_money vs set_assigned vs move_money, list_payees vs find_payee, and get_plan_month vs get_month_category. An agent can reliably distinguish the intended tool from names and descriptions.

    Naming Consistency5/5

    Names consistently use snake_case with verb-first patterns such as get_, list_, create_, update_, delete_, and rename_. Pluralization is semantically consistent for batch-oriented transaction tools, and exceptions like set_assigned remain clear.

    Tool Count3/5

    32 tools is a heavy surface for an MCP server and may strain tool selection, even though the YNAB domain is broad and most tools map to real operations. The set is cohesive and not duplicative, but it sits above the comfortable range.

    Completeness4/5

    Core workflows are well covered: transaction and scheduled-transaction lifecycles are complete, money movement is supported, and plan/category/account/payee reads and creates/updates exist. Gaps remain around account/category/payee deletion and some detail lookups, though these may reflect YNAB API limits.

    Maintenance

    ActivityMaintained
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      B
      maintenance
      An MCP server that allows users to interact with YNAB data, enabling access to account balances, transactions, and the creation of new transactions through the Model Context Protocol.
      8
      6
      MIT
    • A
      license
      A
      quality
      A
      maintenance
      A Model Context Protocol server that enables AI-powered interaction with YNAB (You Need A Budget) data, allowing users to query their budgets through conversational interfaces.
      22
      553 npm
      165
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      A Model Context Protocol (MCP) server for interacting with YNAB (You Need A Budget). Provides tools for accessing budget data through MCP-enabled clients like Claude Desktop.
      4
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      An MCP server that exposes the full YNAB API, allowing LLMs to read and manage budgets, accounts, and transactions through natural language. It features 49 specialized tools for comprehensive financial management, including category updates, money movements, and transaction tracking.
      47
      433 npm
      MIT