Spending analysis and safe writes for Actual Budget: every delete previews and asks first.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Talk to your budget. An MCP server that connects Actual Budget to Claude β ask where the money went, get real analysis back, and let it write without holding your breath.

ACTUAL_READ_ONLY=1 hides the write tools from the model entirely (Safety)repair_sync rebuilds the local sync state when @actual-app/api and your server disagree, the failure that otherwise leaves every tool erroringa1b2c3d4-..., with helpful suggestions if ambiguousYes. This is an MCP server, so it works with any client that speaks MCP, and the model behind that client is the client's business, not this server's. Claude Desktop, Claude Code, Cursor and VS Code are the ones documented below because they are the ones people ask about, but anything that can run an MCP client, including a local setup pointed at Ollama or LM Studio, talks to it the same way.
Your budget data goes to whatever model your client uses. If that matters to you, and for a lot of people running Actual it does, a local model keeps it on your machine.
The fastest way to get started - copy this into Claude Code or Claude Desktop:
Claude will configure everything for you.
Add this to your claude_desktop_config.json:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
Go to Cursor Settings > MCP > Add new MCP server and add:
Add this to your VS Code settings.json:
The image speaks stdio like every other option, so your client starts the container and owns its lifetime:
Two things that bite everyone once:
localhost is the container. Your Actual server is
not there. host.docker.internal (with the --add-host flag above, which is
what makes it resolve on Linux) reaches the host instead./data. That is the budget cache. Without a volume, every start
re-downloads your entire budget from the server.--verify reads the environment of the shell you run it in, and the install options above
put your credentials in your MCP client's configuration instead. So set them for the
command:
It connects, downloads the budget and prints how many accounts and category groups it found. Running it without those variables reports them as missing, which is about the command, not about your install.
After changing your client's configuration, restart the client. Claude Desktop, Claude Code and the rest read MCP configuration at startup and will not pick up an edit until they are restarted.
| Variable | Required | Description |
|---|---|---|
ACTUAL_SERVER_URL | Yes | Your Actual Budget server URL (e.g., http://localhost:5006) |
ACTUAL_PASSWORD | Yes | Server password (set in Actual Budget under Settings) |
ACTUAL_BUDGET_ID | Yes | Budget Sync ID (found in Settings > Show advanced settings) |
ACTUAL_ENCRYPTION_PASSWORD | No | Only if your budget file is encrypted |
ACTUAL_DATA_DIR | No | Cache directory (default: /tmp/actual-budget-mcp-data) |
ACTUAL_READ_ONLY | No | Set to 1/true/yes to run read-only. See Safety |
Take the Sync ID, not the Budget ID. Actual shows both, one under the other, and they
are both UUIDs. ACTUAL_BUDGET_ID wants the one labelled Sync ID, despite the name of
the variable. Using the other one gives you Budget "..." not found on the server, which
reads as though you mistyped it when the value was simply the wrong field.
If Sync ID shows (none), that budget has never been synced to a server. This server
talks to Actual through its sync server, so a local-only budget cannot be used until you
sync it.
Two things protect your budget from an agent acting on a vague instruction.
Every delete tool refuses to destroy anything on the first call. It reports what would be lost and stops there. Deleting takes a second, deliberate call:
Tools that find their target by name β delete_account, delete_category,
delete_category_group, delete_payee β also require confirm_name with the
exact name. That is where deleting the wrong thing actually happens: asking for
"Adicionales" can resolve to "Ingresos Adicionales". Tools that take an exact id
β delete_transaction, delete_rule β need only confirm: true.
Set ACTUAL_READ_ONLY=1 and the server exposes only the 15 read, analysis and
repair tools. The write tools are not registered at all, so they never
appear in tool discovery β an agent cannot be talked into calling something it
cannot see.
repair_sync stays available on purpose: it repairs sync state rather than
budget data, and hiding it would leave a desynced budget with no way to recover.
Writes are enabled by default. Read-only is opt-in.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/actual-budget)<a href="https://allmcps.com/mcp/actual-budget"><img src="https://allmcps.com/api/badge/actual-budget?style=directory" alt="Actual Budget on AllMCPs" /></a>