Skip to main content
Glama
ninetails-io

gnucash-mcp

gnucash-mcp

Free, open-source accounting software that works with the LLM.

Talk to your GnuCash books through Claude (or any AI assistant that supports MCP). Ask "how am I doing this month," dictate your transactions out loud, hand over the books for the AI to keep up while you focus on running your life or your business.

Your data stays on your machine. Your audit log stays on your machine. Nothing is uploaded anywhere — the AI reads and writes your local GnuCash file, and that's it.

Three real, populated sample books ship in this repo so you can try it before you commit anything. They're realistic — full years of activity, mixed currencies, customers, invoices, budgets, the works. Walk through one in five minutes; if it clicks, point the server at your own book and you're done.

The samples are frozen snapshots, not living books — expect the dashboard to flag stale prices and pending scheduled transactions that have accumulated since their last regeneration. That's realistic too (it's what a book looks like after a vacation). To rebuild them fresh through today, run the deterministic generators in scripts/synthetic_book/ (phase scripts, in order).


What does it look like?

This is what your AI assistant sees when it opens one of the sample books — a complete financial dashboard in a single call:

Book: samples/alex-chen-morales.gnucash
Currency: USD
Data range: 2025-01-01 to 2026-05-31
Last entry: 2026-05-31 (future-dated, 31 days ahead)
Warnings:
  ⚠ Past due invoice: Berlin Digital GmbH 58 days past 30-day default, EUR 4,200 (no term set)
  ⚠ Stale price: GBP last updated 150 days ago
Accounts: 108 total
Assets: 12 accounts, USD 602680.49
  Condo: USD 473250.00
  VTSAX: 230.7620 VTSAX @ 170.99 (USD 39457.99)
  Vehicle: USD 27845.00
  401k: USD 13404.62
  Checking Account: USD 12393.11
  ...
Liabilities: 4 accounts, USD 418457.79
  Credit cards (2): USD 38044.26
  Loans (2): USD 380413.53
  Top 3: Mortgage USD 372199.55, Chase Sapphire USD 22383.23, Business Amex USD 15661.03
Receivables: 3 accounts, USD 10246.46
  Accounts Receivable EUR: USD 4908.96
  Accounts Receivable: USD 3500.00
  Accounts Receivable CAD: USD 1837.50
Reconciliation:
  Checking Account: 174 splits unreconciled (4 months behind, oldest: 2025-12-30) ⚠
  7 accounts never reconciled ⚠
Net worth trajectory:
  12mo ago: USD 187,925
   6mo ago: USD 180,614
   3mo ago: USD 191,350
   1mo ago: USD 185,444
       now: USD 184,223
Monthly net (last 6 months):
  Apr 2026 (MTD): -9,056
  Mar 2026: +3,092
  Feb 2026: +5,202
  Jan 2026: +1,086
  Dec 2025: +4,853
  Nov 2025: -1,494
Runway: 121 days (USD 84,579 liquid / USD 694/day burn)
Budget (2026 Annual Budget): 41% used / 33% elapsed (+8% over pace)
Transactions: 2473
Scheduled: 13 recurring, none due in next 7 days
Business: 4 customers, 2 vendors, 1 employee

That's not a screenshot — that's the AI's actual orientation view. Net worth trajectory, runway, budget pacing, who owes you money, what's overdue, what hasn't been reconciled. One call, and your assistant has the full picture before you've even finished saying hello.


Related MCP server: FinLynq

Who is this for?

  • Personal finance people who keep their books in GnuCash and want to dictate transactions, ask their assistant where the money's going, get reconciliation help, plan budgets.

  • Small business owners who run their books in GnuCash and want to issue invoices, track receivables, see vendor spending, manage cash flow without leaving the conversation.

  • People who care that their data stays local. No cloud sync. No SaaS. Your .gnucash file is the system of record; this just gives your AI a way to read and write it the way GnuCash itself does.

You don't need to be a developer. You need:

  • A computer (Mac, Windows, or Linux)

  • GnuCash itself, or willingness to install it (free at gnucash.org)

  • An AI assistant that supports MCP (Claude Desktop is the most common; Claude Code, Continue.dev, and others work too)

  • 10 minutes to get the sample books running, then another 10 to point at your own


Try it without risking anything

The repo ships three sample books — fully-populated synthetic ledgers you can talk to without touching your real data. Pick one, point the server at it, and start asking questions.

samples/alex-chen-morales.gnucash — Personal + freelance

A Seattle-based independent software contractor with a US LLC. USD-default. ~141 accounts, ~2,475 transactions across 2025– 2026. Has a mortgage, a brokerage with VTSAX/VBTLX/AAPL/MSFT/ETH holdings, a 401(k), four customers spanning USD/EUR/GBP/CAD with foreign-currency invoices, scheduled bills, a budget — pretty much everything the server can do, all in one book.

samples/lin-wei.gnucash — Cross-border small business

A Shenzhen-based small-business owner running a cross-border e-commerce operation. CNY-default. ~105 accounts, ~1,960 transactions. Chinese-named customers paying in CNY, USD/EUR customers paying in foreign currency with realized FX gain/loss on rate moves, domestic Chinese investments (茅台, 宁德时代, ETFs), an LPR-based mortgage, mixed payment rails (checking + Alipay + WeChat Pay).

samples/sabine-brenner.gnucash — German freelancer, SKR03 chart

A Munich-based freelance consultant. EUR-default, on a German SKR03 chart of accounts — every account name in German. ~110 accounts, ~1,500 transactions. This is the i18n oracle: if a feature secretly assumes English account names or USD, Sabine's book is where it breaks.

All three books are fictional. See samples/README.md for the full breakdown of what's in each.


Quick Start

The one-click way (Claude Desktop)

Download gnucash-mcp.mcpb from the latest release and double-click it. Claude Desktop installs the server — no terminal, no config file, no Python. The installer asks three things:

  • Your GnuCash book(s) — a file picker. Books must be in SQLite format; if yours is the older XML format, do the one-time conversion first. Pick several books to switch between them in-chat.

  • Demo books — one checkbox serves the three sample books described above, so you can explore on fictional money before (or instead of) connecting your own.

  • "Do you invoice clients?" — yes adds the business suite (customer invoices, vendor bills, employee expenses). Everything else — budgets, scheduled transactions, investment tracking — is always on.

That's the entire install. Skip ahead to step 4 to take it for a spin.

The manual way (any MCP client, or development)

The path below gives you an updatable git-clone install — for Claude Desktop without the bundle, for other AI clients, or for hacking on the server itself.

1. Download and install

git clone https://github.com/ninetails-io/gnucash-mcp.git
uv tool install -e ./gnucash-mcp

The second command gives you a gnucash-mcp command (in ~/.local/bin) with its dependencies in a private environment — your other Python projects never see them. The -e makes it an updatable install: the command runs whatever code is in your clone, so updating is git pull plus a server restart. The one exception: if an update changes dependencies, run uv tool install -e ./gnucash-mcp --reinstall once.

If you don't have uv, install it with one line: curl -LsSf https://astral.sh/uv/install.sh | sh

2. Make a working copy of a sample book

The server writes audit logs and auto-backups alongside the book file. You don't want either of those committed back to the repo, so copy the book somewhere outside the repo first:

mkdir -p ~/gnucash-mcp-scratch
cp gnucash-mcp/samples/alex-chen-morales.gnucash ~/gnucash-mcp-scratch/alex.gnucash

3. Tell Claude Desktop about the server

Find your Claude Desktop config:

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

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

Add this — replace yourname in both paths:

{
  "mcpServers": {
    "gnucash": {
      "command": "/Users/yourname/.local/bin/gnucash-mcp",
      "args": ["--modules=all"],
      "env": {
        "GNUCASH_BOOK_PATH": "/Users/yourname/gnucash-mcp-scratch/alex.gnucash"
      }
    }
  }
}

Use the full path to the command: GUI apps launch without your shell's PATH, so a bare gnucash-mcp may not resolve even though it works in your terminal. (uv tool dir --bin prints the right directory if yours differs.) --modules=all loads every tool (86 of them) so you can poke at anything. Once you know what you actually use, narrow it — see choosing a module set below.

Quit Claude Desktop completely (not just close the window — quit) and reopen it. Look for the hammer 🔨 icon next to the text input. That means the server's connected.

4. Try it

Ask Claude:

  • "Summarize the book."

  • "What's my net worth been doing?"

  • "Show me anyone who owes me money."

  • "What did I spend on dining last month?"

  • "Set a $500 monthly grocery budget."

The first response usually starts with the dashboard from above. Everything after that is conversational.

When you're ready to point at your own book, replace the GNUCASH_BOOK_PATH value with the path to your real .gnucash file (more on that next), restart Claude Desktop, and ask away.


Connecting to your own book

One-time conversion: GnuCash file format

The server only reads the SQLite form of GnuCash files, not the older XML form. To convert:

  1. Open your book in GnuCash itself

  2. File → Save As

  3. Change "Data Format" to SQLite3

  4. Save with a new filename (e.g. mybook-sqlite.gnucash)

  5. Keep the XML original as a backup.

On Linux (Debian/Ubuntu), SQLite3 may be missing from the "Data Format" drop-down entirely — GnuCash needs a backend driver that isn't installed by default. Close GnuCash, install it, then reopen and the option appears:

sudo apt update && sudo apt install libdbd-sqlite3

You only do this once. From then on, GnuCash and the MCP server both work against the same SQLite file.

Set the path

Update GNUCASH_BOOK_PATH in your Claude Desktop config to point at your own SQLite-format book. Restart Claude Desktop.

Use absolute paths, not ~ or relative paths. On Mac/Linux: /Users/yourname/Documents/mybook.gnucash. On Windows: C:\\Users\\yourname\\Documents\\mybook.gnucash (note the doubled backslashes — that's a JSON requirement).

Other AI clients

This is an MCP server, so it works with any client that speaks MCP. Everywhere below, gnucash-mcp means the full path from the install step (/Users/yourname/.local/bin/gnucash-mcp; uv tool dir --bin prints yours).

  • Claude Code: claude mcp add-json gnucash '{"command":"/Users/yourname/.local/bin/gnucash-mcp","args":["--modules=all"],"env":{"GNUCASH_BOOK_PATH":"/path/to/your/book.gnucash"}}' Add --scope user for all projects, --scope project for this one only.

  • ChatGPT (desktop app / Codex): Settings → Connectors → Add MCP server. Name it gnucash-mcp, type STDIO, "Command to launch" = the full gnucash-mcp path, one argument --modules=all, and an environment variable GNUCASH_BOOK_PATH = your book's path.

  • Gemini CLI: gemini mcp add -e GNUCASH_BOOK_PATH="/path/to/your/book.gnucash" gnucash /Users/yourname/.local/bin/gnucash-mcp --modules=all This writes a project .gemini/settings.json with the server registered; run /mcp list inside Gemini to confirm it shows gnucash - Ready. (Verified on Linux — if GnuCash never offered a SQLite3 export, see the libdbd-sqlite3 note above. The Gemini walkthrough and the Linux driver fix both come from @hpuri's testing in #89 — thanks.)

  • Anything else: set GNUCASH_BOOK_PATH and run gnucash-mcp. No install at all? uv run --directory /path/to/gnucash-mcp gnucash-mcp and python -m gnucash_mcp (with the repo on the path) both still work. Any client that can spawn a command and speak MCP over stdio will do.


Choosing a module set

--modules=all is the easy default — every tool, 88 of them. For day-to-day use you'll probably want less. Pick the role that matches how you'll talk to the server. Each role is a group that expands to the underlying tool modules; you can also pick the leaves individually for a finer cut.

Role

What it gives you

Tools

core

Ledger primitives — accounts, transactions, balances, slots, audit log, backups, balance sheet, reconciliation. Always loaded.

29

bookkeeper

Run reports, manage budgets, schedule recurring transactions. The personal-finance management cluster. (Reconciliation moved into core — any configuration that handles money needs it.)

17

investor

Cost-basis tracking + price/commodity management. Tax-lot accounting needs prices to compute gains, so the bundle is the useful unit.

12

freelancer

Party + document management (polymorphic: customers by default; vendors/employees unlock with business_complete), sales tax, billterms, jobs, credit notes. The full solo-consultant toolkit.

26

business

Full small-business package — group alias: freelancer's tools with the vendor/employee sides unlocked, plus vendor reports.

27

Pick one or more, comma-separated:

"args": ["--modules=bookkeeper"]            // personal finance
"args": ["--modules=investor"]              // self-directed investor
"args": ["--modules=freelancer"]            // solo contractor
"args": ["--modules=business"]              // small business (= freelancer + business_complete)
"args": ["--modules=bookkeeper,investor,freelancer"]  // most things

core is force-added regardless; the explicit listing in the examples above is for clarity. The leaf modules behind each group (reconciliation, reporting, budgets, scheduling, tax_lots, portfolio, etc.) are individually selectable too — run uv run gnucash-mcp --help from the repo for the full menu.


What you can ask it to do

A non-exhaustive tour. Phrase any of these naturally — the assistant translates.

Entering a whole statement

"Here's my August checking statement." (attach the PDF)

Rehearsed 31 lines against your book: 24 new, 6 already entered (claimed), 1 needs a look — here's the comparison. Confirm and I'll land the month: entered, categorized, and reconciled to the closing balance in one step.

One statement, two calls, a tied book. The dry-run classifies every line with evidence before anything is written, and the commit refuses wholesale rather than land a month that doesn't tie.

Recording activity

"I spent $47.50 at Safeway today on groceries, paid with my Visa."

Recorded: $47.50 from Credit Card:Visa to Expenses:Groceries on Apr 30, 2026. Description: "Safeway".

Setting up recurring bills

"Set up my rent as a recurring bill. $1,850 on the 1st of every month from checking."

Created scheduled transaction "Monthly Rent": $1,850 monthly, from Assets:Checking to Expenses:Rent. Next due: May 1, 2026.

Investment tracking

"I bought $1,000 of VTSAX at $170.99/share in my 401(k)."

Recorded VTSAX purchase: 5.85 shares at $170.99/share. Cost basis: $1,000.00. Lot created for capital-gains tracking when you eventually sell.

Invoicing customers

"Create a customer called Acme Corp and invoice them $1,500 for consulting."

Created customer Acme Corp (id 000005) and invoice 000019: 1× Consulting at $1,500.00 = $1,500.00. Open. Tell me when you're ready to post it.

Foreign-currency invoicing

"Invoice Berlin Digital €4,200 for Q1 retainer, due in 30 days."

Created EUR invoice 000020 for Berlin Digital GmbH: 1× Q1 Retainer at EUR 4,200 = EUR 4,200. Net 30. When they pay, I'll book the realized exchange-rate gain/loss to your FX account automatically.

Asking questions

"How much did I spend with each vendor this year?"

Office Depot: $2,340 (4 bills, $0 outstanding) CloudHost Inc: $1,200 (2 bills, $600 outstanding) Legal Associates: $3,500 (1 bill, $3,500 outstanding) Total billed $7,040 / paid $2,940 / outstanding $4,100.

Reconciliation

"Help me reconcile checking against the April statement."

[Walks you through it: pulls unreconciled splits, asks you to confirm cleared transactions, computes the running balance, marks the matched ones reconciled, leaves the mismatches for you to investigate.]


Privacy and safety

Your data does not leave your machine. This server is a local process that reads and writes a local file. The AI assistant you're talking to (Claude Desktop, etc.) sees the results of your tool calls — the same content you'd see on screen — but the file itself stays where it always was.

Every write is logged. A human-readable audit trail lives alongside your book file at <your-book>.gnucash.mcp/audit/, one log file per day. You can read it at any time to see exactly what changed and when. Sample entry:

2026-04-30 14:32  POST INVOICE  id:000019
    total: 1500.00  date: 2026-04-30
    account: Assets:Accounts Receivable  txn:a1b2c3d4

Automatic backups. Before the very first write of each session, the server snapshots your book to <your-book>.gnucash.mcp/backups/ — so if something goes wrong, you can roll back to a known-good state without relying on Time Machine or your own habit. Backups are verified with PRAGMA integrity_check before being declared valid, and skipped when the book hasn't changed since the last snapshot. See docs/RESTORE_FROM_BACKUP.md for the rollback procedure.

Reading timestamps: backup filenames carry UTC timestamps (filesystem-safe and unambiguous across travel and DST); audit and debug logs use local-dated daily files, matching how you'd search for "what happened Tuesday." Near midnight these can differ by a day — keep that in mind when matching a backup to a day's log.

Reconciled splits are protected. The server refuses to delete or modify reconciled splits without an explicit override, so a careless prompt can't quietly invalidate your last bank reconciliation.

Voiding ≠ deleting. When you tell the AI to "void this transaction," it uses GnuCash's proper accounting void — preserving the transaction for the audit trail with values zeroed. Deletion is the destructive option; the AI will tell you which one it's doing.

Disclaimer: This software is provided "as is" under the MIT License, without warranty of any kind. The authors are not liable for any data loss, corruption, or financial discrepancy arising from its use. You are solely responsible for maintaining your own backups and verifying the accuracy of your books.


Limiting what the AI can see

Each tool's description lives in the AI's system prompt, which costs context on every message. Narrowing the toolset to what you actually use makes every conversation cheaper. See choosing a module set above for the five role-based options (core, bookkeeper, investor, freelancer, business).

You can also set GNUCASH_MCP_MODULES=core,bookkeeper as an environment variable instead of --modules=... in the JSON args.


What's new in v1.4.4

The statement is the call — the bulk-operations line closes with its capstone, and rehearsal spreads to every consequential write:

  • enter_statement — a complete bank statement (opening balance, closing balance, every line) enters, claims its matches against transactions already in the book, and reconciles in ONE atomic call. Dry-run first by default: every line classified with side-by-side evidence, and a projected balance tie that guarantees a rehearsal that ties is a commit that will tie. No half-landed months, ever.

  • Rehearsal everywherepay_document gains dry_run (proposed splits, FX and discount treatment, projected balance, zero writes), and batch entry's dry-run shows self-contained duplicate comparisons with a review_required status that never masquerades as clearance.

  • One-click install — the MCPB bundle: download, double-click, and Claude Desktop runs the server. Built by the project's first CI on every PR.

  • A surface that tells the truth about itself — MCP ToolAnnotations on every tool (read-only says so, destructive says so), strict CLI arguments, a defined status vocabulary, and a debt plan that names every debt it had to leave out.

  • The un-blooming, completed in one release — the tool surface peaked at 111 and ships at 86: the business surface consolidated (48 tools → 27, one polymorphic family per verb), and the batch tools are now THE entry/update tools (the singular create/update removed at full capability parity).

Tests: 2,100+ passing, parallel by default (full suite < 40s).

What's new in v1.4.2

One call wide, every surface honest — every entry traces to a named moment of live friction:

  • The bulk grammar is completeupdate_transactions (per-row TSV edits), broadcast updates (one change, many GUIDs), create_prices (batch quotes + a stale-price work list), and a cur column so foreign-denominated transactions batch-enter like everything else.

  • Reconciliation kept honestreconcile_all honors its statement-date bound; a new get_reconciliation_status tool drills down behind the dashboard's counts; statement-less accounts opt out of nagging with the no_reconcile slot; paid-off dormant cards stop warning forever.

  • The dashboard hands each session its vocabulary — your top accounts by recent posting frequency, in short-GUID form, so the AI reaches for compact refs from the first call.

  • First outside code contribution — @bhbrunt's price-lookup memoization and split-graph preload took a 33k-split book's summary from never-completing to under 10 seconds (and made small books ~45% faster too).

  • Audit trail hardened — user text is escaped before it reaches the audit log (no forged entries, no smuggled instructions), price dry-runs agree with live execution, and moving the date of a reconciled transaction now requires force=true (behavior change).

Tests: 1,954 passing.

What's new in v1.4.1

Batch entry grows up, driven by the bookkeeper's daily workflow:

  • The TSV header declares the layout — opt-in memo columns (per-split memos), a notes column (per-transaction notes), and qty columns (investment shares / foreign-currency splits). Legacy submissions parse unchanged; typo'd column names reject by name; a row may simply end once its last split's amount and account are present.

  • Auto-fill from history — a row with no split cells at all reproduces your most recent transaction with that description, marked with its source. Twelve recurring bills = twelve ref-date-description rows; dry_run the batch to preview every match first.

  • Batch deletedelete_transaction takes a list of GUIDs: one call, one save, all-or-nothing.

  • Every annotation field reachable — notes + action on invoice/bill/voucher/credit-note line items, a payment memo on pay_document, account notes (shared with GnuCash desktop's editor), and scheduled transactions that actually keep their description.

  • Find accounts without pagingquery on list_accounts matches path and description, so "4930" finds the SKR03 account.

  • Plus the v1.4 adversarial-review hardening (transactional switch_book, per-book backup scoping, i18n fixes) and monthly-close valuation for flow reports.

Tests: 1,856 passing.

What's in v1.4.0

The release where batch transaction entry entered the scene. v1.3 finished the business module; v1.4 makes the server work correctly on non-English books, adds bulk and multi-book workflows, and lands a second multi-currency correctness pass.

Internationalization:

  • Account resolution keys off GNCAccountType, never a localized account name — so a de_DE, es_MX, or zh_CN book resolves Income, Imbalance, and FX accounts correctly. Designated accounts (FX gain/loss, discounts) self-heal via a KVP slot that is locale- and rename-proof after first use.

  • Suspense / Imbalance accounts are excluded from runway and low-cash signals so a lopsided book doesn't skew the dashboard.

  • Three synthetic personas ship in-repo: Alex (USD), Lin Wei (CNY, zh_CN chart of accounts), and Sabine Brenner (German DATEV SKR03, EUR) — the German book is what makes the i18n bug class visible.

Batch and multi-book workflows:

  • create_transactions enters many transactions in one atomic call and returns a per-transaction result you can correlate back by a caller-supplied ref, plus a duplicates table keyed to it.

  • GNUCASH_BOOK_PATH accepts an os.pathsep-separated list of books; switch_book flips the active book mid-session (matched by unique filename prefix) with a context-reset banner so cross-book references don't leak.

Reporting:

  • Every list-returning tool paginates with offset and a Showing X-Y of Z indicator; dated tools also render the covered date range.

  • The aggregation reports take group_by for sub-period columns.

Multi-currency correctness (second pass):

  • FX gain/loss booked in the book's default currency, both-foreign posting splits valued at the posting-date rate, and lot cost basis in the default currency. Foreign debts with no FX rate are excluded from debt_payoff_plan with a warning.

  • An FX entry-sanity warning fires when a cross-currency transaction's implied rate diverges sharply from the latest price on file.

Tests: 1,714 passing.

A condensed changelog of major releases lives in CHANGELOG.md.


Troubleshooting

No 🔨 hammer icon, or "tool not found"

  • Quit Claude Desktop completely, then reopen it. (Closing the window isn't enough — you have to quit the application.)

  • Verify the paths in your config are absolute and correct.

  • Check the JSON for trailing commas — they break the config silently.

"Book not found"

  • Use absolute paths, not ~ or relative paths.

  • Mac/Linux: /Users/yourname/Documents/book.gnucash

  • Windows: C:\\Users\\yourname\\Documents\\book.gnucash (doubled backslashes — JSON requirement)

"Cannot open book" / piecash errors

  • Confirm your book is in SQLite format, not XML.

  • Make sure GnuCash isn't open with the same book — file lock.

  • Try opening the book in GnuCash itself to verify it isn't corrupted.

"Account not found"

  • Use full account paths: Expenses:Groceries, not just Groceries.

  • Or ask the assistant to list accounts: "List my accounts."

Multiple server processes after a client restart

Claude Desktop (and some other MCP clients) may briefly spawn two or three copies of the server when relaunching. This is client behavior, not a server bug, and it's mostly harmless: the server opens your book per-request and releases the file lock between calls, so overlapping processes contend only for moments. If you see persistent Lock on the file errors after a client restart, quit the client fully, confirm with pgrep -fl gnucash-mcp that no strays remain, and relaunch.

Something went wrong

  • Open the audit log at <your-book>.gnucash.mcp/audit/ — every write since the server first ran is there with before/after detail.

  • If you need to roll back, docs/RESTORE_FROM_BACKUP.md walks through it.


Support the project

If gnucash-mcp is useful to you, consider buying me a coffee. It helps keep development going.


For developers

Contributor guide and design notes live in CLAUDE.md. Quick orientation:

uv sync --extra dev
uv run pytest                       # 2,100+ tests as of v1.4.4, parallel by default
uv run ruff check src/ tests/
uv run black --check src/ tests/

The installed gnucash-mcp command tracks your clone live: it serves whatever branch the checkout is on, so switching branches switches the served code at the next restart — handy for testing, worth remembering when you forget you're mid-branch. To run a DIFFERENT checkout (a second worktree) without touching the install, uv run --directory PATH gnucash-mcp still runs any directory you point it at.

The server is built on piecash (Python interface to GnuCash's SQLite books) and the MCP Python SDK. Roughly 18,000 lines of Python source, 20,000 lines of tests, modularized so disabled modules cost nothing at runtime.

License

MIT.

Acknowledgments

  • GnuCash — the free, open-source accounting software this server makes conversational.

  • piecash — Python interface to GnuCash SQLite books.

  • MCP Python SDK — the Model Context Protocol implementation.

Available Tools

87 tools
add_document_entryA

Add a line item to a customer invoice, vendor bill, employee voucher, or credit note.

Only unposted documents accept entries — unpost_document first to amend a posted one. Amounts are decimal strings; the line total is quantity × price (plus tax when a taxtable is attached).

Args: document_type: "invoice", "bill", "voucher", or "credit_note". id: Document ID (e.g., "000001"). account: Income account for invoices / credit notes; expense account for bills and vouchers. Full path, %short GUID, or full GUID. description: Line item description. quantity: Quantity as a decimal string (e.g., "3"). price: Unit price as a decimal string (e.g., "125.00"). party_type: Credit notes only — disambiguates when a customer and vendor credit note share an ID. taxtable: Tax table name to apply. Optional. tax_included: Whether price already includes tax. notes: Optional entry notes. action: Optional entry action label (e.g., "Hours").

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
notesNoOptional notes. Capped at 4096 characters at the MCP boundary; oversize input rejects with a clear error.
priceYes
actionNo
accountYes
quantityYes
taxtableNo
party_typeNo
descriptionYes
tax_includedNo
document_typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

The description discloses key behavioral details beyond the minimal annotations: decimal string amounts, line total calculation, tax behavior, and the unposted-document constraint. This materially helps the agent predict side effects and constraints.

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 well-organized with a clear opening, essential constraints, and a structured Args list. Despite covering 11 parameters, every sentence adds useful information without redundant restatement of the schema.

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 11 parameters, the description covers required inputs, optional inputs, edge cases, and prerequisite conditions. An output schema exists, so the lack of return-value detail is not a gap.

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?

With only 9% schema coverage, the description carries the full parameter burden and succeeds: every parameter is described, and high-value semantics are added, such as account direction by document type and party_type disambiguation for credit notes.

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 line item') and a specific resource (customer invoice, vendor bill, employee voucher, credit note). This clearly identifies what the tool does and differentiates it from siblings like create_document or create_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?

It explicitly states when the tool applies ('Only unposted documents accept entries') and gives a prerequisite action (unpost_document first for posted documents). It does not explicitly contrast with alternatives like create_document, but the 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.

apply_credit_noteA

Net a posted credit note against a posted invoice or bill from the same owner. No cash moves — the credit balance transfers between lots on the same A/R or A/P account.

This is the most common credit-note settlement path: the bookkeeper issues a credit note against an overcharge, then nets it against the next invoice from that customer (or applies it to an outstanding bill on the vendor side). Use pay_document instead when the credit note will be settled by sending or receiving cash.

Args: credit_note_id: The credit note to apply (must be posted). applies_to_invoice_id: The target invoice/bill (must be posted, same owner, same currency, same A/R or A/P post account). Need not be the document the credit note was created against — that link is provenance, and the response notes the divergence when this target differs from it. amount: Decimal-string amount to apply, in the document currency. Defaults to min(credit_note_ remaining, target_remaining) — apply as much as possible. apply_date: ISO date for the netting transaction. Defaults to today. owner_type: Optional 'customer' or 'vendor' disambiguator for ID collisions.

ParametersJSON Schema
NameRequiredDescriptionDefault
amountNo
apply_dateNo
owner_typeNo
credit_note_idYes
applies_to_invoice_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

Beyond the annotations, the description discloses meaningful behavioral traits: the transaction is non-cash, it transfers credit balance between lots, both documents must be posted and share owner/currency/account, and the response notes divergence when the target differs from the provenance document. It also explains the amount default behavior and date default, which directly informs call behavior.

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 front-loaded with the core operation, then provides context, an explicit alternative, and well-organized parameter documentation. Every sentence contributes either behavioral context, usage guidance, or parameter semantics. The Args block is formatted clearly and maps directly to the input schema.

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 the tool has 5 parameters, no schema descriptions, and an output schema exists, this description covers everything an agent needs to call the tool correctly: operation semantics, constraints, defaults, ownership requirements, and when to choose an alternative. The only missing details would be error cases, but the detailed constraints and output schema sufficiently cover the core contract.

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?

Schema description coverage is 0%, so the description carries the full burden, and it succeeds. Every parameter is explained with constraints, defaults, and format: credit_note_id must be posted, applies_to_invoice_id must be posted and share owner/currency/account, amount is a decimal string defaulting to max possible, apply_date is ISO defaulting to today, and owner_type disambiguates ID collisions.

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 precise verb and resource: 'Net a posted credit note against a posted invoice or bill from the same owner.' It immediately clarifies that no cash moves, and the mechanism (credit balance transfers between lots on the same A/R or A/P account) distinguishes it from payment-related siblings like pay_document.

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 the right choice—'the most common credit-note settlement path'—and provides a direct exclusion: 'Use pay_document instead when the credit note will be settled by sending or receiving cash.' This gives an agent clear decision criteria without needing to inspect other tools.

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

assign_split_to_lotA
DestructiveIdempotent

Assign a transaction split to a lot.

Use after creating a buy/sell transaction to link the investment account split to its lot for cost basis tracking.

Args: split_guid: GUID of the split (from transaction's investment account). 8+ char prefix accepted. lot_guid: GUID of the lot (or 8+ char prefix).

Workflow: 1. create_lot("Assets:VTSAX", "VTSAX Jan 2026") 2. create_transactions(...one-row batch buying 10 shares, qty column on the investment leg...) 3. assign_split_to_lot(investment_split_guid, lot_guid)

ParametersJSON Schema
NameRequiredDescriptionDefault
lot_guidYesLot GUID (32-char hex or 8+ char prefix)
split_guidYesSplit GUID (32-char hex or 8+ char prefix)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior2/5

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

Annotations mark this as destructiveHint=true and idempotentHint=true, so the description must clarify the destructive effect, but it only says 'link' and 'for cost basis tracking.' It does not explain whether an existing split-lot assignment is overwritten or whether the operation has consequences beyond linking. This is a meaningful gap for 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.

Conciseness4/5

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

The description is well-structured with a one-sentence purpose, usage guidance, args list, and workflow. It is slightly longer than strictly necessary due to the example workflow, but the workflow concretely demonstrates how the tool fits into a multi-step process, so the length is justified.

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 tool with an output schema, the description provides the workflow, param sources, and when to use it. It is practically complete for correct invocation. The main missing context is the destructive behavior already penalized under behavioral transparency, but for agent invocation the description is sufficient.

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

Parameters4/5

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

The schema already covers both parameter formats with 100% coverage, so the baseline is 3. The description adds useful context beyond the schema, especially for split_guid: 'GUID of the split (from transaction's investment account)' and the workflow showing how the split_guid and lot_guid are produced.

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: 'Assign a transaction split to a lot.' It clearly identifies the object being operated on (a transaction split) and the target (a lot), and the rest of the description explains how this fits into the lot-assignment workflow, distinguishing it from lot creation and transaction creation 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?

Explicitly says 'Use after creating a buy/sell transaction to link the investment account split to its lot for cost basis tracking' and reinforces this with a numbered workflow. It gives clear timing and context, though it does not explicitly list alternative tools or exclusionary conditions.

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

balance_sheetA
Read-only

Generate a balance sheet as of a specific date.

Shows assets, liabilities, and equity with account breakdowns. A = L + E holds by construction; non-zero unrealized P&L appears as a synthetic equity row.

Args: as_of_date: Date in ISO format (YYYY-MM-DD). Defaults to today — matching get_book_summary's implicit cutoff so cross-tool comparisons agree without threading the same date into both calls. Pass an explicit date for historical snapshots.

ParametersJSON Schema
NameRequiredDescriptionDefault
as_of_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, it discloses meaningful behavior: the balance sheet equation holds by construction and non-zero unrealized P&L is shown as a synthetic equity row. It also specifies the default date behavior and how it aligns with get_book_summary, giving an agent a clear model of what the tool will do.

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 tightly structured: purpose first, then output behavior, then parameter details. Each sentence adds distinct value, and the parameter explanation is placed in a clearly labeled Args section without unnecessary fluff.

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 one optional parameter, read-only annotations, and an output schema present, the description covers all essential invocation context: date format, defaulting behavior, cross-tool consistency, and the synthetic row caveat. No critical information an agent would need to call this tool correctly is missing.

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 provides no description coverage (0%), but the description fully compensates for the single as_of_date parameter: ISO format, default of today, alignment with get_book_summary's implicit cutoff, and explicit use for historical snapshots. This gives an agent everything needed to use the parameter correctly.

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 ('Generate') and resource ('balance sheet'), plus a date scope. The content details — assets, liabilities, equity, account breakdowns, and A = L + E — clearly distinguish this from report siblings like net_worth and cash_flow.

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 primary use case obvious and provides concrete date-handling guidance, including alignment with get_book_summary's implicit cutoff for cross-tool comparisons. It does not explicitly state when not to use it or name alternative report tools, but the context is clear enough.

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

calculate_lot_gainA
Read-only

Calculate potential or actual capital gain for a lot.

If shares and sale_price provided, calculates hypothetical gain. Otherwise uses lot's current state and latest price.

Args: lot_guid: Lot GUID (or 8+ char prefix). shares: Optional number of shares to calculate for. Defaults to all remaining shares. sale_price: Optional sale price per share. Defaults to latest price for the commodity.

ParametersJSON Schema
NameRequiredDescriptionDefault
sharesNo
lot_guidYesLot GUID (32-char hex or 8+ char prefix)
sale_priceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already convey readOnlyHint=true, so safety is established. The description adds meaningful behavioral detail: the two calculation paths, defaulting shares to all remaining, and defaulting sale_price to latest price. This goes beyond what annotations provide and is consistent with 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 compact and efficiently structured: purpose, mode logic, then parameter details. No sentence is wasted, and the most important behavioral distinction 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?

With an output schema present, return-value documentation is unnecessary. The description covers the two usage modes and defaults adequately. The only minor gap is ambiguity about partial combinations, such as providing sale_price without shares, but overall the agent has enough to call 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?

Schema coverage is only 33%, and the description compensates by documenting all three parameters, including defaults for shares and sale_price. This gives the agent critical meaning that the schema lacks for two parameters, though it stops short of specifying units or edge-case behavior.

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: 'Calculate potential or actual capital gain for a lot.' This clearly distinguishes the tool from siblings like get_lot or get_latest_price, which retrieve data but do not compute gain.

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 explicit mode-based guidance: if both shares and sale_price are provided, compute hypothetical gain; otherwise, use the lot's current state and latest price. This is clear usage context, though it does not name sibling alternatives or state when not to use the tool.

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

cash_flowA
Read-only

Calculate cash flow (inflows and outflows) for a period.

Scope is BANK and CASH accounts by default. Credit-card and investment movements are not cash flow (they're liability / asset changes — use balance_sheet). An explicit account= of any type works but the default scope is narrow.

Internal transfers (transactions with no INCOME or EXPENSE leg — transfer to savings, currency wallet shuffle, paying a credit card from checking) are filtered by default. The default totals answer "where did money come from and where did it go?" rather than "every debit and credit." Pass include_transfers=true for the gross flow (e.g. for reconciling against a bank statement).

Args: start_date: Start of period (YYYY-MM-DD) end_date: End of period (YYYY-MM-DD) account: Optional specific account to analyze (defaults to all cash/bank accounts) include_transfers: When False (default), filter internal transfers. When True, include every cash/bank movement regardless of category. group_by: Optional "month", "quarter", or "year" — split the range into sub-period columns and return an Inflows / Outflows / Net trend table (TSV).

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
end_dateYes
group_byNo
start_dateYes
include_transfersNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses important behavioral details: default account scope, the filtering of internal transfers, the semantic difference between net cash flow and gross movement, and the effect of include_transfers. It also describes the group_by output shape. This substantially exceeds what annotations alone convey and contains 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?

The description is front-loaded with purpose and scope, then organized into clear behavioral notes and an Args block. Every sentence adds information—scope exclusions, transfer filtering rationale, and parameter details—without filler or repetition. It is appropriately detailed for a tool with nuanced behavior.

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 five parameters, two required, and meaningful default-scope behavior, the description covers the essential decision points: what counts as cash flow, what is excluded, how to include transfers, and how grouping changes output. The presence of an output schema means return-value documentation is not required here. An agent has enough context to call it correctly.

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?

Schema description coverage is 0%, so all parameter meaning must come from the description. It thoroughly explains every parameter: date formats, account default behavior, include_transfers semantics for both values, and group_by allowed values plus output format. This fully compensates for the bare 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 opens with a specific verb and resource: 'Calculate cash flow (inflows and outflows) for a period.' It clearly distinguishes itself from siblings by defining the default scope as BANK and CASH accounts and explicitly contrasting with balance_sheet for credit-card and investment movements. This leaves no ambiguity about what the tool computes.

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 explicit when-to-use guidance and names an alternative: credit-card and investment movements are not cash flow and should use balance_sheet. It also clarifies when to pass include_transfers=true, such as when reconciling against a bank statement, and explains the default filtering philosophy. This is model usage guidance.

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

close_lotA
DestructiveIdempotent

Mark a lot as closed.

Use when a lot is fully sold but wasn't automatically marked closed, or to manually close a lot with zero shares.

Args: guid: Lot GUID (or 8+ char prefix).

Note: Lots are automatically marked closed when their quantity reaches zero through assigned splits. This tool is for manual cleanup.

ParametersJSON Schema
NameRequiredDescriptionDefault
guidYesLot GUID (32-char hex or 8+ char prefix)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

The annotations already provide destructiveHint=true, readOnlyHint=false, and idempotentHint=true. The description adds useful behavioral context beyond those: lots normally auto-close via assigned splits, and this tool exists for when that doesn't happen. It explains the intended edge-case role without contradicting the annotations.

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

Conciseness5/5

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

The description is short and well-structured: a one-line action, explicit use cases, the single parameter, and a clarifying note. Every sentence contributes useful information without repetition or filler.

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

Completeness5/5

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

This is a low-complexity tool with one fully documented parameter, an output schema, and informative annotations. The description covers when to use it, why it may be needed, and what input is expected, which is complete enough for an agent 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?

The schema already describes guid as 'Lot GUID (32-char hex or 8+ char prefix)' with 100% coverage. The description's 'Lot GUID (or 8+ char prefix)' adds no meaningful semantic value beyond the schema, 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 opens with the specific verb and resource: 'Mark a lot as closed.' It goes beyond the name by clarifying the tool is for manual cleanup, which distinguishes it from related lot operations like assign_split_to_lot or calculate_lot_gain.

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

Usage Guidelines5/5

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

It explicitly says 'Use when a lot is fully sold but wasn't automatically marked closed, or to manually close a lot with zero shares.' It also explains that lots close automatically at zero quantity, so the agent knows this is a fallback/manual tool rather than a routine one.

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

create_accountA

Create a new account in the chart of accounts.

Args: name: Account name (e.g., "AI Subscriptions"). account_type: One of ASSET, BANK, CASH, CREDIT, EQUITY, EXPENSE, INCOME, LIABILITY, MUTUAL, STOCK, RECEIVABLE, PAYABLE. parent: Parent account ref (full path, %short GUID, or full 32-char GUID). Omit for top-level. description: Optional description. placeholder: Container-only account. Default False. commodity: ISO currency code ("USD") or stock/fund symbol ("VTSAX"). Defaults to book's default currency. commodity_namespace: "CURRENCY" (default), "FUND", or an exchange ("NASDAQ", "NYSE"). Required with non-currency commodities. notes: Optional free-text notes (max 4096 bytes). Shows in GnuCash desktop's account editor Notes field.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
notesNo
parentNo
commodityNo
descriptionNo
placeholderNo
account_typeYes
commodity_namespaceNoCURRENCY

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Given that annotations only declare readOnlyHint=false, destructiveHint=false, etc., the description adds valuable behavioral detail: placeholder accounts are container-only, commodity defaults to the book's currency, commodity_namespace defaults to CURRENCY, and notes have a 4096-byte limit. These are beyond what the schema or annotations provide, and there is no contradiction with 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.

Conciseness4/5

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

The description is detailed but every sentence earns its place. It leads with the core purpose, then follows a clear Arg list that maps directly to the schema. The formatting is consistent and scannable. Slightly long, but no redundancy or filler.

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

Completeness5/5

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

Given the tool has 8 parameters and an output schema is present (so return format doesn't need description), the description covers all semantics needed to call the tool correctly. It explains the account type enum, parent ref formats, commodity namespace rules, placeholder behavior, and note limits. Nothing critical is missing for an agent to invoke this tool successfully.

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?

With 0% schema description coverage, the description fully compensates by explaining every parameter: name, account_type with an explicit list of allowed values, parent with multiple accepted formats, placeholder behavior, commodity, commodity_namespace, and notes length. This is exactly what an agent needs to fill in valid arguments without relying on the schema's bare type definitions.

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 exactly what the tool does: 'Create a new account in the chart of accounts.' This is a specific verb and resource, and it naturally distinguishes from sibling tools like list_accounts, update_account, and delete_account. No ambiguity about the action.

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

Usage Guidelines4/5

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

The description provides clear context for when to use it (creating a new account) and includes useful guidance like 'Omit parent for top-level' and that commodity_namespace is 'Required with non-currency commodities.' It doesn't explicitly name alternatives, but the purpose is unambiguous given the sibling set, and the parameter guidance covers key usage decisions.

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

create_backupA
Read-only

Create an on-demand backup of the GnuCash book.

Uses SQLite's online backup API so the snapshot is safe even if the book is being read or written concurrently by GnuCash desktop. Verifies the copy with PRAGMA integrity_check before declaring success; a failed check deletes the bad backup and raises.

Manual backups are kept indefinitely — automatic retention (session / weekly / monthly stages) does not touch them. To review or remove backups, the user works with the files directly in the backup directory; no tool can list or delete them.

The response includes a restore_hint describing the filesystem command to restore from this backup. Restore is a human-run filesystem operation, not an MCP tool — see docs/RESTORE_FROM_BACKUP.md for details.

Args: label: Optional free-text label (sanitized to [A-Za-z0-9_-]) appended to the filename for human context, e.g. "pre-recategorization" or "pre-tax-filing".

ParametersJSON Schema
NameRequiredDescriptionDefault
labelNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior1/5

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

The description adds rich behavioral detail: SQLite online backup API, concurrent safety, integrity_check, delete-and-raise on failure, and retention semantics. However, annotations declare readOnlyHint=true while the description describes creating backup files and deleting bad backups, which is a direct annotation 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?

Though multi-paragraph, every sentence earns its place: safety, failure handling, retention, restore workflow, and parameter semantics. The core action is front-loaded in the first sentence.

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 backup tool with an output schema, the description covers concurrency safety, verification, failure cleanup, retention, restore instructions, and response contents. Nothing needed to call or interpret the tool is missing.

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?

Schema coverage is 0% and the schema only names the field as 'Label'. The description fully compensates by explaining that label is optional, free-text, sanitized to [A-Za-z0-9_-], appended to the filename, and provides concrete examples.

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: 'Create an on-demand backup of the GnuCash book.' This is immediately distinguishable from all siblings, none of which perform backup creation.

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?

Implied usage is clear for on-demand backups, and the description explicitly warns that no tool can list or delete backups and that restore is a human-run filesystem operation. This prevents agents from searching for nonexistent sibling capabilities, though it does not state formal 'use this when' exclusions.

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

create_billtermA

Create a new billing term.

Args: name: Billterm name (e.g., "Net 30"). due_days: Number of days until payment is due. Default 30. description: Optional description. discount_days: Days within which early discount applies. discount_percent: Early payment discount percentage (e.g., "2" for 2%).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
due_daysNo
descriptionNo
discount_daysNo
discount_percentNo0

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior2/5

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

Annotations indicate readOnlyHint=false and idempotentHint=false, and the description's 'Create' aligns with a mutating, non-idempotent operation. However, the description adds no beyond-annotation behavioral context such as duplicate handling, validation rules, 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?

The description is well-structured: a one-sentence purpose followed by a compact Args list. Every line adds value by explaining or exemplifying a parameter, with no filler or repeated schema boilerplate.

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?

All five parameters are fully explained, defaults are specified, and an output schema is present so return-value documentation is unnecessary. The main gap is the lack of broader context about when to create a billing term or how it relates to sibling tools like list_billterms, but the invocation details are complete enough.

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?

Schema description coverage is 0%, so the description carries the full burden for parameter meaning. It provides meaningful semantics for all five parameters, including examples ('Net 30'), default behavior, and purpose of discount fields. This goes well beyond the bare schema titles.

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: 'Create a new billing term.' The 'Net 30' example clarifies what a billing term is, and the resource name distinguishes it from sibling tools like create_budget or create_taxtable. There is no ambiguity about the operation.

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

Usage Guidelines2/5

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

No guidance is given on when to use this tool versus alternatives, such as list_billterms to check existing terms. The one-line purpose implies its use case, but there are no explicit conditions, prerequisites, or exclusions.

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

create_budgetA

Create a new budget.

Args: name: Budget name (e.g., "2026 Budget"). year: Budget year. Defaults to current year. Ignored when start_date is provided. num_periods: Number of periods. Default 12 (monthly for a year). period_type: Period length: - "monthly" (default) - "quarterly" - "weekly" description: Optional description. start_date: Optional ISO date (YYYY-MM-DD) when the budget's first period begins. When omitted, falls back to January 1 of year. Use this to author a historical budget for comparison against past actuals (e.g. start_date="2024-01-01") or to start mid-year.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
yearNo
start_dateNo
descriptionNo
num_periodsNo
period_typeNomonthly

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior3/5

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

Annotations are all false, so the description carries the burden of behavioral disclosure. It discloses a key behavioral detail: the `year` parameter is ignored when `start_date` is provided, and `start_date` falls back to January 1 of `year` when omitted. This is beyond simple parameter semantics and reveals interaction behavior. However, it does not describe side effects (e.g., whether an existing budget with the same name is overwritten), error handling, or any prerequisites. The description adds some value but could be more transparent about the mutation's full implications.

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 well-organized docstring with a clear one-line summary and a bulleted Args list. Every sentence adds value—there is no filler. The most important behavioral note (year vs start_date) is placed early in the parameter list, and the format is immediately scannable. It is appropriately sized for a tool with six parameters and does not restate schema basics.

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?

The description fully covers all six parameters with defaults, interdependencies, and usage examples. An output schema exists (as indicated) to handle return values, so the description does not need to explain the response. It is complete enough for an agent to confidently construct a valid call, including handling edge cases like historical budgets and mid-year starts. There are no critical gaps in context.

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 description adds substantial meaning to every parameter beyond the bare schema. It explains the purpose of `name` with an example, the default behavior of `year` and its dependency on `start_date`, the default and options for `period_type`, the use of `num_periods` with an example, and the historical use case for `start_date`. This goes well beyond the type/default information in the schema and significantly improves an agent's ability to select correct values.

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 the explicit statement 'Create a new budget.' This pairs a specific verb ('create') with a clear resource ('budget'), and it is immediately distinct from sibling tools like list_budgets, get_budget, and delete_budget. The purpose is unambiguous and gives the agent no reason to confuse it with related budget-management operations.

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 does not explicitly name alternatives or state when *not* to use this tool, but it provides strong contextual guidance for the optional `start_date` parameter, explaining that it is used for historical budgets or mid-year starts. This implicitly tells the agent when to set that parameter, and the overall purpose is clear enough that an agent can infer appropriate usage relative to sibling tools. No exclusions are given, but the core usage context is solid.

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

create_commodityA

Create a new commodity (stock, mutual fund, etc.).

Args: mnemonic: Symbol (e.g., "VTSAX"). Unique within namespace. fullname: Human-readable name. namespace: "FUND" (default) for mutual funds, "NASDAQ"/"NYSE"/ "AMEX" for stocks, or any custom string. fraction: Smallest fractional unit. 1 = whole units, 100 = 2 decimals, 10000 = 4 decimals (default, shares), 1000000 = 6 decimals (crypto). cusip: Optional CUSIP/ISIN identifier.

ParametersJSON Schema
NameRequiredDescriptionDefault
cusipNo
fractionNo
fullnameYes
mnemonicYes
namespaceNoFUND

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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

With all annotations set to false, the description confirms this is a mutation ('Create a new commodity'). It adds useful constraints such as 'Unique within namespace' and explains the fraction and namespace semantics. However, it does not disclose duplicate-handling behavior, error conditions, or what the created object looks like beyond the output schema.

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

Conciseness5/5

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

The description is a compact, well-organized docstring. Every line adds meaning: the purpose line is followed by focused parameter definitions with inline examples. There is no fluff or repetition of schema properties beyond what is needed for clarity.

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?

Since an output schema exists, return-value documentation is not needed. All parameters are fully explained, and the namespace/fraction guidance gives practical context. The main gap is the lack of explicit duplicate-name or error behavior, which would make it fully complete for a create tool.

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?

Schema description coverage is 0%, so the description carries full responsibility for parameter meaning. It thoroughly documents all five parameters with concrete examples, defaults, allowed namespace values, and fraction semantics. This is exemplary compensation for a schema with no property descriptions.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Create a new commodity (stock, mutual fund, etc.)'. This clearly distinguishes it from sibling tools like create_prices or create_account, and the examples disambiguate what a 'commodity' means in this system.

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—use this tool when you need to add a new tradable commodity—but it does not explicitly state when to prefer it over alternatives or what conditions should be checked first (e.g., verifying the commodity does not already exist). No exclusions or sibling comparisons are provided.

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

create_documentA

Create a customer invoice, vendor bill, employee expense voucher, or credit note.

The owner side derives from the document type — invoice → customer, bill → vendor, voucher → employee. Credit notes exist on both sides, so they alone require party_type ("customer" or "vendor"). After creating, add line items with add_document_entry, then post_document to put it on the books.

Args: document_type: "invoice", "bill", "voucher", or "credit_note". owner_id: The owning party's ID (customer ID for invoices, vendor ID for bills, employee ID for vouchers). ID counters are per type. party_type: Required for credit notes only ("customer" or "vendor" — which side the credit belongs to). Derived from document_type otherwise. date_opened: ISO date. Defaults to today (echoed in the response). notes: Optional notes (max 4096 characters). currency: ISO code. Defaults to the owner's currency, then the book default. term: Billterm name (e.g., "Net 30"). Optional. id: Custom document number; auto-generated when omitted. job_id: Optional Job to group under (invoices and bills; must belong to the same owner). applies_to_id: Credit notes only — the invoice/bill this credit note reverses. The link is PROVENANCE, not a constraint: apply_credit_note can net the credit against any open document from the same owner (its response notes the divergence when the applied target differs from this link).

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
termNo
notesNoOptional notes. Capped at 4096 characters at the MCP boundary; oversize input rejects with a clear error.
job_idNo
currencyNo
owner_idYes
party_typeNo
date_openedNo
applies_to_idNo
document_typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations, the description discloses important behavioral details: owner-side derivation from document type, per-type ID counters, default date/currency behavior, the conditional requirement for party_type on credit notes, and the subtle provenance semantics of applies_to_id. These are exactly the non-obvious traits an agent needs to know.

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 long, but every section earns its place: purpose, workflow, then parameter semantics. The most critical behavioral nuance (provenance not constraint) is clearly surfaced. Formatting with code literals and per-argument lines makes it scannable despite the length.

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 10 parameters, complex conditional logic, and an output schema, the description is complete. It covers the full lifecycle (create → add entries → post), defaulting behavior, credit-note specifics, and even notes a response echo for date_opened. Nothing an agent needs to call it correctly is missing.

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?

Schema description coverage is only 10%, so the description carries the full burden for the other 90%. It meaningfully explains all 10 parameters, including defaults, conditional requirements, allowed values, and constraints like 'job_id must belong to the same owner'. This is far beyond what the input schema 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 opens with a specific verb and resource ('Create a customer invoice, vendor bill, employee expense voucher, or credit note') and enumerates the four document types. It also distinguishes itself from sibling tools like add_document_entry and post_document by sketching the creation workflow.

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 to use this tool: to create the four document types. It goes further and routes the agent through the follow-up workflow ('add line items with add_document_entry, then post_document'), which is valuable context. It does not explicitly list exclusions or alternatives for non-document creation (e.g., create_transactions), but the usage context is strong.

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

create_jobA

Create a job for a customer or vendor.

A job groups invoices (or bills) from one counterparty under a project-level container. Useful when a single customer has multiple distinct engagements (e.g., 'API Rewrite' and 'Q3 Maintenance') that should be reported on separately even though invoices flow to the same A/R.

Args: owner_id: Customer or vendor ID (e.g., "000001"). owner_type: "customer" or "vendor". Employees are not supported (no GnuCash desktop UI for employee jobs). name: Human-readable job name (e.g., "API Rewrite"). reference: Optional reference string (PO number, project code).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
owner_idYes
referenceNo
owner_typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations include readOnlyHint=false, so a write operation is expected and the description's 'Create' is consistent. The description adds useful behavioral context beyond the schema: it explains job semantics, the customer/vendor restriction, and the reason employees are unsupported. It does not contradict any 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 front-loaded with the core action and then efficiently explains the domain concept and parameters. The Args block is structured and every sentence adds value; there is no filler or repetition of the schema.

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 tool has an output schema, so return-value documentation is not required. The description covers the required parameters, optional reference, and domain constraints. It could add more about validation or what happens if owner_id does not exist, but the current information is sufficient for correct invocation in the expected context.

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?

Schema description coverage is 0%, so all parameter meaning falls on the description. It fully compensates by documenting owner_id, owner_type, name, and reference with examples and constraints, including the explicit allowed values 'customer'/'vendor' and the exclusion of employees.

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: 'Create a job for a customer or vendor.' It also defines a job as a project-level container grouping invoices or bills, giving the tool a clear domain meaning and distinguishing it from sibling tools like list_jobs, update_job, and delete_job.

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 concrete usage context: jobs are useful when a single customer has multiple distinct engagements that should be reported separately. It also explicitly excludes employees, stating they are not supported. It does not name an alternative sibling tool directly, but the create/update/list/delete family is clear enough from context.

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

create_lotA

Create a new, empty lot for cost basis tracking.

Additive: the lot starts open with no splits attached, and nothing else in the book changes. A lot groups one purchase with its later sales so cost basis and capital gain compute per purchase. The full flow: create_lot → create_transactions (the buy, a one-row batch) → assign_split_to_lot → calculate_lot_gain; the lot auto-closes when its assigned splits net to zero shares. Errors if the account ref matches nothing. Skip this tool when you only want a valuation — get_book_summary and balance_sheet price holdings without lots.

Args: account: Account ref for the investment account: full path (e.g., "Assets:Investments:VTSAX"), %short GUID, or full 32-char GUID. title: Lot identifier (e.g., "VTSAX 2026-01-15 purchase"). notes: Optional notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
notesNo
titleYes
accountYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false (write operation), idempotentHint=false, destructiveHint=false. The description adds meaningful behavioral context: it is 'additive' with 'nothing else in the book changes,' the lot auto-closes when splits net to zero shares, and it errors if the account ref matches nothing. This goes beyond the binary hints, explaining side-effect scope and failure conditions. It doesn't 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.

Conciseness4/5

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

The description is well-structured: opening purpose, then usage flow, then an exclusion note, then an Args block. Every sentence contributes new information—no fluff. It's longer than minimal but appropriate for a tool with a non-obvious workflow and parameter formats. The front-loaded purpose and quick usage clarity earn it a 4; it loses a point for slightly dense formatting in the middle section.

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?

The description covers everything an agent needs: what the lot is for, the full lifecycle, how to chain it with sibling tools, parameter formats, error behavior, and when to skip it. An output schema exists, so return values need no description. For a 3-parameter tool with a defined workflow, this is complete and leaves no critical gaps.

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?

Schema description coverage is 0%, so the description bears full responsibility for parameter meaning. It explains each parameter: account accepts full path, %short GUID, or full GUID; title is a lot identifier with an example; notes are optional. This is far more than the bare schema (type: string) provides. The description fully compensates for the schema's silence.

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

Purpose5/5

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

The description uses a specific verb-resource pair ('Create a new, empty lot') and clearly states the purpose ('for cost basis tracking'). It distinguishes this tool from siblings by naming the exact flow (create_lot → create_transactions → assign_split_to_lot → calculate_lot_gain) and contrasting it with valuation-only tools (get_book_summary, balance_sheet). No ambiguity about what it does or when it applies.

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?

Provides explicit 'when to use' via the full workflow and states a clear exclusion: 'Skip this tool when you only want a valuation — get_book_summary and balance_sheet price holdings without lots.' It also names the specific alternative tools, leaving no inference burden on the agent. This is textbook usage guidance.

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

create_partyA

Create a customer, vendor, or employee.

Additive: each call creates a fresh party — names are NOT checked for duplicates, so list_parties first when unsure. Returns the assigned ID (e.g., "000001"), the handle every later call wants. ID counters are PER TYPE: customer 000001 and vendor 000001 are different parties, which is why party_type is required everywhere.

Args: party_type: "customer" (pays you), "vendor" (you pay), or "employee" (expense-voucher workflows). name: Party name (e.g., "Acme Corp", "Jane Smith"). currency: ISO currency code (e.g., "USD", "EUR"). Defaults to book's default currency. notes: Optional notes (max 4096 characters). Employees have no notes field — rejected, not ignored. address: Optional address with keys: name, addr1, addr2, addr3, addr4, phone, fax, email. Each sub-field capped at 1024 characters.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
notesNoOptional notes. Capped at 4096 characters at the MCP boundary; oversize input rejects with a clear error.
addressNo
currencyNo
party_typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

Annotations only say readOnly=false, idempotent=false, etc. The description adds materially beyond that: additive behavior, no duplicate checking, per-type ID counters, employee notes rejection, and the returned ID handle. No contradiction with annotations.

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

Conciseness5/5

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

The description is detailed but every sentence adds value. Key behavioral warnings are front-loaded, and the Args section is cleanly structured with no filler.

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

Completeness5/5

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

Given the tool's complexity and minimal schema documentation, the description covers purpose, usage, behavior, return value, parameter semantics, and edge cases like employee notes. Nothing critical is missing for correct invocation.

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?

Schema coverage is only 20%, but the description documents all five parameters with meaning: party_type roles, currency defaulting, notes 4096 cap and employee rejection, name examples, and address sub-fields with caps. It fully compensates for the sparse 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 opening sentence names a specific verb and resource: 'Create a customer, vendor, or employee.' It clearly distinguishes this from sibling tools like list_parties, get_party, update_party, and delete_party.

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 explicit usage context: 'each call creates a fresh party — names are NOT checked for duplicates, so list_parties first when unsure.' It names the relevant alternative tool and explains when to use it, plus clarifies party_type semantics.

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

create_priceA

Record a price for a commodity (stock, NAV, exchange rate).

An existing price with the same commodity/currency/date/source is updated rather than duplicated.

Args: commodity: Symbol (e.g., "VTSAX"). namespace: Commodity namespace (e.g., "FUND", "NASDAQ"). value: Price per unit as decimal string (e.g., "250.45"). currency: ISO currency code. Defaults to the book's default currency — so create_price(commodity="USD", value="7.30") on a CNY-default book stores "1 USD = 7.30 CNY" (the natural reading). Pass explicitly for cross-currency pairs that don't involve the book default. date: ISO date (YYYY-MM-DD). Defaults to today. price_type: "nav" (default, mutual funds), "last", "bid", "ask", or "unknown". source: Source identifier. Default "user:price".

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNo
valueYes
sourceNouser:price
currencyNo
commodityYes
namespaceYes
price_typeNonav

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

The description adds substantial behavioral context beyond the sparse annotations: existing prices are updated rather than duplicated, currency defaults to the book's currency with a worked example, date and source default, and price_type values are enumerated. This is exactly the kind of surprise-preventing behavior an agent needs.

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 front-loads the core operation and the critical upsert semantics, then uses a compact Args block. There is no filler; the example is purposeful and the structure makes the details easy to scan.

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 an output schema exists and annotations cover the non-read-only nature, the description supplies everything needed to invoke the tool correctly: defaults, edge cases, examples, and valid price_type values. No important behavioral or parameter-related information is missing.

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?

Schema description coverage is 0%, but the description fully compensates: every parameter is explained with formats, examples, defaults, and allowed values. The currency explanation and the 'USD = 7.30 CNY' example add meaning far beyond the raw 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 opens with a specific verb and resource: 'Record a price for a commodity (stock, NAV, exchange rate).' It clearly conveys that this is a single-price write operation and contrasts naturally with siblings like get_prices, delete_price, and create_prices.

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 purpose is clear enough that an agent can infer when to use it, and the upsert behavior is stated. However, it never explicitly tells the agent when to prefer this over the sibling create_prices, or when to use the price-querying siblings instead. The guidance is implied rather than explicit.

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

create_pricesA

Record MANY prices in one call (bulk quote entry).

INPUT — prices is a TSV block: a header row, then one row per price. Required columns ref, commodity, date, value; optional columns extend the header IN ORDER: ns, cur, source, type (stop anywhere; rows may end early; empty cells take defaults)::

ref<TAB>commodity<TAB>date<TAB>value<TAB>cur<TAB>source
1<TAB>VTSAX<TAB>2026-07-21<TAB>148.32<TAB><TAB>web:yahoo
2<TAB>EUR<TAB>2026-07-21<TAB>1.0845<TAB><TAB>web:ecb
  • ref: your correlation key, echoed in results.

  • ns: commodity namespace; empty auto-resolves when the symbol is unambiguous across namespaces.

  • cur: quote currency; empty = book default.

  • source: where the quote came from (provenance — default "user:price"); type: nav/last/bid/ask.

Per-row semantics are create_price's exactly: an existing price with the same commodity/currency/date/source is UPDATED in place (status: updated), never duplicated. One book open, one save, on_error="abort" (default) sinks the whole batch on any bad row; dry_run=true previews as would_create / would_update.

The companion work list: list_commodities(stale_days=30, held_only=true).

ParametersJSON Schema
NameRequiredDescriptionDefault
pricesYes
dry_runNo
on_errorNoabort

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

The description reveals critical behavior beyond annotations: existing prices with the same commodity/currency/date/source are updated in place with status 'updated', never duplicated; the whole batch is sunk on any bad row under on_error='abort'; and dry_run=true previews as 'would_create'/'would_update'. It also notes one book open and one save, which is not inferable from the schema.

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

Conciseness5/5

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

The description is long only because the TSV format is complex; every block serves a purpose: input grammar, example, per-column semantics, batch behavior, and companion tool. The front-loaded one-line summary makes the core purpose immediately identifiable.

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?

The description is complete for a tool with a complex data input and error semantics. It explains the full input contract, defaults, update-in-place behavior, atomic failure mode, dry-run statuses, and even the companion listing tool, so an agent can invoke it safely and correctly without digging elsewhere.

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?

Schema description coverage is 0%, so the description carries full responsibility for parameter meaning. It precisely documents the `prices` TSV format with required and optional columns, per-column defaults, and gives a concrete multi-row example. `dry_run` and `on_error` are each given behavioral meaning beyond their schemas.

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?

"Record MANY prices in one call (bulk quote entry)" clearly states the verb, resource, and batch scope, and distinguishes it from the single-item sibling create_price. The opening sentence is specific and unambiguous.

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

Usage Guidelines5/5

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

The description explicitly says per-row semantics match create_price's exactly, signals dry_run and on_error behaviors, and points to list_commodities(stale_days=30, held_only=true) as the companion work list. An agent knows when this tool applies and what alternatives/contexts exist.

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

create_scheduled_transactionA

Create a recurring transaction template.

Args: name: Scheduled transaction name (e.g., "Monthly Rent"). description: Transaction description at instantiation. splits: List of split dicts, e.g. [{"account": "Expenses:Rent", "amount": "1850.00"}, ...]. amount / quantity must be decimal strings; quantity is required when an account's commodity differs from the template's transaction currency. start_date: First occurrence (YYYY-MM-DD). frequency: "weekly", "biweekly" (2w), "monthly", "bimonthly" (2mo), "quarterly" (3mo), or "yearly". end_date: Optional last occurrence (YYYY-MM-DD). enabled: Active. Default True. notes: Transaction notes applied to every instantiated transaction (what the payment is — visible in GnuCash's double-line register view). currency: ISO code denominating every instantiated transaction; defaults to the book default. Use when no leg is in the book currency (a USD-to-USD card payment scheduled inside a CNY book) so amounts are the foreign currency's own numbers. Not updatable after creation — delete and recreate to change it.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
notesNo
splitsYes
enabledNo
currencyNo
end_dateNo
frequencyYes
start_dateYes
descriptionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Beyond the annotations, the description adds meaningful constraints: currency defaults to the book default, and currency is 'not updatable after creation — delete and recreate to change it.' It also clarifies that notes are visible in GnuCash's double-line register view, helping an agent predict side effects. It does not contradict the annotations.

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

Conciseness5/5

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

The description is longer than average but every line earns its place for a 9-parameter tool with no schema-level descriptions. The one-sentence purpose is front-loaded, followed by a compact Args list with examples and constraints.

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?

The description covers every parameter, required and optional, including defaults and format validation. Since an output schema exists, not describing the return value is acceptable. Minor details like how soon the schedule starts are not necessary for a correct invocation.

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?

With 0% schema description coverage, the docstring compensates fully by explaining each parameter: split amounts must be decimal strings, quantity is required on commodity mismatch, frequency has six enumerated values, and currency has a concrete usage example. This goes well beyond the bare schema types.

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 opening sentence uses a specific verb ('Create') and names a distinct resource ('recurring transaction template'), which cleanly separates it from siblings like create_transactions and create_transaction_from_scheduled. The scope is unambiguous even before reading the parameters.

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 sets a clear context: this tool is for recurring templates, not one-off transactions or posting from an existing schedule. It does not explicitly name alternative tools or state when not to use them, so it stops short of a full exclusion list.

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

create_taxtableA

Create a new sales-tax table.

A taxtable holds one or more entries. Each entry contributes either a percentage rate or a flat-value surcharge routed to a specific GL account (ASSET for input-tax credit, LIABILITY for output sales tax payable). Multi-entry composites (e.g., GST 5% + PST 7%) produce multiple tax splits per line at posting time.

Args: name: Taxtable name, unique within the book (e.g., "CA Sales 7.25%", "BC GST+PST"). entries: List of {type, amount, account} dicts. type: "value" or "percentage". amount: positive decimal as string. Percentages are the rate ("5.00" = 5%, not "0.05"). account: account path, %short-guid, or full GUID. Must be ASSET or LIABILITY type. All entries on a single taxtable must reference accounts in the same commodity.

Example: create_taxtable( name="BC GST+PST", entries=[ {"type": "percentage", "amount": "5.00", "account": "Liabilities:GST Payable"}, {"type": "percentage", "amount": "7.00", "account": "Liabilities:PST Payable"}, ], )

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
entriesYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only convey generic traits (mutating, non-idempotent, non-destructive). The description goes well beyond them by disclosing posting-time side effects (multi-entry composites produce multiple tax splits per line), the name-uniqueness constraint, the same-commodity requirement across accounts, and the ASSET/LIABILITY account restriction. No contradiction with annotations.

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

Conciseness5/5

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

Well-structured and front-loaded: one-sentence purpose, a tight domain-context paragraph, a formatted Args section, and a complete runnable example. The length is justified by the complexity the schema fails to capture; no sentence is redundant.

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?

Complete for a moderately complex create tool: purpose, every parameter and sub-field, constraints, side effects, and a worked example are all present. The output schema covers return values, and annotations cover the safety profile, so nothing an agent needs to invoke this correctly is missing.

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?

Schema coverage is 0% and the entries parameter is an untyped shell (additionalProperties: true), so the description carries the full burden and succeeds. It documents name uniqueness with concrete examples and fully specifies the entries dict structure, including the crucial pitfall that percentages are rates ('5.00' = 5%, not '0.05') and the accepted account reference formats.

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?

Opens with the specific verb+resource 'Create a new sales-tax table' and then elaborates what a taxtable is and how entries behave. This clearly distinguishes it from the sibling CRUD tools list_taxtables, update_taxtable, and delete_taxtable.

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 through the create verb and the thorough domain explanation, but there is no explicit routing to alternatives such as update_taxtable for modifying an existing table or list_taxtables for discovery. No preconditions, exclusions, or 'use this when' guidance is stated.

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

create_transaction_from_scheduledA

Create an actual transaction from a scheduled template.

Args: guid: Scheduled transaction GUID (or 8+ char prefix). transaction_date: Date for the transaction. Defaults to next occurrence.

ParametersJSON Schema
NameRequiredDescriptionDefault
guidYesScheduled transaction GUID (32-char hex or 8+ char prefix)
transaction_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior2/5

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

Annotations are largely uninformative (readOnlyHint=false merely indicates mutation; no idempotency or safety hints). The description adds the useful default behavior of transaction_date ('Defaults to next occurrence') but does not disclose what happens to the scheduled template after creation, whether repeated calls duplicate transactions, or other side effects. For a state-changing operation, this is a meaningful gap.

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: a one-line purpose statement followed by a tight parameter list. Every sentence earns its place, and the key purpose is front-loaded.

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?

Basic invocation data is present: required guid and optional transaction_date with default behavior. The presence of an output schema means return values need no explanation. However, for a mutating operation that materializes a transaction, the description omits the effect on the scheduled template and the consequences of repeated calls, leaving the agent with partial context.

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?

With schema description coverage at 50%, the description compensates by explaining both parameters: guid as a scheduled transaction GUID/prefix, and transaction_date as the date for the transaction with a clear default of next occurrence. This adds real meaning beyond the raw schema, though date format could be more precise.

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 ('Create') and resource ('actual transaction from a scheduled template'), which clearly distinguishes it from sibling create_scheduled_transaction (template creation) and create_transactions (manual transaction creation). The phrase 'actual transaction' makes the materialization 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 Guidelines3/5

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

The intended use is implied: use this when you have a scheduled template and want to generate the concrete transaction, optionally on a specific date. However, it does not explicitly state when not to use it, nor does it contrast with alternatives like create_transactions or update_scheduled_transaction.

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

create_transactionsA

Create transactions in one atomic command (bulk entry) — the canonical entry tool for one transaction or many. A single transaction is a one-row batch (the former create_transaction tool was removed; this replaces it).

INPUT — transactions is a TSV block: a header row, then one row per transaction. The HEADER DECLARES THE LAYOUT. Base form: splits are (amount, account) column PAIRS, repeated as wide as a transaction needs::

ref<TAB>date<TAB>description<TAB>amt1<TAB>acct1<TAB>amt2<TAB>acct2...
1<TAB>2026-05-21<TAB>Gas<TAB>-54.19<TAB>Assets:Checking<TAB>54.19<TAB>Expenses:Auto:Fuel

Two opt-in extensions, each activated by naming it in the header (legacy headers parse exactly as before):

  • PER-SPLIT MEMOS — declare memo split columns; splits become (amount, account, memo) TRIPLES::

    ref<TAB>date<TAB>description<TAB>amt1<TAB>acct1<TAB>memo1<TAB>amt2<TAB>acct2<TAB>memo2
    1<TAB>2026-05-21<TAB>Gas<TAB>-54.19<TAB>Assets:Checking<TAB>card #4471<TAB>54.19<TAB>Expenses:Auto:Fuel

    Empty memo cells mid-row keep their tabs; a row may simply END once its last split's amount and account are present (trailing memo/qty cells are read as empty — no placeholder tabs needed, as above).

  • PER-TRANSACTION NOTES — declare a notes column directly after description::

    ref<TAB>date<TAB>description<TAB>notes<TAB>amt1<TAB>acct1...

    FIELD TARGETING for statement entry: description is the clean name; notes is what the purchase WAS — interpreted, not transcribed — and is what humans see in GnuCash's double-line register; the bank leg's memo is where the RAW statement line goes (provenance, visible only in expanded split view). Prefer filling notes whenever the description alone doesn't tell the story.

  • PER-TRANSACTION CURRENCY — declare a cur column after description (before or after notes); an ISO code cell sets THAT ROW's transaction currency, an empty cell keeps the book default::

    ref<TAB>date<TAB>description<TAB>cur<TAB>amt1<TAB>acct1<TAB>amt2<TAB>acct2
    1<TAB>2026-07-15<TAB>USD Card Payment<TAB>USD<TAB>-500<TAB>Assets:USD Checking<TAB>500<TAB>Liabilities:USD Card

    With cur, the row's amt cells are in that currency and must balance in it. Use it when NO leg is in the book's default currency (a USD-to-USD transfer inside a CNY book needs no invented CNY values and no qty). Splits on accounts of any OTHER commodity still need qty. The currency must already exist in the book, and cur cannot combine with an auto-fill row.

  • PER-SPLIT QUANTITY — declare qty split columns for splits whose ACCOUNT commodity differs from the book default (investment shares, foreign-currency accounts)::

    ref<TAB>date<TAB>description<TAB>amt1<TAB>acct1<TAB>qty1<TAB>amt2<TAB>acct2<TAB>qty2
    1<TAB>2026-07-01<TAB>VFIFX Purchase<TAB>-505.17<TAB>Assets:Checking<TAB><TAB>505.17<TAB>Assets:401k:VFIFX<TAB>7.7936

    amount stays in the book's default currency (the transaction currency — batch never changes that); qty is the amount in the account's own commodity. An EMPTY qty cell means the account uses the default currency (quantity == amount). A non-default-commodity account with an empty qty rejects that row.

  • PER-SPLIT ACTION — declare act split columns for GnuCash's typed movement tag ("Buy"/"Sell"/"Dividend" on investment legs — desktop convention; "Wire"/"ATM" on bank legs). Same group mechanics as memo/qty; empty cells skip it. Rarely needed for plain spending.

All extensions combine; when several split fields are declared, the header's FIRST group fixes their order (e.g. amt, acct, memo, qty).

AUTO-FILL — a row with NO split cells at all (ends right after description/notes) reproduces the most recent transaction with the same description — splits, memos, and quantities included::

1<TAB>2026-07-01<TAB>Rent
2<TAB>2026-07-01<TAB>Netflix

Auto-filled rows are marked auto_filled_from:<guid> in the results reason column; a row whose description matches nothing rejects ("no matching transaction to auto-fill from"). Use dry_run=true to preview what a batch of auto-fills would book. Perfect for recurring monthly entries. Transaction notes are NOT copied from the source (notes are often time-bound — "first appearance, investigate" must not replicate); supply a notes cell when the new instance needs one.

  • ref: YOUR correlation key per row (e.g. 1, 2, 3), unique within the batch. It is echoed back so you can match results to what you sent; the server never reuses or interprets it.

  • date: ISO YYYY-MM-DD. amount/qty: decimal STRINGS (never raw JSON numbers). Each transaction needs

    =2 splits balancing to zero in the default currency. Rows may differ in width (2 splits vs 3).

  • The transaction currency is the book default unless the row declares one via the cur column (see PER-TRANSACTION CURRENCY above).

BEHAVIOR — one book-open, one atomic save:

  • A STRUCTURAL error (unbalanced, unknown account, bad pairs) aborts the WHOLE batch by default; nothing is written. Pass on_error="skip" to write the good rows and reject only the bad ones.

  • A duplicate rejects ONLY its row; force=True overrides all blocking duplicates. dry_run=True validates + screens without writing.

OUTPUT — a JSON envelope of two TSV tables joined by ref:

  • results (always): ref, status, txn_guid, dup_count, max_confidence, reason. status is created | rejected | would_create (dry_run, candidate-free rows only) | review_required (dry_run rows with >=1 duplicate candidate — rule each against the duplicates table before committing); reason is a code like duplicate_detected or the validation message. max_confidence (HIGH/MEDIUM/blank) is the row's top duplicate candidate — enough for the common keep/drop call without the join.

  • duplicates (only when matches exist): SELF-CONTAINED comparison rows, sorted strongest-correspondence first — ref, candidate_guid, confidence, state, date_new, date_old, date_delta_days, amt_new, amt_old, amt_delta, cur, desc_new, desc_old, notes_old, memo_old, cat_new, cat_old, split_match, signals. _new = your proposed row, _old = the existing transaction; cat_* are the category (non-payment) legs as account=amount|...; split_match (exact/partial/none) compares them — MEDIUM on date+amount but none on category is usually a distinct purchase. Amounts are SIGNED (direction matters: a deposit is not a payment's twin). amt_delta is blank on cross-currency candidates (cur names the candidate's currency exactly when the frames differ); memo_old and state blanks mean this surface can't fill them. Never re-read your own input — both sides are in the row. Σ(dup_count) equals the duplicates row count.

  • Dry runs additionally lead with summary (would-create/ review-required/rejected counts + the homework line) and close with effects — the projected per-account balance deltas of the rows that would land.

Args: transactions: The TSV block described above. force: Override ALL blocking (HIGH) duplicates this batch. dry_run: Validate + screen, write nothing. on_error: "abort" (default) or "skip" for structural errors.

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNo
dry_runNo
on_errorNoabort
transactionsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

With annotations carrying only readOnlyHint=false, destructiveHint=false, and idempotentHint=false, the description shoulders the behavioral burden and does so exhaustively. It discloses atomic save semantics, whole-batch abort on structural errors, per-row duplicate rejection, force override, dry_run validation without writing, auto-filled row marking (auto_filled_from), and that notes are intentionally not copied from source. None of this contradicts the annotations — readOnlyHint=false is consistent with a tool that creates transactions.

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 long, but the tool is genuinely complex (TSV format, five opt-in extensions, auto-fill, error modes, dual output tables), and nearly every block earns its place. It is well-structured with capitalised headers, ASCII code examples, and a clear front-loaded purpose statement followed by progressively deeper detail. It loses one point only for sheer length — much of the extension detail could arguably be deferred until an agent actually tries to use an extension.

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 the tool's high complexity (4 parameters, intricate TSV input grammar, multiple behavior modes, and a non-trivial output envelope), nothing an agent needs to call it correctly is missing. Input format, extensions, balancing rules, currency handling, error semantics, and the full output structure (results and duplicates tables, dry-run summary/effects) are all documented, so the lack of additional context in the schema/output_schema is fully compensated.

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?

Schema description coverage is 0%, so the description must compensate fully — and it does. Every parameter is explained beyond the schema type: 'transactions' is fully specified as a TSV block with header-driven layout and extensions; 'force' (override blocking HIGH duplicates), 'dry_run' (validate + write nothing), and 'on_error' ('abort' vs 'skip') each get concrete semantic meaning. The description completely replaces the absent schema documentation.

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

Purpose5/5

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

The description opens with a specific verb-resource pair ('Create transactions in one atomic command (bulk entry)') and explicitly declares itself 'the canonical entry tool for one transaction or many.' It even names the removed predecessor (create_transaction) to prevent confusion, and the scoping ('one transaction or many') distinguishes it from related siblings like update_transactions, replace_splits, and enter_statement without needing their 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 establishes when to use the tool ('the canonical entry tool for one transaction or many') and gives rich usage scenarios (recurring monthly entries via auto-fill, statement entry via field targeting). However, it never explicitly states when NOT to use it or names alternatives for adjacent operations — e.g., it doesn't say 'use update_transactions to edit' or 'use enter_statement for statement workflows,' despite such siblings existing. Usage context is strong; explicit exclusions are the only gap.

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

debt_payoff_planA
Read-only

Calculate an avalanche-method debt payoff schedule with YETI multiplier.

Auto-discovers CREDIT/LIABILITY accounts that have an 'apr' slot set. Set APRs via set_account_slot (e.g., set_account_slot("Liabilities:Visa", "apr", "23.49")).

Assumptions the schedule is computed under: interest compounds monthly at apr/12 on the running balance; one payment per debt per month starting this month; extra budget beyond the minimums goes to the highest-APR debt first (avalanche); balances are as of today in the book default currency; amounts round to 0.01. Debts the plan cannot include are CONFESSED in ⚠ lines, never silently dropped: foreign-currency debts with no FX rate, loans with no minimum_payment/loan_term_months to estimate a payment from, and balance-carrying debts with no 'apr' slot.

Returns a compact text summary by default — kill order with balances/APRs/payoff months, YETI line, totals, debt-free date. Use verbose=true for the structured dict (per-account interest_paid / credit_limit / minimum_payment, plus the structured yeti block) suitable for programmatic consumers.

YETI (Your Expense's True Impact) shows the true cost of a purchase when carrying debt: "A $1.00 purchase will cost you $1.68 by the time your debt is paid off."

Args: monthly_budget: Total monthly amount available for all debt payments combined additional_purchase: Dollar amount to calculate YETI for (default "1.00") verbose: If false (default), compact text output — optimized for reading and token efficiency. If true, structured JSON, for when you need machine-readable fields rather than a report.

ParametersJSON Schema
NameRequiredDescriptionDefault
verboseNo
monthly_budgetYes
additional_purchaseNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

The description discloses all key behavioral assumptions: monthly compounding at apr/12, one payment per month, avalanche allocation, rounding to 0.01, and which debts will be excluded. It even promises that exclusions are surfaced in ⚠ lines rather than silently dropped, which goes well beyond what the readOnlyHint annotation implies.

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 longer than average, but it is organized into scannable sections and front-loads the core purpose. The verbose parameter is explained both in the prose and in the Args block, creating slight redundancy, but every sentence contributes essential information.

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 the tool's complexity, the description is complete: inputs, prerequisites, computational assumptions, excluded cases, output modes, and structured return fields are all covered. An agent has everything needed to invoke it correctly and interpret the result.

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?

Schema description coverage is 0%, so the description carries full responsibility for explaining parameters. It fulfills this with an Args block that defines monthly_budget, additional_purchase with its default, and verbose with its output-mode distinction. This is substantially more informative than the bare 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 opens with a specific verb and resource: calculate an avalanche-method debt payoff schedule, then names the YETI multiplier. It unambiguously distinguishes this tool from the many reporting and account-management siblings by stating its exact scope.

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

Usage Guidelines4/5

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

The description gives clear actionable context: it explains the prerequisite of setting APRs via set_account_slot, describes auto-discovery, and instructs when to use verbose=true. It does not name an explicit alternative tool, but no sibling provides the same function, so exclusions are less critical.

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

delete_accountB
DestructiveIdempotent

Delete an account from the chart of accounts.

Safeguards prevent deletion if the account has children or transactions.

Args: name: Account ref to delete (full path, %short GUID, or full 32-char GUID)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare destructiveHint: true, idempotentHint: true, and readOnlyHint: false, so the mutation risk is covered structurally. The description adds value by disclosing the specific safeguards (deletion blocked when the account has children or transactions), which is meaningful behavioral context beyond the annotations. It does not contradict the annotations, and the idempotent hint is consistent with a delete operation.

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 compact: one core sentence stating the action, one sentence on safeguards, and a terse Args block. It is front-loaded with the primary purpose and avoids redundancy. Slightly padded by the formal 'Args:' header, but overall efficient with no wasted sentences.

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 single-parameter destructive tool with an output schema (so return format is covered elsewhere), the description addresses the main concern—what blocks deletion—and documents the input format. However, it does not state that deletion is permanent when allowed, what happens to related data, or whether this cascades, which matters for a destructiveHint: true tool. Adequate but leaves the irreversibility implication implicit.

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?

With 0% schema description coverage, the description carries the full burden of explaining the sole parameter, and it does so well: 'Account ref to delete (full path, %short GUID, or full 32-char GUID)' specifies the accepted formats. This compensates for the schema's bare string definition and gives the agent actionable input syntax.

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

Purpose4/5

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

The description states a specific verb and resource ('Delete an account from the chart of accounts'), which clearly distinguishes it from entity-based siblings like delete_budget, delete_party, and delete_job. However, it does not explicitly differentiate from the closely named delete_account_slot tool, leaving the agent to infer that 'account' refers to the chart-of-accounts entity rather than a slot. Still specific and unambiguous about the core action.

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 deactivate_many or update_account, nor does it state when not to delete. The only context is the safeguard note ('children or transactions' block deletion), which is a behavioral constraint rather than usage direction. An agent gets no help choosing among the many delete_* siblings.

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

delete_account_slotA
DestructiveIdempotent

Remove one custom metadata slot from an account.

Permanent, and surgical: only the named key is deleted — other slots, the account, and its transactions are untouched. Errors, changing nothing, if the account ref or key doesn't exist, or if the key contains '/' (reserved for internal hierarchical slots; user slots are flat). get_account_slots lists the removable keys; set_account_slot re-creates one.

Args: account: Account ref: full path (e.g., "Liabilities:Credit Cards:Capital One"), %short GUID, or full 32-char GUID. key: Slot key to remove.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes
accountYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

Beyond the destructiveHint and idempotentHint annotations, the description discloses exact side effects: only the named key is deleted, other slots/account/transactions are untouched, and failures change nothing. It also documents the reserved '/' error condition for hierarchical slots.

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 front-loaded with purpose and side effects, then covers errors, related tools, and arguments. Every sentence contributes necessary operational detail without repetition or filler.

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

Completeness5/5

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

The description covers behavior, failure modes, alternatives, and both parameters; an output schema exists, so return-value format need not be repeated. Nothing essential is missing for an agent to invoke this tool safely.

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?

With 0% schema description coverage, the description fully carries parameter meaning. It enumerates the three accepted account reference forms and explains the key constraint (no '/' because user slots are flat), adding material guidance absent from the input 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 opens with a specific verb and resource: 'Remove one custom metadata slot from an account.' It sharpens scope with 'only the named key is deleted' and explicitly distinguishes itself from get_account_slots and set_account_slot.

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

Usage Guidelines5/5

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

It states the operation is permanent and surgical, and for the alternatives it says 'get_account_slots lists the removable keys; set_account_slot re-creates one.' This tells an agent when to use this deletion tool versus reading or adding slots.

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

delete_budgetA
DestructiveIdempotent

Delete a budget and every per-period amount set on it.

Permanent — there is no undo and no archive state. Only the plan is removed: transactions and account balances are untouched (budgets are plans, not postings). Errors, changing nothing, if the name matches no budget — list_budgets shows what exists, exact and case-sensitive. To retire a budget while keeping its numbers readable, simply stop reporting on it instead of deleting.

Args: name: Budget name (exact, case-sensitive).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

The description goes well beyond the annotations by disclosing that the action is permanent with no undo or archive, errors idempotently when the name does not match, and leaves transactions and account balances untouched. The annotations already flag destructive and idempotent behavior, but the description adds critical nuance about scope and consequences.

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 well-structured and front-loaded with the core action and consequences. Every major point earns its place: permanence, side-effect scope, missing-name behavior, and the retirement alternative. It loses a small amount for repeating 'exact, case-sensitive' in both prose and the parameter line, but overall it is tight and readable.

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 destructive tool, the description is complete: it explains what is deleted, what is not deleted, what happens on a missing name, and when to prefer a non-destructive alternative. The presence of an output schema covers return-value expectations, so nothing essential 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 coverage is 0%, but the description compensates by defining 'name' as 'Budget name (exact, case-sensitive).' This adds real semantic value beyond the bare string type. It does not discuss edge cases like empty strings or whitespace, but for a single simple string parameter the guidance is sufficient.

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 budget and every per-period amount set on it.' It clearly names the object and the full scope of the deletion, which distinguishes it from sibling tools like list_budgets or get_budget without needing to open 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?

It explicitly tells the caller when not to delete: 'To retire a budget while keeping its numbers readable, simply stop reporting on it instead of deleting.' It also points to list_budgets as the companion tool for checking existing names, which is practical and specific.

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

delete_documentA
DestructiveIdempotent

Delete an UNPOSTED customer invoice, vendor bill, employee voucher, or credit note.

Posted documents are on the books — unpost_document first (payments block unposting; the audit trail outranks tidiness).

Args: document_type: "invoice", "bill", "voucher", or "credit_note". id: Document ID (e.g., "000001"). party_type: Owner side, credit notes only — pass it when a credit note's ID collides with a document of the same ID on the other side (ID counters are per type).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
party_typeNo
document_typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

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

Annotations already convey destructive and non-read-only behavior, so the description goes beyond them by clarifying that only unposted documents qualify and that posted documents require unposting first. It also explains the party_type collision behavior, which is non-obvious and valuable. It doesn't explicitly state that deletion is permanent or idempotent, but the destructive and idempotent hints cover that baseline.

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 core action is front-loaded, the critical posted/unposted caveat follows immediately, and the Args section maps cleanly to the schema properties. Every sentence earns its place, including the brief rationale for the constraint.

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, conditional delete operation, the description covers the object type, the precondition (unposted), the prerequisite action for posted documents, the parameter semantics, and the edge case around party_type. With an output schema present and annotations covering safety, nothing material is missing for an agent to invoke this correctly.

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?

Schema description coverage is 0%, and the description fully compensates by explaining each parameter: document_type lists valid values, id gives an example format, and party_type describes its conditional necessity and collision scenario. This is exactly the kind of semantic context the schema does not provide.

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

Purpose5/5

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

The description states a specific verb ('Delete') and resource ('UNPOSTED customer invoice, vendor bill, employee voucher, or credit note'), with explicit scope. The qualifier 'UNPOSTED' cleanly differentiates this from unpost_document and makes the tool's sole purpose unmistakable.

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 tells agents when not to use this tool ('Posted documents are on the books') and names the alternative path ('unpost_document first'). It also notes a blocking condition ('payments block unposting'), giving concrete routing guidance without leaving room for guessing.

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

delete_jobA
DestructiveIdempotent

Delete a job.

Refuses by default when invoices/bills are linked to the job (data-loss prevention). force=True re-parents every linked invoice back to its underlying customer or vendor before deleting the job row, preserving invoice history. Use update_job(active=False) instead if you want to keep the job in place but mark the project done.

Args: job_id: Job ID. force: If True, re-parent linked invoices instead of refusing. Default False.

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNo
job_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

Beyond the destructiveHint annotation, the description discloses that the tool refuses by default to prevent data loss, and that force=True re-parents linked invoices to preserve history. This is exactly the kind of behavioral context an agent needs and the annotations alone do 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?

The description is well-structured and every sentence earns its place: it states the operation, the default protection behavior, the force behavior, and the alternative tool. The Args section is clean and directly maps to the schema parameters.

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?

The tool description covers the core operation, the data-loss prevention default, the force behavior, parameter semantics, and the relevant alternative. An output schema exists, so not explaining return values is acceptable. Nothing essential is missing for correct invocation.

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?

Schema description coverage is 0%, so the description carries full responsibility for explaining parameters. It defines job_id as a Job ID and force as the flag that re-parents linked invoices instead of refusing, adding meaning well beyond the raw schema types and defaults.

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 immediately states the operation ('Delete a job') and then explains the key behavioral nuance around linked invoices, distinguishing this tool from update_job and other job-related tools. It clearly identifies both the action and the resource.

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 says to use update_job(active=False) instead when keeping the job in place but marking the project done. It also explains when force=True should be used, giving the agent concrete decision criteria for choosing this tool or an alternative.

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

delete_partyA
DestructiveIdempotent

Delete a customer, vendor, or employee.

Blocked while the party has documents (invoices, bills, vouchers, credit notes) — the audit trail outranks tidiness. Prefer update_party(active=false) to retire a party while keeping its history.

Args: party_type: "customer", "vendor", or "employee" (ID counters collide across types — always required). id: Party ID (e.g., "000001").

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
party_typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

Beyond the destructiveHint annotation, the description discloses the critical failure condition: deletion is blocked while the party has documents, with a rationale ('the audit trail outranks tidiness'). This adds behavioral context not present in the structured 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 compact and front-loaded with the primary action, followed by two high-value behavioral notes and a concise argument list. Every sentence earns its place with no 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 destructive 2-parameter tool with an output schema present, the description covers purpose, usage, failure conditions, alternatives, and parameter semantics. An agent has enough to select and invoke the tool correctly without additional context.

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?

Schema coverage is 0%, so the description fully compensates. It explains that party_type is required because 'ID counters collide across types' and gives a concrete format example for id ('000001'). This adds meaning the bare schema lacks.

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 customer, vendor, or employee.' This clearly distinguishes from sibling tools like update_party, list_parties, and get_party. The scope of the operation is immediately obvious.

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

Usage Guidelines5/5

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

It provides explicit guidance: prefer update_party(active=false) when retiring a party while preserving history, and notes that deletion is blocked when documents exist. This tells the agent when not to use delete_party and which sibling to use instead.

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

delete_priceA
DestructiveIdempotent

Delete a single price entry.

Identifies the price by (commodity, namespace, date). Pass source to disambiguate when multiple prices exist on the same commodity+date (e.g. one user-entered and one fetched from a feed).

Args: commodity: Symbol (e.g., "VTSAX", "USD", "EUR"). namespace: Namespace (e.g., "FUND", "CURRENCY"). date: ISO date (YYYY-MM-DD) of the price to delete. source: Optional source tag (e.g., "user:price", "user:yfinance"). Required when multiple prices exist on the same commodity+date.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYes
sourceNo
commodityYes
namespaceYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare destructive and idempotent behavior. The description adds valuable context about how the tool behaves when multiple prices exist on the same commodity+date, explaining that source is needed to disambiguate. This goes beyond the annotation hints.

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 front-loaded with the primary purpose, then provides targeting and disambiguation rules in a logical order. The Args block is structured and every line contributes useful examples or constraints, with no redundant filler.

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

Completeness5/5

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

Given the destructive and idempotent annotations, plus the presence of an output schema, the description covers all essential invocation details: how the price is identified, when source is required, and what each parameter means. No critical information is missing for an agent to call this tool correctly.

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?

Schema description coverage is 0%, so the description carries the full burden of explaining parameters. It clearly defines all four parameters with concrete examples, format expectations, and the conditional requirement for source. This fully compensates for the empty 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?

Clearly states a specific action ('Delete a single price entry') and identifies the resource by its composite key (commodity, namespace, date). This distinguishes it from sibling tools like create_price, create_prices, and get_prices without ambiguity.

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

Usage Guidelines4/5

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

Provides precise guidance on when the optional source parameter is required for disambiguation. It doesn't name alternatives, but there is no direct deletion alternative among the siblings, so the usage context is sufficiently clear.

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

delete_scheduled_transactionA
DestructiveIdempotent

Delete a scheduled transaction.

Does not affect transactions already created from this schedule.

Args: guid: Scheduled transaction GUID (or 8+ char prefix).

ParametersJSON Schema
NameRequiredDescriptionDefault
guidYesScheduled transaction GUID (32-char hex or 8+ char prefix)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already mark this as destructive and idempotent. The description adds meaningful behavioral context by explicitly stating that previously created transactions from the schedule are unaffected. This clarifies the exact scope of destruction beyond what the 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.

Conciseness4/5

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

The description is compact and front-loaded, with the key effect stated immediately after the main action. The Args section is somewhat redundant given the schema already describes guid, but it is brief and does not bloat the definition.

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 delete tool, the description covers the essential behavior, the boundary of its effect, and the parameter meaning via schema. The output schema exists and annotations cover safety traits, so no critical operational context is missing.

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

Parameters3/5

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

The schema already documents guid with 100% coverage, including the 32-char hex or 8+ char prefix. The description's Args line essentially restates the schema without adding new semantic meaning, so it meets the baseline but does not exceed it.

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 clear verb and resource: "Delete a scheduled transaction." It further distinguishes the tool's scope by stating it does not affect transactions already created from the schedule, which is relevant given the sibling delete_transaction tool exists. No ambiguity about what this tool acts on.

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 use is implied by the name and opening sentence, but the description does not explicitly state when to choose this over alternatives like update_scheduled_transaction or delete_transaction. The note about not affecting existing transactions is useful context but does not provide explicit when/when-not routing guidance.

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

delete_taxtableA
DestructiveIdempotent

Delete a sales-tax table.

Refuses when any Entry row references the taxtable (computed via SQL on the entries table). Voided invoices still pin their taxtables — voided entry rows persist for audit-trail purposes. Remove or re-assign referencing entries first.

Args: name: Taxtable name.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

The annotations already mark this as destructive and non-read-only, and the description adds valuable specifics: the refusal behavior, the SQL-based reference check, that voided invoices still pin taxtables, and the required remediation. This goes well beyond what annotations convey.

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

Conciseness5/5

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

The description is front-loaded with the action, followed by the most important behavior and prerequisite, then the argument definition. Every sentence earns its place and there is no filler.

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

Completeness5/5

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

For a one-parameter destructive tool with an output schema, the description supplies the needed failure condition, persistence nuance, and remediation step. No missing information that an agent would need to call it correctly is apparent.

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 0%, so the description carries the burden for parameter meaning. The Args section defines 'name' as 'Taxtable name,' which is sufficient for the single required parameter and adds a small amount of domain context beyond the schema's generic 'Name' title.

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 object, 'Delete a sales-tax table,' which immediately distinguishes it from siblings like create_taxtable, list_taxtables, and update_taxtable. The resource is unambiguous, and the parameter name reinforces the target.

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 states a clear precondition and failure mode: deletion is refused while any Entry row references the taxtable, and those entries must be removed or re-assigned first. It does not explicitly name a sibling tool as an alternative, but the when-to-use/when-not-to-use context is strong.

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

delete_transactionA
DestructiveIdempotent

Delete one transaction by GUID — or several in one call.

Safeguards prevent deletion if a transaction has reconciled splits (force=true overrides) or is an invoice's posting record (unpost_document first).

Pass a LIST of GUIDs to delete several in one book open / one save. The batch is all-or-nothing: every guid is validated before anything is deleted, so a bad guid rejects the whole call with nothing removed. Response for a list is {status, count, transactions: [{guid, description}]}; a single guid returns the single-object shape as before.

Args: guid: Transaction GUID (32-char hex or 8+ char prefix), or a list of them. force: Allow deleting transactions with reconciled splits.

ParametersJSON Schema
NameRequiredDescriptionDefault
guidYes
forceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (destructive, idempotent), it discloses the all-or-nothing batch validation, that a bad GUID removes nothing, the response shape, and the safeguards around reconciled splits and invoice posting records. This is rich behavioral context that annotations alone do 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?

The description is organized with a clear lead sentence, safeguard notes, batch behavior, response format, and an Args section. Every sentence contributes essential operational detail without padding.

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 batch semantics, safeguards, and a response shape, the description covers all invocation-critical aspects. The output schema exists, and the description still usefully summarizes the list response. Nothing needed for correct invocation is missing.

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?

With 0% schema description coverage, the description carries the parameter documentation burden. It explains GUID format and prefix support, that guid can be a list, and what force does. This adds meaningful semantics beyond the bare schema types and defaults.

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 one transaction by GUID — or several in one call.' It clearly distinguishes the deletion operation from sibling transaction tools like void_transaction, update_transactions, and replace_splits, and covers both single and batch use.

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 operational context: deletion is blocked for reconciled splits unless force=true, and invoice posting records require unpost_document first. It does not explicitly contrast with alternatives like void_transaction, but the preconditions and override behavior are specific and useful enough to guide correct usage.

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

enter_statementA
DestructiveIdempotent

Enter a COMPLETE bank/card statement in one atomic call: create the new lines, claim the ones already in the book, and reconcile everything against the closing balance — all in one save, or nothing at all.

THE WORKFLOW (two calls around your judgment):

  1. dry_run=true (the DEFAULT) — transcribe the statement and get back a classification of every line: NEW (not in the book), MATCH (an existing unreconciled split corresponds), OVERLAP (already reconciled), AMBIGUOUS (several candidates). MATCH/AMBIGUOUS rows come with the candidate's full annotation (date, amount, description, notes, memo, short GUID) so you can adjudicate each one.

  2. Rule every MATCH/AMBIGUOUS row yourself, adapt annotations, confirm with the user.

  3. dry_run=false — NEW rows now carry interpreted description/notes and counter-splits; MATCH rows carry match=<split guid> claims. The server enters, claims, reconciles every statement-touched split at statement_date, and saves once.

TRANSCRIBE, DON'T INTERPRET (dry-run): amounts and balances go in EXACTLY as the statement prints them — for credit cards too (charges positive, balance as amount owed). The server applies the sign convention from the account's type; you never flip a sign. The gate opening + sum(lines) == closing must hold or the call rejects: transcribe every line.

INPUT — lines is a TSV block. Header: ref, date first, then any order of description, notes, raw, match, amount (required), then optional amt, acct, memo, qty counter-split groups (batch grammar). The statement account's own leg is SYNTHESIZED — never a column. Dry-run typically needs only::

ref<TAB>date<TAB>raw<TAB>amount
1<TAB>2026-07-03<TAB>POS DEBIT WHOLEFDS #123<TAB>-87.12
  • raw = the verbatim statement line; it lands on the bank leg's memo (provenance). description/notes are your interpretation (commit).

  • match = the split GUID this line claims instead of creating (from the dry-run candidates table). Claim rows may also carry raw (updates the claimed split's memo) and notes (updates the transaction's notes), and END at their last fixed column — they take no split cells. The claimed amount must equal the line amount exactly — fix the book first if they disagree.

  • A commit row with no counter-splits auto-fills from the most recent same-description 2-split transaction, adapted to the line amount (marked auto_filled_from:<guid>). The precedent must have exactly one leg on the statement account and no cross-commodity leg — anything else rejects with "supply explicit counter-splits". Explicit counter-splits must not name the statement account (its leg is synthesized).

SAFETY: the account's reconciled balance must tie to opening_balance (a prior unentered statement blocks commit), every created-vs-existing exact overlap must be explicitly claimed or forced, and the projected closing tie is verified BEFORE anything is written. The two force flags are INDEPENDENT: force_base=true lands onto an untied opening base (the consequent tie discrepancy is recorded, and duplicate detection STAYS ON); force_duplicates=true creates past exact twins you have adjudicated as distinct. Neither bypasses the statement's own self-check. After the save, the reconciled balance is read back and verified against the tie.

OUTPUT (dry-run): summary (class counts), lines (ref, class, cands, note — the note is the resolved disposition: the guard's refusal coaching verbatim, the auto-fill prediction, or "will claim …"), candidates — SELF-CONTAINED comparison rows sorted strongest-correspondence first (ref, candidate_guid, confidence, state, date_new/old + delta, amt_new/old + delta, cur, desc_new/old, notes_old, memo_old, cat_new/old, split_match, signals; _new = the statement line in book convention, _old = the existing split — never re-read your own input; cur is structurally blank on this surface), plus warnings (only when present; candidates likewise) and tie — the projected reconciled balance vs the closing, with a count of rows this exact payload would refuse at commit. The dry-run rehearses the SAME disposition procedure commit runs — force included. The tie is the only verdict; MATCH/AMBIGUOUS rows are yours to rule. OUTPUT (commit): results (ref, status, guid, note; status is created | claimed | skipped_duplicate, or on a refused statement rejected | statement_aborted — the note column carries the row's coaching and auto_filled_from:<guid> markers), plus, on success only, the new reconciled balance and the tie (a refusal returns just summary + results).

Args: account: Statement account ref (path, %short, or GUID). BANK/CASH/ASSET/CREDIT/LIABILITY only. statement_date: The statement's closing date (YYYY-MM-DD); every touched split reconciles at it. opening_balance: Opening balance, exactly as printed. closing_balance: Closing balance, exactly as printed. lines: The TSV block described above. dry_run: DEFAULT TRUE — the rehearsal is the workflow. force_base: Land onto an untied opening base; the tie discrepancy is recorded, twin detection stays on. force_duplicates: Create past exact unclaimed twins (you adjudicated them as distinct charges). show_all: Dry-run only. Lines with MEDIUM/HIGH candidates suppress their LOW amount-coincidences (the cands column notes "+N LOW suppressed"); show_all=true lists everything.

ParametersJSON Schema
NameRequiredDescriptionDefault
linesYes
accountYes
dry_runNo
show_allNo
force_baseNo
statement_dateYes
closing_balanceYes
opening_balanceYes
force_duplicatesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

The description discloses atomic all-or-nothing saves, exact transcription requirements, sign conventions derived from account type, safety gate 'opening + sum(lines) == closing', independent force-flag effects, duplicate-detection behavior, auto-fill behavior, and read-back verification after commit. This richly supplements the annotations, which only mark the call as non-readOnly, non-open-world, idempotent, and destructive.

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?

Although long, the description is tightly organized into labeled sections: workflow, transcription rules, input grammar, safety, and output formats. The most important usage model is front-loaded, and the detailed examples and field enumerations are necessary given the tool's complexity. No sentence is filler.

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

Completeness5/5

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

For a high-complexity tool with 9 parameters, zero schema parameter descriptions, a TSV input grammar, two execution modes, and safety-critical behavior, the description is essentially complete. It covers all required fields, explains both dry-run and commit output shapes, lists refusal conditions, and gives a runnable minimal input example. The presence of an output schema does not create any notable gap.

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?

Schema description coverage is 0%, but the description compensates completely. Every parameter is explained: account ref formats and allowed types, statement_date as the reconciliation date, exact balance semantics, the full TSV grammar for lines, and the meaning and default of each boolean flag. The example line block conveys the required format better than a schema description could.

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: 'Enter a COMPLETE bank/card statement in one atomic call,' and immediately differentiates the tool by including create, claim, and reconcile behavior in a single save. This clearly separates it from generic transaction creation or standalone reconciliation tools among the 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?

The 'WORKFLOW' section explicitly prescribes a two-call pattern: dry_run first, adjudicate MATCH/AMBIGUOUS rows, then commit with dry_run=false. It also gives explicit conditions such as 'fix the book first if they disagree,' explains when force_base and force_duplicates are appropriate, and warns when the call will reject. This is unusually concrete operational guidance.

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

get_accountA
Read-only

Get details for one account: type, commodity, description, placeholder flag, GUID, and hierarchy position.

Read-only. Returns {"error": "Account not found: ..."} when the ref matches nothing — nothing raises. Use list_accounts to discover refs in bulk, get_balance when you only need a number, get_account_slots for custom metadata (APR, credit_limit, ...).

Args: name: Account ref: full path (e.g. 'Assets:Bank:Checking'), %short GUID, or full 32-char GUID

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description states 'Read-only' and discloses precise error behavior: returns an error object when ref matches nothing and never raises. This is valuable operational context that the annotation alone does 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?

The description is well-structured: purpose first, then safety/error behavior, then sibling routing, then parameter format. Every sentence adds distinct value, and the format is easy to scan.

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 read-only tool with an output schema, the description covers purpose, return contents, acceptable ref formats, error behavior, and alternatives. Nothing an agent needs 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.

Parameters5/5

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

Schema coverage is 0%, so the description must compensate, and it does thoroughly. The Args section explains the 'name' parameter's accepted forms (full path, %short GUID, full 32-char GUID) with a concrete example, giving an agent the syntax needed to call the tool.

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 ('Get details for one account') and enumerates the exact data returned (type, commodity, description, placeholder flag, GUID, hierarchy position). It differentiates from get_balance and get_account_slots before those tools are even named by clarifying what this tool does and does not return.

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 routes to alternatives: list_accounts for bulk discovery, get_balance when only a number is needed, get_account_slots for custom metadata. This gives clear when-to-use and when-not-to-use guidance, which is exactly what an agent needs to select among siblings.

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

get_account_slotsA
Read-only

Read slots (custom metadata) from an account.

Slots are key-value pairs stored on accounts for metadata like APR, credit limit, reward rates, or any custom data.

Args: account: Account ref: full path (e.g., "Liabilities:Credit Cards:Capital One"), %short GUID, or full 32-char GUID. key: Specific slot key to retrieve. If omitted, returns all slots.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNo
accountYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already indicate read-only and non-open-world behavior. The description adds meaningful behavioral context: slots are key-value metadata, account can be a path/%short GUID/full GUID, and omitting 'key' returns all slots. This complements the annotations without contradicting 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 concise and front-loaded: the core action is stated first, followed by a short clarifying explanation and a compact Args block. Every sentence earns its place with no repetition or filler.

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

Completeness5/5

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

For a simple read-only tool with a single required parameter, the description covers the account reference formats, the optional key semantics, and general slot context. The output schema exists, so return values are already specified elsewhere. Nothing essential is missing.

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?

Schema description coverage is 0%, so the description bears the full burden for parameters. It clearly explains the 'account' parameter's accepted reference formats and the optional 'key' parameter's default behavior, far exceeding the schema's bare field names.

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 'Read slots (custom metadata) from an account', a specific verb and resource, and clarifies slots as key-value pairs. This clearly distinguishes it from sibling set_account_slot and delete_account_slot, which perform mutations.

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 read-only wording and slot key-value explanation make the intended use clear against the set/delete siblings, and the account ref formats provide conditions for use. It does not explicitly name alternatives or exclusions, but the context is sufficient for an agent to select this tool correctly.

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

get_audit_logA
Read-only

Read audit log entries for a date.

Returns the human-readable text audit log, led by a Showing X-Y of Z audit entries (date) indicator. Each write operation (CREATE, UPDATE, DELETE, VOID, RECONCILE, etc.) is one entry separated by a blank line. Reads are not logged.

Unlike the row-list tools, the window is anchored to the most recent entry: offset pages backward into history (offset=0 is the newest page), since "what happened lately" is the usual question. limit=0 returns the count only.

Args: log_date: Date to read (YYYY-MM-DD). Defaults to today. limit: Page size (default 50). 0 = count only. offset: Entries to skip back from the most recent (default 0).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
log_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations carry readOnlyHint=true, and the description adds rich behavioral context beyond that: backward-pagination semantics, limit=0 returning count only, the leading indicator format, blank-line separation per write operation, and the fact that reads are not logged. No contradiction with the read-only annotation.

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

Conciseness4/5

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

The description is longer than average, but each section earns its place: the output-format indicator, the genuinely non-intuitive backward-pagination behavior, and the enumerated args. It is appropriately front-loaded and structured into paragraphs plus an Args block. Slightly verbose but justified by the unusual semantics.

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?

An output schema exists, so return values need no explanation, yet the description still covers the indicator line. The most error-prone behavior (reverse offset ordering) is fully disclosed, and the read-only annotation is reinforced by the 'Reads are not logged' note. Nothing an agent needs to call this correctly is missing.

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?

Schema description coverage is 0%, so the description must fully compensate. It documents all three parameters with meaning beyond the schema: log_date (YYYY-MM-DD format, defaults to today), limit (page size, 0=count only), and offset (entries to skip back from most recent, 0=newest). This fully compensates for the zero-coverage 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-resource pair ('Read audit log entries for a date') and adds concrete detail about what is returned (human-readable text, blank-line separated entries, 'Showing X-Y of Z' indicator). This clearly distinguishes it from the many sibling tools, none of which are audit-log readers.

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 contrasts with 'the row-list tools' by explaining that the window anchors to the most recent entry and that offset pages backward — important guidance for a non-obvious API. It also states that reads are not logged. However, it does not name specific alternative tools or give explicit when-not-to-use conditions, so the guidance is contextual rather than prescriptive.

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

get_balanceA
Read-only

Get the balance of an account as of a specific date.

Defaults to today's date — future-dated transactions (scheduled payments, accrued interest) are excluded. To project a balance forward including future entries, pass an explicit as_of_date past today.

Args: account_name: Account ref: full path (e.g. 'Assets:Bank:Checking'), %short GUID, or full 32-char GUID as_of_date: Date in ISO format (YYYY-MM-DD). Defaults to today.

ParametersJSON Schema
NameRequiredDescriptionDefault
as_of_dateNo
account_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

The readOnlyHint annotation already signals a safe read operation. The description adds meaningful behavioral context by disclosing that future-dated transactions, scheduled payments, and accrued interest are excluded by default, and that passing a future as_of_date changes the balance projection. No contradiction with annotations.

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

Conciseness4/5

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

The description is well-structured: a one-sentence purpose, a concise behavioral note, then an Args block. Minor redundancy exists ('Defaults to today's date' and later 'Defaults to today'), but overall it is efficient 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?

With an output schema present and both parameters well documented, the description covers what an agent needs to invoke the tool correctly. The main gap is that balance computation semantics beyond future-date exclusion are not described, but this is not essential for basic invocation.

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?

Schema description coverage is 0%, but the description fully compensates by documenting both parameters: account_name includes acceptable formats (full path, %short GUID, full 32-char GUID) and as_of_date specifies ISO format and default behavior. This adds significant meaning beyond the bare schema field titles.

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

Purpose4/5

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

The description states a specific verb and resource: 'Get the balance of an account as of a specific date.' This clearly distinguishes the tool's core function from account metadata tools like get_account or get_book_summary, though it does not explicitly name sibling alternatives.

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 guidance around the date behavior: it defaults to today, excludes future-dated transactions, and instructs when to pass an explicit as_of_date to project forward. It does not explicitly discuss alternative tools or exclusion conditions, but the when-to-use context is strong.

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

get_book_summaryA
Read-only

Get a compact overview of the entire GnuCash book.

Returns book path, currency, account structure, transaction counts, key balances, net worth, commodities, and scheduled transactions in a single text response. Use this first to orient yourself.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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, so the read-only nature is established. The description adds useful context about the response being a 'single text response' and enumerates the contents, but it does not disclose any additional behavioral traits beyond that.

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 front-loaded with the core purpose, followed by a concise summary of return contents and a clear usage instruction. Every sentence earns its place with no filler.

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

Completeness5/5

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

With zero parameters, a read-only annotation, and an output schema present, the description provides everything an agent needs to invoke this tool correctly. It clearly states what will be returned and when to use 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?

The tool takes zero parameters, so no parameter documentation is needed. The description still adds value by defining the tool's scope ('entire GnuCash book'), which makes the absence of parameters sensible.

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 ('Get') and resource ('compact overview of the entire GnuCash book'), giving agents an immediate understanding of the tool's purpose. It differentiates itself from granular sibling tools like get_account or list_transactions by emphasizing the whole-book scope.

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

Usage Guidelines4/5

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

The phrase 'Use this first to orient yourself' explicitly provides a clear usage context, positioning this tool as the initial orientation step. It does not explicitly enumerate alternatives or when-not-to-use cases, but the guidance is strong enough for an agent to select it appropriately among siblings.

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

get_budgetA
Read-only

Get full details of a budget including all budget amounts.

Returns a compact text table by default — collapses uniform periods (e.g., "250/mo (all periods)") so the typical 12-cell repeat doesn't dominate the response. Use verbose=true for the full structured periods dict per account.

Args: name: Budget name. verbose: If false (default), compact text output — optimized for reading and token efficiency. If true, structured JSON, for when you need machine-readable fields rather than a report.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
verboseNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already mark the tool as read-only, so the description's main behavioral contribution is the output-shape disclosure: compact text collapses uniform periods, while verbose=true returns structured JSON. This adds meaningful context beyond the annotations. It doesn't mention error behavior, but for a read-only retrieval tool the output behavior is the key 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 well-organized and front-loaded: purpose, output behavior, then parameter details. Every sentence contributes useful information, and the verbose explanation is concise while still covering the important distinction. No fluff or repetition.

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

Completeness4/5

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

For a two-parameter read-only tool with an output schema, this description is quite complete: it explains the default and verbose output, the structure of the verbose result, and the purpose of each parameter. Minor gaps like exact name-matching behavior or error handling are not critical given the simplicity of the 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?

Schema description coverage is 0%, so the description must carry parameter semantics. It fully compensates: 'name' is explained as the budget name, and 'verbose' gets a detailed explanation of both states including the default and the resulting output format. This goes well beyond the bare boolean/string schema.

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

Purpose4/5

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

The description clearly states the verb and resource: 'Get full details of a budget including all budget amounts.' This is specific and readable. It doesn't explicitly differentiate from siblings like get_budget_report or list_budgets, but the full-details framing and output details make its scope reasonably 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 guidance on when to use verbose=true versus the default compact text output, even explaining the tradeoff between token efficiency and machine-readable structure. It does not explicitly mention when to choose this tool over similar siblings, 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.

get_budget_reportA
Read-only

Compare actual spending against budget.

Returns a compact text table by default with ⚠ markers on categories exceeding budget. Use verbose=true for the full structured dict.

Args: budget_name: Name of the budget. period: Which period to report: - None: Current period based on today's date (default) - Integer 0-11: Specific period - "ytd": Year to date (all periods up to current) - "all": All periods account: Optional filter to specific account or parent account. include_children: If True and account specified, include child accounts. verbose: If false (default), compact text output — optimized for reading and token efficiency. If true, structured JSON, for when you need machine-readable fields rather than a report.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNo
accountNo
verboseNo
budget_nameYes
include_childrenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

The description goes beyond the readOnlyHint annotation by explaining the default compact text-table output with ⚠ markers on categories exceeding budget, and the toggle to verbose structured JSON. It also notes the token-efficiency rationale for the default, giving the agent useful behavioral context for choosing output formats.

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 structured with a clear purpose line, output summary, and an Args section where every parameter gets a scannable bullet. Each sentence serves a distinct purpose, and the verbose/format guidance is front-loaded before the parameter details.

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 the tool's complexity, the description covers all invocation-relevant behavior: default output format, verbose mode, period options, account filtering, and child-account inclusion. The presence of an output schema means return structure is already specified elsewhere, so no additional return documentation is necessary.

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?

With 0% schema description coverage, the description fully compensates by documenting every parameter: budget_name, period (including the None default, integer range, 'ytd', and 'all' options), account, include_children, and verbose. The period parameter especially benefits from concrete allowed values that the raw schema does not convey.

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 first sentence, "Compare actual spending against budget," names a specific verb and resource, clearly distinguishing this from budget configuration tools like get_budget or create_budget. The mention of compact text tables with warning markers further reinforces that this is a reporting tool rather than a CRUD operation.

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

Usage Guidelines3/5

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

The description makes it clear the tool is for comparing spending to budget and provides detailed period semantics, but it does not explicitly state when to prefer this over sibling report tools such as spending_by_category, vendor_spending_report, or get_job_report. Usage is implied rather than explicitly routed with alternatives and exclusions.

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

get_documentA
Read-only

Get full details for a customer invoice, vendor bill, employee voucher, or credit note, including line items.

Returns all entries with quantities, prices, and totals; the response's type field names the document kind.

Status vocabulary: open = editable, not yet booked; posted = on the books, payable; paid = remaining balance zero. The full definitions live on list_documents; the unpaid list is get_outstanding_documents.

Args: id: Document ID (e.g., "000001"). This is the human-readable ID, not the internal GUID. document_type: "invoice", "bill", "voucher", or "credit_note" — disambiguates when IDs collide across per-type counters. party_type: Owner side ("customer"/"vendor") — needed only for credit notes, which exist on both sides.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
party_typeNo
document_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already mark this as read-only, and the description adds meaningful behavioral context: it returns all entries with quantities, prices, and totals, names the document kind in the response `type` field, and explains the open/posted/paid status vocabulary. This goes well beyond the annotations and helps the agent interpret results correctly.

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 front-loaded with the core purpose, then moves to return behavior and status semantics, then parameter details. Each sentence earns its place, and the Args block is structured, direct, and free of fluff.

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 the read-only annotation and the presence of an output schema, the description covers everything needed to call the tool correctly: document scope, return contents, status meaning, ID format, and optional parameter roles. Error/not-found behavior is not described, but this is a minor omission relative to the otherwise complete guidance.

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?

Schema description coverage is 0%, so the description carries the full burden, and it delivers: id is explicitly the human-readable ID, not the internal GUID; document_type is explained as a disambiguator for per-type counters; party_type is scoped to credit notes. This is more informative than the raw schema.

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

Purpose5/5

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

The description uses a specific verb and resource: 'Get full details for a customer invoice, vendor bill, employee voucher, or credit note, including line items.' It also distinguishes itself from related tools by pointing to list_documents and get_outstanding_documents for definitions and unpaid lists.

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 and points to alternatives: 'full definitions live on list_documents' and 'the unpaid list is get_outstanding_documents.' It does not explicitly say 'use get_document when you need a single document's line items' or 'do not use it for lists,' but the purpose and pointers make the intended usage reasonably clear.

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

get_job_reportA
Read-only

Per-job summary: billed / paid / outstanding totals across all linked invoices, plus the per-invoice breakdown.

Totals are returned as totals_by_currency (a dict keyed by ISO currency code) so the same shape works whether the job's invoices share a currency or span multiple. Both posted and unposted (draft) invoices are included — drafts contribute their face value as billed + outstanding with paid=0, so the report shows the full pipeline.

Args: job_id: Job ID (e.g., "000001").

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnlyHint=true annotation, the description discloses meaningful behavioral details: drafts are included with billed + outstanding and paid=0, totals are currency-keyed, and per-invoice breakdowns are returned. This gives an agent an accurate model of what the report contains and how numbers are computed.

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 front-loaded: the first sentence gives the tool's purpose, the second paragraph adds behaviorally important details about currencies and drafts, and the Args line is minimal but useful. No redundant prose or filler.

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

Completeness5/5

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

Because an output schema exists, return shape details are already covered elsewhere. The description supplies the missing context: what the totals key on, how drafts are treated, the per-invoice breakdown, and the one parameter's format. Nothing required for correct invocation 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?

The input schema only provides the name and type for job_id, so the description carries the burden at 0% schema coverage. The description adds a brief semantic explanation and an example ('Job ID (e.g., "000001")'), which is sufficient for a single simple required parameter.

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 resource ('Per-job summary') and precise metrics ('billed / paid / outstanding totals across all linked invoices, plus the per-invoice breakdown'). This clearly separates it from sibling report tools like get_budget_report or vendor_spending_report without needing to inspect 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 makes the intended context clear: this is the job-level invoice report, including draft and posted invoices. It does not explicitly state when not to use it or name alternatives like get_budget_report, so it falls short of full routing guidance, but the scope is unmistakable.

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

get_latest_priceA
Read-only

Get the most recent price for a commodity.

Args: commodity: Symbol of the commodity (e.g., "VTSAX"). namespace: Namespace of the commodity (e.g., "FUND"). currency: Currency for the price. Defaults to the book's default currency. Pass explicitly to get a price quoted in a non-default currency.

Returns: JSON with date, value, type, and source of most recent price. Returns null if no price exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
currencyNo
commodityYes
namespaceYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description does not contradict that. It adds useful behavior beyond annotations: the exact return fields (date, value, type, source) and the null-when-no-price behavior, which an agent needs to interpret the response correctly.

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 scannable: a one-line summary, a short Args section, and a Returns section. Every sentence contributes useful information, and no filler or repetition 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 simple read-only lookup tool, the description covers all elements needed to invoke it correctly: required parameters, optional parameter semantics, return shape, and the null case. The read-only safety profile is already in annotations, and the return contract is stated explicitly.

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?

Schema description coverage is 0%, so the description carries the full burden of explaining the three parameters. It provides a concrete example for commodity and namespace and clearly explains the currency default and when to pass it explicitly. This fully compensates for the schema's bare names.

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 action and object: 'Get the most recent price for a commodity,' with commodity, namespace, and currency parameters. It is specific enough to be distinguishable from price-mutating siblings like create_price and delete_price, but it does not explicitly contrast with get_prices, so it falls short of full 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 Guidelines2/5

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

No guidance is given about when to choose get_latest_price over get_prices or other siblings. The only usage-related context is the currency default behavior, which explains how the optional parameter behaves rather than 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_lotA
Read-only

Get detailed information about a lot.

Args: guid: Lot GUID (or 8+ char prefix).

Returns: JSON with lot details including all splits: - title, notes, is_closed - splits: list of all splits with date, quantity, value - summary: total quantity, cost basis, cost per share

ParametersJSON Schema
NameRequiredDescriptionDefault
guidYesLot GUID (32-char hex or 8+ char prefix)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already mark the tool as read-only, and the description reinforces this by specifying it 'Returns' data rather than mutating state. It adds useful behavioral detail about the response contents (all splits, summary fields), which goes beyond the annotation metadata.

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 well-structured with a clear purpose line, an Args section, and a Returns section that lists key output fields. It is somewhat repetitive with the schema's parameter description, but every section adds useful navigation 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?

For a single-parameter read-only lookup tool with an output schema and readOnly annotations, the description is largely complete. It covers input format and return structure, though it does not describe error behavior for unknown or invalid GUIDs, which is a minor gap.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents the guid parameter fully. The description repeats the parameter information without adding new semantic meaning, so the baseline score of 3 is appropriate.

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

Purpose4/5

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

The description states a specific action ('Get detailed information') on a specific resource ('a lot'), making the tool's purpose clear. It implies differentiation from list_lots by focusing on a single lot's detailed data, but it does not explicitly name or contrast with sibling tools.

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

Usage Guidelines3/5

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

Usage is implied: call this when you have a lot GUID and need full details including splits and summary. There is no explicit guidance about when not to use it or which alternative to choose, such as list_lots for enumeration or calculate_lot_gain for gain calculations.

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

get_outstanding_documentsA
Read-only

Get all posted customer invoices, vendor bills, employee vouchers, and credit notes with outstanding balances.

This is the authoritative unpaid list: outstanding = posted with a remaining balance > 0. One call answers "what is actually unpaid?" — no need to combine list_documents and get_document (full status vocabulary on list_documents).

Leads with a Showing X-Y of Z invoices (date range) line, then a compact one-line-per-doc format by default with action columns (due date, days past due, currency, BILL tag, owner). Sorted most-overdue-first so the bookkeeper sees the urgent items at the top. Page with offset; limit=0 returns the count only.

Use verbose=true for structured JSON with original_amount / amount_paid / amount_due breakdown — the shape pay_document workflows expect.

Args: party_type: Filter by "customer" or "vendor". Omit for all. customer_id: Filter by specific customer ID. vendor_id: Filter by specific vendor ID. verbose: If false (default), compact text output — optimized for reading and token efficiency. If true, structured JSON, for when you need machine-readable fields rather than a report. limit: Page size (default 50, max 250). 0 = count only. offset: 0-indexed first row to return (default 0).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
verboseNo
vendor_idNo
party_typeNo
customer_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already mark the operation read-only, and the description adds substantial runtime behavior beyond that: the 'Showing X-Y of Z' summary line, compact one-line-per-doc format, action columns, most-overdue-first sorting, pagination with offset, and limit=0 count-only semantics. No contradiction with annotations.

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

Conciseness5/5

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

The description is long but every part earns its place: overview, use-case, output format, sorting, pagination, verbose mode, and a per-parameter Args section are cleanly organized and front-loaded with the core purpose. There is no 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 six-parameter tool with no schema descriptions, the description supplies nearly all needed call context: result shape, sorting, paging, count behavior, and output-mode switch, and an output schema exists for structured returns. The omission of the employee party_type option is the only material completeness gap.

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?

With 0% schema description coverage, the description carries the full parameter burden and documents limit, offset, verbose, party_type, customer_id, and vendor_id with concrete meanings and edge cases such as limit=0 and default/max limits. The only gap is that party_type schema also allows 'employee', but the Args text only mentions filtering by customer/vendor despite employee vouchers being in the overview.

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

Purpose5/5

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

The description names a specific verb and resource set: posted customer invoices, vendor bills, employee vouchers, and credit notes with outstanding balances. It also explicitly distinguishes itself from list_documents and get_document as the authoritative unpaid list, so an agent can tell what it does without ambiguity.

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

Usage Guidelines5/5

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

It says this one call answers 'what is actually unpaid?' and that there is no need to combine list_documents and get_document. It also points to list_documents for the full status vocabulary and to verbose=true for pay_document workflows, giving clear routing guidance to alternatives.

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

get_partyA
Read-only

Get details for one customer, vendor, or employee by ID.

Args: party_type: "customer", "vendor", or "employee" — required because ID counters collide across types (customer 000001 ≠ vendor 000001). id: Party ID (e.g., "000001"). This is the human-readable ID shown in GnuCash, not the internal GUID.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
party_typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, indicating a safe read operation, which the description matches. The description adds valuable behavioral context beyond the schema: ID counters collide across party types, and the ID is the human-readable GnuCash ID rather than the internal GUID. This helps the agent avoid common mistakes.

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, front-loads the core purpose, and uses a clear Args breakdown. Each sentence provides necessary semantic information without 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?

The tool is simple, has an output schema to cover return structure, has annotations covering safety, and the description thoroughly explains both required parameters. Nothing critical is missing for an agent to invoke this tool correctly.

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?

Schema description coverage is 0%, but the description fully compensates by explaining both parameters in meaningful terms: party_type values are enumerated and its necessity is justified by ID collisions, and id is clarified with an example and a warning against confusing it with the GUID. This adds substantial value beyond the bare 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 action ('Get details') applied to a well-defined resource ('one customer, vendor, or employee') and identifies the key lookup key, the ID. This clearly distinguishes it from sibling tools like list_parties, create_party, update_party, and delete_party.

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: use this for retrieving a single party by ID, not for listing or modifying. It does not explicitly name alternatives for listing, but the 'by ID' scope and the parameter explanation make the intended use clear enough. No exclusions are stated beyond that implicit scope.

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

get_pricesA
Read-only

Get price history for a commodity.

Leads with a Showing X-Y of Z prices (date range) line, then a compact aligned text table by default. Page with offset; limit=0 returns the count only. Use verbose=true for the full structured envelope (prices list, showing, total, offset, count).

Args: commodity: Symbol of the commodity (e.g., "VTSAX"). namespace: Namespace of the commodity (e.g., "FUND"). start_date: Optional start date filter (YYYY-MM-DD). end_date: Optional end date filter (YYYY-MM-DD). currency: Optional currency filter (e.g., "USD"). limit: Page size (default 50, max 250). 0 = count only. verbose: If false (default), compact text output — optimized for reading and token efficiency. If true, structured JSON, for when you need machine-readable fields rather than a report. offset: 0-indexed first row to return (default 0).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
verboseNo
currencyNo
end_dateNo
commodityYes
namespaceYes
start_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

The description discloses exactly what the agent will receive: a 'Showing X-Y of Z prices (date range)' lead line, a compact aligned text table by default, a count-only mode with limit=0, and the full structured envelope when verbose=true. This goes well beyond the readOnlyHint annotation and provides substantial behavioral context without needing to inspect the output schema.

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

Conciseness5/5

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

The description is dense but well-organized: purpose first, followed by output behavior, then a clean Args list. Every sentence earns its place, and the front-loaded output detail helps the agent know what to expect immediately. No redundant repetition of schema titles or types.

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 8 parameters and only 2 required, the description covers all parameter semantics, date formats, pagination rules, output modes, and special values. Since an output schema exists, return-value structure doesn't need to be restated. The description is fully sufficient for correct invocation.

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?

Despite 0% schema description coverage, the Args section fully documents all 8 parameters with concrete examples, formats, defaults, and special behaviors (limit max 250, limit=0 means count only, verbose=true switches output mode). The description compensates completely for the schema's lack of descriptive text.

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 leads with a specific verb and resource: 'Get price history for a commodity.' This clearly distinguishes it from the sibling get_latest_price and other price-related tools. The focus on history plus optional date filters 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 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 price history is needed rather than latest prices—but never explicitly names get_latest_price as the alternative or states when not to use this tool. It does give strong guidance on selecting verbose versus compact output and on pagination behavior, but not on sibling tool selection.

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

get_reconciliation_statusA
Read-only

Per-account reconciliation table behind the dashboard's aggregate counts — answers "WHICH accounts are never reconciled / dormant / behind?"

One line per reconcilable account with activity, bucketed exactly as the dashboard classifies them: behind (most-behind first, with pending-split counts), never, current, dormant ($0, fully reconciled, idle), and excluded (opted out via the account's no_reconcile slot — the right setting for loans, escrow payables, and other statement-less accounts: set_account_slot(account, "no_reconcile", "1"). Reporting-only; reconcile tools still work on excluded accounts).

Args: verbose: If false (default), compact text output — optimized for reading and token efficiency. If true, structured JSON, for when you need machine-readable fields rather than a report. limit: Page size (default 50, max 250). 0 = count only. offset: 0-indexed first row to return.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
verboseNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, and the description reinforces this with 'Reporting-only'. It goes well beyond the annotation by detailing bucket semantics, sort order (most-behind first), pending-split counts, the no_reconcile slot behavior, and that reconcile tools still operate on excluded accounts — valuable operational 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 dense but tightly organized: purpose first, then bucket semantics, then parameter details. Every sentence contributes information, including the concrete no_reconcile example, and no filler or restatement of the tool name 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?

An output schema exists, so return-value details are not required from the description. The description covers edge cases (excluded accounts, dormant definition, count-only mode, pagination bounds, verbose vs compact output) and gives enough context to invoke the tool correctly without further lookups.

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?

Schema description coverage is 0%, but the description's Args section fully compensates: verbose explains compact text vs structured JSON and when each is useful, limit documents default, max, and the 0 = count-only behavior, and offset is clearly defined as 0-indexed. This is exactly the semantic content an agent needs beyond the raw 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 names a specific resource ('per-account reconciliation table') and a specific question it answers ('WHICH accounts are never reconciled / dormant / behind?'). It distinguishes itself from the dashboard's aggregate counts and from sibling tools like get_unreconciled_splits by stating its unique bucketed, per-account scope.

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

Usage Guidelines4/5

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

The description clearly frames the tool as reporting-only and explains when its classification buckets apply, including the excluded-account path via set_account_slot. It stops short of explicitly naming which sibling to use instead for actionable reconciliation, but the reporting-only context and bucket definitions make the usage intent clear.

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

get_server_configA
Read-only

Get the server's loaded configuration.

Returns loaded modules, tool count, book path, debug mode, and version. Use this to verify which tools are available in this session.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description is consistent with that. It adds useful context beyond annotations by specifying that the returned config reflects loaded modules and the session's available tools, which is valuable behavioral information for a session-scoped read-only 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 compact and front-loaded: the first sentence states the action and resource, and the second sentence lists return contents and intended use. Every sentence earns its place with no redundancy or filler.

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

Completeness5/5

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

For a zero-parameter, read-only tool with an output schema, the description provides everything an agent needs: what the tool does, what it returns, and when to use it. The output schema covers return details, so the description does not need to enumerate them further.

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

Parameters4/5

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

The tool has zero parameters, and schema coverage is 100% (an empty properties object), so there are no parameter details to describe. The description appropriately focuses on the return value and use case instead of parameter syntax.

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 a specific resource ('the server's loaded configuration'), and names the exact contents it returns: loaded modules, tool count, book path, debug mode, and version. This clearly distinguishes it from all siblings, none of which retrieve server-level configuration.

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 states when to use the tool: 'Use this to verify which tools are available in this session.' It provides clear context for the appropriate use case, though it does not mention alternatives or when not to use it.

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

get_transactionB
Read-only

Get details for a specific transaction by GUID.

Args: guid: Transaction GUID (32-character hex string, or 8+ char prefix)

ParametersJSON Schema
NameRequiredDescriptionDefault
guidYesTransaction GUID (32-char hex or 8+ char prefix)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

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

readOnlyHint=true already signals a safe read, and the description's 'Get details' aligns with it, so no contradiction. The description adds no behavioral detail beyond the parameter format (e.g., no mention of returned transaction shape, prefix-match behavior, or error conditions), but annotations cover the main safety profile.

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

Conciseness4/5

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

Two short lines front-load the purpose and then list the argument. The Args block is somewhat redundant with the schema, but the description is compact 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?

For a one-parameter read-only get-by-GUID with an output schema and readOnlyHint annotation, this is nearly complete. It could be more helpful by noting what happens when the GUID prefix is ambiguous or not found, but nothing essential to invoking the tool 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?

The single guid parameter is 100% described in the input schema, so the description doesn't need to compensate. The 'Args' line merely repeats the schema description ('Transaction GUID (32-char hex or 8+ char prefix)') and adds no new semantic information.

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

Purpose4/5

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

Description opens with a specific verb and resource: 'Get details for a specific transaction by GUID.' This makes the read/retrieval intent clear and distinguishes it from list/search by emphasizing a GUID lookup, though it doesn't explicitly name sibling tools like search_transactions or list_transactions.

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

Usage Guidelines2/5

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

No guidance is given on when to use this tool versus list_transactions, search_transactions, or other siblings. The only implied context is that a GUID is required, but no exclusions or alternatives are mentioned.

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

get_unreconciled_splitsA
Read-only

Get unreconciled splits for an account.

Leads with a Showing X-Y of Z splits indicator, then one line per split, then a summary footer reflecting the full unreconciled set (so the headline is honest even when individual lines are clipped). Page with offset; limit=0 returns the count only.

Use verbose=true for structured JSON with split GUIDs, amounts, totals, and the showing indicator as a structured field.

Args: account: Account ref: full path (e.g. 'Assets:Bank:Checking'), %short GUID, or full 32-char GUID as_of_date: Only include splits on or before this date (YYYY-MM-DD) verbose: If false (default), compact text output — optimized for reading and token efficiency. If true, structured JSON, for when you need machine-readable fields rather than a report. limit: Page size (default 50, max 250). 0 = count only. offset: 0-indexed first row to return (default 0).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
accountYes
verboseNo
as_of_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnlyHint/openWorldHint annotations, the description discloses detailed output behavior: the leading 'Showing X-Y of Z splits' indicator, the summary footer reflecting the full unreconciled set even when lines are clipped, and the structured JSON shape under verbose=true. It also defines the as_of_date filtering semantics. No contradiction with annotations.

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

Conciseness5/5

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

The description is front-loaded with the core purpose, then moves logically through output shape, paging, verbose mode, and parameters. Each sentence carries behavioral or semantic content; the Args block is compactly formatted. No filler or repetition of 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 five-parameter tool with an output schema, the description is complete: it documents every parameter with defaults and semantics, explains the response layout in both text and JSON modes, and covers paging and count-only behavior. The only omitted detail—sort order—is not necessary for making a correct call.

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?

Schema description coverage is 0%, and the description compensates fully: every parameter is explained in the Args block—account reference formats, as_of_date inclusive semantics, verbose output modes, limit paging/count-only, and offset indexing. This goes well beyond the bare type/default information in the schema.

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

Purpose4/5

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

The opening sentence, 'Get unreconciled splits for an account,' names a specific verb and resource, making the tool's function immediately clear. It does not explicitly differentiate from sibling reconciliation tools such as get_reconciliation_status, though the 'unreconciled splits' phrase is distinctive enough to avoid most 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 provides rich usage context: it explains paging with offset, the count-only behavior of limit=0, and when to switch to verbose=true ('when you need machine-readable fields rather than a report'). However, it never names alternative tools or states when not to use this tool, so it stops short of explicit route selection.

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

get_upcoming_transactionsA
Read-only

Get scheduled transactions due within a time window.

This is the "what bills are coming up?" query. Leads with a Showing X-Y of Z upcoming transactions (date range) line, soonest first. Page with offset; limit=0 returns the count only.

Args: days: Look ahead window in days. Default 14. verbose: If false (default), compact text output — optimized for reading and token efficiency. If true, structured JSON, for when you need machine-readable fields rather than a report. limit: Page size (default 50, max 250). 0 = count only. offset: 0-indexed first row to return (default 0).

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
limitNo
offsetNo
verboseNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint/openWorldHint annotations, it discloses the output prefix, soonest-first ordering, paging via offset, limit=0 count-only behavior, and the verbose compact-vs-JSON output modes. This is rich, non-obvious 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 front-loaded with the core purpose, followed by a short behavioral summary and a compact args list. Every sentence adds useful information with no filler.

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

Completeness5/5

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

For a read-only paginated query with an output schema, the description covers output format, ordering, paging, count-only mode, and verbose behavior. The output schema supplies the machine-readable structure, so nothing essential is missing.

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?

Schema description coverage is 0%, so the description carries full responsibility for parameters. It clearly documents days, verbose, limit, and offset, including defaults, special values, and output implications for each.

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?

Opens with a specific verb and resource: 'Get scheduled transactions due within a time window.' The framing as the 'what bills are coming up?' query further distinguishes it from siblings like list_transactions and list_scheduled_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 gives clear intended use: 'what bills are coming up?' queries. It does not explicitly name alternative tools or exclusion conditions, but the use-case framing is enough to guide selection.

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

income_by_sourceA
Read-only

Get income breakdown by source for a period.

Returns a compact aligned text table by default. Use verbose=true for the structured dict.

Args: start_date: Start of period (YYYY-MM-DD) end_date: End of period (YYYY-MM-DD) depth: Hierarchy depth for grouping (1 = top-level categories, 2 = subcategories) verbose: If false (default), compact text output — optimized for reading and token efficiency. If true, structured JSON, for when you need machine-readable fields rather than a report. group_by: Optional "month", "quarter", or "year" — split the range into sub-period columns and return a multi-period TSV table (source rows, one column per period plus Total and Avg). Overrides verbose.

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNo
verboseNo
end_dateYes
group_byNo
start_dateYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses the default compact text output, the verbose structured JSON alternative, and the group_by override behavior. It also explains that group_by returns a multi-period TSV table with Total and Avg columns, giving substantial behavioral detail an agent needs to anticipate output.

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 front-loaded with the core purpose and default output, then organized into a compact Args list. Every sentence adds useful information; no filler or repetition of schema defaults that could confuse.

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 the tool's 5 parameters, read-only annotation, and existing output schema, the description covers everything needed for correct invocation: date formats, grouping depth, output format choice, and group_by's interaction with verbose. Return values are sufficiently described, and the output schema handles further detail.

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?

Schema description coverage is 0%, so the description carries the full burden, and it succeeds: start_date and end_date get YYYY-MM-DD formats, depth gets concrete hierarchy meanings, verbose gets default and output implications, and group_by gets allowed values plus override semantics. This fully compensates for the lack of schema-level 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 clearly states a specific verb and resource: 'Get income breakdown by source for a period.' It is distinct from sibling report tools like spending_by_category because it names income and source as the subject, and the rest of the description reinforces the report's scope.

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

Usage Guidelines4/5

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

The description provides clear context: it is for income breakdowns over a date range, with optional grouping by depth or sub-period. It does not explicitly name alternatives or exclusions, but the tool's purpose and parameters are specific enough for an agent to infer when it is appropriate.

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

list_accountsA
Read-only

List all accounts in the GnuCash chart of accounts.

Leads with a Showing X-Y of Z accounts line, then a compact one-line-per-account format by default. Page with offset; limit=0 returns the count only. Use verbose=true for full JSON with guid, type, commodity, etc.

To FIND an account without paging the whole chart, pass query — a case-insensitive substring matched against each account's full path and description (e.g. query="grocer" or query="4930" on a numbered chart). Results emit %short GUIDs that every account-taking tool accepts. For searching transactions by text or amount, use search_transactions.

Args: root: Filter to a subtree (e.g., "Expenses" for expense accounts only). verbose: If false (default), compact text output — optimized for reading and token efficiency. If true, structured JSON, for when you need machine-readable fields rather than a report. limit: Page size (default 50, max 250). 0 = count only. offset: 0-indexed first row to return (default 0). query: Case-insensitive substring filter on account path/description. Combines with root.

ParametersJSON Schema
NameRequiredDescriptionDefault
rootNo
limitNo
queryNo
offsetNo
verboseNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses output format ('Showing X-Y of Z accounts', one-line-per-account), page size behavior, count-only mode, case-insensitive substring matching, and that results emit %short GUIDs accepted by other account-taking tools. This is rich behavioral context that the annotations do 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?

The description is detailed but every sentence earns its place, covering purpose, output format, paging, query behavior, and parameter semantics. It is front-loaded with the core action, then organized into usage guidance and an Args list. The length is proportionate to the tool's five parameters and non-trivial behaviors.

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 listing tool with an output schema and readOnlyHint, the description is complete: it covers all parameters, output variants, paging, filtering, query semantics, and even how returned GUIDs interoperate with other tools. Nothing an agent needs to select or invoke this tool correctly is missing.

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 input schema provides only names, types, and defaults, with 0% description coverage. The tool description compensates fully by explaining each parameter: root subtree filtering, verbose output mode, limit paging semantics, offset indexing, and query substring matching. It adds concrete examples and combination behavior not available 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 opens with a specific verb and resource: 'List all accounts in the GnuCash chart of accounts.' It clearly distinguishes this from transaction searching by explicitly directing users to search_transactions for text/amount search, and from single-account retrieval by framing this as the whole-chart listing tool.

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 explicit guidance on when to use the query parameter instead of paging, when to switch to search_transactions, and when to choose verbose=true vs compact output. It also explains the root subtree filter and the count-only behavior, leaving no ambiguity about selection among closely related tools.

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

list_billtermsA
Read-only

List all billing terms.

Leads with a Showing X-Y of Z billterms line, then a compact one-line-per-term format by default. Page with offset; limit=0 returns the count only. Use verbose=true for full JSON with guid, discount details, etc.

Args: verbose: If false (default), compact text output — optimized for reading and token efficiency. If true, structured JSON, for when you need machine-readable fields rather than a report. limit: Page size (default 50, max 250). 0 = count only. offset: 0-indexed first row to return (default 0).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
verboseNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses detailed behavioral traits: the leading 'Showing X-Y of Z billterms' line, the compact one-line-per-term default, the count-only effect of limit=0, and the structured JSON fields available with verbose=true. This gives an agent a strong model of the tool's runtime behavior.

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 well-organized: a one-line purpose, then output behavior, then paging guidance, then detailed args. Every sentence adds operational value, and the most important information is front-loaded before the Args section.

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 list tool with an output schema, the description covers purpose, output shape, paging, count-mode, and verbose-mode tradeoffs. All three optional parameters are explained, and no critical detail needed to invoke the tool correctly is missing.

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?

Schema description coverage is 0%, so the description fully compensates by explaining every parameter: verbose (with concrete use cases), limit (default, max, and the special 0=count-only behavior), and offset (0-indexed, default 0). This exceeds what the bare schema provides and leaves no parameter ambiguous.

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 'List all billing terms,' a specific verb and resource, and clearly differentiates from siblings like create_billterm and list_taxtables. The scope ('all billing terms') and multiple output formats are stated unambiguously.

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 default compact output versus verbose JSON, and how to use limit/offset for paging. It doesn't explicitly name alternative tools or when-not-to-use conditions, but for a read-only list operation this is sufficient and unambiguous.

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

list_budgetsA
Read-only

List all budgets in the book.

Leads with a Showing X-Y of Z budgets line, then a compact one-line-per-budget format by default. Page with offset; limit=0 returns the count only. Use verbose=true for the full JSON envelope.

Args: verbose: If false (default), compact text output — optimized for reading and token efficiency. If true, structured JSON, for when you need machine-readable fields rather than a report. limit: Page size (default 50, max 250). 0 = count only. offset: 0-indexed first row to return (default 0).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
verboseNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already mark readOnlyHint=true, and the description adds substantial behavioral detail: a 'Showing X-Y of Z budgets' preamble, compact one-line-per-budget default output, pagination semantics, count-only mode at limit=0, and the compact-vs-JSON split for verbose. This goes well beyond the annotations and tells the agent exactly what to expect.

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 efficiently organized: a one-sentence purpose, a compact behavior paragraph, and a concise Arg list. Every sentence adds value, and the most important behavioral facts are front-loaded before the parameter details.

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 list tool with three optional parameters, an output schema, and read-only annotations, the description is complete. It covers output format, pagination, count-only mode, and verbose behavior, so an agent has everything needed to invoke it correctly without further inference.

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?

Schema description coverage is 0%, but the description fully compensates. It explains verbose's two output modes, limit's default/max/count-only behavior, and offset's 0-indexed meaning — none of which are in the bare schema. This is excellent parameter documentation.

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

Purpose5/5

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

The description opens with 'List all budgets in the book,' a specific verb and resource that clearly distinguishes this from sibling tools like get_budget or get_budget_report. It also defines what the output looks like, so an agent knows exactly what this 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 gives clear operational guidance: how to page with offset, how limit=0 changes behavior, and when to use verbose mode for JSON output. It does not explicitly name sibling tools or exclusion conditions, but the 'all budgets' phrasing and output details 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.

list_commoditiesA
Read-only

List all commodities (currencies, stocks, etc.) in the book.

Leads with a Showing X-Y of Z commodities line, then a compact one-line-per-commodity format by default. Page with offset; limit=0 returns the count only. Use verbose=true for structured JSON with fraction, latest prices, etc.

THE PRICE-UPDATE WORK LIST: stale_days=30, held_only=true returns exactly the commodities needing fresh quotes, each marked Nd stale or no price on file. Look the quotes up, then record them all in one create_prices call.

Args: verbose: If false (default), compact text output — optimized for reading and token efficiency. If true, structured JSON, for when you need machine-readable fields rather than a report. limit: Page size (default 50, max 250). 0 = count only. offset: 0-indexed first row to return (default 0). stale_days: Only commodities whose latest market price is at least this many days old, including never-priced ones, excluding the book default currency. Omit for the unfiltered list. held_only: Only commodities some real account is denominated in. Filters AND-combine.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
verboseNo
held_onlyNo
stale_daysNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses output format details ('Showing X-Y of Z commodities'), pagination behavior, count-only mode, and subtle filter semantics such as stale_days including never-priced commodities and excluding the book default currency. It also states that filters AND-combine, which is genuinely useful 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 efficient and well-structured despite its length. The lead sentence states the core purpose, the next paragraph covers output and pagination, the highlighted work-list paragraph addresses the key operational use case, and the Args section cleanly maps to the schema. No sentence is filler.

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

Completeness5/5

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

The description is complete for a read-only listing tool: it covers output shape, pagination, filtering semantics, count mode, verbosity trade-offs, and a concrete multi-tool workflow. An agent can invoke this tool correctly and interpret its results without additional context.

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?

Schema description coverage is 0%, so the description carries the full burden, and it delivers. Every parameter is explained with behavioral meaning: verbose's output-style difference, limit's max and count-only sentinel, offset's base, stale_days' date rule and exclusions, and held_only's account-denomination filter and AND-combination.

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 ('List all commodities... in the book'), immediately clarifying the tool's scope. It also distinguishes the primary listing purpose from related commodity actions like create_commodity and create_prices, and describes the specialized stale-price work-list mode.

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 explicit usage conditions: when compact text is appropriate vs verbose JSON, when limit=0 is useful for count-only, and exactly which filter combination ('stale_days=30, held_only=true') produces the price-update work list. It even routes the follow-up action to create_prices, making the intended workflow clear.

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

list_documentsA
Read-only

List customer invoices, vendor bills, employee vouchers, and credit notes.

Leads with a Showing X-Y of Z invoices (date range) line, then a compact one-line-per-invoice format by default. Page with offset; limit=0 returns the count only. Use verbose=true for structured JSON with GUIDs, dates, notes, etc.

Status vocabulary (shared by every invoice/bill tool): open = created and editable, not yet booked to A/R//A/P — not payable. posted = booked to A/R//A/P with a lot tracking its balance — payable. paid = posted with a zero remaining balance (lot closed). outstanding = posted with a remaining balance — the unpaid subset; get it directly from get_outstanding_documents rather than deriving it here. The status filter below covers document state (open/posted) only; settlement state lives on the lot.

Args: status: Filter by status: "posted" or "open", or omit for all. document_type: Filter to one document kind ("invoice", "bill", "voucher", "credit_note"). Omit for all. party_type: Filter by owner side ("customer", "vendor"). Omit for all. verbose: If false (default), compact text output — optimized for reading and token efficiency. If true, structured JSON, for when you need machine-readable fields rather than a report. limit: Page size (default 50, max 250). 0 = count only. job_id: Filter to invoices grouped under a specific job — useful for the "what's part of this engagement?" listing pattern. offset: 0-indexed first row to return (default 0).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
job_idNo
offsetNo
statusNo
verboseNo
party_typeNo
document_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses the default output format (leading count line, one-line-per-document), the count-only behavior with limit=0, and the compact vs. verbose output modes. It also explains the shared status vocabulary in detail, including what open/posted/paid/outstanding mean and how they relate to lots. These are meaningful behavioral details not present in the annotations.

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

Conciseness5/5

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

The description is long but every section earns its place: a crisp scope statement, output format summary, shared status vocabulary, and a structured Args list. It is well-organized and front-loaded with the most important information. No filler or redundant restatements of the schema.

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 having an output schema, the description covers the key operational details: pagination via offset, limit=0 count mode, verbose vs. compact output, and the document state vs. settlement state distinction. It also explains the status vocabulary shared across tools, preventing incorrect assumptions. An agent has everything needed to call this tool correctly and interpret its results.

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?

With schema description coverage at 0%, the description carries the full burden of parameter documentation. It provides a complete Args section covering all 7 parameters with allowed values, defaults, and behavioral notes. Each parameter is explained in plain language, adding substantial meaning beyond the bare schema. The only minor gap is omitting 'employee' from the party_type parenthetical, but the opening line mentions employee vouchers, so the intent is still clear.

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: "List customer invoices, vendor bills, employee vouchers, and credit notes." This clearly states what the tool returns and differentiates it from siblings like get_document (single document) and get_outstanding_documents (subset). 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 Guidelines5/5

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

The description gives explicit routing guidance: "get it directly from get_outstanding_documents rather than deriving it here" and clarifies that the status filter covers only document state, not settlement state. It also explains when to use verbose mode, how pagination works, and which listing pattern job_id supports. This is more than enough for an agent to decide when to invoke this tool.

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

list_jobsA
Read-only

List jobs, optionally filtered.

Leads with a Showing X-Y of Z jobs line; page with offset, or pass limit=0 for the count only.

Pass id for one job's full details (name, owner, active state, linked invoice/bill IDs) — the exact-lookup mode that replaced get_job.

Args: id: Job ID for a single-job detail lookup (e.g., "000001"). All other filters are ignored. owner_type: Filter by "customer" or "vendor". Omit for all. owner_id: Filter by specific customer or vendor ID (requires owner_type). active_only: If True (default), exclude inactive jobs. verbose: If false (default), compact text output — optimized for reading and token efficiency. If true, structured JSON, for when you need machine-readable fields rather than a report. limit: Page size (default 50, max 250). 0 = count only. offset: 0-indexed first row to return (default 0).

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
limitNo
offsetNo
verboseNo
owner_idNo
owner_typeNo
active_onlyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses substantial behavior: the 'Showing X-Y of Z jobs' header, pagination behavior, limit=0 count mode, exact-lookup mode ignoring other filters, active_only default, and verbose text/JSON output modes. This goes well 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?

The description is front-loaded with the core purpose and key behaviors, then organized into a compact Args block where each parameter earns its place. Despite covering many details, nothing feels redundant or padded.

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?

All parameters are documented, defaults are stated, cross-parameter constraints are called out, and output formats are described. Since an output schema exists, the description does not need to enumerate return fields, and nothing needed to invoke this tool correctly is missing.

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?

Schema description coverage is 0%, so the description carries the full burden for all seven parameters. It explains every parameter, including defaults, allowed values for owner_type, the dependency of owner_id on owner_type, the limit=0 special case, and verbose output behavior.

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 ('List jobs, optionally filtered') and then clarifies two distinct modes: a general filtered list and an exact single-job lookup via id. It explicitly notes this lookup mode replaced get_job, which distinguishes it from related job operations.

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 tool gives clear context for when to use id-based lookup versus the list mode, and explains pagination/count-only usage. It does not explicitly contrast with a current sibling like get_job_report, though it does signal the removed get_job alternative.

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

list_lotsA
Read-only

List all lots for an investment account.

Leads with a Showing X-Y of Z lots line, then a compact one-line-per-lot format by default. Page with offset; limit=0 returns the count only. Use verbose=true for full JSON with guid, title, notes, etc.

Args: account: Account ref (full path, %short GUID, or full 32-char GUID). include_closed: If True, include fully-sold lots. Default False. verbose: If false (default), compact text output — optimized for reading and token efficiency. If true, structured JSON, for when you need machine-readable fields rather than a report. limit: Page size (default 50, max 250). 0 = count only. offset: 0-indexed first row to return (default 0).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
accountYes
verboseNo
include_closedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the description correctly aligns with 'List' as a read operation. It adds valuable behavioral context: the 'Showing X-Y of Z lots' line, compact vs verbose output, and the special limit=0 behavior. No contradiction with annotations; the description complements them by describing output formatting and pagination.

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 front-loaded with the primary purpose and then logically flows into output behavior, pagination, and parameter details. Every sentence adds value, though the parameter list is somewhat verbose. The structure is clear and efficient; a slightly tighter wording could improve it, but it is 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.

Completeness4/5

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

Given the tool has 5 parameters and an output schema, the description covers the essential context: what the tool does, output formats, pagination, verbose mode, and parameter semantics. It doesn't discuss error cases or account not found, but those are likely covered by the output schema and are not critical for basic usage. The description is complete enough for an agent to use the tool correctly.

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?

Schema description coverage is 0%, so the description must explain each parameter itself, and it does thoroughly. 'account' explicitly lists accepted formats (full path, %short GUID, full 32-char GUID), 'include_closed' states its meaning, 'verbose' distinguishes output types, 'limit' explains page size and the count-only special value, and 'offset' defines 0-indexing. This fully compensates for the schema's lack of descriptions.

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

Purpose5/5

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

The description opens with 'List all lots for an investment account,' which uses a specific verb and resource, making the tool's function immediately clear. It distinguishes itself from siblings like 'get_lot' (singular) and 'create_lot' by emphasizing 'all lots.' The mention of output format (compact vs verbose) further clarifies the tool's scope.

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

Usage Guidelines4/5

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

The description explains when to use the tool (list lots) and gives practical usage details like pagination, verbose mode, and limit=0 count-only behavior. It does not explicitly name alternative tools or state when not to use it, but the 'list all' wording implies contrast with single-lot access, and the pagination/verbose guidance is actionable. Slight gap: no explicit 'use get_lot for a single lot' note, but the context is sufficient.

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

list_partiesA
Read-only

List customers, vendors, and/or employees.

Leads with a Showing X-Y of Z line per type, then a compact one-line-per-party format by default. Page with offset; limit=0 returns the count only. Use verbose=true for full JSON with guid, address, notes, etc.

Args: party_type: "customer", "vendor", or "employee". Omit for all three (sections in that order). active_only: If True, only show active parties. Default True. verbose: If false (default), compact text output — optimized for reading and token efficiency. If true, structured JSON, for when you need machine-readable fields rather than a report. limit: Page size per type (default 50, max 250). 0 = count only. offset: 0-indexed first row to return (default 0).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
verboseNo
party_typeNo
active_onlyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description details output format, the 'Showing X-Y of Z' line, compact one-line-per-party default, verbose JSON mode, count-only behavior for limit=0, and default values for active_only. This is rich behavioral context that helps an agent predict exactly what will happen.

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 well-structured, leading with the core behavior and output shape, then systematically documenting parameters. Every sentence contributes useful information; the text is longer than minimal but justified by five parameters and multiple behavioral nuances.

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 list tool with only optional parameters, this description is complete: it covers filtering, pagination, output modes, defaults, and count-only behavior. Because an output schema exists, the description does not need to enumerate return fields, and it still provides enough guidance for correct invocation.

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?

Schema description coverage is 0%, so the description carries the full burden for parameter meaning. It thoroughly explains every parameter: party_type options and omission behavior, active_only filtering, verbose output mode, limit page size/max/count-only semantics, and offset indexing. Nothing is left undocumented.

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 and resource: 'List customers, vendors, and/or employees.' This unambiguously identifies it as the collection-listing tool for parties, distinguishing it from the sibling single-record, create, update, and delete party tools. The three supported party types further refine the purpose.

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

Usage Guidelines4/5

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

The description gives clear guidance on how to use the tool: omit party_type for all types, filter with active_only, page with offset, and choose verbose for machine-readable output. It does not explicitly mention alternatives like get_party for single-record lookups, so it lacks explicit exclusion guidance.

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

list_scheduled_transactionsA
Read-only

List all scheduled transactions.

Leads with a Showing X-Y of Z scheduled transactions line, then a compact one-line-per-schedule format by default. Page with offset; limit=0 returns the count only. Use verbose=true for structured JSON with GUIDs, splits, dates, etc.

Args: enabled_only: If True, only show enabled schedules. Default True. verbose: If false (default), compact text output — optimized for reading and token efficiency. If true, structured JSON, for when you need machine-readable fields rather than a report. limit: Page size (default 50, max 250). 0 = count only. offset: 0-indexed first row to return (default 0).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
verboseNo
enabled_onlyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses concrete output behavior: the 'Showing X-Y of Z scheduled transactions' header line, a compact one-line-per-schedule default, limit=0 count-only mode, and verbose JSON containing GUIDs, splits, and dates. These traits are invisible in both the schema and annotations, so the description carries real behavioral weight.

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 front-loaded with the one-sentence purpose, then a tight output-format paragraph, then a clean Args block. No sentence is filler; the token-efficiency note and sentinel-value documentation each earn their 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 read-only, four-parameter list tool with an output schema, the description covers everything an agent needs: output shape, pagination mechanics, filtering default, and the verbose mode decision. With the output schema present for return-value structure, nothing material is missing.

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?

Schema description coverage is 0%, so the description bears the full burden — and it pays it in full. Every parameter gets semantic detail: enabled_only's filtering effect, verbose's two output modes, limit's page size plus the sentinel '0 = count only' and max of 250, and offset as a 0-indexed row pointer.

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+resource pair: 'List all scheduled transactions,' which unambiguously identifies the operation and resource. This distinguishes it from siblings such as list_transactions (actual posted transactions) and get_upcoming_transactions (only upcoming schedules), even without naming them.

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 explicit mode-selection guidance: compact text output is 'optimized for reading and token efficiency,' while verbose=true is for 'structured JSON' when machine-readable fields are needed rather than a report. It does not, however, state when to prefer this tool over siblings like get_upcoming_transactions or list_transactions.

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

list_taxtablesA
Read-only

List all sales-tax tables, or get one by name.

Leads with a Showing X-Y of Z taxtables line. Compact format (default): one line per taxtable with name, entry count, and per-entry rate→account routing. Page with offset; limit=0 returns the count only. Verbose: structured JSON with resolved account paths and refcount.

Args: name: Tax table name for a single-table detail lookup (entries, rates, account routing, refcount). All other parameters are ignored. verbose: If false (default), compact text output — optimized for reading and token efficiency. If true, structured JSON, for when you need machine-readable fields rather than a report. limit: Page size (default 50, max 250). 0 = count only. offset: 0-indexed first row to return (default 0).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
limitNo
offsetNo
verboseNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint and openWorldHint annotations, the description discloses the output lead line, pagination behavior, limit=0 count-only behavior, compact vs verbose formats, and that supplying name causes all other parameters to be ignored. No contradiction with annotations.

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

Conciseness5/5

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

The description is tightly organized: a one-sentence purpose summary, behavioral output notes, and a compact Args list. Every sentence adds operational value with no filler.

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

Completeness5/5

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

For a read-only list/detail tool, the description covers output format, pagination, count-only behavior, verbose mode, and parameter interactions. Since an output schema exists, the absence of exhaustive return-field documentation is acceptable.

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?

Schema description coverage is 0%, so the description carries full responsibility for parameter semantics. It explains all four parameters, including defaults, max page size, the special limit=0 meaning, and the interaction where name ignores other parameters.

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: 'List all sales-tax tables, or get one by name.' This clearly covers both modes of the tool and distinguishes it from create/update/delete taxtable siblings.

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

Usage Guidelines4/5

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

The description gives clear context for when to use each mode: compact text for reading/token efficiency, verbose JSON for machine-readable output, and the name parameter for single-table detail lookups. It does not explicitly name alternative tools or state when-not-to-use, but the 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.

list_transactionsA
Read-only

List transactions with optional filters.

Leads with a Showing X-Y of Z transactions (date range) line so a truncated view is never mistaken for the whole set. Page with offset; limit=0 returns the count only.

Compact format (default):

  • Unfiltered: DATE<TAB>guid<TAB>Description<TAB>splits

  • Filtered by account (register form): DATE<TAB>guid<TAB>±Amount<TAB>Description<TAB>other splits Column 3 is the signed impact on the filtered account; that account is dropped from the splits column.

Transactions with more than 4 splits collapse to the top 3 by |value| plus +N more — call get_transaction for the full breakdown.

Args: account: Filter by account name (switches output to register form) start_date: Start date in ISO format (YYYY-MM-DD) end_date: End date in ISO format (YYYY-MM-DD) limit: Page size (default 50, max 250). 0 = count only. offset: 0-indexed first row to return (default 0). verbose: If false (default), compact text output — optimized for reading and token efficiency. If true, structured JSON, for when you need machine-readable fields rather than a report.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
accountNo
verboseNo
end_dateNo
start_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

The description goes well beyond the readOnlyHint annotation, disclosing several non-obvious behaviors: the 'Showing X-Y of Z transactions' header prevents misinterpreting truncated results, limit=0 returns count only, the account filter switches to register form and shifts column semantics, and >4 splits collapse with a pointer to get_transaction. These details equip the agent with expectations that annotations alone cannot convey.

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

Conciseness5/5

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

The description is well-organized: a one-line summary, key behaviors, output format details, then parameter semantics. It uses formatting (backticks, bullets, indent) to keep dense information scannable. Every sentence adds functional value, and the most critical caveat (truncation indicator) is front-loaded.

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 six parameters, no required fields, and multiple output modes, the description covers all operational aspects: filtering, pagination, count-only, format switching, register behavior, and split collapsing. The existence of an output schema means verbose JSON fields need not be enumerated. Nothing needed for correct invocation is missing.

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?

Schema description coverage is 0%, so the description carries the full burden—and it delivers. Every parameter is explained with functional meaning beyond type: account triggers register format, start/end dates use ISO, limit has a 0=count-only special case and max, offset is 0-indexed, and verbose toggles output structure. This is comprehensive and directly compensates for the schema's lack of descriptions.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'List transactions with optional filters.' It then details distinct output modes (compact text vs JSON), pagination, and filtering behaviors, making the tool's purpose concrete and distinguishable from siblings like get_transaction. It explicitly points to get_transaction for a full breakdown, reinforcing its own scope.

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

Usage Guidelines4/5

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

The description clearly states use cases: filtering by account, date, pagination, count-only, and choosing verbose JSON when machine-readable fields are needed. It names get_transaction as the alternative for full split details, providing a when-to-use derivative. It does not, however, contrast with search_transactions or explicitly say when not to use this tool, so it falls just short of full 5.

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

move_accountA
DestructiveIdempotent

Move an account — children and balances ride along — under a new parent in the hierarchy.

No transaction data changes: only the account's position (and therefore every descendant's full path) is rewritten. Errors, changing nothing, if either ref matches no account, if the move would create a cycle (new parent is the account itself or one of its descendants), or if the new parent already has a child of the same name. %short GUIDs survive the move; saved full paths do not. Use update_account to rename in place instead of moving.

Args: name: Account ref to move (full path e.g. "Expenses:Old:Account", %short GUID, or full 32-char GUID) new_parent: New parent account ref (full path, %short GUID, or full 32-char GUID)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
new_parentYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing that no transaction data changes, only the account position and descendant full paths are rewritten, errors change nothing, and %short GUIDs survive while saved full paths do not. This gives an agent a clear model of side effects and limitations.

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 essential effect and caveats are front-loaded, followed by clear failure conditions and a structured Args list. Every sentence adds meaningful behavioral or usage detail without rhetorical filler, making the length appropriate for the operation's complexity.

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 two-parameter mutation with an output schema, the description is complete: it covers what changes, what does not change, failure atomicity, path-reference limitations, when to use an alternative, and exact parameter formats. No critical information is missing.

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 has no parameter descriptions (0% coverage), but the description fully compensates: it defines 'name' as an account ref with accepted formats (full path, %short GUID, or full 32-char GUID) including an example, and defines 'new_parent' with the same formats. No ambiguity remains.

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?

Opens with a precise verb and resource: 'Move an account — children and balances ride along — under a new parent in the hierarchy.' This immediately distinguishes the operation from renaming or deleting, and the later reference to update_account further sharpens its unique role.

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?

Provides explicit when-not guidance: 'Use update_account to rename in place instead of moving.' It also specifies failure conditions (no matching account, cycles, duplicate names) that produce a no-op, helping an agent decide whether the move is valid before calling.

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

net_worthA
Read-only

Calculate net worth (assets minus liabilities), as one value or a trajectory.

Read-only. Valuation is as-of: each date values holdings at the latest market rate on or before it, in the book's default currency; voided transactions are excluded. end_date alone gives one number; add start_date + interval for a series (one value per interval step from start_date, end_date always included as the last row). For the full A = L + E statement with per-account detail, use balance_sheet; this tool is the headline number and its trend. The dashboard's trajectory section is this same calculation.

Args: end_date: Calculate net worth as of this date (YYYY-MM-DD) start_date: Optional start date for time series (YYYY-MM-DD) interval: Optional interval for time series: 'month', 'quarter', or 'year'

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateYes
intervalNo
start_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses key behavioral details: valuation is as-of, holdings use the latest market rate on or before the date, the book's default currency is used, voided transactions are excluded, and end_date is always included as the last row in a series. These go well beyond what annotations provide. No contradiction with annotations exists.

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 well-organized and front-loaded with the core formula and modes. Each subsequent sentence adds distinct value: valuation semantics, series behavior, alternative tool routing, dashboard correspondence, and parameter details. There is no redundant or filler 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?

The tool has an output schema, so return-value details are covered elsewhere. The description fully covers the calculation semantics, reading behavior, parameter usage, series construction, and when to choose a sibling tool. An agent has everything needed to invoke this tool correctly.

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?

Schema description coverage is 0%, so the description must compensate. It does so thoroughly with an Args section explaining each parameter: end_date as the as-of date with format, start_date as the optional series start, and interval restricted to 'month', 'quarter', or 'year'. This materially clarifies how to use all three parameters, including the series behavior.

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 precise definition: 'Calculate net worth (assets minus liabilities), as one value or a trajectory.' It clearly distinguishes itself from the sibling balance_sheet by stating that balance_sheet is for the full A = L + E statement with per-account detail, while this tool is 'the headline number and its trend.'

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 explains the two usage modes: 'end_date alone gives one number; add start_date + interval for a series.' It also names the alternative balance_sheet when full statement detail is needed, and notes that the dashboard's trajectory section uses the same calculation, removing ambiguity about when to invoke this tool.

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

pay_documentA

Record a payment against a posted customer invoice, vendor bill, employee voucher, or credit note.

Creates a payment transaction from the specified bank/cash account to the document's A/R or A/P account. Partial payments are supported.

dry_run=true rehearses the payment without booking it: the full validation, conversion, discount, and FX pipeline runs and the response shows the proposed splits, the remaining balance after, whether the invoice would settle in full, and any account the real call would auto-create. Same inputs, same code path — a rehearsal that succeeds is a payment that will book. Recommended before complex payments (cross-currency, discounts, credit-note refunds).

For cross-currency payments where the rate moved between post-date and pay-date, a realized FX gain/loss split is booked. Pass fx_account to control routing; otherwise the server picks the unique INCOME/EXPENSE account whose leaf name matches "fx", "forex", "foreign exchange", "currency gain/loss", "exchange gain/loss", or "currency translation". When zero or multiple match, the canonical Income:Foreign Exchange Gain/Loss is used (auto-created if absent), and an fx_notice is returned listing ambiguous candidates so you can pass fx_account explicitly next time.

For invoices with early-payment-discount terms (e.g., "2/10 Net 30" = 2% off if paid within 10 days), pass apply_discount=True to settle via discount. The tool validates that the invoice has discount terms, the payment date is within the discount window, and the shortfall matches the expected discount on pre-tax principal. Each failure mode rejects with a specific error rather than silently downgrading to a partial payment. discount_account controls routing the same way fx_account does (auto-resolves to Expenses:Sales Discounts for customer payments, Income:Purchase Discounts Taken for vendor bill payments).

Args: id: Document ID (e.g., "000001"). payment_account: Bank or cash account for payment (e.g., "Assets:Checking"). amount: Payment amount as decimal string (e.g., "500.00"). payment_date: Payment date (YYYY-MM-DD). Defaults to today. description: Description for the payment transaction. Optional. document_type: "invoice", "bill", "voucher", or "credit_note" — disambiguates when IDs collide. party_type: Owner side, credit notes only. fx_account: Optional INCOME or EXPENSE account to receive realized FX gain/loss (cross-currency payments only). Accepts a full path, %short GUID, or full 32-char GUID. apply_discount: When True, treat this payment as the final settlement and absorb the early-payment discount from the invoice's billterm. Default False — explicit opt-in. Hard-rejects on credit notes (refunds don't take discounts). discount_account: Optional INCOME or EXPENSE account to receive the discount split. Auto-resolves when omitted. Accepts full path, %short GUID, or full 32-char GUID. force: Override the stale-FX-rate guard. A cross-currency payment etches the rate at pay time; if the latest price is 7–90 days from the payment date the payment is refused with stale_fx_rate unless force=True (the override is recorded as fx_stale/"forced"). A rate beyond the 90-day cap cannot be forced. memo: Optional memo for the bank-account split (e.g., check number or wire reference). description names the whole transaction; memo annotates the cash movement. dry_run: When True, rehearse without writing — returns the proposed splits and projected outcome instead of booking. Default False.

Returns: status is "paid" when the document settles to zero, "partial" when a balance remains, and "would_pay" on dry runs — plus the amount paid, remaining balance, and transaction reference.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
memoNo
forceNo
amountYes
dry_runNo
fx_accountNo
party_typeNo
descriptionNo
payment_dateNo
document_typeNo
apply_discountNo
payment_accountYes
discount_accountNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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

Annotations (readOnlyHint=false) indicate a mutation, but the description goes far beyond: it explains the dry_run rehearsal, cross-currency FX gain/loss booking, discount term validation, the force guard for stale rates, and the three possible statuses. No contradiction with annotations.

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

Conciseness4/5

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

The description is long but well structured: purpose, dry_run, FX, discount, Args list, Returns. It is front-loaded with the core action and each paragraph adds necessary detail. Some redundancy could be trimmed, but the organization aids comprehension.

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 13 parameters and complex behaviors (FX, discount, dry_run, force), the description covers all critical edge cases, error paths, and return semantics. The output schema is present, but the description still explains the status values and transaction reference, making it complete for an agent.

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?

With 0% schema description coverage, the description fully compensates by documenting all 13 parameters with concrete examples (e.g., id: '000001', payment_account: 'Assets:Checking'), accepted formats (e.g., GUID variants for fx_account), and defaults. It adds meaning the schema lacks.

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 first sentence states a specific action ('Record a payment') against a clear resource ('posted customer invoice, vendor bill, employee voucher, or credit note'). It distinguishes itself from sibling operations like post_document or apply_credit_note by focusing on the payment act.

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 clarifies the intended input (posted documents) and mentions partial payments, but it does not explicitly contrast with alternatives (e.g., apply_credit_note for credit notes). Guidance is implied rather than explicit, leaving some ambiguity about when not to use it.

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

post_documentA
Idempotent

Post a customer invoice, vendor bill, employee voucher, or credit note to A/R or A/P.

Posting creates a transaction in the A/R or A/P account and makes the invoice official. Once posted, entries cannot be added.

For a foreign-currency document, the exchange rate is etched at posting and cannot be updated retroactively. If the latest price for the invoice currency is more than 7 days from the post date (the GNUCASH_FX_GUARD_DAYS window), posting is refused with a stale_fx_rate error — run create_price for a rate near the post date, then retry, or pass force=True to post with the stale rate (recorded in the response and audit log as fx_stale/"forced"). A rate beyond the 90-day staleness cap cannot be forced.

Args: id: Document ID (e.g., "000001"). post_account: A/R or A/P account path (e.g., "Assets:Accounts Receivable"). post_date: Date in ISO format (YYYY-MM-DD). Defaults to today. due_date: Payment due date (YYYY-MM-DD). Optional. description: Description for the posting transaction. Optional. document_type: "invoice", "bill", "voucher", or "credit_note" — disambiguates when IDs collide. party_type: Owner side, credit notes only. force: Override the stale-FX-rate guard and post with a 7–90 day stale rate. Default False.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
forceNo
due_dateNo
post_dateNo
party_typeNo
descriptionNo
post_accountYes
document_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations, the description reveals important behaviors: posting creates a transaction, entries cannot be added after posting, the FX rate is etched and cannot be updated retroactively, stale rates are refused with a 'stale_fx_rate' error, force behavior is recorded in the response and audit log, and rates beyond 90 days cannot be forced. No contradiction with annotations.

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

Conciseness5/5

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

The description is front-loaded with the action and consequence, followed by a structured Args list. The FX-guard paragraph is dense but every detail is operationally relevant. No filler or repetition of schema defaults 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?

Given this tool's complexity, the description covers preconditions, irreversible effects, failure modes, workarounds, parameter semantics, and recordkeeping implications. An output schema exists, so return-format explanation is unnecessary. The description is complete enough for correct invocation.

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?

Schema description coverage is 0%, so the description carries the full burden. It adds meaning for all 8 parameters: examples for id and post_account, formats/defaults for dates, allowed values for document_type, and clarification that party_type applies to credit notes only. This far exceeds the bare input 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?

Description names the specific action ('Post') and the exact resources: customer invoice, vendor bill, employee voucher, or credit note to A/R or A/P. It also states the consequence ('makes the invoice official'), which clearly distinguishes this from lifecycle siblings like unpost_document, pay_document, and apply_credit_note.

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

Usage Guidelines4/5

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

Provides clear context for when posting is appropriate: making a document official and creating the A/R or A/P transaction. It also routes to 'create_price' as a workaround in the stale-FX condition, but it does not explicitly contrast this tool with related document-lifecycle siblings such as unpost_document or pay_document.

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

reconcile_accountA
DestructiveIdempotent

Reconcile splits against a statement balance.

SIGN CONVENTION: statement_balance is the ACCOUNT's balance in GnuCash's signs — for liability accounts (credit cards) a $5,000 owed balance is "-5000", not "5000".

Two modes:

  • Targeted (split_guids=[...]): reconcile exactly the listed splits (SPLIT guids from get_unreconciled_splits, not transaction guids). Use when statement and book disagree and you need to pick a subset.

  • Bulk (reconcile_all=true): reconcile every unreconciled split dated on or before through_date (default: statement_date — a statement reconciliation is bounded by the statement). One call, no GUID round-trip.

Both modes verify the resulting reconciled balance ties to statement_balance before mutating; mismatch rejects with the discrepancy amount.

TYPICAL STATEMENT FLOW (credit card or bank): batch-enter the statement's transactions (create_transactions), then reconcile_all with the statement's closing date and balance. Multi-month catch-up: enter all months in one batch, then one reconcile_all per statement, oldest first — the through_date default keeps each sweep inside its own statement.

Args: account: Account ref: full path (e.g. 'Assets:Bank:Checking'), %short GUID, or full 32-char GUID statement_date: Statement ending date (YYYY-MM-DD) statement_balance: Expected balance from statement (as string, e.g., '1234.56') split_guids: List of split GUIDs to reconcile (targeted mode). Omit for bulk mode. reconcile_all: When true, reconcile all unreconciled splits up to through_date. through_date: Date filter for bulk mode (YYYY-MM-DD); defaults to statement_date.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountYes
split_guidsNoList of SPLIT GUIDs to reconcile (8+ char prefixes accepted). These are NOT transaction GUIDs — get them from get_unreconciled_splits. Required for targeted mode; omit when using reconcile_all=true.
except_guidsNoOptional list of split GUID prefixes to exclude from the bulk reconcile. Useful for "everything on the statement except this pending ACH" — 2 tokens vs the 100+ a full split_guids listing would cost. Only valid with reconcile_all=true; prefixes that don't resolve are silently ignored.
through_dateNoUpper-date bound for reconcile_all (YYYY-MM-DD); only splits with post_date <= through_date are swept. DEFAULTS TO statement_date — pass a later date explicitly to widen the sweep past the statement.
reconcile_allNoWhen true, reconcile every unreconciled split on the account dated on or before through_date (default: statement_date). Avoids the ~300-token GUID round-trip for statement workflows — enter several months of transactions, then reconcile each statement with just its date and balance. Mutually exclusive with split_guids.
statement_dateYes
statement_balanceYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already communicate destructiveness and idempotency, and the description adds meaningful context beyond them: the sign convention for liability accounts, the pre-mutation balance verification, and the mismatch rejection with the discrepancy amount. It stops short of describing success effects or edge cases like retries, but it goes well beyond the bare annotation signal.

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 long but well-structured: sign convention first, then modes, then workflow, then an Args list. It front-loads the most important operational facts and uses bold/bullets effectively. Some redundancy with the schema exists (e.g., through_date defaulting to statement_date is stated twice), but the length is justified by the tool's complexity.

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 7-parameter mutation tool with an output schema, the description is largely complete: it covers modes, defaults, sign convention, verification behavior, and realistic workflows including multi-month catch-up. The only notable gap is that `except_guids` is not woven into the main prose, though the schema fully documents 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?

The prose adds real meaning beyond the schema: account reference formats, statement date format, statement_balance sign convention, and the difference between split and transaction GUIDs. It omits `except_guids` from the Args list, but the schema provides a thorough description for that parameter, so the overall parameter guidance is strong.

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: 'Reconcile splits against a statement balance.' It immediately distinguishes two operating modes (targeted vs. bulk) and clarifies the exact object being reconciled ('SPLIT guids from get_unreconciled_splits, not transaction guids'), making it distinct from sibling reconciliation and statement tools.

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 tells the agent when to use each mode: targeted when 'statement and book disagree and you need to pick a subset,' and bulk for 'every unreconciled split dated on or before through_date.' It also provides a typical statement flow and multi-month catch-up sequence with ordering guidance, making the when-to-use decision actionable.

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

replace_splitsA
DestructiveIdempotent

Replace all splits in a transaction with a new set.

Replace all splits in a transaction with a completely new set. The transaction's currency, description, date, and notes are preserved. New splits must balance to zero.

A new split that reproduces an existing one (same account, amount, and quantity) is an UNCHANGED leg: it keeps the old split's memo (supply a memo to override) and its reconcile state. So recategorizing the expense leg of a reconciled bank transaction is safe — resubmit the bank leg as-is and only the changed leg resets.

Args: guid: Transaction GUID (32-character hex string, or 8+ char prefix) splits: Complete new set of splits. Each split needs: - 'account' (required): Account ref — full path, %short GUID, or full 32-char GUID - 'amount' (required): Value in transaction currency, as a decimal string - 'quantity' (optional): Amount in account's commodity, as a decimal string. Required if account commodity differs from transaction currency. - 'memo' (optional): Split memo force: Required only when the replacement would CHANGE a reconciled split (or remove splits from lots) — unchanged reconciled legs are preserved without it.

ParametersJSON Schema
NameRequiredDescriptionDefault
guidYesTransaction GUID (32-char hex or 8+ char prefix)
forceNo
splitsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark the tool as destructive and idempotent, and the description adds substantial behavioral detail: unchanged legs keep memo and reconcile state, changed reconciled legs require force, splits must balance to zero, and lot removal is gated by force. This goes far beyond annotations and clearly discloses mutation semantics.

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 well-structured with an Args section and most sentences add value. However, the first two sentences are nearly identical ('Replace all splits...' and 'Replace all splits... completely new set'), which is redundant and slightly reduces 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 the tool's complexity and the presence of an output schema, the description is complete: it covers required fields, preservation behavior, unchanged-leg semantics, reconciliation handling, lot considerations, and the force parameter. An agent has enough information to invoke the tool correctly in both simple and reconciled-transaction scenarios.

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?

Schema description coverage is low (33%), so the description carries the parameter documentation burden. It thoroughly explains guid prefixes, account reference formats, decimal-string requirements, when quantity is required, and force semantics. It omits the nested 'action' field, but the schema already documents that field in detail, so the compensation is adequate.

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: 'Replace all splits in a transaction with a new set.' It further clarifies scope by noting what is preserved (currency, description, date, notes) and the balancing requirement, making the tool's purpose unmistakable and distinct from transaction creation or update 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 gives clear context for when to use this tool, such as recategorizing the expense leg of a reconciled bank transaction, and explains when force is needed. It does not explicitly name alternative sibling tools or state when not to use them, but the usage context is strong enough for an agent to select it appropriately.

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

search_transactionsA
Read-only

Search transactions by description, memo, notes, or amount.

Compact format (default): DATE<TAB>guid<TAB>Description<TAB>splits Transactions with more than 4 splits collapse to the top 3 by |value| plus +N more — call get_transaction for the full breakdown. Leads with a Showing X-Y of Z transactions line; page with offset, or pass limit=0 for the count.

Args: query: Search query string. For amount, supports: exact ("100"), greater (">100"), less ("<100"), range ("100-200") field: Field to search: 'description', 'memo', 'notes', or 'amount' limit: Page size (default 50, max 250). 0 = count only. offset: 0-indexed first row to return (default 0). verbose: If false (default), compact text output — optimized for reading and token efficiency. If true, structured JSON, for when you need machine-readable fields rather than a report.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldNodescription
limitNo
queryYes
offsetNo
verboseNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description details output format, split truncation behavior, pagination info line, limit=0 count mode, and the distinction between compact text and verbose JSON. This fully discloses what the agent can expect from a call.

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 efficiently organized with a brief purpose statement, a clear output-format block, and a concise Args list. Every sentence provides actionable detail, 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?

Given that an output schema exists and the read-only annotation covers safety, the description supplies all essential operational context: search fields, amount query syntax, pagination semantics, output modes, and truncation behavior. Nothing an agent needs 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.

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full burden. It explains the query syntax with concrete examples (exact, greater, less, range), enumerates all field options, specifies page size limits and count-only mode, offsets, and verbose behavior—everything an agent needs to fill parameters correctly.

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: 'Search transactions by description, memo, notes, or amount.' It clearly differentiates from siblings like list_transactions (search vs. list) and references get_transaction for full breakdowns, so an agent understands the tool's distinct role.

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

Usage Guidelines4/5

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

The description gives clear context for when to use the tool—when searching by specific fields—and directs the agent to get_transaction for full split details. However, it does not explicitly contrast with list_transactions for non-search listing scenarios, leaving a small gap in alternative routing.

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

set_account_slotA
DestructiveIdempotent

Set a custom metadata slot on an account.

Stores a key-value pair on the account. Values are stored as strings. Use for APR, credit limits, reward rates, or any per-account metadata.

Args: account: Account ref: full path (e.g., "Liabilities:Credit Cards:Capital One"), %short GUID, or full 32-char GUID. key: Slot key (e.g., "apr", "credit_limit"). value: Slot value (always stored as string).

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes
valueYes
accountYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true. The description adds value by stating 'Values are stored as strings,' which signals type coercion, and clarifies the slot is a custom key-value pair. It does not repeat annotation flags, and there is 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?

The description is three short paragraphs: purpose, use cases, and parameter breakdown. Every sentence carries necessary information, and the purpose is front-loaded. No redundant or filler text.

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 the 3 required params, output schema presence, and annotations (idempotent+destructive), the description is complete. It covers parameter formats, string coercion, and use cases; the only missing detail is explicit overwrite behavior, which idempotentHint/destructiveHint already imply.

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?

Schema has 0% description coverage, so the Args block carries full weight. It explains account ref formats (full path, %short GUID, full 32-char GUID), gives key examples, and notes value is always stored as a string. This fully compensates for the bare 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?

Description opens with 'Set a custom metadata slot on an account,' a specific verb and resource. It further clarifies 'Stores a key-value pair on the account,' distinguishing it from sibling get_account_slots and delete_account_slot. No ambiguity about what is modified.

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?

Explicitly says 'Use for APR, credit limits, reward rates, or any per-account metadata,' giving clear when-to-use context. It does not explicitly name sibling alternatives or provide exclusions, so it falls short of a 5 but is well above implied usage.

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

set_budget_amountA
DestructiveIdempotent

Set a budget target for an account.

Args: budget_name: Name of the budget. account: Account ref: full path (e.g., "Expenses:Groceries"), %short GUID, or full 32-char GUID. amount: Monthly budget amount as string (e.g., "500.00"). period: Which period(s) to set: - None or "all": Set same amount for all periods (default) - Integer 0-11: Set specific period (0 = January for yearly budget) - "q1", "q2", "q3", "q4": Set all periods in quarter

ParametersJSON Schema
NameRequiredDescriptionDefault
amountYes
periodNo
accountYes
budget_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already communicate that this is destructive, not read-only, and idempotent. The description adds period-selection semantics, but it does not disclose that an existing budget amount may be overwritten or what side effects occur for affected periods. On balance, the annotations cover the core safety profile, so 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?

The first sentence states the purpose, and the Args section is tightly formatted with no filler. Each parameter's explanation is relevant and front-loaded, making the description easy to scan and apply.

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?

Parameter coverage is strong and an output schema exists, so return-value details are unnecessary. However, the description omits important context such as whether budget_name must already exist, whether setting a period overwrites existing values, and how this relates to create_budget. These gaps reduce completeness for an agent deciding whether and how to invoke it.

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?

Schema description coverage is 0%, and the description fully compensates by explaining all four parameters: budget_name, account with accepted reference formats, amount with an example, and period with all accepted values and their meanings. This gives the agent everything needed to construct valid arguments.

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 a specific action ('Set a budget target for an account') and names the resource. It does not explicitly contrast itself with siblings like create_budget or get_budget, so it lacks explicit 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 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 creating, retrieving, or deleting budgets. It does not mention prerequisites such as whether the budget must already exist or whether this tool should be used only to adjust existing budget amounts.

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

set_reconcile_stateA
DestructiveIdempotent

Set the reconciliation state for a split.

Args: split_guid: GUID of the split to update (32-character hex string, or 8+ char prefix) state: New reconcile state: 'n' (new), 'c' (cleared), 'y' (reconciled) reconcile_date: Date in ISO format (YYYY-MM-DD). Required for 'y', defaults to today.

ParametersJSON Schema
NameRequiredDescriptionDefault
stateYes
split_guidYesSplit GUID (32-char hex or 8+ char prefix)
reconcile_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already indicate non-readOnly, destructive, and idempotent behavior. The description adds the requirement that reconcile_date is mandatory for state 'y' and defaults to today, which is not in the schema or annotations. It does not contradict annotations and provides useful operational detail, though it doesn't disclose other potential side effects (e.g., clearing the date when setting 'n'). This is acceptable given the annotation coverage.

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

Conciseness5/5

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

The description is a single sentence stating the purpose, followed by a clean args list. Every part is necessary; no filler. The structure is front-loaded with the main action, and parameter explanations are concise and directly usable.

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 mutation tool with an output schema (not shown but present) and annotations covering safety and idempotency, the description is largely sufficient. It explains all parameters and the date rule. Minor missing context like behavior when clearing reconcile_date is not critical. Overall complete for the complexity level.

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 only 33% (only split_guid has a description). The description compensates by explaining allowed values for state ('n', 'c', 'y') and the ISO date format and requirement for reconcile_date. This goes beyond the schema which defines them as generic strings. The split_guid description repeats the schema but that's fine. Substantial value added.

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 'Set the reconciliation state for a split' – a specific verb (set), resource (reconciliation state), and object (a split). This distinguishes it from siblings like reconcile_account (which likely reconciles a whole account) and get_reconciliation_status (which reads state). No ambiguity.

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 explicit guidance on when to use this tool versus alternatives. It does not mention reconcile_account for bulk operations or get_reconciliation_status for reading. The state values (n/c/y) give some context but not selection criteria. An agent would have to infer usage from the tool name alone.

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

spending_by_categoryA
Read-only

Get spending breakdown by expense category for a period.

Returns a compact aligned text table by default. Use verbose=true for the structured dict (programmatic consumers, plotting).

Args: start_date: Start of period (YYYY-MM-DD), inclusive. No calendar snapping — for calendar-month figures pass full month boundaries (e.g. 2026-05-01 to 2026-07-31). end_date: End of period (YYYY-MM-DD), inclusive. depth: Hierarchy depth for grouping (1 = top-level categories, 2 = subcategories) verbose: If false (default), compact text output — optimized for reading and token efficiency. If true, structured JSON, for when you need machine-readable fields rather than a report. group_by: Optional "month", "quarter", or "year" — split the range into sub-period columns and return a multi-period TSV table (category rows, one column per period plus Total and Avg). Overrides verbose.

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNo
verboseNo
end_dateYes
group_byNo
start_dateYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the annotations, the description discloses detailed behavior: default compact aligned text output, verbose structured dict output, inclusive date handling, no calendar snapping with a concrete example, and group_by overriding verbose. This is substantive behavioral context not visible in readOnlyHint or openWorldHint.

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 well-structured as an Args list, front-loads the tool's purpose, and every sentence carries a needed detail: output format, parameter semantics, or override behavior. There is 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?

With five parameters and a 0%-coverage schema, the description covers all of them, explains output formats, date semantics, and override interactions. Given an output schema exists, return-value details are sufficiently handled. The definition is complete enough 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.

Parameters5/5

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

Schema description coverage is 0%, but the description fully compensates by documenting every parameter: date format and inclusivity, depth hierarchy levels, verbose behavior with defaults, and group_by allowed values ('month', 'quarter', 'year') plus its effect. It adds meaningful semantics beyond the bare JSON 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?

States a specific verb and resource: 'Get spending breakdown by expense category for a period.' The phrase 'by expense category' and the tool name clearly distinguish this from sibling reporting tools like vendor_spending_report and income_by_source.

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?

It gives explicit guidance on output modes: use verbose=true for programmatic consumers/plotting, and notes that group_by overrides verbose. However, it does not explicitly say when to choose spending_by_category over alternative reporting tools such as vendor_spending_report or income_by_source; that choice is only implied by the name and description.

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

switch_bookA
Idempotent

Switch the active GnuCash book (multi-book sessions only).

All subsequent tool calls — and the audit/debug logs — operate on the newly-selected book until the next switch. Only present when GNUCASH_BOOK_PATH lists 2+ books.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesBook to activate, matched as a case-insensitive prefix of its filename. Must uniquely identify one configured book (see get_server_config for the list).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations, the description reveals the critical stateful behavior: all subsequent tool calls and logs operate on the newly-selected book until the next switch. This is valuable contextual information not derivable from readOnlyHint, idempotentHint, or destructiveHint.

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, front-loaded with the action, and each sentence adds necessary context without redundancy. The stateful consequence and availability condition are both conveyed efficiently.

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 state-switching tool, the description covers the essential context: what the tool does, when it is available, and how the change affects subsequent operations. The output schema exists, and the input schema handles parameter specifics, so nothing critical 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 tool description itself adds no parameter details. The schema already fully documents the matching semantics and uniqueness requirement, 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 ('Switch') and resource ('active GnuCash book'), immediately distinguishing it from all sibling operations. It also clarifies the multi-book-session scope, leaving no ambiguity about what the tool does.

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

Usage Guidelines4/5

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

It explicitly limits usage to multi-book sessions and states when the tool is present ('Only present when GNUCASH_BOOK_PATH lists 2+ books'). It clearly implies that this should be called before other tools when targeting a different book, though it does not name alternatives or explicit when-not-to-use cases.

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

unpost_documentA
DestructiveIdempotent

Reverse a posted customer invoice, vendor bill, employee voucher, or credit note (each keeps its type through the round-trip).

Deletes the posting transaction and lot, and clears the invoice's posted-state metadata. The invoice returns to "open" state and can be edited or re-posted. Refuses if the invoice has any payments applied — void payments first, then unpost.

Args: id: Document ID (e.g., "000001"). document_type: "invoice", "bill", "voucher", or "credit_note" — disambiguates when IDs collide. party_type: Owner side, credit notes only.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
party_typeNo
document_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already signal destructiveness and idempotency, but the description adds substantial behavioral detail beyond them: it deletes the posting transaction and lot, clears posted-state metadata, returns the document to 'open' state, and refuses when payments exist. This gives the agent a clear model of side effects and preconditions.

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 well-structured: purpose, behavior, refusal condition, then argument explanations. Each sentence contributes useful information without redundancy or filler, 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.

Completeness5/5

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

Given that an output schema exists, the description does not need to detail return values, and it covers the essential operational aspects: what gets deleted, what state results, what blocks execution, and how parameters disambiguate. The destructive and idempotent hints are reinforced with concrete behavioral context, leaving little an agent needs to infer.

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 0%, so the description must compensate, and it does: it explains id with an example, document_type with its accepted values and disambiguation purpose, and party_type as 'Owner side, credit notes only.' This adds real meaning beyond the raw schema, though party_type could be a bit more explicit about when it is required.

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: 'Reverse a posted customer invoice, vendor bill, employee voucher, or credit note.' It clearly describes what the tool does and helps distinguish it from closely related siblings like delete_document or void_transaction by emphasizing the reverse-posting workflow and the round-trip type preservation.

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: it applies to posted documents that need to return to an editable state, and it explicitly warns that unposting is refused if payments are applied, directing the agent to void payments first. It does not explicitly contrast with sibling tools, but the operational conditions are strong enough for correct selection.

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

unvoid_transactionA
DestructiveIdempotent

Restore a voided transaction to its pre-void amounts.

The inverse of void_transaction: original split values come back from the slots the void stored, and the void markers and reason are cleared. All-or-nothing — if any split's stored void data is missing, the tool errors and restores nothing (no partial resurrection). Errors too if the transaction isn't found or isn't voided. Restored splits return as UNreconciled ('n'), so a previously reconciled transaction needs reconciling again afterward.

Args: guid: Transaction GUID to unvoid (32-character hex string, or 8+ char prefix)

ParametersJSON Schema
NameRequiredDescriptionDefault
guidYesTransaction GUID (32-char hex or 8+ char prefix)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations, the description discloses atomicity ('all-or-nothing'), the restoration source, clearing of void markers and reason, and the reconciliation side effect: restored splits return as UNreconciled. It also explains failure modes clearly.

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 first sentence states the purpose, followed by well-structured behavioral details and the Args section. Every sentence contributes important operational information, with the core scoping constraint front-loaded.

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 mutation with rich annotations and an existing output schema, this description covers preconditions, failure modes, atomicity, and post-restoration state. Nothing an agent needs 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 Args section largely repeats the schema's guid description ('32-char hex string, or 8+ char prefix'). It adds no substantial meaning beyond identifying guid as the target transaction.

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?

Opens with a specific verb and object: 'Restore a voided transaction to its pre-void amounts.' It also explicitly identifies the relationship to void_transaction as its inverse, making it immediately distinguishable from sibling tools.

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

Usage Guidelines5/5

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

The description states that this is 'the inverse of void_transaction' and gives concrete preconditions: it errors if the transaction isn't found or isn't voided. This clearly tells an agent when to use it and when it is not applicable.

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

update_accountA
DestructiveIdempotent

Update an existing account's properties.

Args: name: Account ref to update (full path e.g. "Expenses:Groceries", %short GUID, or full 32-char GUID) new_name: New name for the account (just the leaf name, not full path) description: New description placeholder: New placeholder status (true = container only) account_type: New account type (e.g., "CREDIT", "BANK"). Only changes within the same debit/credit polarity are allowed — e.g., LIABILITY to CREDIT, ASSET to BANK. Cross-polarity changes (e.g., ASSET to LIABILITY) are blocked. notes: New notes (max 4096 bytes; shared with GnuCash desktop's Notes field). Pass "" to clear.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
notesNo
new_nameNo
descriptionNo
placeholderNo
account_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

The description adds meaningful behavior beyond annotations: name reference formats, new_name leaf-only requirement, placeholder semantics, account_type polarity restriction with examples, notes byte limit, and clear-by-empty-string semantics. It does not contradict the readOnly=false, idempotent=true, or destructiveHint=true annotations, though it does not elaborate on what destructive effects might occur.

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

Conciseness5/5

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

One summary line followed by a compact, front-loaded parameter list; every clause adds information (e.g., 'pass "" to clear', 'cross-polarity changes blocked'). There is no padding or repetition of the schema's type information.

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 six-parameter mutable operation, the description covers the required ref, every optional property, and all relevant constraints. With an output schema present, return-value documentation is unnecessary, and all information needed to construct a valid call is present.

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?

Schema description coverage is 0%, and the description fully compensates by documenting all six parameters with richer meaning than the schema: formats, examples, valid transitions, units, and clearing behavior. Each parameter in the Args block receives actionable semantic detail.

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 opening sentence states a specific verb ('Update') and resource ('an existing account's properties'), which is clear and distinct from create/delete account siblings. It does not explicitly contrast with move_account or set_account_slot, so some differentiation is left to the agent.

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 when-to-use or when-not-to-use guidance is provided; the description does not mention alternatives such as move_account or set_account_slot, nor does it state prerequisites like requiring the account to exist. The only selection signal is the generic verb in the name.

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

update_jobA
DestructiveIdempotent

Update a job's name, reference, or active state.

Any subset of fields can be passed; unspecified fields are left unchanged. Returns a diff-style response.

Args: job_id: Job ID. name: New name (optional). reference: New reference (optional). active: New active flag — pass False to deactivate a completed job without deleting it (preserves history).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
activeNo
job_idYes
referenceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

The description adds meaningful behavioral details beyond the annotations: partial-update semantics, a diff-style response, and preservation of history when deactivating. The annotations already indicate a mutating, idempotent, and potentially destructive operation, so the description does not need to re-state those; it provides useful context without contradicting 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 compact, front-loaded with the core purpose, and well-structured with a scannable Args section. Every sentence contributes useful information, with no filler or repetition of schema titles beyond what is helpful.

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 four-parameter update tool with an output schema and annotations, the description covers field semantics, partial updates, the deactivation use case, and the diff-style return. It leaves null-handling implicit and does not discuss preconditions like whether the job must exist, but it provides enough for correct invocation in most cases.

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 0%, so the description is the only place explaining the parameters. It covers all four parameters, marks optionality, and gives active real semantic meaning by tying it to deactivation and history preservation. Some entries like 'New name' and 'New reference' are close to the parameter names, but the subset/left-unchanged rule adds operational clarity.

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 on a specific resource: 'Update a job's name, reference, or active state.' It clearly differentiates update_job from sibling tools like create_job and delete_job, and the deactivation note reinforces that this is not a delete 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 explains that any subset of fields can be passed and that unspecified fields are unchanged, which is key usage guidance. It also frames active=False as the way to deactivate a completed job without deleting it, giving a concrete alternative to deletion, though it does not explicitly name delete_job or list exclusions.

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

update_partyA
DestructiveIdempotent

Update a customer's, vendor's, or employee's mutable fields.

None = no change on every parameter; pass an empty string to clear notes. Returns a diff-style response with the changed fields only.

Args: party_type: "customer", "vendor", or "employee" (ID counters collide across types — always required). id: Party ID (e.g., "000001"). name: New display name. currency: New ISO currency code (future documents only). notes: New notes; "" clears. Employees have no notes field — rejected, not ignored. active: Set active/inactive (inactive parties hide from default listings but keep their history). address: Full replacement address (see create_party).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
nameNo
notesNoNew notes value (capped at 4096 characters). Pass ``None`` (default) to leave existing notes unchanged; pass ``""`` to clear.
activeNo
addressNo
currencyNo
party_typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

Despite annotations already signalling mutability and destructiveness, the description adds valuable behavioral detail: None means no change for every parameter, an empty string clears notes, employees have no notes field and will be rejected rather than ignored, inactive parties hide from listings but retain history, and currency affects future documents only. It also discloses the diff-style response format, going well beyond what annotations convey.

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

Conciseness5/5

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

The description is concise despite its length, with a front-loaded summary followed by a per-parameter breakdown. Every sentence adds operational value—clearing semantics, rejection behavior, scope limits—and there is no filler or repetition of schema details that are already obvious.

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 the tool's moderate complexity, seven parameters, and existing output schema, the description covers all necessary invocation details: required fields, enum values, per-field semantics, error behavior for employees, and cross-reference for address format. An agent has enough to call the tool correctly without needing additional context.

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?

Schema description coverage is only 14%, so the description carries nearly the entire burden for parameter meaning. It explains all seven parameters, including the collision rationale for party_type, the clearing semantics for notes, the 'future documents only' nuance for currency, the hiding behavior for active, and the full-replacement semantics for address. This far exceeds the schema's sparse documentation.

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

Purpose5/5

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

The description opens with a specific verb ('Update') and a precise resource scope ('a customer's, vendor's, or employee's mutable fields'). It clearly distinguishes update_party from sibling tools like create_party, delete_party, get_party, and list_parties by focusing on mutating existing parties rather than creating/removing/reading them.

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 use case is implied by 'Update' and the list of mutable fields, but the description never explicitly states when to choose this tool over alternatives or when not to use it. It does provide a pointer to create_party for address format, which is a limited cross-reference, but lacks direct sibling routing such as 'use create_party to add a new party.'

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

update_scheduled_transactionA
DestructiveIdempotent

Update a scheduled transaction.

Args: guid: Scheduled transaction GUID (or 8+ char prefix). enabled: Enable or disable. end_date: Three-state field for the schedule's end date.

    - Omit (or pass ``null``): leave unchanged.
    - Pass ``"YYYY-MM-DD"``: set to that date.
    - Pass ``""`` (empty string): clear the existing
      end date back to "no end" (open-ended schedule).

    The empty-string sentinel exists because MCP tool
    schemas don't easily express "set to null" as a
    distinct value from "no change supplied" — both
    arrive as Python ``None``. Empty-string is the
    explicit "clear it" signal.
notes: Instantiation notes applied to transactions
    created from this schedule going forward (existing
    transactions untouched). Same three-state
    convention as end_date: text to set, ``""`` to
    clear, omit to leave unchanged.
ParametersJSON Schema
NameRequiredDescriptionDefault
guidYesScheduled transaction GUID (32-char hex or 8+ char prefix)
notesNo
enabledNo
end_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=true, lowering the bar for behavioral disclosure. The description adds useful context about the three-state end_date semantics, the empty-string sentinel, and the fact that notes changes affect only future transactions, leaving existing transactions untouched. It doesn't elaborate on the destructive nature of updates, but the annotation already signals that.

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 organized with a clear opening and per-parameter details in a consistent, scannable structure. The extended explanation of the empty-string sentinel adds length but is genuinely necessary to prevent incorrect calls where null and empty string would otherwise be ambiguous. No sentences are wasted, though it could be tightened slightly.

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 four parameters, the rich parameter semantics, and the presence of an output schema, the description covers all the information needed to invoke the tool correctly. It explains side effects around scheduled vs. existing transactions. It doesn't describe when to choose this tool over siblings, but that gap is more about usage guidance than invocation completeness.

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?

Schema description coverage is only 25%, so the description carries nearly the full burden for parameters. It thoroughly explains guid prefixes, enabled, the exact three-state behavior of end_date (omit/null, date string, empty string), and the same convention for notes. This is precisely the semantic detail an agent needs and cannot derive from the bare schema.

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

Purpose4/5

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

The description states a specific verb and resource: 'Update a scheduled transaction.' It then enumerates the updatable fields (guid, enabled, end_date, notes), making the tool's purpose unambiguous. It doesn't explicitly name sibling tools to differentiate, but the verb alone distinguishes it from create/list/delete scheduled transaction siblings.

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?

There is no guidance about when to use this tool versus alternatives such as create_scheduled_transaction, delete_scheduled_transaction, or create_transaction_from_scheduled. The intended usage is only implied by the name and description, with no explicit context, exclusions, or alternatives.

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

update_taxtableA
DestructiveIdempotent

Update a sales-tax table's name and/or entries.

Diff-style response: only changed fields are returned.

Entry replacement on a taxtable that's already in use is destructive to FUTURE entries' tax math. Existing posted invoices retain their original splits (splits are stored, not derived), but new entries on any document will use the replacement entries' rates. When refcount > 0 and entries is given, force=True is required to proceed.

Args: name: Current taxtable name. new_name: New name (optional). entries: Replacement entry list (optional). Same shape and validation as create_taxtable. force: Required to replace entries when the taxtable is already referenced by document entries.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
forceNo
entriesNo
new_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Even though annotations already mark destructiveHint=true, the description adds critical specificity: replacement affects only future entries, existing posted invoices retain stored splits, and force is mandatory when the table is referenced. This is exactly the behavioral nuance an agent needs before invoking a destructive update.

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 well-structured: a short outcome statement, a diff-style response note, a clearly highlighted destructive warning, and a compact Args block. Every sentence earns its place, and the most safety-critical information is front-loaded.

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 mutating tool with destructive semantics, the description covers the side-effect model, the force requirement, response shape, and all parameter semantics. Since an output schema is also present, nothing an agent needs to call this tool correctly is missing.

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?

Schema description coverage is 0%, so the description carries full responsibility for parameter documentation. It accurately explains name (current name), new_name (optional), entries (optional, same validation as create_taxtable), and force (required under a specific condition), leaving no parameter ambiguous.

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 first sentence states a specific verb and resource ('Update a sales-tax table's name and/or entries') and is immediately distinguishable from siblings like create_taxtable, list_taxtables, and delete_taxtable. The scope is precise and unambiguous.

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

Usage Guidelines4/5

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

The description gives clear operational context: it updates an existing table's name/entries, and it spells out the important precondition that force=True is required when refcount > 0 and entries are given. It does not explicitly name an alternative tool, but the conditional guidance effectively tells the agent when this mutation is appropriate.

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

update_transactionsA
DestructiveIdempotent

Update MANY transactions with per-row values (bulk edit).

INPUT — updates is a TSV block: header guid plus any of description, notes, date (at least one), then one row per transaction::

guid<TAB>description<TAB>notes
56926ac2<TAB>PayPal Credit Payment<TAB>Resolved — card payment
7f0fc117<TAB><TAB>Netflix subscription, $22.10/mo

An EMPTY cell leaves that field UNCHANGED. To blank a field, opt in with a clear column: its cell names the fields to clear on that row (notes or description,notes) — explicit per row, so a sparse batch can never mass-erase by accident. date is not clearable; a row that sets and clears the same field rejects. Splits and memos are not updatable here (replace_splits)::

guid<TAB>notes<TAB>clear
56926ac2<TAB>Verified subscription<TAB>
7f0fc117<TAB><TAB>notes

One book open, one save; on_error="abort" (default) sinks the batch on any bad row, "skip" keeps good rows. Date moves on transactions with reconciled splits are rejected per row unless force=true (they shift the transaction out of its reconciled statement period). Returns a results TSV keyed by your input guids. This is the canonical update tool for one transaction or many (the former update_transaction tool was removed; this replaces it — same value across many transactions = the same cells repeated per row).

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNo
updatesYes
on_errorNoabort

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

The description goes well beyond the annotations, explaining that empty cells leave fields unchanged, that clearing requires an explicit per-row 'clear' column, and that setting and clearing the same field in one row is rejected. It also discloses batch-failure semantics, force behavior for reconciled splits, and the one-book-at-a-time save constraint. Nothing contradicts the provided 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 long but dense, front-loading the core action and then using labeled input examples to convey complex TSV semantics precisely. Conditional rules such as 'date is not clearable' and 'row that sets and clears rejects' are concise one-liners. 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 bulk-mutation tool with multiple edge cases, error modes, and exclusions, the description covers input format, optional clearing, alternatives, forced operations, and return format. The mention of a results TSV keyed by input guids, plus the presence of an output schema, completes the picture. Nothing needed for correct invocation is missing.

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?

With 0% schema description coverage, the description fully compensates by documenting the TSV structure for updates, the optional clear column, date clearability, on_error values, and force semantics. This is far more parameter meaning than the bare schema 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 opens with a specific verb and scope: 'Update MANY transactions with per-row values (bulk edit)'. It further positions itself as 'the canonical update tool for one transaction or many' and distinguishes it from replace_splits, making its 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 Guidelines5/5

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

It explicitly says 'Splits and memos are not updatable here (replace_splits)', naming the alternative tool for that case. It also explains when to use on_error='abort' vs 'skip' and when force=true is required, giving the agent concrete decision guidance.

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

vendor_spending_reportA
Read-only

Get spending breakdown by vendor for a period.

Analyzes posted vendor bills to show total billed, total paid, and outstanding amounts per vendor.

Returns a compact aligned text table by default. Use verbose=true for the structured dict (programmatic consumers).

Args: start_date: Start of period (YYYY-MM-DD). end_date: End of period (YYYY-MM-DD). vendor_id: Optional filter to a specific vendor. verbose: If false (default), compact text output — optimized for reading and token efficiency. If true, structured JSON, for when you need machine-readable fields rather than a report. group_by: Optional "month", "quarter", or "year" — split the range into sub-period columns of total billed per vendor and return a multi-period TSV table. Overrides verbose.

ParametersJSON Schema
NameRequiredDescriptionDefault
verboseNo
end_dateYes
group_byNo
vendor_idNo
start_dateYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint and openWorldHint; the description adds substantial behavioral context: it analyzes only posted vendor bills, defaults to a compact aligned text table, switches to structured JSON with verbose, and changes output shape when group_by is set. No contradiction with annotations.

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

Conciseness5/5

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

The description is front-loaded with purpose, then delivers param semantics in tight bullet-like Args lines. Every sentence adds value; there is no filler or repetition of schema fields without added meaning.

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 report tool with an output schema present, the description covers data source, output formats, default behavior, override behavior, and all parameter semantics. Nothing an agent needs to decide whether to call it or how 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.

Parameters5/5

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

Schema description coverage is 0%, and the description fully compensates. It documents the YYYY-MM-DD format for date parameters, the optional vendor_id filter, the verbose boolean with its exact output implications, and group_by's allowed values and override behavior. Every parameter is meaningfully explained beyond the bare 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 opens with a specific verb and resource: 'Get spending breakdown by vendor for a period.' It then defines the exact metrics (total billed, total paid, outstanding amounts) and the data source (posted vendor bills), making it clearly distinct from siblings like spending_by_category.

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

Usage Guidelines4/5

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

The description gives clear mode-selection guidance: default compact text for reading/token efficiency, verbose=true for programmatic consumers, and group_by overriding verbose. It does not explicitly state when to choose this tool over related report tools, 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.

void_transactionA
DestructiveIdempotent

Void a transaction (proper accounting void, not delete).

Voiding preserves the transaction for audit purposes but zeroes out all split values. Use this instead of delete when you need to maintain an audit trail.

Args: guid: Transaction GUID to void (32-character hex string, or 8+ char prefix) reason: Reason for voiding (required for audit trail)

ParametersJSON Schema
NameRequiredDescriptionDefault
guidYesTransaction GUID (32-char hex or 8+ char prefix)
reasonYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already indicate destructiveHint=true and idempotentHint=true. The description adds valuable behavioral context: voiding preserves the transaction but zeroes split values, and a reason is required for audit purposes. It does not fully explain whether voiding is reversible, though the sibling unvoid_transaction hints at 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 tight and front-loaded: purpose, behavior, usage guidance, then parameters. Every sentence contributes meaningful information, and the Args block is concise.

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 the tool's moderate complexity, the presence of an output schema, and annotations covering destructiveness and idempotency, the description provides what an agent needs: what the tool does, when to use it, and what side effects to expect. No critical gap is apparent.

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 only 50%, with 'reason' lacking a description. The description compensates by explaining that reason is required for the audit trail, giving it clear semantic purpose. The guid parameter's description matches the schema but adds nothing new, though this is not a significant shortcoming.

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 the specific verb 'Void a transaction' and immediately clarifies the accounting-specific behavior ('proper accounting void, not delete'). It also names the key distinction from delete_transaction, making the tool's purpose unmistakable.

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 says 'Use this instead of delete when you need to maintain an audit trail.' This directly tells the agent when to choose this tool over the sibling delete_transaction and gives a clear selection condition.

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. Dates show when Glama detected each change.

  1. 56 tool updatesv1.4.4
    • Removedadd_bill_entry
    • Removedadd_credit_note_entry
    • Addedadd_document_entry
    • Removedadd_invoice_entry
    • Removedadd_voucher_entry
    • Removedcreate_bill
    • Removedcreate_credit_note
    • Removedcreate_customer
    • Addedcreate_document
    • Removedcreate_employee
    • Removedcreate_invoice
    • Addedcreate_party
    • Removedcreate_transaction
    • Removedcreate_vendor
    • Removedcreate_voucher
    • Removeddelete_bill
    • Removeddelete_credit_note
    • Removeddelete_customer
    • Addeddelete_document
    • Removeddelete_employee
    • Removeddelete_invoice
    • Addeddelete_party
    • Removeddelete_vendor
    • Removeddelete_voucher
    • Addedenter_statement
    • Removedget_customer
    • Addedget_document
    • Removedget_employee
    • Removedget_invoice
    • Removedget_job
    • Addedget_outstanding_documents
    • Removedget_outstanding_invoices
    • Addedget_party
    • Removedget_taxtable
    • Removedget_vendor
    • Removedlist_backups
    • Removedlist_customers
    • Addedlist_documents
    • Removedlist_employees
    • Removedlist_invoices
    • Changedlist_jobs1 field changed
      • addedInput schema / properties / id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Id"
        +}
    • Addedlist_parties
    • Changedlist_taxtables1 field changed
      • addedInput schema / properties / name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Name"
        +}
    • Removedlist_vendors
    • Addedpay_document
    • Removedpay_invoice
    • Addedpost_document
    • Removedpost_invoice
    • Removedprune_backups
    • Addedunpost_document
    • Removedunpost_invoice
    • Removedupdate_customer
    • Removedupdate_employee
    • Addedupdate_party
    • Removedupdate_transaction
    • Removedupdate_vendor
  2. 111 tool updatesv1.4.2
    • First observedadd_bill_entry
    • First observedadd_credit_note_entry
    • First observedadd_invoice_entry
    • First observedadd_voucher_entry
    • First observedapply_credit_note
    • First observedassign_split_to_lot
    • First observedbalance_sheet
    • First observedcalculate_lot_gain
    • First observedcash_flow
    • First observedclose_lot
    • First observedcreate_account
    • First observedcreate_backup
    • First observedcreate_bill
    • First observedcreate_billterm
    • First observedcreate_budget
    • First observedcreate_commodity
    • First observedcreate_credit_note
    • First observedcreate_customer
    • First observedcreate_employee
    • First observedcreate_invoice
    • First observedcreate_job
    • First observedcreate_lot
    • First observedcreate_price
    • First observedcreate_prices
    • First observedcreate_scheduled_transaction
    • First observedcreate_taxtable
    • First observedcreate_transaction
    • First observedcreate_transaction_from_scheduled
    • First observedcreate_transactions
    • First observedcreate_vendor
    • First observedcreate_voucher
    • First observeddebt_payoff_plan
    • First observeddelete_account
    • First observeddelete_account_slot
    • First observeddelete_bill
    • First observeddelete_budget
    • First observeddelete_credit_note
    • First observeddelete_customer
    • First observeddelete_employee
    • First observeddelete_invoice
    • First observeddelete_job
    • First observeddelete_price
    • First observeddelete_scheduled_transaction
    • First observeddelete_taxtable
    • First observeddelete_transaction
    • First observeddelete_vendor
    • First observeddelete_voucher
    • First observedget_account
    • First observedget_account_slots
    • First observedget_audit_log
    • First observedget_balance
    • First observedget_book_summary
    • First observedget_budget
    • First observedget_budget_report
    • First observedget_customer
    • First observedget_employee
    • First observedget_invoice
    • First observedget_job
    • First observedget_job_report
    • First observedget_latest_price
    • First observedget_lot
    • First observedget_outstanding_invoices
    • First observedget_prices
    • First observedget_reconciliation_status
    • First observedget_server_config
    • First observedget_taxtable
    • First observedget_transaction
    • First observedget_unreconciled_splits
    • First observedget_upcoming_transactions
    • First observedget_vendor
    • First observedincome_by_source
    • First observedlist_accounts
    • First observedlist_backups
    • First observedlist_billterms
    • First observedlist_budgets
    • First observedlist_commodities
    • First observedlist_customers
    • First observedlist_employees
    • First observedlist_invoices
    • First observedlist_jobs
    • First observedlist_lots
    • First observedlist_scheduled_transactions
    • First observedlist_taxtables
    • First observedlist_transactions
    • First observedlist_vendors
    • First observedmove_account
    • First observednet_worth
    • First observedpay_invoice
    • First observedpost_invoice
    • First observedprune_backups
    • First observedreconcile_account
    • First observedreplace_splits
    • First observedsearch_transactions
    • First observedset_account_slot
    • First observedset_budget_amount
    • First observedset_reconcile_state
    • First observedspending_by_category
    • First observedswitch_book
    • First observedunpost_invoice
    • First observedunvoid_transaction
    • First observedupdate_account
    • First observedupdate_customer
    • First observedupdate_employee
    • First observedupdate_job
    • First observedupdate_scheduled_transaction
    • First observedupdate_taxtable
    • First observedupdate_transaction
    • First observedupdate_transactions
    • First observedupdate_vendor
    • First observedvendor_spending_report
    • First observedvoid_transaction

TDQS

A3.8/5.0
Disambiguation4/5

Most tools target a distinct resource+action (create_account vs update_account vs delete_account), and workflows like document status are carefully explained. The main ambiguities are the single-vs-bulk price pairs (create_price/create_prices, get_prices/get_latest_price) and the overlapping transaction entry tools (create_transactions vs enter_statement), though descriptions do disambiguate them.

Naming Consistency3/5

The core follows a consistent verb_noun pattern (list_accounts, create_transactions, delete_price, reconcile_account), but many report-style tools break it with noun phrases like balance_sheet, cash_flow, net_worth, spending_by_category, and vendor_spending_report. The mix is readable but not uniform.

Tool Count2/5

87 tools is far beyond a typical practical surface and will overwhelm agents even though GnuCash is a broad domain. Many bulk/single and report variants inflate the count; the server would be more usable consolidated to ~50 tools.

Completeness4/5

Coverage is impressively deep: accounts, transactions, reconciliation, documents, parties, jobs, budgets, commodities, prices, lots, scheduled transactions, and reporting all have lifecycle or workflow support. Notable gaps remain — billterms have no update/delete, documents have no header-edit or entry-removal tools, and backups cannot be listed or restored via the API.

Maintenance

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables interaction with local Beancount accounting ledgers through structured tools for viewing accounts, balances, and transactions, as well as inserting/removing transactions and answering natural-language questions via BeanQuery. Provides deterministic, validated, and auditable financial data operations with offline-first functionality.
    1
    -
  • A
    license
    B
    quality
    A
    maintenance
    open-source personal finance app with a first-party MCP server. 91 HTTP tools (OAuth 2.1 + DCR) and 87 stdio tools cover transactions, budgets, accounts, portfolio analytics, FX conversion, loans, subscriptions, goals, importers, and rules. Users self-host with Docker + PostgreSQL or use the managed cloud
    89
    12
    AGPL 3.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    A Model Context Protocol (MCP) server that keeps the books for your personal and business finances using double-entry accounting — driven entirely from an LLM.
    65
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Double-entry accounting MCP server for Claude Desktop. Supports accounts, transactions, ledgers, profit & loss, balance sheet, IVA summary, and QIF export using SQLite.
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ninetails-io/gnucash-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server