actualbudget-mcp-server
Provides tools for managing budgets, accounts, categories, transactions, payees, rules, schedules, and notes in an Actual Budget instance, including budget envelope operations and bank sync.
Click on "Install 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., "@actualbudget-mcp-serverShow my spending by category 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.
actualbudget-mcp-server
MCP server for Actual Budget, built for Claude, Cursor, and other AI agents.
Actual has no REST API. Its official @actual-app/api package is the app's own engine running headless: it downloads the whole budget into a local SQLite file, runs every method against that copy, and syncs CRDT messages back to the server. That architecture is why generic per-request wrappers fight it — and why this server is built around a long-lived engine singleton instead:
Init once, never per call. The budget downloads at startup; tool calls are then local reads/writes with no init/teardown races.
Serialized writes. All mutations run through a mutex, so bulk operations can't corrupt or lock the budget file.
Graceful shutdown. SIGINT/SIGTERM/stdin-close flush pending sync and release the SQLite file.
Cache-reset recovery.
actual_reload_budgetdeletes the stale local cache and re-downloads — no more restarting the MCP server by hand after resetting the budget cache in the Actual UI.Full budget-envelope surface. Set budgeted amounts, carryover, and holds; move accounts on/off budget; create income categories — operations the API supports but existing MCP wrappers don't expose.
Mutation safety. Every write is saved as a
{before, request, after}JSON backup in the temp directory, write tools are opt-in viaACTUAL_ENABLE_WRITE=true, and destructive tools carry MCPdestructiveHintannotations.Defensive name handling. Some MCP clients HTML-escape arguments (
&→&); names are unescaped before they reach Actual.
Setup
npm install
npm run buildConfigure via environment (see .env.example):
Variable | Required | Purpose |
| yes | Your actual-server instance URL |
| yes | Server login password |
| yes | Settings → Show advanced settings → Sync ID |
| yes | Local cache directory for the budget file |
| no | Only for end-to-end encrypted files |
| no | Write tools registered only when exactly |
Claude Code / Cursor MCP config:
{
"mcpServers": {
"actual-budget": {
"command": "node",
"args": ["/path/to/actualbudget-mcp-server/dist/index.js"],
"env": {
"ACTUAL_SERVER_URL": "https://actual.example.com",
"ACTUAL_PASSWORD": "...",
"ACTUAL_BUDGET_SYNC_ID": "...",
"ACTUAL_DATA_DIR": "/path/to/cache",
"ACTUAL_ENABLE_WRITE": "true"
}
}
}
}Related MCP server: actual-mcp-server
Tools (53)
Always on (read/admin):
actual_get_accounts,actual_get_categories,actual_get_budget_months,actual_get_budget_monthactual_get_transactions,actual_search_transactions(cross-account, filters: payee substring / amount / category / account / date range / uncategorized-only)actual_get_payees,actual_get_common_payees,actual_get_payee_rules,actual_get_rules,actual_get_tags,actual_get_schedules,actual_get_noteactual_query— general read-only AQL access to any table with filters, joins, groupBy, and aggregates (spending-by-category reports in one call)actual_get_server_version,actual_sync_now,actual_reload_budget,actual_prune_stale(dry-run by default)
With ACTUAL_ENABLE_WRITE=true:
Accounts:
actual_create_account,actual_update_account(incl. on/off budget),actual_close_account(transfer-aware),actual_reopen_account,actual_delete_accountCategories:
actual_create_category(incl.is_income),actual_update_category,actual_delete_category,actual_create_category_group(create-then-update workaround for the engine droppingis_incomeon create),actual_update_category_group,actual_delete_category_groupBudget envelope:
actual_set_budget_amount,actual_set_budget_amounts(batch, viabatchBudgetUpdates),actual_set_budget_carryover,actual_hold_budget_for_next_month,actual_reset_budget_holdTransactions:
actual_add_transaction,actual_update_transaction(recategorize, payee, notes, date, amount, cleared),actual_delete_transaction,actual_import_transactions(batch withimported_iddedup and dry-run preview)Payees:
actual_create_payee,actual_update_payee,actual_merge_payees,actual_delete_payeeRules:
actual_create_rule,actual_update_rule,actual_delete_ruleSchedules:
actual_create_schedule,actual_update_schedule,actual_delete_scheduleTags:
actual_create_tag,actual_update_tag,actual_delete_tagNotes:
actual_update_noteBank sync:
actual_run_bank_sync(one account or all)
Amounts in tool inputs are major currency units (123.45); Actual stores minor units (cents) and conversion happens at the boundary. Transaction lists return raw minor-unit integers; account balance and balance_current are converted to major units (balance_current: null means the account has never bank-synced). totalBudgeted in actual_get_budget_month is normalized to agree in sign with its per-group siblings (the engine reports it negated internally).
Transaction update/delete compensate for an upstream engine quirk: the engine's handlers return before their internal batch write is applied, so this server polls until the change is visible before responding — responses and backups always reflect applied state. The same one-operation lag can make a balance read immediately after actual_close_account (with transfer) show the pre-transfer value; the closed state itself is immediate.
Known limitations
Transaction splits (subtransactions) are not exposed; use the Actual UI
Single-budget by design:
loadBudget/runImport/getBudgetsmulti-file management is intentionally out of scope (one server instance per budget file)actual_run_bank_syncis registered but exercised only against the engine, not against live GoCardless/SimpleFIN providersStreamable HTTP transport not yet implemented (stdio only)
License
Dual-licensed: AGPL-3.0-only for open-source use, with a commercial license available. Contact hello@nightsquawk.tech.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Alicense-qualityBmaintenanceMCP server for integrating Actual Budget with Claude and other LLM assistants.406198TypeScriptMIT
- Alicense-qualityAmaintenanceMCP server that connects AI assistants to Actual Budget for budget management, enabling natural language queries, transaction creation, and spending analysis.1,49739MIT
- FlicenseAqualityCmaintenanceBridges AI/LLM applications to Actual Budget, exposing budget data as MCP tools for account listing, transactions, and budget balances.4
- AlicenseAqualityBmaintenanceAn MCP server that connects Actual Budget to Claude, enabling users to manage budgets, transactions, and spending insights through natural language.34132MIT
Related MCP Connectors
MCP server exposing the Backtest360 engine API as tools for AI agents.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
Pocket Agent (aipocketagent.com) MCP server — read tools for personas, apps, and product info.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/NightSquawk/actualbudget-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server