The complete Model Context Protocol server for YNAB
Give your AI assistant full access to your budget
44 tools •
100% API coverage •
YNAB API v1.83
Quick Start • What You Can Do • All 44 Tools • Configuration
YNAB's budgeting philosophy works best when you interact with your budget frequently - but the app interface isn't designed for quick queries or bulk operations. "How much did I spend on groceries this month?" shouldn't require navigating three screens. "Categorize all my Amazon orders from this week" shouldn't be a manual, one-by-one process.
This server gives your AI assistant full access to YNAB's API, turning natural language into budget operations. All monetary values are automatically converted between dollars and YNAB's internal milliunits format so the AI never has to think about it. Built on the official YNAB JavaScript SDK with direct API calls for the newest endpoints (category creation, category groups, money movements) that the SDK hasn't caught up with yet.
Go to YNAB Developer Settings and create a new personal access token.
Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"ynab": {
"command": "npx",
"args": ["-y", "@oliverames/ynab-mcp-server"],
"env": {
"YNAB_API_TOKEN": "your-token-here"
}
}
}
}Claude Code (.mcp.json):
{
"mcpServers": {
"ynab": {
"command": "npx",
"args": ["-y", "@oliverames/ynab-mcp-server"],
"env": {
"YNAB_API_TOKEN": "your-token-here"
}
}
}
}Or install globally and point to the binary directly:
npm install -g @oliverames/ynab-mcp-server{
"mcpServers": {
"ynab": {
"command": "ynab-mcp-server",
"env": {
"YNAB_API_TOKEN": "your-token-here",
"YNAB_BUDGET_ID": "optional-default-budget-id"
}
}
}
}That's it. Your AI can now talk to YNAB.
| Ask your AI... | What happens under the hood |
|---|---|
| "How much did I spend on groceries this month?" | search_categories → get_month_category |
| "Show me all unapproved transactions" | review_unapproved groups by readiness |
| "Log a $50 Costco trip under groceries" | search_payees → search_categories → create_transaction |
| "Set up monthly $1,500 rent on the 1st" | create_scheduled_transaction with monthly frequency |
| "Move $200 from emergency fund to dining" | search_categories → update_month_category (x2) |
| "Categorize all my Amazon orders from this week" | get_transactions (filtered) → update_transactions (batch) |
| "Create a 'Side Projects' spending category" | search_categories (find group) → create_category |
| "How has my budget been re-allocated this month?" | get_money_movements_by_month |
| "What recurring payments do I have?" | list_scheduled_transactions |
| "Import my latest bank transactions" | import_transactions triggers linked account sync |
Complete YNAB API v1.83 coverage with 44 tools:
| Resource | Tools | Capabilities |
|---|---|---|
| Budgets | 4 | List, view details, settings |
| Accounts | 3 | List, view, create |
| Categories | 9 | Full CRUD, groups, search, goals, monthly budgets |
| Payees | 5 | List, view, create, rename, search |
| Payee Locations | 3 | GPS coordinates for mobile transactions |
| Months | 2 | Monthly summaries with per-category breakdown |
| Money Movements | 4 | Budget re-allocation tracking |
| Transactions | 8 | Full CRUD, bulk ops, split transactions, multi-filter |
| Scheduled Transactions | 5 | Full CRUD for recurring transactions |
| Convenience | 1 | Unapproved transaction review workflow |
- Dollar amounts everywhere - inputs and outputs are in dollars (
-12.34), never milliunits (-12340). Conversion is automatic and transparent. - Smart budget resolution - set
YNAB_BUDGET_IDfor a default, or omit it to auto-resolve to your last-used budget. Every tool accepts an optionalbudgetIdoverride. - Split transactions - first-class support for subtransactions in create, read, and format operations.
- Bulk operations -
create_transactionsandupdate_transactionshandle arrays in a single API call. - Fetch-then-merge updates - scheduled transaction updates (which use PUT semantics) automatically fetch the current state and merge your changes, so you only specify what changed.
- Fuzzy search -
search_categoriesandsearch_payeesdo case-insensitive partial matching across all entries. - Approval workflow -
review_unapprovedgroups transactions into "ready to approve" (categorized, split, or transfer) and "needs attention" (uncategorized), with a built-in warning against approving uncategorized entries. - Nullable updates - update tools accept
nullfor clearable fields (memo,payeeName,categoryId,flagColor) to distinguish "don't change" (omit) from "clear this field" (null). - Target behavior support - category create/update tools expose
goalNeedsWholeAmountfor YNAB's "Set aside another" vs. "Refill up to" goal behavior. - Delta request support - high-volume list tools accept
lastKnowledgeOfServerand returnserver_knowledgewhen that parameter is provided. - Debt account support - loan and debt accounts include
debt_original_balance,debt_interest_rates,debt_minimum_payments, anddebt_escrow_amountswith correct unit conversion (rates stay as percentages, payments convert from milliunits).
| Tool | Description |
|---|---|
get_user |
Get the authenticated user |
list_budgets |
List all budgets with IDs, names, date ranges, format settings, and default budget |
get_budget |
Get budget summary (name, currency, account/category/payee counts) |
get_budget_settings |
Get currency and date format settings |
| Tool | Description |
|---|---|
list_accounts |
List all accounts with balances, debt details, and import status |
get_account |
Get full account details including notes and debt fields |
create_account |
Create a new account (checking, savings, creditCard, mortgage, etc.) |
Supported account types: checking, savings, cash, creditCard, lineOfCredit, otherAsset, otherLiability, mortgage, autoLoan, studentLoan, personalLoan, medicalDebt, otherDebt
| Tool | Description |
|---|---|
list_categories |
List all category groups and their categories with budgeted/activity/balance |
get_category |
Get full category details including goal progress and cadence |
get_month_category |
Get category budget for a specific month |
update_month_category |
Set the budgeted amount for a category in a month |
update_category |
Update name, note, goal target, goal target date, or move to a different group |
create_category |
Create a new category in an existing group (with optional goal) |
create_category_group |
Create a new category group |
update_category_group |
Rename a category group |
search_categories |
Case-insensitive partial name search (e.g., "groc" finds "Groceries") |
| Tool | Description |
|---|---|
list_payees |
List all payees with transfer account mappings |
get_payee |
Get payee details |
create_payee |
Create a new payee |
update_payee |
Rename a payee |
search_payees |
Case-insensitive partial name search |
| Tool | Description |
|---|---|
list_payee_locations |
List all payee locations (GPS coordinates from mobile app) |
get_payee_location |
Get a specific payee location |
get_payee_locations_by_payee |
Get all locations for a specific payee |
| Tool | Description |
|---|---|
list_months |
List budget months with income, budgeted, activity, to-be-budgeted, age of money, and notes |
get_month |
Get month detail with per-category budget/activity/balance/goal breakdown |
| Tool | Description |
|---|---|
list_money_movements |
List all money movements (budget re-allocations between categories) |
get_money_movements_by_month |
Get money movements for a specific month |
list_money_movement_groups |
List all money movement groups (batched re-allocations) |
get_money_movement_groups_by_month |
Get money movement groups for a specific month |
| Tool | Description |
|---|---|
get_transactions |
Get transactions with filters: by account, category, payee, month, or status (unapproved/uncategorized) |
get_transaction |
Get a single transaction by ID (includes subtransactions) |
create_transaction |
Create a transaction with optional split (subtransactions must sum to total) |
create_transactions |
Bulk create multiple transactions in a single API call (supports split transactions) |
update_transaction |
Partial update - only specified fields change |
update_transactions |
Batch update multiple transactions at once |
delete_transaction |
Delete a transaction |
import_transactions |
Trigger import from linked bank accounts |
| Tool | Description |
|---|---|
list_scheduled_transactions |
List all recurring transactions |
get_scheduled_transaction |
Get a specific scheduled transaction |
create_scheduled_transaction |
Create a recurring transaction with frequency |
update_scheduled_transaction |
Update (fetch-then-merge preserves unchanged fields) |
delete_scheduled_transaction |
Delete a scheduled transaction |
Supported frequencies: never, daily, weekly, everyOtherWeek, twiceAMonth, every4Weeks, monthly, everyOtherMonth, every3Months, every4Months, twiceAYear, yearly, everyOtherYear
| Tool | Description |
|---|---|
review_unapproved |
Get unapproved transactions grouped by readiness: "ready to approve" (categorized, split, or transfer) vs. "needs category first" (uncategorized). Includes a warning against blind approval. |
| Variable | Required | Description |
|---|---|---|
YNAB_API_TOKEN |
Yes* | Personal access token from YNAB Developer Settings |
YNAB_BUDGET_ID |
No | Default budget ID. If omitted, uses "last-used" (your most recently accessed budget). Run list_budgets to find IDs. |
YNAB_OP_PATH |
No | 1Password secret reference for your API token (see below). Required only if using the 1Password fallback instead of YNAB_API_TOKEN. |
*YNAB_API_TOKEN is required unless YNAB_OP_PATH is set.
If you store your YNAB token in 1Password CLI, set YNAB_OP_PATH to your secret reference and omit YNAB_API_TOKEN:
{
"mcpServers": {
"ynab": {
"command": "npx",
"args": ["-y", "@oliverames/ynab-mcp-server"],
"env": {
"YNAB_OP_PATH": "op://Personal/YNAB API Token/credential"
}
}
}
}The fallback adds ~1-2s to startup and is silently skipped if op is unavailable or the item is not found.
All amounts in tool inputs and outputs are in dollars (e.g., -12.34 for a $12.34 outflow). The server converts to/from YNAB's internal milliunits format automatically.
| Direction | Sign | Example |
|---|---|---|
| Outflow (spending) | Negative | -50.00 |
| Inflow (income) | Positive | 2500.00 |
| Transfer out | Negative | -1000.00 |
| Transfer in | Positive | 1000.00 |
The YNAB API allows 200 requests per hour per access token, enforced on a rolling window. Each tool call typically uses one API request (except update_scheduled_transaction which uses two - a GET to fetch current state, then a PUT to merge changes). The server surfaces rate limit errors as standard MCP error responses.
┌─────────────────────┐ ┌──────────────────┐ ┌──────────────┐
│ AI Assistant │────▶│ YNAB MCP Server │────▶│ YNAB API │
│ (Claude, GPT, etc) │◀────│ (this package) │◀────│ api.ynab.com│
└─────────────────────┘ └──────────────────┘ └──────────────┘
MCP stdio transport HTTPS/REST
- Transport: stdio (standard MCP server pattern)
- Auth: Bearer token via
YNAB_API_TOKENenvironment variable - SDK: Official
ynabv2.5+ for core endpoints, directfetchfor newer API features - Validation: All parameters validated with Zod schemas
- Error handling: API errors are caught, formatted, and returned as MCP error responses with detail messages
The integration test suite runs against a live YNAB budget. Most write tests create temporary transactions and delete or restore them, but category and category group creation is not reversible through the public API and is skipped unless explicitly enabled.
YNAB_API_TOKEN=your-token YNAB_BUDGET_ID=your-budget-id npm testUse YNAB_TEST_BUDGET_ID to target a dedicated test budget without changing your server default. To include category and category group creation coverage, run with YNAB_RUN_NONREVERSIBLE_TESTS=1.
Tests cover all tool categories: reads, reversible writes, bulk operations, search, split transactions, scheduled transaction CRUD with fetch-then-merge verification, money movements, and payee locations.
git clone https://github.com/oliverames/ynab-mcp-server.git
cd ynab-mcp-server
npm install
YNAB_API_TOKEN=your-token npm start@modelcontextprotocol/sdk- MCP server frameworkynab- Official YNAB JavaScript client
Zero additional dependencies. No build step. Pure ESM.
MIT
Built by Oliver Ames in Vermont • GitHub • LinkedIn • Bluesky