Skip to main content
Glama

Server Details

Capture receipts, scan Gmail, analyze spending, and create reviewed reports from AI assistants.

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP
URL
Repository
TotesMagotes/expensebot-mcp
GitHub Stars
0
Server Listing
ExpenseBot MCP

Glama MCP Gateway

Connect through Glama MCP Gateway for full control over tool access and complete visibility into every call.

MCP client
Glama
MCP server

Full call logging

Every tool call is logged with complete inputs and outputs, so you can debug issues and audit what your agents are doing.

Tool access control

Enable or disable individual tools per connector, so you decide what your agents can and cannot do.

Managed credentials

Glama handles OAuth flows, token storage, and automatic rotation, so credentials never expire on your clients.

Usage analytics

See which tools your agents call, how often, and when, so you can understand usage patterns and catch anomalies.

100% free. Your data is private.
Tool DescriptionsA

Average 4.5/5 across 59 of 59 tools scored. Lowest: 2.9/5.

Server CoherenceB
Disambiguation3/5

Most tools are explicitly scoped, but several analytics/retrieval tools overlap in purpose, such as get_spending_summary vs get_deep_analytics vs get_monthly_books_review, and generic search vs search_expenses vs search_knowledge. The detailed descriptions help, but an agent still has to carefully choose between near-equivalent options like correct_expenses vs update_expense and the three add_income variants.

Naming Consistency5/5

Tool names consistently use lower_snake_case with a recognizable verb prefix: get_*, list_*, add_*, create_*, check_*, scan_*, search_*, and whatif_*. Minor exceptions like fetch and search are still terse retrieval verbs rather than a different naming style, so the overall pattern is predictable.

Tool Count1/5

With 59 tools, this exceeds the 50+ threshold for an extreme tool count and creates a heavy selection surface for an agent. Even though ExpenseBot covers many subdomains, many get_/list_/add_ variants could be consolidated into fewer parameterized tools. The count undermines the otherwise clear naming structure.

Completeness3/5

The surface is strong for creating, reading, and updating expenses, reports, invoices, and Gmail scans, but there are notable lifecycle gaps: no delete/void tools for expenses, income, reports, or invoices, and no update tool for income. Several descriptions explicitly redirect unsupported edits to the web app, confirming that the assistant cannot complete those workflows directly.

Available Tools

59 tools
add_cash_expenseAInspect

Add an expense without a receipt, or record money a client provided in advance for expenses. Writes directly to the user's expense spreadsheet after confirmation. For an ordinary expense, call list_categories first and provide a configured Expense Account. For a client advance, set isClientAdvance=true and clientName; ExpenseBot reuses or creates the canonical client group, applies Cash advance received, and stores the amount as a negative expense. Use this only for money supplied by a client before related spending, never for vendor refunds, reimbursements, earned fees, retainers, or generic deposits. Use the Manual expense link from get_spreadsheet_url instead when the user needs a reviewed form for multiple entries, credits/refunds, tax or tip breakdowns, per diem, or incomplete details.

ParametersJSON Schema
NameRequiredDescriptionDefault
taxNoTax amount
tipNoTip amount
cityNoCity/location
dateYesExpense date (YYYY-MM-DD)
notesNoNotes or description
totalYesPositive amount paid or received. ExpenseBot stores a client advance as negative.
categoryNoA configured Expense Account returned by list_categories. Do not invent a category.
currencyNoCurrency code (default: USD)
merchantNoMerchant/vendor name for an ordinary expense. Not needed for a client advance; ExpenseBot derives it from clientName.
subtotalNoSubtotal before tax
clientNameNoClient name for a client advance, in ordinary language. ExpenseBot resolves the canonical Client – Name group.
isClientAdvanceNoTrue only when a client supplied money in advance for expenses. Requires clientName and does not require category.
Behavior4/5

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

The annotations only declare readOnlyHint=false, openWorldHint=false, destructiveHint=false, so the description carries the behavioral burden. It discloses the direct side effect ('writes directly to the user's expense spreadsheet after confirmation'), the negative-expense representation, and the canonical client-group reuse/creation behavior. It stops short of explaining what 'confirmation' actually entails, but adds meaningful behavioral context well beyond the minimal annotation set.

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 (~180 words) but every sentence carries unique information: mode distinction, side effect, preconditions, exclusions, and the alternate route. It front-loads the primary purpose and is logically organized, though the paragraph density is high enough that the key disambiguation could have been slightly tightened.

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 a 12-parameter tool with two distinct call patterns, no output schema, and a very large sibling list, the description is exceptionally complete: it covers preconditions, exclusions, alternative routes, and client-advance specifics. It does not describe the return value or what the agent should expect after a successful call, and the 'after confirmation' flow remains ambiguous, since there is no output-schema fallback to cover these.

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

Parameters4/5

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

Schema description coverage is 100%, so the schema already documents each parameter. The description adds inter-parameter wiring that the schema cannot: category is only required for the ordinary-expense path, isClientAdvance=true requires clientName and ignores category, and merchant is derived from clientName for advances. This conditional semantics is genuinely additional value beyond the schema.

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

Purpose5/5

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

The description opens with a specific verb-resource pair ('Add an expense without a receipt') and immediately distinguishes the second mode ('record money a client provided in advance'). It explicitly scopes the tool and even names what it is not (never vendor refunds, reimbursements, earned fees, retainers, generic deposits), making sibling disambiguation easy.

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 guidance for both modes, an explicit precondition ('call list_categories first and provide a configured Expense Account'), a hard list of exclusions, and a named alternative (Manual expense link from get_spreadsheet_url) with the specific conditions that should trigger it. Nothing is left to inference.

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

add_incomeAInspect

Log an income entry manually (cash, check, Stripe payout, etc.). Writes to the Income tab of the user's expense spreadsheet. Useful for income that isn't auto-detected from Gmail or Plaid. Call list_income_categories first and use one of its fixed tax categories; an omitted category defaults to Service income and an unknown category is rejected.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoTag for client/project attribution
dateNoIncome date (YYYY-MM-DD). Defaults to today.
feesNoProcessor/transfer fees deducted
notesNo
amountYesIncome amount (>0)
sourceYesWho paid you (client name, customer, etc.)
categoryNoA category returned by list_income_categories (optional; defaults to Service income)
currencyNoCurrency code (default: home currency)
referenceNoInvoice or transaction reference
descriptionNoWhat the income was for
taxCollectedNoSales tax/GST/HST collected
paymentMethodYesHow you got paid. Canonical rails are Cash, Check, Bank transfer, Wallet app, Credit/Debit card, Payment processor, or Other; common labels such as Stripe and Venmo are normalized.
Behavior4/5

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

Beyond the annotations, the description discloses a concrete write target (Income tab of the spreadsheet), the category validation behavior (unknown category rejected), and the default category. The non-destructive hints and title are not contradicted. It does not describe the return value or whether the entry is immediately visible, but the disclosed side effect is the main 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?

Three sentences carry the action, side effect, use-case, prerequisite, default, and validation behavior with no filler. The most decision-relevant content is front-loaded.

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

Completeness4/5

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

For a mutation tool with 12 parameters and no output schema, the description covers the workflow and critical validation behavior well enough for an agent to call it correctly. It could go a bit further by describing what the successful call returns or by explicitly differentiating itself from the file/CSV income siblings.

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 high at 92%, so the schema already explains most parameters; 3 is the baseline. The description adds genuinely valuable semantics beyond the schema: categories must come from list_income_categories, an omitted category defaults to Service income, and unknown categories are rejected. It also gives payment-method examples that map to accepted input 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 a specific verb and resource: 'Log an income entry manually' and states it writes to the Income tab of the user's expense spreadsheet. It also distinguishes itself from the auto-detection siblings by framing this as the tool for income that is not detected from Gmail or Plaid.

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

Usage Guidelines4/5

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

It clearly gives the when-to-use context: manual income that is not auto-detected from Gmail or Plaid. It also gives a strong prerequisite by requiring list_income_categories to be called first. It does not explicitly name the sibling add_income_from_csv/add_income_from_file as the batch/alternate path, which keeps it just short of fully explicit alternative routing.

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

add_income_from_csvAInspect

Import income from a CSV/TSV/text export (Stripe, PayPal, Square, Cash App, Venmo, OnlyFans, Patreon, Clips4Sale, Ko-fi, Gumroad, Etsy, Uber/Lyft/DoorDash driver exports, bank statements, and similar; max 500 KB). Same two-step contract as add_income_from_file: STEP 1 call with csvContent and WITHOUT confirm parses the file with the same platform-agnostic importer as the app's Add Income screen (platform detection, fee handling, refunds, source aliases, ISO dates) and returns a duplicate-checked preview with a previewId. NOTHING is saved in step 1. Show the user the parsed rows and duplicates, then STEP 2 call again with confirm: true and the previewId to write exactly those rows, optionally with user-approved selectedIndexes, keepBothIndexes, rowEdits, tag, or bulkNote. Flagged duplicates are skipped unless the user explicitly keeps them. The preview expires after 15 minutes and an expired or unknown previewId never writes. After a successful confirm, show the returned spreadsheetUrl and reviewIncomeUrl.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoOptional client/project tag. In step 1 it pre-fills the staged rows; in step 2 it applies to the confirmed selection.
confirmNoStep 2 only: true writes the staged rows. Omit it (with previewId absent) to parse and preview without writing.
csvTextNoLegacy fallback for MCP clients that send raw CSV/TSV/text content inline. ChatGPT should use csvContent.
bulkNoteNoStep 2 only: one note (max 120 chars) prepended to every confirmed row's Notes, same as the app's 'Add note to all entries'.
rowEditsNoStep 2 only: user-approved corrections, at most 50 rows. Fields: date (ISO YYYY-MM-DD), source, amount, currency, category, paymentMethod, description, notes, reference, fees, taxCollected, tag.
previewIdNoStep 2 only: the previewId returned by the step-1 call.
csvContentNoAttached CSV/TSV/text file supplied by ChatGPT for step 1. The server downloads and decodes the attachment securely.
paymentMethodNoFallback payment rail for rows where the parser found none (Cash, Check, Bank transfer, Wallet app, Credit/Debit card, Payment processor, or Other).
keepBothIndexesNoStep 2 only: preview indexes of duplicate-flagged rows the user explicitly wants to keep anyway (the app's 'Keep Both').
selectedIndexesNoStep 2 only: preview row indexes to write. Omit to write all staged rows.
Behavior5/5

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

The description goes far beyond the annotations by stating that step 1 saves nothing, duplicates are skipped unless explicitly kept, previews expire after 15 minutes, and invalid preview IDs never write. This gives an agent a realistic model of the tool's side effects and could not be inferred from annotations alone.

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

Conciseness5/5

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

The description is long but densely structured: it front-loads the purpose and file limits, uses STEP 1/STEP 2 markers to impose order, and every sentence contributes either contract behavior or parameter usage. For a 10-parameter, two-phase tool, this length is justified.

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 the full lifecycle: file submission, parsing, preview, duplicate handling, user edits, expiration, confirm behavior, and the URLs to show after success. Given no output schema and the complexity of 10 parameters, this completeness is strong.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is already 3, but the description adds cross-parameter semantics by explaining which parameters belong to which step and how selectedIndexes, keepBothIndexes, rowEdits, tag, and bulkNote interact with the preview. It does not need to repeat schema-level details because those are already complete.

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: 'Import income from a CSV/TSV/text export,' and names common sources such as Stripe, PayPal, Square, and bank statements. It clearly distinguishes this tool from manual income entry and references the related add_income_from_file workflow while maintaining its own file-import identity.

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 spells out exactly when to call the tool: step 1 with csvContent and no confirm for parsing, then step 2 with confirm:true and previewId to write rows. It does not explicitly say 'use this instead of X,' but the two-step contract and duplicate-handling guidance make the intended usage clear.

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

add_income_from_fileAInspect

Import income from an attached screenshot, image (JPEG, PNG, WebP, HEIC/HEIF), or PDF (payment screenshots, wallet apps, payout or bank statements; max 10 MB). This is a two-step tool. STEP 1: call it with the file and WITHOUT confirm — ExpenseBot parses the file with the same importer as the app's Add Income screen, checks every row against the user's Income tab for duplicates, and returns a preview with a previewId, exact row count, totals by currency, per-row details, duplicate flags, and any rejected rows. NOTHING is saved in step 1; treat the attachment as consent to parse, not consent to write. Show the user the parsed rows and duplicates, then STEP 2: call again with confirm: true and the previewId to write exactly those rows. Only include user-approved changes in step 2 (selectedIndexes, keepBothIndexes, rowEdits, tag, bulkNote). Flagged duplicates are skipped unless the user explicitly asks to keep them (keepBothIndexes). The preview expires after 15 minutes; an expired or unknown previewId never writes. After a successful confirm, show the returned spreadsheetUrl and reviewIncomeUrl. For a visually complex review (mixed income/expense rows, many edits), send the user to the Add Income app link returned by get_spreadsheet_url instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoOptional client/project tag. In step 1 it pre-fills the staged rows; in step 2 it applies to the confirmed selection.
photoNoAttached image or PDF supplied by ChatGPT for step 1. The server downloads and parses the attachment securely.
confirmNoStep 2 only: true writes the staged rows. Omit it (with previewId absent) to parse and preview without writing.
bulkNoteNoStep 2 only: one note (max 120 chars) prepended to every confirmed row's Notes, same as the app's 'Add note to all entries'.
mimeTypeNoMIME type of the file (default: image/jpeg)
rowEditsNoStep 2 only: user-approved corrections, at most 50 rows. Fields: date (ISO YYYY-MM-DD), source, amount, currency, category, paymentMethod, description, notes, reference, fees, taxCollected, tag.
previewIdNoStep 2 only: the previewId returned by the step-1 call.
photoBase64NoLegacy fallback for MCP clients that send complete image/PDF bytes as base64. ChatGPT should use photo.
paymentMethodNoFallback payment rail for rows where the parser found none (Cash, Check, Bank transfer, Wallet app, Credit/Debit card, Payment processor, or Other).
keepBothIndexesNoStep 2 only: preview indexes of duplicate-flagged rows the user explicitly wants to keep anyway (the app's 'Keep Both').
selectedIndexesNoStep 2 only: preview row indexes to write. Omit to write all staged rows.
Behavior5/5

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

Annotations are minimal (readOnlyHint=false, destructiveHint=false), so the description carries the burden — and it excels. It states that step 1 saves nothing, treats attachment as consent to parse not write, that duplicates are skipped unless explicitly kept, that expired previewIds never write, and that step 2 with confirm:true writes exactly those rows. It also gives the returned URLs (spreadsheetUrl, reviewIncomeUrl). This is exceptional behavioral disclosure for a mutation tool.

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?

Long but appropriately so for an 11-parameter two-step tool. It front-loads the file types and the two-step requirement, uses STEP 1/STEP 2 headings to organize behavior, and each sentence earns its place by adding operational detail. Slightly dense, but there's 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 complex tool with no output schema, the description covers everything an agent needs to invoke it correctly: the two-step shape, the previewId expiry, duplicate handling, what counts as written vs not written, the returned URLs, and the alternative for complex reviews. Nothing critical 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 100% and each parameter is already documented. The description adds crucial cross-parameter semantics: which params are step-1 vs step-2 only, the mutual exclusivity between photo/photoBase64, the role of confirm in the two-step flow, and how rowEdits/selectedIndexes/keepBothIndexes interact. It adds the meaning behind the parameters rather than just repeating the schema.

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

Purpose5/5

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

The description clearly states the tool imports income from an attached file (screenshot/image/PDF) and explicitly lists supported formats and max size. It names the specific two-step flow, distinguishing it from sibling tools like add_income and add_income_from_csv, and explains how it differs from the CSV import path.

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 step-by-step guidance: call without confirm first, show the user the parsed preview, then call again with confirm:true and previewId. It also states when NOT to include things (only user-approved changes), what to do with duplicates, and the 15-minute expiry. It even routes to an alternative (get_spreadsheet_url) for complex reviews.

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

add_mileage_entryAInspect

Log a business mileage trip in ExpenseBot. Useful for realtors, consultants, contractors, and anyone who drives for work. Requires the user to have configured their mileage rate (cents/km or cents/mi) and unit (mi/km) in ExpenseBot Settings. The trip writes a row to their expense spreadsheet with the calculated dollar value. Use the Mileage and travel link from get_spreadsheet_url instead when the user needs Google Maps route calculation, mileage settings, repeated trips, calendar/rideshare import, per diem, or visual review.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoTag for client/project attribution (optional)
cityNoCity (optional)
dateNoTrip date (YYYY-MM-DD). Defaults to today.
notesNoOptional user-supplied context stored with the mileage entry.
purposeYesBusiness purpose / description of the trip (e.g., 'Client meeting at 1234 Main St')
categoryNoOverride the user's default mileage category (optional)
distanceYesDistance traveled in the user's configured unit (miles or km)
roundTripNoIf true, doubles the distance (return trip)
destinationNoDestination address or location (optional)
Behavior5/5

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

Annotations already indicate a write operation (readOnlyHint=false) and non-destructive nature (destructiveHint=false). The description adds transparency about the side effect: it writes a row to the user's expense spreadsheet with a calculated dollar amount, and it exposes a prerequisite (configured rate/unit) that could otherwise cause failures. 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 primary purpose, then provides context on target users and prerequisites, and ends with concise routing guidance. Every sentence adds value and there is no redundancy 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?

Despite having 9 parameters, the input schema fully covers all parameter semantics. There is no output schema, but the description explains the outcome (writes a row, calculates dollar value). It includes prerequisites and alternative usage, so an agent has all necessary information to decide when and how to call the tool correctly.

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

Parameters3/5

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

Schema description coverage is 100% for all 9 parameters, and each parameter has a clear description in the input schema. The tool description adds no additional parameter semantics beyond what is already in the schema, so a baseline score of 3 is appropriate. It does not need to compensate for any gaps.

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

Purpose5/5

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

States a specific verb and resource ('Log a business mileage trip'), explicitly mentions the write effect ('writes a row to their expense spreadsheet with the calculated dollar value'), and differentiates from the sibling get_spreadsheet_url by naming when to use that alternative. This is unambiguous and distinguishes the tool from all 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?

Provides explicit usage conditions: requires the user to have configured mileage rate and unit in Settings, and names the alternative (get_spreadsheet_url) with a precise list of scenarios that should route to it (Google Maps route calculation, mileage settings, repeated trips, calendar/rideshare import, per diem, visual review). This is a model example of when-to-use vs when-not-to-use guidance.

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

check_complianceA
Read-only
Inspect

Use only when the user explicitly asks to check an existing report for compliance issues such as missing business purpose or policy violations. Creating a report, excluding Personal expenses, sharing a report, or billing a client is not a compliance request; never call this tool automatically as a preflight or follow-up for those workflows.

ParametersJSON Schema
NameRequiredDescriptionDefault
reportIdYesReport ID to check
userRequestYesThe user's exact request explicitly asking for compliance, policy, audit, substantiation, or business-purpose analysis. Do not paraphrase or invent intent.
Behavior5/5

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

Annotations already indicate readOnlyHint=true and destructiveHint=false, so the tool is safe to call. The description adds significant behavioral context by prohibiting automatic invocation and narrowing the operation to explicit user requests, which prevents the agent from using it unnecessarily. No contradictions with annotations.

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

Conciseness5/5

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

The description is only two sentences but packs in the exact trigger condition, the resource, the topic, and explicit exclusion scenarios. There is no filler, and the most important usage constraint is front-loaded in the first phrase.

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 combination of description and fully documented schema covers everything the agent needs to correctly invoke the tool: exact parameters, exact usage constraints, and safety profile. No output schema exists, but the invocation context is complete and the likely return value is sufficiently evident from the purpose.

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

Parameters3/5

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

Schema coverage is 100%, and both parameters already have clear, detailed descriptions. The tool description reinforces the context behind the userRequest parameter, but it does not add new semantic detail beyond what the schema already provides. Since the schema carries the full burden, a baseline of 3 is appropriate.

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

Purpose5/5

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

The description clearly states a specific verb and object: check an existing report for compliance issues such as missing business purpose or policy violations. It also draws the boundary against non-compliance workflows, so an agent can distinguish it from related tools like fix_compliance and check_tax_deductibility.

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 is explicit about when to use the tool: only when the user explicitly asks for a compliance check of an existing report. It also gives hard exclusions for report creation, personal expense exclusions, sharing, and client billing, and explicitly forbids automatic invocation as a preflight or follow-up. This leaves no ambiguity.

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

check_featureA
Read-only
Inspect

Check whether ExpenseBot supports a specific feature ('does ExpenseBot support X', 'can it integrate with Y'). Searches the public knowledge base and returns a confidence-scored answer + related questions. Works with or without authentication.

ParametersJSON Schema
NameRequiredDescriptionDefault
featureYesFeature or integration to check (e.g., 'Xero', 'mileage tracking', 'Plaid')
Behavior4/5

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

Beyond the readOnlyHint and destructiveHint annotations, the description adds useful behavior: it searches the public knowledge base, returns a confidence-scored answer plus related questions, and works with or without authentication. 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.

Conciseness5/5

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

The description is concise and well-structured: first states purpose, then the search behavior and return shape, then authentication requirements. Every sentence contributes useful, non-redundant information.

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

Completeness4/5

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

For a low-complexity tool with one required parameter and no output schema, the description is nearly complete: it explains what it checks, where it searches, what it returns, and auth requirements. It could add slightly more detail about the confidence-score format, but 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.

Parameters3/5

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

The single 'feature' parameter is already fully described in the schema with concrete examples, so the description adds little semantic value beyond the schema. This meets the baseline for high schema_description_coverage.

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

Purpose4/5

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

The description clearly states a specific action and resource: checking whether ExpenseBot supports a feature or integration, with quoted example questions. It is distinct from most siblings, though it does not explicitly contrast itself with similar knowledge-lookup tools like search_knowledge or search.

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 invocation context through canonical question forms ('does ExpenseBot support X', 'can it integrate with Y'), so an agent knows when this tool fits. It does not explicitly state when not to use it or name sibling alternatives.

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

check_tax_deductibilityA
Read-only
Inspect

Look up whether a specific expense type or purchase is tax-DEDUCTIBLE (business write-off rules) based on the user's country/jurisdiction. This is a deductibility advice tool — use it for questions like 'is Uber deductible', 'can I write off home office', 'are client dinners 50% or 100%'. Do NOT use it for questions about tax REFUNDS received as income (use get_spending_summary with a 'tax refunds' query for those — they're routed to the Income tab, not deduction rules).

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesDeductibility question (e.g., 'is Uber tax deductible', 'home office write-off rules')
categoryNo
merchantNo
Behavior4/5

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

Annotations already mark read-only/non-destructive, so the description only needs adding context beyond that. It adds 'advice' framing and country/jurisdiction dependence, and explicitly disclaims tax-refund handling. It does not disclose edge-case behavior about unresolved countries, but for a read-only advice tool this is a minor 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?

Two sentences: the first states purpose with tight examples, the second draws the sibling-distinction and adds exact routing instruction. There is no filler and no repeated structural metadata.

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 tool with no output schema and only one required parameter, the description carries the main operational context well: what question it answers, when to avoid it, and which sibling to use instead. It doesn't state what exactly the tool returns or the place of optional filters, but these are less impactful given the advice-tool framing.

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

Parameters2/5

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

Schema coverage is only 33%, with 'category' and 'merchant' lacking descriptions. The tool description heavily reinforces 'query' with examples, but never explains whether/how 'category' and 'merchant' should be filled or how they combine with 'query'. This leaves a meaningful invocation ambiguity.

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

Purpose5/5

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

The description names a specific action ('look up'), a specific resource ('tax-deductibility ... based on country'), distinguishes brother(s" and grounds with concrete examples. It is clearly a look-role and not a gauge or a general expense 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?

It provides explicit with-type examples and an explicit when-not-to-use: questions about received tax refunds are routed to get_spending_summary instead. This is a precise decision rule with a named sibling.

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

correct_expensesA
Destructive
Inspect

Safely correct the category, business purpose, or explicit attendees on an exact bounded set of recorded expenses. Examples: 'categorize these as Travel', 'add Client kickoff dinner as the business purpose for these meals', or 'add Fred, Rob, and Lamar to last night's business meal'. First use search_expenses to identify the exact rows, then pass their full expenseId values. A grounded preview is automatic: first call with confirm omitted/false, show the exact count and proposed before-to-after changes, and ask once for approval. Only after explicit approval repeat the same operationId, selection, and change with confirm:true. A premature confirm:true is converted to preview. Attendee names must come explicitly from the user; never infer them. attendeeMode add preserves existing attendees, while replace substitutes only the attendee segment. Business purpose and attendees preserve the structured Notes field, including card, description, inbox, and other typed segments. Formula Notes and changes that exceed the Notes limit are skipped safely. The confirmed result reports applied/conflicted/failed counts and supports Undo. This tool does not omit duplicates, change amounts or dates, infer business context, or run broad Calendar matching. For unsupported or more than 100-row cleanup, send the user to https://www.expensebot.ai/review-expenses?source=mcp.

ParametersJSON Schema
NameRequiredDescriptionDefault
undoNoUndo a completed correction within its Undo window.
changeNoExactly one correction. The selected type determines which matching value field is required.
statusNoRead operation status using operationId.
confirmNoOmit/false for preview; true only after explicit approval.
selectionNoExact expenses returned by search_expenses and approved for this bounded correction.
operationIdYesStable idempotency key generated once for preview and reused unchanged.
Behavior5/5

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

Beyond the annotations (destructiveHint=true, readOnlyHint=false), it discloses important behavioral traits: premature confirm:true is converted to preview, operationId is an idempotency key reused unchanged, attendee names must come from the user, Notes segments are preserved, and over-limit changes are skipped safely. It also specifies that results report applied/conflicted/failed counts and support Undo, providing rich behavioral depth 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 front-loaded with purpose and examples, then proceeds logically through workflow, parameter semantics, boundaries, and fallback. The length is justified by the tool's complexity (6 params, nested objects, destructive confirmation flow) and 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?

With no output schema and a destructive, stateful tool, the description fully compensates: it describes the confirmation flow, the contents of a preview (exact count and before-to-after changes), result reporting (applied/conflicted/failed, Undo), and behavioral boundaries. The operational fallback for unsupported cases and the 100-row limit also make the tool safe to invoke.

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 100%, and the description adds substantial value on top: it explains that receiptId values are the exact full expenseIds from search_expenses, attendeeMode 'add' preserves while 'replace' substitutes, operationId must be generated once and reused, and expected fields are used for conflicting detection. It also grounds the stateful preview/confirm protocol in parameter terms.

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 ('correct the category, business purpose, or explicit attendees on an exact bounded set of recorded expenses') and reinforces it with concrete examples. It clearly distinguishes itself from sibling tools like update_expense or search_expenses through the bounded-batch scoping and preview requirements.

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 prescribes the workflow: first use search_expenses to identify rows, then pass full expenseId values, preview with confirm omitted/false, and confirm true only after explicit approval. It also gives when-not guidance (does not change amounts/dates, omit duplicates, infer business context, or run broad calendar matching) and a fallback URL for unsupported or >100-row cleanup.

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

create_client_invoiceA
Destructive
Inspect

Create the exact invoice previously returned by prepare_client_invoice. This is a confirmed write: it revalidates the report snapshot and client identity, creates a private editable Google Doc plus private PDF and DOCX copies, records the issued invoice, and supersedes an older active invoice for the same report. It does not send email or create an Income row. If tax is positive, confirmTax must be true.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmTaxNoTrue only after the user confirms the displayed tax label and rate.
operationIdNoOptional retry key. Reuse it after an uncertain response.
preparationIdYesShort-lived ID returned by prepare_client_invoice.
Behavior5/5

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

The description fully discloses side effects: revalidation, creation of Google Doc, PDF, and DOCX copies, recording the invoice, and superseding an older active invoice. This goes well beyond the destructiveHint and readOnlyHint annotations, since the agent learns exactly what state may change and what is intentionally not done.

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 and well-structured, starting with the core purpose and then covering prerequisites, side effects, exclusions, and a specific required condition. Every sentence adds operational value 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 write tool with no output schema and destructiveHint=true, this description gives the agent enough to call it safely: required ID source, confirmTax condition, external document creation, superseding behavior, and what it does not do. No critical call-time decision is left unexplained.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds meaningful context: preparationId is short-lived, confirmTax is required when tax is positive, and operationId is for retry. The description strengthens understanding of the parameters beyond their plain schema 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 clearly states it creates the exact invoice previously produced by prepare_client_invoice, identifies it as a confirmed write, and lists the concrete artifacts it produces. This makes it easy to distinguish from prepare_client_invoice, mark_client_invoice_paid, and add_income 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?

It explicitly ties usage to an invoice prepared via prepare_client_invoice and specifies that tax confirmation is required when tax is positive. It also lists what it does not do, excluding email and Income row creation, though it does not explicitly name the alternatives an agent should use for those actions.

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

create_reportAInspect

Create an expense report from a clear date, client, project, trip, category, or merchant request. Tags are ExpenseBot's grouping layer for clients, projects, project codes, and trips; call list_tags when the user's intended group is unclear. For requests such as 'all expenses in August except personal', set excludePersonal=true; this excludes both the Personal tag and Personal expense category, matching ExpenseBot's Report Wizard. Returns the report summary, exact report link, Bill Client link, applied filters, and a prefilled Report Wizard fallback for criteria that need visual review. Reports scoped to an existing client/project/trip group include matching expenses that are not already assigned to another ordinary report. Can optionally share with recipients. If no unreported matches remain, create no duplicate report and explain that the expenses are already in Reports. Terminal results also include role-appropriate accountingHandoffUrls from the server capability matrix and the existing reviewed file-export workflow. Use only the exact destination the user requested; the link opens the reviewed app flow and does not mean an export occurred. Complete the requested report directly; do not call check_compliance, get_report_details, or tax/deductibility tools before or after it unless the user explicitly asks for that separate analysis.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoExisting ExpenseBot groups to include, such as a client, project, project code, property, or trip. Use list_tags first when uncertain.
titleNoCustom report title
dateRangeNoTime period filter. Use exactly one variant — pick the shape that matches the user's phrasing.
shareWithNoEmail addresses to share the report with
categoriesNoOptional configured expense categories to include in the report.
excludedTagsNoExisting ExpenseBot groups to exclude from the report.
recipientRoleNoAccess for every shareWith recipient. Use reviewer for one-report review, comments, approval, or change requests. Use accountant only when the user explicitly wants ongoing report management and accounting-software access.reviewer
excludePersonalNoExclude expenses whose Tag is Personal or whose Expense Category is Personal.
excludedCategoriesNoExpense categories to exclude from the report.
Behavior5/5

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

Annotations only carry bare flags (readOnlyHint=false, destructiveHint=false), so the description carries the full behavioral burden and delivers: it discloses no-duplicate behavior when no unreported matches remain, the scoping rule about expenses not already assigned to another ordinary report, the fact that the link opens a reviewed flow rather than performing an export, and the accountingHandoffUrls inclusion. This is far beyond what annotations provide.

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

Conciseness4/5

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

The description is long (roughly a dozen sentences), but nearly every clause carries operational weight — duplicate prevention, link semantics, scoping rules, exclusions, return values. It is front-loaded with the core purpose and flows logically from what→how→returns→edge-case→exclusions. Slightly dense, but no filler sentences.

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 9-parameter tool with zero required parameters and no output schema, the description is remarkably complete: it documents return contents (summary, report link, Bill Client link, applied filters, Report Wizard fallback), handles edge cases (already-reported expenses, ambiguous groups), and covers share/recipient semantics. 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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds genuine value on top: it explains tags as 'ExpenseBot's grouping layer for clients, projects, project codes, and trips,' clarifies that excludePersonal=true removes both the Personal tag and Personal category in line with Report Wizard behavior, and frames the date/category criteria in user-request language. A modest but real increment over 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 — 'Create an expense report from a clear date, client, project, trip, category, or merchant request' — and enumerates the exact scoping dimensions. It also differentiates from siblings by explicitly naming which tools to avoid (check_compliance, get_report_details, tax/deductibility tools) and distinguishes itself from export_report ('does not mean an export occurred').

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?

Usage guidance is explicit and actionable: 'call list_tags when the user's intended group is unclear' names the alternative and the triggering condition, and 'do not call check_compliance, get_report_details, or tax/deductibility tools before or after it unless the user explicitly asks' gives a hard when-not. The excludePersonal example also teaches when to set a specific parameter.

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

export_reportA
Read-only
Inspect

Get a short-lived direct PDF download for one exact authorized expense report, plus the exact highlighted in-app report link. Use the in-app report for CSV, XLSX, receipt ZIP (when available), comments, invoicing, and other visually reviewed actions. Use list_reports first to find the reportId.

ParametersJSON Schema
NameRequiredDescriptionDefault
reportIdYesReport ID from list_reports
Behavior4/5

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

With annotations already indicating readOnlyHint=true and destructiveHint=false, the description adds meaningful context beyond structured metadata: the download is short-lived, it applies to one authorized report, and the in-app link is the path for certain output formats. This behavior is stated 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 three sentences, each delivering independent high-value info: the core output, where formats other than PDF belong, and the mandatory preliminary lookup. Nothing is verbose or redundant.

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 a single required parameter, full schema coverage, and no output schema, this description adequately equips an agent to call the tool: it names the input, the return shape (PDF download and in-app link), and the correct alternative path for other file types. It could go to 5 with explicit response field names like reportUrl or pdfUrl.

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 already documents reportId with 100% coverage as 'Report ID from list_reports'. The description reinforces the parameter's origin with 'Use list_reports first to find the reportId' and adds scoping nuance — the report must be 'exact' and 'authorized' — both of which clarify intended values beyond the schema 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 states a precise verb and resource: it gets a 'short-lived direct PDF download' for an 'exact authorized expense report' plus a highlighted in-app report link. The deliverables are specific enough to differentiate it from siblings like get_report_details and get_spreadsheet_url, and the sentence structure grounds the tool clearly in its purpose.

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

Usage Guidelines4/5

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

The description explicitly instructs the agent to use the in-app report link for CSV, XLSX, receipt ZIP, comments, invoicing, and other visually reviewed actions, and it names the prerequisite call: 'Use list_reports first to find the reportId.' It covers usage and context well, though it does not explicitly compare to alternative get_* sibling tools beyond the implied scope.

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

fetchA
Read-only
Inspect

Fetch full details for a specific item returned by search. The id encodes the item type: • 'expense:' — e.g., 'expense:42' for row 42 of the user's Expenses tab • 'report:' — the alphanumeric Firestore document id from search or list_reports, e.g., 'report:FQqDglExofsyyQv7aYy4' Always use the id exactly as returned by search or list_reports — do not invent or modify the trailing portion. Returns the full text content + metadata for the AI to cite.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesItem ID from a previous `search` or `list_reports` call. Format: 'expense:<row>' (integer row number) or 'report:<reportId>' (alphanumeric Firestore doc id, ~20 chars).

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesEchoed back from the input
urlNo
textYesFull text content for the AI to cite
titleYes
metadataNo
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds valuable behavioral context: it warns against inventing or modifying the trailing portion of the id, explains the id format rules, and states that the tool returns full text content plus metadata for citation. This goes beyond the annotations and helps avoid misuse.

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 moderately detailed but well-structured with bullets for the id types. Every sentence serves a purpose: stating the function, explaining formats, giving caution, and indicating return content. It is not excessively verbose, though it could be slightly tighter by merging the caution with the examples.

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 only one parameter, an output schema exists, and the annotations provide safety context, the description is complete. It explains how to construct/obtain the id, what the id encodes, and what the return value contains (full content + metadata). No additional context is needed for correct invocation.

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

Parameters4/5

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

The schema already covers the id parameter fully (pattern and description), so the baseline is 3. The description adds further meaning by providing concrete examples for both expense and report id formats, explaining the encoding ('expense:<rowNumber>' vs 'report:<reportId>'), and reinforcing the need to use exact ids from prior calls. This additional guidance compensates beyond schema coverage.

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

Purpose5/5

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

The description clearly states the tool fetches full details for a specific item returned by `search`, using a specific verb and resource. It distinguishes itself by explaining the two id formats (expense and report) and emphasizing that the id must be used exactly as returned, which clarifies its scope as a unified fetch tool.

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

Usage Guidelines4/5

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

The description gives clear context on when to use the tool: after a `search` or `list_reports` call. It instructs the agent to use the id exactly as returned and not to modify it. However, it does not explicitly mention alternatives like `get_expense_by_id` or `get_report_details`, so it lacks explicit exclusions.

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

fix_complianceC
Destructive
Inspect

Bulk-fix compliance issues in a report (e.g., apply the same business purpose to all flagged expenses).

ParametersJSON Schema
NameRequiredDescriptionDefault
valueYesThe value to apply
actionYes
reportIdYes
Behavior2/5

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

The destructiveHint=true annotation already signals destructive behavior, and the description confirms bulk modification but adds little depth: no mention of which fields get changed, reversibility, permission requirements, or the scope of 'bulk' (all flagged expenses vs. a subset). With only minimal added context beyond the annotation, the burden falls on the description and it only partially meets 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 one tightly constructed sentence with no fluff. It introduces the purpose, scope, and a concrete example in a compact way; there is no filler or repetition of the tool name or annotations.

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

Completeness2/5

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

For a destructive bulk operation with no output schema and three required parameters (two of which are only loosely covered), the description lacks enough detail. An agent cannot know what result to expect, whether the operation is reversible, or which entities are affected for each action. The major risk is the ambiguity of which changes happen per action and the sustained broad impact of such a bulk fix anywhere.

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 33%, covering only 'value'. The description's example ('apply the same business purpose') adds helpful semantic mapping to the 'action' enum and value field, but the 'reportId' parameter remains undeclared beyond its schema type. The tool description partially compensates for the low coverage but does not fully explain the parameter roles.

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 ('Bulk-fix compliance issues in a report') and gives an example ('apply the same business purpose to all flagged expenses'). It is clear enough to distinguish from related tools like check_compliance or correct_expenses, though it doesn't explicitly name the sibling it differs from.

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 implies bulk remediation of flagged compliance issues but gives no explicit guidance on when to choose this over check_compliance, correct_expenses, or update_expense. No exclusions or alternative conditions are mentioned, leaving selection to inference.

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

get_accounting_integration_statusA
Read-only
Inspect

Check whether an accounting destination is connected and read-only setup state for the owner. Returns the selected organization/company/business, stored connection state, rollout state, and the single setup link for connecting or reconnecting the destination. When an existing ExpenseBot report is available, pass reportId so the link opens that exact report's provider setup control instead of the general Reports setup. This is read-only and never posts accounting data. Agent-driven posting is currently available only for Zoho Books (zoho_books); QuickBooks Online (quickbooks), Xero (xero), Wave (wave), and FreeAgent (freeagent, beta) are accepted here for connection/setup status only and report writesAuthorized=false until their canonical planning path is shared.

ParametersJSON Schema
NameRequiredDescriptionDefault
providerYesAccounting destination provider. QuickBooks Online, Xero, Wave, FreeAgent (beta), or Zoho Books.
reportIdNoOptional existing ExpenseBot report ID. When supplied, setupUrl opens this exact report and highlights the selected accounting provider's setup control.
Behavior5/5

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

Beyond annotations, the description discloses non-obvious behaviors: it never posts accounting data, provider limitations are provider-specific, writesAuthorized=false for providers except Zoho Books, and reportId changes the setup link target. This is significant behavioral nuance an agent cannot derive from readOnlyHint or destructiveHint alone.

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 needed, but every sentence carries useful information about scope, return content, provider limitations, and parameter behavior. It is front-loaded with the core purpose, followed by actionable details; only minimal redundancy exists because it states read-only which aligns with annotations without repeating them.

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, read-only status tool with no output schema, this description is complete. It covers the returned state, the important provider caveat, and the optional reportId behavior, without requiring an agent to infer critical constraints from 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?

The input schema already fully documents provider and reportId (100% coverage), but the description adds further precision: it explains what reportId changes in the returned link and documents provider-specific authorization behavior. This is additional semantic value, not schema repetition.

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 action — 'Check whether an accounting destination is connected and read-only setup state' — and enumerates exactly what is returned (organization, connection state, rollout state, setup link). It clearly distinguishes this status-check tool from posting or setup tools, and indirectly from sibling get_accounting_push_status by clarifying this covers connection/setup status only.

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 makes clear when to use this tool: to check connection/setup status, with optional reportId to target a specific report's setup control. It also explains that non-Zoho providers are only supported for status and writesAuthorized=false. It doesn't explicitly say 'use send_report_to_accounting to post' or 'use request_accounting_integration to initiate', but the read-only disclaimer plus sibling names make that inferable.

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

get_accounting_push_statusA
Read-only
Inspect

Read the authoritative posting and reconciliation status for one ExpenseBot report at an accounting destination. Use after a timeout or uncertain response before considering any retry. Returns status, submission time, posting mode, posted receipt count, any public error, and whether reconciliation is required. Never re-post a completed report or a report marked needs_reconciliation; show that state to the owner instead. This tool is read-only and owner-account only.

ParametersJSON Schema
NameRequiredDescriptionDefault
providerYesAccounting destination provider used for the prior posting attempt.
reportIdYesExact ExpenseBot report ID from the prior proposal or posting attempt.
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the read-only nature is known. The description adds context beyond annotations by stating it returns specific fields (status, submission time, posting mode, posted receipt count, any public error, reconciliation required) and warns against re-posting. It also explicitly states 'This tool is read-only' which reinforces annotations. While it doesn't disclose rate limits or pagination, for a simple status read the added context is sufficient. 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 concise and well-structured: a clear statement of purpose, a usage trigger, a warning, and a read-only note. It front-loads the primary function and then adds actionable guidance. Each sentence adds value without redundancy. No filler or repetition.

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

Completeness5/5

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

With only 2 parameters, no output schema, and annotations already covering safety, the description provides everything an agent needs: it states what the tool returns (enumerated fields), when to use it, and what not to do. It also mentions the owner-account restriction. There is no missing information that would prevent correct invocation or interpretation of results. The description fully compensates for the lack of an output schema by listing the return contents.

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

Parameters3/5

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

Schema coverage is 100%, so both parameters are fully described in the schema. The description adds minor context: 'provider' is defined as the 'Accounting destination provider used for the prior posting attempt' (schema already says this) and 'reportId' as 'Exact ExpenseBot report ID from the prior proposal or posting attempt' (schema already says this). The description does not introduce new syntax or format details beyond the schema. Since the schema carries the semantic weight, a baseline score of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Read the authoritative posting and reconciliation status for one ExpenseBot report at an accounting destination.' It specifies the exact verb (read), the resource (status of a report), and the specific context (accounting destination). It differentiates itself from siblings like send_report_to_accounting and get_accounting_integration_status by focusing on status checking rather than sending or integration status.

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 to use the tool: 'Use after a timeout or uncertain response before considering any retry.' It also provides a clear exclusion: 'Never re-post a completed report or a report marked needs_reconciliation; show that state to the owner instead.' This gives an agent direct instructions on when to invoke and when not to, including alternative behavior. Additionally, it notes 'owner-account only' which is a scope constraint.

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

get_client_advance_balancesA
Read-only
Inspect

Read the same per-client advance balances shown in ExpenseBot's Client advances section. Use for questions like 'how much of Acme's advance remains?', 'which client floats are still open?', or 'do I owe a client a refund?'. A negative ledger balance means money remains to refund; a positive balance means the client owes the user. Returns the existing app handoff for Refund leftover or Bill Client. Read-only: never records a refund, creates an invoice, or recomputes the ledger in model prose.

ParametersJSON Schema
NameRequiredDescriptionDefault
clientNameNoOptional client name or canonical Client tag. Omit to list every open balance backed by a recorded client advance.
clientEmailNoClient account email. Accountants may use this only for an accepted ExpenseBot client.
Behavior5/5

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

The description adds meaningful behavior beyond the annotations: it explains the ledger sign semantics (negative = refund remains, positive = client owes), states validated that it 'never records a refund, creates an invoice, or recomputes the ledger in model prose,' and reveals the return value (the existing app handoff for Refund leftover or Bill Client). None of these details are in the schema or 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?

Four sentences with each earning its place: purpose, usage examples, balance semantics, and output/read-only guarantee. Slightly more verbose than strictly necessary and the read-only clause partially repeats the annotations, but the text is well-structured 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 no output schema, the description does the needed work on return behavior: it explains sign semantics and the returned app handoff. It does not fully describe the return shape but a reasonable level of completeness for an agent to select and invoke the tool confidently.

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%; the schema already documents both clientName (with the 'omit to list every open balance' behavior) and clientEmail. The description adds no parameter-level guidance, so the baseline 3 is appropriate.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Read the same per-client advance balances shown in ExpenseBot's Client Advances section.' It includes concrete example queries ('how much of Acme's advance remains?', 'which client floats are still open?') that make it unmistakable distinct from siblings like get_client_invoice, get_income_summary, and get_credits_refunds.

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?

Clear when-to-use context is given through example user questions, which is strong routing guidance. However, it does not explicitly name alternatives or state when-not-to-use, leaving a small overlap ambiguity with get_credits_refunds for the 'do I owe a client a refund?' use case.

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

get_client_invoiceA
Read-only
Inspect

Get the full financial and delivery summary for one issued client invoice, including subtotal, markup, tax, advance applied, balance due, dates, status, source report, and private Google Doc/PDF/DOCX links when available. Provide invoiceId or invoiceNumber — one is required; invoiceNumber is accepted only when it is unique. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
invoiceIdNoStable invoice ID from list_client_invoices. Required unless invoiceNumber is supplied.
clientEmailNoClient account email. Accountants may use this only for an accepted ExpenseBot client.
invoiceNumberNoHuman invoice number when invoiceId is unavailable; it must identify one unique invoice.
Behavior4/5

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

Read-only is already declared by annotations, but the description adds non-obvious behavior: invoiceNumber is rejected unless unique, and private Google Doc/PDF/DOCX links are included only when available. It also enumerates the substantive return fields, which is valuable because there is no 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?

Two sentences with no filler: the first declares the resource and return contents, the second gives the critical identifier rule. The description is dense but not bloated and front-loads the purpose.

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

Completeness5/5

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

For a read-only single-invoice lookup with no output schema, the description is complete. It lists the key financial and delivery fields, states the required identifier condition, notes the uniqueness constraint, and flags that links are included only when available.

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 all three parameters, but the description adds meaning by establishing that invoiceId or invoiceNumber is required even though no schema field is marked required, and that invoiceNumber must resolve to exactly one invoice.

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 the full financial and delivery summary for one issued client invoice.' It then lists the concrete fields returned, so an agent can clearly distinguish this from list and management tools like list_client_invoices or prepare_client_invoice.

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

Usage Guidelines4/5

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

It gives useful call-time guidance: provide either invoiceId or invoiceNumber, one is required, and invoiceNumber works only when unique. It does not explicitly name alternatives, but the 'one issued client invoice' scope and identifier constraints make the intended use clear.

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

get_credits_refundsA
Read-only
Inspect

List card refunds, cashback/rewards, and statement credits that ExpenseBot has already recorded — either as negative expenses or matched against the original charge. Examples: 'did my refund come through', 'show my statement credits', 'was that return recorded'. Returns the most recent items (default 25, newest first); narrow with dateRange. Read-only: it never scans cards, changes review decisions, or adds rows.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum results to return (default 25, max 100).
dateRangeNoOptional open-ended or closed window to narrow results. Supply startDate, endDate, or both; supplied bounds are inclusive YYYY-MM-DD dates.
clientEmailNoClient account email. Accountants may use this only for an accepted ExpenseBot client.
Behavior5/5

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

Beyond the readOnlyHint=true annotation, the description openly states it never scans cards, changes review decisions, or adds rows, and explains returned items are negative expenses or matched against the original charge. It also discloses ordering and default count (newest first, default 25), which adds concrete behavioral detail beyond 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.

Conciseness4/5

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

The description is concise with the primary action front-loaded, followed by clarifying examples and key behavioral constraints. It contains no fluff, though the two example-heavy sentences could be slightly tightened; still well-organized and readable.

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 no output schema, the description clearly states what is returned ('most recent items', default 25, newest first) and provides enough guidance on optional use of dateRange. It lacks a detailed shape of the returned items, but the description is adequate for a simple read-only list tool.

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

Parameters3/5

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

Schema description coverage is 100%, so the input schema already documents all three parameters. The description mentions default 25 and dateRange narrowing, but does not add substantial meaning beyond the schema; thus baseline 3 is appropriate.

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

Purpose5/5

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

The description explicitly states 'List card refunds, cashback/rewards, and statement credits that ExpenseBot has already recorded', naming both the action and the specific resource. It further disambiguates with user intent examples and a positive claim about scope, so an agent can distinguish it from sibling tools like get_income_summary or get_spending_summary.

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

Usage Guidelines4/5

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

The description gives clear usage context through example user queries and emphasizes it only reads already-recorded data. It does not explicitly name an alternative tool or state 'use X instead', but 'Read-only: it never scans cards, changes review decisions, or adds rows' conveys when not to use it relative to scanning or review workflows.

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

get_deep_analyticsA
Read-only
Inspect

Run deeper, multi-step analytics on the user's expenses. Use for explanatory questions like 'why did my spending increase' or 'compare Q1 vs Q2'. Takes 10-30 seconds (runs as a background job, polled automatically). Returns: { message, data: { ..., sampleMeta? } } where sampleMeta.isTruncated indicates whether the agent saw the full dataset.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesThe analytics question to answer
dateRangeNoTime period filter. Use exactly one variant — pick the shape that matches the user's phrasing.
Behavior4/5

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

Beyond the annotations (readOnlyHint, destructiveHint), the description adds vital behavioral context: it runs as a background job with automatic polling and a 10-30 second latency, and discloses that sampleMeta.isTruncated signals whether the agent saw the full dataset. This goes well beyond 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 compact (three sentences) and front-loads the core purpose, then adds usage examples, timing, and return structure. Every sentence earns its place without redundancy.

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

Completeness4/5

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

Even without an output schema, the description provides a partial return shape and explains the truncation indicator, which is essential for an analytics tool. It covers usage, execution model, and a key interpretation detail. The inner structure of 'data' is intentionally vague, but the tool is likely to produce heterogeneous results that an agent can reason about from the response.

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

Parameters4/5

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

Schema coverage is 100% with descriptions for both query and dateRange. The description adds value by explaining the type of query to pass (explanatory questions) and instructing to 'use exactly one variant — pick the shape that matches the user's phrasing', which is a practical heuristic not present 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 states a specific verb ('Run deeper, multi-step analytics') and a clear resource ('on the user's expenses'). It distinguishes itself with concrete examples ('why did my spending increase' or 'compare Q1 vs Q2') that contrast with simpler summary tools like get_spending_summary, making it unambiguous.

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

Usage Guidelines4/5

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

It explicitly tells the agent when to use it ('Use for explanatory questions like...') and even hints at complexity by noting the 10-30 second background job. However, it does not explicitly mention alternatives or when not to use it, leaving some inference to the agent.

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

get_expense_by_idA
Read-only
Inspect

Fetch a single expense row by its sheet row number or by its ExpenseBot expenseId (the exact Receipt ID in Column Q). Returns the row's headers + values + a labeled {header → value} map so you can refer to a specific expense the user mentioned. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
expenseIdNoExact full ExpenseBot Receipt ID from Column Q
rowNumberNo1-indexed sheet row (row 1 is headers, so ≥ 2)
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces this with 'Read-only.' Beyond that, it discloses the return format (headers + values + labeled map) which is not self-evident from the schema. This adds useful behavioral context, making the agent aware of what to expect from the response.

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

Conciseness5/5

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

The description is two sentences long, with the core action and identification methods front-loaded. Each clause serves a purpose: identifying the input, specifying the output, and noting the intended use case. There is no redundancy or filler, making it an efficient and well-structured 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?

The tool is simple with optional parameters, read-only semantics, and no output schema. The description covers all essential aspects: how to identify the expense, what the return value contains, and the typical use case. Given the absence of an output schema, the explicit description of the returned map compensates fully. Nothing an agent needs to call this correctly appears 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 provides full descriptions for both parameters (expenseId and rowNumber), including the exact source ('Column Q') and row indexing rules. The description adds no new semantic value beyond what the schema already states—it repeats the identification methods without further elaboration. Since schema coverage is 100%, the baseline of 3 is appropriate.

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

Purpose5/5

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

The description clearly identifies the tool as fetching a single expense row by two possible identifiers (row number or ExpenseBot expenseId) and explicitly states the output shape. This distinguishes it from general search or list tools in the sibling set, which address different needs.

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 when to use it ('so you can refer to a specific expense the user mentioned'), providing a clear use-case. It does not explicitly contrast with alternatives like search_expenses or list-related tools, but the specificity of the operation ('fetch a single expense row') makes the intended context evident. The use-case guidance is sufficient, though a note on when not to use it would be stronger.

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

get_expense_splitsA
Read-only
Inspect

Show how an expense was split across categories, clients, properties, or business vs personal portions. Returns the single parent payment with its nested allocation lines — split lines are never counted as separate expenses, so totals stay correct. Examples: 'how is that expense split', 'what was the business portion of that bill', 'show the allocation for this receipt'. Read-only — splits are edited in ExpenseBot's Review workspace.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax parent expenses to return (default 25, max 100).
dateRangeNoOptional open-ended or closed window to search for split expenses. Supply startDate, endDate, or both; supplied bounds are inclusive YYYY-MM-DD dates.
onlySplitNoReturn only expenses with active splits (default true). Set false to inspect an unsplit Receipt ID.
receiptIdNoOptional Receipt ID for one expense.
clientEmailNoClient account email. Accountants may use this only for an accepted ExpenseBot client.
Behavior4/5

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

Annotations already carry readOnlyHint=true, and the description reinforces this with 'Read-only'. It also adds meaningful behavior beyond annotations: split lines are never counted as separate expenses, totals stay correct, and returns the parent payment with nested allocation lines. This helps the agent understand aggregation semantics and avoid double-counting.

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 behavior, and each sentence earns its place. The example queries are useful for triggering, the parent-line clarification prevents stat aggregation errors, and the read-only note is useful for usage boundaries.

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?

There is no output schema, but the description supplies the key return concept: a single parent payment with nested allocation lines, while split lines remain ignored. Parameter behavior and examples are covered. The main minor gap is that it doesn't spell ou tthe exact top-level return shape or any empty-response behavior, but the description is still sufficient for correct invocation.

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

Parameters3/5

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

All 5 parameters are already fully described in the schema, so the baseline is 3. The tool description adds the important semantic concept of 'parent' expenses but does not explain limit, dates, reimbursable filtering, amount, or clientEmail beyond what the schema already provides. That is sufficient but not additive.

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 exactly what the tool does: it shows how an expense was split across categories, clients, properties, or business/personal portions. It goes beyond a name-level restatement by explaining that results are parent payments with nested allocation lines, and the example queries make the intended use unmistakable.

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 example prompts ('how is that expense split', 'what was the business portion of that bill') and notes that splits are edited only in ExpenseBot's Review workspace, giving the agent a clear context for when this read tool is right. It does not explicitly name alternative sibling tools or say when not to use it, so it stops short of full routing guidance.

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

get_income_summaryA
Read-only
Inspect

Get income totals, breakdowns, and analytics from the Income tab. Covers Schedule C / T2125 income, Schedule B drill-in (interest, dividends, tax refunds, security deposits), rental income, and per-source / per-payment-method / per-category / per-month / per-tag breakdowns. Schedule-C-style category exclusions match year-end T6 routing (security deposits, refunds excluded from taxable totals). Examples: 'income YTD', 'income by source', 'rental income by property', 'interest income this year', 'dividends YTD', 'tax refunds 2024', 'income this year vs last' (YoY). Supports period comparison phrasing — YoY ('vs last year'), MoM ('vs last month'), QoQ ('Q1 vs Q2'), same-month-prev-year. Returns: { message, data: { total, breakdown?, comparison?, sampleMeta? } }.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoNatural language income question (e.g., 'income YTD by source', 'rental income last month')
groupByNoHow to group the breakdown
dateRangeNoTime period filter. Use exactly one variant — pick the shape that matches the user's phrasing.
incomeTagPrefixNoOptional tag-prefix shortcut (e.g., 'Prop –' for rental income, 'Client –' for client billings, 'Wedding –' for events). When set, the tool filters to income rows tagged with this prefix.
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the core safety profile is covered. The description adds valuable behavioral nuances beyond annotations: Schedule-C-style exclusions (security deposits, refunds excluded from taxable totals) and support for YoY/MoM/QoQ comparisons. It also reveals the exact return envelope ({ message, data: { total, breakdown?, comparison?, sampleMeta? } }), which is especially useful given no 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.

Conciseness4/5

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

The description is longer than average but every component earns its place: the opening states scope, the middle provides precise tax/drill-down details, and the examples indicate common usage. It is front-loaded in effective order and avoids fluff. It could be tightened slightly, but it remains efficient for the tool'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?

Given the tool's optional parameters, rich natural-language input, and absence of an output schema, the description is remarkably complete. It covers allowed date range shapes (month, quarter, year, specific, relative) through the schema, and the description adds overarching behavior like exclusions, comparison support, and the return envelope. An agent armed with this description and schema can invoke and interpret this tool with confidence.

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

Parameters4/5

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

Schema description coverage is 100%, so baseline is 3, but the description adds real value. It clarifies how the 'query' parameter behaves, mapping natural language examples to groupBy values ('per-source', 'per-payment-method', 'per-category', 'per-month', 'per-tag') and explicating comparison semantics. This guidance is not present in the schema descriptions and helps agents use the tool 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?

Purpose is crystal clear: 'Get income totals, breakdowns, and analytics from the Income tab.' The description goes on to enumerate a precise set of income types (Schedule C/T2125, Schedule B drill-ins, rents) and breakdown dimensions (source, category, month, etc.), making it unmistakably distinct from income-related siblings like get_spending_summary. The scope exceeds a simple 'verb+resource' and fully specifies the domain.

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 extensive example user phrasings ('income YTD', 'rental income by property', 'income this year vs last'), which clearly map to when an agent should invoke this tool. However, it does not explicitly contrast it with alternatives or state when not to use it, leaving a slight gap in exclusions.

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

get_last_receipt_resultA
Read-only
Inspect

Check the authoritative final outcome of a receipt image/PDF batch submitted with submit_receipt. After submit_receipt returns submissionId, call this tool with that exact ID using the polling interval and time allowance in the submit_receipt response. A small batch allows at least 5 minutes; larger batches allow longer. A pending result is normal and must not trigger a duplicate resubmission. Returns added, duplicate, skipped, or errored verdicts with exact counts and up to 10 processed receipt summaries. found:false is pending and has no terminal verdict; found:true is terminal. On completion, tell the user what happened and show spreadsheetUrl plus reviewExpensesUrl. This is for uploaded receipts; use get_scan_status for Gmail scans. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
submissionIdNoExact submissionId returned by submit_receipt. Strongly preferred because it binds the result to this upload instead of an earlier receipt.
withinSecondsNoFallback lookback window when submissionId is unavailable (30-3600 seconds; default 600).

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
foundYes
stateNoPresent on pending polls for a specific submission.
countsNo
messageYes
successYes
verdictNoTerminal branch only.
receiptsNo
timestampNo
submissionIdNo
spreadsheetUrlNo
reviewExpensesUrlNo
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds rich behavioral context beyond that: it explains the pending vs. terminal semantics (found:false vs. found:true), the verdict types (added, duplicate, skipped, errored), the counts and summaries returned, and that on completion the agent should show specific URLs. It also notes the tool is read-only, but since that's already in annotations, the extra behavioral details carry the weight. 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 relatively long but every sentence delivers meaningful guidance (workflow, polling, pending handling, return semantics, URLs to show, alternative tool). It is front-loaded with the core purpose. The only minor redundancy is the final 'Read-only.' which duplicates the annotation, but overall it is well-structured and dense with useful 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?

Given the tool's complexity, the description covers all necessary aspects: what it does, how to call it (submissionId and polling), what happens when pending vs. terminal, what the return values are (verdicts, counts, URLs), and when to use an alternative. There is an output schema, but the description already explains the key return semantics in a way the agent can act on. Nothing critical 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 already covers both parameters with descriptions, so the baseline is 3. The description adds value by clarifying that submissionId must be the exact ID returned by submit_receipt and that the polling interval and time allowance from that response should be used. It reinforces the relationship between the parameters and the submission workflow, slightly exceeding schema information.

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 ('Check') and resource ('authoritative final outcome of a receipt image/PDF batch submitted with submit_receipt'), making the tool's purpose immediately clear. It also explicitly distinguishes itself from the sibling get_scan_status by saying 'use get_scan_status for Gmail scans', which helps the agent differentiate without opening schemas.

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 provides explicit guidance on when to call this tool: after submit_receipt returns a submissionId, using the exact ID and polling interval from the response. It warns that a pending result is normal and should not trigger duplicate resubmission. It also names the alternative tool for Gmail scans, giving a clear exclusion condition.

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

get_mileage_summaryA
Read-only
Inspect

Mileage analytics — totals, breakdowns by month / client / purpose / category, plus deduction framing (cents-per-mile or cents-per-km × distance, country-aware IRS / CRA rates). Examples: 'mileage this year', 'miles driven for Acme', 'mileage by month', 'mileage deduction estimate', 'business miles last quarter'. Supports YoY / MoM / QoQ comparison phrasing. Returns: { message, data: { totalDistance, deductionEstimate?, breakdown?, comparison?, sampleMeta? } }.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoNatural language mileage question (e.g., 'mileage this year', 'miles driven for Acme client')
groupByNoHow to group the breakdown
dateRangeNoTime period filter. Use exactly one variant — pick the shape that matches the user's phrasing.
Behavior4/5

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

Annotations already mark the tool as read-only and non-destructive, and the description adds useful behavioral specifics: it supports grouping, YoY/MoM/QoQ comparisons, country-aware deduction rates, and an explicit return shape. This goes beyond what annotations alone provide.

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 informative without being bloated. It leads with the core purpose, gives examples, notes comparison support, and summarizes the return object in a compact form. A couple of details could be trimmed, but overall it is well-sized.

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?

There is no output schema, so the description correctly includes the return structure and optional data fields. It also covers common usage patterns and comparison flags. It does not detail edge cases like missing data or rate applicability, but it is complete enough for an agent to call the tool correctly and interpret the response.

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

Parameters3/5

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

The input schema has full parameter documentation and enums, so the baseline is 3. The description adds meaningful query examples and explains that dateRange and groupBy are natural-language-friendly. However, it says breakdowns are by client while the schema enum lists 'tag' instead of 'client', creating a slight mismatch.

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

Purpose5/5

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

The description clearly identifies the tool as mileage analytics, covering totals, breakdowns, and deduction estimates. It includes concrete example queries and a return shape, making it easy to distinguish from generic expense or income summary 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 examples and supported phrasing strongly convey the intended use cases, including common natural-language mileage questions. It does not explicitly name alternative tools or exclusion cases, but the context is clear enough for an agent to route mileage-related queries here.

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

get_monthly_books_reviewA
Read-only
Inspect

Month-end summary of the user's books for one calendar month: income recorded, money spent, net, top spending categories and merchants, plus alerts for anything unusual that month. Examples: 'how did last month go', 'close out my books for June', 'monthly review', 'what did I make and spend in May'. Defaults to the last completed month. Figures come from the user's own recorded data; advisory notes are estimates, not tax advice.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNoCalendar month in YYYY-MM format. Defaults to the last completed month.
clientEmailNoClient account email. Accountants may use this only for an accepted ExpenseBot client.
Behavior4/5

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

Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds valuable behavior beyond annotations: figures come from the user's own recorded data, advisory notes are estimates and not tax advice, and the default is the last completed month. This gives the agent useful context about the output 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 front-loaded with a precise summary, then adds usage examples, a default behavior, and an important caveat. Every sentence and phrase earns its place, and the examples are compact rather than rambling.

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?

There is no output schema, but the description enumerates the expected review contents well enough for an agent to understand what will be returned. The schema handles parameter details, and the annotations cover safety; no critical invocation detail seems missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already fully explains the period and clientEmail parameters. The description mostly restates the period default already present in the schema and adds no new parameter-level meaning, so the baseline 3 applies.

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

Purpose5/5

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

The description clearly states this is a 'Month-end summary of the user's books for one calendar month' and enumerates exactly what it returns: income, money spent, net, top categories/merchants, and alerts. This is a specific verb+resource definition that distinguishes it from narrower sibling tools like get_income_summary or get_spending_summary.

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

Usage Guidelines4/5

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

The description gives natural-language examples like 'how did last month go' and 'close out my books for June,' making the intended usage obvious. It also states the default period behavior. It does not explicitly name alternatives or exclude use cases, but the context is clear enough for an agent to select it.

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

get_per_tag_pnlA
Read-only
Inspect

Per-tag P&L — revenue, cost, profit, and margin grouped by tag (per-client, per-property, per-event, per-realtor-deal). Requires both income AND expense rows to be tagged with matching labels. Common tag-prefix shortcuts: 'Prop –' (rentals), 'Client –' (client billings), 'Wedding –' (events), 'Realtor –' (real estate deals). Examples: 'per-tag P&L this year', 'profit by client', 'profit by property', 'profit on the Smith wedding', 'per-client P&L this year vs last' (YoY). Supports YoY / MoM / QoQ comparison phrasing. Margin renders as multiplier in loss territory. Defaults to year-to-date if no date range given.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoNatural language per-tag P&L question
dateRangeNoTime period filter. Use exactly one variant — pick the shape that matches the user's phrasing.
tagPrefixNoOptional prefix to limit which tags are bucketed (e.g., 'Prop –' for properties only, 'Client –' for clients only). When omitted, all tags are included.
Behavior5/5

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

Beyond the read-only and non-destructive annotations, the description adds valuable behavioral details: the matching-tag requirement, default year-to-date behavior when no date range is given, support for YoY/MoM/QoQ phrasing, and the unusual margin-as-multiplier disclosure in loss territory. These go well beyond what the annotations already state.

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?

Every sentence serves a distinct purpose: primary definition, required preconditions, tag-prefix conventions, usable examples, supported comparisons, margin edge-case, and default. It is detailed but tightly organized 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 read-only nature, 100% schema coverage, and absence of an output schema, the description covers everything needed to select and invoke the tool: the output scope, mandatory preconditions, acceptable date ranges, and default behavior. The examples are especially helpful for an agent deciding and formulating arguments.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds meaningful extra semantics by providing natural-language examples for the query parameter, the default dateRange behavior, the tagPrefix bucketing shortcuts, and the comparison modes. It does not merely repeat 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 states a specific verb ('get') and resource ('per-tag P&L') and names the computed fields: revenue, cost, profit, and margin grouped by tag. It clearly distinguishes this from sibling tools such as get_pnl and get_income_summary by emphasizing per-tag grouping across client, property, event, and realtor-deal categories.

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 requires both income and expense rows to be tagged with matching labels, shows common tag-prefix shortcuts, gives example natural language queries, and supports comparison phrasing. It does not explicitly name a sibling 'use get_pnl instead' type exclusion, but the constraints and examples make intended usage clear.

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

get_pnlA
Read-only
Inspect

Compute Profit & Loss (P&L / net income / margin) by combining the Income tab with expense tabs. Examples: 'am I profitable this year', 'P&L for Q1', 'net income last quarter', 'what's my margin', 'P&L this year vs last' (YoY). Supports period comparison — YoY, MoM, QoQ, same-month-prev-year. Margin renders as multiplier in loss territory ('expenses 5.4× revenue') so the user gets a readable signal instead of '-436.9% margin'. Returns: { message, data: { revenue, expenses, netIncome, margin, comparison?, sampleMeta? } }.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoNatural language P&L question (e.g., 'P&L for Q1 2025', 'am I profitable')
dateRangeNoTime period filter. Use exactly one variant — pick the shape that matches the user's phrasing.
clientEmailNoClient account email. Accountants may use this only for an accepted ExpenseBot client.
Behavior5/5

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

With readOnlyHint=true and destructiveHint=false in annotations, the description adds real behavioral value: it discloses that margin is rendered as a multiplier in loss territory ('expenses 5.4× revenue') instead of a confusing negative percentage, and it documents the exact return shape. This prevents the agent from misinterpreting an unusual 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 information-dense and efficiently ordered: core operation, representative queries, period-comparison capability, and even the unusual margin formatting every sentence earns its place. The compact return structure makes the black-box behavior predictable without over-explaining.

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 there is no output schema, the description appropriately provides a return shape and even documents a surprising formatting behavior. It does not mention what happens when no dateRange is provided, however, which is relevant because all parameters are optional, and "sampleMeta?" remains unexplained.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline of 3 applies. The description's example date ranges and comparison support add context about how query and dateRange may be phrased, but the schema already carries the semantic weight for parameter shapes, especially the dateRange oneOf variants.

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+resource statement — 'Compute Profit & Loss (P&L / net income / margin) by combining the Income tab with expense tabs' — so an agent understands exactly what the tool computes. Examples ranging from 'am I profitable this year' to YoY comparisons make the tool's scope concrete and distinguish it from income-only or spending-summary 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 provides clear use contexts through query examples and explicitly names period-comparison modes (YoY, MoM, QoQ, same-month-prev-year). It does not explicitly say when NOT to use it or name an alternative like get_per_tag_pnl or get_income_summary, 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_recent_activityA
Read-only
Inspect

Show what the user (or their AI assistants) has recently done in ExpenseBot via this MCP server: which tools were called, when, with what arguments, and whether they succeeded. This is a log of assistant TOOL CALLS, not the processing history of a document. Useful for questions like 'what did I do this week' or 'which tools has my assistant run', and to give the user transparency into AI-assisted actions. Returns the most recent N entries from the audit log (default 20, max 100).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
actionIdNoOptional: filter to a single tool/action name
sinceDaysNoOnly show actions from the last N days (default 7)
Behavior4/5

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

With annotations already indicating this is read-only and non-destructive, the description adds useful behavioral context: it returns an audit log, shows arguments and success status, and caps results at the most recent N entries with a default of 20 and max of 100. This goes beyond what annotations alone communicate, though it stops short of describing pagination or exact result ordering.

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

Conciseness5/5

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

The description is concise and front-loaded with the main purpose, followed by clarifying context and intended use cases. Every sentence earns its place and 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.

Completeness4/5

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

For a simple read-only listing tool with no required parameters, the description is largely complete: it explains what entries are returned, what data each entry contains, and the default/max limit. Some details such as exact result shape or whether results are sorted newest-first are implied but not explicit, given there is no output schema.

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

Parameters3/5

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

The description adds value for `limit`, echoing the default and maximum already present in the schema. `actionId` and `sinceDays` are documented in the schema with descriptions, so the description does not need to repeat them. However, with schema coverage at 67%, the description could have reinforced the exact filtering semantics of all three parameters. Overall it is sufficient but not especially rich.

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

Purpose5/5

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

The description clearly states the tool's purpose: showing recent ExpenseBot activity by this MCP server, including which tools were called, when, with what arguments, and whether they succeeded. It also explicitly distinguishes itself from document processing history, which helps differentiate it from sibling tools like trace_document or get_last_receipt_result.

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 concrete use cases: answering questions like 'what did I do this week' or 'which tools has my assistant run', and enabling transparency into AI-assisted actions. It also excludes a common alternative interpretation by clarifying this is a log of TOOL CALLS, not document processing history, which serves as a when-not-to-use signal.

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

get_report_detailsA
Read-only
Inspect

Get full details of a specific expense report including all expenses, totals, and compliance status. Use only when the user explicitly asks to inspect an existing report's details. Never call this as a preflight or follow-up to creating, sharing, or billing from a report; those tools already return the required result and links.

ParametersJSON Schema
NameRequiredDescriptionDefault
reportIdYesThe report/spreadsheet ID
clientEmailNoClient account email. Accountants may use this only for an accepted ExpenseBot client.
userRequestYesThe user's exact request asking to inspect this report. Do not paraphrase or invent diagnostic intent.
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds useful behavioral context by disclosing the content returned (expenses, totals, compliance status), but it does not discuss any edge-case behavior or permissions. This is adequate but not rich beyond the annotations.

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

Conciseness5/5

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

Two sentences, no filler. The core purpose is front-loaded, and the negative guidance about when not to call is compressed into a tight, informative second sentence.

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

Completeness4/5

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

For a read-only retrieval tool with no output schema, the description adequately names the returned content (expenses, totals, compliance status) and gives clear routing rules. It could mention the optional clientEmail behavior, but the schema covers that, making the overall package complete enough.

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 reportId, clientEmail, and userRequest. The description reinforces the report-inspection context but adds no parameter-level meaning beyond the schema, which meets the baseline for full schema coverage.

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

Purpose5/5

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

The description uses a specific verb ('Get full details of a specific expense report') and names the exact information returned: all expenses, totals, and compliance status. This distinguishes it from sibling tools like list_reports and get_expense_by_id, so an agent can select it confidently.

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

Usage Guidelines5/5

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

The description gives an explicit trigger condition ('only when the user explicitly asks to inspect an existing report's details') and an explicit exclusion ('Never call this as a preflight or follow-up to creating, sharing, or billing from a report'). It also notes that the creation/sharing/billing tools already return their required result, preventing redundant calls.

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

get_scan_statusA
Read-only
Inspect

Check the authoritative status of the user's Gmail receipt scans. Returns the active scan lock, the same live phase and item progress shown by ExpenseBot's in-app status pill, queued or attention-needed years, completed calendar years, current merchant/category exclusions, and recent outcomes. Call when the user asks whether a scan is running, finished, stuck, or what it is doing. When complete, show the returned spreadsheetUrl or reviewExpensesUrl; when setup or reconnection is needed, show gmailScanUrl. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Behavior5/5

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

Annotations already mark the tool as read-only and non-destructive, and the description reinforces this with 'Read-only.' It adds meaningful behavioral detail beyond the annotations: the tool returns live status, queued or attention-needed years, completed years, exclusions, and recent outcomes, and explains the authoritative relationship to the in-app status pill.

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 front-loaded with the core purpose. Every sentence earns its place by explaining what is returned, when to call, and how to use the response, without 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 there is no output schema, the description lists all major return categories and explains the response URLs meaningfully. It gives enough context for an agent to interpret and act on the result without needing additional documentation.

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 the description carries no parameter burden. With no parameters to document, the description appropriately focuses on behavior and return values, which is the correct approach for parameterless tools.

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

Purpose5/5

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

States a specific verb and resource: checking the authoritative status of Gmail receipt scans. It clearly identifies the tool's scope and differentiates it from scanning or receipt-processing siblings like scan_gmail and process_gmail_receipts.

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 when to call this tool, namely when the user asks whether a scan is running, finished, stuck, or what it is doing. It also provides response guidance around which returned URL to show. It does not explicitly exclude alternative tools, but the contextual trigger is clear enough.

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

get_spending_summaryA
Read-only
Inspect

Summarize the user's recorded expenses with totals and breakdowns by category, merchant, month, tag, source, or payment method. Supports date ranges, period comparisons, and total, count, or average metrics. Read-only. Returns: { message, data: { total, breakdown?, comparison?, sampleMeta? } }.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoNatural language question (e.g., 'how much did I spend in March', 'top merchants this quarter')
metricNo
groupByNo
dateRangeNoTime period filter. Use exactly one variant — pick the shape that matches the user's phrasing.
categoriesNoOptional configured expense categories to include in the summary.
clientEmailNoClient account email. Accountants may use this only for an accepted ExpenseBot client.
Behavior4/5

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

Annotations already cover the read-only and non-destructive nature, so the description's 'Read-Only' line adds little there. However, it does disclose the return payload shape ('data: { total, breakdown?, comparison?, sampleMeta? }') and explicitly states that date ranges, period comparisons, and multiple metrics are supported, which is useful behavior beyond what annotations provide.

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

Conciseness5/5

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

Three sentences, each carrying distinct information: what the tool does, what filtering/aggregation it supports, and what it returns. There is no filler. It is front-loaded with the primary action and compactly conveys the return 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?

With 6 optional parameters, no output schema, and a natural-language `query` parameter, the description does most of what an agent needs: it states capabilities, breakdown axes, metrics, and the return shape. It does not explicitly explain how to divide responsibility between the `query` and `dateRange` parameters, but the schema already offers detailed guidance there, so this is a minor 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?

Schema description coverage is 67%; the parameters that lack descriptions appear to be `metric` and `groupBy`. The description compensates by listing the supported grouping options (category, merchant, month, tag, source, payment method) and metrics (total, count, average). It also reinforces the dateRange behavior by mentioning date ranges and period comparisons.

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: 'Summarize the user's recorded expenses,' and then enumerates the exact grouping dimensions (category, merchant, month, tag, source, payment method). The 'spending' scope clearly distinguishes this from sibling tools like get_income_summary or search_expenses.

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 aggregate expense summaries, but it provides no explicit guidance about when to choose it over financial summary siblings such as get_income_summary, get_deep_analytics, or get_pnl. There is also no when-not-to-use guidance. The usage is implied rather than stated.

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

get_spreadsheet_urlA
Read-only
Inspect

Return the user's master ExpenseBot Google Sheet plus authenticated ExpenseBot workspace links, each with a label and a description of when to use it. Use this when the user asks to open, view, check, or edit their spreadsheet; review expenses or income; manually scan Gmail; reconcile; connect or manage a bank/credit card; open Automation Hub or General Settings; create or open reports; or asks where a submitted receipt went. Choose and show the one or two links relevant to the request instead of listing the entire catalog. After a receipt submission, prefer Review expenses plus the Google Sheet. After an income write, prefer Review income plus the Sheet. For a Gmail scan or connection request, use the Scan Gmail link, which opens the existing Gmail scanning interface. Bank/card requests use the Reconcile link; configuration requests use the returned Automation Hub or General Settings link. Category, G/L, and account-code requests use Category management; client, project, and trip groups use Group management; questions about what counts as Personal use Personal rules. For client billing setup, use the returned clientBillingHandoffs instead of giving a generic dashboard tour: manageClients creates or manages the client list, tagReadyExpenses opens Review Expenses filtered to blank or default-Business rows, and createClientReport opens report creation by group after expenses have been assigned. Choose the one next step that matches the user's current state. If the user names a client and an exact expense scope and asks the assistant to do the work, use search_expenses and group_expenses instead; show its grounded preview and require explicit confirmation before changing any rows. When the user asks to choose receipt images from Google Photos, use the returned Google Photos link; it opens the existing authenticated picker and handles any required Google consent in ExpenseBot. When they ask where ExpenseBot stores receipt files, return the Drive folder link only when it is available; never invent or request a folder ID. For a complete, unambiguous cash expense or mileage trip, use the direct write tool. Use the returned Manual expense link for multiple entries, credits/refunds, detailed tax/tip entry, per diem, incomplete details, or visual review. Use the Mileage and travel link for route calculation, mileage settings, repeated trips, calendar/rideshare imports, per diem, or visual review. These links open the existing reviewed app forms. When the user wants to import income from a screenshot, PDF, or CSV but no attachment is available in chat (or the review is visually complex), use the returned Import income links — they open the existing Add Income importer, which parses the file and shows every row for review before anything is saved. Team setup requests use the returned role-aware Team setup handoff: eligible solo business owners open Add teammates, while existing team owners and co-admins open License Manager. If the handoff says owner access is required, explain that instead of presenting a broken link. Complex or visually reviewed report requests use the returned Create report link. Read-only; this tool does not create or modify spreadsheet rows.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
messageYes
successYes
reportsUrlYes
dashboardUrlYes
gmailScanUrlYes
spreadsheetIdYes
spreadsheetUrlYes
reviewIncomeUrlYes
reviewExpensesUrlYes
gmailActionNeededUrlYes
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces this with 'Read-only; this tool does not create or modify spreadsheet rows.' Beyond that, it discloses non-obvious behavioral traits: only the one or two relevant links should be shown rather than the whole catalog, the Drive folder link must not be invented ('never invent or request a folder ID'), and if a handoff requires owner access, explain instead of presenting a broken link. With annotations lowering the bar, this level of added context is excellent.

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 (a single dense paragraph) and could be improved with bullets or paragraph breaks, which would make it easier for an agent to consult. However, it is front-loaded with the core purpose and general when-to-use trigger, and nearly every sentence carries unique routing information for a handoff that touches many workflows. Acceptably sized at the upper bound, but not a model of concise prose.

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 tool with a large routing surface, the description covers an extraordinary number of cases: spreadsheet access, Gmail scans, bank reconciliation, configuration, category/group management, Google Photos, Drive-storage questions, client billing handoffs, team setup, imports, and reports. It also anticipates failure modes (using owner-access handoffs, never inventing folder IDs) and points to alternative sibling tools when a different action is required. Alongside the provided output schema, the agent has everything it needs to call and interpret this tool correctly.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to disambiguate and the schema trivially covers 100% of parameters. Per the rubric, a zero-parameter tool starts at baseline 4, and the description adds no param-related meaning because no params exist. The routing context it provides is rich, but it belongs to usage guidance rather than parameter semantics.

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

Purpose5/5

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

The first sentence states a specific verb ('Return') and resource ('master ExpenseBot Google Sheet plus authenticated ExpenseBot workspace links'), and clarifies that each link carries a label and a use-case description. This clearly frames the tool as a link-dispatch/router and distinguishes it from siblings like scan_gmail or submit_receipt, which actually perform those operations rather than returning links to them. The only minor friction is that the tool name (get_spreadsheet_url) undersells its broader role, but the description itself removes that 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?

The description is effectively a decision tree: it states explicit triggers ('Use this when the user asks to open, view, check, or edit their spreadsheet'), gives per-scenario link preferences ('After a receipt submission, prefer Review expenses plus the Google Sheet'), and names when-not-to-use alternatives ('If the user names a client and an exact expense scope..., use search_expenses and group_expenses instead'). It even distinguishes selection rules for Gmail, bank/card, category, group, and billing requests. This is the strongest possible usage guidance.

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

get_subscription_auditA
Read-only
Inspect

Subscription audit — wraps the Subscription Auditor engine to find recurring charges, duplicates, price increases, and trial-conversion suspects in the user's expenses. Examples: 'recurring subscriptions', 'duplicate subscriptions', 'price increases', 'trial conversions', 'subscriptions over $20/month'. Returns: { message, data: { recurring, duplicates, priceIncreases, trialConversions, totalMonthlyCost, sampleMeta? } }.

ParametersJSON Schema
NameRequiredDescriptionDefault
focusNoNarrow the audit to a single category (default: all)
queryNoNatural language subscription question (e.g., 'find duplicate subscriptions', 'price increases this year')
dateRangeNoTime period filter. Use exactly one variant — pick the shape that matches the user's phrasing.
Behavior4/5

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

Given the annotations already declare readOnlyHint=true and destructiveHint=false, the description's job is lighter. It adds context by explaining that the tool wraps a specific audit engine and discloses the return value shape, which helps the agent understand what the tool produces. There is 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 well-structured: it opens with the tool's purpose, gives the key capability, provides query examples, and closes with the return shape. Every sentence adds value and the most distinguishing information is front-loaded.

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

Completeness4/5

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

The description covers the main behaviors, parameter semantics are fully in the schema, and the return structure is disclosed since there is no output schema. The tool has a straightforward profile with no side effects. The only slight gap is not describing default dateRange behavior, but that is mildly important.

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

Parameters3/5

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

Schema description coverage is 100%, so all parameters already have helpful descriptions. The description adds example natural-language queries but does not substantially explain 'focus', 'query', or 'dateRange' beyond what the schema already communicates. Baseline 3 is appropriate.

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

Purpose4/5

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

The description clearly identifies the tool as a subscription audit wrapper with specific capabilities (recurring, duplicates, price increases, trial conversions). It uses a specific verb and resource and gives concrete example queries. It does not explicitly differentiate from sibling analytics tools like get_spending_summary or get_deep_analytics, so it falls just 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 Guidelines4/5

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

The examples ('recurring subscriptions', 'duplicate subscriptions', 'price increases', etc.) provide clear usage context for when an agent should invoke this tool. It does not, however, provide exclusions or point to more suitable sibling tools, so the guidance is clear but lacks explicit alternative routing.

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

get_trip_suggestionsA
Read-only
Inspect

Show ExpenseBot's current high-confidence Trip Intelligence proposals from Review Expenses. Read-only: never groups, tags, creates reports, or writes to the spreadsheet. Each proposal returns strict YYYY-MM-DD dates, evidence, locations, and the exact Receipt IDs with expected current tags. Do not infer a client/project from geography. When nextAction is present, use exactly its group_expenses params with confirm:false, show the canonical preview, then ask for explicit confirmation before any write. Never send confirm:true from this read result alone. In accountant clientEmail mode this tool can read accepted clients but may return no executable nextAction; hand off to Review Expenses or the owner's own assistant connection to apply.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum high-confidence proposals to return (default 3).
clientEmailNoClient account email. Accountants may use this only for an accepted ExpenseBot client.
Behavior5/5

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

The description goes well beyond the readOnlyHint and destructiveHint annotations by explaining strict date formatting, tagged evidence, the 'never infer client/project from geography' rule, and the mandatory confirmation flow around nextAction. There is no contradiction between the text and 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?

Though the description is dense, every sentence earns its place: scoping, return contents, inference guards, confirmation flow, and accountant handoff. The most important 'read-only' signal is front-loaded, and no filler phrasing weakens the message.

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?

Even though there is no output schema, the description enumerates what each proposal returns: strict dates, evidence, locations, receipt IDs, and expected tags. It also covers the two important edge contexts (nextAction present and accountant clientEmail mode), so the agent has enough to call the tool correctly and know what to do next.

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

Parameters3/5

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

Schema coverage is 100%, and the input schema already documents limit bounds and the clientEmail accepted-client restriction. The description adds useful contextual nuance around accountant-mode behavior, but it does not need to re-explain the parameters, and it does not add significant detail beyond the schema.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Show ExpenseBot's current high-confidence Trip Intelligence proposals.' It also states what the tool is not ('never groups, tags, creates reports, or writes to the spreadsheet'), which distinguishes it from nearby sibling tools. The scope is unmistakable even before reading the schema.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use behavior: read Trip Intelligence suggestions from Review Expenses, return proposals, and use nextAction only with confirm:false. It also gives a when-not-to-use rule in accountants mode: if nextAction is absent, hand off to Review Expenses or the owner's assistant rather than executing writes from this read result alone.

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

group_expensesA
Destructive
Inspect

Group an exact set of recorded expenses for a client, project, trip, job, or other user-named purpose. Examples: 'group my Mexico meals for client Rob', 'put these Vegas expenses under the Vegas project', or 'group these for client Rob and create a report'. The user does not need to know about tags: ExpenseBot resolves the requested name against existing groups and proposes creating one only when needed. Use exact expenseId values returned by search_expenses. A grounded preview is automatic for every bulk request; the user does not need to ask for one. First call with confirm omitted/false, show the returned exact rows, count, totals, proposed group, exclusions, and conflicts, then ask for approval. Only after explicit user approval, repeat the same operationId and selection with confirm:true. A premature confirm:true is converted to preview. When the request includes a report, set createReport:true on that confirmed group_expenses call and use its report result; do not run a separate broader create_report query. For 'without personal expenses', set excludePersonal:true; ExpenseBot removes Personal-tagged and Personal-category rows before preview so their Personal marker is never overwritten. The confirmed operation returns exact report and Bill Client links. Expenses already assigned to another ordinary report are excluded; if none remain, no duplicate report is created and the result links to Reports instead. Keep the user-facing response concise and do not add unsolicited tax or substantiation advice. Do not call check_compliance, get_report_details, or tax/deductibility tools before or after this workflow unless the user explicitly asks for that separate analysis. In user-facing prose call the destination a group, not a tag. Treat preview totals as provisional; after confirmation use only the terminal result's exact count, total, and currency without reconciling it against the preview. A returned Bill Client URL opens the reviewed billing handoff and does not mean an invoice was created, sent, or confirmed. Sharing remains a separate share_report action with recipient confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault
undoNoUndo a completed grouping within its undo window.
groupNoThe user-named destination group to apply to every eligible selected expense.
statusNoRead operation status using operationId.
confirmNoOmit/false for preview; true only after explicit approval.
selectionNoExact expenses returned by search_expenses and approved for this bounded operation.
operationIdYesStable idempotency key generated once for the preview and reused unchanged.
reportTitleNoOptional title when createReport is true; otherwise ExpenseBot derives one from the group.
createReportNoCreate a report from the exact eligible grouped expenses.
excludedTagsNoExisting groups to exclude before preview and grouping.
approveNewGroupNoTrue only when the preview says a new group is required.
excludePersonalNoExclude Personal-tagged and Personal-category expenses from both grouping and the exact report.
excludedCategoriesNoExpense categories to exclude before preview and grouping.
Behavior5/5

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

Beyond the destructiveHint annotation, the description explains crucial behaviors: a premature confirm:true becomes a preview, effective totals are provisional until the terminal result is used, the Bill Client URL is not an invoice, and Personal-tagged expenses are removed before preview. It also calls out destination naming semantics and duplicate report exclusions, giving the agent plenty of context beyond 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 earned and front-loaded with the central purpose and examples. Some sentences are dense or advisory, like directing the agent to keep a response concise, but the complexity of the operation and the many edge cases justify the length. No sentence seems wholly redundant with 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?

Given no output schema, the description needed note the return content: preview shows exact rows, count, totals, proposed group, exclusions, and conflicts, while the confirmed call returns exact report and BillClient links. It also covers auto-preview, personal expense handling, report-linked exclusions, and user approval requirements, making the overall contract complete for this complex multi-phase tool.

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

Parameters4/5

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

The schema already has descriptive parameter text with full coverage, so the baseline is 3. The description adds workflow-level meaning to key parameters such as confirm, operationId, selection, and excludePersonal, and clarifies conditional parameters like createReport and reportTitle. It does not further explain status or undo, but the schema already covers those sufficiently.

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

Purpose5/5

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

The description states a specific verb and resource: 'Group an exact set of recorded expenses' for a client, project, trip, job, or other user-named purpose, with multiple concrete examples. It also distinguishes this tool from siblings by explicitly disclaiming a separate create_report flow, so an agent can separate it from create_report, update_expense, and list_tags.

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 a precise workflow: call with confirm omitted/false for preview, show returned rows and totals, get explicit approval, then resend the same operationId and selection with confirm:true. It explicitly names alternatives and exclusions: use createReport on this call instead of running a separate create_report, do not call check_compliance or tax tools unless asked, and share_report remains separate.

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

list_categoriesA
Read-only
Inspect

List the user's configured expense categories and billing accounts. Use this BEFORE calling tools that need a category (add_cash_expense, add_mileage_entry, create_report) so you pass the user's actual category names, not guesses. Returns the live list from their spreadsheet.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Behavior4/5

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

The annotations already establish read-only and non-destructive behavior. The description adds that the data comes from the user's live spreadsheet, which communicates freshness and current configuration beyond 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 compact: it states the resource, gives a clear usage directive, and explains why it matters. Every sentence contributes meaningful information with no redundancy.

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

Completeness4/5

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

For a zero-argument, read-only list tool this description is sufficiently complete. It communicates purpose, ordering, and return source, though it could additionally describe the output shape if an agent must parse the result programmatically.

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 accepts zero parameters, so the schema already tells the agent everything needed. The baseline for a zero-parameter tool is 4, and no parameter explanation is necessary.

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 the exact verb and resource: 'List the user's configured expense categories and billing accounts.' It also clarifies that the result is live and user-specific, which helps distinguish it from list_income_categories and list_tags.

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 to call this tool BEFORE tools that need a category name and even names examples: add_cash_expense, add_mileage_entry, create_report. This gives the agent a concrete trigger condition and prevents guessing.

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

list_client_invoicesA
Read-only
Inspect

List the user's issued client invoices (accounts receivable) — who owes them money, how much, and when it is due. Examples: 'which invoices are outstanding', 'what does Acme still owe me', 'any overdue invoices', 'how much am I waiting to get paid'. status accepts 'active' (default), 'open', 'overdue', 'needs_review', 'paid', 'void', 'superseded', or 'all'. Returns invoice numbers, status, totals by currency, delivery state, and private document links. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax invoices to return (default 25, max 100).
statusNoFilter by invoice status (default active/outstanding).
clientNameNoOptional: exact client name (case-insensitive).
clientEmailNoClient account email. Accountants may use this only for an accepted ExpenseBot client.
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is known. The description adds useful behavior context beyond that: explicitly states 'Read-only', explains scope is 'user's issued client invoices', describes the returned fields (invoice numbers, status, totals by currency, delivery state, private document links), and reveals that document links are private — a nuance the agent should know. 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 front-loads the action, resource, and purpose, then flows through examples, status values, and returns. It is a single dense paragraph with every sentence earning its place. The status enum repeates what the schema already has, which is minor redundancy, but overall it's well-organised and concise without 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?

This is a simple, read-only listing tool with 0 required params and no output schema; the description compensates richly by enumerating the return payload (invoice numbers, status, totals per currency, delivery state, private document links) and giving a clear default status. Combined with 100% schema coverage for the remaining parameter semantics, there is nothing essential missing for an agent to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all four parameters (limit, status, clientName, clientEmail), including the status enum and defaults. The description lists the status options again and mentions the default 'active', which is slightly redundant with the schema but reinforces default behavior. There's no significant added parameter meaning that would raise it above the baseline 3.

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

Purpose5/5

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

The description states 'List the user's issued client invoices (accounts receivable)' — a specific verb, resource, and scope — and further clarifies with 'who owes them money, how much, and when it is due.' This clearly differentiates it from siblings like get_client_invoice (single-invoice lookup), create_client_invoice (creation), and mark_client_invoice_paid (mutation) without needing to inspect any schema.

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

Usage Guidelines4/5

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

The description gives concrete trigger queries — 'which invoices are outstanding', 'what does Acme still owe me', 'any overdue invoices' — which give an agent strong, clear context for when this tool is the right invocation for user intent. However, it doesn't explicitly name sibling alternatives or state when NOT to use this tool (e.g., a single invoice lookup should go to get_transactions).

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

list_income_categoriesA
Read-only
Inspect

List ExpenseBot's fixed income tax categories. Unlike Expense Accounts, these are not user-configured. Use this BEFORE calling add_income so you pass an exact canonical category instead of guessing.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Behavior4/5

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

Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds behavioral context beyond that: these categories are fixed, not user-configured, implying deterministic output and no custom categories, which is important for agents deciding whether to rely on this list.

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 primary action is stated in the first sentence, followed by a key distinction and clear operational guidance. Every sentence carries necessary information without 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 list tool, the description is complete: it says what the tool lists, why those entries are special, and exactly how the result should be used. No critical operational detail 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 tool has no parameters, so schema coverage is effectively 100% and most parameter-related burden is absent. The description still adds value by clarifying that the returned values are canonical strings suitable for add_income.

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 the exact verb and resource: listing ExpenseBot's fixed income tax categories. It also distinguishes these from user-configured Expense Accounts, helping the agent identify the correct tool among category-related siblings.

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

Usage Guidelines4/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: call this BEFORE add_income to obtain the exact canonical category instead of guessing. It does not explicitly enumerate alternatives or when not to use the tool, but the strong directive covers the primary decision point.

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

list_reportsA
Read-only
Inspect

List the user's expense reports with pagination. Filter by status (All, Draft, Submitted, Shared). Each exact report includes its app, Bill Client, and accounting handoff URLs. Use the matching accounting URL only when the user explicitly asks to send or export that report; the app keeps organization, mapping, preview, and final confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoOne-based results page to return.
limitNoMaximum reports to return on this page.
filterNoOptional report-status filter; All returns every authorized status.All
clientEmailNoClient account email. Accountants may use this only for an accepted ExpenseBot client.
Behavior4/5

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

Annotations already mark this as read-only and non-destructive. The description adds valuable behavioral context about the accounting handoff URLs: they must only be used when the user explicitly asks to send or export a report. This prevents incorrect invocation 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.

Conciseness4/5

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

The description is compact and front-loaded with the main purpose, then adds the URL-safety caveat. Every sentence adds useful information, though the phrasing around 'exact report' is slightly awkward.

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

Completeness4/5

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

For a simple read-only list tool with no required parameters and full schema coverage, the description covers purpose, pagination, filtering, and a critical usage caution. It does not describe the exact return format, but the tool's simplicity and annotations make this acceptable.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all four parameters. The description restates the filter enum and mentions pagination but adds no new meaning beyond what the input schema provides.

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

Purpose4/5

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

The description clearly states a specific verb ('List'), resource ('expense reports'), and core behavior (pagination, status filtering). It is distinct from sibling tools like list_client_invoices, though it does not explicitly name alternatives.

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 does not say when to use list_reports versus siblings such as get_report_details, search_expenses, or list_client_invoices. It provides a caution about accounting URLs, but no guidance on alternative tool selection.

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

list_tagsA
Read-only
Inspect

List the user's configured groups. ExpenseBot stores clients, projects, project codes, properties, and trips as tags (for example 'Client: Acme', 'Vegas Trip', or 'Property: 123 Main'). Use this when the user asks 'what groups/projects/clients do I have?' and before filtering, grouping, or reporting when the intended existing name is unclear.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, covering safety. The description adds useful context about what tags represent and when to call it, but doesn't disclose return format, ordering, or any potential quirks. With annotations covering the core behavior, this is adequate but not rich.

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

Conciseness5/5

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

Three sentences, front-loaded with the core purpose. The examples and usage condition are spaced efficiently without redundancy. Every sentence contributes value, making it concise and well-structured.

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

Completeness5/5

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

For a zero-parameter, read-only list tool with no output schema, the description is complete. It covers what the tool does, why tags matter, and when to invoke it. The annotations handle the safety profile, so nothing critical is missing for an agent to decide and call correctly.

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

Parameters4/5

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

The tool has zero parameters, so the schema provides no param details. Baseline is 4 for 0 params. The description explains the concept of tags, which is the only relevant semantic context. No additional parameter info is needed.

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

Purpose5/5

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

Clear verb+resource: 'List the user's configured groups.' It defines what groups mean (clients, projects, project codes, properties, trips) with concrete examples, distinguishing it from sibling list tools like list_categories and list_reports. The purpose is unambiguous and specific.

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 states when to use: 'Use this when the user asks what groups/projects/clients do I have?' and 'before filtering, grouping, or reporting when the intended existing name is unclear.' This gives clear context but does not name specific alternative tools or state when not to use, so a 4 is appropriate.

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

mark_client_invoice_paidA
Destructive
Inspect

Mark an issued client invoice as paid after explicit confirmation. Requires a strict calendar-valid paidDate in YYYY-MM-DD format. This updates the accounts-receivable invoice record only; it never creates or moves an Income row. Record the actual payment separately or link an existing Income row.

ParametersJSON Schema
NameRequiredDescriptionDefault
paidViaNoOptional payment method or source, such as bank transfer or check.
paidDateYesCalendar-valid payment date in YYYY-MM-DD format.
invoiceIdYesStable invoice ID from list_client_invoices.
paidAmountNoOptional amount received.
Behavior4/5

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

Given that readOnlyHint=false and destructiveHint=true, the description adds useful behavioral context by narrowing the mutation scope to only the invoice record and explicitly excluding Income-row creation/movement. It does not discuss reversibility or any additional destructive consequence of marking an invoice paid.

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

Conciseness5/5

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

Three sentences, front-loaded with the primary action and condition, then a concise and relevant side-effect clarification. No filler or repetition of schema prose.

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 4-parameter mutation with no output schema, the description covers purpose, preconditions, date format, and side effects well. The main gap is a direct pointer to the sibling tool that should be used to actually record the separate Income row.

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?

Input schema has 100% description coverage for all four parameters, so the baseline is 3. The description repeats the paidDate YYYY-MM-DD constraint but does not add meaning beyond the schema for paidVia or paidAmount.

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 ('Mark an issued client invoice as paid'), the exact resource (client invoice or accounts-receivable record), and a key scope boundary: it does not create or move an Income row. This clearly separates it from the income-creation 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 a clear precondition ('after explicit confirmation'), a strict requirement for paidDate, and a when-not-to-use rule: record the actual payment separately or link an existing Income row. It stops short of naming the specific sibling tool such as add_income, so the alternative routing is slightly implicit.

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

parse_expenseA
Read-only
Inspect

Parse a natural language expense description into structured fields. Does NOT add the expense — just returns the parsed fields for review. Example: "Lunch at Chipotle $15.50 today" → {merchant: "Chipotle", total: 15.50, ...}

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesNatural language expense (e.g., "Coffee at Starbucks $6.50 yesterday")
Behavior4/5

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

Annotations already carry readOnlyHint=true and destructiveHint=false, and the description's explicit 'Does NOT add the expense' aligns with and reinforces that safety profile. It adds behavioral value beyond the annotations by showing the return shape in the example, which matters here because there is no 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?

Three sentences with zero fluff: purpose, negative-scope disclaimer, and an example. The most decision-relevant information ('Does NOT add the expense') is front-loaded right after the verb, and every sentence earns its place.

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

Completeness4/5

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

For a one-parameter read-only parser, the description covers what, why, and what not, with a worked example. The only meaningful gap is that no output schema exists and the example shows a partial field set with an ellipsis, so an agent cannot know the full set of returned fields or edge-case behavior, such as an unparseable string.

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

Parameters4/5

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

Schema coverage is 100% for the single text parameter, establishing a baseline of 3. The description adds meaning beyond the schema by demonstrating an input-to-output transformation (a full natural-language phrase mapping to structured fields), which clarifies what form of 'text' is expected.

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 ('Parse a natural language expense description into structured fields') and immediately clarifies the tool's non-goal ('Does NOT add the expense'), which separates it from the many add_*/submit_* siblings in the list. The concrete worked example ('Lunch at Chipotle $15.50 today' → {merchant...}) leaves 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?

The phrase 'just returns the parsed fields for review' implicitly tells an agent this is a preview/parse step rather than a recording step, which helps an agent decide between parse_expense and add_cash_expense/submit_receipt. It stops short of a 5 because no alternative tool is named explicitly, so the routing is implied rather than stated.

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

prepare_client_invoiceAInspect

Prepare a client invoice from a saved ExpenseBot report without creating it. Reads canonical report rows, allocates a unique invoice number, verifies the client ledger identity and advance, and returns exact totals plus a short-lived preparationId. Call this first, show the preview to the user, then call create_client_invoice after explicit confirmation. It reserves the invoice number and preview for 30 minutes but creates no invoice, document, Income row, email, or payment.

ParametersJSON Schema
NameRequiredDescriptionDefault
taxPctNoTax percentage applied after markup and custom line items; use 0 for no tax.
reportIdYesSaved ExpenseBot report ID to invoice.
taxLabelNoTax label such as HST, GST, or VAT.
issueDateYesCalendar-valid invoice date in YYYY-MM-DD format.
markupPctNoMarkup applied only to rebilled expense rows.
clientNameYesFull client or business name shown on the invoice.
receiptIdsNoOptional exact report receipt IDs. Defaults to every current report expense.
billToEmailNoOptional client email printed on the invoice. This does not send email.
paymentTermsNoInvoice due terms. Defaults to the client's billing profile or net30.
clientAddressNoOptional billing address printed in the invoice's Bill To section.
invoiceNumberNoOptional custom invoice number. ExpenseBot allocates one when omitted.
advanceAppliedNoVerified client advance to apply against this invoice.
customLineItemsNoOptional fee/service lines. They are taxed but never marked up.
mentionSupportingReceiptsNoWhen true, note on the invoice that supporting receipts are available.
Behavior5/5

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

While annotations show readOnlyHint=false and destructiveHint=false, the description adds crucial behavior beyond the schema: it reserves an invoice number/preview, creates no final artifacts, and returns a short-lived preparationId. This disambiguates the side-effect picture even with the annotations present.

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

Conciseness5/5

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

Three sentences cover the operation, the workflow, and the exact side-effect boundaries. Every clause carries critical information; no filler or repetition beyond the intentional emphasis on non-creation.

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 14-parameter tool with 100% schema coverage and no output schema, the description supplies the necessary override purpose, the sequencing, the time limit, and the key return values (exact totals, preparationId). Nothing required to invoke or orchestrate 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 input schema already has 100% description coverage for all 14 parameters, so the baseline is 3. The description provides useful high-level context about validating the client ledger and reserve but adds no per-parameter semantics beyond the schema.

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

Purpose5/5

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

The description explicitly identifies the verb ('prepare'), the resource ('client invoice from a saved ExpenseBot report'), and the key constraint ('without creating it'). It clearly distinguishes itself from the sibling create_client_invoice, which an agent needs to call this and later call the create 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?

It gives explicit workflow guidance: 'Call this first, show the preview to the user, then call create_client_invoice after explicit confirmation.' It also clarifies the reservation window ('30 minutes') and what is not created, preventing misuse.

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

process_gmail_receiptsAInspect

Process specific Gmail emails as receipts. Pass Gmail message IDs and they'll be converted to PDF, extracted by AI, and added to the user's expense spreadsheet. Max 25 emails per request. Requires Gmail to be connected in ExpenseBot settings.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailIdsYesGmail message IDs to process as receipts
accountEmailNoOptional: which Gmail account to use (for users with multiple linked accounts)
Behavior4/5

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

The description goes beyond annotations by explaining the side effects: emails are converted to PDF, extracted by AI, and added to the expense spreadsheet. It also sets expectations with the 25-email cap and prerequisite. It does not cover outcomes like duplicate handling or whether emails are modified.

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

Conciseness5/5

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

Four short sentences that front-load the core purpose, then give the call pattern, limits, and prerequisite. No fluff or redundant restating of the tool name or 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?

Covers the core behavior, input scope, practical limit, and the key prerequisite, which is enough for an agent to understand how to call the tool. However, given there is no output schema, it would be stronger to mention how the agent can check the result, such as a return value or linking to a related status tool.

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

Parameters3/5

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

Input schema already covers both parameters with 100% description coverage, so the description does not need to repeat schema details. It adds the request limit of 25 emails, which is useful, but doesn't deeply explain parameter semantics beyond what the 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?

States a specific operation: process specific Gmail emails as receipts, and describes the full pipeline (convert to PDF, extract with AI, add to expense spreadsheet). This clearly differentiates it from scanning siblings like scan_gmail or scan_gmail_years.

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: pass Gmail message IDs, limited to 25 per request, and requires Gmail connection in ExpenseBot settings. It does not explicitly name alternatives like scan_gmail or state when not to use this tool, 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.

request_accounting_integrationAInspect

Request support for an accounting package only after checking ExpenseBot's reviewed direct and import-file destinations and finding no matching package. Do not use this for a listed or Beta destination, a general compatibility question, or without the exact package name. This is a confirmation-gated write: after the user approves, it creates one deduplicated request bound to the authenticated ExpenseBot account and emails ExpenseBot's internal team. It does not create an integration or make the requested package immediately available. On accepted or previously recorded requests, tell the user ExpenseBot will email them within one week with an update.

ParametersJSON Schema
NameRequiredDescriptionDefault
packageNameYesExact accounting package requested by the user.
Behavior5/5

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

The description fully discloses behavioral traits beyond the annotations. It states the user must approve before action (confirmation-gated), it creates a deduplicated request, it does not create an integration or make the package immediately available, and it emails ExpenseBot's internal team. It also explains what to tell the user on accepted or previously recorded requests (one-week email update). The annotations provide structural hints but the description's transparency is rich and decisive.

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 dense but not verbose. It front-loads the critical condition (check destinations first) and then explains the action, the non-effect, and the follow-up. Every sentence is functional and no content is wasted. Minor suggestion: could be a touch more compact, but it's strong.

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

Completeness5/5

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

Despite no output schema, the description is self-contained and fully describes the expected behavior, what to the user, and the temporal after-effect. The agent can correctly invoke it and also know what to tell the user. Given the one-parameter tool and multiple interaction steps, this is complete.

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

Parameters4/5

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

Schema coverage is 100%, so the annotation baseline is 3. The description adds meaningful constraint on the packageName: it must be the exact package name. The description also implies the parameter must be a tested-for package, and the 'exact' requirement is important. This rises slightly above baseline.

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

Purpose5/5

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

The description clearly identifies the tool's purpose: request support for an accounting package that is not already a reviewed destination. It specifies the exact action (creating a deduplicated request bound to the authenticated account and emailing the internal team) and distinguishes it from actually creating an integration.

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 provides explicit usage conditions: only use after checking ExpenseBot's reviewed direct and import-file destinations and finding no matching package. It also says when NOT to use it (listed/Beta destination, general compatibility question, without exact package name). This provides clear decision guidance.

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

scan_gmailAInspect

Trigger a background Gmail scan to discover and process receipt emails from the last ~60 days (default). Runs asynchronously — returns immediately, user gets an email summary when done. Like clicking "Find Receipts in Gmail" in the UI. For whole PAST YEARS (e.g. 2023, or 2020-2022) use scan_gmail_years instead; to check a scan's progress use get_scan_status.

ParametersJSON Schema
NameRequiredDescriptionDefault
endDateNoOptional: explicit end date (YYYY-MM-DD)
startDateNoOptional: explicit start date (YYYY-MM-DD) instead of lookbackDays
accountEmailNoOptional: which Gmail account to scan
lookbackDaysNoHow many days back to scan (default 60, max depends on subscription)
Behavior4/5

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

The description adds valuable behavioral context beyond annotations: it run asynchronously, returns immediately, and delivers a summary email when complete. It does not contradict annotations. It could go further by explaining what 'process receipt emails' concretely does to the user's data, but the asynchronous behavior and notification mechanism are well covered.

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 and well-structured: it states the action, default scope, async behavior, UI analogy, and relevant alternatives in four short sentences. No sentence is wasted or 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?

For a complex async tool with no output schema, the description sufficiently explains what will happen, what the user can expect, and how to follow up. It names the relevant sibling tools for progress-checking and long-range scans, making the complete enough for an agent to act 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?

Input schema coverage is 100%, so the schema already describes all four optional parameters clearly. The description adds a small amount of semantic context around the default range and year-scale usage, but does not meaningfully expand parameter understanding beyond what the schema already provides.

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

Purpose5/5

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

The description clearly states the specific action: triggering a background Gmail scan to discover and process receipt emails over a default ~60-day window. It distinguishes this tool from scan_gmail_years and get_scan_status by naming exactly what those alternatives are for.

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 gives explicit usage guidance: use this for recent receipts by default, use scan_gmail_years for whole past years, and use get_scan_status to check progress. This routes the agent to the correct sibling tools without leaving the decision to inference.

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

scan_gmail_yearsAInspect

Scan one or more COMPLETED PRIOR years of the user's Gmail for receipts (e.g. years:[2023] or years:[2020,2021,2022]). Long-running background job: the first eligible year starts immediately and the rest queue, running one at a time (each full year typically takes a couple of hours; the user can close the app). ALWAYS call first WITHOUT confirmStart to preview which years are eligible, then ask the user to confirm, then call again with confirmStart:true. For receipts from the last ~60 days use scan_gmail instead. To check how a scan is going, use get_scan_status. The current in-progress year cannot be year-scanned.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearsYesCompleted prior years to scan, e.g. [2020, 2021]. Max 10.
accountEmailNoOptional: which connected Gmail inbox to scan (multi-inbox users). Defaults to the primary.
confirmStartNoOmit or false = preview only (no scan starts). Must be exactly true to start scanning.
Behavior5/5

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

The description adds substantial behavioral detail not present in annotations: the job is long-running, eligible years start immediately while others queue one at a time, each year can take hours, and the user can close the app. It also warns that the current in-progress year cannot be year-scanned. This goes well beyond the readOnlyHint and destructiveHint 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?

Every sentence earns its place: main purpose, queuing behavior, two-step call protocol, alternative tools, and a constraint. The most important workflow instruction appears early and the description stays tight despite covering a complex long-running 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?

The description fully covers what an agent needs to call this tool correctly: what it scans, how to preview before actually starting, how the queue behaves, how long it may take, and how to check status afterward. Given the annotations and schema coverage, nothing important 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 100%, so the schema already documents all parameters. The description adds meaningful semantic value by explaining the confirmStart preview-versus-start workflow, giving examples for years, and clarifying that the operation needs confirmation. It doesn't dwell on accountEmail, but that parameter is already well-described 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 states exactly what the tool does: scan completed prior years of the user's Gmail for receipts. It also differentiates this tool from scan_gmail, which handles the last ~60 days, so an agent can tell them apart.

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

Usage Guidelines5/5

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

It gives explicit workflow guidance: call without confirmStart first to preview eligible years, ask the user, then call again with confirmStart:true. It also states when to use scan_gmail instead and when to use get_scan_status, eliminating ambiguity about alternatives.

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

search_expensesA
Read-only
Inspect

Search and filter the user's expenses. Returns matching expense rows from their spreadsheet. Filter by category, merchant, date range, amount, or tags. Results are paginated: when hasMore is true, call again with nextCursor and the same filters. Do not split a date range into repeated overlapping searches.

Use the optional query parameter for deterministic natural-language recall over merchant, city/location, Notes (including receipt items, delivery source, payer, and Business purpose), Tag, and category. Each matching result includes matchedFields and a short matchReason so you can explain why it was selected. When several rows plausibly match, a disambiguation list is returned; each option carries the exact expenseId. Structured filters (categories, merchants, dateRange, tags, minAmount, maxAmount) combine with the query using AND semantics. Each result includes expenseId, the exact durable Receipt ID required by update_expense.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoFilter by tags
limitNoResults per page (default 20, maximum 50)
queryNoOptional natural-language recall over the user's existing expense fields (merchant, city/location, Notes including receipt items, delivery source, payer, and Business purpose, Tag, category). Deterministic case-insensitive matching — no embeddings or model classifiers. Combine with structured filters using AND semantics. Examples: 'Tribeca restaurant', 'Bodewell project hardware store', 'client dinner note'.
cursorNoOpaque nextCursor returned by the previous search_expenses page. Reuse the same filters; never construct or edit this value.
dateRangeNoTime period filter. Use exactly one variant — pick the shape that matches the user's phrasing.
maxAmountNoMaximum expense amount
merchantsNoFilter by merchant names (e.g., ['Uber', 'Starbucks'])
minAmountNoMinimum expense amount
categoriesNoFilter by expense categories (e.g., ['Travel', 'Meals'])
hasReceiptNoWhen true, return only expenses with a receipt link. When false, return only expenses without one.
clientEmailNoClient account email. Accountants may use this only for an accepted ExpenseBot client.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesRows matched by the filters.
totalYesSum of the matched set in home currency.
hasMoreNo
messageNo
expensesYesMatching expense rows, newest first, paginated.
pageInfoNo
nextCursorNoOpaque signed continuation; reuse with identical filters.
queryAppliedNo
totalMatchedNoPresent for free-text searches.
Behavior5/5

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

The description goes well beyond the readOnlyHint/destructiveHint annotations by disclosing pagination semantics, deterministic natural-language matching, AND-combination of structured filters, disambiguation behavior, and the fact that each result includes an exact durable Receipt ID needed by update_expense. It also warns against splitting date ranges and constructing cursors, which helps agents avoid known misuse.

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 efficient: the first sentence states the core purpose, and each subsequent clause adds necessary behavior or important operational constraints. Avoidable redundancy is minimal, and the length is justified by the complexity and the number of behaviors an agent must know to call the tool correctly.

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 — 11 parameters, pagination, disambiguation, mixed structured and natural-language filtering — the description covers all critical aspects: pagination flow, cursor reuse, AND semantics, deterministic recall, and the significance of expenseId/Receipt IDs. The output schema exists, so it need not describe exact return formats, and the description still goes beyond the schema to cover usage pitfalls.

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

Parameters3/5

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

The input schema already has 100% description coverage, so the baseline is satisfied by the schema. The tool description mostly summarizes or restates filter semantics already present in the schema, such as the query combining with structured filters via AND and the pagination cursor behavior. Because the description adds little new meaning beyond the schema's rich per-parameter descriptions, it earns the baseline but not more.

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 specific operation: 'Search and filter the user's expenses' and explicitly says it returns matching expense rows from their spreadsheet. This clearly distinguishes it from add, update, report, and tax-related sibling tools. The scope is precise: it is for retrieving already-recorded expenses, not for creating or modifying 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 concrete usage instructions: paginate with hasMore/nextCursor, reuse the same filters, do not split a date range into overlapping searches, and expect a disambiguation list when multiple rows plausibly match. It does not explicitly name alternatives or when-not-to-use conditions, but the context and procedural guidance are clear enough to guide an agent.

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

search_knowledgeA
Read-only
Inspect

Search ExpenseBot's complete product and help knowledge base. Use this before guessing when the user asks how a feature works, what ExpenseBot supports, or needs setup, billing, Gmail, scan, report, workflow, or troubleshooting instructions. Set fullAnswer:true on the first call when the user asks for complete, detailed, or step-by-step instructions. Use the default excerpt mode for discovery and quick answers; if an excerpt is truncated, call again with fullAnswer:true before presenting complete instructions. Each result has a stable id.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of ranked matching articles to return (1-10).
queryYesSearch terms
fullAnswerNoSet true on the first call for complete, detailed, or step-by-step instructions. Leave false for discovery or quick-answer excerpts.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
successYes
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the read-only behavior is known. The description adds value beyond annotations by explaining the excerpt-vs-fullAnswer behavior, the truncation retry guidance, and that results are stable. These are meaningful behavioral details, though it doesn't touch on any edge cases or 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 description is concise, front-loaded with the primary purpose, and every sentence earns its place. It covers what, when, and how to advance detail level without repetitive or filler content. The distinction between 'discovery'' and 'complete instructions' is compact and clear.

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 a read-only annotation, an output schema, and 100% schema parameter descriptions, the structure already carries a lot. The description completes the remaining decisions: when to use it, how to get full answers, when to retry, and the stability property. No significant gap remains for the agent.

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

Parameters4/5

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

Schema coverage is 100% and the schema already documents query, limit, and fullAnswer. The description adds semantic value by contextualizing fullAnswer: set true on the first call when complete/detailed instructions are needed, and use excerpt mode for discovery. This gives agents a decision rule beyond the schema's bare default of false.

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

Purpose5/5

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

The description names a specific action and resource: 'Search ExpenseBot's complete product and help knowledge base.' It enumerates typical use categories (setup, billing, Gmail, scan, report, workflow, troubleshooting), which makes the tool's purpose unambiguous and clearly sets it apart from expense-search siblings like 'search_expenses' or the more generic 'search'.

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 before guessing when the user asks how a feature works, what ExpenseBot supports, or needs setup, billing, Gmail, scan, report, workflow, or troubleshooting instructions.' It also distinguishes between excerpt mode and fullAnswer mode with a retry rule. However, it does not explicitly say when NOT to use it or name sibling alternatives, 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.

send_report_to_accountingAInspect

Review and then post an ExpenseBot report to the owner's accounting destination. STEP 1: call with provider, reportId, and optional mode/mappings, without confirm. The server reads the live report and destination, applies Omit/Personal/split/date/currency rules, checks Zoho bank-feed matches, and returns the complete proposal plus proposalId. NOTHING is posted in step 1. Show the complete proposal and ask for approval. STEP 2: call with only provider, proposalId, and confirm:true. The server posts only the frozen, account-bound proposal, revalidates live state, and rejects changed reports or mappings. Never add mapping fields to the confirmation call. Owner accounts only; acting for a client is not supported. Agent-driven posting is currently available only for Zoho Books (zoho_books); QuickBooks Online, Xero, Wave, and FreeAgent are intentionally not accepted by this tool yet because their previews cannot freeze/revalidate the canonical provider plan that shareReport executes. Use those providers' web flows until they satisfy the full push contract.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoStep 1 only (Zoho Books): automatic document treatment, paid expenses, or bills.
confirmNoStep 2 only: true posts the exact staged proposal. No other options may change.
providerYesAccounting destination provider. Agent-driven posting is currently available only for Zoho Books.
reportIdNoStep 1 only: ExpenseBot report ID owned by the signed-in account.
proposalIdNoStep 2 only: proposalId returned by the read-only preview.
forceRepushNoStep 1 only: explicitly include disclosed uncertain prior outcomes in the frozen proposal.
taxMappingsNoStep 1 only: observed tax-rate string to live destination tax ID overrides.
accountMappingsNoStep 1 only: ExpenseBot category to live destination account ID overrides.
reportingTagMappingsNoStep 1 only: ExpenseBot tag to live destination reporting-tag option.
Behavior5/5

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

The description fully discloses behavioral traits: it explicitly says 'NOTHING is posted in step 1' and that step 2 'revalidates live state, and rejects changed reports or mappings,' covering failure modes. It also explains the provider restriction rationale (previews cannot freeze/revalidate). Annotations are minimal (readOnlyHint false, openWorldHint true), but the description carries the burden well, providing far more transparency than the annotations alone.

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

Conciseness5/5

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

The description is well-structured with clear STEP markers, front-loading the purpose and then detailing the workflow. Every sentence adds value, including the limitation about other providers and the rationale. No redundant or filler sentences exist. It is appropriately detailed for a complex two-step tool without being verbose.

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 (9 parameters, nested objects, two-step flow, provider restrictions), the description is remarkably complete. It covers all critical aspects: the step-by-step workflow, what happens in each step, constraints, and alternatives. Even without an output schema, the description tells the agent what to expect (a proposal with proposalId) and the confirmation behavior. Nothing an agent needs to use 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?

Even though schema coverage is 100%, the description adds essential meaning by categorizing each parameter by step (e.g., 'Step 1 only', 'Step 2 only', 'Step 2 only: true posts the exact staged proposal') and explaining behavior (e.g., mode options, forceRepush for uncertain outcomes). This context is not derivable from the schema alone. The description effectively explains the two-phase usage of parameters, which is critical for correct invocation.

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

Purpose5/5

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

The description clearly states the tool's core function: 'Review and then post an ExpenseBot report to the owner's accounting destination.' It identifies the specific resource (ExpenseBot report) and the action (review and post), and the two-step process differentiates it from sibling tools like share_report or export_report. The title also reinforces the purpose, making it unambiguous for an agent.

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

Usage Guidelines5/5

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

The description gives explicit step-by-step instructions: STEP 1 (preview without confirm) and STEP 2 (confirm with proposalId), including what to do after each step ('Show the complete proposal and ask for approval'). It also clearly states when NOT to use the tool (other providers, non-owner accounts, client actions) and directs to alternatives ('Use those providers' web flows'). This is exemplary usage guidance.

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

share_reportA
Destructive
Inspect

Share one existing expense report after confirmation. Default to reviewer: they can open and edit that report's Google Sheet, inspect receipts, comment, approve, or request changes, but cannot act for the owner or use accounting integrations. Use accountant only when the user explicitly asks for ongoing accounting access; it creates the established accountant relationship and broader report-management workflow.

ParametersJSON Schema
NameRequiredDescriptionDefault
reportIdYes
recipientsYes
recipientRoleNoUse reviewer for report-only approval. Use accountant only for explicit ongoing accountant access.reviewer
Behavior5/5

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

Annotations flag destructiveHint=true and openWorldHint=true, and the description meaningfully enriches this by adding 'after confirmation,' enumerating what the reviewer can and cannot do ('can open and edit that report's Google Sheet... cannot act for the owner or use accounting integrations'), and disclosing that the accountant option 'creates the established accountant relationship.' This is far beyond what annotations alone convey. 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?

Three sentences, each earning its place: the core operation and confirmation gate, the default role's capabilities and limits, and the alternative role's trigger condition and persistent consequence. The key decision (reviewer by default) is front-loaded, and 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 destructive, open-world tool with no output schema, the description covers the essential behavioral ground: confirmation requirement, role permissions, exclusions, and the accountant relationship side effect. Minor gaps remain — how recipients are notified and what the return/result of the share operation looks like — but nothing critical to 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?

Schema description coverage is only 33%, so the description must compensate. It does so thoroughly for recipientRole by explaining each enum value's capabilities and side effects, and it qualifies reportId as 'existing.' However, the recipients parameter is never explicitly described — its meaning is only implied by 'Share.'

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 — 'Share one existing expense report' — and clarifies the exact scope of the operation. It further differentiates the two sharing modes (reviewer vs. accountant), which maps cleanly onto the recipientRole enum and helps distinguish this tool from siblings like send_report_to_accounting.

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 selection guidance: 'Default to reviewer' for standard sharing, and 'Use accountant only when the user explicitly asks for ongoing accounting access.' This tells the agent exactly when to pick each role and flags the persistent consequence of the accountant choice, leaving little to inference.

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

submit_receiptAInspect

Submit a photo or PDF of a receipt for processing. Covers requests phrased as 'log this', 'log this receipt', 'save this receipt', 'expense this', or 'add this to my expenses', including when the user simply shares a photo of a receipt or invoice. The receipt image is validated, uploaded to cloud storage, and processed by AI to extract vendor, amount, date, tax, and category. The expense appears in the user's spreadsheet in about 1-3 minutes, and longer for PDFs or large batches. Handles images and PDFs, mixed together in one batch.

TO SEND FILES (preferred, and required for PDFs): call this tool with filesToUpload listing every file the user gave you. It returns one signed upload URL per file. Upload them ONE AT A TIME with an HTTP PUT, telling the user which file you just finished and how many remain, then call this tool ONCE with uploadRefs for all of them — that processes the whole set as a single batch, like the ExpenseBot web app. Do not call this tool once per file.

Use the photo parameter for one image or PDF attached in ChatGPT. MCP clients that cannot supply file references may use photoBase64 for one small image; use the upload flow for large files or batches.

Optional note and tag values use the same receipt metadata path as ExpenseBot's camera, file uploader, and forwarded-email intake. The note is stored in the Notes column (L); the tag is stored in the Tag column (K). Batch defaults apply to every file, and each uploadRefs item may override either value for that file.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoBatch-level project or client tag applied to every expense row. Individual files may override it. Stored in the Tag column (K) through the same path as the web receipt uploader.
noteNoBatch-level context note applied to every file in the upload. Individual files may override this with their own note. Stored through the existing receipt-note pipeline in the Notes column (L).
photoNoSingle attached receipt image or PDF supplied by ChatGPT. For multiple files or large files, use filesToUpload and uploadRefs instead.
filenameNoOptional filename (e.g., 'lunch_receipt.jpg')
mimeTypeNoMIME type of the file (default: image/jpeg)
uploadRefNoSingle-file shorthand for uploadRefs. Use uploadRefs when there is more than one file.
uploadRefsNoSubmit previously uploaded files as ONE batch. Include every uploadRef from the filesToUpload step. If any file fails validation the whole batch is rejected and nothing is processed.
photoBase64NoLegacy fallback for MCP clients that send one small image as complete base64 data. ChatGPT should use photo or uploadRefs instead.
filesToUploadNoRequest upload URLs for one or more files. Include EVERY file the user provided in a single call. Returns one signedUrl + uploadRef per file; upload each, then call this tool again with uploadRefs.
Behavior5/5

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

While annotations indicate readOnlyHint=false and destructiveHint=false, the description goes far beyond that by explaining validation, cloud upload, AI extraction, and the fact that the expense appears in the user's spreadsheet in 1-3 minutes. It also discloses batch rejection behavior (if any file fails validation, the whole batch is rejected and nothing is processed). This gives an agent a realistic model of what will happen after invocation and how to set user expectations.

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: it begins with the core purpose, then lays out the preferred upload flow, then covers single-photo and fallback paths, and closes with metadata behavior. Some redundancy exists with the already-detailed schema, but the length is justifiable given the complexity of the two phase upload workflow, nine parameters, and the lack of an output 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 tool without an output schema and with a complex multi-step upload protocol, the description is nearly fully self-contained: it defines the initial filesToUpload call, the upload actions, the final uploadRefs call, batch rejection behavior, and where note/tag values are stored. It also explains which input parameter to choose for each file and client variant, making 'how to invoke this safely and correctly' very clear. No additional external contract instructions seem 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?

Input schema has 100% per-parameter description coverage, and the schema itself is extremely detailed. The description still adds useful operational semantics beyond the schema, such as the one-at-a-time HTTP PUT upload, the instruction to announce file progress, and the requirement to call the tool once with all uploadRefs, which slightly exceeds the schema's own wording. It doesn't reach 5 because many parameter details in the description are effectively restatements of what the schema already documents.

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: 'Submit a photo or PDF of a receipt for processing.' It then lists exact user phrasings ('log this', 'save this', 'expense this') that this tool should handle, which makes it distinguishable from siblings like add_cash_expense or add_income_from_file. It clearly positions itself as the receipt-image/PDF intake tool rather than a manual expense entry or Gmail scanning 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 when-to-use and when-not-to-use instructions: filesToUpload is preferred and required for PDFs, photo is for a single ChatGPT attachment, photoBase64 is only a fallback, and the user is told never to call the tool once per file. It also explains when to call the tool a second time with uploadRefs and what batch semantics apply, so an agent knows exactly how and when to invoke this tool in its workflow.

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

trace_documentA
Read-only
Inspect

Trace what happened to a specific receipt, invoice, forwarded email, Gmail receipt, or PDF in ExpenseBot processing. Use when the user asks where a document went, why it did not show up, whether it was skipped, routed to income, deduped, or removed as a duplicate. Returns a read-only timeline from the user's lineage audit trail.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoHow many days back to search.
limitNoMaximum lineage events to return.
queryNoMerchant, sender, subject, invoice number, or phrase to search for, e.g. 'Blue Rocket', 'Driversnote', 'Uber receipt'.
outcomeNoOptional processing outcome filter.all
threadIdNoGmail thread ID if known.
messageIdNoGmail message ID if known.
receiptIdNoExpenseBot receipt/invoice ID if known, e.g. IR-123, RO-abc, RR-456.
Behavior5/5

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

The description discloses that the tool is read-only and returns a timeline from the user's lineage audit trail, which goes beyond the annotations by describing the response nature. This is useful behavioral context consistent with readOnlyHint and 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 concise: three purposeful sentences that define the action, clarify trigger scenarios, and state the return type. It is front-loaded with the verb and resource, making it easy to scan.

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

Completeness4/5

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

The description gives good context for a Tool with all-optional parameters and no required inputs. It states the return type and the intended use case. A slightly more detailed description of the timeline output could help further, but it is otherwise complete for invocation purposes.

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

Parameters3/5

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

Schema description coverage is 100%, so the input schema already documents all seven optional parameters. The description adds no parameter-specific details, but baseline 3 is appropriate because the schema carries the semantic load effectively.

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

Purpose5/5

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

The description clearly states the tool traces the processing history of receipts, invoices, emails, and PDFs in ExpenseBot. It names concrete outcomes such as skipped, routed to income, deduped, or removed as duplicate, which makes its scope distinct and immediately understandable.

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

Usage Guidelines4/5

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

The description explicitly says to use this tool when the user asks where a document went, why it did not appear, or whether it was skipped. It does not explicitly name excluded cases or alternate sibling tools, but the stated use conditions are specific and unambiguous.

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

update_expenseA
Destructive
Inspect

Update a single existing expense row's category, tag, merchant, or business purpose (e.g. 'recategorize expense X to Meals' or 'tag it Client – Acme'). Identify it only by the exact expenseId returned by search_expenses (the full Receipt ID from Column Q). Never use a date, displayed number, or sheet row number as expenseId. Two-phase operation: calls with confirm omitted or false return a preview of the current→proposed change and make no change. After user confirmation, a call with confirm:true applies the proposed change. Only category/tag/merchant/businessPurpose are editable — amounts, dates, and notes are not editable via the assistant. Does not create or delete rows.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsYesPartial update object. Include one or more of these optional keys; omit every field that should remain unchanged.
confirmNoOmit or false = preview only (no write). Must be exactly true to apply the change.
expenseIdYesExact full Receipt ID from Column Q, returned as expenseId by search_expenses.
Behavior5/5

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

The description goes well beyond annotations by explaining the two-phase operation: confirm omitted or false returns a preview with no change, and confirm:true applies the change. It also makes explicit constraints ('Only category/tag/merchant/businessPurpose are editable', 'does not create or delete rows'). This gives the agent a precise mental model of the side effects, while destructiveHint is true, so the extra transparency is valuable.

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 dense but every sentence adds information: the resource, the ID requirements, the two-phase preview, the editable fields, and exclusion of create/delete. It is front-loaded with the core purpose. It is longer than typical but each clause earns its place given the tool's mutating behavior and confirmation flow.

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 three parameters, no output schema, and a complicated two-phase flow, the description is complete. It tells the agent exactly how to invoke it (with/without confirm), what can be changed, what cannot be changed, and what ID to use. Nothing essential is missing for a correct call.

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 100% of parameters with descriptions, including partial update semantics for fields and the confirm boolean. The description adds crucial context beyond the schema: expenseId must be the exact full Receipt ID from Column Q returned by search_expenses, and it warns against using a date, displayed number, or sheet row number. That elevates it above the baseline 3.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Update a single existing expense row's category, tag, merchant, or business purpose.' It then immediately clarifies the exact ID required and explicitly says it does not create or delete rows, distinguishing it from sibling add/delete tools. This gives a precise, unambiguous purpose.

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 provides explicit guidance: identify the expense only by the exact expenseId from search_expenses, never by date/displayed number/row number. It also states the two-phase confirmation workflow and which fields are editable (category/tag/merchant/businessPurpose) with a clear warning that amounts, dates, and notes are not editable. It even notes that it does not create or delete rows, so an agent knows when not to pick it.

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

whatif_affordA
Read-only
Inspect

Can I afford $X/month? Recomputes the user's Safe Monthly Draw (how much they can safely pay themselves) with an added recurring monthly cost, and returns a yes/tight/no verdict plus the before/after numbers. Use for questions like 'can I afford a $500/mo hire' or 'what if I add a $200/mo software subscription'. Requires at least 3 months of income history — otherwise returns insufficient_data rather than a guess.

ParametersJSON Schema
NameRequiredDescriptionDefault
deltaMonthlyYesThe new recurring monthly cost being considered, in the user's home currency
Behavior5/5

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

The description goes well beyond the readOnlyHint annotation by clarifying that it recomputes a derived figure, does not guess/change state, and returns a verdict with before/after numbers. It also highlights a meaningful boundary condition: at least 3 months of income history is required, otherwise it returns insufficient_data. This is strong behavioral transparency for a read-only what-if tool.

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

Conciseness5/5

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

Three sentences each earn their place: first states the core behavior and return values, second gives explicit use cases, third states the necessary data condition. The description is front-loaded and contains 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 a single parameter, no output schema, and strong annotations, the description still covers the key execution context: what is computed, what is returned, example use cases for determining applicability, and an important precondition with its failure mode. This is complete enough for choosing and safely invoking the tool.

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

Parameters3/5

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

The schema already fully describes the single parameter (deltaMonthly, number >= 0, 'The new recurring monthly cost being considered, in the user's home currency'). The description repeats 'recurring monthly cost' but adds no meaning beyond the schema, which already has 100% coverage. The baseline of 3 is appropriate when parameter semantics are handled by 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 states a specific action ('Recomputes the user's Safe Monthly Draw') and a clear resource/input (an added recurring monthly cost), and clearly defines the return value ('yes/tight/no verdict plus before/after numbers'). This clearly distinguishes it from siblings like whatif_client and whatif_tax_setaside, which involve different what-if scenarios.

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 use case examples ('can I afford a $500/mo hire', 'what if I add a $200/mo software subscription'), which tells the agent when to invoke it. However, it does not mention sibling alternatives or when not to use it vs. other whatif tools, so it stops short of fully explicit routing guidance.

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

whatif_clientA
Read-only
Inspect

What if a client pays late or leaves? mode='late30' shifts that client's OPEN invoice amounts out of the near-term expectation (they still owe it, it's just not landing this month). mode='gone' removes that client's trailing monthly income contribution and recomputes Safe Draw against the reduced baseline. Use for questions like 'what if Acme Corp pays 30 days late' or 'what happens if I lose my biggest client'. Client identity is matched against the Income tab's tag/source/description fields — best effort, not a guaranteed match.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYes'late30' = shift open invoices 30 days late; 'gone' = client stops paying entirely
clientNameYesThe client's name as it appears on invoices or income rows
Behavior4/5

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

Annotations already establish that the tool is read-only and non-destructive, and the description adds valuable behavioral detail: late30 preserves the client's debt but pushes it out of the current month, while gone removes the client's recurring income and recomputes Safe Draw. It also honestly caveats that client identity matching is best-effort rather than guaranteed, which is important for setting expectations.

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 efficient and front-loaded around the core scenario, then gives mode-specific behavior, example prompts, and a matching caveat. It is slightly long but every sentence contributes meaningful guidance with no redundant repetition of schema details.

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

Completeness4/5

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

For a 2-parameter, read-only what-if tool, the description covers core usage, mode meanings, and the fuzzy matching behavior. It does not define the term Safe Draw or describe the exact returned output format, but that is a minor gap given the otherwise adequate 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?

Schema coverage is 100%, so the baseline is 3, but the description geninely adds semantic value. It clarifies that mode changes near-term income expectations for late30 and recomputes Safe Draw on a reduced baseline for gone, and it explains that clientName is matched against Income tab tag/source/description fields rather than exact IDs.

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

Purpose5/5

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

The description clearly identifies what the tool does: it models a what-if scenario where a client pays late or leaves, and it explains each mode's effect on expected income and Safe Draw. It gives concrete example questions, which firmly distinguishes it from sibling tools like whatif_afford and whatif_tax_setaside.

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

Usage Guidelines4/5

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

It provides explicit usage examples: 'what if Acme Corp pays 30 days late' and 'what happens if I lose my biggest client.' It does not explicitly tell the agent when to use a different what-if sibling, so the exclusion guidance is slightly underdeveloped.

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

whatif_tax_setasideA
Read-only
Inspect

What should I set aside for taxes? Surfaces the same monthly tax set-aside estimate already computed for Safe Monthly Draw — wiring, not new math. Flat-rate estimate (default 30%) against trailing income minus recurring + variable spend. Use for 'how much should I set aside for taxes this month'.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds valuable behavior context: it returns the same estimate already used by Safe Monthly Draw, it is flat-rate, the default rate is 30%, and it is based on trailing income minus recurring and variable spend. This is genuinely informative beyond the annotations. It could still say more about output format or whether the estimate is a single number, but what is carved is strong.

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

Conciseness5/5

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

The description is compact and well-front-loaded. The first sentence answers the user-facing question "It then states what the tool actually surfaces, breaks the calculation one-liner, and gives a ready-to-use query. There is no flab 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 0-parameter, read-only, no-output schema tool, this description covers the intended use case, the data used, and the kind of result (a monthly tax set-aside estimate). It does not give the exact output shape, but for an estimated-dollar-value what-if tool against all information in annotations, this is nearly complete.

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

Parameters4/5

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

The input schema has zero parameters and the Schema description coverage is 100%, so the baseline is 4. The description adds relevant relevant lower-level context: the estimation uses a flat-rate percentage and the exact income-minus-spend basis. There are no parameters to document, but the formula context is still helpful.

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 exact user question the tool answers and states a specific verb and resource: it 'surfaces the same monthly tax set-aside estimate already computed for Safe a as already computed for Safe Monthly Draw'. It also clarifies this is wiring, not new math, which makes the tool's role distinct and easy for an agent to recognize.

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 intended usage: use for 'how much should I set aside for taxes this month.' It even describes the calculation context — default 30% against trailing income minus recurring plus variable spend. It does not explicitly name alternatives or state when not to use it, 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.

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to perform financial analysis, budget forecasting, compliance checks, expense categorization, and risk assessment, returning structured JSON with audit-ready governance receipts.
    5
    105
    1
    Business Source 1.1
  • F
    license
    Not graded
    quality
    D
    maintenance
    Approval receipts for AI browser purchases. Enables purchase evaluation, approval recording, budget alerts, and receipt export.
  • A
    license
    Not graded
    quality
    B
    maintenance
    Manage your finances through natural language directly in your AI assistant. Add, edit, delete, and query expenses; set monthly budgets; and generate comprehensive spending reports seamlessly.
    1
    MIT

View all MCP Servers

Try in Browser

Your Connectors

Sign in to create a connector for this server.