Skip to main content
Glama
henfrydls

actual-budget-mcp

actual-budget-mcp

npm version License: MIT Node.js Glama score Listed on mcpservers.org

Talk to your budget. An MCP server that connects Actual Budget to Claude. Ask where the money went, get real analysis back, and let it write without holding your breath.

Listed in the official Actual Budget community projects.

Asking a budget where the money went, and a delete that stops to ask for confirmation

Features

  • Real analysis, not just lookups - Projections, category trends, budget vs actual, and month summaries

  • Writes you can trust - Every delete previews what it will remove and waits for you to confirm; ACTUAL_READ_ONLY=1 hides the write tools from the model entirely (Safety)

  • Multi-currency that survives reality - Splits and residual reconciliation, not just a currency symbol

  • Recovers from an out-of-sync budget - repair_sync rebuilds the local sync state when @actual-app/api and your server disagree, the failure that otherwise leaves every tool erroring

  • Ask about your budget in plain language - "How much did I spend on food this month?" or "Am I over budget on anything?"

  • Create and manage transactions - Add expenses, transfers, and edits without opening the app

  • Manage categories, payees, and rules - Full CRUD without opening the app

  • Use names, not IDs - Say "Cartera" instead of a1b2c3d4-..., with helpful suggestions if ambiguous

  • Natural dates in English and Spanish - "last month", "este mes", "hace 3 meses", "yesterday"

  • Clean formatted output - Aligned tables and clear summaries, not raw JSON

  • Clear error messages - If something's wrong, you'll know exactly what to fix

Related MCP server: actual-mcp-server

Does it work with local models?

Yes. This is an MCP server, so it works with any client that speaks MCP, and the model behind that client is the client's business, not this server's. Claude Desktop, Claude Code, Cursor and VS Code are the ones documented below because they are the ones people ask about, but anything that can run an MCP client, including a local setup pointed at Ollama or LM Studio, talks to it the same way.

Your budget data goes to whatever model your client uses. If that matters to you, and for a lot of people running Actual it does, a local model keeps it on your machine.

Prerequisites

  • Actual Budget server running (local or remote)

  • Node.js 22 or higher (see Node.js requirement). The Desktop Extension below still needs Node present, but never compiles anything: it carries a prebuilt SQLite binary for every Node version it supports.

Quick Start

On Claude Desktop, the shortest path is the extension: no config file to edit and no command to run. Otherwise, copy this into Claude Code or Claude Desktop:

Install the actual-budget-mcp MCP server from npm (https://github.com/henfrydls/actual-budget-mcp).
Configure it with these credentials:
    - My Actual Budget server: http://localhost:5006
    - Password: YOUR_PASSWORD
    - Budget ID: YOUR_BUDGET_ID

Claude will configure everything for you.

Installation

Option 1: Claude Desktop extension (no config files)

A packaged Desktop Extension is available: install it and Claude Desktop asks for your server URL, password and Sync ID in its own settings UI, with the password and session token stored in your operating system's keychain rather than a config file you have to edit.

Download actual-budget-mcp.mcpb, then open Claude Desktop, go to Settings > Extensions, and drag the file onto that screen.

On Windows, dragging is the way in: double-clicking the file opens Windows' "select an app to open this file" dialogue instead, because Claude Desktop does not register the .mcpb file type. Verified on a clean Windows 11 install with Claude Desktop 0.14.10.

The extension carries everything it needs, so the first question you ask is answered straight away rather than after an install you cannot see. It is a large download, once, with a progress bar.

Earlier builds launched the package from npm instead. That made the download small and moved it to the first run, where nothing showed progress: Claude Desktop waited, decided the server was dead and said it could not connect, and the extension started working on its own a few minutes later. The bundle now includes Actual's SQLite binary for every platform and Node version it supports, and picks the right one when it starts.

Updating the extension

Installing a new version over an old one keeps the settings you filled in, with one exception seen in practice: the saved server password was cleared when a field's title changed between versions. If Claude cannot connect after an update, open the extension's settings and check the password field before looking anywhere else.

Option 2: Claude Code (one command)

claude mcp add actual-budget-mcp -e ACTUAL_SERVER_URL=http://localhost:5006 -e ACTUAL_PASSWORD=your-password -e ACTUAL_BUDGET_ID=your-budget-id -- npx -y actual-budget-mcp

Option 3: Claude Desktop (edit the config file)

Add this to your claude_desktop_config.json:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "actual-budget-mcp": {
      "command": "npx",
      "args": ["-y", "actual-budget-mcp"],
      "env": {
        "ACTUAL_SERVER_URL": "http://localhost:5006",
        "ACTUAL_PASSWORD": "your-password",
        "ACTUAL_BUDGET_ID": "your-budget-sync-id"
      }
    }
  }
}

Option 4: Cursor

Go to Cursor Settings > MCP > Add new MCP server and add:

{
  "mcpServers": {
    "actual-budget-mcp": {
      "command": "npx",
      "args": ["-y", "actual-budget-mcp"],
      "env": {
        "ACTUAL_SERVER_URL": "http://localhost:5006",
        "ACTUAL_PASSWORD": "your-password",
        "ACTUAL_BUDGET_ID": "your-budget-sync-id"
      }
    }
  }
}

Option 5: VS Code (GitHub Copilot)

Add this to your VS Code settings.json:

{
  "mcp": {
    "servers": {
      "actual-budget-mcp": {
        "command": "npx",
        "args": ["-y", "actual-budget-mcp"],
        "env": {
          "ACTUAL_SERVER_URL": "http://localhost:5006",
          "ACTUAL_PASSWORD": "your-password",
          "ACTUAL_BUDGET_ID": "your-budget-sync-id"
        }
      }
    }
  }
}

Option 6: Docker

The image speaks stdio like every other option, so your client starts the container and owns its lifetime:

{
  "mcpServers": {
    "actual-budget-mcp": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "--add-host=host.docker.internal:host-gateway",
        "-v", "actual-budget-mcp-data:/data",
        "-e", "ACTUAL_SERVER_URL",
        "-e", "ACTUAL_PASSWORD",
        "-e", "ACTUAL_BUDGET_ID",
        "ghcr.io/henfrydls/actual-budget-mcp:latest"
      ],
      "env": {
        "ACTUAL_SERVER_URL": "http://host.docker.internal:5006",
        "ACTUAL_PASSWORD": "your-password",
        "ACTUAL_BUDGET_ID": "your-budget-sync-id"
      }
    }
  }
}

Two things that bite everyone once:

  • Inside the container, localhost is the container. Your Actual server is not there. host.docker.internal (with the --add-host flag above, which is what makes it resolve on Linux) reaches the host instead.

  • Mount /data. That is the budget cache. Without a volume, every start re-downloads your entire budget from the server.

Option 7: From source (for contributors)

git clone https://github.com/henfrydls/actual-budget-mcp.git
cd actual-budget-mcp
npm install
cp .env.example .env   # Edit with your credentials
npm run build
npm run test:connection # Verify it works

Verify your setup

--verify reads the environment of the shell you run it in, and the install options above put your credentials in your MCP client's configuration instead. So set them for the command:

ACTUAL_SERVER_URL=http://localhost:5006 \
ACTUAL_PASSWORD=your-password \
ACTUAL_BUDGET_ID=your-sync-id \
npx -y actual-budget-mcp --verify

It connects, downloads the budget and prints how many accounts and category groups it found. Running it without those variables reports them as missing, which is about the command, not about your install.

After changing your client's configuration, restart the client. Claude Desktop, Claude Code and the rest read MCP configuration at startup and will not pick up an edit until they are restarted.

Configuration

Variable

Required

Description

ACTUAL_SERVER_URL

Yes

Your Actual Budget server URL. See Which URL and port

ACTUAL_PASSWORD

Yes*

Server password (set in Actual Budget under Settings). *Not needed if you use ACTUAL_SESSION_TOKEN

ACTUAL_SESSION_TOKEN

No

For servers behind OIDC, which have no password. Use this instead of ACTUAL_PASSWORD; if both are set, the token wins

ACTUAL_BUDGET_ID

Yes

Budget Sync ID (found in Settings > Show advanced settings)

ACTUAL_ENCRYPTION_PASSWORD

No

Only if your budget file is encrypted

ACTUAL_DATA_DIR

No

Where the budget cache lives. Defaults to your OS data directory (see below)

ACTUAL_READ_ONLY

No

Set to 1/true/yes to run read-only. See Safety

Using a session token (OIDC servers)

If your Actual server signs you in through OIDC, there is no password to put in ACTUAL_PASSWORD, because the server issues a session token instead. Set ACTUAL_SESSION_TOKEN to that token and leave the password unset.

To find it, in the browser where you are signed in to Actual:

  1. Open your browser's developer tools

  2. Go to Application (Chrome/Edge) or Storage (Firefox)

  3. Expand IndexedDB → the actual database → the asyncStorage store

  4. Copy the value of the key user-token

It is stored in IndexedDB, not Local Storage, so looking there is why people often cannot find it.

Treat the token like a password: it grants the same access. It also expires; if it does, the server says so and tells you to issue a new one, rather than blaming a password you do not have.

Which URL and port

It depends on how you run Actual, and picking the wrong one gives a connection error that does not explain itself:

How you run Actual

URL

Self-hosted sync server (Docker, a VPS, etc.)

http://localhost:5006, or wherever you host it

The desktop app

http://localhost:5007

The desktop app runs its own sync server on port 5007, and only while the app is open. Close the app and nothing is listening, so the server cannot connect.

That embedded server also binds to 127.0.0.1 only. It is reachable from the same machine and from nowhere else, so if Claude runs somewhere other than the machine with the app, for example another computer or a virtual machine, you need an SSH tunnel or a port forward. Pointing at the host's LAN address will not work.

Where the cache is kept

Unless you set ACTUAL_DATA_DIR, the budget cache goes to the standard data directory for your system:

OS

Default location

Linux

$XDG_DATA_HOME/actual-budget-mcp, or ~/.local/share/actual-budget-mcp

macOS

~/Library/Application Support/actual-budget-mcp

Windows

%APPDATA%\actual-budget-mcp

It is a cache, not your data: deleting it only forces a fresh download on the next run. It lives outside the temp directory on purpose, so a reboot does not throw it away and make the next startup re-download your whole budget.

Finding your Budget ID

  1. Open Actual Budget

  2. Open Settings: click the arrow next to your budget name, or use the sidebar, More, then Settings

  3. Click Show advanced settings

  4. Copy the Sync ID

Take the Sync ID, not the Budget ID. Actual shows both, one under the other, and they are both UUIDs. ACTUAL_BUDGET_ID wants the one labelled Sync ID, despite the name of the variable. Using the other one gives you Budget "..." not found on the server, which reads as though you mistyped it when the value was simply the wrong field.

If Sync ID shows (none), that budget has never been synced to a server. This server talks to Actual through its sync server, so a local-only budget cannot be used until you sync it.

Privacy Policy

Data collection. This server collects nothing. It has no telemetry, no analytics and no usage reporting, and none is planned: it reads personal finances, and a tool that does that should not be phoning home. There is no account to create and nothing to opt out of.

Usage and storage. The server talks to one place: the Actual Budget server whose URL you configure. Your budget is cached on your own machine, in the data directory documented under Where the cache is kept, so that it does not have to be downloaded on every start. Nothing is written anywhere else.

Your credentials are handled by your MCP client, not by this server. Claude Desktop stores the password and session token in your operating system's keychain; the server receives them as environment variables at launch, uses them to connect, and never writes them to disk.

Third-party sharing. None. No data is sent to the author, to any analytics service, or to any third party. The only network connection the server opens is to your own Actual server.

Two things worth naming because they are also true: the model you are talking to (Claude, or whichever client you use) necessarily sees the budget data you ask about, under that provider's own terms; and installing via npx downloads the package from npm, which is an ordinary package download and involves no budget data.

Data retention. The cache lives on your machine until you delete it. Deleting it loses nothing, since it is a copy of what is on your Actual server; the next run downloads it again. Uninstalling the server leaves nothing behind except that directory, which you can remove.

Contact. Open an issue at https://github.com/henfrydls/actual-budget-mcp/issues. The full policy is also published at https://actual-mcp.henfrydls.com/privacy/.

Safety

Two things protect your budget from an agent acting on a vague instruction.

Deletes preview before they delete

Every delete tool refuses to destroy anything on the first call. It reports what would be lost and stops there. Deleting takes a second, deliberate call:

delete_category(category: "Groceries")
  → preview: transactions affected, budget and rollover warning. Nothing deleted.

delete_category(category: "Groceries", confirm: true, confirm_name: "Groceries")
  → deleted

Tools that find their target by name (delete_account, delete_category, delete_category_group, delete_payee) also require confirm_name with the exact name. That is where deleting the wrong thing actually happens: asking for "Adicionales" can resolve to "Ingresos Adicionales". Tools that take an exact id (delete_transaction, delete_rule) need only confirm: true.

Read-only mode

Set ACTUAL_READ_ONLY=1 and the server exposes only the 15 read, analysis and repair tools. The write tools are not registered at all, so they never appear in tool discovery, and an agent cannot be talked into calling something it cannot see.

repair_sync stays available on purpose: it repairs sync state rather than budget data, and hiding it would leave a desynced budget with no way to recover.

Writes are enabled by default. Read-only is opt-in.

Tools (37)

Read (9)

Tool

Description

Example prompt

list_accounts

All accounts with balances

"Show me all my accounts"

get_budget_month

Budget for a specific month

"What does my March budget look like?"

get_transactions

Transactions with filters

"Show me transactions from last week over 5000"

get_category_balance

Category history across months

"How has my food spending changed?"

get_budget_summary

Executive budget overview

"Give me a budget summary for February"

get_categories

All category groups and categories

"What categories do I have?"

get_payees

All payees in the budget

"List all my payees"

get_rules

All transaction rules

"Show me my rules"

balance_history

Account balance over time

"Show balance history for my checking account"

get_budget_month - month (optional): YYYY-MM or natural language ("this month", "last month", "enero 2025")

get_transactions - account (optional): account name | start_date / end_date (optional): YYYY-MM-DD or natural language | category (optional): category name | payee (optional): payee name | min_amount / max_amount (optional): filter by amount | limit (optional, default 50)

get_category_balance - category (required): category name or ID | months (optional, default 3): months to look back

get_budget_summary - month (optional): YYYY-MM or natural language

balance_history - account (required): account name or ID | start_date (optional, default 3 months ago) | end_date (optional, default today)

Analysis (5)

Tool

Description

Example prompt

budget_vs_actual

Budgeted vs spent per category

"Am I over budget on anything this month?"

spending_projection

End-of-month spending forecast

"Will I stay within budget this month?"

category_trends

Spending trends over time

"What are my spending trends for the last 6 months?"

spending_by_category

Spending breakdown by category

"Show me spending by category for February"

monthly_summary

Income vs expenses vs savings

"How have my finances been the last 3 months?"

budget_vs_actual - month (optional): YYYY-MM or natural language | group (optional): filter by category group

spending_projection - month (optional): YYYY-MM or natural language

category_trends - category (optional): specific category or top spending if omitted | months (optional, default 6)

spending_by_category - start_date / end_date (optional): date range | include_income (optional, default false) | limit (optional, default 20)

monthly_summary - months (optional, default 3): number of months to show

Write: Transactions (9)

Tool

Description

Example prompt

create_transaction

Add a new transaction

"I spent 500 on groceries from Cartera today"

create_split_transaction

One charge across several categories

"Split that 3,000 charge: 2,000 groceries, 1,000 household"

update_transaction

Edit an existing transaction

"Change the amount on that transaction to 600"

delete_transaction

Remove a transaction (previews first, see Safety)

"Delete that test transaction"

update_budget_amount

Change a budget amount

"Set my food budget to 15,000 for this month"

recategorize_transaction

Move to another category

"Move that transaction to Entertainment"

create_transfer

Transfer between accounts

"Transfer 10,000 from Checking to Savings"

reconcile_currency_residual

Clear accumulated FX-rate residual

"Reconcile my USD card to 213.82 USD"

run_bank_sync

Sync with linked banks

"Sync my bank transactions"

create_transaction - account (required): account name | amount (required): negative for expenses, positive for income | payee (optional) | category (optional) | date (optional) | notes (optional) | cleared (optional)

update_transaction - transaction_id (required) | amount, payee, category, date, notes, cleared (all optional)

delete_transaction - transaction_id (required)

update_budget_amount - category (required) | amount (required) | month (optional)

recategorize_transaction - transaction_id (required) | category (required)

create_transfer - from_account (required) | to_account (required) | amount (required) | date (optional) | notes (optional)

create_split_transaction - account (required) | amount (required): total, must equal the sum of the splits | splits (required): two or more {category, amount, notes} | payee, date, notes, cleared (all optional)

reconcile_currency_residual - account (required) | category (required): where to book the adjustment | target_balance (optional, defaults to 0) | payee, date, notes (all optional)

run_bank_sync - account (optional): sync specific account or all if omitted

Write: Categories (6)

Tool

Description

Example prompt

create_category

Create a new category

"Create a category called Gym in Gastos Variables"

update_category

Rename or hide a category

"Rename Gym to Fitness"

delete_category

Delete a category (previews first, see Safety)

"Delete the Fitness category"

create_category_group

Create a new group

"Create a category group called Health"

update_category_group

Rename or hide a group

"Rename the Health group to Wellness"

delete_category_group

Delete a group (previews first, see Safety)

"Delete the Wellness group"

create_category - name (required) | group (required): group name or ID

update_category - category (required): name or ID | name (optional): new name | hidden (optional): true/false

delete_category - category (required) | transfer_to (optional): category to move transactions to | confirm + confirm_name (required to delete)

create_category_group - name (required)

update_category_group - group (required): name or ID | name (optional): new name | hidden (optional): true/false

delete_category_group - group (required) | transfer_to (required): category for orphaned transactions | confirm + confirm_name (required to delete)

Write: Payees & Rules (5)

Tool

Description

Example prompt

create_payee

Create a new payee

"Create a payee called Netflix"

update_payee

Rename a payee

"Rename Netflix to Netflix Premium"

delete_payee

Delete a payee (previews first, see Safety)

"Delete the Netflix Premium payee"

create_rule

Create a transaction rule

"Create a rule: when payee contains Amazon, set category to Shopping"

delete_rule

Delete a rule (previews first, see Safety)

"Delete that rule"

create_payee - name (required)

update_payee - payee (required): name or ID | name (required): new name

delete_payee - payee (required): name or ID | confirm + confirm_name (required to delete)

create_rule - condition_field (required): payee, category, amount, notes | condition_op (required): is, contains, oneOf, gt, lt, etc. | condition_value (required) | action_field (required): category, payee, notes | action_value (required) | stage (optional)

delete_rule - rule_id (required) | confirm (required to delete)

Write: Accounts (2)

Tool

Description

Example prompt

create_account

Create an on- or off-budget account

"Create an off-budget account called Family Investment with 10,000"

delete_account

Delete an account and its history

"Delete the ZZ Test account"

delete_account needs two keys. It destroys the account's entire transaction history, so a single call never deletes. The first call only previews what would be lost (name, balance, transaction count) and suggests closing the account instead, since closing retires it while keeping its history. To actually delete, call again with confirm: true and confirm_name set to the account's exact name. While it declines, the tool reports isError: true, so a confirmation prompt is never mistaken for a completed deletion.

create_account - name (required) | offBudget (optional, default false) | initialBalance (optional): human amount, creates the "Starting Balance" transaction. (Actual models accounts as on/off-budget only, so there is no account type.)

delete_account - account (required): name or ID | confirm (required to delete): must be true | confirm_name (required to delete): the account's exact name

Maintenance (1)

Tool

Description

Example prompt

repair_sync

Repair an out-of-sync budget

"Repair the sync, everything is failing"

If tools start failing with a sync error, the budget's sync state is inconsistent with the server. repair_sync rebuilds that state without touching budget data. Note that deleting the local ACTUAL_DATA_DIR does not fix this, because the inconsistency is in the sync state, not the cache.

repair_sync - no parameters

Prompts

Built-in prompt templates that guide Claude through multi-step financial analysis:

Prompt

Description

monthly-review

Complete budget review for any month: spending vs budget, overspending, suggestions

spending-check

Quick check: are you on track this month?

spending-patterns

Deep analysis of spending trends and patterns over multiple months

Use them in Claude Desktop by clicking the prompt icon, or in Claude Code by asking Claude to use them.

Resources

Pre-loaded data that Claude can reference without calling tools:

Resource

URI

Description

Accounts

actual://accounts

All accounts with balances

Categories

actual://categories

Category groups and categories with IDs

Payees

actual://payees

All payees sorted alphabetically

Usage Examples

Here are real prompts you can use:

"How much did I spend in February?"

"Show me my top 5 spending categories this month"

"Am I over budget on anything?"

"I spent 1,200 on electricity from my BHD account yesterday"

"What's my savings rate this month?"

"Show me all transactions from Cartera in the last 30 days"

"Transfer 5,000 from Checking to Savings"

"What are my spending trends for food over the last 6 months?"

"Create a category called Gym in Gastos Variables"

"Rename the Gym category to Fitness"

"Create a rule: when payee is Netflix, set category to Suscripciones"

"How have my finances been the last 3 months?"

How is this different?

Compared to other Actual Budget MCP servers:

Feature

actual-budget-mcp

Others

Natural language dates

"last month", "este mes", "hace 3 meses"

Only YYYY-MM-DD

Name resolution

Type "Cartera" instead of UUIDs

Requires exact IDs

Output format

Aligned tables, readable text

Raw JSON

Error messages

Clear instructions on how to fix

Generic errors

Analysis tools

Budget vs actual, projections, trends

Not available

MCP Prompts

3 guided analysis workflows

Limited or none

MCP Resources

Accounts, categories, payees pre-loaded

Not available

Bilingual dates

English + Spanish

English only

Transfers

Two linked sides, matching transfer_id, no category, same as the app

Often one-sided or miscategorised

Deletes

Preview, then an explicit confirmation

Run immediately

Out-of-sync recovery

repair_sync rebuilds the local sync state

Reinstall and hope

API version

@actual-app/api 26.x (current)

Often outdated

Security

  • This server connects to your Actual Budget instance using the credentials you provide

  • Credentials are passed as environment variables and never stored by the MCP server

  • All communication with your Actual Budget server happens locally (or to your self-hosted server)

  • The server only accesses budget data through the official @actual-app/api library

  • No data is sent to third parties

Troubleshooting

Stuck on something that is not listed here? Tell me what tripped you up. A sentence is enough, and a failed setup looks identical to no setup at all from my side.

"Could not connect to Actual Budget server"

  • Make sure Actual Budget is running (open the app or start the server)

  • Check that ACTUAL_SERVER_URL is correct

  • Run npx -y actual-budget-mcp --verify to test your connection

"Authentication failed"

  • Your server requires a password. Set ACTUAL_PASSWORD in your config

  • If you forgot the password, reset it in Actual Budget under Settings > Server

"Budget not found"

  • Check your ACTUAL_BUDGET_ID. Find it in Settings > Show advanced settings > Sync ID

"Budget file is encrypted"

  • Set ACTUAL_ENCRYPTION_PASSWORD with your encryption password

"Ambiguous name: matches X, Y"

  • Be more specific. Instead of "BHD", try "BHD Nomina" or "BHD Mi Pais"

Node.js Requirement

"ReferenceError: navigator is not defined"

  • @actual-app/api referenced the navigator global through 26.6. That global only exists on Node.js 21+, so importing the library on Node.js 20 threw before the server could start. 26.8 dropped the reference.

  • Solution: Run Node.js 22 or newer, which is the minimum from 0.9.2 on.

Node Version Managers (fnm, nvm, volta)

MCP server shows "Server disconnected" in Claude Desktop

  • Claude Desktop doesn't source your shell profile (.bashrc, .zshrc), so version managers like fnm, nvm, and volta won't work with the default npx command. This applies to a manual npx entry in the config file, not to the Desktop Extension, which carries its own dependencies.

  • Solution: Use the absolute path to node in your config. Find it with:

readlink -f $(which node)

Then update your claude_desktop_config.json:

{
  "mcpServers": {
    "actual-budget-mcp": {
      "command": "/home/user/.local/share/fnm/node-versions/v22.22.1/installation/bin/node",
      "args": ["/path/to/actual-budget-mcp/dist/index.js"],
      "env": {
        "ACTUAL_SERVER_URL": "http://localhost:5006",
        "ACTUAL_PASSWORD": "your-password",
        "ACTUAL_BUDGET_ID": "your-budget-sync-id"
      }
    }
  }
}

Alternatively, create a wrapper script mcp-wrapper.sh:

#!/bin/bash
export PATH="$HOME/.local/share/fnm/node-versions/v22.22.1/installation/bin:$PATH"
exec npx -y actual-budget-mcp "$@"

Then use it in your config:

{
  "mcpServers": {
    "actual-budget-mcp": {
      "command": "/path/to/mcp-wrapper.sh"
    }
  }
}

Contributing

Contributions are welcome! Please open an issue or submit a pull request.

git clone https://github.com/henfrydls/actual-budget-mcp.git
cd actual-budget-mcp
npm install
npm run build
npm test               # Run unit tests
npm run test:connection # Needs .env configured

License

MIT - DLSLabs

Available Tools

37 tools
balance_historyA
Read-only

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

ParametersJSON Schema
NameRequiredDescriptionDefault
accountYesAccount name or ID
end_dateNoEnd date (YYYY-MM-DD or natural language). Defaults to today.
start_dateNoStart date (YYYY-MM-DD or natural language). Defaults to 3 months ago.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the read-only behavior is covered. The description adds context that it returns a running balance at transaction dates, but does not clarify what 'key transaction dates' means or any aggregation or pagination behavior. This is adequate but not rich.

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, well-structured sentence with no filler. The verb and resource are front-loaded, 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 read-only tool with one required parameter and no nested objects, the description plus schema and annotations is largely sufficient for selecting and invoking the tool. The main gap is the vague 'key transaction dates' and lack of explicit output shape, but no output schema exists and the tool is simple.

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%: all three parameters are described in the input schema. The description adds no parameter-level meaning beyond what the schema already provides, so the 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?

Description uses a specific verb ('Track') and resource ('an account's balance changes over time'), and clarifies the output concept ('running balance at key transaction dates'). It does not explicitly name sibling tools, so differentiation from get_transactions or get_category_balance is implicit rather than direct.

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 balance-over-time queries, but it gives no explicit when-to-use guidance or alternatives among the many sibling tools. There is no exclusionary routing like 'use get_transactions for raw transaction lists'.

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

budget_vs_actualA
Read-only

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

ParametersJSON Schema
NameRequiredDescriptionDefault
groupNoFilter to a specific category group name
monthNoMonth (YYYY-MM or natural language). Defaults to current month.

TDQS

A4/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true, so the agent knows this is a safe read operation. The description adds the behavioral trait of highlighting over/under-budget categories, which is useful context beyond the annotation. However, it does not disclose specifics like whether the result is a summary or detailed breakdown, or if default behavior (current month) is implied. This adds some value but not extensive 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?

The description is two sentences, front-loading the core purpose and immediately adding the distinguishing highlight outcome. Every word earns its place; there is no fluff or repetition.

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?

Given the tool's relative simplicity, two optional parameters, and the read-only annotation, the description is fairly complete. It explains what the tool does and the key output (highlights categories). The absence of an output schema is mitigated by the clear statement of what is returned (comparison and highlights). The only minor gap is not detailing the return format (e.g., table vs list), but this is not critical.

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?

The schema description coverage is 100%, meaning both parameters ('group' and 'month') are already documented with meaning. The description implies that 'month' is a filter and 'group' may be a category filter, but it doesn't add syntax or default behavior beyond the schema's 'Defaults to current month'. With full schema coverage, the baseline is 3, and the description provides marginal additional context.

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 a specific verb ('Compare') and resource ('budgeted amounts versus actual spending'), with a defined scope ('for each category in a given month') and a distinguishing outcome ('highlights over-budget and under-budget categories'). This is distinct from sibling tools like 'get_budget_month' or 'spending_by_category', so an agent can easily tell them apart.

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 indicates when to use this tool (to compare budget vs actual for a month) and the outcome it provides. However, it does not explicitly state when not to use it or mention alternatives; although the sibling list includes related tools like 'get_budget_summary' or 'spending_by_category', no exclusions are given. This is clear context but lacks alternative routing.

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

create_accountA

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

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesAccount name
offBudgetNoWhether the account is off-budget (tracked but outside the budget, e.g. a loan or investment). Defaults to false.
initialBalanceNoOpening balance in human amounts (e.g. 1500.50, not cents). Creates the "Starting Balance" transaction.

TDQS

A4.3/5.0
Behavior4/5

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

The readOnlyHint=false annotation already signals mutation, and the description adds meaningful behavior beyond that: it explains that a new account is created and that the response returns the new account ID. This is useful because there is no output schema. It does not over-explain obvious or schema-covered details.

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?

The description is two concise sentences with no filler. The core action is front-loaded, and the return-value note earns its place by explaining the practical follow-up use case.

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

Completeness5/5

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

For a simple creation tool with three well-documented parameters and no output schema, this description is complete. It states what is created, notes the account type options, and describes the return value. No important calling context is missing.

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 the schema already thoroughly documents name, offBudget, and initialBalance. The tool description does not repeat parameter details, which is appropriate; it does not need to compensate for any schema gaps.

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 and resource ('Create a new budget account') and clarifies the on-budget/off-budget distinction. This clearly separates it from sibling tools like create_category_group or create_transaction.

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 gives clear context: use this when creating a budget account, and it even notes that the returned account ID can immediately be used by transactions. It does not explicitly mention alternatives, but the intended use case is obvious and not misleading.

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

create_categoryB

Create a new budget category within a category group.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName for the new category
groupYesCategory group name or ID to add this category to

TDQS

B3.4/5.0
Behavior2/5

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

Annotations declare readOnlyHint=false indicating a write operation. The description 'Create a new budget category' aligns with this but adds no additional behavioral context—no mention of side effects, permission requirements, or interactions with related data. Since the bar is lower with annotations present, the description still fails to provide any extra transparency.

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?

One clean sentence with no redundancy. It front-loads the action and scope, making it easy to scan. 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 simple create operation with two parameters, the description is mostly complete. It lacks an explicit note about prerequisites (e.g., group existence), but given the straightforward nature and the existing schema, it covers the core need. A few extra words about the group being pre-existing would make it fully 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?

Both parameters are fully described in the schema (100% coverage). The description does not add further explanation about parameter semantics, so it does not go beyond the baseline of 3. The schema already explains name and group sufficiently.

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 clear verb 'create' with a specific resource 'new budget category within a category group'. This precisely distinguishes it from sibling tools like create_category_group (which creates the group itself) and update_category (which modifies existing categories). No ambiguity remains about what the tool does.

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 usage guidance is provided. The description does not state when to use this tool versus alternatives, nor does it mention prerequisites (e.g., the category group must already exist). An agent has to infer that this is for adding a category to an existing group.

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

create_category_groupA

Create a new category group for organizing budget categories.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName for the new category group

TDQS

A3.8/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=false, indicating this is a write operation, so the description doesn't need to state that. However, the description adds no further behavioral context, such as whether the group starts empty, requires permissions, or has side effects. It provides only the minimal verb and object, so it doesn't add value beyond the annotation.

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?

The description is a single, concise sentence that front-loads the primary action and purpose. It contains no filler or redundant information, making it easy to parse quickly.

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 create operation with one parameter and no output schema, the description provides sufficient information for an agent to understand the tool's purpose. It could optionally mention that the new group starts empty or that categories can be added later, but this is not essential given the tool's simplicity. The description is adequate.

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?

The schema fully documents the single parameter 'name' with a description 'Name for the new category group' (100% coverage). The tool description repeats the purpose but adds no additional semantics, constraints, or examples. Given the high schema coverage, a baseline of 3 is appropriate; the description doesn't enhance parameter understanding.

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 verb 'Create' and the resource 'category group', and explicitly mentions its purpose of organizing budget categories. This distinguishes it from siblings like create_category (which creates a category within a group) and update_category_group/delete_category_group. The intent is unambiguous.

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 (when you need a new category group) but does not explicitly state when to use this vs. alternatives, nor does it mention any prerequisites or exclusions. It relies on the name and context to infer the appropriate use case. While it's straightforward, there's no direct guidance.

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

create_payeeB

Create a new payee.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName for the new payee

TDQS

B3.4/5.0
Behavior2/5

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

Annotations already communicate that this is a write operation (readOnlyHint false). The description adds no further behavioral context—no mention of side effects, required permissions, duplicate handling, or response behavior—beyond the verb 'Create.'

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?

The description is a single, direct sentence with no filler. It is front-loaded and communicates the essential purpose immediately without unnecessary detail.

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 low-complexity tool with one parameter and no output schema, the description is sufficient to understand the operation. However, it omits any usage context or behavioral notes that could help an agent decide when and how to invoke it safely, keeping it just shy of a perfect score.

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?

The input schema already documents the single 'name' parameter with 100% coverage, so the baseline is 3. The description does not add any extra meaning about the parameter, but it does not need to given the schema's completeness.

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 and resource ('Create a new payee'), which clearly identifies the operation and distinguishes it from sibling tools like update_payee, delete_payee, and get_payees. No ambiguity remains about what the tool does.

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?

The description provides no guidance on when to use this tool versus alternatives, such as when to create a payee versus reusing an existing one via update_payee. It is self-evident for a simple create operation, but no explicit context or exclusions are given.

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

create_ruleB

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

ParametersJSON Schema
NameRequiredDescriptionDefault
stageNoWhen to apply: null (default), pre, or postnull
action_fieldYesField to set: category, payee, notes
action_valueYesValue to set (category name/ID, payee name, or note text)
condition_opYesOperator: is, contains, oneOf, isNot, doesNotContain, matches, gt, lt, gte, lte
condition_fieldYesField to match: payee, category, amount, notes, imported_payee
condition_valueYesValue to match against

TDQS

B3.3/5.0
Behavior3/5

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

The description is consistent with the readOnlyHint annotation (false implies mutation), and 'Create' clearly indicates a write operation. However, it doesn't add behavioral details beyond that, such as whether rules apply retroactively, the persistence model, or potential side effects. With annotations covering the basic write nature, this is adequate but minimal.

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?

The description is a single, efficient sentence that captures the essential purpose without redundancy. No filler or unnecessary detail.

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?

The description gives a high-level overview but does not explain how the condition and action parameters interact, what the stage parameter does beyond the schema's brief note, or the expected behavior on success. For a rule creation tool with 6 parameters, an agent might need more context to assemble a correct call, though the schema does cover individual fields.

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%, so all parameters already have descriptions. The tool description does not add any meaning beyond the schema, such as relationships between condition_field and action_field or the semantics of the stage parameter. It meets the baseline for high schema coverage but provides no extra value.

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 action ('Create a transaction rule') and the resource, and explains the core behavior: matching a condition triggers an action automatically. It doesn't explicitly distinguish from siblings like get_rules or delete_rule, but the verb and resource make it obvious.

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 is provided on when to use this tool versus alternatives such as get_rules or delete_rule, nor any context about prerequisites or typical scenarios. The description only states what it does, not when to choose it.

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

create_split_transactionA

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

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoTransaction date (YYYY-MM-DD or "today", "yesterday"). Defaults to today.
notesNoNotes for the parent transaction
payeeNoPayee name
amountYesTotal amount (negative for expenses, positive for income). Must equal the sum of the splits.
splitsYesTwo or more splits whose amounts sum to the total.
accountYesAccount name or ID
clearedNoWhether the transaction is cleared

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already convey that this is a mutating operation (readOnlyHint: false). The description adds a meaningful behavioral invariant: 'The split amounts must sum to the total.' It also frames the transaction as 'bank-facing total,' which adds context. However, it does not disclose failure behavior, reversibility, or side effects beyond the sum constraint, and much of the constraint detail is already in the schema.

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?

The description is a single, focused sentence that leads with the action and resource, then immediately states the key constraint. There is no redundant phrasing or filler. Every part 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 mutating tool with complete schema documentation and readOnlyHint annotations, the description is nearly sufficient. It explains the split concept and sum requirement, which are the main non-obvious aspects. It lacks explicit guidance on how this tool relates to create_transaction, but the schema and annotations cover most operational context, making this a minor gap.

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 the parameters are fully documented in the input schema. The description adds little parameter-level meaning beyond the schema, only reinforcing the sum relationship. With complete schema coverage, the baseline of 3 is appropriate; the description does not compensate for any gaps because there are none.

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 provides a specific verb ('Add') and resource ('split transaction'), and clarifies the core concept with 'one bank-facing total spread across multiple categories.' It is clearly distinguishable from generic transaction tools, though it does not explicitly name sibling alternatives like create_transaction. The description is clear but relies on the tool name for full 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 when to use the tool (when a single bank-facing total needs to be allocated across multiple categories), but it does not explicitly contrast with alternatives such as create_transaction or state when not to use it. No exclusions or alternative routing are provided, so an agent must infer the appropriate choice from context and sibling names.

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

create_transactionB

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

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoTransaction date (YYYY-MM-DD or "today", "yesterday"). Defaults to today.
notesNoTransaction notes
payeeNoPayee name
amountYesAmount (negative for expenses, positive for income). Use human amounts like -150.50, not cents.
accountYesAccount name or ID
clearedNoWhether the transaction is cleared
categoryNoCategory name or ID

TDQS

B3.4/5.0
Behavior3/5

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

The annotation readOnlyHint=false already indicates a write operation, so the description does not need to restate that. The description adds the sign convention (negative for expenses, positive for income), which is a useful behavioral rule for input values. However, it does not disclose what happens after creation (e.g., balance updates, validation, or return value), which would be valuable 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?

The description is a single, focused sentence that leads with the core purpose and includes the critical sign convention. There is no wasted wording, and the structure is optimal for a create operation.

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?

With a comprehensive schema covering all parameters and defaults, the description is adequate for a simple create operation. It does not explain return values, but no output schema exists. It might be improved by noting prerequisites (e.g., account must exist) or that amounts are in human units, but the schema already includes these details. Overall, the description plus schema is sufficient for an agent to call it correctly.

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%, meaning all parameters are described in the schema. The description adds the sign convention, which is also present in the amount parameter description, so it reinforces but does not substantially extend beyond the schema. The phrase 'to an account' reiterates the account parameter's role, but adds little beyond the schema. Baseline 3 applies given full 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?

The description clearly states the verb 'Add' and the resource 'transaction', specifying that it adds to an account. It also includes the sign convention for amounts, which adds specificity. However, it does not explicitly distinguish from siblings like create_split_transaction or create_transfer, though the name and verb make it reasonably distinct.

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 is given on when to use this tool versus alternatives such as create_split_transaction for split entries or create_transfer for transfers. The only usage-related note is the sign convention for amounts, which is about input formatting, not tool selection. This leaves the agent to infer when this tool is appropriate.

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

create_transferC

Create a transfer between two accounts.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoDate (YYYY-MM-DD or natural language). Defaults to today.
notesNoTransfer notes
amountYesTransfer amount (positive number, e.g., 5000.00)
to_accountYesDestination account name or ID
from_accountYesSource account name or ID

TDQS

C2.9/5.0
Behavior2/5

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

The description only restates the mutating nature of the operation that readOnlyHint=false already implies. It does not disclose side effects such as whether both account balances are affected, whether the transfer is reversible, or whether any additional transaction records are created.

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?

The description is a single, active-voice sentence with no filler, repeated terms, or unnecessary background. The action and resource are front-loaded and immediately clear.

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 mutating financial operation with no output schema and no usage guidance, the description is too sparse. The schema covers parameter names, but the description does not explain how this tool differs from create_transaction, what happens when the transfer is created, or what the agent should expect as a result.

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 all five parameters are already documented in the input schema. The description adds only the general 'between two accounts' framing and no extra detail about constraints or behavior beyond what the schema provides.

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 names both the action ('create') and the resource ('a transfer'), and clarifies the scope as 'between two accounts.' It is not a tautology, but it does not explicitly contrast with adjacent sibling tools like create_transaction or create_split_transaction, leaving some differentiation to inference.

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?

The description provides no guidance on when to use this tool versus alternatives such as create_transaction or create_split_transaction. It also omits prerequisites like whether the referenced accounts must already exist.

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

delete_accountA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountYesAccount name or ID to delete
confirmNoMust be true to delete. Without it, the tool only previews.
confirm_nameNoThe account's exact name, echoed back as a safeguard against deleting the wrong account.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (destructiveHint: true, readOnlyHint: false), the description adds critical behavioral detail: it previews on first call, requires confirm: true and confirm_name, and is irreversible. This significantly clarifies the tool's runtime behavior, which the annotations alone do not convey.

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 sentences with no wasted words: the main action, the destructive warning, and the alternative usage. The most important information (deletion and preview behavior) is front-loaded, and every sentence earns its place.

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

Completeness5/5

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

For a destructive tool with no output schema, the description fully covers the invocation flow: preview, confirmation, and the alternative of closing. It explains the safeguard mechanism and the irreversible nature. An agent has all necessary information to call it correctly without additional context.

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%, and each parameter already has a clear description (account, confirm, confirm_name). The description reiterates the confirmation requirements but does not add new semantic meaning beyond the schema. Since the schema fully documents the parameters, the description's contribution is minimal, consistent with the baseline of 3.

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 states a specific verb and resource: 'Delete an account and its entire transaction history.' It also conveys the destructive scope and implies the operation is distinct from closing an account, which is mentioned as a preferred alternative. While it doesn't name a sibling tool explicitly, the action is unambiguous and distinct from other delete tools like delete_transaction.

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

Usage Guidelines5/5

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

It explicitly provides usage guidance: 'Prefer closing an account when you just want to retire it' gives a clear when-not-to-use condition and an alternative behavior. The description also explains the two-step confirmation process, setting expectations for how to invoke the tool safely.

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

delete_categoryA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be true to delete. Without it, the tool only previews.
categoryYesCategory name or ID to delete
transfer_toNoCategory name or ID to transfer existing transactions to
confirm_nameNoThe category's exact name, echoed back as a safeguard.

TDQS

A4.7/5.0
Behavior5/5

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

Even though the annotations already flag destructiveHint=true, the description adds rich operational detail: irreversible deletion, preview-first flow, exact-name confirmation, destruction of budget and rollover history, and the transfer_to safety valve. This goes well beyond the annotation's simple flag.

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?

The text is three concise sentences: the first states the core action, the second details the confirmation requirement and preview-versus-delete behavior, and the third states side effects and the transfer option. Every sentence delivers essential information with no filler.

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

Completeness5/5

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

For a high-stakes destructive tool with no output schema, the description fully covers the invocation flow, required confirmation inputs, irreversible side effects, and optional transfer behavior. It leaves no ambiguity about how to call it safely and what to pass.

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 schema covers 100% of parameters with individual descriptions, but the tool description adds important relationships beyond the schema, explaining that confirm and confirm_name gate the actual deletion and that transfer_to preserves transactions. This adds behavioral meaning not obvious from isolated parameter descriptions.

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 opens with 'Delete a budget category,' clearly identifying the action, resource, and scope. This distinguishes it from sibling tools like delete_category_group, update_category, and delete_transaction.

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 provides clear context for use: it previews first, then requires confirm and confirm_name, and offers transfer_to as an option. It indirectly covers alternatives by clarifying what transfer_to is for, but it doesn't explicitly point to sibling tools or state when not to use it.

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

delete_category_groupA
Destructive

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

ParametersJSON Schema
NameRequiredDescriptionDefault
groupYesCategory group name or ID to delete
confirmNoMust be true to delete. Without it, the tool only previews.
transfer_toYesCategory name or ID to transfer orphaned transactions to
confirm_nameNoThe group's exact name, echoed back as a safeguard.

TDQS

A4.2/5.0
Behavior4/5

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

The description adds significant behavioral context beyond the annotations: it explains the two-step confirmation process (preview first, then confirm with exact name), the irreversibility, and the requirement to transfer transactions. The annotations only state readOnlyHint=false and destructiveHint=true, so this extra detail is valuable and consistent.

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?

The description is concise and front-loaded: it states the action and its destructive nature in the first sentence, then explains the confirmation process and transaction transfer requirement. Every sentence adds crucial information with no fluff or redundancy.

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 destructive tool with no output schema, the description covers the essential operational steps: preview, confirmation, and transfer. It also covers the risk of irreversibility. It does not explicitly state the return value or error handling, but given the complexity and the 100% schema coverage, the description is sufficiently complete for an agent to use it correctly.

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 all parameters are documented in the schema. The description reinforces the purpose of 'confirm', 'confirm_name', and 'transfer_to', but does not add new semantics beyond what the schema already provides. The overlap is acceptable, hence a baseline score of 3.

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 'Delete a category group and every category in it', using a specific verb and resource. It is unambiguous and distinguishes this destructive action from sibling tools like 'update_category_group' or 'delete_category'.

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 provides clear usage context: it is destructive and irreversible, requires a confirmation step, and necessitates specifying a transfer target. It implicitly advises caution but does not explicitly name alternative tools for non-destructive needs, though the destructive nature is self-evident.

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

delete_payeeA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
payeeYesPayee name or ID to delete
confirmNoMust be true to delete. Without it, the tool only previews.
confirm_nameNoThe payee's exact name, echoed back as a safeguard.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations' destructiveHint and readOnlyHint, the description discloses that the operation is irreversible, that a first call only previews, and that confirmation requires an exact-name safeguard. This is substantive behavioral context an agent needs before invoking.

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 compact sentences with no filler. The core action is front-loaded, followed immediately by the critical safety requirements.

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

Completeness5/5

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

For a destructive three-parameter tool, the description fully covers how to invoke it safely: payee identification, preview behavior, and confirmation requirements. The lack of an output schema is not a significant gap here because the focus is on the destructive action and its guardrails.

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 description coverage is 100%, so the baseline is 3. The description adds value by sequencing the parameters into a safe workflow (preview first, then confirm with both confirm:true and confirm_name), which ties the parameter semantics together.

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 opens with a specific verb and resource: 'Delete a payee,' which is unambiguous and distinguishes this tool from sibling payee tools like create_payee and update_payee. The destructive/irreversible warning reinforces the operation's nature.

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?

It gives actionable usage context: the first call should preview, and actual deletion requires confirm:true plus the exact confirm_name. It does not explicitly name alternatives or say when not to use it, but the context makes the deletion workflow clear.

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

delete_ruleA
Destructive

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

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be true to delete. Without it, the tool only previews.
rule_idYesRule ID to delete

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the destructiveHint annotation, the description adds the critical nuance that the first call only previews and actual deletion requires confirm: true, plus it explicitly labels the operation irreversible. This provides rich behavioral context that the annotations alone do not convey.

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 tightly written sentences: the first states the core purpose, the second delivers the critical destructive caveat and confirmation requirement. Zero filler and perfectly front-loaded.

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?

The description covers the essential behavior (purpose, destructiveness, two-step confirm) and is sufficiently complete for a simple two-parameter tool without an output schema. It doesn't describe return values or error handling, but those are not essential for correct invocation.

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%, so both parameters are already documented. The description reinforces the confirm parameter's meaning by explaining the preview/confirm flow, but adds no new parameter-specific details beyond the schema. Baseline 3 is appropriate since the schema handles the semantics.

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 states a specific verb ('Delete') and resource ('transaction rule') with its identifier, making the tool's purpose unambiguous. It clearly distinguishes from sibling tools like delete_account or delete_category by targeting rules specifically.

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 implies usage for deleting transaction rules, and since there is no update_rule sibling, it is the only deletion tool for rules. It lacks explicit alternatives or when-not-to-use guidance, but the context is clear enough that an agent would know when to invoke it.

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

delete_transactionA
Destructive

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

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be true to delete. Without it, the tool only previews.
transaction_idYesTransaction ID to delete

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds the crucial 'irreversible' qualifier and explains the preview/confirm mechanism. This goes beyond the annotations and tells the agent exactly what to expect behaviorally, including the safety rail of previewing before actual deletion.

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 with zero waste. The purpose is front-loaded, followed immediately by the critical behavioral warning. Every word earns its place.

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

Completeness5/5

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

For a destructive tool with a two-step confirm flow, the description fully equips the agent: it knows what it does, the irreversibility, and the exact call sequence. No output schema exists, but that's not a gap here. The description is complete for safe and correct invocation.

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% for both parameters, and the schema already documents confirm as 'Must be true to delete. Without it, the tool only previews.' The description simply restates that behavior without adding new parameter-specific meaning. 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?

The description states 'Delete a transaction by its ID' with a specific verb and resource, clearly distinguishing it from sibling tools like create_transaction and update_transaction. The ID parameter is named, and the destructive nature is immediately apparent.

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 explicitly describes the two-step usage pattern: a first call previews the loss, and a subsequent call with confirm:true executes the delete. This gives clear context for how to invoke the tool safely, though it doesn't explicitly name alternatives or when not to use it. Still, the guidance is strong and actionable.

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

get_budget_monthA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
monthNoMonth in YYYY-MM format, or natural language like "this month", "last month", "January 2025". Defaults to current month.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=true, and the description adds useful behavioral context by specifying exactly what the response includes: category groups, categories, budgeted/actual/remaining amounts, and to-be-budgeted amount. No destructive side effects are suggested, and the description aligns with the annotation.

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?

The description is a single, well-structured sentence that front-loads the primary action and then compactly lists the output contents. There is no filler or redundant phrasing.

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

Completeness5/5

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

For a simple read-only tool with one optional parameter and no output schema, the description covers the essential return contents and scope. An agent can understand what information will be provided without needing additional details.

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%, and the month parameter is fully documented with format, natural language examples, and default behavior. The description only repeats the notion of a 'specific month' and adds no extra parameter semantics beyond what the schema already provides, so the baseline of 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 action ('Get') and the resource ('the budget for a specific month'), and enumerates the returned content: category groups, categories, budgeted amounts, actual spending, remaining balance, and to-be-budgeted amount. It is specific and understandable, but it does not explicitly distinguish itself from similar siblings like get_budget_summary or monthly_summary.

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 gives a clear use case: retrieving budget details for a specific month, with category-level breakdown and remaining balances. It implies when this tool should be used, but it does not state exclusions or explicitly point to alternatives such as get_budget_summary for higher-level budget figures.

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

get_budget_summaryA
Read-only

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

ParametersJSON Schema
NameRequiredDescriptionDefault
monthNoMonth (YYYY-MM or natural language). Defaults to current month.

TDQS

A3.6/5.0
Behavior4/5

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

The readOnlyHint=true annotation is consistent with the description, and the description goes beyond the annotation by specifying the output fields and the monthly grain. It does not cover edge cases like months with no budget data, but for a read-only summary the main behavioral contract is present.

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?

The description is a single sentence with no filler, front-loading the core concept ('Executive summary of the budget') before a tight list of the included metrics. Every phrase contributes to the agent's understanding.

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?

With one optional parameter, a read-only annotation, and no output schema, the description covers the core call contract: what to pass and what comes back. It does not specify currency units or the exact format of values, and the default-month behavior is only in the schema, but these are minor gaps for a summary 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?

The input schema fully documents the only parameter, month, including format and default behavior. The description only repeats 'for a given month' and adds no additional semantic or formatting detail, so the baseline score of 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 identifies the resource (budget) and the operation shape (an executive summary for a given month), and enumerates the key metrics returned. It is distinguishable from transaction-level tools, but it does not explicitly differentiate itself from similarly named siblings like monthly_summary or get_budget_month.

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?

The description gives no guidance about when to prefer this tool over alternatives such as monthly_summary, get_budget_month, or budget_vs_actual, and it names no exclusions. The phrase 'executive summary' weakly implies high-level use, but the agent is left to infer the selection criteria.

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

get_categoriesA
Read-only

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

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?

Annotations already declare readOnlyHint=true, and the description does not contradict that. It adds useful behavioral context by specifying that the result includes category groups, their categories, and IDs, which is especially important since no output schema is provided.

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 short sentences, front-loaded with the core behavior and followed by a brief use-case statement. No filler or redundancy.

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, read-only listing tool, this description is nearly complete: it states what is returned and the intended use case. It could be slightly richer about the output shape or hierarchy, but it is adequate for an agent to select and invoke the tool 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 zero parameters, so the schema already fully covers parameter needs. The description does not need to explain parameters and simply clarifies the returned data scope.

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?

Description states a clear verb and resource: list all category groups with their categories and IDs. It also conveys the hierarchical scope ('full budget structure'), which distinguishes it from account-, transaction-, and balance-focused sibling tools.

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 phrase 'Useful for seeing the full budget structure' provides clear context for when to call this tool. It does not explicitly name alternatives or exclusion conditions, but the read-only listing purpose is unambiguous.

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

get_category_balanceA
Read-only

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

ParametersJSON Schema
NameRequiredDescriptionDefault
monthsNoNumber of months to look back (default 3)
categoryYesCategory name or ID

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, aligning with the 'Get' verb. The description adds minimal behavioral context beyond that—it does not mention output format, whether the current month is included, or how historical data is aggregated. With annotations covering the safety profile, a score of 3 is appropriate because the description adds only marginally to what is already explicit.

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?

The description is a single concise sentence that front-loads the key purpose (balance and spending history) and scope (specific category, months). No filler or redundant phrasing; every element contributes to understanding.

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?

The tool has no output schema, so the description should clarify the return structure. It says 'balance and spending history' but does not specify the format (e.g., array of monthly breakdowns, total balance, etc.). Given the low complexity and that params are fully documented, the gap is moderate—gaps exist for return shape and possible edges like months=0 or negative numbers. This is adequate but not 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 description coverage is 100%—both 'category' and 'months' are described (including the default for months). The description adds no additional meaning beyond echoing the influence of months ('across one or more months') and does not explain edge cases like month boundaries. Per the baseline for high schema coverage, a 3 is correct.

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 a specific verb (get), resource (balance and spending history for a category), and scope (across one or more months). It is clear and distinguishes from the broad get_transactions or get_budget_summary, though it overlaps semantically with spending_by_category, category_trends, and balance_history without explicitly differentiating the exact meaning of 'balance' or 'spending history'.

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 a use case (querying a specific category over months) but offers no comparison to sibling tools like spending_by_category, category_trends, or balance_history. It does not state when to prefer this tool over alternatives or when not to use it. The context is clear enough, but guidance is missing.

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

get_payeesA
Read-only

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

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

The annotation readOnlyHint=true already discloses the read-only nature. The description adds that it lists all payees in the budget and that IDs are included, providing some extra context about scope and output. However, it does not describe pagination, ordering, or exact response structure, which the absence of an output schema leaves partly uncovered.

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?

The description is a single sentence with no fluff. The primary action is front-loaded ('List all payees'), and the added clause explains why the tool is useful without repeating the schema or annotations.

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

Completeness5/5

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

For a simple, zero-parameter, read-only tool, the description is sufficiently complete. It states the scope ('all payees in the budget') and the key output detail ('their IDs'), matching the safety profile already provided by annotations. No additional details are essential for correct invocation.

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 input schema has no parameters, so there is nothing for the description to clarify. The 0-parameter baseline is 4, and the description does not need to compensate for missing parameter documentation.

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 action ('List'), the resource ('all payees in the budget'), and the purpose ('seeing available payees and their IDs'). This is specific enough to distinguish it from sibling tools like create_payee, update_payee, and delete_payee.

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 phrase 'Useful for seeing available payees and their IDs' gives a clear use case, indicating when an agent should use this tool. It does not explicitly mention alternatives or when-not-to-use, but the context is clear enough for selection among the large sibling list.

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

get_rulesA
Read-only

List all transaction rules showing their conditions and actions.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, and the description's 'List' aligns with that. It adds the output scope ('conditions and actions'), which is useful, but no further behavioral details (e.g., pagination, ordering, limits). Since annotations cover the safety profile, the bar is lower, but the added value is modest.

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?

One tight sentence that leads with the verb and resource, then specifies what is returned. No filler or redundancy.

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 no output schema, the description gives a reasonable hint of the output ('conditions and actions') but doesn't mention other possible rule fields or result format. Still, it's adequate for a simple retrieval tool.

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, so the empty input schema fully covers parameter semantics. The description doesn't need to add parameter info; baseline 4 is appropriate.

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 verb (List), resource (transaction rules), and output content (conditions and actions). With no sibling tool named similarly, it's unambiguous and distinct from create_rule/delete_rule.

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?

Usage is implied as a read-only retrieval tool for transaction rules, but no explicit guidance is given on when to use it versus alternatives or any exclusions. The description doesn't mention prerequisites or typical scenarios.

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

get_transactionsA
Read-only

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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of transactions to return (default 50)
payeeNoPayee name to filter by (partial match)
accountNoAccount name or ID to filter by
categoryNoCategory name to filter by (partial match)
end_dateNoEnd date (YYYY-MM-DD or natural language). Defaults to today.
max_amountNoMaximum amount in human format
min_amountNoMinimum amount in human format (e.g., -500 for expenses of at least 500)
start_dateNoStart date (YYYY-MM-DD or natural language like "start of month", "30 days ago"). Defaults to start of current month.

TDQS

A4/5.0
Behavior4/5

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

The annotations already declare readOnlyHint: true, so the agent knows this is a safe read operation. The description adds the specific fields returned (date, payee, category, amount, notes, account, cleared status), which is useful context beyond the annotation. No contradictions exist.

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 no filler. The action ('List transactions') is front-loaded, and the return fields are listed compactly. 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 listing tool with 8 optional parameters, full schema coverage, and a readOnly annotation, the description covers the core purpose and return fields. It lacks details like default sorting or pagination, but these are not critical for a basic list operation, and the schema provides defaults for limit and dates. The tool is adequately specified.

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?

The schema provides 100% coverage with descriptions for all 8 parameters, so the baseline is 3. The description adds no parameter-specific detail beyond saying 'optional filters'; it doesn't compensate further because the schema already handles parameter meaning adequately.

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 verb 'List' and the resource 'transactions', and mentions optional filters, distinguishing it from sibling tools that create, update, or delete transactions. It also enumerates the returned fields, leaving no ambiguity about what the tool does.

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 the tool to retrieve transactions, but it does not explicitly state when to use it versus alternatives like get_budget_month or spending_by_category. There are no exclusions or alternative routing provided, leaving the agent to infer from the name and siblings.

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

list_accountsA
Read-only

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

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

The readOnlyHint annotation already signals a safe read operation. The description adds useful context about what is returned (balances, type, status), but does not disclose details like whether inactive accounts are included, ordering, or pagination. 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.

Conciseness5/5

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

A single, front-loaded sentence that names the action, resource, and key output fields. No filler or redundant wording.

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 read-only list tool, the description is nearly complete. It could mention whether the list is sorted or includes archived accounts, but the core information an agent needs to invoke and interpret the result is present.

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, so the schema provides no parameter semantics. The description compensates by clarifying the output scope (all budget accounts with balances, type, and status), which is sufficient for an agent to know what the call will return.

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 states a specific verb ('List') and resource ('budget accounts'), and specifies the returned fields: current balances, type (on-budget/off-budget), and status. This clearly distinguishes it from sibling tools like create_account or get_budget_summary.

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 a read-only listing use case, and the readOnlyHint annotation reinforces that. However, it does not explicitly state when to use this tool versus alternatives like get_budget_summary or get_categories, nor does it mention any exclusions or prerequisites.

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

monthly_summaryA
Read-only

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

ParametersJSON Schema
NameRequiredDescriptionDefault
monthsNoNumber of months to show (default 3)

TDQS

A3.8/5.0
Behavior3/5

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

The readOnlyHint annotation already declares this as a read-only operation, and the description ('showing') is consistent. The description adds that it aggregates multiple months and highlights trends, which is useful functional context, but it does not disclose any additional behavioral details beyond the annotation. With annotations covering the safety profile, 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.

Conciseness5/5

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

Two sentences with no fluff. The first sentence states the core functionality, the second gives a use case. All information is relevant and front-loaded, making it easy to parse quickly.

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 tool with one optional parameter and no output schema, the description covers the key aspects: what metrics are shown, the multi-month scope, and the intended use case. It could be slightly more explicit about the output format (e.g., per-month breakdown), but given the tool's simplicity, this is a minor gap.

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% because the single parameter 'months' has a description ('Number of months to show (default 3)'). The tool description reinforces the concept of multiple months but adds no new semantics about the parameter. Since the schema fully documents the parameter, the baseline 3 applies.

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 a specific verb ('showing') and resource ('monthly financial summary'), and lists the specific metrics (income, expenses, savings, savings rate). The phrase 'across multiple months' distinguishes it from month-specific siblings like get_budget_summary or budget_vs_actual, making the tool's scope unambiguous.

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 gives a clear usage context ('Great for seeing trends in your overall financial health'), implying when to use it. However, it does not explicitly name alternative tools or state when NOT to use it, leaving some inference required for an agent comparing siblings.

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

recategorize_transactionA
Idempotent

Change the category of an existing transaction.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryYesNew category name or ID
transaction_idYesTransaction ID

TDQS

A3.5/5.0
Behavior3/5

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

Annotations provide readOnlyHint=false and idempotentHint=true, so the description doesn't need to restate those. The description adds no extra behavioral context beyond the annotations, such as whether the change is reversible, whether it affects budget calculations, or whether it requires specific permissions. With annotations covering the basic safety profile, 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.

Conciseness5/5

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

The description is a single, efficient sentence with no wasted words. It front-loads the action and resource clearly, making it easy for an agent to parse quickly.

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 simple two-parameter mutation tool with full schema coverage and annotations, the description is mostly adequate. However, it lacks guidance on how to determine valid category values (e.g., whether category accepts a name or ID, and how to resolve ambiguity), which could be important for correct invocation. The absence of an output schema is not a major issue given the 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 the schema already documents both parameters (transaction_id and category). The description adds no additional meaning beyond what the schema provides, such as the format of category (name vs ID) or how to find valid categories. Baseline 3 is correct when 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 'Change the category of an existing transaction' clearly states the verb (change) and resource (category of an existing transaction), distinguishing it from sibling tools like create_transaction or update_transaction. It is concise and unambiguous, though it doesn't explicitly name a sibling alternative.

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 context: it is for modifying an existing transaction's category, not for creating or deleting transactions. However, it does not explicitly state when to use this tool versus update_transaction or other category-related tools, nor does it mention any prerequisites like the transaction existing or category validity.

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

reconcile_currency_residualA

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

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoDate for the adjustment (YYYY-MM-DD or "today"). Defaults to today.
notesNoNote for the adjustment. Defaults to "FX residual adjustment".
payeeNoOptional payee for the adjustment
accountYesAccount name or ID to reconcile
categoryYesCategory to book the adjustment under (name or ID)
target_balanceNoBalance the bank reports for this account (human amount). Defaults to 0.

TDQS

A4/5.0
Behavior3/5

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

With readOnlyHint=false, the description appropriately signals that this tool mutates state by booking an adjustment transaction. It adds useful context about the effect (clearing residual, aligning to bank balance), but does not disclose side effects such as whether a visible transaction appears in transaction lists, whether the adjustment is reversible, or whether prior reconciliations are affected.

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, well-structured sentence that packs the verb, resource, purpose, and condition without waste. It is front-loaded with the action and immediately explains why this tool exists.

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 focused adjustment tool with fully documented parameters, the description covers the main scenario well. It lacks only minor contextual details such as what the return value is or what happens if the account is not multi-currency, but those are not critical for invoking it correctly.

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?

The input schema already provides 100% coverage with descriptions for all six parameters, so the description does not need to repeat parameter details. The description adds no new parameter-level meaning beyond the schema, which is fine but earns only the baseline score.

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?

States a specific action ('Book an adjustment transaction'), the target resource ('multi-currency account'), and the goal ('bring ... to the balance the bank reports' / 'clearing accumulated FX-rate residual'). This clearly distinguishes it from general transaction-creation tools like create_transaction by specifying the reconciliation purpose.

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 gives clear context for when to use the tool: when a multi-currency account has an FX-rate residual and needs to be brought in line with the bank's reported balance. It does not explicitly name excluded alternatives or say 'use create_transaction instead', but the purpose is specific enough to imply the boundary.

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

repair_syncA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations provide idempotentHint=true and readOnlyHint=false. The description adds valuable behavioral context: it rebuilds sync bookkeeping without modifying budget data, which is a key safety guarantee. It does not cover failure modes or side effects, but the added constraint justifies above-baseline scoring.

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

Conciseness3/5

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

The description is only three sentences and front-loads the purpose. However, the first and third sentences both express the same when-to-use condition, making the third redundant. A tighter two-sentence version would eliminate the repetition.

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?

Given zero parameters, no output schema, and annotations covering idempotency and mutation, the description provides the essential purpose and side-effect guarantee. It is complete for calling the tool correctly; minor omissions like behavior when already in sync are not critical.

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 the input schema is empty, so schema coverage is 100%. With no parameters to explain, the description cannot add parameter meaning; the baseline 4 applies.

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 states a specific action ('Repair the budget's sync state') and resource (sync bookkeeping), and explicitly notes it does not modify budget data. This differentiates it from write tools and from run_bank_sync, even without naming siblings.

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 gives an explicit trigger: 'Use this when other tools report that the budget is out of sync.' It does not name alternatives or provide when-not conditions, but the context is clear and sufficient to select the tool.

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

run_bank_syncA

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

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoAccount name or ID to sync. If omitted, syncs all linked accounts.

TDQS

A3.7/5.0
Behavior3/5

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

Annotations provide readOnlyHint=false, indicating this is a mutating action. The description adds provider names and scope, but does not disclose other behavioral aspects like whether the sync is asynchronous, how conflicts are handled, or if it can be safely rerun. It adds some context beyond annotations but not comprehensive 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 with no wasted words. The core purpose and scope are front-loaded, and the provider names are integrated naturally. It is concise yet informative, achieving maximum efficiency.

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 simple one-parameter tool with no output schema and annotations covering the read/write nature, the description is mostly adequate. However, it misses guidance on when to use this vs repair_sync, and it does not hint at any return values or side effects (e.g., whether it updates local data). Given the existence of repair_sync, the agent may need better differentiation.

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?

The schema has a single parameter 'account' with full description coverage (100%), including behavior when omitted. The description repeats this same information ('Syncs a specific account or all linked accounts if none specified'). Since the schema already fully documents the parameter, the description adds no additional semantic value, aligning with the baseline of 3.

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 states a specific verb ('Sync'), resource ('bank transactions from linked accounts'), and the providers (GoCardless/SimpleFIN). It also clarifies the scope: a specific account or all linked accounts. This makes the tool's purpose unambiguous and distinguishes it from sibling tools like repair_sync, which is about fixing sync issues.

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 when to use the tool ('Syncs...') but offers no explicit guidance on when *not* to use it or alternatives. For instance, it doesn't mention repair_sync for fixing sync problems or list_accounts for finding account IDs. The usage context is implied rather than explicitly stated.

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

spending_by_categoryB
Read-only

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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of categories to show (default 20)
end_dateNoEnd date (YYYY-MM-DD or natural language). Defaults to today.
start_dateNoStart date (YYYY-MM-DD or natural language). Defaults to start of current month.
include_incomeNoInclude income categories (default: false)

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds that the tool returns total spending and percentage per category, which is useful context. However, it does not disclose details like whether transfers are excluded, how percentages are calculated, or what happens with zero-spending categories – gaps made less severe by the read-only annotation.

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?

The description is two sentences with no filler. It leads with the core action, then states the output content. Every sentence earns its place, and the length is appropriate for the tool's simplicity.

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 read-only aggregation tool with fully documented parameters, the description is adequate but not complete. It mentions the output (totals and percentages) but omits any mention of how percentages are computed, whether the output is sorted, or how the limit parameter affects results. Since there is no output schema, a bit more detail on return semantics would improve completeness.

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 all four parameters (limit, end_date, start_date, include_income) documented in the schema. The description adds no parameter-specific details beyond the general 'date range' phrasing, so it does not exceed the baseline set by complete 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?

The description uses a specific verb ('Break down') and resource ('spending by category'), and details the output ('total spending and percentage of total'). It clearly states what the tool does, though it does not explicitly differentiate from overlapping siblings like category_trends or budget_vs_actual, which also aggregate spending.

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 is given on when to use this tool versus alternatives such as category_trends, monthly_summary, or budget_vs_actual. The description only states the tool's function, leaving the agent to infer appropriate usage from the name and sibling list.

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

spending_projectionA
Read-only

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

ParametersJSON Schema
NameRequiredDescriptionDefault
monthNoMonth to project (YYYY-MM or natural language). Defaults to current month.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true. The description adds useful behavioral context beyond that: the projection is based on the current daily spending rate, and the tool proactively warns about categories likely to exceed budget. It does not contradict the annotation.

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 with no filler. The core purpose and distinguishing warning behavior are front-loaded, and every word contributes to the definition.

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?

Given one optional parameter and a well-covered schema, the description is largely complete for tool selection and invocation. It explains the methodology and the warning behavior, though it does not detail the shape of the returned projection since no output schema exists.

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 for the 'month' parameter. The tool description adds no parameter-level detail beyond what the schema already provides, so the baseline of 3 is appropriate.

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 names a specific verb ('Project'), a clear resource (end-of-month spending per category), and a distinct computation basis (current daily spending rate). It also includes the warning behavior, which differentiates it from siblings like spending_by_category and budget_vs_actual.

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 implies when to use this tool: when you need a forward-looking spending projection based on the current pace, plus budget-exceedance warnings. It does not explicitly name alternatives or say when not to use it, but the context is sufficiently clear.

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

update_budget_amountA
Idempotent

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

ParametersJSON Schema
NameRequiredDescriptionDefault
monthNoMonth (YYYY-MM or natural language). Defaults to current month.
amountYesNew budgeted amount (human-readable, e.g., 5000.00)
categoryYesCategory name or ID

TDQS

A3.5/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false and idempotentHint=true, so the safety profile is covered. The description adds no additional behavioral context—it does not mention overwrite behavior, scope of impact, or any side effects beyond the action itself.

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, front-loaded sentence with no filler. It states the action and scope efficiently, and every word 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 simple setter with complete schema descriptions and idempotentHint annotation, the description covers the basic purpose adequately. However, it lacks any usage context or behavioral detail beyond the action, leaving some room for improvement without being inadequate.

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%, with meaningful descriptions for all three parameters including month's default and amount format. The description itself adds no extra parameter semantics, so the baseline 3 applies.

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 ('set') with a clear resource ('budgeted amount') and scope ('for a category in a specific month'). It clearly distinguishes this write operation from the many read-only budget sibling tools like get_budget_month and get_budget_summary.

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 provides no explicit guidance on when to use this tool versus alternatives, but the contrast with sibling getters makes the intended use case (modifying budget amounts) implicitly clear. There are no exclusions or alternative tool names stated.

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

update_categoryA
Idempotent

Rename or hide/unhide a budget category.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew name for the category
hiddenNoSet to true to hide, false to unhide
categoryYesCategory name or ID

TDQS

A3.6/5.0
Behavior2/5

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

Annotations already provide readOnlyHint=false and idempotentHint=true. The description only restates the tool's purpose and does not add behavioral context such as side effects, required permissions, or consequences of hiding a category beyond what annotations and the title already convey.

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?

The description is a single, front-loaded sentence with no filler. Every word contributes to stating the tool's purpose, making it easy for an agent to parse quickly.

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 tool with three fully documented parameters and meaningful annotations, the description is nearly complete. It lacks only a small explicit note about combining rename and hide operations or clarifying that name and hidden are optional independent actions, though the schema already conveys this.

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 clear descriptions for category, name, and hidden. The description adds no extra parameter meaning beyond what the schema already documents, so the baseline 3 applies.

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-resource pair: 'Rename or hide/unhide a budget category.' This clearly distinguishes it from sibling tools like create_category, delete_category, and update_category_group by naming the exact operations it supports.

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 when to use the tool based on the desired action (rename, hide, or unhide), but it does not explicitly contrast it with alternatives such as create_category or delete_category, nor does it state any exclusions or prerequisites.

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

update_category_groupA
Idempotent

Rename or hide/unhide a category group.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew name for the group
groupYesCategory group name or ID
hiddenNoSet to true to hide, false to unhide

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=false and idempotentHint=true. The description adds specific mutating behaviors (rename, hide/unhide) but does not add context on permissions, side effects on related categories, or combined-update behavior. It does not contradict the annotations.

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?

The description is a single, front-loaded sentence with no filler. It states both supported operations clearly and 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 simple update tool with fully described parameters, the description is largely complete. It does not explain whether name and hidden can be combined atomically or describe the return value, but these are minor gaps 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 the parameters are already fully documented. The description adds no extra parameter-level meaning beyond aligning the actions with name and hidden, which is already in 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?

The description uses a specific verb and resource: 'Rename or hide/unhide a category group.' It clearly distinguishes itself from sibling create/delete tools, and the action is unambiguous even next to update_category.

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 when the tool is used (when renaming or hiding/unhiding an existing group), but it does not explicitly state when to use it versus create_category_group or delete_category_group. No exclusions or alternative-routing guidance is provided.

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

update_payeeB
Idempotent

Rename a payee.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesNew name for the payee
payeeYesPayee name or ID

TDQS

B3.2/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false and idempotentHint=true, so the description adds little behavioral context. It does not mention whether renaming cascades to existing transactions, whether the payee must already exist, or any other side effects; the description mostly restates the title.

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 concise sentence with no filler or redundant phrasing. It is front-loaded with the action, but it is minimal enough that it contributes only basic purpose, not richer guidance.

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 simple two-parameter update tool with full schema coverage and idempotency annotation, the core calling contract is reasonably clear. However, the lack of usage guidance and side-effect context leaves some ambiguity about how renaming a payee affects related data, so it is only minimally 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 description coverage is 100%, with both 'payee' and 'name' clearly documented as 'Payee name or ID' and 'New name for the payee'. The description does not need to add parameter details, so the baseline 3 applies.

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 'Rename a payee.' states a specific verb and resource, making the tool's function immediately clear. It distinguishes itself from sibling tools like create_payee and delete_payee by expressing the update semantics directly.

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?

The description gives no guidance on when to use this tool versus alternatives such as create_payee or delete_payee. There are no stated conditions, prerequisites, or exclusions, leaving the agent to infer usage solely from the tool name.

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

update_transactionA
Idempotent

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

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoNew date (YYYY-MM-DD or "today", "yesterday")
notesNoNew notes
payeeNoNew payee name
amountNoNew amount (negative for expenses, positive for income). Human amounts, not cents.
clearedNoWhether the transaction is cleared
categoryNoNew category name or ID
transaction_idYesTransaction ID

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already establish that this is a mutating (readOnlyHint=false) but idempotent operation; the description adds a meaningful behavioral guarantee that unspecified fields are preserved. It does not cover return values or side effects on budgets/categories, but the partial-update disclosure goes beyond the structured metadata.

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?

The entire definition is a single 13-word sentence with the key behavior front-loaded. No filler or redundant restatement of the title.

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 7-parameter mutation with no output schema, the description plus schema covers the main call contract and the partial-update semantics. It leaves ambiguous what a successful update returns and when the sibling recategorize_transaction should be preferred, but those are secondary for making a correct call.

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?

All seven parameters have descriptions in the JSON schema, so the schema carries the semantic load. The description's 'only the fields you provide will be changed' reinforces optionality but does not add details about date formats, amounts, or categories beyond the schema.

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?

Uses a specific action verb ('Update') and a concrete resource ('existing transaction'), and the phrase 'fields you provide' signals a partial edit. It does not explicitly contrast with sibling recategorize_transaction, but it is clear enough about the general operation.

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 text implies use for modifying fields of an existing transaction and emphasizes that only supplied fields change, which orients an agent toward partial updates. It provides no explicit exclusions or mention of alternatives such as recategorize_transaction for category-only edits, so the guidance is mostly implicit.

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. 5 tool updatesv0.8.3
    • Changeddelete_category2 fields changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "description": "Must be true to delete. Without it, the tool only previews.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / confirm_name
        Added value: +{
        +  "description": "The category's exact name, echoed back as a safeguard.",
        +  "type": "string"
        +}
    • Changeddelete_category_group2 fields changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "description": "Must be true to delete. Without it, the tool only previews.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / confirm_name
        Added value: +{
        +  "description": "The group's exact name, echoed back as a safeguard.",
        +  "type": "string"
        +}
    • Changeddelete_payee2 fields changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "description": "Must be true to delete. Without it, the tool only previews.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / confirm_name
        Added value: +{
        +  "description": "The payee's exact name, echoed back as a safeguard.",
        +  "type": "string"
        +}
    • Changeddelete_rule1 field changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "description": "Must be true to delete. Without it, the tool only previews.",
        +  "type": "boolean"
        +}
    • Changeddelete_transaction1 field changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "description": "Must be true to delete. Without it, the tool only previews.",
        +  "type": "boolean"
        +}
  2. 3 tool updatesv0.7.1
    • Addedcreate_account
    • Addeddelete_account
    • Addedrepair_sync
  3. 34 tool updatesv0.6.1
    • First observedbalance_history
    • First observedbudget_vs_actual
    • First observedcategory_trends
    • First observedcreate_category
    • First observedcreate_category_group
    • First observedcreate_payee
    • First observedcreate_rule
    • First observedcreate_split_transaction
    • First observedcreate_transaction
    • First observedcreate_transfer
    • First observeddelete_category
    • First observeddelete_category_group
    • First observeddelete_payee
    • First observeddelete_rule
    • First observeddelete_transaction
    • First observedget_budget_month
    • First observedget_budget_summary
    • First observedget_categories
    • First observedget_category_balance
    • First observedget_payees
    • First observedget_rules
    • First observedget_transactions
    • First observedlist_accounts
    • First observedmonthly_summary
    • First observedrecategorize_transaction
    • First observedreconcile_currency_residual
    • First observedrun_bank_sync
    • First observedspending_by_category
    • First observedspending_projection
    • First observedupdate_budget_amount
    • First observedupdate_category
    • First observedupdate_category_group
    • First observedupdate_payee
    • First observedupdate_transaction

TDQS

B3.3/5.0

Scored across 37 tools

Disambiguation3/5

Most CRUD tools target distinct entities and actions, but the analytical tools overlap considerably (budget_vs_actual, get_budget_month, spending_by_category, monthly_summary, category_trends, spending_projection all surface spending data with slightly different scopes). recategorize_transaction also overlaps with update_transaction since category is likely an updatable field. Descriptions help, but an agent could easily misselect among the reporting tools.

Naming Consistency3/5

CRUD operations follow a clear create_/update_/delete_ pattern, but read operations are split between list_accounts and get_* tools, and analytics use noun-phrase names like budget_vs_actual, monthly_summary, and spending_by_category. The mixing is readable but not a single predictable verb_noun convention.

Tool Count2/5

37 tools is a heavy surface; the rule of thumb for coherence is 3-15 well-scoped tools, and here there are many overlapping analytics/reporting tools (budget_vs_actual, spending_projection, category_trends, spending_by_category, monthly_summary, balance_history) that could be consolidated. The CRUD breadth is defensible, but the total count feels bloated.

Completeness3/5

Core CRUD is mostly covered for accounts, categories, payees, transactions, and rules, but accounts have no update/close tool (delete_account even suggests 'prefer closing' without providing one), and rules have no update mechanism. Budgeting, sync, and reconciliation workflows are otherwise reasonably complete.

Maintenance

ActivityMaintained
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    B
    maintenance
    MCP server for integrating Actual Budget with Claude and other LLM assistants.
    17
    610 npm
    234
    TypeScript
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server that connects AI assistants to Actual Budget for budget management, enabling natural language queries, transaction creation, and spending analysis.
    390 npm
    54
    MIT
  • F
    license
    B
    quality
    D
    maintenance
    A personal MCP server that gives Claude native access to YNAB budget data.
    46
    -
  • F
    license
    Not graded
    quality
    B
    maintenance
    A remote MCP server that lets users track expenses through Claude AI, supporting add, list, edit, and delete operations via natural language.
    1
    -