Atlas / MCP servers / s-stefanov / Actual Budget

Actual BudgetSAFE

mcp/s-stefanov/actual-budget

Model Context Protocol for Actual Budget API

Verdict
SAFE
Grade
B
Trust score
89 /100
Exposed tools
54 24r · 21w · 9d
Transport
sse · stdio · streamable-http
License
MIT
Stars
248
01

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 descri
Read from source at commit 9848e09051c1OBSERVED · 2026-10-06
02

Connect

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-code (npm)
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-code (npm)
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] 3000
03

Exposed 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.

ToolRiskDescription
actual-cleanupreadAnalyze budget for cleanup opportunities
add-dashboard-widgetwriteAdd a widget to a dashboard page in the Reports section
balance-historyreadGet account balance history over time
budget-reviewreadReview my budget and spending
budget-vs-actualreadCompare budgeted amounts against actual spending per category, for recent months. Returns JSON; amounts are integer cents.
cash-flowreadReport income, expenses, and net cash flow per month or week. Returns JSON; amounts are integer cents.
category-trendsreadShow how spending in each category changes month over month, with trend direction. Returns JSON; amounts are integer cents.
create-categorywriteCreate a new category
create-category-groupwriteCreate a new category group
create-custom-reportwriteCreate a saved custom report, selectable as a widget in the Reports section
create-dashboard-pagewriteCreate a new, empty dashboard page in the Reports section
create-payeewriteCreate a new payee
create-rulewriteCreate a new rule
create-transactionwriteCreate a new transaction. Use this to add transactions to accounts. Supports transfers between accounts by
delete-categorydestructiveDelete a category
delete-category-groupdestructiveDelete a category group
delete-custom-reportdestructiveDelete a saved custom report
delete-dashboard-pagedestructiveDelete a dashboard page along with every widget on it
delete-payeedestructiveDelete a payee
delete-ruledestructiveDelete a rule
delete-transactiondestructiveDelete a transaction by its ID. This action is permanent and cannot be undone.
endDatereadEnd date in YYYY-MM-DD format
financial-insightsreadGenerate financial insights and advice
get-accountsreadRetrieve a list of all accounts with their current balance and ID.
get-budget-monthreadRetrieve budget data for a specific month, including budgeted amounts, spending, and balances per category.
get-budget-monthsreadRetrieve a list of all available budget months in YYYY-MM format.
get-custom-reportsreadRetrieve every saved custom report from the budget
get-dashboardsreadRetrieve every dashboard page and the widgets laid out on it. These are the dashboards under the Reports section of the sidebar.
get-grouped-categoriesreadRetrieve a list of all category groups with their id, name, type and category list.
get-payeesreadRetrieve a list of all payees with their id, name, categoryId and transferAccountId.
get-rulesreadRetrieve a list of all rules. PS amount comes in cents: positive for deposit, negative for payment
get-transactionsreadGet transactions with optional filtering, for one account or across all accounts if accountId is omitted
hold-budget-for-next-monthreadReserve budget funds from the current month to be used in the following month. Value must be in integer cents.
import-transactionswriteImport a list of transactions into an account using reconciliation logic.
monthly-summaryreadGet monthly income, expenses, and savings
monthsreadNumber of months to analyze
net-worthreadTrack assets, liabilities, and net worth across all accounts over time. Returns JSON; amounts are integer cents.
organize-dashboardreadReposition and resize several dashboard widgets at once, to rearrange a dashboard layout in the Reports section
remove-dashboard-widgetdestructiveRemove a widget from its dashboard page
rename-dashboard-pagewriteRename an existing dashboard page
reset-budget-holddestructiveClear any held budget amounts for a specified month, releasing them back to the available balance.
run-bank-syncwriteRun bank synchronization (GoCardless/SimpleFIN) to download latest transactions.
set-budget-amountwriteSet the budgeted amount for a category in a given month. Value must be in integer cents (e.g. 12030 = $120.30).
set-budget-carryoverwriteEnable or disable carryover of unspent funds for a category into the next month.
spending-by-categoryreadGet spending breakdown by category for a specified date range
spending-by-payeereadRank payees by how much money was spent with (or received from) each one. Returns JSON; amounts are integer cents.
startDatewriteStart date in YYYY-MM-DD format
update-categorywriteUpdate a category
update-category-groupwriteUpdate a category group
update-custom-reportwriteUpdate fields on a saved custom report, leaving unspecified fields unchanged
update-dashboard-widgetwriteUpdate a dashboard widget
update-payeewriteUpdate a payee
update-rulewriteUpdate a rule
update-transactionwriteUpdate an existing transaction. Can modify date, amount, payee, category, notes, cleared status, and
04

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.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codePASS
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (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)

MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
delete-category, delete-category-group, delete-custom-report, delete-dashboard-page, delete-payee, delete-rule, delete-transaction, remove-dashboard-widget, reset-budget-hold
Why it matters. 9 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.hidden_file · CWE-1104
.prettierignore
.prettierignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.release-please-manifest.json
.release-please-manifest.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/core/data/fetch-account-balance.test.ts:4
vi.mock('../../actual-api.js', () => ({
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/core/data/fetch-account-balance.test.ts:8
import { getAccountBalance } from '../../actual-api.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/core/data/fetch-account-balance.ts:1
import { getAccountBalance } from '../../actual-api.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/core/data/fetch-accounts.test.ts:5
vi.mock('../../actual-api.js', () => ({
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/core/data/fetch-accounts.test.ts:9
import { getAccounts } from '../../actual-api.js';
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
testcontainers
Why it matters. 1 dependency range(s) float
Fix. pin exact versions or ship a lockfile

Gates applied: no_behavioural_pass.

Audited 2026-10-06 · audit v0.4.1 · source sha 9848e09051c1full audit observations/trust-audit/mcp-server/s-stefanov__actual-budget.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-069848e09051c1SAFEB89first audit
06

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.

Advertisement