# Actual Budget (oci · ghcr.io/henfrydls/actual-budget-mcp)

Actual Budget, carefully: deletes preview first, and new transactions check for duplicates.

- Trust score: 47/100 (low)
- Change this week: −4
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- npm · `actual-budget-mcp`: 87/100, [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`: 47/100 (this document), [markdown](https://verifymcp.io/servers/henfrydls-actual-budget-mcp/ghcr-io-henfrydls-actual-budget-mcp.md), [page](https://verifymcp.io/servers/henfrydls-actual-budget-mcp/ghcr-io-henfrydls-actual-budget-mcp)

## Channel facts

- Registry: `oci`
- Package: `ghcr.io/henfrydls/actual-budget-mcp`
- Version: `0.12.0`
- 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-11-05.

- **Supply Chain Security**: 0/100
  - No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.
  - Known CVEs could not be checked: this artifact ships no SBOM or dependency manifest, so there is no dependency list to read.
  - Install-script risk not yet assessed.
  - Dependency health could not be checked: this artifact ships no SBOM or dependency manifest, so there is no dependency list to read.
- **Provenance & Transparency**: 19/100
  - Repository check failed: the declared repository URL redirects; it must resolve directly.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 0 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 85/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).
  - Context-footprint check failed: tool/resource definitions use about 5621 tokens (~119/item across 47 items; 44 tools + 3 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 72/100
  - Stability check failed: the tool surface changed between 0.10.5 and 0.12.0: 0 tool removals, 1 breaking changes, 3 additions.
- **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**: 94/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 6 of 8 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "transfer_between_categories" implies "transfer" and declares no destructiveHint at all, which the MCP spec reads as destructive by default.
  - An AI judge read all 46 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.

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

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

Actual Budget runs locally as a container image, launched with docker run --rm -i -e ACTUAL_SERVER_URL -e ACTUAL_PASSWORD -e ACTUAL_SESSION_TOKEN -e ACTUAL_BUDGET_ID -e ACTUAL_BUDGET_IDS -e ACTUAL_ENCRYPTION_PASSWORDS -e ACTUAL_BUDGET_WORKERS -e ACTUAL_WORKER_IDLE_MINUTES -e ACTUAL_WORKER_READY_SECONDS -e ACTUAL_READ_ONLY -e ACTUAL_TOOLSET -e ACTUAL_HTTP_TIMEOUT_MS -e ACTUAL_HTTP_PORT -e ACTUAL_HTTP_TOKEN -e ACTUAL_HTTP_WRITE_TOKEN -e ACTUAL_HTTP_HOST -e ACTUAL_HTTP_ALLOW_REMOTE -e ACTUAL_HTTP_ALLOWED_HOSTS ghcr.io/henfrydls/actual-budget-mcp:0.12.0. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add henfrydls-actual-budget-mcp -- docker run --rm -i -e ACTUAL_SERVER_URL -e ACTUAL_PASSWORD -e ACTUAL_SESSION_TOKEN -e ACTUAL_BUDGET_ID -e ACTUAL_BUDGET_IDS -e ACTUAL_ENCRYPTION_PASSWORDS -e ACTUAL_BUDGET_WORKERS -e ACTUAL_WORKER_IDLE_MINUTES -e ACTUAL_WORKER_READY_SECONDS -e ACTUAL_READ_ONLY -e ACTUAL_TOOLSET -e ACTUAL_HTTP_TIMEOUT_MS -e ACTUAL_HTTP_PORT -e ACTUAL_HTTP_TOKEN -e ACTUAL_HTTP_WRITE_TOKEN -e ACTUAL_HTTP_HOST -e ACTUAL_HTTP_ALLOW_REMOTE -e ACTUAL_HTTP_ALLOWED_HOSTS ghcr.io/henfrydls/actual-budget-mcp:0.12.0
```

This image reads ACTUAL_SERVER_URL, ACTUAL_PASSWORD, ACTUAL_SESSION_TOKEN, ACTUAL_BUDGET_ID, ACTUAL_BUDGET_IDS, ACTUAL_ENCRYPTION_PASSWORDS, ACTUAL_BUDGET_WORKERS, ACTUAL_WORKER_IDLE_MINUTES, ACTUAL_WORKER_READY_SECONDS, ACTUAL_READ_ONLY, ACTUAL_TOOLSET, ACTUAL_HTTP_TIMEOUT_MS, ACTUAL_HTTP_PORT, ACTUAL_HTTP_TOKEN, ACTUAL_HTTP_WRITE_TOKEN, ACTUAL_HTTP_HOST, ACTUAL_HTTP_ALLOW_REMOTE and ACTUAL_HTTP_ALLOWED_HOSTS. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Cursor

```json
{
  "mcpServers": {
    "henfrydls-actual-budget-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "ACTUAL_SERVER_URL",
        "-e",
        "ACTUAL_PASSWORD",
        "-e",
        "ACTUAL_SESSION_TOKEN",
        "-e",
        "ACTUAL_BUDGET_ID",
        "-e",
        "ACTUAL_BUDGET_IDS",
        "-e",
        "ACTUAL_ENCRYPTION_PASSWORDS",
        "-e",
        "ACTUAL_BUDGET_WORKERS",
        "-e",
        "ACTUAL_WORKER_IDLE_MINUTES",
        "-e",
        "ACTUAL_WORKER_READY_SECONDS",
        "-e",
        "ACTUAL_READ_ONLY",
        "-e",
        "ACTUAL_TOOLSET",
        "-e",
        "ACTUAL_HTTP_TIMEOUT_MS",
        "-e",
        "ACTUAL_HTTP_PORT",
        "-e",
        "ACTUAL_HTTP_TOKEN",
        "-e",
        "ACTUAL_HTTP_WRITE_TOKEN",
        "-e",
        "ACTUAL_HTTP_HOST",
        "-e",
        "ACTUAL_HTTP_ALLOW_REMOTE",
        "-e",
        "ACTUAL_HTTP_ALLOWED_HOSTS",
        "ghcr.io/henfrydls/actual-budget-mcp:0.12.0"
      ]
    }
  }
}
```

This image reads ACTUAL_SERVER_URL, ACTUAL_PASSWORD, ACTUAL_SESSION_TOKEN, ACTUAL_BUDGET_ID, ACTUAL_BUDGET_IDS, ACTUAL_ENCRYPTION_PASSWORDS, ACTUAL_BUDGET_WORKERS, ACTUAL_WORKER_IDLE_MINUTES, ACTUAL_WORKER_READY_SECONDS, ACTUAL_READ_ONLY, ACTUAL_TOOLSET, ACTUAL_HTTP_TIMEOUT_MS, ACTUAL_HTTP_PORT, ACTUAL_HTTP_TOKEN, ACTUAL_HTTP_WRITE_TOKEN, ACTUAL_HTTP_HOST, ACTUAL_HTTP_ALLOW_REMOTE and ACTUAL_HTTP_ALLOWED_HOSTS. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### VS Code

```json
{
  "servers": {
    "henfrydls-actual-budget-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "ACTUAL_SERVER_URL",
        "-e",
        "ACTUAL_PASSWORD",
        "-e",
        "ACTUAL_SESSION_TOKEN",
        "-e",
        "ACTUAL_BUDGET_ID",
        "-e",
        "ACTUAL_BUDGET_IDS",
        "-e",
        "ACTUAL_ENCRYPTION_PASSWORDS",
        "-e",
        "ACTUAL_BUDGET_WORKERS",
        "-e",
        "ACTUAL_WORKER_IDLE_MINUTES",
        "-e",
        "ACTUAL_WORKER_READY_SECONDS",
        "-e",
        "ACTUAL_READ_ONLY",
        "-e",
        "ACTUAL_TOOLSET",
        "-e",
        "ACTUAL_HTTP_TIMEOUT_MS",
        "-e",
        "ACTUAL_HTTP_PORT",
        "-e",
        "ACTUAL_HTTP_TOKEN",
        "-e",
        "ACTUAL_HTTP_WRITE_TOKEN",
        "-e",
        "ACTUAL_HTTP_HOST",
        "-e",
        "ACTUAL_HTTP_ALLOW_REMOTE",
        "-e",
        "ACTUAL_HTTP_ALLOWED_HOSTS",
        "ghcr.io/henfrydls/actual-budget-mcp:0.12.0"
      ]
    }
  }
}
```

This image reads ACTUAL_SERVER_URL, ACTUAL_PASSWORD, ACTUAL_SESSION_TOKEN, ACTUAL_BUDGET_ID, ACTUAL_BUDGET_IDS, ACTUAL_ENCRYPTION_PASSWORDS, ACTUAL_BUDGET_WORKERS, ACTUAL_WORKER_IDLE_MINUTES, ACTUAL_WORKER_READY_SECONDS, ACTUAL_READ_ONLY, ACTUAL_TOOLSET, ACTUAL_HTTP_TIMEOUT_MS, ACTUAL_HTTP_PORT, ACTUAL_HTTP_TOKEN, ACTUAL_HTTP_WRITE_TOKEN, ACTUAL_HTTP_HOST, ACTUAL_HTTP_ALLOW_REMOTE and ACTUAL_HTTP_ALLOWED_HOSTS. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Codex

```bash
codex mcp add henfrydls-actual-budget-mcp -- docker run --rm -i -e ACTUAL_SERVER_URL -e ACTUAL_PASSWORD -e ACTUAL_SESSION_TOKEN -e ACTUAL_BUDGET_ID -e ACTUAL_BUDGET_IDS -e ACTUAL_ENCRYPTION_PASSWORDS -e ACTUAL_BUDGET_WORKERS -e ACTUAL_WORKER_IDLE_MINUTES -e ACTUAL_WORKER_READY_SECONDS -e ACTUAL_READ_ONLY -e ACTUAL_TOOLSET -e ACTUAL_HTTP_TIMEOUT_MS -e ACTUAL_HTTP_PORT -e ACTUAL_HTTP_TOKEN -e ACTUAL_HTTP_WRITE_TOKEN -e ACTUAL_HTTP_HOST -e ACTUAL_HTTP_ALLOW_REMOTE -e ACTUAL_HTTP_ALLOWED_HOSTS ghcr.io/henfrydls/actual-budget-mcp:0.12.0
```

This image reads ACTUAL_SERVER_URL, ACTUAL_PASSWORD, ACTUAL_SESSION_TOKEN, ACTUAL_BUDGET_ID, ACTUAL_BUDGET_IDS, ACTUAL_ENCRYPTION_PASSWORDS, ACTUAL_BUDGET_WORKERS, ACTUAL_WORKER_IDLE_MINUTES, ACTUAL_WORKER_READY_SECONDS, ACTUAL_READ_ONLY, ACTUAL_TOOLSET, ACTUAL_HTTP_TIMEOUT_MS, ACTUAL_HTTP_PORT, ACTUAL_HTTP_TOKEN, ACTUAL_HTTP_WRITE_TOKEN, ACTUAL_HTTP_HOST, ACTUAL_HTTP_ALLOW_REMOTE and ACTUAL_HTTP_ALLOWED_HOSTS. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "henfrydls-actual-budget-mcp": {
      "type": "local",
      "command": [
        "docker",
        "run",
        "--rm",
        "-i",
        "-e",
        "ACTUAL_SERVER_URL",
        "-e",
        "ACTUAL_PASSWORD",
        "-e",
        "ACTUAL_SESSION_TOKEN",
        "-e",
        "ACTUAL_BUDGET_ID",
        "-e",
        "ACTUAL_BUDGET_IDS",
        "-e",
        "ACTUAL_ENCRYPTION_PASSWORDS",
        "-e",
        "ACTUAL_BUDGET_WORKERS",
        "-e",
        "ACTUAL_WORKER_IDLE_MINUTES",
        "-e",
        "ACTUAL_WORKER_READY_SECONDS",
        "-e",
        "ACTUAL_READ_ONLY",
        "-e",
        "ACTUAL_TOOLSET",
        "-e",
        "ACTUAL_HTTP_TIMEOUT_MS",
        "-e",
        "ACTUAL_HTTP_PORT",
        "-e",
        "ACTUAL_HTTP_TOKEN",
        "-e",
        "ACTUAL_HTTP_WRITE_TOKEN",
        "-e",
        "ACTUAL_HTTP_HOST",
        "-e",
        "ACTUAL_HTTP_ALLOW_REMOTE",
        "-e",
        "ACTUAL_HTTP_ALLOWED_HOSTS",
        "ghcr.io/henfrydls/actual-budget-mcp:0.12.0"
      ],
      "enabled": true
    }
  }
}
```

This image reads ACTUAL_SERVER_URL, ACTUAL_PASSWORD, ACTUAL_SESSION_TOKEN, ACTUAL_BUDGET_ID, ACTUAL_BUDGET_IDS, ACTUAL_ENCRYPTION_PASSWORDS, ACTUAL_BUDGET_WORKERS, ACTUAL_WORKER_IDLE_MINUTES, ACTUAL_WORKER_READY_SECONDS, ACTUAL_READ_ONLY, ACTUAL_TOOLSET, ACTUAL_HTTP_TIMEOUT_MS, ACTUAL_HTTP_PORT, ACTUAL_HTTP_TOKEN, ACTUAL_HTTP_WRITE_TOKEN, ACTUAL_HTTP_HOST, ACTUAL_HTTP_ALLOW_REMOTE and ACTUAL_HTTP_ALLOWED_HOSTS. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Hermes

```yaml
mcp_servers:
  henfrydls-actual-budget-mcp:
    command: "docker"
    args: ["run", "--rm", "-i", "-e", "ACTUAL_SERVER_URL", "-e", "ACTUAL_PASSWORD", "-e", "ACTUAL_SESSION_TOKEN", "-e", "ACTUAL_BUDGET_ID", "-e", "ACTUAL_BUDGET_IDS", "-e", "ACTUAL_ENCRYPTION_PASSWORDS", "-e", "ACTUAL_BUDGET_WORKERS", "-e", "ACTUAL_WORKER_IDLE_MINUTES", "-e", "ACTUAL_WORKER_READY_SECONDS", "-e", "ACTUAL_READ_ONLY", "-e", "ACTUAL_TOOLSET", "-e", "ACTUAL_HTTP_TIMEOUT_MS", "-e", "ACTUAL_HTTP_PORT", "-e", "ACTUAL_HTTP_TOKEN", "-e", "ACTUAL_HTTP_WRITE_TOKEN", "-e", "ACTUAL_HTTP_HOST", "-e", "ACTUAL_HTTP_ALLOW_REMOTE", "-e", "ACTUAL_HTTP_ALLOWED_HOSTS", "ghcr.io/henfrydls/actual-budget-mcp:0.12.0"]
```

This image reads ACTUAL_SERVER_URL, ACTUAL_PASSWORD, ACTUAL_SESSION_TOKEN, ACTUAL_BUDGET_ID, ACTUAL_BUDGET_IDS, ACTUAL_ENCRYPTION_PASSWORDS, ACTUAL_BUDGET_WORKERS, ACTUAL_WORKER_IDLE_MINUTES, ACTUAL_WORKER_READY_SECONDS, ACTUAL_READ_ONLY, ACTUAL_TOOLSET, ACTUAL_HTTP_TIMEOUT_MS, ACTUAL_HTTP_PORT, ACTUAL_HTTP_TOKEN, ACTUAL_HTTP_WRITE_TOKEN, ACTUAL_HTTP_HOST, ACTUAL_HTTP_ALLOW_REMOTE and ACTUAL_HTTP_ALLOWED_HOSTS. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Netclaw

```json
{
  "McpServers": {
    "henfrydls-actual-budget-mcp": {
      "Transport": "stdio",
      "Command": "docker",
      "Arguments": [
        "run",
        "--rm",
        "-i",
        "-e",
        "ACTUAL_SERVER_URL",
        "-e",
        "ACTUAL_PASSWORD",
        "-e",
        "ACTUAL_SESSION_TOKEN",
        "-e",
        "ACTUAL_BUDGET_ID",
        "-e",
        "ACTUAL_BUDGET_IDS",
        "-e",
        "ACTUAL_ENCRYPTION_PASSWORDS",
        "-e",
        "ACTUAL_BUDGET_WORKERS",
        "-e",
        "ACTUAL_WORKER_IDLE_MINUTES",
        "-e",
        "ACTUAL_WORKER_READY_SECONDS",
        "-e",
        "ACTUAL_READ_ONLY",
        "-e",
        "ACTUAL_TOOLSET",
        "-e",
        "ACTUAL_HTTP_TIMEOUT_MS",
        "-e",
        "ACTUAL_HTTP_PORT",
        "-e",
        "ACTUAL_HTTP_TOKEN",
        "-e",
        "ACTUAL_HTTP_WRITE_TOKEN",
        "-e",
        "ACTUAL_HTTP_HOST",
        "-e",
        "ACTUAL_HTTP_ALLOW_REMOTE",
        "-e",
        "ACTUAL_HTTP_ALLOWED_HOSTS",
        "ghcr.io/henfrydls/actual-budget-mcp:0.12.0"
      ]
    }
  }
}
```

This image reads ACTUAL_SERVER_URL, ACTUAL_PASSWORD, ACTUAL_SESSION_TOKEN, ACTUAL_BUDGET_ID, ACTUAL_BUDGET_IDS, ACTUAL_ENCRYPTION_PASSWORDS, ACTUAL_BUDGET_WORKERS, ACTUAL_WORKER_IDLE_MINUTES, ACTUAL_WORKER_READY_SECONDS, ACTUAL_READ_ONLY, ACTUAL_TOOLSET, ACTUAL_HTTP_TIMEOUT_MS, ACTUAL_HTTP_PORT, ACTUAL_HTTP_TOKEN, ACTUAL_HTTP_WRITE_TOKEN, ACTUAL_HTTP_HOST, ACTUAL_HTTP_ALLOW_REMOTE and ACTUAL_HTTP_ALLOWED_HOSTS. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Other

```json
{
  "mcpServers": {
    "henfrydls-actual-budget-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "ACTUAL_SERVER_URL",
        "-e",
        "ACTUAL_PASSWORD",
        "-e",
        "ACTUAL_SESSION_TOKEN",
        "-e",
        "ACTUAL_BUDGET_ID",
        "-e",
        "ACTUAL_BUDGET_IDS",
        "-e",
        "ACTUAL_ENCRYPTION_PASSWORDS",
        "-e",
        "ACTUAL_BUDGET_WORKERS",
        "-e",
        "ACTUAL_WORKER_IDLE_MINUTES",
        "-e",
        "ACTUAL_WORKER_READY_SECONDS",
        "-e",
        "ACTUAL_READ_ONLY",
        "-e",
        "ACTUAL_TOOLSET",
        "-e",
        "ACTUAL_HTTP_TIMEOUT_MS",
        "-e",
        "ACTUAL_HTTP_PORT",
        "-e",
        "ACTUAL_HTTP_TOKEN",
        "-e",
        "ACTUAL_HTTP_WRITE_TOKEN",
        "-e",
        "ACTUAL_HTTP_HOST",
        "-e",
        "ACTUAL_HTTP_ALLOW_REMOTE",
        "-e",
        "ACTUAL_HTTP_ALLOWED_HOSTS",
        "ghcr.io/henfrydls/actual-budget-mcp:0.12.0"
      ]
    }
  }
}
```

This image reads ACTUAL_SERVER_URL, ACTUAL_PASSWORD, ACTUAL_SESSION_TOKEN, ACTUAL_BUDGET_ID, ACTUAL_BUDGET_IDS, ACTUAL_ENCRYPTION_PASSWORDS, ACTUAL_BUDGET_WORKERS, ACTUAL_WORKER_IDLE_MINUTES, ACTUAL_WORKER_READY_SECONDS, ACTUAL_READ_ONLY, ACTUAL_TOOLSET, ACTUAL_HTTP_TIMEOUT_MS, ACTUAL_HTTP_PORT, ACTUAL_HTTP_TOKEN, ACTUAL_HTTP_WRITE_TOKEN, ACTUAL_HTTP_HOST, ACTUAL_HTTP_ALLOW_REMOTE and ACTUAL_HTTP_ALLOWED_HOSTS. Set them in your client's env block for this server; docker run -e passes each one through to the container.

## 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-11-05 (score 47, +1)

No change was recorded against any check on this day. Stability & Change Management went from 69 to 72.

### 2026-11-04 (score 46, −5)

- [security regression] Stability: fail → unverified
- [security regression] Tool safety: pass → unverified
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Schema quality: 100 → unverified
- [functional] Package version: 0.11.1 → 0.12.0

### 2026-11-02 (score 51, 0)

- [functional] Package version: 0.11.0 → 0.11.1

### 2026-10-29 (score 51, +1)

No change was recorded against any check on this day. Stability & Change Management went from 95 to 99.

### 2026-10-27 (score 50, +1)

No change was recorded against any check on this day. Stability & Change Management went from 89 to 92.

### 2026-10-25 (score 49, +1)

No change was recorded against any check on this day. Stability & Change Management went from 82 to 85.

### 2026-10-23 (score 48, +1)

No change was recorded against any check on this day. Stability & Change Management went from 75 to 79.

### 2026-10-22 (score 47, 0)

- [security regression] Tool safety: pass → unverified
- [security regression] Stability: fail → unverified
- [functional regression] Schema quality: 5001 → 5556
- [functional regression] Schema quality: 100 → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Capabilities: pass → unverified
- [functional] Package version: 0.10.9 → 0.11.0

## MCP tools (44)

### `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` (~385 tokens)

List transactions with optional filters. Returns date, payee, category, amount, notes, account, cleared status, and — for a part of a split — the note on the split it belongs to.

Input parameters:

- `account` (string): Account name or ID to filter by
- `category` (string): Category to filter by: a name, matched on any part of it, or a full category ID. For transactions with no category at all, use uncategorized instead.
- `end_date` (string): End date (YYYY-MM-DD or natural language). Defaults to today, or to every date when uncategorized or notes_contains is set.
- `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)
- `notes_contains` (string): Only transactions whose notes contain this text, case-insensitive. Also matches the note on the split a transaction belongs to, shown in the "Split of" column. Searches every date unless you give a r…
- `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 the start of the current month, or to every date when uncategorized or notes_contains is set.
- `uncategorized` (boolean): Only transactions with no category. Left out: split parents (their categories live on their parts), transfers between accounts on the same side of the budget (Actual clears those), and off-budget acc…

### `get_category_balance` (~138 tokens)

Get the balance and spending history for a specific category across a window of months, ending in the month you name or this month.

Input parameters:

- `category` (string, required): Category name or ID
- `month` (string): The month the window ends in (YYYY-MM or natural language). Defaults to this month. Use it to look at a past period: month "2026-06" with months 3 reads April, May and June.
- `months` (number): How many months the window covers. Defaults to 3, which is a default and not a limit: ask for 24 or 36 if that is what you want.

### `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` (~53 tokens)

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

Input parameters:

- `include_hidden` (boolean): List hidden categories too, and the ones whose group is hidden, each marked. Off by default.

### `get_payees` (~27 tokens)

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

### `get_schedules` (~45 tokens)

List the budget's schedules: what is due next, how much, from which account, and whether the last one posted. Read-only; creating and changing schedules is not here.

### `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` (~151 tokens)

Show spending trends for a category across a window of months, ending in the month you name or this month. Identifies increasing/decreasing patterns.

Input parameters:

- `category` (string): Category name or ID. If omitted, shows trends for top spending categories.
- `month` (string): The month the window ends in (YYYY-MM or natural language). Defaults to this month. Use it to look at a past period: month "2026-06" with months 3 reads April, May and June.
- `months` (number): How many months the window covers. Defaults to 6, which is a default and not a limit: ask for 24 or 36 if that is what you want.

### `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.

### `reconcile_account` (~186 tokens)

Compare an account against the balance a bank reports, and list what might explain the difference. Reads only; books nothing.

Input parameters:

- `account` (string, required): Account name or ID
- `as_of` (string): Date the bank figure is from (YYYY-MM-DD or "today"). Defaults to today. Transactions after this date are not counted in the balance.
- `balance_counts` (string): Which transactions the balance counts. "all" (default) counts uncleared rows too, which is right when uncleared means nobody ticked it off rather than the bank has not posted it. "cleared_only" count…
- `expected_balance` (number, required): Balance the bank reports for this account (human amount, e.g., 12345.67)
- `lookback_days` (number): How far back to look for candidates, in days. Defaults to 90.

### `get_rules` (~159 tokens)

List transaction rules with their conditions and actions. Returns the first 100 rules; pass offset for the next page, flagged_only for just the ones with a warning, or field to see only the rules that mention one field.

Input parameters:

- `field` (string): Only the rules that mention this field in a condition or an action, such as payee, amount or category.
- `flagged_only` (boolean): Only the rules carrying a warning, wherever they are in the list. These are the ones worth acting on.
- `limit` (integer): How many rules to list. 100 by default, which is about 16 KB of text.
- `offset` (integer): How many rules to skip, for reading the list a page at a time.

### `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` (~320 tokens)

Add a new transaction to an account. Use negative amounts for expenses, positive for income. If a transaction with the same account, date and amount already exists, this creates nothing and returns the existing one instead; pass allow_duplicate to go ahead anyway.

Input parameters:

- `account` (string, required): Account name or ID
- `allow_duplicate` (boolean): Create it even though a transaction with the same account, date and amount already exists. Without this, such a call returns the existing one and creates nothing.
- `amount` (number, required): Amount (negative for expenses, positive for income). Use human amounts like -150.50, not cents.
- `category` (string): Category name or ID. Giving one stops a payee that names an account from becoming a transfer, but only when both accounts are on budget. An empty string counts as no category.
- `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, or the name of one of your accounts to make a transfer. Naming an account moves money between accounts and creates the matching row there. Giving a category turns it into an ordinary purc…

### `create_transactions` (~179 tokens)

Create several transactions in one call. This is the way to record more than one: the rows are validated first and written together, so nothing is created unless every row is usable. Calling create_transaction many times in parallel is what this replaces. A row whose payee names one of your accounts becomes a transfer, the same way create_transaction treats it, so a month of records can be sent as one list.

Input parameters:

- `allow_duplicate` (boolean): Create the rows even though some repeat each other or match transactions already in the budget. Without this, such a batch is reported and nothing is written. The reply says which rows the checks fou…
- `transactions` (array, required): The transactions to create. All of them are written, or none.

### `create_split_transaction` (~183 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
- `allow_duplicate` (boolean): Create it even though a transaction with the same account, date and total already exists. The total is what a duplicate repeats; how it is divided is internal.
- `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` (~371 tokens)

Book an adjustment transaction to bring a multi-currency account to the balance the bank reports, clearing accumulated FX-rate residual. It compares against every transaction up to today, and the reply says how much of that figure is not marked cleared and what the adjustment would have been against the cleared rows alone, since a statement generally shows only what has posted. The date must be today or earlier. If a transaction with the same account, date and amount already exists this books nothing and reports it instead; run it again to recompute, or pass allow_duplicate if the match is unrelated. If the account holds transactions dated after today, it reports those and books nothing until future_rows says whether the balance you gave already counts them.

Input parameters:

- `account` (string, required): Account name or ID to reconcile
- `allow_duplicate` (boolean): Book the adjustment even though a transaction with the same account, date and amount already exists. Without this, such a call reports the existing one and books nothing.
- `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.
- `future_rows` (string): What the balance you gave does with transactions dated after today. "exclude" if the bank has not posted them, "include" if it has, which is usual for a card purchase the bank dates a day or two ahea…
- `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` (~167 tokens)

Set the budgeted amount for a category in a specific month, or add to it with mode: "delta".

Input parameters:

- `amount` (number, required): Human-readable amount, e.g., 5000.00. With mode "absolute" this is the new budgeted figure; with mode "delta" it is added to what is already there, and may be negative.
- `category` (string, required): Category name or ID
- `mode` (string): How to apply the amount. "absolute" (default) sets the budgeted figure. "delta" adds to it, which is what an ordinary adjustment is: putting more into an envelope rather than working out what the tot…
- `month` (string): Month (YYYY-MM or natural language). Defaults to current month.

### `transfer_between_categories` (~149 tokens)

Move budgeted money between categories, or between a category and the money that is not budgeted yet, for a month. Creates no transaction.

Input parameters:

- `amount` (number, required): Amount to move (human-readable, e.g., 125.50). Must be positive.
- `from` (string, required): Category to take the money from (name or ID), or "To Budget" for money that is not budgeted yet
- `month` (string): Month (YYYY-MM or natural language). Defaults to the current month.
- `to` (string, required): Category to give the money to (name or ID), or "To Budget" to return it to the money that is not budgeted yet

### `hold_for_next_month` (~141 tokens)

Hold some of a month's unassigned money so it carries into the next month, instead of assigning it now. Adds to whatever is already held; pass 0 to release it all. To give money to a category, or to take it back, use transfer_between_categories; this one assigns nothing, it only keeps what is left over from being assigned this month.

Input parameters:

- `amount` (number, required): How much to hold, added to what is already held (human-readable, e.g. 150.00). Pass 0 to release the whole hold.
- `month` (string): Month (YYYY-MM or natural language). Defaults to the current month.

### `set_category_carryover` (~131 tokens)

Turn a category's carryover on or off from a month onwards, so overspending rolls into that category next month instead of coming off the money to assign. Actual writes the flag into every month from the one given to the last the budget has, not only that one.

Input parameters:

- `category` (string, required): Category name or ID
- `enabled` (boolean, required): true to carry overspending forward in this category, false to stop
- `month` (string): Month this starts from, and every month after it in the budget is set too (YYYY-MM or natural language). Defaults to this 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` (~144 tokens)

Create a transfer between two accounts.

Input parameters:

- `allow_duplicate` (boolean): Create it even though a transfer between the same two accounts, on the same date, for the same amount already exists. Two identical transfers in one day are ordinary: a cash withdrawal split across t…
- `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.

### `update_account` (~44 tokens)

Rename an account. Transactions, balance and budget status are untouched.

Input parameters:

- `account` (string, required): Account name or ID to rename
- `name` (string, required): The new name

### `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` (~150 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. A group with categories in it also needs transfer_to, the category their transactions move to; an empty group does not.

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): Category name or ID to transfer the transactions of the deleted categories to. Required unless the group is empty.

### `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` (~602 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, payee_name, notes, account, amount, date, imported_payee, cleared, reconciled. Not category_group, which does nothing, and not transfer, parent or saved, which make eve…
- `action_value` (string|boolean|number, required): Value to set (category name/ID, payee name/ID, account name/ID, note text, an amount as you would say it, or true or false for cleared and reconciled). A payee, category or account must already exist…
- `condition_field` (string, required): Field to match: payee, payee_name, category, category_group, account, amount, notes, date, imported_payee, cleared, reconciled
- `condition_op` (string, required): Operator: is, isNot, oneOf, notOneOf, contains, doesNotContain, matches, gt, lt, gte, lte. oneOf and notOneOf take a list. contains, doesNotContain and matches are refused on payee, category, categor…
- `condition_value` (required): Value to match against. For payee, category, category_group and account, a whole name or an ID. For amount, the figure as you would say it (45.50, or -45.50 for money going out), not in cents. Spendi…
- `stage` (string|null): 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. The full working is on the page: https://verifymcp.io/servers/henfrydls-actual-budget-mcp/ghcr-io-henfrydls-actual-budget-mcp#diagnostics

## Score history

- 2026-11-05: 47
- 2026-11-04: 46
- 2026-11-03: 51
- 2026-11-02: 51
- 2026-11-01: 51
- 2026-10-31: 51
- 2026-10-30: 51
- 2026-10-29: 51
- 2026-10-28: 50
- 2026-10-27: 50
- 2026-10-26: 49
- 2026-10-25: 49
- 2026-10-24: 48
- 2026-10-23: 48
- 2026-10-22: 47
- 2026-10-21: 47
- 2026-10-20: 47
- 2026-10-19: 46
- 2026-10-18: 46
- 2026-10-17: 45
- 2026-10-16: 45
- 2026-10-15: 44
- 2026-10-14: 44
- 2026-10-13: 4
- 2026-10-12: 4
- 2026-10-10: 4
- 2026-10-06: 37
- 2026-10-04: 37
- 2026-10-03: 37
- 2026-10-02: 37

## 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. Actual Budget, carefully: deletes preview first, and new transactions check for duplicates. This page covers its container image (ghcr.io/henfrydls/actual-budget-mcp).

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

Actual Budget scores 47 out of 100 on VerifyMCP. 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 44 tools: list_accounts, get_budget_month, get_transactions, get_category_balance, get_budget_summary, and 39 more. Their descriptions and schemas cost roughly 5,372 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 5 November 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

- GitHub Container Registry: https://ghcr.io/henfrydls/actual-budget-mcp
- Website: https://actual-mcp.henfrydls.com/
- Changelog RSS feed: https://verifymcp.io/servers/henfrydls-actual-budget-mcp/ghcr-io-henfrydls-actual-budget-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/henfrydls-actual-budget-mcp/ghcr-io-henfrydls-actual-budget-mcp.json
- HTML version of this page: https://verifymcp.io/servers/henfrydls-actual-budget-mcp/ghcr-io-henfrydls-actual-budget-mcp
