Actual BudgetSAFE
Model Context Protocol for Actual Budget API
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
MCP server for integrating Actual Budget with Claude and other LLM assistants.
Overview
The Actual Budget MCP Server allows you to interact with your personal financial data from Actual Budget using natural language through LLMs. It exposes your accounts, transactions, and financial metrics through the Model Context Protocol (MCP).
Features
Resources
- Account Listings - Browse all your accounts with their balances
- Account Details - View detailed information about specific accounts
- Transaction History - Access transaction data with complete details
Tools
Transaction & Account Management
- `get-transactions` - Retrieve and filter transactions by account, date, amount, category, or payee
- `create-transaction` - Create a new transaction in an account with optional category, payee, and notes
- `update-transaction` - Update an existing transaction with new category, payee, notes, or amount
- `get-accounts` - Retrieve a list of all accounts with their current balance and ID
- `balance-history` - View account balance changes over time
Reporting & Analytics
- `spending-by-category` - Generate spending breakdowns categorized by type
- `monthly-summary` - Get monthly income, expenses, and savings metrics
- `budget-vs-actual` - Compare budgeted amounts against actual spending per category
- `net-worth` - Track assets, liabilities, and net worth across all accounts over time
- `category-trends` - See how spending in each category moves month over month, with trend direction
- `spending-by-payee` - Rank payees by how much was spent with (or received from) each one
- `cash-flow` - Report income, expenses, and net cash flow per month or week
The five tools above return JSON rather than markdown, so amounts stay machine-readable. Every amount is an integer number of cents, and each response carries an amountsIn field descri9848e09051c1OBSERVED · 2026-10-06Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.
claude mcp add actual-mcp --env ACTUAL_PASSWORD=${ACTUAL_PASSWORD} --env ACTUAL_BUDGET_ENCRYPTION_PASSWORD=${ACTUAL_BUDGET_ENCRYPTION_PASSWORD} --env ACTUAL_PASSWORD=${ACTUAL_PASSWORD} --env ACTUAL_BUDGET_ENCRYPTION_PASSWORD=${ACTUAL_BUDGET_ENCRYPTION_PASSWORD} -- npx -y [email protected]claude mcp add actual-mcp --env ACTUAL_PASSWORD=${ACTUAL_PASSWORD} --env ACTUAL_BUDGET_ENCRYPTION_PASSWORD=${ACTUAL_BUDGET_ENCRYPTION_PASSWORD} --env ACTUAL_PASSWORD=${ACTUAL_PASSWORD} --env ACTUAL_BUDGET_ENCRYPTION_PASSWORD=${ACTUAL_BUDGET_ENCRYPTION_PASSWORD} -- npx -y [email protected] 3000Exposed tools (54)
24 read · 21 write · 9 destructive. Blast radius: 9 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.
| Tool | Risk | Description |
|---|---|---|
actual-cleanup | read | Analyze budget for cleanup opportunities |
add-dashboard-widget | write | Add a widget to a dashboard page in the Reports section |
balance-history | read | Get account balance history over time |
budget-review | read | Review my budget and spending |
budget-vs-actual | read | Compare budgeted amounts against actual spending per category, for recent months. Returns JSON; amounts are integer cents. |
cash-flow | read | Report income, expenses, and net cash flow per month or week. Returns JSON; amounts are integer cents. |
category-trends | read | Show how spending in each category changes month over month, with trend direction. Returns JSON; amounts are integer cents. |
create-category | write | Create a new category |
create-category-group | write | Create a new category group |
create-custom-report | write | Create a saved custom report, selectable as a widget in the Reports section |
create-dashboard-page | write | Create a new, empty dashboard page in the Reports section |
create-payee | write | Create a new payee |
create-rule | write | Create a new rule |
create-transaction | write | Create a new transaction. Use this to add transactions to accounts. Supports transfers between accounts by |
delete-category | destructive | Delete a category |
delete-category-group | destructive | Delete a category group |
delete-custom-report | destructive | Delete a saved custom report |
delete-dashboard-page | destructive | Delete a dashboard page along with every widget on it |
delete-payee | destructive | Delete a payee |
delete-rule | destructive | Delete a rule |
delete-transaction | destructive | Delete a transaction by its ID. This action is permanent and cannot be undone. |
endDate | read | End date in YYYY-MM-DD format |
financial-insights | read | Generate financial insights and advice |
get-accounts | read | Retrieve a list of all accounts with their current balance and ID. |
get-budget-month | read | Retrieve budget data for a specific month, including budgeted amounts, spending, and balances per category. |
get-budget-months | read | Retrieve a list of all available budget months in YYYY-MM format. |
get-custom-reports | read | Retrieve every saved custom report from the budget |
get-dashboards | read | Retrieve every dashboard page and the widgets laid out on it. These are the dashboards under the Reports section of the sidebar. |
get-grouped-categories | read | Retrieve a list of all category groups with their id, name, type and category list. |
get-payees | read | Retrieve a list of all payees with their id, name, categoryId and transferAccountId. |
get-rules | read | Retrieve a list of all rules. PS amount comes in cents: positive for deposit, negative for payment |
get-transactions | read | Get transactions with optional filtering, for one account or across all accounts if accountId is omitted |
hold-budget-for-next-month | read | Reserve budget funds from the current month to be used in the following month. Value must be in integer cents. |
import-transactions | write | Import a list of transactions into an account using reconciliation logic. |
monthly-summary | read | Get monthly income, expenses, and savings |
months | read | Number of months to analyze |
net-worth | read | Track assets, liabilities, and net worth across all accounts over time. Returns JSON; amounts are integer cents. |
organize-dashboard | read | Reposition and resize several dashboard widgets at once, to rearrange a dashboard layout in the Reports section |
remove-dashboard-widget | destructive | Remove a widget from its dashboard page |
rename-dashboard-page | write | Rename an existing dashboard page |
reset-budget-hold | destructive | Clear any held budget amounts for a specified month, releasing them back to the available balance. |
run-bank-sync | write | Run bank synchronization (GoCardless/SimpleFIN) to download latest transactions. |
set-budget-amount | write | Set the budgeted amount for a category in a given month. Value must be in integer cents (e.g. 12030 = $120.30). |
set-budget-carryover | write | Enable or disable carryover of unspent funds for a category into the next month. |
spending-by-category | read | Get spending breakdown by category for a specified date range |
spending-by-payee | read | Rank payees by how much money was spent with (or received from) each one. Returns JSON; amounts are integer cents. |
startDate | write | Start date in YYYY-MM-DD format |
update-category | write | Update a category |
update-category-group | write | Update a category group |
update-custom-report | write | Update fields on a saved custom report, leaving unspecified fields unchanged |
update-dashboard-widget | write | Update a dashboard widget |
update-payee | write | Update a payee |
update-rule | write | Update a rule |
update-transaction | write | Update an existing transaction. Can modify date, amount, payee, category, notes, cleared status, and |
Trust audit
SAFEgrade B · trust 89/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | PASS |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | WARN |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (2 observation(s))
- Network
- declared (1 observation(s))
- Shell
- none-observed
- Dependencies
- not all pinned
- Secrets in source
- none-found
Findings (9)
delete-category, delete-category-group, delete-custom-report, delete-dashboard-page, delete-payee, delete-rule, delete-transaction, remove-dashboard-widget, reset-budget-hold
.prettierignore
.release-please-manifest.json
vi.mock('../../actual-api.js', () => ({import { getAccountBalance } from '../../actual-api.js';import { getAccountBalance } from '../../actual-api.js';vi.mock('../../actual-api.js', () => ({import { getAccounts } from '../../actual-api.js';testcontainers
Gates applied: no_behavioural_pass.
9848e09051c1full audit observations/trust-audit/mcp-server/s-stefanov__actual-budget.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-06 | 9848e09051c1 | SAFE | B | 89 | first audit |
Questions
What is the Actual Budget MCP server?
Model Context Protocol for Actual Budget API
What tools does Actual Budget expose?
54 in total: 24 read-only, 21 that write, and 9 that can delete or overwrite (delete-category, delete-category-group, delete-custom-report, delete-dashboard-page, delete-payee). Every one is listed on this page with its risk.
Is Actual Budget safe to connect to an agent?
The audit found nothing in the source that contradicts what it says it does, and graded it B (89/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean server reads B. Separately from the audit: 9 of its tools can destroy data, so scope the token you give it to what you actually need.
What credentials does Actual Budget need?
It reads ACTUAL_BUDGET_ENCRYPTION_PASSWORD, ACTUAL_PASSWORD and BEARER_TOKEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.
How does Actual Budget run?
It speaks sse, stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as actual-mcp at 1.14.0.
How current is this page?
The grade is for one exact copy of the source (9848e09051c1), read on 2026-10-06. The repository is watched and re-audited when it changes.