ynab-mcp-server
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 this month by category"
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.
ynab-mcp-server
A personal MCP server that gives Claude native access to YNAB budget data.
Architecture
Layer 1: FastMCP reads YNAB's official OpenAPI spec at startup and auto-generates one MCP tool per endpoint.
Layer 2: Custom tools for higher-level workflows: spending summaries by category, payee consolidation/renaming.
Related MCP server: monarch-mcp
Setup
Prerequisites
uv — Python package manager
A YNAB Personal Access Token from app.ynab.com/settings/developer
Install
uv syncConfigure
Create a .env file (never committed):
YNAB_API_TOKEN=your_token_here
YNAB_READ_ONLY=falseRun
YNAB_API_TOKEN=your_token uv run ynab-mcp-serverConnecting to Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"ynab": {
"command": "/absolute/path/to/.venv/bin/ynab-mcp-server",
"env": {
"YNAB_API_TOKEN": "your_token_here",
"YNAB_READ_ONLY": "false"
}
}
}
}Use the absolute path from which ynab-mcp-server after uv sync.
Environment Variables
Variable | Required | Description |
| Yes | YNAB personal access token |
| No | Set |
Testing
npx @modelcontextprotocol/inspectorAvailable Tools
46 toolscreateAccountC
Creates a new account
Inputs: plan_id (required), account (required).
createCategoryC
Creates a new category
Inputs: plan_id (required), category (required).
createCategoryGroupC
Creates a new category group
Inputs: plan_id (required), category_group (required).
createPayeeC
Creates a new payee
Inputs: plan_id (required), payee (required).
createScheduledTransactionB
Creates a single scheduled transaction (a transaction with a future date).
Inputs: plan_id (required), scheduled_transaction (required).
createTransactionA
Creates a single transaction or multiple transactions. If you provide a body containing a transaction object, a single transaction will be created and if you provide a body containing a transactions array, multiple transactions will be created. Scheduled transactions (transactions with a future date) cannot be created on this endpoint.
Inputs: plan_id (required), transaction, transactions.
deleteScheduledTransactionB
Deletes a scheduled transaction
Inputs: plan_id (required), scheduled_transaction_id (required).
deleteTransactionC
Deletes a transaction
Inputs: plan_id (required), transaction_id (required).
getAccountByIdB
Returns a single account
Inputs: plan_id (required), account_id (required).
getAccountsB
Returns all accounts
Inputs: plan_id (required), last_knowledge_of_server.
getCategoriesA
Returns all categories grouped by category group. Amounts (assigned, activity, available, etc.) are specific to the current plan month (UTC).
Inputs: plan_id (required), last_knowledge_of_server.
getCategoryByIdA
Returns a single category. Amounts (assigned, activity, available, etc.) are specific to the current plan month (UTC).
Inputs: plan_id (required), category_id (required).
getMoneyMovementGroupsC
Returns all money movement groups
Inputs: plan_id (required).
getMoneyMovementGroupsByMonthC
Returns all money movement groups for a specific month
Inputs: plan_id (required), month (required).
getMoneyMovementsC
Returns all money movements
Inputs: plan_id (required).
getMoneyMovementsByMonthC
Returns all money movements for a specific month
Inputs: plan_id (required), month (required).
getMonthCategoryByIdA
Returns a single category for a specific plan month. Amounts (assigned, activity, available, etc.) are specific to the current plan month (UTC).
Inputs: plan_id (required), month (required), category_id (required).
getPayeeByIdB
Returns a single payee
Inputs: plan_id (required), payee_id (required).
getPayeeLocationByIdC
Returns a single payee location
Inputs: plan_id (required), payee_location_id (required).
getPayeeLocationsB
Returns all payee locations
Inputs: plan_id (required).
getPayeeLocationsByPayeeB
Returns all payee locations for a specified payee
Inputs: plan_id (required), payee_id (required).
getPayeesB
Returns all payees
Inputs: plan_id (required), last_knowledge_of_server.
getPlanByIdA
Returns a single plan with all related entities. This resource is effectively a full plan export.
Inputs: plan_id (required), last_knowledge_of_server.
getPlanMonthB
Returns a single plan month
Inputs: plan_id (required), month (required).
getPlanMonthsC
Returns all plan months
Inputs: plan_id (required), last_knowledge_of_server.
getPlansB
Returns plans list with summary information
Inputs: include_accounts.
getPlanSettingsByIdC
Returns settings for a plan
Inputs: plan_id (required).
getScheduledTransactionByIdB
Returns a single scheduled transaction
Inputs: plan_id (required), scheduled_transaction_id (required).
getScheduledTransactionsC
Returns all scheduled transactions
Inputs: plan_id (required), last_knowledge_of_server.
getTransactionByIdC
Returns a single transaction
Inputs: plan_id (required), transaction_id (required).
getTransactionsC
Returns plan transactions, excluding any pending transactions
Inputs: plan_id (required), since_date, until_date, type, +1 more.
getTransactionsByAccountB
Returns all transactions for a specified account, excluding any pending transactions
Inputs: plan_id (required), account_id (required), since_date, until_date, +2 more.
getTransactionsByCategoryA
Returns all transactions for a specified category, excluding any pending transactions
Inputs: plan_id (required), category_id (required), since_date, until_date, +2 more.
getTransactionsByMonthB
Returns all transactions for a specified month, excluding any pending transactions
Inputs: plan_id (required), month (required), since_date, until_date, +2 more.
getTransactionsByPayeeA
Returns all transactions for a specified payee, excluding any pending transactions
Inputs: plan_id (required), payee_id (required), since_date, until_date, +2 more.
getUserA
Returns authenticated user information
Inputs: no named parameters.
importTransactionsA
Imports available transactions on all linked accounts for the given plan. Linked accounts allow transactions to be imported directly from a specified financial institution and this endpoint initiates that import. Sending a request to this endpoint is the equivalent of clicking "Import" on each account in the web application or tapping the "New Transactions" banner in the mobile applications. The response for this endpoint contains the transaction ids that have been imported.
Inputs: plan_id (required).
updateCategoryC
Update a category
Inputs: plan_id (required), category_id (required), category (required).
updateCategoryGroupC
Update a category group
Inputs: plan_id (required), category_group_id (required), category_group (required).
updateMonthCategoryA
Update a category for a specific month. Only budgeted (assigned) amount can be updated.
Inputs: plan_id (required), month (required), category_id (required), category (required).
updatePayeeD
Update a payee
Inputs: plan_id (required), payee_id (required), payee (required).
updateScheduledTransactionC
Updates a single scheduled transaction
Inputs: plan_id (required), scheduled_transaction_id (required), scheduled_transaction (required).
updateTransactionC
Updates a single transaction
Inputs: plan_id (required), transaction_id (required), transaction (required).
updateTransactionsC
Updates multiple transactions, by id or import_id.
Inputs: plan_id (required), transactions (required).
ynab_consolidate_payeeConsolidate / Rename a PayeeAIdempotent
Rename a payee and update all its transactions to use a canonical name.
Use this to clean up messy imported payee names:
"AMZN*1A2B3C4D" → "Amazon"
"WHOLEFDS MKT #123" → "Whole Foods"
Merge two duplicate payees into one
IMPORTANT — always call with preview_only=true first. This shows you exactly which transactions will be affected. Only set preview_only=false after reviewing and approving the preview.
How it works:
Finds all transactions belonging to source_payee_id
Renames the payee itself to target_name
All linked transactions automatically reflect the new name
Note: YNAB does not have a "delete payee" endpoint. Renaming the payee is the correct approach — it handles deduplication internally.
Inputs: params (required). Returns: result
ynab_get_spending_summaryGet Spending Summary by CategoryARead-onlyIdempotent
Aggregate transactions by category and return ranked spending totals.
Use this to answer questions like:
"How much did I spend on dining out this month?"
"What are my top 10 spending categories this year?"
"Compare groceries vs restaurants for Q1"
Amounts are returned in dollars (not YNAB milliunits). Transfers and income are excluded — only outflows are shown.
Inputs: params (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 46 tools
Each tool targets a specific resource and action (get, create, update, delete, import, consolidate, spend). Even similar getters are differentiated by filters (by account, category, month, payee), and the two custom ynab_ functions have unique purposes.
All tools follow a consistent camelCase verb_noun pattern (e.g., getAccounts, createTransaction, updateCategory). The two ynab_ prefixed tools are the only exceptions but are clearly labeled as custom utilities.
46 tools is high but justified by the complexity of YNAB's data model (accounts, categories, payees, transactions, plans, etc.). Each tool addresses a distinct endpoint, though some consolidation could reduce count slightly.
Core transaction and scheduled transaction CRUD is complete, but accounts lack update/delete endpoints, and categories lack delete. Plans only have read operations. The ynab_consolidate_payee workaround addresses missing payee deletion, but gaps remain.
Maintenance
Related MCP Connectors
Hosted Notion MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
MCP server giving Claude AI access to 22+ NYC public-record databases for real estate due diligence
Augments MCP Server - A comprehensive framework documentation provider for Claude Code
Hosted SQL Server MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Related MCP Servers
- 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
- FlicenseBqualityDmaintenanceMCP server that bridges Claude to Monarch Money for personal-finance analysis and lightweight edits.18-
- FlicenseNot gradedqualityCmaintenanceA self-hosted MCP server that lets Claude query your bank accounts, balances, and transactions through Plaid.1-
- AlicenseBqualityDmaintenanceA read-only MCP server for YNAB budgeting data, enabling daily/weekly/monthly expense reviews and planning support via Claude Desktop or Claude Code.4Apache 2.0