Skip to main content
Glama
marcoaperez

Actual Budget MCP Server

by marcoaperez

English | Español

Actual Budget MCP Server

An MCP (Model Context Protocol) server that connects LLMs — Claude Desktop and any MCP-capable client — to a self-hosted Actual Budget instance. It is purpose-built for LLM consumption: correct financial semantics (transfers excluded from spending summaries, net worth including off-budget accounts), amounts converted server-side so the model never does cents math, compact outputs, fresh data via sync-with-TTL, and real split transactions backed by subtransactions.

Feature highlights

The design rests on five pillars:

  • Correct financial semantics — transfers (transfer_id) are excluded from spending summaries so amounts are never double-counted, and net worth includes off-budget accounts (pensions, funds, mortgage).

  • Server-side unit conversion — Actual stores amounts in cents; every tool returns values already divided by 100, with an amount_formatted field. The LLM never does the math.

  • Compact, LLM-friendly outputs — responses are trimmed to what a model needs to answer, keeping token usage low.

  • Fresh data with sync-with-TTL — the server syncs with Actual before serving, caching the sync for a short TTL to stay fast without going stale.

  • Real split transactionssplit_transaction creates genuine subtransactions in Actual, not fake notes or workarounds.

Related MCP server: Lunch Money MCP Server

Requirements: a Mac with Apple Silicon (M1 or later), Claude Desktop, and a self-hosted Actual Budget server you can reach. On Intel Macs, Windows or Linux, use Manual installation instead.

  1. Download the latest actual-budget-mcp-es.mcpb from the Releases page.

  2. Find your Sync ID — open Actual Budget in the browser, go to SettingsAdvanced SettingsIDs, and copy the Sync ID.

  3. Install — in Claude Desktop, open Settings → Extensions, drag the downloaded .mcpb file onto the page, review what it declares, and select Install. Claude Desktop will note the extension is not signed — that's expected for a self-distributed bundle.

  4. Fill the form Claude Desktop shows:

    • Actual server URL — e.g. https://actual.example.org/

    • Server password — the one you use to open Actual in the browser (stored by Claude Desktop's secure storage, not in a config file)

    • Budget Sync ID — from step 2

    • Locale and Currency — e.g. es-ES and EUR; defaults are en-US and USD

    • Enable write tools — leave this off for now (see below)

    • Message languagees or en; defaults to es

  5. Check it works — start a new conversation and ask "what accounts do I have?". You should get your account list with balances.

Turning on write access

With the checkbox off you get the 11 read-only tools. Turn it on (Settings → Extensions → this extension → configure) to add the 18 write tools: editing and categorizing transactions, real splits, scheduled transactions, budget assignment, category notes, managing category groups/categories, payees/transfers and automation rules. Claude Desktop asks for your approval before each call unless you grant it standing permission. The classification tools (categories, category groups, rules, set_transaction_transfer) sync to the server after every write — the 8 write tools from earlier versions don't do this themselves, they rely on the next scheduled sync instead. The delete tools (delete_category, delete_category_group, delete_rule) require confirm_delete: true and default to archiving (hidden: true) as the non-destructive alternative.

Updating

Download the newer .mcpb and drag it in again — your configuration is kept.

If every tool fails after a Claude Desktop update

The bundle ships a native SQLite module (better-sqlite3) compiled for one specific Node ABI. Claude Desktop does not run extensions with the system's Node: it starts them inside its own Electron runtime, so the module has to match that runtime. When a Claude Desktop update changes it, the module can no longer be loaded and the extension cannot work.

The server detects this at startup and says so plainly: every tool answers with the two version numbers involved and tells you to install a newer bundle, instead of failing with a confusing message about the budget being closed.

Nothing on your side fixes this — the bundle has to be rebuilt for the new runtime. Get a newer release, or build one yourself with npm run bundle on a machine that has the updated Claude Desktop installed.

This affects the .mcpb bundle only. A manual installation runs under your own Node and is immune to it.

Manual installation

For other MCP clients, Intel Macs, Windows and Linux. Requires Node.js >= 22 and a self-hosted Actual Budget server (>= 25.x; built against API 26.7) reachable over the network.

The project is written in TypeScript, so build it before use:

git clone https://github.com/marcoaperez/actual-budget-mcp-es.git
cd actual-budget-mcp-es
npm install
npm run build          # compiles TypeScript to dist/

This produces dist/index.js, the entry point your MCP client runs.

Need your Sync ID? See step 2 of Install in Claude Desktop above.

Client configuration

Add this to your claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json), or the equivalent configuration file for your MCP client. Point command at node and args at the compiled dist/index.js using an absolute path:

{
  "mcpServers": {
    "actual-budget": {
      "command": "node",
      "args": ["/absolute/path/to/actual-budget-mcp-es/dist/index.js"],
      "env": {
        "ACTUAL_SERVER_URL": "https://actual.example.org/",
        "ACTUAL_SERVER_PASSWORD": "your-password",
        "ACTUAL_SYNC_ID": "00000000-0000-0000-0000-000000000000",
        "LOCALE": "es-ES",
        "CURRENCY": "EUR",
        "ENABLE_WRITE": "false"
      }
    }
  }
}

Use "LOCALE": "en-US" and "CURRENCY": "USD" for US formatting, or "es-ES" / "EUR" for Spain. Set "ENABLE_WRITE": "true" only when you want the write tools (see below). Restart Claude Desktop after saving so it detects the new MCP server.

During development you can skip the build and run TypeScript directly with tsx: "command": "npx", "args": ["tsx", "/absolute/path/to/actual-budget-mcp-es/src/index.ts"].

Environment variables

The first three variables are required; the rest have defaults.

Variable

Required

Default

Description

ACTUAL_SERVER_URL

Yes

URL of the self-hosted Actual server

ACTUAL_SERVER_PASSWORD

Yes

Actual server password

ACTUAL_SYNC_ID

Yes

Budget Sync ID (Settings → Advanced → Sync ID)

ACTUAL_DATA_DIR

No

./data

Folder where the local copy of the budget is downloaded

LOCALE

No

en-US

Locale for formatting amounts and dates (e.g. es-ES)

CURRENCY

No

USD

3-letter ISO currency code (e.g. EUR)

SYNC_TTL_SECONDS

No

60

Seconds the sync is cached before re-syncing

ENABLE_WRITE

No

false

Enables the 18 write tools (categorize, splits, schedules, budget, notes, category groups/categories, payees/transfers, rules)

MESSAGES_LANG

No

es

Language of the server's error messages: es or en

Tools

Read tools (11)

Always available.

Tool

Description

get_accounts

Accounts with current balance; includes off-budget accounts (pensions, funds, mortgage) by default

get_net_worth

Full net worth: on-budget + off-budget with a per-account breakdown

get_categories

Category groups and categories with their IDs (needed by the write tools)

get_payees

Payees with their IDs; a payee with transfer_account_id set is the payee Actual uses to represent that account in a transfer

get_account_transfer_payee

The payee that represents a specific account in a transfer — a shortcut over get_payees

get_transactions

Transactions by date range with optional filters (account, category, text, amount, uncategorized). Excludes transfers. Paginated (max 200)

get_spending_summary

Spending aggregated by category, payee or month. Always excludes transfers

get_budget_month

A month's budget state: to-budget, income, totals and budgeted/spent/balance per category

get_budget_averages

Mean, median and max spending per category over the last N full months — input for preparing the budget

get_schedules

Scheduled/recurring transactions configured in Actual (name, next date, amount)

get_rules

Automation rules with their IDs; rules run on imported transactions and are how recurring movements classify themselves

Write tools (18)

Registered only when ENABLE_WRITE=true.

Tool

Description

update_transaction

Fix a transaction (amount, category, payee, notes, date). category_id: null uncategorizes it; payee_id sets a known payee, payee_name resolves/creates one

categorize_transactions

Categorize in bulk (max 50), with a per-item result

split_transaction

Split a transaction into real parts, in place (same id)

create_transaction

Record an expense/income, with optional splits at creation

create_schedule

Create a scheduled/recurring transaction

set_budget

Assign budget in bulk to several categories of a month

transfer_budget

Move assigned budget between categories

update_category_note

Category notes and goal templates

Category groups and categories

Tool

Description

create_category_group

Create a new category group (the top-level buckets that hold categories)

update_category_group

Rename a category group or archive it (hidden: true) — the non-destructive alternative to delete_category_group

delete_category_group

Permanently delete a category group and every category inside it. Requires confirm_delete: true; if any of them have transactions, transfer_category_id is mandatory

create_category

Create a category inside an existing category group

update_category

Rename a category, move it to another group, or archive it (hidden: true) — the non-destructive alternative to delete_category

delete_category

Permanently delete a category. Requires confirm_delete: true; if it has transactions, transfer_category_id is mandatory

Payees and transfers

Tool

Description

set_transaction_transfer

Turn an ordinary transaction into a transfer with another account, by pointing it at that account's transfer payee. Actual creates and links the matching transaction on the other account

Rules

Tool

Description

create_rule

Create an automation rule: a condition (e.g. imported_payee contains "X" — use imported_payee, not payee, to match a payee the first time it is ever imported) plus an action (e.g. set category = id). Runs on future imports only, never retroactively. An action that sets payee to a transfer payee does not create a real transfer; follow up with set_transaction_transfer

update_rule

Replace an automation rule — Actual's API takes the whole object, so resend every field you want to keep

delete_rule

Delete an automation rule. Past transactions keep whatever it already applied; only future imports change

Notes on the write tools

  • They only appear when ENABLE_WRITE=true is set in the env block (restart the client after changing it).

  • Input amounts are in currency units (euros/dollars, not cents); the server handles the conversion.

  • split_transaction updates the transaction in place with its subtransactions — the id is unchanged.

  • The classification tools (categories, category groups, rules and set_transaction_transfer) sync to the server after every write — the 8 write tools from earlier versions don't, they rely on the next scheduled sync instead.

  • The delete tools (delete_category, delete_category_group, delete_rule) require confirm_delete: true; archiving (hidden: true, via update_category/update_category_group) is the non-destructive default and keeps history intact.

Safety

  • No transaction, account or budget-assignment delete tools — the server cannot remove those. The only delete tools are delete_category, delete_category_group and delete_rule; each requires confirm_delete: true, and archiving (hidden: true) is the non-destructive default.

  • Write disabled by default — write tools are never registered unless ENABLE_WRITE=true.

  • Split guards — the write tools guard against editing split parts or split parents directly.

  • Never commit your .env. The Actual password lives only in your local .env or the client config.

Three things worth knowing before you enable writes:

  • data/ holds a plain, unencrypted copy of your whole budget (created owner-only, mode 0700).

  • Payee names and notes come from bank sync or CSV imports: they are untrusted text, not instructions. Keep per-call approval on in your MCP client.

  • split_transaction updates the transaction in place — the id does not change.

  • Every MCP client you connect starts its own server process. Only one process can open a budget at a time, so extra instances automatically use their own local copy (<data dir>-instance-<pid>). In a manual installation you can set ACTUAL_DATA_DIR per client if you prefer to control it (the Claude Desktop bundle does not expose this setting).

The full security model — trust boundary, credentials, destructive operations, input validation and how to report a vulnerability — is documented in SECURITY.md.

Privacy Policy

This software collects nothing: no telemetry, no analytics, no update checks. It runs on your machine and talks only to your own Actual Budget server and to the MCP client you connect it to — which sees the financial data you ask about, under its own privacy policy. The local copy of your budget is unencrypted and lives only on your machine.

Full text: PRIVACY.md · en español

Development

npm test        # full suite with Vitest (325 tests)
npm run dev     # runs src/index.ts with tsx (no build)
npm run smoke   # manual check against the real Actual server (requires .env; not part of CI)

The server talks over stdio (stdin/stdout), so running it manually shows no interactive output — logs go to stderr.

Adding a new tool

  1. Create a file in src/tools/my_new_tool.ts

  2. Export a ToolDef (name, description, readOnly, inputSchema with Zod, handler)

  3. Import and register it in the allTools array of src/tools/index.ts

The handler(input, ctx) receives an initialized { api, config } context; use moneyFields/toUnits from src/core/money.js to always return amounts in units (never cents).

Releasing a bundle

The bundle is tied to Claude Desktop's Electron ABI. Extensions run inside Claude Desktop's own Electron, not the system's Node, so better-sqlite3 has to be compiled for that runtime. npm run bundle reads the Electron version out of the installed Claude.app, reinstalls the prebuilt binary for it, and then verifies what actually ships by dlopen-ing it with the packaging Node — which must fail, reporting Electron's ABI. If it loads, the Node-targeted binary slipped in and packaging aborts.

So: package on a machine running the Claude Desktop you are targeting, or pass ELECTRON_TARGET=x.y.z npm run bundle. Re-release whenever Claude Desktop bumps its Electron major — the previous bundle stops working for everyone on the new version.

  1. Bump version in package.json and manifest.json (a test enforces they match).

  2. npm test && npm run build && npm run bundle — the last line reports the Electron version and ABI the bundle was built for. Note it in the release description.

  3. Verify the bundle:

    npx mcpb validate manifest.json
    unzip -l build/actual-budget-mcp-es.mcpb | grep -E 'tests/|docs/|\.env' | grep -v 'node_modules/'  # expect no output
    unzip -l build/actual-budget-mcp-es.mcpb | grep -c 'better_sqlite3.node'  # expect at least 1

    npx mcpb info <file> (CLI 2.1.2) only prints file name, size and signature status — it does not check the manifest, so it's not a substitute for validate. The node_modules/ exclusion in the grep is there because vendored dependency files aren't the project's own code and legitimately contain paths like tests/ — don't remove it.

  4. Install build/actual-budget-mcp-es.mcpb locally and check it works.

  5. gh release create vX.Y.Z build/actual-budget-mcp-es.mcpb, noting in the release description that the bundle targets macOS on Apple Silicon.

License

MIT — see LICENSE. Copyright (c) 2026 Marco Antonio Pérez.

Available Tools

11 tools
get_accountsList accountsA
Read-only

List accounts with current balances. Off-budget accounts (pensions, funds, mortgage) included by default.

ParametersJSON Schema
NameRequiredDescriptionDefault
include_closedNoInclude closed accounts
include_off_budgetNoInclude off-budget accounts (pensions, funds, mortgage)

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already declares this is a safe read operation. The description adds useful context about the default inclusion of off-budget accounts, which is a meaningful behavioral detail beyond what annotations provide. It adds some value but doesn't describe return format or pagination, though for a list-accounts tool this is less critical.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with zero waste. The first states the core purpose, the second adds a key behavioral detail about defaults. Every word earns its place, and the description is immediately scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple filtered-list tool with 100% schema coverage, read-only annotations, and two parameter descriptions, the description is adequate. The default-behavior clarification about off-budget accounts is genuinely useful. It could mention return format or balance currency, but with no output schema, the agent's needs are reasonably met given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (include_closed, include_off_budget) are already documented with descriptions in the schema. The tool description itself only reiterates the off-budget default behavior already stated in the schema parameter description. The description adds minimal value over the schema's parameter documentation, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists accounts with current balances, using a specific verb ('List') plus resource ('accounts'). It distinguishes itself from siblings like get_transactions and get_categories by focusing on account listing with balance info. However, it doesn't explicitly differentiate from get_net_worth, which could also be about balances.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions off-budget accounts are included by default, which gives context on what the default behavior is. However, it doesn't provide explicit when-to-use guidance versus alternatives like get_net_worth, or explain when one might prefer to toggle include_off_budget or include_closed. The usage context is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_account_transfer_payeeGet account transfer payeeA
Read-only

The payee that represents an account in a transfer. Shortcut over get_payees for the common case; set_transaction_transfer resolves it on its own, so this is mainly for inspection.

ParametersJSON Schema
NameRequiredDescriptionDefault
account_idYesAccount UUID (from get_accounts)

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, and the description reinforces this by describing it as 'mainly for inspection' and noting set_transaction_transfer resolves independently. The description adds behavioral context (it's a convenience shortcut, not a necessary resolver) beyond what annotations provide. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero waste. Each sentence earns its place - the first defines the purpose, the second provides usage context and limitations. Exceptionally efficient for the information conveyed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only lookup tool with one well-documented parameter and full annotation coverage, the description is complete. It conveys purpose, usage context, and its relationship to sibling tools. No output schema exists, but for a simple payee-lookup tool the return value is reasonably inferable from the purpose statement.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% - the single parameter account_id is fully documented in the schema with its format, pattern, and description 'Account UUID (from get_accounts)'. The description doesn't add parameter semantics beyond this, but per the rubric the baseline of 3 applies since the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb+resource: 'The payee that represents an account in a transfer.' It precisely defines what the tool returns (a payee) and for what context (account in a transfer), distinguishing it from sibling get_payees. Very specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context of use: describes it as a 'shortcut over get_payees for the common case' and notes that set_transaction_transfer resolves it on its own, so it's 'mainly for inspection.' This gives clear when-to-use guidance, though it doesn't explicitly name an alternative to use instead of this tool beyond the sibling get_payees.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_budget_averagesGet category spending averagesA
Read-only

Per-category spending average, median and max over the last N complete months — input for budget preparation. Median resists anomalous months. Spending positive; transfers and income excluded.

ParametersJSON Schema
NameRequiredDescriptionDefault
months_backNoComplete months to analyze (running month excluded)

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safe-read nature is covered. The description adds exclusions ('transfers and income excluded') and clarifies positive spending, which enriches the data semantics. However, no details on return format, sorting, or how monthly incompleteness is handled beyond the schema note.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences convey purpose, statistical nuance (median rationale), and exclusions. Zero fluff; every clause earns its place. Perfectly front-loaded with the core action first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-param, read-only analytics tool with no output schema, the description is nearly complete: it names the metrics, the window, and the exclusions. Minor gap is no mention of whether incomplete current partial months are truly excluded on top of the running-month exclusion, but that is largely redundant with the schema description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and months_back is well documented (type, default 6, min 1, max 24, 'Complete months to analyze, running month excluded'). The description complements by framing the metric semantics (average/median/max) and adding the exclusion context ('transfers and income excluded'), adding value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb+resource+scope: 'per-category spending average, median and max over last N complete months.' Explicitly positioned as 'input for budget preparation.' Distinguishes from siblings like get_spending_summary by specifying per-category breakdown and multiple metrics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States it covers 'last N complete months' with the running month excluded (in schema). Median justification ('resists anomalous months') gives agent reasoning for use. Notes exclusions ('transfers and income excluded'). No explicit when-not or alternative naming, but the context is clear enough for a read-only analytics tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_budget_monthGet monthly budgetB
Read-only

Budget status for a month: to-budget, income, totals and per-category budgeted/spent/balance. Category ids included for set_budget.

ParametersJSON Schema
NameRequiredDescriptionDefault
monthYes
only_activeNoOnly categories with budgeted, spent or balance != 0

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safe-read profile is covered by structure. The description adds that category ids are exposed specifically for set_budget consumption, which is useful behavioral context beyond annotations. It doesn't describe response format or pagination, but this is a straightforward report tool with decent annotation coverage, so a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, compact and informative. The field enumeration is useful without being bloated. One minor inefficiency is that it could front-load the verb more strongly, but overall it's efficient and each clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a report-style tool with readOnlyHint annotation and only 2 parameters (one fully documented in schema), the description provides adequate coverage of what the tool returns. However, it lacks any mention of return value structure or how the month parameter format works, which would help given no output schema. It's functional but could be more complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50% — 'month' has a pattern but no semantic description, while 'only_active' has a description in the schema. The description names the fields the tool reports but doesn't explain the parameters beyond the schema. This is borderline; the description adds thematic context (what the report contains) but doesn't compensate for the undocumented 'month' parameter semantics beyond what the pattern implies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states what the tool does: it reports budget status for a month, enumerating specific data points (to-budget, income, totals, per-category budgeted/spent/balance). It distinguishes from siblings like get_budget_averages by being month-specific and including category ids. However, it doesn't explicitly name the alternative tools or clarify scope distinction beyond the mention of set_budget.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage (getting budget status for a month) but provides no explicit when-to-use vs alternatives guidance. The 'Category ids included for set_budget' note implies a downstream use, which is useful context. However, it doesn't clarify when to use this over get_budget_averages or get_spending_summary, or mention that it's read-only.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_categoriesList categoriesA
Read-only

Category groups and categories with their IDs (IDs are required by write tools).

ParametersJSON Schema
NameRequiredDescriptionDefault
include_notesNoInclude category notes (templates/goals)
include_hiddenNoInclude hidden categories

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds context beyond annotations by explaining the purpose of the IDs ('required by write tools'), which tells the agent these IDs are valuable for chaining into subsequent write operations. The scope (category groups AND categories) adds clarity about what's returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that conveys the resource, the verb, the output content, and a practical usage hint (IDs needed by write tools). Zero waste, every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a straightforward listing tool with readOnlyHint annotation and 100% schema coverage of its 2 optional parameters, the description is largely complete. It conveys the output (categories+groups+IDs) and the practical relevance of the output. No output schema exists, but the description adequately characterizes what's returned. Minor gap: doesn't describe pagination or ordering behavior, but acceptable for a simple listing tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both parameters (include_notes, include_hidden) fully documented in the schema. The description adds no extra detail about these parameters, but the schema already carries the full burden. Baseline 3 is appropriate since the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states this lists category groups and categories with their IDs, which is specific about the resource (categories) and the verb (list). It adds the valuable note that IDs are required by write tools. However, it doesn't explicitly distinguish from siblings like get_accounts or get_payees, though the resource name itself provides clear differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this is a read/reference tool since it notes IDs are required by write tools, suggesting it should be used before write operations. However, there's no explicit when-to-use guidance or exclusion of alternatives, and the sibling tools are clearly distinct resources so no specific alternative is named. The guidance is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_net_worthGet net worthA
Read-only

Full net worth: on-budget + off-budget (pensions, funds, mortgage) with per-account breakdown. Open accounts only.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint=true annotation already declares this as a safe read, so the bar is lower. The description adds meaningful context: it includes both on- and off-budget accounts, provides per-account breakdown, and specifies 'Open accounts only' - implying closed accounts are excluded. This is useful behavioral transparency beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence, front-loaded with the core purpose ('Full net worth') followed by the composures and constraints. Every word earns its place - no fluff, efficiently crams scope, breakdown granularity, and filtering into one sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a read-only summary tool with no parameters, no output schema required, and good annotations. The description covers scope (both budget types), granularity (per-account breakdown), and a key filtering constraint. It's complete for its complexity level - no obvious missing information an agent would need to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has 0 parameters and schema description coverage is 100%. With no parameters, there is nothing to document; the description's scope note ('Open accounts only') compensates well. Baseline 4 for 0-param tools is appropriate here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reports net worth covering both on-budget and off-budget accounts (pensions, funds, mortgage) with per-account breakdown. It distinguishes itself from sibling tools (get_accounts, get_spending_summary) by specifying composed financial scope. Very specific verb+resource+scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clarifies it covers both on- and off-budget categories, which helps distinguish from get_accounts etc. It notes 'Open accounts only,' which is an important filtering constraint. However, it doesn't explicitly name alternative tools or state when NOT to use it, though context makes the choice fairly clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_payeesList payeesA
Read-only

Payees with their IDs. A payee with transfer_account_id set is the payee Actual uses to represent that account in a transfer.

ParametersJSON Schema
NameRequiredDescriptionDefault
only_transfersNoOnly payees that represent an account (used to turn a transaction into a transfer)

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations include readOnlyHint=true, so the safety profile is covered. The description adds value by explaining the transfer_account_id concept and how payees relate to accounts in transfers, which is behavioral context beyond the annotation. However, it doesn't describe return format, ordering, pagination, or whether it returns all payees by default.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, no wasted words. The first sentence states the purpose, the second adds clarifying domain context about transfers. Appropriately sized for a simple list tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only listing tool with one optional boolean parameter and full schema coverage, the description is sufficient. It explains the key domain concept (transfer_account_id) that helps the agent understand both the output and the only_transfers parameter. The lack of output schema is acceptable for a simple listing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% including a clear description of only_transfers. The description adds minor value by explaining the underlying concept (transfer_account_id) that relates to the parameter's meaning. With full schema coverage, baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool lists payees with their IDs via 'Payees with their IDs.' The verb 'List' appears in the title and 'get' in the name. It adds useful context about payees having transfer_account_id, though it doesn't explicitly differentiate from siblings beyond the title 'List payees'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use or when-not-to-use guidance. The only parameter, only_transfers, is self-explanatory via schema. The description gives no context about when to use this vs get_account_transfer_payee or other siblings, though the sibling set makes it reasonably clear this is a listing operation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_rulesList rulesA
Read-only

Actual's automation rules, with their IDs. Rules run on imported transactions and are how recurring movements classify themselves. Amounts are in currency units.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, so the safety profile is already covered. The description adds useful context about what the returned data represents (automation rules with IDs, amounts in currency units) and the conceptual framing that rules classify recurring movements. With annotations handling the read-only safety, this description adds meaningful added value without contradicting anything.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences, each earning its place: what the tool returns, the broader value of rules, and the currency-unit clarification. No redundancy or filler. Front-loaded with the primary purpose immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter list tool with readOnlyHint annotation and no output schema, the description is largely complete. It communicates the domain, the return data shape (rules with IDs), and a currency detail. It could mention what fields/sections of a rule are returned (e.g., conditions, actions) or pagination, but for a list-returning read tool this is reasonably sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and schema coverage is effectively 100% (empty schema, nothing undocumented). The baseline for 0-parameter tools is 4, and the description appropriately doesn't waste space on parameter details that don't exist. The note that amounts are in currency units helps the agent interpret returned values, which is a small but useful semantic addition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists Actual's automation rules with their IDs. It also provides meaningful context by explaining what rules do (run on imported transactions, classify recurring movements) — this adds value beyond the bare tool name. It doesn't explicitly contrast with sibling tools, but the domain (automation rules) is distinct from accounts, categories, transactions, etc.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for viewing automation rules and understanding how recurring movements classify themselves, which gives some usage context. However, it doesn't explicitly state when to use this vs alternatives, nor are there exclusions or alternatives named. Among siblings, get_schedules and get_payees are somewhat adjacent (recurring/schedule-related), so some distinction guidance would help, but the unique domain is reasonably implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_schedulesList schedulesC
Read-only

Recurring schedules configured in Actual (name, next date, amount).

ParametersJSON Schema
NameRequiredDescriptionDefault
include_completedNo

TDQS

C2.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already declares this is a read-only operation, so the bar for behavioral disclosure is lower. The description adds that it returns name, next date, and amount fields for recurring schedules, providing useful context about what kind of list is returned. The include_completed parameter implies completed schedules exist, which is a behavioral nuance the description hints at but doesn't elaborate on. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single efficient sentence that front-loads the core purpose. Zero wasted words. The parenthetical enumerating returned fields (name, next date, amount) is value-add and compact. Not quite a 5 because it leaves the parameter semantics unanswered, but structurally clean.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with readOnlyHint and one optional parameter, the bar is moderate. The description covers the return content (name, next date, amount) but says nothing about the include_completed parameter, what completed schedules are, ordering, or pagination. With 0% schema coverage and the parameter left fully unexplained, the tool description leaves a real gap in agent understanding.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the schema provides NO explanation for the include_completed parameter. The description doesn't mention include_completed at all, meaning an agent would have to infer from the name that it controls whether finished schedules appear in results. Since coverage is low and the description fails to compensate, this scores below baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Recurring schedules configured in Actual (name, next date, amount)' states a clear verb-resource pair and gives the resource scope (schedules) plus key fields. However, it doesn't distinguish from siblings beyond being a natural extension of the get_* list family. The parenthetical fields add useful specificity, making the purpose clear, but there's no explicit differentiation from sibling list tools like get_net_worth or get_rules.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool vs alternatives is provided. With 10 sibling get_* tools, an agent gets no indication of when schedules (recurring future transactions) would be preferred over get_transactions or get_rules. There's implied context that this is for recurring schedules, but no explicit when/when-not statements or alternative tool references.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_spending_summarySummarize spendingB
Read-only

Aggregated spending by category, payee or month. Transfers always excluded. Spending amounts are positive; income negative. Sorted descending.

ParametersJSON Schema
NameRequiredDescriptionDefault
top_nNoReturn top N rows and roll the rest into "others"
end_dateYes
group_byNocategory
start_dateYes
include_incomeNo

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true is provided, so the safety profile is covered by annotations. The description adds useful behavioral context: transfers excluded, spending positive/income negative, sorted descending. However, it doesn't discuss pagination, date range semantics, or what happens with empty results. Given annotations exist, a 3 is reasonable for the added context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, all information-dense with zero filler. Covers aggregation, exclusions, sign conventions, and sort order in ~20 words. Exceptionally efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description should carry more weight for return format. It describes sign conventions and sort order (useful return semantics) but not the response structure, 'others' bucket behavior relation to top_n, or date range interpretation. For a summary tool with no output schema and 5 params at 20% coverage, there are gaps, though the description covers sign and sorting which is meaningful.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 20%, meaning most of the 5 parameters lack schema descriptions (top_n, include_income, group_by enum values may exist in schema but not described in detail). The description explains 'group_by' semantics implicitly (category/payee/month) and mentions income is negative, which relates to include_income. But top_n and include_income behavior aren't explained in the description to compensate for the low schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states it aggregates spending by category, payee, or month. Clearly a read/summary tool. Distinguishes from siblings like get_transactions (list) and get_net_worth (balance) via the aggregation language. Not quite a 5 because it doesn't explicitly name what it contrasts with, but purpose is specific and clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions grouping dimensions and the exclusion of transfers, which gives some usage context. However, it doesn't explicitly state when to use this vs get_budget_month, get_transactions, or get_budget_averages. The implied context (aggregate spending summaries) is present but there's no explicit when/when-not guidance with alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_transactionsSearch transactionsA
Read-only

Search transactions by date range with optional filters (account, category, text, amount range, uncategorized). Transfers excluded by default. Paginated (max 200).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
end_dateYesEnd date YYYY-MM-DD
account_idNo
max_amountNo
min_amountNoUnits, e.g. -500
start_dateYesStart date YYYY-MM-DD
category_idNo
search_textNoSubstring match on payee name or notes
uncategorizedNo
include_transfersNo

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotation already declares readOnlyHint=true, so the safety profile is covered. The description adds useful context: transfers excluded by default, pagination capped at 200. However, it doesn't disclose the return format, whether results are ordered, or what the total count semantics are for offset/limit. With readOnlyHint present, baseline 3 is fair; it adds some value over annotations but not deep behavioral detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero waste. Every clause carries meaning: the filter list, the transfer default, and the pagination cap all add value. Well front-loaded with the core search purpose first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter search tool with no output schema and only 36% schema coverage, the description gives a solid high-level frame: filters available, transfer default, pagination cap. It doesn't explain result ordering or the relationship between offset/limit and any total-count concept, which would be helpful given no output schema. Slight gap, but the search semantics are reasonably complete for a list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 36%, so the description partially compensates by listing the filter categories. However, it doesn't add detail beyond the schema for ambiguous params like min_amount ('Units, e.g. -500' in schema) vs max_amount (no description in schema). It confirms search_text matches payee/notes and pagination limit, but doesn't resolve all gaps left by the 36% coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb (Search) with a clear resource (transactions) and lists concrete filters (account, category, text, amount range, uncategorized). It also states two distinguishing traits: transfers excluded by default and pagination limit of 200. This clearly differentiates it from sibling read tools like get_spending_summary or get_net_worth.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states the search scope (date range with optional filters) and that transfers are excluded by default. It mentions the pagination max of 200. It doesn't explicitly name alternative tools or when-not contexts, but the read-only nature and filter set give a clear usage context. Could name a sibling like get_spending_summary as an alternative for aggregated data.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 11 tool updatesv2.2.0
    • First observedget_account_transfer_payee
    • First observedget_accounts
    • First observedget_budget_averages
    • First observedget_budget_month
    • First observedget_categories
    • First observedget_net_worth
    • First observedget_payees
    • First observedget_rules
    • First observedget_schedules
    • First observedget_spending_summary
    • First observedget_transactions

TDQS

A3.7/5.0

Scored across 11 tools

Disambiguation5/5

Every tool targets a distinct concept in the Actual budget domain: accounts, net worth, categories, transactions, spending summaries, budget month, budget averages, schedules, payees, and rules. There is slight conceptual proximity between get_spending_summary and get_budget_averages (both return spending data), and between get_payees and get_account_transfer_payee, but descriptions clearly differentiate their purposes. No tool appears to do the same thing as another.

Naming Consistency5/5

All eleven tools follow a consistent 'get_<noun(s)>' verb_noun pattern: get_accounts, get_categories, get_transactions, get_spending_summary, get_budget_month, get_budget_averages, get_schedules, get_payees, get_rules, get_net_worth, get_account_transfer_payee. The naming convention is uniform and predictable throughout.

Tool Count5/5

With 11 tools, this is a well-scoped set squarely in the optimal range. Each tool addresses a distinct read-only query a user would reasonably make about their Actual budget, and none feels redundant or trivial. The count is appropriate for the server's apparent purpose of budget querying.

Completeness3/5

The server is entirely read-only, covering queries well but offering no write operations (no 'create', 'update', 'delete' tools). Notably, the descriptions reference write tools (set_budget, set_transaction_transfer) that are not present in this set. While the domain is comprehensive on the read side, the absence of any mutation tools leaves the surface partially gap-laden if the intent is full budget management.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to interact with Actual Budget for personal finance management through natural language, supporting transactions, account balances, budget tracking, spending analysis, and payment searches.
    420
    1
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    Enables AI agents to interact with your Lunch Money personal finance data, providing tools for managing transactions, categories, budgets, assets, and accounts.
    15
    17
    ISC
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI assistants to interact with YNAB budgets, performing read-only queries by default and optional write operations like creating transactions and managing categories through natural language.
    38
    146
    30
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    Bridges AI/LLM applications to Actual Budget, exposing budget data as MCP tools for account listing, transactions, and budget balances.
    4
    -