# Actual Budget (npm · actual-budget-mcp)

Spending analysis and safe writes for Actual Budget: every delete previews and asks first.

- Trust score: 86/100 (high trust)
- Change this week: +18
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-20

## Components

- npm · `actual-budget-mcp`: 86/100 (this document), [markdown](https://verifymcp.io/servers/henfrydls-actual-budget-mcp/actual-budget-mcp.md), [page](https://verifymcp.io/servers/henfrydls-actual-budget-mcp/actual-budget-mcp)
- oci · `ghcr.io/henfrydls/actual-budget-mcp:0.9.2`: 37/100, [markdown](https://verifymcp.io/servers/henfrydls-actual-budget-mcp/ghcr-io-henfrydls-actual-budget-mcp-0-9-2.md), [page](https://verifymcp.io/servers/henfrydls-actual-budget-mcp/ghcr-io-henfrydls-actual-budget-mcp-0-9-2)

## Channel facts

- Registry: `npm`
- Package: `actual-budget-mcp`
- Version: `0.9.2`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-20.

- **Supply Chain Security**: 98/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 67 of 163 dependencies flagged as unhealthy (1 deprecated).
- **Provenance & Transparency**: 71/100
  - Repository check failed: the declared repository URL redirects; it must resolve directly.
  - Cryptographically verified build provenance (signed, bound to henfrydls/actual-budget-mcp).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 3 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 87/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Tool/resource definitions use about 2930 tokens (~73/item across 40 items; 37 tools + 3 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 63/100
  - Stability observed for 19 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 96/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 6 of 7 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "create_transfer" implies "transfer" and declares no destructiveHint at all, which the MCP spec reads as destructive by default.
  - An AI judge read all 38 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the Actual Budget MCP server?

Actual Budget runs locally as an npm package, launched with npx -y actual-budget-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add henfrydls-actual-budget-mcp -- npx -y actual-budget-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "henfrydls-actual-budget-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "actual-budget-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "henfrydls-actual-budget-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "actual-budget-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add henfrydls-actual-budget-mcp -- npx -y actual-budget-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "henfrydls-actual-budget-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "actual-budget-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add henfrydls-actual-budget-mcp --command npx --arg -y --arg actual-budget-mcp
```

### Hermes

```yaml
mcp_servers:
  henfrydls-actual-budget-mcp:
    command: "npx"
    args: ["-y", "actual-budget-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "henfrydls-actual-budget-mcp": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "actual-budget-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add henfrydls-actual-budget-mcp -t stdio -c npx -a -y actual-budget-mcp
```

### Other

```json
{
  "mcpServers": {
    "henfrydls-actual-budget-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "actual-budget-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-20 (score 86, +1)

No change was recorded against any check on this day. Stability & Change Management went from 60 to 63. That category is still filling its 30-day observation window: 18 days of observed history at the previous scan, 19 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-18 (score 85, +1)

No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-17 (score 84, +15)

- [security improvement] Malware scan: unverified → pass
- [functional] Package version: 0.9.1 → 0.9.2

### 2026-09-16 (score 69, −15)

- [security regression] Malware scan: pass → unverified
- [functional] Package version: 0.9.0 → 0.9.1

### 2026-09-15 (score 84, +1)

No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-14 (score 83, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-09-13 (score 68, −14)

- [security regression] Malware scan: pass → unverified
- [functional] Package version: 0.8.2 → 0.9.0

### 2026-09-11 (score 82, +1)

No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.

## MCP tools (37)

### `list_accounts` (~27 tokens)

List all budget accounts with their current balances, type (on-budget/off-budget), and status.

### `get_budget_month` (~79 tokens)

Get the budget for a specific month showing all category groups, their categories with budgeted amounts, actual spending, and remaining balance. Also shows the to-be-budgeted amount.

Input parameters:

- `month` (string): Month in YYYY-MM format, or natural language like "this month", "last month", "January 2025". Defaults to current month.

### `get_transactions` (~189 tokens)

List transactions with optional filters. Returns date, payee, category, amount, notes, account, and cleared status.

Input parameters:

- `account` (string): Account name or ID to filter by
- `category` (string): Category name to filter by (partial match)
- `end_date` (string): End date (YYYY-MM-DD or natural language). Defaults to today.
- `limit` (number): Maximum number of transactions to return (default 50)
- `max_amount` (number): Maximum amount in human format
- `min_amount` (number): Minimum amount in human format (e.g., -500 for expenses of at least 500)
- `payee` (string): Payee name to filter by (partial match)
- `start_date` (string): Start date (YYYY-MM-DD or natural language like "start of month", "30 days ago"). Defaults to start of current month.

### `get_category_balance` (~53 tokens)

Get the balance and spending history for a specific category across one or more months.

Input parameters:

- `category` (string, required): Category name or ID
- `months` (number): Number of months to look back (default 3)

### `get_budget_summary` (~58 tokens)

Executive summary of the budget showing totals by category group, total income, total expenses, savings rate, and to-be-budgeted for a given month.

Input parameters:

- `month` (string): Month (YYYY-MM or natural language). Defaults to current month.

### `get_categories` (~26 tokens)

List all category groups with their categories and IDs. Useful for seeing the full budget structure.

### `get_payees` (~27 tokens)

List all payees in the budget. Useful for seeing available payees and their IDs.

### `budget_vs_actual` (~65 tokens)

Compare budgeted amounts versus actual spending for each category in a given month. Highlights over-budget and under-budget categories.

Input parameters:

- `group` (string): Filter to a specific category group name
- `month` (string): Month (YYYY-MM or natural language). Defaults to current month.

### `spending_projection` (~54 tokens)

Project end-of-month spending for each category based on the current daily spending rate. Warns about categories likely to exceed budget.

Input parameters:

- `month` (string): Month to project (YYYY-MM or natural language). Defaults to current month.

### `category_trends` (~63 tokens)

Show spending trends for a category across multiple months. Identifies increasing/decreasing patterns.

Input parameters:

- `category` (string): Category name or ID. If omitted, shows trends for top spending categories.
- `months` (number): Number of months to analyze (default 6)

### `spending_by_category` (~107 tokens)

Break down spending by category for a date range. Shows each category's total spending and percentage of total.

Input parameters:

- `end_date` (string): End date (YYYY-MM-DD or natural language). Defaults to today.
- `include_income` (boolean): Include income categories (default: false)
- `limit` (number): Maximum number of categories to show (default 20)
- `start_date` (string): Start date (YYYY-MM-DD or natural language). Defaults to start of current month.

### `monthly_summary` (~51 tokens)

Monthly financial summary showing income, expenses, savings, and savings rate across multiple months. Great for seeing trends in your overall financial health.

Input parameters:

- `months` (number): Number of months to show (default 3)

### `balance_history` (~82 tokens)

Track an account's balance changes over time by showing the running balance at key transaction dates.

Input parameters:

- `account` (string, required): Account name or ID
- `end_date` (string): End date (YYYY-MM-DD or natural language). Defaults to today.
- `start_date` (string): Start date (YYYY-MM-DD or natural language). Defaults to 3 months ago.

### `get_rules` (~18 tokens)

List all transaction rules showing their conditions and actions.

### `repair_sync` (~48 tokens)

Repair the budget's sync state when operations fail with an out-of-sync error. Rebuilds sync bookkeeping without modifying budget data. Use this when other tools report that the budget is out of sync.

### `create_transaction` (~132 tokens)

Add a new transaction to an account. Use negative amounts for expenses, positive for income.

Input parameters:

- `account` (string, required): Account name or ID
- `amount` (number, required): Amount (negative for expenses, positive for income). Use human amounts like -150.50, not cents.
- `category` (string): Category name or ID
- `cleared` (boolean): Whether the transaction is cleared
- `date` (string): Transaction date (YYYY-MM-DD or "today", "yesterday"). Defaults to today.
- `notes` (string): Transaction notes
- `payee` (string): Payee name

### `create_split_transaction` (~144 tokens)

Add a split transaction: one bank-facing total spread across multiple categories. The split amounts must sum to the total.

Input parameters:

- `account` (string, required): Account name or ID
- `amount` (number, required): Total amount (negative for expenses, positive for income). Must equal the sum of the splits.
- `cleared` (boolean): Whether the transaction is cleared
- `date` (string): Transaction date (YYYY-MM-DD or "today", "yesterday"). Defaults to today.
- `notes` (string): Notes for the parent transaction
- `payee` (string): Payee name
- `splits` (array, required): Two or more splits whose amounts sum to the total.

### `reconcile_currency_residual` (~141 tokens)

Book an adjustment transaction to bring a multi-currency account to the balance the bank reports, clearing accumulated FX-rate residual.

Input parameters:

- `account` (string, required): Account name or ID to reconcile
- `category` (string, required): Category to book the adjustment under (name or ID)
- `date` (string): Date for the adjustment (YYYY-MM-DD or "today"). Defaults to today.
- `notes` (string): Note for the adjustment. Defaults to "FX residual adjustment".
- `payee` (string): Optional payee for the adjustment
- `target_balance` (number): Balance the bank reports for this account (human amount). Defaults to 0.

### `update_budget_amount` (~75 tokens)

Set the budgeted amount for a category in a specific month.

Input parameters:

- `amount` (number, required): New budgeted amount (human-readable, e.g., 5000.00)
- `category` (string, required): Category name or ID
- `month` (string): Month (YYYY-MM or natural language). Defaults to current month.

### `recategorize_transaction` (~40 tokens)

Change the category of an existing transaction.

Input parameters:

- `category` (string, required): New category name or ID
- `transaction_id` (string, required): Transaction ID

### `create_transfer` (~90 tokens)

Create a transfer between two accounts.

Input parameters:

- `amount` (number, required): Transfer amount (positive number, e.g., 5000.00)
- `date` (string): Date (YYYY-MM-DD or natural language). Defaults to today.
- `from_account` (string, required): Source account name or ID
- `notes` (string): Transfer notes
- `to_account` (string, required): Destination account name or ID

### `update_transaction` (~122 tokens)

Update fields of an existing transaction. Only the fields you provide will be changed.

Input parameters:

- `amount` (number): New amount (negative for expenses, positive for income). Human amounts, not cents.
- `category` (string): New category name or ID
- `cleared` (boolean): Whether the transaction is cleared
- `date` (string): New date (YYYY-MM-DD or "today", "yesterday")
- `notes` (string): New notes
- `payee` (string): New payee name
- `transaction_id` (string, required): Transaction ID

### `delete_transaction` (~69 tokens)

Delete a transaction by its ID. Destructive and irreversible: the first call only previews what would be lost, and deleting requires confirm: true.

Input parameters:

- `confirm` (boolean): Must be true to delete. Without it, the tool only previews.
- `transaction_id` (string, required): Transaction ID to delete

### `run_bank_sync` (~58 tokens)

Sync bank transactions from linked accounts (GoCardless/SimpleFIN). Syncs a specific account or all linked accounts if none specified.

Input parameters:

- `account` (string): Account name or ID to sync. If omitted, syncs all linked accounts.

### `create_account` (~107 tokens)

Create a new budget account (on-budget or off-budget). Returns the new account ID so transactions can target it right away.

Input parameters:

- `initialBalance` (number): Opening balance in human amounts (e.g. 1500.50, not cents). Creates the "Starting Balance" transaction.
- `name` (string, required): Account name
- `offBudget` (boolean): Whether the account is off-budget (tracked but outside the budget, e.g. a loan or investment). Defaults to false.

### `delete_account` (~119 tokens)

Delete an account and its entire transaction history. Destructive and irreversible: the first call only previews what would be lost, and deleting requires both confirm: true and confirm_name set to the account's exact name. Prefer closing an account when you just want to retire it.

Input parameters:

- `account` (string, required): Account name or ID to delete
- `confirm` (boolean): Must be true to delete. Without it, the tool only previews.
- `confirm_name` (string): The account's exact name, echoed back as a safeguard against deleting the wrong account.

### `create_category` (~47 tokens)

Create a new budget category within a category group.

Input parameters:

- `group` (string, required): Category group name or ID to add this category to
- `name` (string, required): Name for the new category

### `update_category` (~57 tokens)

Rename or hide/unhide a budget category.

Input parameters:

- `category` (string, required): Category name or ID
- `hidden` (boolean): Set to true to hide, false to unhide
- `name` (string): New name for the category

### `delete_category` (~132 tokens)

Delete a budget category. Destructive and irreversible: the first call only previews, and deleting requires confirm: true plus confirm_name set to the category's exact name. Deleting a category also destroys its budget and rollover history; pass transfer_to to keep its transactions categorised.

Input parameters:

- `category` (string, required): Category name or ID to delete
- `confirm` (boolean): Must be true to delete. Without it, the tool only previews.
- `confirm_name` (string): The category's exact name, echoed back as a safeguard.
- `transfer_to` (string): Category name or ID to transfer existing transactions to

### `create_category_group` (~32 tokens)

Create a new category group for organizing budget categories.

Input parameters:

- `name` (string, required): Name for the new category group

### `update_category_group` (~59 tokens)

Rename or hide/unhide a category group.

Input parameters:

- `group` (string, required): Category group name or ID
- `hidden` (boolean): Set to true to hide, false to unhide
- `name` (string): New name for the group

### `delete_category_group` (~130 tokens)

Delete a category group and every category in it. Destructive and irreversible: the first call only previews, and deleting requires confirm: true plus confirm_name set to the group's exact name. You must specify a category to transfer orphaned categories' transactions to.

Input parameters:

- `confirm` (boolean): Must be true to delete. Without it, the tool only previews.
- `confirm_name` (string): The group's exact name, echoed back as a safeguard.
- `group` (string, required): Category group name or ID to delete
- `transfer_to` (string, required): Category name or ID to transfer orphaned transactions to

### `create_payee` (~28 tokens)

Create a new payee.

Input parameters:

- `name` (string, required): Name for the new payee

### `update_payee` (~40 tokens)

Rename a payee.

Input parameters:

- `name` (string, required): New name for the payee
- `payee` (string, required): Payee name or ID

### `delete_payee` (~98 tokens)

Delete a payee. Destructive and irreversible: the first call only previews, and deleting requires confirm: true plus confirm_name set to the payee's exact name.

Input parameters:

- `confirm` (boolean): Must be true to delete. Without it, the tool only previews.
- `confirm_name` (string): The payee's exact name, echoed back as a safeguard.
- `payee` (string, required): Payee name or ID to delete

### `create_rule` (~158 tokens)

Create a transaction rule. When a transaction matches the condition, the action is applied automatically.

Input parameters:

- `action_field` (string, required): Field to set: category, payee, notes
- `action_value` (string, required): Value to set (category name/ID, payee name, or note text)
- `condition_field` (string, required): Field to match: payee, category, amount, notes, imported_payee
- `condition_op` (string, required): Operator: is, contains, oneOf, isNot, doesNotContain, matches, gt, lt, gte, lte
- `condition_value` (string, required): Value to match against
- `stage` (string): When to apply: null (default), pre, or post

### `delete_rule` (~68 tokens)

Delete a transaction rule by its ID. Destructive and irreversible: the first call only previews the rule, and deleting requires confirm: true.

Input parameters:

- `confirm` (boolean): Must be true to delete. Without it, the tool only previews.
- `rule_id` (string, required): Rule ID to delete

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/henfrydls-actual-budget-mcp/actual-budget-mcp#diagnostics

## Score history

- 2026-09-20: 86
- 2026-09-19: 85
- 2026-09-18: 85
- 2026-09-17: 84
- 2026-09-16: 69
- 2026-09-15: 84
- 2026-09-14: 83
- 2026-09-13: 68
- 2026-09-12: 82
- 2026-09-11: 82
- 2026-09-10: 81
- 2026-09-09: 81
- 2026-09-08: 80
- 2026-09-07: 77
- 2026-09-06: 77
- 2026-09-05: 77
- 2026-09-04: 77
- 2026-09-03: 77
- 2026-09-02: 77
- 2026-09-01: 77

## Common questions

### What is the Actual Budget MCP server?

Actual Budget is an MCP server listed in the public MCP registry as io.github.henfrydls/actual-budget-mcp. Spending analysis and safe writes for Actual Budget: every delete previews and asks first. This page covers its npm package (actual-budget-mcp).

### Is the Actual Budget MCP server safe to use?

Actual Budget scores 86 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Actual Budget MCP server expose?

Actual Budget exposes 37 tools: list_accounts, get_budget_month, get_transactions, get_category_balance, get_budget_summary, and 32 more. Their descriptions and schemas cost roughly 2,893 tokens of context every time the server is loaded.

### Is the Actual Budget MCP server still maintained?

Actual Budget is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the Actual Budget MCP server under?

Actual Budget declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- npm package: https://www.npmjs.com/package/actual-budget-mcp
- Socket report: https://socket.dev/npm/package/actual-budget-mcp
- Website: https://actual-mcp.henfrydls.com/
- Changelog RSS feed: https://verifymcp.io/servers/henfrydls-actual-budget-mcp/actual-budget-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/henfrydls-actual-budget-mcp/actual-budget-mcp.json
- HTML version of this page: https://verifymcp.io/servers/henfrydls-actual-budget-mcp/actual-budget-mcp
