YNAB MCP Server
Provides integration with YNAB (You Need A Budget) allowing access to budget data including listing budgets, accounts, categories, and category groups with support for pagination and filtering.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@YNAB MCP Server show me my spending categories for this month"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 sync2. Get YNAB Access Token
To use this MCP server, you need a YNAB Personal Access Token:
Log into your YNAB account at https://app.ynab.com
Go to Account Settings (click your email in the top right corner)
Click on Developer Settings in the left sidebar
Click New Token
Enter a token name (e.g., "MCP Server")
Click Generate
Copy the generated token (you won't be able to see it again)
3. Set Environment Variables
export YNAB_ACCESS_TOKEN=your_token_hereSet 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_hereTo 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=14. Run the Server
uv run python server.pyWindows / 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 serverFor 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 serverTo 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 serverThe 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 formatget_plan_month- One month's income, assigned, activity, Ready to Assign, age of money, and categorieslist_plan_months- Every month's totals, newest firstget_month_category- One category's amounts and target for a month
Accounts
list_accounts- Accounts with balances, optionally including closed onescreate_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 targetcreate_category,update_category- Add or change a category and its targetcreate_category_group,rename_category_group- Manage category groupsassign_money- Assign more to a category from Ready to Assign, or take some backset_assigned- Set exactly what a category has assignedmove_money- Move assigned money from one category to anotherlist_money_movements- The history of money assigned and moved
Payees
list_payees,find_payee- Browse or search payeescreate_payee,rename_payee- Manage payees
Transactions
list_transactions- Filter by account, category, payee, dates, amounts, unapproved or uncategorized status, and textget_transaction- One transaction, with its splitscreate_transactions- Enter spending, income, transfers, and splitsupdate_transactions- Approve, categorize, and fix transactions in bulkdelete_transaction- Delete a transactionimport_transactions- Import new transactions from linked banks now
Scheduled transactions
list_scheduled_transactions,get_scheduled_transaction- Upcoming bills and incomecreate_scheduled_transaction,update_scheduled_transaction,delete_scheduled_transaction- Manage schedulesenter_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 toolsassign_moneyAssign moneyADestructive
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 transactionADestructiveIdempotent
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 transactionADestructiveIdempotent
Delete a transaction. Confirm with the user before deleting.
Inputs: transaction_id (required). Returns: A YNAB transaction with full details.
enter_scheduled_transactionEnter scheduled transactionADestructive
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 payeeARead-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 categoryARead-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 planARead-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 monthBRead-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 transactionCRead-only
Get one scheduled transaction.
Inputs: scheduled_transaction_id (required). Returns: A YNAB scheduled transaction with its frequency and dates.
get_transactionGet transactionARead-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 accountsARead-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 categoriesARead-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 groupsARead-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 movementsARead-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 payeesARead-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 monthsARead-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 transactionsARead-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 transactionsARead-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 moneyADestructive
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 groupCDestructiveIdempotent
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 payeeADestructiveIdempotent
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 amountADestructiveIdempotent
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 categoryADestructiveIdempotent
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 transactionADestructiveIdempotent
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 transactionsADestructiveIdempotent
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
Scored across 32 tools
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.
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.
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.
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
Related MCP Connectors
An MCP server that provides read access to your cloud storage providers, bank accounts and more.
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
MCP server for AI dialogue using various LLM models via AceDataCloud
Query your real net worth, spending, transactions, budgets and portfolio from any MCP client.
Related MCP Servers
- AlicenseAqualityBmaintenanceAn 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.86MIT
- AlicenseAqualityAmaintenanceA 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.22553 npm165MIT
- AlicenseNot gradedqualityDmaintenanceA 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.4MIT
- AlicenseAqualityBmaintenanceAn 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.47433 npmMIT