Skip to main content
Glama
georgebashi

lunchmoney-mcp

by georgebashi

LunchMoney MCP Server

npm version npm downloads GitHub downloads license TypeScript MCP Badge

A Model Context Protocol (MCP) server implementation for LunchMoney, providing programmatic access to personal finance management through LunchMoney's API. Also available as an MCP Bundle (.mcpb) for easy installation in Claude Desktop.

Heads up — v3.0.0 removes get_all_crypto. The crypto tools now use LunchMoney's v2 crypto endpoints, which split manual and synced holdings into separate resources and offer no combined equivalent of v1's GET /crypto. Replace get_all_crypto with get_all_manual_crypto and get_all_synced_crypto, which together return everything it did and more. update_manual_crypto also drops its currency parameter. Nothing outside the crypto domain changed; if you don't use the crypto tools, upgrading from 2.x needs no action. See CHANGELOG.md. If you depend on get_all_crypto, pin @akutishevsky/lunchmoney-mcp@^2.2.0.

Heads up — v2.0.0 is a breaking release. This server now targets LunchMoney's v2 API (https://api.lunchmoney.dev/v2, currently in alpha). It is not backwards-compatible with v1.x of this server: tool names, fields, and endpoint shapes have changed (for example, assets is now manual_accounts, tags arrays are now tag_ids, transaction asset_id is now manual_account_id, the debit_as_negative toggle is gone, and the budget summary moved to a new /summary endpoint). See CHANGELOG.md for the full list. If you depend on v1.x, pin @akutishevsky/lunchmoney-mcp@^1.4.3.

Table of Contents

Related MCP server: Lunch Money MCP Server

Overview

This MCP server enables AI assistants and other MCP clients to interact with LunchMoney data, allowing for automated financial insights, transaction management, budgeting, and more.

Features

Comprehensive Tool Coverage

  • User Management - Access user account details

  • Categories - Full CRUD on categories and category groups

  • Tags - Full CRUD for transaction tags

  • Transactions - Full CRUD with advanced filtering, bulk update, bulk delete, splits, groups, and file attachments

  • Recurring Items - Track and manage recurring expenses, including system-suggested items

  • Budgets - Per-period budget summary, account-wide budget settings, upsert, and delete

  • Manual Accounts - Full CRUD for manually-managed accounts (formerly known as "assets")

  • Plaid Accounts - List, retrieve, and trigger sync of connected bank accounts

  • Cryptocurrency - Full CRUD for manual crypto balances, read and refresh synced crypto accounts, and manage the supported-cryptocurrency list

  • Balance History - Read, upsert, and delete monthly balance history for manual, Plaid, crypto, and deleted accounts

Key Capabilities

  • Full integration with LunchMoney API v2 (alpha)

  • Type-safe implementation with TypeScript and Zod validation

  • Token-efficient responses using TOON encoding instead of JSON, reducing token usage in AI conversations

  • Modular architecture for easy extension

  • Standard MCP server implementation using stdio transport

Usage

Installation Options

The easiest way to install this server is as an MCP Bundle in Claude Desktop:

  1. Download the latest .mcpb file from the releases page

  2. Open Claude Desktop and go to Extensions

  3. Click "Install Extension" and select the downloaded .mcpb file

  4. Enter your LunchMoney API token when prompted (get it from LunchMoney Developer Settings)

  5. The LunchMoney tools will be immediately available

Add the LunchMoney MCP server to Claude Code:

claude mcp add lunchmoney --transport stdio -e LUNCHMONEY_API_TOKEN=your-api-token-here -- npx -y @akutishevsky/lunchmoney-mcp

To enable debug logging:

claude mcp add lunchmoney --transport stdio -e LUNCHMONEY_API_TOKEN=your-api-token-here -e LUNCHMONEY_DEBUG=true -- npx -y @akutishevsky/lunchmoney-mcp

Verify the server was added:

claude mcp list
claude mcp get lunchmoney

Add the LunchMoney MCP server to Codex:

codex mcp add lunchmoney --env LUNCHMONEY_API_TOKEN=your-api-token-here -- npx -y @akutishevsky/lunchmoney-mcp

To enable debug logging:

codex mcp add lunchmoney --env LUNCHMONEY_API_TOKEN=your-api-token-here --env LUNCHMONEY_DEBUG=true -- npx -y @akutishevsky/lunchmoney-mcp

Verify the server was added:

codex mcp list
codex mcp get lunchmoney

To use this MCP server with any MCP-compatible client (such as Claude Desktop), you need to add it to the client's configuration.

Configuration

The server can be configured in your MCP client's configuration file. The exact location and format may vary by client, but typically follows this pattern:

{
    "mcpServers": {
        "lunchmoney": {
            "command": "npx",
            "args": ["@akutishevsky/lunchmoney-mcp"],
            "env": {
                "LUNCHMONEY_API_TOKEN": "your-api-token-here",
                "LUNCHMONEY_DEBUG": "true"
            }
        }
    }
}

Note: LUNCHMONEY_DEBUG is optional. Set it to "true" to enable debug logging of API requests and responses to stderr. Useful for troubleshooting.

Note: LUNCHMONEY_ATTACHMENTS_DIR is optional. attach_file_to_transaction is the only tool that reads from your filesystem, and it always verifies that a file really is a JPEG, PNG, HEIC, HEIF, or PDF before uploading it. Set this variable to a directory (say, a ~/Receipts folder) to additionally restrict it to files inside that directory — .. and symlinks that point outside are rejected. Leave it unset and any path the server can read is fair game, which is usually fine for a local stdio server but not for remote deployments.

Replace "your-api-token-here" with your actual LunchMoney API token from LunchMoney Developer Settings.

Common MCP Client Configuration Locations

Different MCP clients store their configuration in different locations:

  • Claude Desktop:

    • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

    • Windows: %APPDATA%\Claude\claude_desktop_config.json

    • Linux: ~/.config/Claude/claude_desktop_config.json

  • Other MCP Clients: Check your client's documentation for the configuration file location.

Setup Steps
  1. Locate your MCP client's configuration file (create it if it doesn't exist).

  2. Add the LunchMoney server configuration to the mcpServers section.

  3. Save the file and restart your MCP client.

  4. The LunchMoney tools should now be available in your client.

Requirements
  • Node.js 16+ installed on your system

  • npx available in your system PATH

  • Valid LunchMoney API token with appropriate permissions

Standalone Server

# Run with npx
LUNCHMONEY_API_TOKEN="your-api-token" npx @akutishevsky/lunchmoney-mcp

Remote Deployments

The bundled stdio binary covers desktop MCP clients, but Claude on mobile and the custom connectors feature in claude.ai only speak HTTP. There are two ways to expose this server remotely.

Turnkey: Cloudflare Workers

lunchmoney-mcp-cloudflare wraps this package as a Cloudflare Worker with Google sign-in and an email allowlist in front of the MCP endpoint. The whole stack fits inside Cloudflare's and Google Cloud's free tiers, and a setup.sh wizard handles KV creation, OAuth client setup, secrets, and deploy in one walkthrough. Each authenticated user runs in their own Durable Object, so the config singleton stays per-user.

Self-hosted: HTTP transport on your own host

For a single-user deployment, wire createServer() into StreamableHTTPServerTransport and serve it from any Node HTTP framework. Example with Express:

import express from "express";
import { createServer } from "@akutishevsky/lunchmoney-mcp/server";
import { initializeConfig } from "@akutishevsky/lunchmoney-mcp/config";
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";

initializeConfig(process.env.LUNCHMONEY_API_TOKEN!);
const server = createServer("1.0.0");

const transport = new StreamableHTTPServerTransport({
    sessionIdGenerator: () => crypto.randomUUID(),
});
await server.connect(transport);

const app = express();
app.use(express.json());
app.all("/mcp", (req, res) => transport.handleRequest(req, res, req.body));
app.listen(3000);

Swap Express for Hono (via @hono/node-server) or Fastify if you prefer — the transport only needs Node's IncomingMessage and ServerResponse. Add your own auth in front of /mcp — the package ships no transport-level auth.

Set LUNCHMONEY_ATTACHMENTS_DIR on any remote deployment. attach_file_to_transaction reads a path supplied by the caller off the host's filesystem. On a desktop stdio server the caller and the file owner are the same person, so that is unremarkable. Once the server is reachable over HTTP they are different principals, and an unconfined read is a way for a remote caller — or a prompt-injected model — to pull files off your host. Point the variable at a dedicated directory and keep nothing else in it. The content-type check (only real JPEG/PNG/HEIC/HEIF/PDF files upload) applies either way, but it is a backstop, not a substitute.

Multi-tenant warning. This pattern serves one user from one process with one shared API token. To serve multiple users from a single Node process you'd hit the single-tenant config singleton; fork the process per user or use the Cloudflare option above (each user gets their own isolate).

Example Prompts

Here are some example prompts you can use with the LunchMoney MCP server:

Account Overview

  • "Show me my LunchMoney account details"

  • "What's my current account status?"

Category Management

  • "List all my spending categories"

  • "Create a new category called 'Subscriptions' with a monthly budget of $100"

  • "Show me details for my 'Food & Dining' category"

  • "Create a category group for all my entertainment expenses"

  • "Delete the 'Unused Category' and reassign its transactions to 'Miscellaneous'"

Transaction Management

  • "Show me all transactions from last month"

  • "Find all transactions over $100 in the past week"

  • "Create a new expense for $45.99 at Amazon in the Shopping category"

  • "Update transaction #12345 to change the amount to $50"

  • "Show me all pending transactions"

  • "Group these coffee shop transactions together"

Budgeting

  • "Show me my budget summary for this month"

  • "Set a budget of $500 for Groceries this month"

  • "Remove the budget for Entertainment category"

  • "How much have I spent vs budgeted in each category?"

Manual Account Tracking

  • "List all my manual accounts"

  • "Create a new manual account for my savings account with a balance of $10,000"

  • "Update my investment account balance to $25,000"

  • "Close my old credit card account"

Recurring Expenses

  • "Show me all my recurring expenses"

  • "What subscriptions do I have?"

  • "List recurring items for the next 3 months"

Banking Integration

  • "Show me all my connected Plaid accounts"

  • "Refresh my bank account data"

  • "Trigger a sync for my checking account"

Cryptocurrency

  • "Show me all my crypto holdings"

  • "Update my Bitcoin balance to 0.5 BTC"

  • "List all my manually tracked crypto assets"

  • "Add a cold wallet holding 0.85 BTC called Ledger Cold Storage"

  • "Refresh my Coinbase account and show the updated balances"

  • "Which cryptocurrencies can I track manually?"

Net Worth & Balance History

  • "Show me how my net worth changed over the last 12 months"

  • "What was my savings account balance in March 2026?"

  • "Set my car's value to $18,000 for June 2026"

  • "Clear the balance history for my old brokerage account"

Analysis & Insights

  • "What are my top spending categories this month?"

  • "Show me all transactions tagged as 'vacation'"

  • "Find all transactions at coffee shops"

  • "List all transactions that need to be categorized"

Available Tools

User Tools

  • get_user - Retrieve current user details

Category Tools

  • get_all_categories - List all categories (supports format and is_group filters)

  • get_single_category - Get details for a specific category or category group

  • create_category - Create a category or category group (set is_group=true plus children)

  • update_category - Update properties; replaces the children list on category groups

  • delete_category - Delete a category; pass force=true to override dependency check

Tag Tools

  • get_all_tags - List all tags

  • get_single_tag - Get a tag by ID

  • create_tag - Create a new tag

  • update_tag - Update tag properties

  • delete_tag - Delete a tag (with force to override dependents)

Transaction Tools

  • get_transactions - List transactions with extensive filtering options (date range, account, category, tag, status, pending, metadata, files, etc)

  • get_single_transaction - Get full transaction details (always includes plaid_metadata, custom_metadata, files, and children for split/group parents)

  • create_transactions - Insert 1–500 transactions in one call

  • update_transaction - Partial update of one transaction

  • delete_transaction - Delete one transaction (cannot be split/group)

  • update_transactions_bulk - Bulk update 1–500 transactions

  • delete_transactions_bulk - Bulk delete 1–500 transactions by ID

  • create_transaction_group - Create a transaction group from existing transactions

  • delete_transaction_group - Ungroup a transaction group

  • split_transaction - Split a transaction into 2–500 children

  • unsplit_transaction - Undo a previous split

  • attach_file_to_transaction - Upload a local file (jpeg/png/heic/heif/pdf, ≤10MB), type verified from its contents

  • get_transaction_attachment_url - Get a signed download URL for a file attachment

  • delete_transaction_attachment - Delete a file attachment

Recurring Items Tools

  • get_recurring_items - List recurring items for a date range (include_suggested for system suggestions)

  • get_single_recurring_item - Get a recurring item by ID

Budget Tools

  • get_budget_summary - Per-category budget summary (backed by /summary); supports occurrences, totals, rollover-pool toggles

  • get_budget_settings - Account-wide budget period and display settings

  • upsert_budget - Create or update a budget for a category and period

  • remove_budget - Remove a budget for a category and period

Manual Account Tools

  • get_all_manual_accounts - List all manually-managed accounts (formerly "assets")

  • get_single_manual_account - Get a manual account by ID

  • create_manual_account - Create a new manually-managed account

  • update_manual_account - Update properties of a manual account

  • delete_manual_account - Delete a manual account; optionally also delete its transactions / balance history

Plaid Account Tools

  • get_all_plaid_accounts - List all connected Plaid accounts

  • get_single_plaid_account - Get a Plaid account by ID

  • trigger_plaid_fetch - Trigger fetch of latest data from Plaid (optionally scoped to a date range or account)

Crypto Tools

  • get_supported_cryptocurrencies - List the cryptocurrencies supported for manual tracking

  • add_supported_cryptocurrency - Add a cryptocurrency to the supported list from its CoinGecko coin-page URL

  • get_all_manual_crypto - List all manually-managed crypto balances

  • get_single_manual_crypto - Get a single manually-managed crypto balance by ID

  • create_manual_crypto - Create a manually-managed crypto asset

  • update_manual_crypto - Update a manual crypto balance's name, display name, institution name, or balance

  • delete_manual_crypto - Delete a manual crypto asset (irreversible)

  • get_all_synced_crypto - List synced crypto accounts and their nested per-symbol balances

  • get_single_synced_crypto - Get a single synced crypto account by ID

  • get_synced_crypto_balance - Get one balance inside a synced crypto account by symbol

  • refresh_synced_crypto - Trigger a balance refresh for a synced crypto account

Balance History Tools

  • get_balance_history - Get monthly balance history across all accounts (powers the Net Worth views); optional start_month/end_month (YYYY-MM) range filter

  • get_account_balance_history - Get monthly balance history for one account (manual, plaid, crypto_manual, or deleted)

  • upsert_account_balance_history - Create or update monthly balance entries for one account (past months only; all-or-nothing)

  • delete_account_balance_history - Delete all historical balance entries for one account

  • get_crypto_synced_balance_history - Get monthly balance history for a synced crypto holding by account id + ticker symbol

  • upsert_crypto_synced_balance_history - Create or update monthly balance entries for a synced crypto holding

  • delete_crypto_synced_balance_history - Delete all historical balance entries for a synced crypto holding

  • delete_balance_history_entry - Delete a single historical balance entry by id

  • update_deleted_account_details - Update the display details (name, institution, type, subtype, mask) shown for a deleted account's balance history

Development

Project Structure

lunchmoney-mcp/
├── src/
│   ├── index.ts           # Server entry point
│   ├── config.ts          # Configuration management
│   ├── types.ts           # TypeScript type definitions
│   └── tools/             # Tool implementations
│       ├── user.ts
│       ├── categories.ts
│       ├── tags.ts
│       ├── transactions.ts
│       ├── recurring-items.ts
│       ├── budgets.ts
│       ├── manual-accounts.ts
│       ├── plaid-accounts.ts
│       ├── crypto.ts
│       └── balance-history.ts
├── build/                 # Compiled JavaScript output
├── package.json
├── tsconfig.json
└── README.md

Building

# Build the MCP server
npm run build

# Build MCPB package for distribution
npm run build:mcpb

Adding New Tools

  1. Create a new file in src/tools/

  2. Implement tool handlers using the MCP SDK

  3. Register tools in src/index.ts

  4. Add types to src/types.ts if needed

Embedding as a library

The package exposes subpath entry points so it can be embedded in a custom transport (for example, a Cloudflare Worker that serves the MCP protocol over HTTP) rather than only the bundled stdio binary:

import { createServer } from "@akutishevsky/lunchmoney-mcp/server";
import { initializeConfig } from "@akutishevsky/lunchmoney-mcp/config";

initializeConfig(process.env.LUNCHMONEY_API_TOKEN!);
const server = createServer("1.0.0");
// connect `server` to whatever transport you need

initializeConfig must be called before any tool is invoked, or the first request throws "Configuration not initialized.".

Single-tenant assumption. The config is held in a module-level singleton. That is safe on per-isolate runtimes — each user gets their own isolate, so there is no shared mutable state to race on. It is not safe on shared-process multi-tenant Node hosts (e.g. one Express or Hono process serving multiple users): concurrent initializeConfig calls would race and leak tokens between requests. Those consumers need to fork per-user or refactor the singleton before exposing the package.

API Reference

The server implements the full LunchMoney API v2. For detailed API documentation, see:

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

MIT License

Available Tools

59 tools
add_supported_cryptocurrencyA

Add a new cryptocurrency to the supported manual-crypto list by submitting its CoinGecko coin-page URL. Only needed when get_supported_cryptocurrencies does not already list the symbol you want to track.

ParametersJSON Schema
NameRequiredDescriptionDefault
coingecko_urlYesCoinGecko coin-page URL in the form https://www.coingecko.com/{locale}/coins/{id}, e.g. https://www.coingecko.com/en/coins/cardano.

TDQS

A4.2/5.0
Behavior3/5

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

The annotations only include idempotentHint: false, so the description carries most of the behavioral disclosure burden. It clarifies that this is a non-idempotent mutating add operation and gives a precondition, but it does not disclose duplicate-handling behavior, success/failure semantics, or side effects if the symbol is already 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?

Two sentences, no filler. The first sentence states the core action and input; the second gives the decisive usage condition. This is appropriately compact and 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?

For a single-parameter mutation tool with no output schema, the description covers the action, input format, and when it is needed. The only notable gap is that it does not describe what the API returns or how duplicate submissions are handled, but these are not critical for selecting and invoking the tool 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 fully documents coingecko_url with format and example, so schema coverage is 100%. The description adds no significant parameter meaning beyond saying the URL is a CoinGecko coin-page URL, which the schema already conveys.

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 ('Add'), a specific resource ('supported manual-crypto list'), and the required input mechanism (CoinGecko coin-page URL). It also names get_supported_cryptocurrencies as the related check, distinguishing this write operation from the read-only list operation.

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?

The description explicitly states when this tool is needed: only when get_supported_cryptocurrencies does not already list the symbol. This gives clear when/when-not guidance and points to the sibling tool to consult first.

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

attach_file_to_transactionA

Attach a local image or PDF receipt (max 10MB) to a transaction. Allowed types: image/jpeg, image/png, image/heic, image/heif, application/pdf. The file is read from the local filesystem of the host running this MCP server, and its type is determined from its actual contents — files that are not a real image or PDF are rejected. If LUNCHMONEY_ATTACHMENTS_DIR is set on the host, only files inside that directory can be attached.

ParametersJSON Schema
NameRequiredDescriptionDefault
notesNoOptional notes describing the attachment.
file_pathYesAbsolute or relative path to the receipt file on the local filesystem. Must be a regular file whose contents are a JPEG, PNG, HEIC, HEIF, or PDF. If the host sets LUNCHMONEY_ATTACHMENTS_DIR, the path must resolve inside that directory.
content_typeNoOptional assertion of the file's MIME type. The server always determines the real type from the file contents; if this disagrees with it, the request is rejected. Omit unless you need that check.
transaction_idYesID of the transaction to attach the file to.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations provide only idempotentHint=false, so the description carries the full burden of behavioral disclosure. It thoroughly explains that the file is read from the host's local filesystem, the type is determined from actual contents rather than extension, invalid files are rejected, and LUNCHMONEY_ATTACHMENTS_DIR restricts accessible paths. This far exceeds the minimal 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?

Three dense sentences front-load the action and object, then pack in all critical constraints: allowed types, size cap, local filesystem source, content-based validation, and environment-directory restriction. No filler or repeated schema content.

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 mutation tool with no output schema, the description is remarkably complete: it covers what is attached, what file types are allowed, the size limit, where the file comes from, how validation works, and an environment-specific restriction. Nothing needed to correctly invoke the tool is missing.

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 meaningful tool-level semantics beyond the schema: the 10MB size limit, the local-filesystem source, and the content-sniffing behavior. These details help the agent understand the true constraints on file_path and content_type without being redundant.

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 ('Attach') with a clear resource ('a transaction') and object ('a local image or PDF receipt'), and distinguishes this from sibling tools like get_transaction_attachment_url and delete_transaction_attachment by its action alone. It is immediately obvious 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 Guidelines4/5

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

The description clearly establishes when to use this tool: when a receipt file needs to be attached to a transaction. It provides strong contextual constraints (local filesystem, allowed MIME types, max size, environment-directory restriction) but does not explicitly name alternatives or state when not to use it. This is clear context without exclusions.

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

create_categoryA

Create a new category or a category group. Set is_group=true to create a category group; supply children as an array of existing category IDs and/or strings (names of new sub-categories to create).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of the category. 1-100 characters.
archivedNoWhether the category should be archived.
childrenNoOnly valid when is_group is true. Array of existing category IDs (numbers) and/or names of new sub-categories to create (strings).
group_idNoIf set, assigns the new category to an existing category group. Cannot be set if is_group is true.
is_groupNoIf true, creates a category group instead of a category. When true, group_id may not be set; use children to assign existing categories.
is_incomeNoWhether transactions in this category should be treated as income.
descriptionNoOptional description. Up to 200 characters.
exclude_from_budgetNoWhether transactions in this category should be excluded from budgets.
exclude_from_totalsNoWhether transactions in this category should be excluded from calculated totals.

TDQS

A4.2/5.0
Behavior4/5

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

The only annotation is idempotentHint=false, so the description must carry behavioral weight. It discloses a notable side effect: passing strings in children creates new sub-categories during the same call. It does not cover return values or failure modes, but the core recursive behavior is clearly stated and 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?

Two short, front-loaded sentences with no filler. The first sentence states the core purpose and the second covers the mode-specific behavior. Every word contributes to invocation 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?

Given 9 parameters, no output schema, and minimal annotations, the description captures the most important invocation nuances: the is_group switch and the dual ID/string behavior of children. The remaining parameters are fully documented in the schema. Return-value details are absent, but the description is sufficient for correctly selecting and calling the tool.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description restates the is_group and children behavior seen in the schema rather than adding new parameter meaning. It usefully frames the category versus category-group decision, but does not go beyond the schema's own 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 uses a specific verb and resource: 'Create a new category or a category group.' It clearly distinguishes the dual purpose of the tool and immediately explains how the two modes are selected. This is enough to tell it apart from sibling tools like create_tag or create_transaction_group.

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?

No explicit when-not-to-use or alternative is named, but there is no close sibling for category creation. The description gives clear context for the two main usage modes: set is_group=true for a category group, and use children to add existing IDs or names of new sub-categories. This effectively communicates usage without leaving mode selection to inference.

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

create_manual_accountB

Create a new manually-managed account. (Formerly create_asset.)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of the account. 1-45 characters.
typeYesPrimary type of the manual account.
balanceYesCurrent balance of the account.
subtypeNoOptional subtype (e.g., retirement, checking, savings).
currencyNoThree-letter lowercase currency code (defaults to primary currency).
closed_onNoDate the account was closed (YYYY-MM-DD). If set, status is forced to closed.
display_nameNoDisplay name. If unset, derived from institution_name and name.
balance_as_ofNoDate or datetime the balance is as of (ISO 8601).
institution_nameNoName of the institution holding the account.
exclude_from_transactionsNoIf true, transactions cannot be assigned to this account.

TDQS

B3.3/5.0
Behavior2/5

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

The description discloses only the obvious mutation intent ('Create') and does not add behavioral context beyond what annotations provide. With only idempotentHint=false annotated, there is no mention of side effects, whether duplicates are allowed, required permissions, or what happens after creation. The description does not contradict the annotations, but it also does not meaningfully expand on them.

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 extremely concise, with the core purpose front-loaded in the first sentence. The parenthetical about the former name is short and provides useful legacy context. Every element earns its place, and no verbose or redundant content is present.

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, combined with the fully documented schema, is minimally viable for an agent to understand the core operation and required parameters. However, it lacks broader context such as when to create a manual account versus other account types and what the tool returns, and the annotations are sparse. These gaps prevent it from being 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?

The input schema has 100% coverage, with each parameter including a clear description, so the description itself need not explain parameters. The tool description adds no parameter-specific meaning beyond what the schema already provides, which aligns with the baseline score for high schema coverage.

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

Purpose5/5

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

The description states a specific action ('Create') and a specific resource ('a new manually-managed account'), making it immediately clear what the tool does. The phrase 'manually-managed' distinguishes it from synced or crypto account creation tools, and the parenthetical notes the former name without obscuring the current purpose.

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_manual_crypto, create_transactions, or synced account tools. It only mentions the former name 'create_asset', which is historical context, not usage direction. An agent must infer appropriate use entirely from the tool 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.

create_manual_cryptoA

Create a manually-managed crypto asset. The symbol must match one returned by get_supported_cryptocurrencies.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesUser-defined name for the manual crypto asset, e.g. 'Cold Wallet BTC'.
symbolYesCryptocurrency symbol to track, e.g. 'btc'. Must match a symbol from get_supported_cryptocurrencies.
balanceYesBalance as a numeric string with up to 18 decimal places, e.g. '0.852341920145782301'. Pass a string to avoid losing precision.
display_nameNoOptional display name. If omitted, clients may derive one from institution_name and name.
institution_nameNoOptional institution or wallet provider display name, e.g. 'Ledger'.

TDQS

A4/5.0
Behavior3/5

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

The description adds the symbol-validation constraint, which is beyond the sparse annotation (idempotentHint=false). However, it doesn't reveal behaviors like duplicate handling, creation side effects, or failure modes, leaving much of the behavioral burden on 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?

Two short sentences, front-loaded with the core purpose and then the key constraint. No redundancy or filler.

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, the description combined with the complete schema is adequately informative. It lacks an explicit output description, but with no output schema defined, this is acceptable.

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's mention of symbols matching get_supported_cryptocurrencies is useful but also already embedded in the symbol parameter's description.

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 'Create a manually-managed crypto asset' with a specific verb and resource. The distinction from sibling tools (delete_manual_crypto, update_manual_crypto, get_all_manual_crypto) is evident from the name and phrasing.

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 prerequisite of matching a symbol from get_supported_cryptocurrencies gives concrete guidance on a precondition to calling this tool. It doesn't explicitly mention alternatives or exclusions, but the context is clear enough for an agent to know when to use it.

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

create_tagC

Create a new tag.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of the tag. 1-100 characters.
archivedNoIf true, the tag is created archived.
text_colorNoOptional text color of the tag.
descriptionNoOptional description. Up to 200 characters.
background_colorNoOptional background color of the tag.

TDQS

C2.9/5.0
Behavior2/5

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

Annotations only include idempotentHint=false, which is minimal. The description does not disclose any behavioral traits beyond the basic creation action, such as whether creating a tag with an existing name fails, whether colors are validated, or what the response contains. With no output schema and sparse annotations, the description carries the burden but doesn't add behavioral context.

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 that is front-loaded with the action and resource. It is appropriately sized for a simple create operation, though it could add a bit more context without becoming verbose.

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 create tool with 5 parameters and no output schema, the description is thin. It doesn't explain what happens after creation, whether the tag is immediately usable, or any constraints like uniqueness. The schema covers parameters, but the description lacks operational context that an agent would need 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 description coverage is 100%, so the schema already documents all five parameters. The description adds no parameter-level meaning beyond what the schema provides, so the baseline of 3 applies. It doesn't clarify relationships between parameters (e.g., whether text_color and background_color are validated together).

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 'Create a new tag' uses a specific verb and resource, clearly indicating the action. It distinguishes from siblings like update_tag and delete_tag, though it doesn't explicitly differentiate from other create_* tools, which is less necessary given the resource is named.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives. It doesn't mention that tags are likely used to categorize transactions, nor does it state any prerequisites or exclusions. The context is implied by the name and siblings, but there is no explicit usage direction.

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

create_transaction_groupA

Create a transaction group from 2-500 existing transactions. Source transactions are hidden from get_transactions and accessible via the new group's children (set include_children=true on get_single_transaction). Cannot include split or recurring transactions.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesIDs of existing transactions to group together.
dateYesDate for the new grouped transaction (YYYY-MM-DD).
notesNo
payeeYesPayee for the new grouped transaction.
statusNoStatus for the new grouped transaction. Defaults to reviewed.
tag_idsNoTag IDs to apply to the new group.
category_idNoCategory for the group. If unset and all children share a category, the group inherits it.

TDQS

A4.2/5.0
Behavior4/5

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

The description discloses a key behavioral trait beyond the annotations: source transactions are hidden from get_transactions and become accessible via the new group's children with include_children=true. It also states a constraint (cannot include split or recurring transactions) that is not visible in the schema. The only annotation is idempotentHint=false, which the description does not contradict, and the description adds meaningful behavioral 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 three sentences with no wasted words. It front-loads the core action and constraints, then adds the behavioral consequence and exclusions. Every sentence 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?

Given the tool's moderate complexity (7 params, 3 required) and no output schema, the description covers the essential behavioral context: what happens to source transactions, how to access them later, and what inputs are invalid. It does not mention error cases or whether the operation is reversible, but the idempotentHint=false annotation and the clear constraints make it sufficiently complete for an agent to invoke 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 86%, so the schema already documents most parameters. The description adds context for the 'ids' parameter by explaining the 2-500 range and the behavioral consequence of grouping, but it does not add much beyond the schema for date, payee, notes, status, tag_ids, or category_id. The category_id inheritance behavior is already in the schema description, so the description adds minimal extra value.

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 ('Create'), a resource ('transaction group'), and a precise scope ('from 2-500 existing transactions'). It also distinguishes the tool from siblings by noting that source transactions are hidden from get_transactions and accessible via the new group's children, which clearly differentiates it from create_transactions and other transaction 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 description provides clear context on when to use this tool: when grouping existing transactions. It also gives an explicit exclusion ('Cannot include split or recurring transactions'), which helps an agent avoid invalid calls. However, it does not explicitly name alternative tools for creating individual transactions or splitting/unsplitting, though the sibling list makes this inferable.

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

create_transactionsA

Insert one or more transactions (1-500 per call). Returns inserted transactions plus any skipped duplicates.

ParametersJSON Schema
NameRequiredDescriptionDefault
apply_rulesNoApply rules associated with the transaction's manual_account_id.
transactionsYesArray of transactions to insert (1-500).
skip_duplicatesNoFlag transactions that match an existing transaction's date+payee+amount+account as duplicates and skip them. Note: external_id deduplication always runs regardless of this flag.
skip_balance_updateNoIf true, do not update the manual account's balance when inserting these transactions.

TDQS

A4/5.0
Behavior3/5

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

Annotations only provide idempotentHint=false; the description adds that duplicate transactions are skipped and that the response includes inserted transactions plus skipped duplicates, and states the per-call limit. It doesn't mention default side effects such as balance updates or rule application, though those are covered in the parameter descriptions.

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 that front-load the action and resource, then add the key constraint and return behavior. No filler or repetition of schema details.

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 rich schema covers parameter semantics and the description supplies the missing return-value information. It is slightly incomplete only in not flagging default mutating side effects, but those are inferable from skip_balance_update's description.

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 parameters already have detailed schema descriptions, so the description adds little beyond echoing the 1-500 array constraint. Baseline 3 is appropriate because 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 names a specific action ('Insert') and resource ('transactions'), and adds a batch-size range and return behavior. This clearly distinguishes it from sibling tools like get_transactions, update_transactions_bulk, and create_transaction_group.

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 makes the use case clear: call this when you need to add one or more transactions. It doesn't explicitly name alternatives or exclusions, but the verb and resource leave little ambiguity against the sibling set.

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

delete_account_balance_historyA
Destructive

Delete ALL historical balance entries for a single account. This is irreversible and affects the Net Worth views. To remove a single month, use delete_balance_history_entry instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
account_idYesId of the account whose entire balance history should be deleted.
account_typeYesType of account the balance history belongs to. Use manual for manually-managed accounts, plaid for synced bank accounts, crypto_manual for manually-managed crypto, and deleted for accounts that no longer exist but still have history. Synced crypto uses the dedicated crypto_synced tools instead.

TDQS

A4.5/5.0
Behavior4/5

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

The annotations already declare destructiveHint=true, but the description adds meaningful behavioral context: the operation is irreversible and affects Net Worth views. It also clarifies the scope ('ALL') which is crucial for a destructive operation. This goes beyond what the annotation alone conveys.

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 wasted words. The primary action and scope are front-loaded, the consequence is stated clearly, and the alternative tool is mentioned succinctly. 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, irreversible operation with two well-documented parameters, this description is complete. It explains scope, irreversibility, impact on Net Worth, and the correct alternative for a narrower operation. No output schema exists, but for a delete tool this is acceptable and not a meaningful 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 both account_id and account_type are already documented in the input schema. The main description does not add parameter-specific details, but it doesn't need to because the schema already explains each parameter, including the account_type enum semantics and the note about synced crypto using dedicated tools.

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'), a precise resource ('ALL historical balance entries for a single account'), and the scope ('ALL'), clearly distinguishing it from the sibling tool delete_balance_history_entry. An agent can immediately understand what this tool does and what it does not do.

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?

The description explicitly provides the when-to-use guidance: use this when deleting the entire history, and use delete_balance_history_entry when removing a single month. It names the alternative tool directly, leaving no ambiguity about routing between the two.

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

delete_balance_history_entryA
Destructive

Delete a single historical balance entry by its id. The id must come from an entry with type=historical in a balance history response; ephemeral current entries have no id and cannot be deleted.

ParametersJSON Schema
NameRequiredDescriptionDefault
entry_idYesId of the historical balance entry to delete. Call get_balance_history or get_account_balance_history first to discover ids.

TDQS

A4.3/5.0
Behavior4/5

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

The destructiveHint annotation already flags this as a destructive operation, and the description adds meaningful context by specifying exactly what is deleted and which entries cannot be deleted. It clarifies the 'current' entry edge case, which is valuable beyond the annotation alone.

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 primary action is front-loaded, followed by the key constraint and prerequisite in a natural order.

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 single-parameter destructive tool with a strong annotation and complete schema description, everything an agent needs to call it correctly is present: what to delete, how to find the id, and what cannot be deleted.

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 parameter semantics are fully documented in the schema. The description restates the id-based deletion but does not add significant new meaning beyond what the schema already provides.

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 ('Delete'), a specific resource ('a single historical balance entry'), and the mechanism ('by its id'). It also distinguishes deletable entries from ephemeral current entries, 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 Guidelines4/5

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

It clearly explains when the tool applies: the entry must be historical and have an id, and current entries cannot be deleted. The schema reinforces that the id should be discovered via get_balance_history or get_account_balance_history. It does not name alternative deletion tools, but the intended usage context is clear.

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 single category or category group. By default fails (HTTP 422) if dependencies exist, returning a structured dependents payload. Set force=true to delete and disassociate from all related budgets, transactions, recurring items, etc. Force delete is irreversible.

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNoIf true, force deletion even if dependencies exist (irreversible).
category_idYesId of the category or category group to delete.

TDQS

A4.2/5.0
Behavior4/5

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

The description discloses the default failure mode (HTTP 422 with structured dependents payload), the force=true behavior, and irreversibility. The destructiveHint annotation is true, and the description aligns with it, adding valuable context about what happens with dependencies.

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 waste. The default behavior is front-loaded, the force option is explained, and the irreversibility warning is included. Every sentence 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 destructive tool with no output schema, the description covers the key decision point (force flag), the failure mode, and the consequence. It doesn't describe the success response format, but that's less critical for a delete operation. The description is complete enough 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 description coverage is 100%, so the schema already documents both parameters. The description adds context about force=true's irreversibility and the default failure behavior, but doesn't add much beyond the schema's parameter descriptions. Baseline 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 clearly states the tool deletes a single category or category group, distinguishing it from sibling tools like delete_tag or delete_transaction. It also specifies the key behavior of failing by default when dependencies exist, which differentiates it from a simple delete.

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 explains when to use force=true vs default behavior, which is essential usage guidance. It doesn't explicitly name alternative tools for deleting other resources, but the context of category deletion is clear and the force flag guidance is strong.

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

delete_crypto_synced_balance_historyA
Destructive

Delete ALL historical balance entries for a synced crypto holding. This is irreversible and affects the Net Worth views.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesTicker symbol of the holding whose history should be deleted (e.g. eth).
account_idYesId of the synced crypto account.

TDQS

A4/5.0
Behavior4/5

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

Annotations only flag destructiveness; the description adds meaningful context that the operation is irreversible and affects Net Worth views. This goes beyond the structured annotation and helps an agent understand impact.

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 action and scope, with no filler. Every word contributes.

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 two-parameter destructive tool with no output schema, the description covers scope, irreversibility, and downstream impact. It could mention confirmation/return behavior or contrast with single-entry deletion, but nothing essential 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?

The input schema already documents both parameters with 100% coverage, including descriptions for symbol and account_id. The description adds no additional parameter-level meaning, 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?

States a precise action ('Delete ALL historical balance entries'), a specific resource ('synced crypto holding'), and the scope ('ALL'), which clearly distinguishes it from single-entry deletion siblings like delete_balance_history_entry.

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 word 'ALL' implies this is the full-history deletion tool, and 'synced crypto holding' identifies the target. However, it does not explicitly name alternatives or state when not to use it, so usage guidance is only implicit.

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

delete_manual_accountA
Destructive

Delete a manually-managed account. Optionally also delete its transactions/rules/recurring items, and/or its balance history. Both deletion options are irreversible.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdYesId of the manual account to delete.
delete_itemsNoIf true, also deletes any transactions, rules, and recurring items associated with this account.
delete_balance_historyNoIf true, also deletes any balance history associated with this account.

TDQS

A4.1/5.0
Behavior4/5

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

The destructiveHint annotation is supplemented well by the description: it discloses that transactions, rules, recurring items, and balance history can be optionally removed, and explicitly warns that both deletion options are irreversible. This adds meaningful behavioral context 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 compact and well-structured: the primary action is front-loaded, the optional behaviors are summarized in a single sentence, and the irreversibility warning is placed directly after. No filler or redundant detail is present.

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 simple required parameter and fully documented optional flags, the description covers the core operation, the cascading deletions, and the irreversibility warning. An agent has enough information to invoke the tool correctly without missing critical 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?

The input schema already documents all three parameters with 100% coveragecars. The description's mention of transactions, rules, recurring items, and balance history mostly mirrors the schema's property descriptions rather than adding new semantic meaning, so it stays at the schema-covered baseline.

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 manually-managed account.' This immediately identifies the operation and, alongside sibling tools like delete_manual_crypto, clearly distinguishes this as the deletion tool for manual non-crypto accounts.

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 explains how to use the optional cascade flags, which is useful for invoking the tool correctly. However, it does not explicitly state when to prefer this tool over sibling deletion tools such as delete_manual_crypto or delete_account_balance_history, leaving that distinction to be inferred 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.

delete_manual_cryptoA
Destructive

Delete a manually-managed crypto asset. If the asset has balance history, keep_history must be set explicitly or the API rejects the request. Irreversible.

ParametersJSON Schema
NameRequiredDescriptionDefault
crypto_idYesId of the manual crypto balance to delete.
keep_historyNoSet true to preserve the balance history, false to delete it too. Required if the asset has balance history.

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the destructiveHint annotation, the description adds critical behavioral detail: the operation is irreversible, and the API rejects the request if balance history exists and keep_history is not explicitly set. This materially changes how the agent should invoke the tool.

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

Conciseness5/5

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

Three short sentences, each earning its place: one identifies the target, one states the critical precondition, and one states irreversibility. There is no filler, repetition, or unnecessary detail.

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?

With complete parameter schemas, a destructiveHint annotation, and the description covering the key behavioral caveat, the agent has everything necessary to call this tool correctly. The absence of an output schema does not create a gap for this straightforward deletion operation.

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 baseline is 3. The description reinforces the keep_history condition and notes the rejection consequence, but it does not add substantial new parameter-level meaning beyond what the schema already states.

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 a manually-managed crypto asset.' The qualifier 'manually-managed' distinguishes it from sync-related sibling tools and leaves no ambiguity about what the tool operates on.

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 frames the tool as applying to manually-managed crypto assets, which gives the agent a solid context for selection. It does not explicitly name a sibling alternative or state when not to use it, but the 'manually-managed' qualifier effectively excludes synced crypto operations.

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

delete_tagA
Destructive

Delete a tag. By default fails (HTTP 422) with a structured dependents payload if the tag is in use by transactions or rules. Set force=true to delete and disassociate from those records.

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNoIf true, force deletion even if dependencies exist (irreversible).
tagIdYesId of the tag to delete.

TDQS

A4.5/5.0
Behavior5/5

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

The annotation only signals destructiveHint=true. The description adds substantial behavioral detail beyond that: the HTTP 422 failure case, the structured dependents payload, and the disassociation behavior when force=true. This is exactly the kind of context an agent needs before invoking a destructive operation.

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 tight sentences deliver the core action, default failure behavior, and the force option with zero filler. The most important information is front-loaded, and every clause 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 delete tool with annotations covering destructiveness and a schema covering both parameters, this description is complete. It explains the failure payload, the success path for forced deletion, and the disassociation effect. No additional context is necessary 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 description coverage is 100%, so the input schema already documents tagId and force, including the irreversibility of force. The description reinforces force's effect in the context of dependency disassociation, but it adds no genuinely new parameter-level semantics. Baseline 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 clearly identifies a specific verb and resource: 'Delete a tag.' It goes beyond a simple action by explaining the default failure mode and the force option, making the tool's purpose unmistakable and distinct from create_tag, update_tag, and get_single_tag.

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 operational context: use default deletion for tags not in use, and set force=true when the tag must be deleted despite dependencies. It does not explicitly name alternatives or state when not to use this tool, but the tag-specific behavior is unambiguous.

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 single transaction. Fails for split/group transactions and their parents — unsplit/ungroup first. Irreversible.

ParametersJSON Schema
NameRequiredDescriptionDefault
transaction_idYesID of the transaction to delete.

TDQS

A4.2/5.0
Behavior4/5

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

The destructiveHint annotation already marks this as destructive; the description adds concrete behavioral context beyond it: failure on split/group transactions and their parents, the requirement to unsplit/ungroup first, and irreversibility. This is valuable, though it stops short of describing failure semantics (e.g., error type) or side effects.

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 carry the full behavioral contract: the action, the key failure condition, the prerequisite action, and irreversibility. Every sentence earns its place, and the most important fact (what the tool does) is 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?

For a single-parameter delete tool with a destructiveHint annotation and one complete schema description, the description covers the essential operational knowledge: scope, preconditions, and irreversibility. It omits return/error behavior, but that is minor for such a simple operation and 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?

The schema covers 100% of the parameter documentation (transaction_id with a clear description), so the baseline is 3. The description does not add any additional parameter-level detail, but none is needed given the complete 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 states a specific verb and resource: 'Delete a single transaction.' It distinguishes from siblings like delete_transactions_bulk and delete_transaction_group by emphasizing 'single' and by noting the split/group constraint. The scope 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 Guidelines4/5

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

The description gives clear usage context: this tool deletes exactly one transaction, and it explicitly warns that split/group transactions and their parents must be unsplit/ungrouped first. It does not name alternatives like delete_transactions_bulk or delete_transaction_group, but the 'single' qualifier and the precondition effectively route the agent away from incorrect use.

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

delete_transaction_attachmentB
Destructive

Delete a transaction file attachment. Irreversible.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_idYesID of the file attachment to delete.

TDQS

B3.4/5.0
Behavior3/5

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

The destructiveHint annotation already signals that the operation destroys data. The description adds the important caveat 'Irreversible,' which provides useful behavioral context beyond the annotation. It also identifies what is destroyed, but it does not describe response behavior, error conditions, or any cascading effects on the associated transaction.

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: the first states the action, and the second delivers a meaningful caution about irreversibility. There is no filler, no unnecessary restatement of the schema, and the important warning is placed immediately after the verb.

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 one-parameter destructive action with full schema coverage and a destructive annotation, the description is nearly complete: it names the object, the effect, and the irreversible nature of the operation. The main gaps are explicit sibling distinction and expected return behavior, but those are minor for such a simple delete operation.

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 only parameter, file_id, with the description 'ID of the file attachment to delete,' so the semantic burden is already carried by the schema. The tool description adds no additional parameter-level detail beyond what the schema provides, warranting the baseline score of 3.

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 and resource, 'Delete a transaction file attachment,' which clearly distinguishes it from broader transaction deletion tools like delete_transaction or delete_transactions_bulk. It is unambiguous about what action is performed. It does not explicitly name sibling tools for contrast, but the resource phrase is specific enough.

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 detaching a file vs. deleting the entire transaction, or when to avoid using it. The action is only stated directly, leaving the agent to infer usage context from the tool name and schema. There are no exclusions, prerequisites, or alternative routes mentioned.

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

delete_transaction_groupA
Destructive

Delete (ungroup) a transaction group. The original child transactions remain and revert to normal ungrouped transactions.

ParametersJSON Schema
NameRequiredDescriptionDefault
transaction_idYesID of the transaction group (the group parent transaction) to delete.

TDQS

A4.5/5.0
Behavior5/5

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

The annotation destructiveHint=true already flags this as destructive, but the description adds critical nuance: it explicitly states that the original child transactions remain and revert to ungrouped normal transactions. This goes beyond the annotation to clarify the non-destructive effect on children, which is essential for an agent to avoid mistakenly thinking it deletes the entire group including children.

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 that states the action and the critical caveat about child transactions. It contains zero filler and every word adds value, making it highly efficient and easy for an agent to parse.

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 tool with a single required parameter, no output schema, and a destructive annotation, the description fully covers what an agent needs: the exact effect on child transactions and the parameter meaning is already in the schema. Nothing essential 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?

The input schema provides 100% coverage for the single parameter transaction_id, describing it as 'ID of the transaction group (the group parent transaction) to delete.' The description adds no additional parameter semantics beyond what the schema already states, so it meets the baseline for full schema coverage without extra enrichment.

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 'Delete' and the resource 'transaction group', and immediately clarifies the nuanced behavior: it ungroups rather than deletes the underlying transactions. This distinguishes it from sibling tools like delete_transaction or unsplit_transaction by specifying the exact effect on child transactions.

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 that this tool is for ungrouping while preserving the child transactions. However, it does not explicitly name alternative tools (e.g., delete_transaction for full deletion, unsplit_transaction for split transactions) or state when NOT to use this tool. The context is sufficient but lacks explicit exclusions.

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

delete_transactions_bulkA
Destructive

Bulk-delete transactions by ID (1-500). Fails if any ID is a split or group parent, or part of a split/group; unsplit or ungroup those first. Irreversible.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesArray of transaction IDs to delete (1-500).

TDQS

A4.4/5.0
Behavior5/5

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

The destructiveHint annotation is reinforced and expanded with valuable behavior: the operation fails on split/group-related IDs and is irreversible. This goes well beyond the annotation by telling the agent about failure conditions and the need to pre-process data.

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

Conciseness5/5

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

Three short sentences with no filler. The core action, constraints, count limit, prerequisite, and irreversibility are all front-loaded and each sentence 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 one-parameter destructive tool, the description covers the operation, constraints, prerequisite, and irreversibility. It does not describe the success/error response format, but there is no output schema and the behavior is otherwise sufficiently explained.

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 already fully describes the single parameter (array of transaction IDs, 1-500). The description adds context about split/group behavior but does not materially extend the schema's parameter documentation, 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 uses a specific verb and resource: 'Bulk-delete transactions by ID'. It also adds a clear scope boundary (1-500 IDs), which distinguishes it from the singular delete_transaction sibling without needing to open schemas.

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 conveys this is the bulk deletion path and provides an explicit precondition: IDs that are split/group parents or members must be unsplit/ungrouped first. It does not explicitly mention alternatives, but the 'bulk' framing and 1-500 limit make the intended use clear.

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

get_account_balance_historyA
Read-only

Get monthly balance history for a single account. Call get_all_manual_accounts, get_all_plaid_accounts, or get_all_manual_crypto first to discover ids. For synced crypto holdings use get_crypto_synced_balance_history instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_monthNoOptional last month of the range, inclusive, as YYYY-MM (e.g. 2026-03). Must not be earlier than start_month and must not be in the future. For a single month, use the same value as start_month.
account_idYesId of the account to get balance history for.
start_monthNoOptional first month of the range, inclusive, as YYYY-MM (e.g. 2026-01). Must not be in the future. If set, end_month is also required. A full date such as 2026-01-01 is invalid.
account_typeYesType of account the balance history belongs to. Use manual for manually-managed accounts, plaid for synced bank accounts, crypto_manual for manually-managed crypto, and deleted for accounts that no longer exist but still have history. Synced crypto uses the dedicated crypto_synced tools instead.

TDQS

A4.3/5.0
Behavior3/5

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

The readOnlyHint annotation already covers the safety profile, and the description adds useful scoping details like monthly granularity and single-account restriction. However, it does not disclose return format, pagination, or behavior for invalid/deleted accounts. This is adequate but not rich, matching the calibration where annotations carry the safety burden.

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, front-loaded with the core purpose, followed by a necessary prerequisite and an explicit alternative. Every sentence earns its place with no filler or redundancy.

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 read-only single-account query tool with 100% schema coverage and a readOnlyHint annotation, the description is complete enough. It tells the agent what the tool does, what to call first, and when to use a different tool. No critical invocation information 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 documents account_type, account_id, start_month, and end_month with constraints and format rules. The description does not add parameter-level meaning beyond the schema, 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 states a specific verb ('Get') and resource ('monthly balance history for a single account'), clearly differentiating it from broader or synced-crypto alternatives. It also explicitly names get_crypto_synced_balance_history as the tool for synced crypto, so an agent can distinguish it from siblings without opening the schema.

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?

The description gives an explicit prerequisite: call get_all_manual_accounts, get_all_plaid_accounts, or get_all_manual_crypto first to discover ids. It also states a clear exclusion: use get_crypto_synced_balance_history for synced crypto holdings. This leaves little ambiguity about when to use this tool versus alternatives.

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

get_all_categoriesA
Read-only

Get a list of all categories associated with the user's account. Returns categories in alphabetical order.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNoIf `flattened`, returns a singular array of categories. If `nested`, returns top-level categories (either category groups or categories not part of a category group) in an array, with subcategories nested within the category group under the property children. Defaults to flattened.
is_groupNoIf true, returns only category groups. If false, returns only categories that are not category groups.

TDQS

A4/5.0
Behavior4/5

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

The readOnlyHint annotation already signals safety, and the description adds useful behavioral context: results are scoped to the user's account and returned in alphabetical order. 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 short sentences with no filler. The main action and resource are front-loaded, and the sorting behavior is added in a single extra clause.

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 list tool with fully documented optional parameters, the description is nearly complete. It covers scope and sort order; the only minor gap is not explicitly mentioning category groups, but the is_group parameter description fills that in.

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 format and is_group parameters are fully documented in the schema. The description adds no parameter-level meaning, so the baseline score 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 verb and resource: 'Get a list of all categories associated with the user's account.' It also adds a meaningful detail, alphabetical ordering, and clearly distinguishes itself from single-category or tag tools.

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 listing use case is implied by 'all categories,' but the description gives no explicit guidance about when to choose this over get_single_category or the category CRUD siblings. No alternatives or exclusions are named.

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

get_all_manual_accountsA
Read-only

Get a list of all manually-managed accounts associated with the user. (Formerly known as assets in the v1 API.)

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already provide readOnlyHint=true. Description adds that it returns a list and mentions the former name, but does not disclose other traits like pagination or data format.

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?

Single sentence with a parenthetical note, highly concise and front-loaded with the main action.

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 list tool with no parameters and no output schema, the description is fairly complete. It could mention pagination or output format, but the core purpose is clear.

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 has 0 parameters, so baseline is 4. Description does not need to add parameter meaning; it correctly describes the output.

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 clearly states it gets a list of manually-managed accounts, using specific verb and resource. It distinguishes from sibling tools like get_all_plaid_accounts and get_single_manual_account.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives (e.g., get_all_plaid_accounts) or when not to use it. The description only mentions the former name 'assets'.

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

get_all_manual_cryptoA
Read-only

Get all manually-managed crypto balances associated with the user.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

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

The readOnlyHint annotation covers the safety profile, and the description adds the scoping context of 'associated with the user' and 'manually-managed.' However, it does not disclose potential pagination, return format, or other behavioral details, which would be useful for a list-returning endpoint.

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 that clearly conveys the action and target. Every word earns its place, with no redundant or vague phrasing.

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

Completeness4/5

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

This is a simple zero-parameter, read-only tool with no output schema. The description sufficiently states what it does and the scope, though it leaves the exact return structure unstated. Given the low complexity, this is nearly complete.

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?

There are zero parameters in the input schema, so there is nothing to explain. The baseline of 4 applies as the description cannot add parameter-related meaning beyond what the empty schema already conveys.

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 clear verb ('Get'), a specific resource ('manually-managed crypto balances'), and a scope ('associated with the user'). It distinguishes from sibling tools like get_all_synced_crypto (manual vs synced) and get_single_manual_crypto (all vs single).

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. There are no explicit exclusions or references to sibling tools like get_all_synced_crypto or get_single_manual_crypto, leaving the agent to infer usage from the name alone.

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

get_all_plaid_accountsA
Read-only

Get a list of all Plaid (synced) accounts associated with the user.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already provide readOnlyHint=true, so the safety profile is clear. Description adds 'synced' context but no other behavioral traits (e.g., pagination, ordering).

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?

Single, front-loaded sentence with no unnecessary words. High conciseness.

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?

Given no params, simple read-only operation, and no output schema, the description is fully adequate. It specifies scope and source (Plaid synced accounts).

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?

No parameters in input schema, so schema description coverage is 100%. Description doesn't need to add parameter info; baseline 4 for zero-param tools.

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 clearly states the tool gets a list of all Plaid (synced) accounts, using a specific verb ('Get') and resource. It distinguishes from siblings like get_all_manual_accounts and get_single_plaid_account.

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?

No explicit guidance on when to use this tool vs alternatives. The sibling names imply choices, but the description lacks when-to-use or when-not-to-use instructions.

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

get_all_synced_cryptoA
Read-only

Get all synced crypto accounts (Coinbase, Kraken, Ethereum wallets) and their nested per-symbol balances. Synced accounts are connected in the Lunch Money web app and cannot be created or edited through the API.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Beyond the readOnlyHint annotation, the description explains that synced accounts are web-app connected and not API-editable, adding meaningful context about data origin and constraints. It also mentions the nested per-symbol balance structure, providing additional behavioral detail without being verbose.

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: the first front-loads the primary purpose, the second adds essential context about the data source and limitations. No wasted words.

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 zero-parity, read-only list tool with no output schema, the description adequately conveys what is returned (synced accounts and per-symbol balances) and the operational context (web-app connected, not API-editable). It is complete for its simplicity.

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 an empty input schema, so schema coverage is 100%. The description doesn't need to explain parameters; the baseline for 0 params is 4, and this is met.

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 retrieves all synced crypto accounts with their nested per-symbol balances. It distinguishes from siblings by specifying 'synced' versus manual accounts and 'all' versus single account 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 description provides context that synced accounts are connected via the Lunch Money web app and cannot be created/edited via API, implying this tool is for read-only retrieval of such accounts. It does not explicitly name alternatives but clearly sets expectations for when this tool applies.

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

get_all_tagsA
Read-only

Get a list of all tags associated with the user's account.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=true. Description adds no further behavioral details (e.g., pagination, sorting, or effect). Consistent but not additive.

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?

Single sentence, front-loaded, no redundant words. Perfectly concise for a simple list operation.

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?

Despite no output schema, description adequately describes return value (list of tags). No other context needed for this simple 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?

No parameters exist; description does not need to add parameter info. Baseline score for 0 params is 4.

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 clearly states verb (Get), resource (tags), and scope (user's account). It distinguishes from siblings like create_tag, delete_tag, update_tag, and get_single_tag.

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

Usage Guidelines2/5

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

No guidance on when to use this versus alternatives like get_single_tag or other tools. No context on prerequisites or use cases.

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

get_balance_historyA
Read-only

Get monthly account balance history across all accounts — the data behind the Net Worth views in the LunchMoney app. History is monthly. With no month range, returns all available history plus an ephemeral current entry for the current month, which is calculated on demand and may change between requests. Only months with data are included.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_monthNoOptional last month of the range, inclusive, as YYYY-MM (e.g. 2026-03). Must not be earlier than start_month and must not be in the future. For a single month, use the same value as start_month.
start_monthNoOptional first month of the range, inclusive, as YYYY-MM (e.g. 2026-01). Must not be in the future. If set, end_month is also required. A full date such as 2026-01-01 is invalid.

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses monthly granularity, the ephemeral calculated `current` entry, that the value may change between requests, and that only months with data are returned. This meaningfully affects how an agent should treat results, especially regarding caching.

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?

Four short sentences with the main purpose front-loaded. Every sentence adds either scoping, behavioral, or default-value information, with 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 read-only tool with zero required parameters and rich schema coverage, the description covers default behavior, granularity, and volatility. It does not detail the shape of each history entry, but the lack of an output schema makes that a minor gap rather than a critical omission.

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 already documents both optional parameters with formats and constraints. The description adds the valuable default behavior when no month range is provided, which the schema does not state, so it goes beyond the baseline.

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: 'Get monthly account balance history across all accounts'. The 'across all accounts' scope and 'data behind the Net Worth views' context clearly distinguish it from single-account tools like get_account_balance_history.

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 'across all accounts' and Net Worth view context provide a clear use case, and the default no-range behavior is explicitly stated. However, it does not name alternative tools or say when not to use it, so it falls just short of full routing guidance.

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

get_budget_settingsA
Read-only

Get budget period and display settings for the account (granularity, period length, anchor date, hide-no-activity preference, income option, rollover-left-to-budget setting).

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 already provide readOnlyHint=true, so the description need not restate safety. The description adds value by enumerating the specific settings returned, which is useful behavioral context 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, well-structured sentence that front-loads the purpose and lists key fields with no unnecessary words.

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 no parameters and readOnlyHint provided, the description covers the tool's purpose and return fields adequately. While it could mention the zero-param nature, the simplicity makes it sufficiently complete.

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?

There are zero parameters, so the baseline is 4 per guidelines. The description does not need to add parameter info; the schema coverage is 100% and no parameters exist.

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 'Get' and the resource 'budget period and display settings' with a specific list of fields. The tool name 'get_budget_settings' uniquely identifies it among siblings like 'get_budget_summary', establishing clear differentiation.

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

Usage Guidelines3/5

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

The description does not explicitly state when to use this tool or provide exclusions or alternatives. However, given the self-explanatory name and sibling tools, usage context is implied but not formally guided.

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

Get a summary of the user's budget for a specified date range. Returns per-category totals (other_activity, recurring_activity, budgeted, available, recurring_remaining, recurring_expected). Set include_occurrences=true for a per-period breakdown matching the account's budget periodicity. (Backed by the v2 GET /summary endpoint.)

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateYesEnd date in YYYY-MM-DD format. For aligned results use a valid budget period end (e.g. last day of month).
start_dateYesStart date in YYYY-MM-DD format. For aligned results use a valid budget period start (e.g. first day of month).
include_totalsNoInclude a top-level `totals` section summarizing inflow and outflow across all transactions in the range.
include_occurrencesNoInclude an `occurrences` array on each category, with one entry per budget period in the range.
include_rollover_poolNoInclude a `rollover_pool` section summarizing the current rollover pool balance and previous adjustments.
include_past_budget_datesNoInclude the three budget occurrences prior to start_date in `occurrences`. Ignored unless include_occurrences is also true.
include_exclude_from_budgetsNoInclude categories that have the 'Exclude from Budgets' flag set in the returned categories array.

TDQS

A4/5.0
Behavior4/5

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

With readOnlyHint=true already present, the description adds useful behavioral detail: the returned per-category totals, the per-period breakdown behavior tied to include_occurrences, and the backing v2 GET /summary endpoint. It does not disclose pagination, errors, or rate limits, but the read-only safety profile is covered by 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?

Three sentences with no filler: the first states the core action and scope, the second lists return fields and key option behavior, and the third notes the backing endpoint. Information 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.

Completeness4/5

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

Although there is no output schema, the description names the main returned fields and explains the key optional breakdown. All parameters are fully described in the input schema, and the read-only annotation covers safety. Minor gaps like top-level response shape for all optional flags are inferable from the schema descriptions, so the definition is sufficiently 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%, so the schema fully documents all seven parameters. The description adds a small amount of extra meaning by explaining include_occurrences as a per-period breakdown matching budget periodicity, but it does not need to repeat parameter details and does not materially enhance the schema beyond that.

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 starts with a specific verb and resource ('Get a summary of the user's budget for a specified date range') and lists the exact returned per-category fields. This clearly distinguishes it from budget mutation and settings tools like upsert_budget, remove_budget, and get_budget_settings.

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 read-only budget summary usage and explains when to set include_occurrences=true, but it does not explicitly state when to prefer this tool over alternatives or when not to use it. Usage context is clear but left mostly to inference.

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

get_crypto_synced_balance_historyA
Read-only

Get monthly balance history for a synced crypto holding, identified by its account id and ticker symbol. Synced crypto is scoped per symbol, so it is not available through get_account_balance_history.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesTicker symbol of the holding within the account (e.g. eth).
end_monthNoOptional last month of the range, inclusive, as YYYY-MM (e.g. 2026-03). Must not be earlier than start_month and must not be in the future. For a single month, use the same value as start_month.
account_idYesId of the synced crypto account.
start_monthNoOptional first month of the range, inclusive, as YYYY-MM (e.g. 2026-01). Must not be in the future. If set, end_month is also required. A full date such as 2026-01-01 is invalid.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the safety profile is known. The description adds the context that synced crypto is scoped per symbol and that this tool returns monthly history, which is useful but not a rich behavioral disclosure. No contradictions 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?

Two sentences with zero redundancy. The first states the core purpose and identification method; the second clarifies the key distinction from a sibling tool. All information 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.

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 history tool with 4 parameters (2 required) and no output schema, the description provides enough context: it identifies the resource, scoping, and a key limitation (not available via get_account_balance_history). The optional date-range parameters are fully documented in the schema, and the absence of an output schema is not a critical gap for an agent to invoke the tool 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 the input schema fully documents all four parameters, including optional start_month and end_month with patterns and constraints. The description itself only reiterates 'account id and ticker symbol', which adds no new meaning beyond the schema. With full coverage, a 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 clearly states the action ('Get'), the resource ('monthly balance history for a synced crypto holding'), and the identifying parameters ('account id and ticker symbol'). It also distinguishes itself from a sibling tool, get_account_balance_history, by noting the per-symbol scoping, making it unambiguous for an agent.

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 names an alternative (get_account_balance_history) and explains why it should not be used for synced crypto ('scoped per symbol'), which is clear guidance for when to select this tool. However, it does not mention other closely related siblings like get_synced_crypto_balance (for current balance) or get_balance_history, so the guidance is not exhaustive.

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

get_recurring_itemsB
Read-only

Retrieve a list of recurring items expected for a specified date range. The matches object on each item is populated based on the requested range.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNoEnd of the range used to populate `matches` (YYYY-MM-DD). Required if start_date is set.
start_dateNoStart of the range used to populate `matches` (YYYY-MM-DD). Defaults to the current month. Required if end_date is set.
include_suggestedNoIf true, also returns recurring items suggested by the system that have not yet been reviewed.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations provide readOnlyHint=true, so the description doesn't need to restate safety. It adds useful context about the `matches` object being populated based on the requested range, which is beyond the schema. However, it doesn't disclose default behavior when no dates are provided (e.g., current month) or pagination/limits.

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

Conciseness4/5

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

Two sentences with no fluff. The core action and the key behavioral detail about `matches` are front-loaded. It's appropriately sized for the tool's complexity.

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 list tool with 100% schema coverage, the description is mostly adequate. It could be improved by noting the default date range behavior (current month) and whether results are paginated, but these are minor gaps given the annotations and schema.

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 all three parameters. The description adds the key semantic that `matches` is populated based on the range, which helps understand start_date/end_date's purpose, but doesn't add much beyond that.

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

Purpose4/5

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

The description clearly states the tool retrieves recurring items for a date range and mentions the `matches` object population. It distinguishes itself from get_single_recurring_item by being a list operation, though it doesn't explicitly name that sibling.

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 for retrieving recurring items within a date range, and the schema clarifies start/end date requirements. However, it doesn't explicitly state when to use this over get_single_recurring_item or other list tools, nor does it mention exclusions.

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

get_single_categoryA
Read-only

Get details on a single category or category group, including the list of children categories for category groups.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryIdYesId of the category to query. Call get_all_categories first to discover ids.

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, so the description correctly adds the behavioral nuance that category groups return a list of children categories. This is extra context beyond the read-only flag, though it doesn't address additional behavior like error responses or nonexistent IDs; with annotations covering safety, this is adequate.

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 16-word sentence that front-loads the main purpose and immediately states the key qualifier about category groups. No redundant content.

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 one-parameter read tool with readOnlyHint=true and no output schema, the description covers what the tool returns (details plus children for groups) and the parameter is fully documented in the schema. It could be more explicit about the shape of 'details,' but nothing essential 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%, and the schema already explains categoryId and instructs to call get_all_categories first. The tool description adds no param-specific meaning, so it meets the baseline 3 for high schema coverage.

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

Purpose5/5

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

Description states a specific verb ('Get details') and resource ('single category or category group'), and differentiates from siblings like get_all_categories by noting it returns a single item. The mention of children categories for groups adds further specificity, making the tool's purpose unambiguous.

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

Usage Guidelines4/5

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

The description implicitly conveys when to use it (when you need details on one category) and explicitly advises calling get_all_categories first to discover ids. It does not explicitly exclude alternatives or name sibling tools, but the context is clear enough; falls short of a 5 because no when-not-to-use guidance is given.

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

get_single_manual_accountA
Read-only

Get details of a single manual account by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdYesId of the manual account to query. Call get_all_manual_accounts first to discover ids.

TDQS

A4/5.0
Behavior3/5

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

The readOnlyHint annotation already covers the safety profile, and the description aligns with it by saying 'get details.' The description adds the 'manual account' scoping but does not disclose response shape, error behavior, or other runtime traits beyond what the annotation and schema already imply.

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 communicates the action, target, and discriminator with no wasted words.

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 single-resource getter with one well-documented parameter and a readOnlyHint annotation, the description is largely complete. The only minor gap is that 'details' is slightly generic and could be more precise about what the response contains, but no output schema exists to fill that in.

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%, and the accountId parameter is already described as 'Id of the manual account to query' with discovery guidance. The tool description adds little beyond the schema, so baseline 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 uses a specific verb ('Get details') and identifies the exact resource ('single manual account') plus the selection mechanism ('by ID'). This clearly distinguishes it from get_all_manual_accounts and the analogous get_single_plaid_account sibling.

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 parameter description explicitly instructs the agent to call get_all_manual_accounts first to discover IDs, providing practical usage guidance. It does not explicitly state when not to use this tool versus alternatives, but the 'single manual account by ID' scoping makes the intended use clear.

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

get_single_manual_cryptoA
Read-only

Get a single manually-managed crypto balance by ID. Call get_all_manual_crypto first to discover ids.

ParametersJSON Schema
NameRequiredDescriptionDefault
crypto_idYesId of the manual crypto balance to retrieve.

TDQS

A4.1/5.0
Behavior3/5

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

The annotation readOnlyHint=true already declares this as a safe read operation, so the description does not need to repeat that. It adds the prerequisite discovery context, which is useful but not a deep behavioral trait. No additional behavior like error handling or response format is disclosed, so a baseline score of 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 short sentences with no filler. The primary action is stated first, followed by a necessary prerequisite. The entire description earns its place and is immediately scannable.

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 one-parameter read-only tool with a high-coverage schema and readOnlyHint annotation, this description covers the essential context: what it does, how to identify the target, and how to discover valid IDs. Nothing needed to invoke it correctly 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%, and the parameter schema already describes crypto_id as 'Id of the manual crypto balance to retrieve.' The description merely says 'by ID' and refers to discovering ids via get_all_manual_crypto, which adds no new meaning beyond the schema. With the schema carrying full weight, a score of 3 is correct.

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 ('Get') and resource ('single manually-managed crypto balance') with a clear identifier ('by ID'). It distinguishes from siblings like get_all_manual_crypto and get_single_synced_crypto through the 'manually-managed' qualifier and singular form.

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 says 'Call get_all_manual_crypto first to discover ids', giving an actionable prerequisite and making the tool's position in the workflow clear. It does not explicitly state alternatives or when not to use this tool, but the sequencing instruction is strong enough to guide an agent.

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

get_single_plaid_accountA
Read-only

Get details of a single Plaid (synced) account by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountIdYesId of the Plaid account to query. Call get_all_plaid_accounts first to discover ids.

TDQS

A4.3/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 consistently indicates a read-only retrieval. The description adds mild context by clarifying the account is Plaid/synced, but does not disclose return format, error behavior, or permissions. No contradiction.

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, compact sentence with no filler. The key facts—action, resource, and identifier—are front-loaded and immediately usable.

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?

This is a simple one-parameter read-only lookup. The description plus schema fully cover what the agent needs to invoke the tool correctly, and the annotation covers the safety profile. No output schema is present, but 'details' is sufficient given the low complexity.

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 parameter is already documented. The description adds value beyond the schema by including a discovery prerequisite ('Call get_all_plaid_accounts first'), which helps the agent obtain a valid accountId.

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 ('Get details'), a specific resource ('single Plaid (synced) account'), and the access method ('by ID'). This clearly distinguishes it from get_all_plaid_accounts and manual account 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 description itself does not name alternatives, but the parameter schema explicitly instructs the agent to call get_all_plaid_accounts first to discover account IDs. This provides clear when-to-use context, though it lacks explicit exclusions or alternative tool routing.

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

get_single_recurring_itemA
Read-only

Retrieve a single recurring item by ID. Optional date range populates the matches object.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNoEnd of the range used to populate `matches` (YYYY-MM-DD). Required if start_date is set.
start_dateNoStart of the range used to populate `matches` (YYYY-MM-DD). Defaults to the current month. Required if end_date is set.
recurringIdYesId of the recurring item to query. Call get_recurring_items first to discover ids.

TDQS

A4/5.0
Behavior4/5

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

With readOnlyHint=true, the safety profile is already covered by annotations. The description adds meaningful behavior by explaining that an optional date range populates the 'matches' object, which is not derivable from the annotations alone. There is no contradiction and no hidden side-effect implication.

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 short sentences with no filler. It front-loads the action and resource, then adds only the essential optional-date-range behavior, making every word useful.

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 getter with a fully documented parameter schema and a readOnlyHint annotation, the definition is complete enough to invoke correctly. It does not describe the full return shape or name alternative tools, but those gaps are minor here because the operation and its main behavior are clearly stated.

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%, and all parameters already have clear descriptions including formats and the dependency between start_date and end_date. The tool description adds no per-parameter meaning, so the baseline of 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 ('Retrieve'), a clear resource ('single recurring item'), and a lookup key ('by ID'). The word 'single' also distinguishes it from the sibling get_recurring_items operation without needing to inspect schema.

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 targeted get-by-ID use case and the schema adds a useful prerequisite ('Call get_recurring_items first to discover ids'). However, it does not explicitly state when to choose this tool over alternatives or when not to use it, so the routing is mostly implied.

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

get_single_synced_cryptoA
Read-only

Get a single synced crypto account and all its nested balances by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
crypto_idYesId of the synced crypto account to retrieve.

TDQS

A4.1/5.0
Behavior3/5

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

readOnlyHint=true already covers the safety profile, and the description adds useful context by stating the response includes the account plus all nested balances. It does not cover error behavior or response edge cases, but those are less critical given 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?

A single front-loaded sentence with no filler or redundant schema restatement. Every word contributes meaning, which is ideal for a one-parameter getter tool.

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 one-parameter, read-only lookup, the description plus schema and annotations provide enough information to select and invoke the tool correctly. It even states the return scope (account + nested balances), which is valuable because 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?

The only parameter is fully documented in the schema with a clear description, so there is no coverage gap. The description's 'by ID' merely restates the schema's meaning without adding new semantic detail, earning 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?

The description opens with a specific verb ('Get'), resource ('single synced crypto account'), and scope qualifier ('all its nested balances'). It is clearly distinct from sibling tools like get_all_synced_crypto and get_single_manual_crypto without requiring schema inspection.

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 'single' and 'by ID' phrasing gives clear context that this tool is for retrieving one specific synced crypto account rather than listing all of them. It does not explicitly name alternative tools, but the usage context is unambiguous for selection.

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

get_single_tagA
Read-only

Get details of a single tag by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagIdYesId of the tag to query. Call get_all_tags first to discover ids.

TDQS

A4/5.0
Behavior3/5

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

Annotations declare readOnlyHint=true, and the description's 'Get details' aligns with a safe read operation. The description adds no further behavioral detail such as return shape or error behavior, but for a read-only getter annotations already cover the key safety trait.

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 short sentence with no filler. It front-loads the verb, resource, and identifying concept, 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 one-parameter, read-only lookup, the description and schema together provide enough information to invoke the tool correctly. The absence of a stated return format is a minor gap, but the operation is simple enough that the current definition 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 only parameter, tagId, is fully described in the schema with both its purpose and a discovery hint ('Call get_all_tags first to discover ids'). The description itself adds little beyond 'by ID', so with 100% schema coverage 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.

Purpose5/5

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

The description uses a specific verb ('Get') and resource ('single tag by ID'), clearly distinguishing it from get_all_tags, which retrieves all tags. There is no ambiguity about what operation is performed.

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 parameter schema advises calling get_all_tags first to discover tag IDs, providing a concrete prerequisite for this tool. It does not explicitly list alternative selection criteria, but the 'single tag' phrasing and the sibling list imply 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.

get_single_transactionA
Read-only

Get details of a specific transaction. The response always includes plaid_metadata, custom_metadata, files, and (for split or group parents) the children array — none of which are returned by default in get_transactions.

ParametersJSON Schema
NameRequiredDescriptionDefault
transaction_idYesID of the transaction to retrieve.

TDQS

A4.2/5.0
Behavior4/5

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

The annotation readOnlyHint=true already covers safety. The description adds valuable behavioral detail by disclosing that the response always includes plaid_metadata, custom_metadata, files, and the children array for split/group parents. This goes beyond the annotation and helps the agent anticipate the response structure.

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, tightly written sentence that front-loads the core purpose and then efficiently explains the distinguishing feature. No wasted words.

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 operation with one parameter and no output schema, the description covers the key differentiators and return characteristics. It doesn't mention error behavior or non-existence handling, but the annotation covers the read-only nature, making this 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?

Schema coverage is 100% and the parameter transaction_id has a clear description. The tool description adds no additional meaning 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 clearly states the action ('Get details') and resource ('a specific transaction'), and explicitly differentiates from the sibling get_transactions by listing the additional fields it returns. This makes the purpose unambiguous.

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

Usage Guidelines4/5

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

It provides clear context by contrasting with get_transactions, indicating when this tool is needed (when those extra fields are required). However, it doesn't explicitly state when not to use it or mention other alternatives, so it's slightly below a full 5.

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

get_supported_cryptocurrenciesA
Read-only

Get the list of cryptocurrencies supported for manual tracking. The symbol of an entry here is what must be passed to create_manual_crypto.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

With annotations providing readOnlyHint, the description adds value by specifying that the list is for manual tracking and that the symbols are prerequisites for create_manual_crypto. This clarifies the relationship to other tools and the nature of the data, going beyond the annotation without contradicting it.

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-loaded with the primary action, and the second sentence provides essential cross-tool context. No words are wasted, making it concise and well-structured.

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 tool with a readOnlyHint and no output schema, the description is complete: it explains what the tool returns (supported cryptocurrencies) and how the output should be used. No critical information is missing 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 baseline is 4. The description adds no parameter information because none is needed; the empty schema fully covers the parameters, and the description's focus on the output symbol is more relevant.

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 'Get the list of cryptocurrencies supported for manual tracking,' which specifies the verb (get), the resource (cryptocurrencies), and the scope (supported for manual tracking). It distinguishes from siblings like get_all_manual_crypto and add_supported_cryptocurrency by clarifying its role as the supported list, not the user's tracked list or the add operation.

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 guidance on when to use this tool: before calling create_manual_crypto, since the symbol must come from this list. It does not explicitly mention alternatives or exclusions, but the connection to create_manual_crypto provides strong contextual usage direction, so it earns a 4 rather than a 5.

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

get_synced_crypto_balanceA
Read-only

Get a single balance held inside a synced crypto account, looked up by its cryptocurrency symbol.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesCryptocurrency symbol held within the synced account, e.g. 'eth'.
crypto_idYesId of the synced crypto account.

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already provide readOnlyHint=true, so the safety profile is covered. The description adds only minimal behavioral context—that a single balance is returned—and does not disclose not-found behavior, return format, or whether the balance represents the current/latest value.

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 understanding the tool's purpose and lookup mechanism.

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 is adequate for a simple read-only lookup with fully documented parameters, but since there is no output schema, the return format is not explained. It also does not provide any explicit contrast with closely related siblings like get_crypto_synced_balance_history or get_single_synced_crypto.

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 fully documents both parameters. The description's phrase 'looked up by its cryptocurrency symbol' maps to the symbol parameter and 'synced crypto account' maps to crypto_id, but it adds no new constraints or format details beyond the schema.

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

Purpose5/5

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

The description uses a specific verb ('Get'), identifies the resource ('a single balance held inside a synced crypto account'), and states the lookup key ('by its cryptocurrency symbol'). This clearly differentiates it from siblings such as get_all_synced_crypto and get_crypto_synced_balance_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 intended usage is implied: use this to fetch one current balance by symbol rather than account details or balance history. However, the description does not explicitly name alternatives or state when not to use this tool.

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

get_transaction_attachment_urlA
Read-only

Get a short-lived signed download URL for a transaction file attachment. The response includes the URL and an expires_at timestamp.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_idYesID of the file attachment.

TDQS

A4.3/5.0
Behavior4/5

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

Beyond the readOnlyHint annotation, the description reveals that the URL is short-lived and signed, and that the response includes an expires_at timestamp. This adds useful behavioral context not present in the schema or annotations, though it does not specify the expiration duration or any authentication requirements.

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 just two sentences with no redundancy. It front-loads the core action and then adds the essential response detail. 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 one-parameter read-only tool with no output schema, the description provides the key return elements (URL and expires_at) and communicates the temporary nature of the URL. An agent has enough information to invoke 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%, and the file_id parameter is already described as 'ID of the file attachment.' The description does not add further parameter semantics, 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.

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: 'Get a short-lived signed download URL for a transaction file attachment.' The qualifiers 'short-lived signed' and 'download URL' make the tool's exact purpose clear, distinguishing it from attachment-management 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 use case is clear from the description: retrieve a temporary download link for a file attachment. It does not explicitly name alternatives like attach_file_to_transaction or delete_transaction_attachment, nor provide explicit when-not-to-use guidance, so it stops short of a 5.

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

Retrieve transactions, optionally filtered by date range, account, category, tag, recurring item, status, and more. Returns at most limit transactions (default 1000, max 2000); has_more is set on the response when more match the filters. Pending and split-parent / group-child transactions are excluded by default.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax transactions to return (1-2000, default 1000).
offsetNoOffset for pagination. Use with `has_more` from a previous response.
statusNo
tag_idNo
end_dateNoEnd of the date range. Required if start_date is set.
is_pendingNoFilter by pending status. Takes precedence over include_pending when set.
start_dateNoBeginning of the date range. Required if end_date is set.
category_idNoFilter by category ID. 0 returns only un-categorized transactions. Matches both leaf categories and category groups.
recurring_idNo
created_sinceNoOnly return transactions created after this timestamp.
include_filesNoInclude the `files` array (attachment metadata) on each transaction.
updated_sinceNoOnly return transactions updated after this timestamp.
include_pendingNoInclude imported pending transactions in results.
is_group_parentNoIf true, returns only transaction groups (group parents).
include_childrenNoPopulate the `children` array on group/split parent transactions.
include_metadataNoInclude plaid_metadata and custom_metadata fields on each transaction.
plaid_account_idNoFilter by Plaid account ID, or 0 to omit all Plaid-account transactions.
manual_account_idNoFilter by manual account ID, or 0 to omit all manual-account transactions.
include_split_parentsNoInclude the original parent transactions of split transactions.
include_group_childrenNoInclude the original transactions that were combined into transaction groups.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true. The description adds valuable behavioral detail beyond that: pagination signaling with has_more, the limit cap, and the non-obvious exclusion of pending and split-parent/group-child transactions by default. No contradiction with annotations.

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

Conciseness4/5

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

Three sentences, with the action front-loaded and behavioral details kept tight. The phrase 'and more' is slightly vague but does not add meaningful bloat.

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 20-parameter read-only tool with 85% schema coverage and no output schema, the description covers the key invocation details: filter scope, pagination, and default exclusions. It could say more about the overall response shape, but the provided information is adequate for correct use.

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 85%, so the schema already documents most parameters well. The description enumerates filter categories but does not meaningfully explain any parameter beyond what the schema states; its main added value is the aggregate filter/behavior context.

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 and resource ('Retrieve transactions') and names the main filter dimensions, clearly distinguishing it from single-transaction retrieval. It does not explicitly call out a sibling tool, but the plural collection semantics make the distinction clear.

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 on how to use the tool: optional filters, limit default/max, pagination via has_more, and default exclusions. It does not explicitly state when not to use it or name alternatives like get_single_transaction, but the guidance is sufficient for basic selection.

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

get_userA
Read-only

Get details on the current user

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 readOnlyHint annotation already indicates it's a safe read operation. The description adds no further behavioral details, but does not contradict the annotation. Given the annotation coverage, this is adequate.

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 immediately conveys the tool's purpose with no wasted words.

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?

Given no parameters and no output schema, the description fully explains what the tool does. The sibling tools list provides context, but the description itself is complete for its simplicity.

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?

There are no parameters, so the schema provides complete coverage. The description adds no additional parameter info, but none is needed. Baseline for 0 params is 4.

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 'Get details on the current user', which is a specific verb-resource combination. It distinguishes itself from sibling tools like get_budget_settings or get_transactions by explicitly targeting the current user.

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 context (retrieving current user details) but does not explicitly state when to use this tool over alternatives. Still, it is clear enough for an agent to infer its purpose.

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

refresh_synced_cryptoA

Trigger a balance refresh for a synced crypto account and return the refreshed account. Reaches out to the external crypto provider.

ParametersJSON Schema
NameRequiredDescriptionDefault
crypto_idYesId of the synced crypto account to refresh.

TDQS

A4/5.0
Behavior3/5

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

The openWorldHint annotation already signals external-world interaction, and the description makes this concrete by stating 'Reaches out to the external crypto provider.' It does not go further to explain failure modes, latency, or whether existing balance history is affected, but it does disclose the core external side effect.

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 deliver the action, resource, return value, and external behavior with no filler. The most important information is 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?

This is a single-parameter tool with a fully described schema. The description adds the return value and external-provider behavior, which is useful since there is no output schema. It lacks deeper guidance about error handling or alternatives, but is adequate for a simple trigger operation.

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 has 100% coverage and describes crypto_id as 'Id of the synced crypto account to refresh.' The tool description repeats essentially the same information without adding new parameter-level meaning, so it stays at the schema-mediated baseline.

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 ('Trigger a balance refresh'), a specific resource ('synced crypto account'), and the expected return value ('return the refreshed account'). It clearly distinguishes this from sibling read-only tools like get_synced_crypto_balance or get_single_synced_crypto.

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: it is for synced crypto accounts and involves reaching out to the external crypto provider. It does not explicitly name alternatives or exclusions, but the 'synced' qualifier and refresh action make the intended use reasonably clear.

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

remove_budgetA
Destructive

Remove the budget for a specific category and period. The request is idempotent — succeeds even if no budget exists for the period.

ParametersJSON Schema
NameRequiredDescriptionDefault
start_dateYesBudget period start date in YYYY-MM-DD format. Must be a valid budget period start.
category_idYesCategory ID for the budget to remove.

TDQS

A4/5.0
Behavior4/5

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

The annotation already marks the tool as destructive (destructiveHint: true). The description adds valuable context by disclosing idempotency — that it succeeds even if no budget exists. This goes beyond the annotation and helps the agent understand edge-case behavior without errors.

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, no wasted words, and the core action is front-loaded. The idempotency detail is a valuable addition without bloating the description.

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 delete tool with two fully documented parameters and annotations covering destructiveness, the description covers all essential aspects. It does not describe return values, but for a removal operation this is typically implicit and not critical given no output schema.

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 both start_date and category_id having clear descriptions. The tool description does not add extra meaning beyond the schema, merely referencing 'specific category and period' which maps directly to the parameters. Baseline 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 clearly states a specific verb (remove) and resource (budget) with a scope (specific category and period). It distinguishes itself from siblings like upsert_budget and get_budget_summary by focusing on removal. The idempotency note further clarifies its purpose.

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 this tool (when removing a budget), but does not explicitly mention alternatives or when not to use it. Given the straightforward nature of a delete operation, the context is reasonably clear, but it lacks explicit routing to sibling tools like upsert_budget for create/update scenarios.

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

split_transactionA

Split an existing transaction into 2-500 child transactions. The sum of child amounts must equal the parent's amount. After splitting, the parent is hidden from get_transactions and accessible via get_single_transaction (returns the parent with children).

ParametersJSON Schema
NameRequiredDescriptionDefault
transaction_idYesID of the transaction to split.
child_transactionsYesChildren to create. Sum of amounts must equal the parent's amount.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations provide only idempotentHint: false, so the description carries the burden of behavioral disclosure. It adds a valuable behavioral trait beyond the schema: after splitting, the parent is hidden from get_transactions but remains accessible via get_single_transaction with a children array. This helps agents understand side effects, though it does not detail reversibility or failure modes.

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 carry all essential information with no filler: the operation, the count range, the sum constraint, and the post-split behavior. The most important facts are front-loaded, and every clause adds value.

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, combined with the rich schema, covers the core requirements: range, amount equality, and the parent's post-split visibility. Since there is no output schema, a note about return values could be helpful, but it is not essential for invoking the tool correctly. The only notable omission is guidance about reversing a split via unsplit_transaction, which is available among siblings.

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 transaction_id and all child_transactions fields, including defaults and the sum constraint. The description restates the sum requirement but does not add significant parameter-level meaning beyond what the schema provides, matching the baseline for 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 ('split'), resource ('existing transaction'), and scope ('into 2-500 child transactions'), making the core purpose unambiguous. However, it does not explicitly distinguish itself from the sibling tool unsplit_transaction, so it misses the highest bar for sibling 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 an existing transaction needs to be split into multiple children—and gives important context about the post-split visibility of the parent. It does not explicitly state when not to use it or mention the alternative unsplit_transaction for reversal, so the guidance remains implied rather than explicit.

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

trigger_plaid_fetchA

Trigger a fetch of latest data from Plaid. Optionally scope the fetch to a date range and/or a specific Plaid account ID. Note: Plaid enforces a minimum 60-second delay between fetch requests; fetching may take up to 5 minutes.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoIf set, only fetch the specified Plaid account; otherwise all eligible accounts are fetched.
end_dateNoEnd of the date range to fetch transactions for (YYYY-MM-DD). Required if start_date is set.
start_dateNoBeginning of the date range to fetch transactions for (YYYY-MM-DD). Required if end_date is set.

TDQS

A4.2/5.0
Behavior4/5

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

The description discloses two important behavioral aspects: a minimum 60-second delay between fetch requests and a maximum 5-minute fetch duration. These are not captured by the annotations (only openWorldHint is set), so the description adds valuable context beyond structured fields. It does not contradict 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 two sentences, front-loaded with the core purpose and then presenting optional parameters and a critical operational note. Every sentence serves a purpose, and the structure is logical and efficient.

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 trigger tool with no output schema and straightforward parameters, the description covers the purpose, options, and rate limiting. The only minor gap is the lack of mention of the return value or confirmation behavior, but this is not critical for an agent deciding to invoke the tool. The tool is adequately specified for its complexity.

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 complete descriptions for all three parameters (100% coverage), so the description's mention of optional scoping adds only a high-level summary. It does not introduce new semantics or format details beyond what the schema offers, aligning with the baseline score for full schema coverage.

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

Purpose5/5

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

The description states a specific action ('Trigger a fetch of latest data from Plaid') with a clear resource and purpose, and it distinguishes itself from sibling tools by focusing on Plaid data fetching rather than queries or updates. It also mentions optional scoping, which adds clarity without confusion.

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 explains when to use the tool (to fetch latest data) and describes optional scoping parameters (date range, account ID). It does not explicitly state when not to use it or name alternatives, but given the sibling set, no direct alternative exists for triggering a Plaid fetch, so the guidance is sufficient.

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

unsplit_transactionA
Destructive

Unsplit a previously split transaction by deleting its children and restoring the parent. Pass the parent (split_parent_id) — not a child — as the path id.

ParametersJSON Schema
NameRequiredDescriptionDefault
transaction_idYesID of the previously split parent transaction. Use the split_parent_id of a split child to find it.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare destructiveHint: true, and the description adds meaningful detail: it discloses that children are deleted and the parent is restored. This goes beyond the annotation by explaining exactly what destructive effect occurs, without contradicting 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 two sentences with zero redundancy. The first sentence states the purpose, the second delivers the essential usage hint. It is front-loaded and 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?

With only one parameter, a clear operation description, and destructiveHint annotation, the definition covers everything an agent needs to call the tool correctly. There is no output schema, but none is needed for an action that returns a simple result. Error cases are not mentioned, but that is not expected for such a targeted operation.

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

Parameters5/5

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

The schema describes transaction_id with guidance to use split_parent_id, and the description reinforces the critical caveat to pass the parent, not a child. Together they fully clarify the parameter's semantics, eliminating ambiguity about which ID to use.

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 ('Unsplit') and resource ('transaction'), and explains the action precisely: 'deleting its children and restoring the parent.' It clearly differentiates from the sibling 'split_transaction' and from generic delete tools like 'delete_transaction' by clarifying the operation is a reversal of a split, not a full deletion.

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 it ('previously split transaction') and a critical usage instruction: 'Pass the parent (split_parent_id) — not a child — as the path id.' This guides correct invocation, though it does not explicitly compare to alternatives like delete_transaction. The condition is clear enough for an agent to select it correctly.

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

update_categoryA
Idempotent

Update properties for an existing category or category group. For category groups, supplying children replaces the group's full child list. Cannot be used to convert between category and category group.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew name. 1-100 characters.
archivedNo
childrenNoOnly valid for category groups. Replaces the group's full children list. Existing IDs (numbers) keep/move categories; strings create new sub-categories.
group_idNoMove this category into the specified category group, or null to remove from any group.
is_incomeNo
categoryIdYesId of the category or category group to update.
descriptionNoNew description. Up to 200 characters.
exclude_from_budgetNo
exclude_from_totalsNo

TDQS

A4.1/5.0
Behavior4/5

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

The description goes beyond the idempotentHint annotation by surfacing the destructive replacement semantics for category-group children and the conversion restriction. It does not mention response shape, permissions, or partial-update behavior, but those are less central given the annotation and existing 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?

Three sentences, no filler; the primary purpose comes first and the critical guardrail is last. Every sentence carries meaningful selection or behavioral information.

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 covers the most important domain semantics (update scope, child replacement, no conversion), but with no output schema and multiple undocumented boolean parameters, an agent still has to infer response and partial-update behavior. It is adequate but not fully complete for a 9-parameter mutation 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 description reinforces the children parameter's group-only behavior and the category/group distinction, but it mostly restates what the children schema already documents. With 56% schema coverage the description should compensate for the undocumented booleans (archived, is_income, exclude_from_budget, exclude_from_totals), but it does not.

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 ('Update properties for an existing category or category group') and immediately distinguishes the tool from create/delete siblings by explicitly prohibiting conversion between the two forms. It also names the special category-group child replacement behavior, so an agent can tell what this tool is for without opening the schema.

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 clear context that this is for updating existing categories or groups and an explicit when-not ('Cannot be used to convert between category and category group'). It stops short of naming sibling tools such as create_category or delete_category as alternatives, so it is not a full 5.

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

update_deleted_account_detailsA
Idempotent

Update the display details shown for a deleted account in the Net Worth views. Applies to all historical entries for that deleted source. At least one field must be provided; pass null to clear a field.

ParametersJSON Schema
NameRequiredDescriptionDefault
maskNoLast few digits of the deleted account's number.
nameNoOfficial or full name of the deleted account.
subtypeNoSubtype of the deleted account.
account_idYesThe deleted_account_id from a balance history entry whose source type is `deleted`.
account_typeNoType of the deleted account.
display_nameNoDisplay name for the deleted account.
institution_nameNoName of the institution that held the deleted account.

TDQS

A4.4/5.0
Behavior4/5

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

Beyond the idempotentHint annotation, the description discloses a nontrivial side effect: changes apply to all historical entries for that deleted source, and null clears fields. This gives the agent important awareness of the update's global reach. It does not mention authorization or rollback, but the annotations and expected update semantics cover the main safety expectations.

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

Conciseness5/5

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

Three short sentences, all informative. The core behavior is front-loaded, and the constraint and clearing semantics are stated in minimal, unambiguous 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 simple seven-parameter update with a complete schema and no nested objects, the description covers the critical context: historical-entry scope, the at-least-one-field requirement, and null semantics. The only minor gap is the absence of a return-value description, but no output schema exists to clarify it.

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

Parameters4/5

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

Schema coverage is 100%, so each parameter is already documented in the schema. The description adds value by stating that at least one field must be provided and by clarifying that null means 'clear this field', which the per-parameter schema descriptions do not explicitly communicate.

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?

Identifies the exact operation (update), the exact target (display details of a deleted account), and the affected scope (Net Worth views / historical entries). This distinguishes it from the many other update_* siblings, none of which target deleted-account display metadata.

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

Usage Guidelines4/5

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

The description clearly states when it applies: to deleted accounts shown in Net Worth views. It also gives practical usage guidance: at least one field must be provided and null clears a field. It does not explicitly name an alternative tool or state when not to use it, but the deleted-account scope makes the choice unambiguous against the sibling list.

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

update_manual_accountC
Idempotent

Update an existing manually-managed account. (Formerly update_asset.)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
typeNo
balanceNo
subtypeNo
currencyNo
accountIdYesId of the manual account to update.
closed_onNo
display_nameNo
balance_as_ofNo
institution_nameNo
exclude_from_transactionsNo

TDQS

C2.6/5.0
Behavior2/5

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

The description adds no behavioral detail beyond the obvious update operation NK. It does not mention partial-update semantics, how missing fields are handled, whether null values clear fields, or any permission requirements. The idempotentHint annotation covers idempotency, but the description itself contributes little.

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 extremely short and front-loaded, with the core action stated in the first clause. The 'Formerly update_asset' note is a minor useful migration hint and not excessive. However, the brevity comes at the cost of behavioral substance, so it is not a perfect 5.

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 tool with 11 parameters, no output schema, and sparse annotations, the description is far too thin. It fails to explain update semantics, the scope of mutable fields, or how this relates to the surrounding manual-account workflow. An agent would still need to infer most invocation requirements from the schema alone.

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

Parameters1/5

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

Schema description coverage is only 9%, and the description provides no additional meaning for any of the 11 parameters. It does not mention updatable fields, required accountId, or the meaning of optional fields like closed_on or exclude_from_transactions. The description fails to compensate for the schema's lack of parameter documentation.

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 action ('Update') and the resource ('an existing manually-managed account'), which distinguishes it from crypto, synced, and Plaid account tools. It does not explicitly contrast with siblings like update_deleted_account_details, but the resource phrase is specific enough.

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 about when to use this tool versus the many sibling tools, such as update_manual_crypto, create_manual_account, or delete_manual_account. The description simply states the action without explaining which scenarios warrant this tool or when to choose an alternative.

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

update_manual_cryptoA
Idempotent

Update a manually-managed crypto balance. At least one of name, display_name, institution_name, or balance must be supplied. The symbol of an existing balance cannot be changed.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew name for the crypto asset.
balanceNoNew balance as a numeric string with up to 18 decimal places. Pass a string to avoid losing precision.
crypto_idYesId of the manual crypto balance to update. Synced crypto balances cannot be updated.
display_nameNoNew display name for the crypto asset. Pass null to clear it.
institution_nameNoNew institution or wallet provider display name. Pass null to clear it.

TDQS

A4.4/5.0
Behavior4/5

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

The annotation only declares idempotency, so the description adds useful behavioral context: the symbol cannot be changed and at least one updatable field is required. The description does not overstate side effects and aligns with the schema's manual/synced distinction.

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

Conciseness5/5

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

Three short, front-loaded sentences state the operation, the precondition, and the key limitation. Every sentence earns its place, and there is no repetition of schema details or filler.

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 five-parameter update tool with no output schema, the description plus schema covers the essential invocation requirements: what to update, what fields are needed, and what cannot be changed. It omits return-value details, but that is a minor gap given the strong schema and the availability of sibling retrieval tools.

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?

Since schema description coverage is 100%, the schema already documents each parameter well. The description adds meaning beyond the schema by stating the 'at least one of' constraint and the immutability of the symbol, neither of which is captured in the JSON Schema required list.

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, 'Update a manually-managed crypto balance,' which clearly distinguishes this from create/delete/get siblings. It also limits scope to manually-managed balances, so there is little ambiguity about which crypto entity it targets.

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 provides a clear precondition ('At least one of name, display_name, institution_name, or balance must be supplied') and an exclusion (synced balances cannot be updated), which prevents invalid calls. It does not explicitly direct the agent to an alternative tool for creating or updating synced crypto balances, so it falls just short of a 5.

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

update_tagC
Idempotent

Update properties for an existing tag.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
tagIdYesId of the tag to update.
archivedNo
text_colorNo
descriptionNo
background_colorNo

TDQS

C2.8/5.0
Behavior2/5

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

Annotations provide idempotentHint: true, and the description does not contradict this. However, the description adds no behavioral context beyond the basic action: it does not disclose that only provided fields are updated (partial update), any required permissions, or the effect on unmentioned properties. With annotations covering idempotency, the description still fails to provide additional behavioral transparency expected of an update tool.

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, short sentence with no unnecessary words. It is appropriately concise for a simple update operation, front-loading the verb and resource. Every word earns its place, making it efficient and 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?

With six parameters, low schema coverage, no output schema, and only an idempotentHint annotation, the description is insufficient. An agent cannot tell which properties are updatable, whether updates are partial or full, or any validation rules. The description covers only the basic intent, leaving significant gaps for an agent to infer.

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

Parameters2/5

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

Schema description coverage is only 17% (only tagId has a description), and the description itself does not elaborate on any parameters. It only implies the need for an existing tag, which hints at tagId being required. Given the low coverage, the description should compensate by explaining the other fields (name, archived, text_color, description, background_color) or their constraints, but it does not.

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 'Update' and the resource 'existing tag', distinguishing it from create_tag (creates a new tag), delete_tag (removes a tag), and get_single_tag (retrieves a tag). It is specific about the action and target, though it does not explicitly list which properties can be updated, leaving that to the schema.

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 explicit guidance on when to use this tool versus alternatives. It implies you use it when you need to modify an existing tag, but it does not mention when not to use it (e.g., for creation or deletion) or reference any sibling tools. There is no exclusionary context provided.

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 an existing transaction. Provide any subset of writable fields directly (the v2 API no longer wraps the body in a transaction envelope). Cannot modify split or grouped transactions; use the corresponding split/group tools instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
updateYesFields to update. Provide at least one writable field.
transaction_idYesID of the transaction to update.
update_balanceNoDefaults to true. Pass false to skip updating the associated manual account's balance.

TDQS

A4.5/5.0
Behavior4/5

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

The description adds a behavioral constraint beyond the idempotentHint annotation: the restriction on split/grouped transactions, and the v2 API envelope change which is important for agents that may have learned the older wrapper format. It doesn't contradict the annotation and adds meaningful context, though it doesn't describe side effects like balance updates (though update_balance is in 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?

Two sentences with zero waste. The core purpose is front-loaded, the envelope change is stated in a parenthetical, and the restriction/alternative is given in the second sentence. 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?

Despite being a complex tool with a nested update object and three parameters, the description covers the essential usage (how to update, what not to touch) and routes to alternatives. The schema already details all parameter constraints and mutual exclusions, so nothing an agent needs to call correctly 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 coverage is 100% and all parameters have inline descriptions, so the schema carries the burden. The description's note about 'any subset of writable fields directly' adds a slight semantic hint about the update object structure but doesn't go beyond what the schema already implies. This is the baseline 3 for full schema coverage.

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

Purpose5/5

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

States a specific verb and resource ('Update an existing transaction') and immediately clarifies scope: it cannot modify split or grouped transactions, which distinguishes it from sibling tools like split_transaction or create_transactions. The purpose is unambiguous and unique among the many transaction-related siblings.

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?

Explicitly says when NOT to use it ('Cannot modify split or grouped transactions') and names the alternative ('use the corresponding split/group tools instead'). Also instructs how to provide fields ('any subset of writable fields directly'), giving clear usage context without needing to infer.

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

update_transactions_bulkA
Idempotent

Update multiple transactions in a single call (1-500). Each entry must include id plus at least one writable field. Cannot be used to modify split or grouped transactions.

ParametersJSON Schema
NameRequiredDescriptionDefault
transactionsYesArray of partial transaction updates, each keyed by its `id`.

TDQS

A4/5.0
Behavior3/5

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

Annotations provide idempotentHint=true, which is a key behavioral trait. The description does not contradict this, but also doesn't add much beyond the constraint that split/grouped transactions cannot be modified. It doesn't disclose any side effects (like whether updates are atomic) or how the response might be structured, which is a minor gap given the annotation already covers idempotency.

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, each earning its place. The first states the core purpose and value (batch update, size limit), and the second gives a critical constraint (no split/grouped transactions). No fluff, front-loaded information, and easy to scan.

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 context: batch update, size limit, required id, and disqualification of split/grouped transactions. Given there is no output schema, the description doesn't explain the response, which might be a slight gap, but for a batch update tool with idempotent annotation, this is sufficient. The missing information (e.g., atomicity) 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?

Schema description coverage is 100%, meaning all parameters are described in the schema (e.g., 'id' required, 'tag_ids' and 'additional_tag_ids' mutually exclusive). The description adds the crucial requirement that at least one writable field must be included beyond id, which is not in the schema but is essential semantics. However, this is the only addition; the rest 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 clearly states the tool's purpose: updating multiple transactions in a single call, with a specific resource (transactions) and a clear batch capability (1-500). It also distinguishes itself from the singleton 'update_transaction' via the word 'multiple' and the batch size. The description is specific and differentiates from siblings like 'delete_transactions_bulk'.

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 notes that it cannot be used for split or grouped transactions, which is a clear exclusion. However, it doesn't explicitly name alternatives (like 'update_transaction' for single updates), though the sibling list makes it obvious. The exclusion of split/grouped is a strong usage guideline, but lacking explicit 'when to use' guidance.

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

upsert_account_balance_historyA
Idempotent

Create or update monthly balance history entries for a single account. Every month must be a past calendar month — the current month is calculated on demand and cannot be written. The request is all-or-nothing: if any entry fails validation, none are applied. The response contains only the entries submitted, not the account's full history.

ParametersJSON Schema
NameRequiredDescriptionDefault
balancesYesOne or more monthly balance entries to create or update. If any entry fails validation the entire request is rejected and nothing is updated.
account_idYesId of the account to write balance history for.
account_typeYesType of account the balance history belongs to. Use manual for manually-managed accounts, plaid for synced bank accounts, crypto_manual for manually-managed crypto, and deleted for accounts that no longer exist but still have history. Synced crypto uses the dedicated crypto_synced tools instead.

TDQS

A4/5.0
Behavior5/5

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

Beyond the idempotentHint annotation, the description discloses important behavior: the current month cannot be written, the request is atomic/all-or-nothing, and the response contains only submitted entries rather than full history. This is substantial behavioral context that annotations alone would not provide.

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

Conciseness5/5

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

Three sentences with no filler. The core action is front-loaded, followed by the most important constraints, atomicity, and response behavior. Every sentence 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?

The description covers the critical behavioral aspects needed to call the tool safely: past-month restriction, atomicity, and response contents. The rich schema handles parameter details, and the sibling list plus account_type description clarify scope. It does not spell out the synced-crypto exclusion, but that is adequately handled elsewhere.

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 every parameter thoroughly. The description reinforces the all-or-nothing behavior of the balances array and the past-month rule, but adds no per-parameter meaning beyond what the schema provides. Baseline 3 is appropriate.

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

Purpose4/5

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

The description states a clear verb and resource: 'Create or update monthly balance history entries for a single account.' It is specific and not a tautology, though it does not explicitly distinguish itself from the close sibling upsert_crypto_synced_balance_history; that distinction is left to the schema and sibling names.

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 useful constraints such as past-month-only and all-or-nothing semantics, but it does not explicitly say when to use this tool versus alternatives like upsert_crypto_synced_balance_history or get_account_balance_history. Usage context is implied rather than stated with exclusions.

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

upsert_budgetA
Idempotent

Create or update a budget for a category and budget period. The start_date must be a valid budget period start for the account (see get_budget_settings).

ParametersJSON Schema
NameRequiredDescriptionDefault
notesNoOptional notes for the budget period.
amountYesBudget amount.
currencyNoThree-letter lowercase currency code (defaults to primary currency).
start_dateYesBudget period start date in YYYY-MM-DD format. Must be a valid budget period start; if not, the API returns the previous and next valid start dates.
category_idYesCategory ID for the budget.

TDQS

A4/5.0
Behavior3/5

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

Annotations only provide idempotentHint=true, so the description carries most of the behavioral burden. It discloses the upsert semantics ('Create or update') and the start_date validity requirement, which adds value beyond the annotation. However, it does not describe what happens on overwrite (e.g., notes replaced), potential side effects, or error behavior beyond the schema's mention of returning valid dates. 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?

Two sentences, front-loaded with the core purpose, followed by a crucial prerequisite. No fluff; every word earns its place. The structure is efficient and immediately useful.

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 mutation tool with no output schema, the description covers the essential usage: what it does, the key constraint on start_date, and a pointer to get_budget_settings. It does not describe return values or error responses, but those are often omitted for simple tools. The description is complete enough for an agent to call it correctly, especially with full schema coverage.

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 fully documents each parameter. The description repeats the start_date constraint ('must be a valid budget period start') already present in the schema, adding no new parameter semantics. Baseline 3 is appropriate given full schema coverage.

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

Purpose5/5

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

The description states a specific verb ('Create or update'), a resource ('a budget'), and the scope ('for a category and budget period'). It clearly distinguishes the tool from siblings like remove_budget and get_budget_summary by its purpose, and the upsert nature is explicit.

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 on when to use the tool (create or update a budget) and references get_budget_settings for the required start_date format. However, it does not explicitly mention alternatives or exclusions, such as using remove_budget for deletion or get_budget_summary for viewing. The context is clear but not exhaustive.

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

upsert_crypto_synced_balance_historyA
Idempotent

Create or update monthly balance history entries for a synced crypto holding. Every month must be a past calendar month. If an entry sets symbol, it must match the symbol argument. The request is all-or-nothing.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesTicker symbol of the holding within the account (e.g. eth).
balancesYesOne or more monthly balance entries to create or update. If any entry fails validation the entire request is rejected and nothing is updated.
account_idYesId of the synced crypto account.

TDQS

A4.2/5.0
Behavior4/5

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

The annotations only provide idempotentHint, so the description adds meaningful behavior: all-or-nothing semantics, the requirement that months be past calendar months, and the cross-field constraint that an entry-level symbol must match the symbol argument. These go beyond what annotations alone 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 short sentences: the first states the purpose, and the next two state essential constraints. There is no filler, repetition of obvious details, or bloated context. Every sentence 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?

Given the comprehensive schema, idempotentHint annotation, and the description's atomicity and month constraints, an agent has enough to call this tool correctly. The main gaps are the lack of explicit sibling routing and no mention of return behavior, but neither is 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?

Schema description coverage is 100%, so the schema already documents each parameter well. The description adds value by stating a non-obvious cross-parameter invariant: if an entry sets symbol, it must match the top-level symbol argument. This is not fully expressed 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 starts with a precise action: 'Create or update monthly balance history entries for a synced crypto holding.' This clearly names the verb, resource, and scope, and distinguishes it from sibling tools like get_crypto_synced_balance_history or generic account balance upserts.

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 by the description: this is for synced crypto balance history mutation. However, it never explicitly says when to use this instead of related tools such as upsert_account_balance_history or get_crypto_synced_balance_history, and it provides no exclusions or alternative routing.

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. 59 tool updatesv3.0.0
    • First observedadd_supported_cryptocurrency
    • First observedattach_file_to_transaction
    • First observedcreate_category
    • First observedcreate_manual_account
    • First observedcreate_manual_crypto
    • First observedcreate_tag
    • First observedcreate_transaction_group
    • First observedcreate_transactions
    • First observeddelete_account_balance_history
    • First observeddelete_balance_history_entry
    • First observeddelete_category
    • First observeddelete_crypto_synced_balance_history
    • First observeddelete_manual_account
    • First observeddelete_manual_crypto
    • First observeddelete_tag
    • First observeddelete_transaction
    • First observeddelete_transaction_attachment
    • First observeddelete_transaction_group
    • First observeddelete_transactions_bulk
    • First observedget_account_balance_history
    • First observedget_all_categories
    • First observedget_all_manual_accounts
    • First observedget_all_manual_crypto
    • First observedget_all_plaid_accounts
    • First observedget_all_synced_crypto
    • First observedget_all_tags
    • First observedget_balance_history
    • First observedget_budget_settings
    • First observedget_budget_summary
    • First observedget_crypto_synced_balance_history
    • First observedget_recurring_items
    • First observedget_single_category
    • First observedget_single_manual_account
    • First observedget_single_manual_crypto
    • First observedget_single_plaid_account
    • First observedget_single_recurring_item
    • First observedget_single_synced_crypto
    • First observedget_single_tag
    • First observedget_single_transaction
    • First observedget_supported_cryptocurrencies
    • First observedget_synced_crypto_balance
    • First observedget_transaction_attachment_url
    • First observedget_transactions
    • First observedget_user
    • First observedrefresh_synced_crypto
    • First observedremove_budget
    • First observedsplit_transaction
    • First observedtrigger_plaid_fetch
    • First observedunsplit_transaction
    • First observedupdate_category
    • First observedupdate_deleted_account_details
    • First observedupdate_manual_account
    • First observedupdate_manual_crypto
    • First observedupdate_tag
    • First observedupdate_transaction
    • First observedupdate_transactions_bulk
    • First observedupsert_account_balance_history
    • First observedupsert_budget
    • First observedupsert_crypto_synced_balance_history

TDQS

A3.6/5.0

Scored across 59 tools

Disambiguation5/5

Each tool targets a distinct resource and action, such as manual vs synced crypto, single vs bulk transaction operations, and account vs crypto balance history. Descriptions clearly define scope, so an agent is unlikely to confuse one tool with another despite the high count.

Naming Consistency5/5

All tool names follow a lowercase snake_case verb_noun pattern, with get/create/update/delete used predictably across resources. A few semantically appropriate verbs like upsert, split, refresh, and remove do not disrupt the overall consistency.

Tool Count1/5

With 59 tools, the server exposes nearly every endpoint individually, far exceeding the 50+ threshold for extreme mismatch. Even for a broad API like Lunch Money, this volume is overwhelming and would likely hinder agent selection.

Completeness4/5

The set offers CRUD coverage for transactions, categories, tags, manual accounts, manual crypto, budgets, and attachments, plus split/group operations and balance history. The main gap is that recurring items are read-only (no create/update/delete), which is a minor limitation.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    F
    maintenance
    An MCP server that lets AI assistants interact with your Lunchmoney data, enabling natural language queries about transactions, budgets, and spending patterns.
    4
    8 npm
    27
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that enables AI assistants to interact directly with Lunch Money's financial API, allowing users to query transactions, access budget information, and perform financial analysis through natural language.
    -
  • A
    license
    B
    quality
    D
    maintenance
    Enables AI agents to interact with your Lunch Money personal finance data, providing tools for managing transactions, categories, budgets, assets, and accounts.
    15
    13 npm
    ISC
  • A
    license
    A
    quality
    D
    maintenance
    Enables managing personal finances through the Lunch Money API, including transactions, categories, budgets, and accounts via natural language commands.
    14
    10 npm
    3
    MIT