MCP Actual
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PORT | No | HTTP port. | 3000 |
| DATA_DIR | No | Where the downloaded budget is cached. | ./data (/data in Docker) |
| ACTUAL_SYNC_ID | No | The budget's Sync ID: Actual → Settings → Advanced settings → "Sync ID". A UUID like a1b2c3d4-…. Required. | |
| ACTUAL_PASSWORD | No | The sync server's login password. Required. | |
| MCP_ACTUAL_TOKEN | No | Bearer token clients must send to /mcp. Required unless SECURE_LOCAL_NET=true. | |
| SECURE_LOCAL_NET | No | `true` runs with no auth at all (trusted networks only). Alternative to MCP_ACTUAL_TOKEN. | |
| ACTUAL_SERVER_URL | No | Base URL of the Actual sync server, scheme included, no trailing path (e.g. https://budget.example.com or http://192.168.1.50:5006). Required. | |
| ACTUAL_TIMEOUT_MS | No | Deadline for one Actual operation; bank sync gets its own, longer one. | 120000 |
| ACTUAL_ENABLE_WRITES | No | `false` serves only read-only tools; write tools are not advertised at all. | true |
| ACTUAL_ENCRYPTION_PASSWORD | No | Only if the budget has end-to-end encryption enabled. | |
| HTTP_KEEP_ALIVE_TIMEOUT_MS | No | How long an idle client connection is kept open. Above the 60 s nginx and ALB hold theirs; raise it behind a proxy that holds longer. `0` never closes one. | 75000 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_accountsA | List every account in the Actual Budget file with its current balance. Returns each account’s id, name, balance (in cents as |
| resolve_name_to_idA | Look up the id of an account, category, payee, or schedule by its exact name. Returns |
| list_categoriesA | List every budget category with its id, name, and containing group. Categories are addressed by id by the budgeting and rule tools, so this is usually the first call when working with either. Hidden categories are excluded unless |
| list_schedulesA | List Actual’s scheduled (recurring) transactions with their next due date and amount. Useful context when a budget or rule looks wrong: a category may be funded for a schedule that has not posted yet. |
| list_tagsA | List the tags defined in this budget. Rules can match tags in transaction notes ( |
| get_noteA | Read the note attached to an entity (transaction, account, category, …) by its id. Returns |
| sync_budgetA | Pull the latest changes from the Actual sync server. Read tools already sync where it matters, so reach for this after editing the budget in the Actual UI and wanting those edits reflected immediately. |
| update_noteA | Replace the note attached to an entity by its id. Notes are free text and overwrite wholesale — read the existing note first with |
| run_bank_syncA | Trigger Actual’s bank sync to pull new transactions from linked accounts, optionally for one account. Slow and rate-limited by the bank, so call it deliberately rather than before every read. Fails rather than reporting a hollow success when the account does not exist, is closed, or has no bank link. Returns the accounts it actually synced — Actual does not report how many transactions arrived, so follow up with |
| search_transactionsA | Search transactions across every account, filtered by any combination of date range, account, payee, category, note text, payee-name text, amount range, and cleared/reconciled state. Amounts are integer cents and negative means an outflow. Results are newest-first and capped by |
| get_transactionsA | List every transaction in one account between two dates, with no result cap. Use |
| update_transactionA | Change a transaction’s category, payee, notes, cleared flag, date, or amount. Only the fields you pass are touched; pass null to clear a category, payee, or note. Amounts are integer cents. Returns the transaction as stored afterwards — rules may rewrite a value on write, so trust the response over the request. The main tool for recategorizing during cleanup. |
| list_payeesA | List every payee. With |
| find_duplicate_payeesA | Group payees whose names differ only by case, punctuation, or a trailing store/reference number — |
| create_payeeA | Create a payee by name and return it with its new id. Check |
| update_payeeA | Rename a payee. Renaming is the only edit Actual’s public API exposes for payees — favorite and category-learning flags are not reachable. Renaming does not merge: to combine two payees, use |
| merge_payeesA | Merge one or more payees into a target payee: their transactions move to the target and the merged payees are removed. THIS CANNOT BE UNDONE — confirm the payees really are the same merchant before calling, and never merge a payee that has a |
| describe_rule_schemaA | Return the exact structure of an Actual rule: every condition field with the operators legal for it, the action operations, how values are typed, and worked examples. Call this BEFORE create_rule or update_rule — the condition format is a strict union and an invalid field/operator pairing is rejected. |
| list_rulesA | List the budget’s rules with their conditions and actions. Pass |
| create_ruleA | Create a rule from conditions and actions. Call |
| update_ruleA | Replace a rule’s conditions and actions. This overwrites the whole rule, so send the complete set — anything omitted is dropped, not preserved. Read the current rule with |
| preview_rule_effectsA | Run the budget’s rules over EXISTING transactions without saving anything, and report the field changes they would make. Actual applies rules on import and edit only, so transactions already in the budget are untouched until you act on them — this shows what a rule would have done to them. The usual flow is |
| apply_rule_actionsA | Apply rule actions to specific transactions and SAVE the result. This is the write half of |
| list_budget_monthsA | List every month the budget file covers, oldest first, as YYYY-MM. Use it to find the current or most recent month before reading or setting budget amounts. |
| get_budget_monthA | Read one month’s budget: totals (income, budgeted, spent, balance, and |
| set_budget_amountA | Set the amount budgeted to one category for one month, in integer cents. This replaces the existing amount rather than adding to it. Returns the category’s resulting budgeted/spent/balance figures so the effect is visible immediately. |
| set_budget_carryoverA | Turn rollover on or off for a category. With carryover on, an unspent balance rolls into the next month instead of returning to "to budget"; an overspend carries forward as a negative. IMPORTANT: this is not scoped to the one month. Actual applies the flag from the given month FORWARD to the end of the budget range, overwriting it on every later month — including ones set deliberately. The result reports only the month you named, so say what you changed rather than implying it was one month. |
| hold_for_next_monthA | Hold some of this month’s leftover "to budget" money back for next month, in integer cents.
This ADDS to whatever is already held for that month — it does not replace it, so calling twice with 1000 leaves 2000 held. To correct a hold, call |
| reset_budget_holdA | Release everything held back for next month, returning it to this month’s "to budget". Safe to call when nothing is held. Returns the resulting |
| list_category_groupsA | List the groups categories are filed under, with their ids and how many categories each holds. Use this to find the |
| create_category_groupA | Create an empty category group to file categories under, then fill it with |
| update_category_groupA | Rename a category group or hide/unhide it. Only the fields you pass are changed. Hiding a group hides every category in it, so |
| create_categoryA | Create a budget category inside an existing category group. Get the group id from |
| update_categoryA | Rename a category, move it to another group, or hide/unhide it. Only the fields you pass are changed. Hiding keeps history intact and is the safe alternative to deleting a category you no longer use. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| explore_budget | Start here. Orients you (and the agent) around what this Actual budget contains and which tools to reach for, with the conventions that make the rest of the tools behave — ids over names, integer cents, sync before reading, and where the write gate sits. |
| categorize_transactions | Find transactions with no category, group them by payee, and propose a category for each — then apply the ones I approve, and optionally write rules so they categorize themselves next time. |
| cleanup_payees | Review payees that look like the same merchant under different names (bank noise like "AMZN Mktp US*2H4" vs "Amazon") and merge them after confirmation. Groups the candidates, shows usage counts, and never merges without asking. |
| backfill_rule | Safely apply a categorization (or renaming) rule to transactions already in the budget: author the rule, preview what it would change, confirm, then apply. Use this instead of calling apply_rule_actions directly — it enforces the preview-then-confirm ordering those tools rely on. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 34 tools
Each tool targets a distinct resource+action, and the descriptions actively police boundaries (e.g., search_transactions is cross-account/filtered vs get_transactions exhaustive per-account; preview_rule_effects is read-only vs apply_rule_actions saves). list_categories/list_category_groups and list_payees/find_duplicate_payees are clearly separated by purpose. No two tools appear to do the same thing.
Strong, consistent verb_noun convention throughout (sync_budget, list_accounts, create_category, update_payee, merge_payees, create_rule, apply_rule_actions). A few deviate into noun/other phrasings (describe_rule_schema, find_duplicate_payees, hold_for_next_month, resolve_name_to_id), but they remain readable and predictable.
34 tools is heavy by the usual 3-15 guideline, sitting well into the 'too many' range. However, the domain is genuinely broad (accounts, categories, groups, payees, rules, transactions, budget months, notes), and each tool covers a distinct operation with little redundancy, making it borderline rather than bloated.
Coverage is thorough across budgeting, categories/groups, payees, rules, transactions, and notes, including lifecycle operations like create/update/merge. Gaps remain: no create/delete transaction and no account create/update (partly API limits noted in descriptions), but core read/cleanup/budgeting workflows are complete.