MoneyMatter
Server Details
Personal finance tracker: accounts, transactions, budgets, investments and analytics over OAuth.
- Status
- Healthy
- Uptime
- 84.9% over 22 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- letehaha/moneymatter
- GitHub Stars
- 160
TDQS
Scored across 113 tools
Many tools are individually distinct, but the 113-tool set has several overlapping or easily confused areas: get_accounts vs get_balance_history, search_transactions vs get_expenses_for_period/get_spending_by_categories, transfer_account_to_portfolio vs link_transaction_to_portfolio vs create_portfolio_cash_transaction, and multiple tracker/subscription suggestion flows. The detailed descriptions help resolve most ambiguity, but the sheer breadth makes misselection plausible.
Most names use snake_case verb_noun patterns, which is readable, but listing operations are inconsistently split between get_* and list_* (e.g. get_accounts/get_categories/get_payees vs list_venture_deals/list_portfolio_transfers/list_tracker_suggestions). There are also related verb variants such as add/link/assign and create/transfer.
113 tools is an extreme mismatch for a coherent MCP tool surface. Even though the domain is broad, this volume makes the toolset hard to navigate and violates the expectation of a well-scoped set.
The surface covers a very wide range of finance workflows: transactions, categories, tags, payees, groups, subscriptions, trackers, portfolios, investments, venture deals, goals, and automations. There are minor gaps such as no account creation/update beyond archive/adjust, no explicit budget-plan tools, and limited attachment lifecycle beyond upload URL creation.
Available Tools
113 toolsaccept_tracker_suggestionsAInspect
Accept pending smart-tracking suggestions of a tracker the user owns: each suggested transaction is linked to the tracker. Suggestion ids come from list_tracker_suggestions; fails if any is not pending. Returns resolvedCount.
| Name | Required | Description | Default |
|---|---|---|---|
| trackerId | Yes | ID of a tracker the user owns | |
| suggestionIds | Yes | Suggestion IDs from list_tracker_suggestions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral load, and it does well: it discloses the mutation effect (transactions linked to the tracker), the ownership constraint on trackerId, and the atomic-ish failure condition ('fails if any is not pending'), plus the returned field resolvedCount. It does not describe auth scope beyond ownership, rate limits, or whether the failure rolls back all links, leaving some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with the action and effect, then provenance of ids, then failure/return behavior. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no output schema and no annotations, the description covers effect, provenance, failure condition, and return value. Remaining gaps are secondary (rollback semantics, explicit alternative tool) rather than things an agent needs to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented in the schema, so the baseline is 3. The description's note that ids come from list_tracker_suggestions and that trackerId must be owned mostly restates what the schema already says, adding little beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (accept) plus resource (pending smart-tracking suggestions of a tracker) and the side effect (each suggested transaction is linked to the tracker). It is clearly distinguishable from the sibling list_tracker_suggestions (which supplies ids) and reject_tracker_suggestions (implied opposite).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tells the agent where the suggestion ids come from (list_tracker_suggestions) and the precondition for success (all must be pending, otherwise the call fails). It stops short of explicitly naming reject_tracker_suggestions as the alternative for declining, so it is clear context rather than full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_transactions_to_groupAInspect
Add one or more transactions to an existing transaction group. Transfer pairs are auto-included. Returns the updated group with all its transactions. Requires finance:write scope.
| Name | Required | Description | Default |
|---|---|---|---|
| groupId | Yes | ID of the transaction group to add transactions to | |
| transactionIds | Yes | IDs of transactions to add to the group |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full burden and does a solid job: it discloses an automatic side effect ('Transfer pairs are auto-included'), an auth requirement ('Requires finance:write scope'), and return behavior. Gaps remain — no mention of validation errors, duplicate handling, or partial-failure behavior for the array input.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences with zero filler. The core action leads, followed by the non-obvious side effect, return shape, and auth need — each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter mutation with no output schema, the description covers the return value, an automatic side effect, and the auth scope. Only behavioral edge cases (idempotency, error conditions) are absent, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented in the schema (groupId, transactionIds). The description adds only the cardinality hint 'one or more', which is already captured by the array type, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Add one or more transactions to an existing transaction group.' The resource naming naturally separates it from add_transactions_to_budget and remove_transactions_from_group, but it never names those siblings explicitly, so differentiation rests on the reader's inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'existing transaction group' implies a prerequisite and the resource scoping implies usage, but there is no explicit when-to-use, when-not-to-use, or alternative pointer (e.g., add_transactions_to_budget vs this). An agent must infer the choice from the resource name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_transactions_to_trackerAInspect
Manually link one or more transactions to a tracker, alongside any links its category and tag rules add. Returns a success message on completion.
| Name | Required | Description | Default |
|---|---|---|---|
| trackerId | Yes | ID of the tracker to link transactions to | |
| transactionIds | Yes | IDs of the transactions to add to the tracker |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden. It discloses an important side effect (category and tag rules also add links) and mentions a success message return, but omits permission requirements, idempotency, and handling of already-linked transactions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste: first states the action, then the side effect and return behavior. Information is front-loaded and appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description should ideally explain return values and failure modes more thoroughly. It provides the key side-effect context but leaves the 'success message' vague and omits permission or error behavior, so it is only minimally adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are fully documented in the schema. The description adds no extra parameter meaning beyond saying 'one or more transactions' and 'a tracker', so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (manually link) and resource (one or more transactions to a tracker). The word 'manually' implicitly distinguishes this from automatic suggestion acceptance (accept_tracker_suggestions), but it does not explicitly name any sibling tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through 'manually link' but provides no explicit when-to-use or when-not-to-use guidance. It does not name alternatives such as accept_tracker_suggestions or link_transactions_to_subscription, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adjust_account_balanceAInspect
Set an account to a specific balance by creating an adjustment transaction for the difference. Returns the previous balance, new balance, and the generated transaction (null if the balance was already at the target).
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Optional note to attach to the adjustment transaction. | |
| accountId | Yes | ID of the account to adjust. | |
| newBalance | Yes | Target balance as a decimal (e.g. 1500.00). An adjustment transaction is created for the diff. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose the key side effect (a transaction is created for the diff) and the no-op case (transaction is null when already at target) — a genuinely useful behavioral detail. It omits permission/auth requirements, whether investment or archived accounts are rejected, and whether the generated transaction is reversible or categorized.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the first gives the operation and mechanism, the second gives the return shape. Front-loaded and every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because there is no output schema, the description's explicit return-value sentence is doing real work and covers the null case. What remains thin is account-type/eligibility context for a mutation tool with zero annotations, but for a 3-parameter tool this is close to complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters are already documented in the schema, including the note field and the decimal example for newBalance. The description restates the diff-based semantics of newBalance but adds no new format or constraint detail, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (set an account to a specific balance) plus the mechanism used (an adjustment transaction for the difference), which clearly separates it from plain create_transaction or update_transaction. It never names a sibling, so the differentiation is implied rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case (getting an account to a target balance) and hints at an alternative path via 'adjustment transaction', but gives no explicit when-to-use/when-not-to guidance, no prerequisites (account must exist, be non-investment, etc.), and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
archive_accountAInspect
Archive or unarchive a user account. Archiving removes the account from groups and unlinks subscriptions. Set archived=false to restore an archived account to active status.
| Name | Required | Description | Default |
|---|---|---|---|
| archived | Yes | true to archive the account, false to unarchive (restore to active status). | |
| accountId | Yes | ID of the account to archive or unarchive. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses two important side effects: removal from groups and unlinking of subscriptions. However, it does not state whether the operation is reversible or what permissions are required, leaving gaps for a destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly written sentences, front-loaded with the core action, then the side effects, then the reverse case. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no annotations and no output schema, the description covers the essential effects but omits permission requirements, reversibility details, and any return-value information. It is adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema documents both parameters fully, including the boolean semantics of 'archived'. The description reinforces the false case with 'restore to active status,' adding a small amount of clarity about the unarchive effect, though it does not give new syntax or format guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'Archive or unarchive a user account.' The title is null, so there is no redundancy there. However, it does not distinguish itself from the sibling archive_budget, which uses an analogous archiving operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through the archived parameter ('Set archived=false to restore'), but it provides no explicit when-to-use guidance or exclusions relative to alternatives. No sibling tool is named or contrasted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
archive_trackerAInspect
Archive or unarchive a tracker. Pass isArchived: true to archive (sets status to "archived"), false to restore it to active. Returns the updated tracker.
| Name | Required | Description | Default |
|---|---|---|---|
| trackerId | Yes | ID of the tracker to archive or unarchive | |
| isArchived | Yes | true to archive the tracker, false to restore it to active |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the concrete state change ("sets status to 'archived'"), the reversibility of the operation, and that the updated tracker is returned. It does not mention permission/auth requirements, side effects on the tracker's linked transactions or lines, or any rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, then the parameter mechanic, then the return value. Efficient overall, though the isArchived explanation partially duplicates what the schema already states.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter toggle with no output schema, the description is nearly sufficient: it covers the operation, the boolean meaning, and the returned value. It omits the side-effect scope (what archiving does to associated transactions/lines) and any auth context, which would round it out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters already document themselves (trackerId = ID of the tracker, isArchived = true to archive / false to restore). The description's restatement of the isArchived semantics adds no meaning beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb pair and resource: "Archive or unarchive a tracker." An agent immediately knows this is a reversible state toggle on a tracker, not a delete. However, it never names or distinguishes itself from close siblings such as delete_tracker, update_tracker, or archive_account, which is what a 5 would require.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the boolean semantics (true = archive, false = restore), which is enough to invoke the tool, but there is no guidance on when to prefer this over delete_tracker or update_tracker, and no prerequisites or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assign_tags_to_transactionAInspect
Assign one or more tags to a transaction. Use when the user wants to label a transaction with existing tags. Already-assigned tags are silently skipped. Returns counts of added and skipped tags.
| Name | Required | Description | Default |
|---|---|---|---|
| tagId | Yes | ID of the tag to assign. | |
| transactionIds | Yes | List of transaction IDs to tag. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden and does well on the mutation semantics: it discloses that duplicate assignments are silently skipped (idempotent-ish behavior) and that the response contains added/skipped counts. It does not cover permission requirements, whether the tag must exist, or whether assigning tags triggers transaction automations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler, with the core action stated first and the behavioral caveats and return shape following. Nothing needs to be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no annotations and no output schema, the description supplies the key facts an agent needs: the duplicate-skip behavior and the return counts. Remaining gaps are permission/prerequisite details and the absence of any alternative-tool routing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented in the schema, so the baseline is 3. The description adds the "existing tags" constraint on tagId but no format or cardinality detail beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (assign) and resource (tags on a transaction), which cleanly separates it from siblings like remove_tags_from_transaction and add_transactions_to_group. The framing is slightly inverted versus the schema (one tagId applied to many transactionIds, not many tags to one transaction), which is a minor inaccuracy but does not obscure the purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use when the user wants to label a transaction with existing tags" gives a clear trigger condition and implicitly signals that the tag must already exist. It stops short of naming alternatives (remove_tags_from_transaction) or stating exclusions, so it is clear context without full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_update_transactionsAInspect
Update multiple transactions at once. Provide transactionIds plus at least one of categoryId, tagIds, note, or payeeId. Tags can be added to, removed from, or replaced on all specified transactions.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Note to set on all transactions | |
| tagIds | No | Tag IDs to apply according to tagMode | |
| payeeId | No | Payee ID to assign to all transactions. Pass null to clear | |
| tagMode | No | How to apply tagIds: add (default) appends, replace overwrites, remove removes those tags | |
| categoryId | No | New category ID to assign to all transactions | |
| transactionIds | Yes | IDs of transactions to update |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It says the tool updates transactions in bulk and supports tag add/remove/replace, but it does not disclose permissions, partial-failure behavior, max batch size, reversibility, or return behavior, which are important for a bulk mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three compact sentences with no filler. The purpose is front-loaded, followed by the required parameter combination and tag-mode behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a bulk mutation with no annotations and no output schema, the description covers purpose, required fields, and tag modes, but leaves out operational details such as batch limits, failure handling, and return shape. It is adequate but incomplete for an agent deciding whether and how safely to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 a meaningful cross-field constraint not expressed in the schema: transactionIds must be supplied together with at least one of categoryId, tagIds, note, or payeeId.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: update multiple transactions at once. The bulk scope distinguishes it from single-transaction siblings such as update_transaction, and it lists the fields that can be changed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear invocation rule: provide transactionIds plus at least one of categoryId, tagIds, note, or payeeId. It does not explicitly name when to use this versus update_transaction or the tag-specific sibling tools, so it lacks exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_attachment_upload_urlAInspect
Get a short-lived upload URL for attaching receipt/invoice files (JPEG, PNG, WebP, PDF) to a transaction. File bytes cannot be sent through MCP: POST each file as the raw request body to the returned url with the returned headers, plus the header named by filenameHeader set to the URI-encoded original filename of that file (e.g. via curl --data-binary). The URL works for multiple files until it expires. Requires a client that can make HTTP requests with local files.
| Name | Required | Description | Default |
|---|---|---|---|
| transactionId | Yes | ID of the transaction to attach files to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and discloses important behavior: the URL is short-lived, reusable across multiple files until expiry, and requires an HTTP-capable client. It does not mention authentication scopes, error handling, or upload side effects, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the tool's purpose, then efficiently adds operational instructions in a logical order. Every sentence contributes necessary context for correct invocation, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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, the description covers the return components (url, headers, filenameHeader) and the required follow-up workflow, which is enough to use it correctly. It still omits exact expiry duration and formal response shape, so it is strong but not fully exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents transactionId as the required UUID of the transaction to attach files to. The description adds only the general purpose of the parameter and no new syntax or format details, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: get a short-lived upload URL for attaching receipt/invoice files to a transaction. It also names accepted file types and the target entity, so an agent can identify exactly what this unique tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly explains when to use it and the critical constraint that file bytes cannot be sent through MCP. It then gives the required alternative workflow: POST raw file contents to the returned URL with the returned headers and the filename header. It also states the client prerequisite, leaving no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_categoryAInspect
Create a new transaction category. Supports nested categories via parentId — child categories inherit the parent color if none is provided. Use when the user wants a new category to classify transactions.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | Optional icon identifier for the category. | |
| name | Yes | Category name. | |
| type | No | Category type: "custom" (default, user-editable) or "internal" (system-managed). | |
| color | No | Hex color code (e.g. "#4CAF50"). Inherited from parent if omitted. | |
| parentId | No | ID of the parent category to create a subcategory. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose real behavior — nested categories via parentId and color inheritance from the parent — but says nothing about permissions, duplicate-name handling, the effect of type='internal', or what the call returns, which leaves meaningful gaps 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action before the nesting detail and the usage note. Each sentence carries information, though the closing 'use when' sentence is close to filler given the already-clear purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter mutation tool with no annotations and no output schema, the description covers purpose and one notable behavior but omits return value, error/conflict behavior, and prerequisite permissions. Adequate but visibly incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description reinforces parentId/color inheritance but largely restates what the schema's own field descriptions already state, adding no new syntax or constraint detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new transaction category') that is unambiguous against catalog siblings such as create_tag and create_payee. It does not explicitly differentiate itself from those siblings, but the resource noun is distinct enough that no confusion arises.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use when the user wants a new category to classify transactions' gives a clear triggering condition. There is no when-not guidance and no mention of alternatives (e.g. update_category for existing ones), which keeps it 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.
create_goalAInspect
Create a savings goal: a target amount (optionally by a date) funded by percent shares or fixed amounts of one or more accounts. Fails when the goal currency has no exchange rate, an account would pass 100% shared across non-archived goals (the error names the account and its free %), or fixed amounts alone fall short of the target. Needs the Goals feature on the plan or an active trial. Returns the goal in the get_goals shape.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Goal name | |
| accounts | Yes | Accounts backing the goal, at least one. Each is either { accountId, sharePercent } or { accountId, fixedAmount, fixedPosition? }. A fixedAmount (decimal in the account's currency) is taken from the balance first; when the balance can't cover every goal's fixed amount on the account, they are filled in fixedPosition order (0 first; omit it to keep the current place or append). sharePercent (0 < x <= 100) is the part of what is left after fixed amounts. Owned general, cash, current, saving, investment or crypto accounts only. An account's sharePercent values across non-archived goals cannot exceed 100%. When every account is a fixedAmount, their sum must reach targetAmount | |
| targetDate | No | Optional deadline (yyyy-MM-dd) | |
| currencyCode | Yes | ISO 4217 code of the target currency, e.g. USD. Usually the user's base currency | |
| targetAmount | Yes | Target as a decimal amount in currencyCode (e.g. 5000.00) | |
| plannedMonthly | No | Optional planned saving per month, decimal in currencyCode. When set it is used as the pace instead of the history | |
| reachedHoldDays | No | Days (0-365, default 30) after first reaching the target during which a dip below it still counts as reached. 0 follows the balance live |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it discloses the plan/trial prerequisite, specific failure modes including exchange-rate issues and the 100% shared-account constraint, and the return shape. It could add more about duplicate-goal handling or side effects, but the core behavior is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the create action, followed by failure conditions, prerequisite, and return shape in four efficient sentences. Every sentence contributes useful information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter creation tool with detailed schema coverage, the description supplies the remaining context an agent needs: feature availability, failure modes, account-sharing constraints, and return shape via the get_goals reference. No output schema exists, but the description adequately explains the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema itself thoroughly documents parameters including the nested accounts funding rules. The description reinforces the funding model at a high level but does not add parameter-level meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb and resource: 'Create a savings goal', then specifies the target amount, optional date, and account-funding model. This clearly distinguishes it from sibling tools such as get_goals, update_goal, and delete_goal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states a key prerequisite, 'Needs the Goals feature on the plan or an active trial', and lists failure conditions that help determine whether the call is viable. However, it does not explicitly name alternatives such as update_goal for modifying a goal or get_goals for listing goals.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_investment_transactionAInspect
Record a new investment transaction (buy, sell, dividend, fee, etc.) in a portfolio. The security must already exist in the portfolio as a holding — call search_securities to resolve a ticker to a securityId, then ensure a holding exists. quantity, price, and fees are decimal strings (e.g. "10.5", "150.00", "0.00").
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | When the trade occurred. Accepts a date-only value (ISO 8601, e.g. "2024-03-15") or a full datetime (e.g. "2024-03-15T09:30:00.000Z"); date-only is stored at UTC midnight. | |
| fees | Yes | Transaction fees/commissions as a decimal string (e.g. "0.00") | |
| name | No | Optional label or note for this transaction | |
| price | Yes | Price per share/unit as a decimal string (e.g. "150.00") | |
| category | Yes | Transaction type: buy, sell, dividend, transfer, tax, fee, cancel, or other | |
| quantity | Yes | Number of shares/units as a decimal string (e.g. "10.5") | |
| securityId | Yes | Security ID — resolve via search_securities first | |
| portfolioId | Yes | Portfolio ID (from get_portfolios) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully discloses the holding-existence prerequisite, but does not cover permissions, side effects on balances/holdings, duplicate handling, or auth requirements 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences with no waste. Purpose is front-loaded, followed by the critical prerequisite and then the numeric formatting note.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutation tool with no annotations and no output schema, the description covers the essential workflow and prerequisite. It is not exhaustive about side effects or return behavior, but the rich schema handles field-level details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter. The description's decimal-string guidance for quantity, price, and fees largely repeats schema details rather than adding new semantic constraints, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Record), resource (investment transaction), and scope (in a portfolio), with common categories in parentheses. This differentiates it from generic transaction tools and portfolio cash transaction tools without needing to open the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition and workflow: the security must already exist as a holding, and the agent should call search_securities to resolve a ticker to a securityId. It does not explicitly name when to use alternative tools such as create_portfolio_cash_transaction, but the context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_payeeBInspect
Create a Payee (merchant/counterparty) for the user. Use when the user wants to register a new merchant before linking transactions. Returns the created Payee.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Display name for the Payee, max 200 chars. | |
| defaultCategoryId | No | Optional category id automatically applied to future transactions linked to this Payee. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It mentions that a Payee is returned, but says nothing about duplicate-name handling, side effects on existing payees/transactions, or permission requirements. For a mutation tool with zero annotation coverage this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action before the usage cue and return note. No filler, though 'Returns the created Payee' adds little concrete information given the absence of an output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter create tool with a fully documented schema, the description covers purpose, when-to-use, and that something is returned. However, the return statement is vague with no output schema to fill in fields, and duplicate/permission behavior is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (name, defaultCategoryId) are already fully documented in the schema. The description adds no syntax, format, or constraint detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Create') and resource ('Payee'), and even clarifies the domain term as 'merchant/counterparty'. The create-vs-update/delete/get distinction from siblings is obvious from the verb alone, but no sibling is named explicitly, so it falls short of the top tier.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives the triggering context: 'Use when the user wants to register a new merchant before linking transactions.' This is a clear condition for invocation. There is no when-not guidance (e.g., duplicates, or use update_payee instead), 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.
create_portfolioAInspect
Create a new investment portfolio for the user. Use when the user wants to track a new brokerage account, retirement fund, or savings vehicle. Returns the created portfolio with its id, which can then be used with create_investment_transaction and get_portfolio_holdings.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Portfolio name (must be unique for this user) | |
| isEnabled | No | Whether the portfolio is active (default: true) | |
| description | No | Optional description of the portfolio | |
| portfolioType | Yes | Type of portfolio: investment, retirement, savings, or other |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It helpfully discloses the return ('Returns the created portfolio with its id') and downstream linkage, which is valuable since there is no output schema. However, it omits permission requirements, the duplicate-name failure behavior (only hinted at in the schema), and any reversibility/side-effect notes for this mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action, followed by usage context and the return/follow-up. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple create operation with a fully documented schema and no output schema, the description supplies the missing return-value and follow-up context. It is nearly complete, losing only minor points for not covering failure modes or prerequisites of a mutation tool with no annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 including the enum values and the uniqueness constraint on name. The description adds no syntax or format detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb + resource ('Create a new investment portfolio') with clear scope ('for the user'). It distinguishes itself from the many other create_* siblings by naming the noun and the domain, though it does not explicitly contrast with near-neighbors like create_portfolio_cash_transaction or create_budget.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use context ('track a new brokerage account, retirement fund, or savings vehicle'), which maps cleanly onto the portfolioType enum. It stops short of naming when NOT to use it or naming an explicit alternative create tool, so it is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_portfolio_cash_transactionAInspect
Record a direct cash deposit into or withdrawal from an investment portfolio without touching any regular account — no bank transaction is created. Use transfer_account_to_portfolio / transfer_portfolio_to_account when the money moves to or from a tracked account.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Date in YYYY-MM-DD format | |
| type | Yes | deposit adds cash to the portfolio, withdrawal removes it | |
| amount | Yes | Amount as a positive decimal string (e.g. "500.00") | |
| description | No | Optional note | |
| portfolioId | Yes | Portfolio ID (from get_portfolios) | |
| currencyCode | Yes | Currency of the cash (ISO 4217, e.g. "USD") | |
| isAdjustment | No | Set true when the entry only reconciles recorded cash to reality (excluded from contribution reporting). Default: false |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden, and it does disclose a real behavioral trait: no bank transaction is created and no regular account is affected. It does not cover permissions needed, reversibility/undo path (e.g. delete_investment_transaction), or error behavior, which a mutation tool ideally should.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the primary behavior first and the routing rule second; every clause carries information and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool with no annotations and no output schema, the description covers purpose, scope, and sibling routing well. It omits any note on required permissions, validation failures, or how to reverse the entry, leaving a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all seven parameters (including the enum on type and the isAdjustment flag) are already documented in the schema. The description adds no parameter-level detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource ('Record a direct cash deposit into or withdrawal from an investment portfolio') and scopes it negatively ('without touching any regular account'). An agent can distinguish it from the transfer siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternatives (transfer_account_to_portfolio / transfer_portfolio_to_account) and the condition that selects them ('when the money moves to or from a tracked account'). This is exactly the when-to-use/when-not guidance the dimension rewards.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_subscriptionAInspect
Create a new subscription, recurring bill, or installment plan. Use type="subscription" for SaaS/streaming services, type="bill" for utilities, and type="installment" for a finite financed purchase paid off over a fixed number of payments. An installment requires maxOccurrences (number of payments) and dueDate (first payment date). expectedAmount is a decimal in the subscription currency. Requires finance:write scope.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Display name of the subscription (e.g. "Netflix", "Electricity") | |
| type | No | Type: "subscription" (default), "bill", or "installment" | |
| notes | No | Additional notes about the subscription | |
| dueDate | No | First payment date (ISO 8601). Required for installments; enables a payment schedule. | |
| endDate | No | End date if the subscription is finite (ISO 8601) | |
| accountId | No | Account ID to associate with this subscription | |
| frequency | Yes | Billing frequency: weekly, biweekly, monthly, quarterly, semi_annual, annual | |
| startDate | Yes | Start date of the subscription (ISO 8601, e.g. "2024-01-01") | |
| categoryId | No | Category ID to associate with this subscription | |
| expectedAmount | No | Expected payment amount as a decimal (e.g. 9.99). Use with expectedCurrencyCode | |
| maxOccurrences | No | Total number of payments. Required for installments; null/omitted means an indefinite schedule. | |
| transactionType | No | Transaction type: "expense" (default) or "income" | |
| expectedCurrencyCode | No | Currency code for expectedAmount (e.g. "USD", "EUR") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses the required auth scope (`finance:write`) and installment-specific constraints (`maxOccurrences` and `dueDate`), which are valuable. But it omits other behavioral details such as idempotency, side effects (e.g., schedule creation), or what happens on duplicate input, leaving gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then flows logically through type guidance, installment requirements, amount format, and auth scope. Every sentence earns its place with no redundancy, and the size is appropriate for a 13-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 13 parameters, no output schema, and no annotations, the description covers purpose, type usage, key installment constraints, amount semantics, and auth scope. It could do more to explain side effects or return behavior, but for a create tool it is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 meaning by explaining the use cases for each `type` enum value (SaaS/streaming, utilities, financed purchase) and clarifying that `expectedAmount` is a decimal in the subscription currency, going beyond the schema's brief descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Create) and resource (subscription, recurring bill, or installment plan), and clearly distinguishes the three subtypes. The resource is distinct from siblings like create_transaction or create_budget.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for choosing the `type` parameter (SaaS/streaming vs utilities vs financed purchase), which is helpful. However, it does not mention when to use this tool versus alternatives like `detect_subscription_candidates` or `link_transactions_to_subscription`, and offers no exclusions. Usage is implied rather than explicitly guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_tagAInspect
Create a new tag that can be assigned to transactions. Use when the user wants to label or categorize transactions with a custom tag. Returns the created tag with its ID.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | Optional icon identifier for the tag. | |
| name | Yes | Tag name (must be unique for this user). | |
| color | Yes | Hex color code for the tag (e.g. "#FF5733"). | |
| description | No | Optional description of the tag. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does disclose the return value ('Returns the created tag with its ID'), but says nothing about the uniqueness constraint on name (only implied via schema), permissions, or failure behavior when a duplicate name is supplied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, then usage, then return behavior. No filler; each sentence adds a distinct piece of information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully states the return value, and the schema fully covers parameters. It is nearly complete for a simple create tool, missing only error/uniqueness behavior and permission expectations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter (name, color, icon, description) is documented in the schema. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new tag') and clarifies what the tag is for ('assigned to transactions'). It does not explicitly distinguish itself from nearby siblings like create_category or update_tag, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: 'Use when the user wants to label or categorize transactions with a custom tag.' No when-not guidance or alternative (e.g., create_category for spend categorization) is offered, so it stops short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_trackerAInspect
Create a tracker with an optional spending limit and date range. It does not create or change the period-based Budget plan. Set rulesEnabled with categoryIds and/or tagIds to auto-add matching transactions; link others with add_transactions_to_tracker. Set aiEnabled with aiDescription and startDate to turn on smart tracking; review its suggestions with list_tracker_suggestions. Returns the created tracker with its ID, status, rule categories and tags.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Tracker name | |
| status | No | Tracker status (default: active) | |
| tagIds | No | Rule tags | |
| endDate | No | Tracker end date (ISO 8601) | |
| aiEnabled | No | Turn on smart tracking: an AI scans the date range and links or suggests matching transactions. Requires aiDescription and startDate | |
| startDate | No | Tracker start date (ISO 8601) | |
| categoryIds | No | Rule categories; parent IDs include their children | |
| limitAmount | No | Spending limit as a decimal amount in the user's base currency (e.g. 500.00) | |
| rulesCleanup | No | Remove rule-added transactions that stop matching the rules. Default: true | |
| rulesEnabled | No | Auto-add the user's transactions in the date range matching any of categoryIds or tagIds. Needs at least one of them. Default: false | |
| aiDescription | No | Plain-language description of what belongs in the tracker (max 500 chars), e.g. "Trip to Lisbon: flights, hotels, food" | |
| aiPreWindowDays | No | Days before startDate the AI also scans, for things booked in advance. One of 0, 14, 30, 60, 90, 180. Default: 60 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does well: it discloses that rule matching auto-adds transactions (a write side effect on other records), that AI mode scans a date range and produces suggestions, and what the call returns (tracker with ID, status, rule categories and tags). It stops short of stating permission requirements or what happens on validation failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the core action and its scope, then behavioral modes, then the return value. Every sentence adds information; only the return-value sentence is slightly redundant with an obvious creation result.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter creation tool with no output schema, the description covers scope, mode flags, follow-up tools, and the shape of the returned object. Minor gaps remain around failure modes and default behavior of rulesCleanup, which only the schema explains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description earns above that by surfacing cross-parameter dependencies (rulesEnabled needs categoryIds and/or tagIds; aiEnabled requires aiDescription and startDate) that are easy to miss when skim-reading 12 properties. It does not add format or unit details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Create a tracker") and immediately scopes it with the optional limit and date range. It also carves out the nearest ambiguous concept by declaring it does not create the period-based Budget plan, so an agent can separate it from budget-style tools without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete routing: use rulesEnabled with categoryIds/tagIds for auto-add, use add_transactions_to_tracker to link existing transactions, and use list_tracker_suggestions to review AI results. The only missing piece is an explicit statement of when not to call it (e.g. vs update_tracker for existing trackers), which is largely self-evident from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_tracker_lineAInspect
Add a line to a tracker: a named category set with its own optional limit. A transaction lands in at most one line — the first line by position whose category set (expanded to children) contains its category; spending matching no line counts as "other". Requires manage access to the tracker. Returns the created line with its ID, limit and categories.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Line name | |
| position | No | 0-based order among the lines. Default: after the last line | |
| trackerId | Yes | ID of the tracker to add the line to | |
| categoryIds | Yes | Category IDs the line covers; parents expand to their children. Categories resolve against the tracker owner's tree. | |
| limitAmount | No | Line spending limit as a decimal amount in the tracker owner's base currency (e.g. 200.00). Omit or null for no limit |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the permission requirement, the first-match-by-position categorization rule, the 'other' fallback, and the return payload. It omits what happens to already-existing transactions when a new line is inserted earlier in the order, which is a meaningful behavioral gap 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the purpose, then matching semantics, then prerequisite, then return shape. Each sentence carries information; the only mild redundancy is restating child-category expansion that the schema also documents.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter create tool with no annotations and no output schema, the description covers purpose, prerequisite, matching behavior, and return value. The remaining gap is the side effect on existing transaction categorization, which an agent would otherwise have to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning: it explains that a line's category set expands to children and that position determines which line captures a transaction (first match wins). That priority semantics for 'position' goes beyond the schema's '0-based order among the lines'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Add a line to a tracker') and immediately defines what a line is (a named category set with an optional limit), which is the domain concept an agent needs to distinguish this from update_tracker_line or create_tracker. Sibling names aren't cited, but the add-vs-update distinction is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear precondition ('Requires manage access to the tracker') and explains the matching semantics that motivate creating a line, but it never explicitly says when to use this instead of update_tracker_line or how it relates to add_transactions_to_tracker. Context is clear; exclusions are absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_transactionAInspect
Create a new transaction (income, expense, or transfer). Requires accountId, amount (decimal), transactionType, and transferNature. paymentType is optional and defaults to the default payment type of the account. For transfers, also provide destinationAccountId and destinationAmount. Use splits to categorize portions of the amount. Use originalAmount + originalCurrencyCode to record what the purchase cost in its invoice currency when that differs from the account currency. Use paymentLegs to pay one purchase from several accounts.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Optional note or description for the transaction | |
| time | No | Transaction date/time as ISO 8601 string. Defaults to now | |
| amount | Yes | Transaction amount as an unsigned decimal (e.g. 12.50). Never negative: transactionType sets the direction | |
| splits | No | Split the transaction across multiple categories | |
| tagIds | No | Tag IDs to assign to this transaction | |
| payeeId | No | Payee ID to assign | |
| accountId | Yes | ID of the account the transaction belongs to | |
| isPlanned | No | Mark the transaction as planned rather than an already-happened record | |
| categoryId | No | Category ID to assign to this transaction | |
| paymentLegs | No | Pay this income/expense from up to 4 more accounts. Each item is either { accountId, amount } to create a part on another account, or { transactionId } to link an existing transaction as a part (its amount stays). amount is in that account's currency; when it differs from this transaction's currency also pass paymentAmount, the part's value in this transaction's currency. Not allowed for transfers, refunds, planned or category-split transactions | |
| paymentType | No | Payment method used. Defaults to the account's default payment type, or bankTransfer | |
| originalAmount | No | Amount in the currency the purchase was originally priced in (decimal), e.g. 66.42 for a PLN invoice paid from a UAH account. Informational only: never affects balances. Requires originalCurrencyCode | |
| transferNature | Yes | Transfer type. Use not_transfer for regular income/expense | |
| transactionType | Yes | Whether this is income or expense | |
| destinationAmount | No | For transfers: amount received in destination account (decimal, greater than 0) | |
| destinationAccountId | No | For transfers: destination account ID | |
| originalCurrencyCode | No | ISO 4217 code of originalAmount (e.g. "PLN"). Requires originalAmount. Cannot be combined with transfer fields | |
| destinationTransactionId | No | For transfers: link to an existing destination transaction instead of creating one |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds some behavioral context, such as paymentType defaulting to the account's default and originalAmount being informational only. But with no annotations, it does not fully disclose mutation side effects, permissions, idempotency, or what happens on failure, leaving meaningful gaps for a create operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and required parameters, then moves through optional and advanced scenarios. It is dense but appropriately sized for an 18-parameter creation tool, with little wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the fully described schema, the description provides an adequate high-level summary of required fields, transfers, splits, original currency, and payment legs. It omits some advanced fields like isPlanned or destinationTransactionId, but the schema covers them, and no output schema needs explanation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameter documentation is already strong. The description summarizes key fields and conditional groups, but largely repeats or compresses what the schema more precisely explains; it does not add substantial semantic detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Create a new transaction (income, expense, or transfer).' It clearly establishes scope and required fields, but does not explicitly differentiate this tool from siblings like update_transaction or split_transaction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'Create a new transaction' and the conditional guidance for transfers, splits, original amounts, and payment legs. However, there is no explicit guidance on when to choose this tool versus alternatives such as update_transaction, split_transaction, or create_investment_transaction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_transaction_automationAInspect
Create a transaction automation rule that categorizes, tags, sets a payee, or edits the note of matching transactions. The rule is appended last in evaluation order and only fires for newly synced or imported bank transactions that are not transfers and not planned; existing transactions are never changed retroactively. Preview the conditions with preview_transaction_automation first. Requires finance:write scope.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Display name of the rule (e.g. "Groceries to Food") | |
| actions | Yes | Actions applied when the conditions match. 1-4 actions, each type at most once. - { "type": "set_category", "categoryId": "<uuid>" } - { "type": "add_tags", "tagIds": ["<uuid>"] } with 1-20 tag ids - { "type": "set_payee", "payeeId": "<uuid>" } - { "type": "set_note", "mode": "replace" | "append" | "prepend", "value": "<text, max 200 chars>" } Every referenced category, tag, and payee must belong to the user, otherwise the call is rejected. | |
| isEnabled | No | Defaults to true | |
| conditions | Yes | Condition tree: { match: "all" | "any", items: [...] }. 1-10 items, at most one transactionType item. Item shapes by field: - note | merchant (merchant is the bank-provided merchant/description text): { field, operator, value }. operator: contains_any | not_contains_any | starts_with_any | ends_with_any | equals_any | is_empty. value: 1-20 case-insensitive keywords, max 64 chars each; required unless operator is is_empty. Example: { "field": "merchant", "operator": "contains_any", "value": ["uber", "bolt"] } - payee | account | accountGroup | bankConnection: { field, operator, value }. operator: in | not_in. value: 1-20 UUIDs of that entity, all owned by the user. Example: { "field": "account", "operator": "in", "value": ["<accountId>"] } - amount: { field, operator, value: { min?, max? }, currency }. operator: gte | lte | between | equals. gte and equals take min only, lte takes max only, between takes both. Bounds are decimals (e.g. 12.50). currency: { "mode": "transaction" } compares in the currency of the transaction itself, { "mode": "base" } in the user base currency, { "mode": "specific", "code": "USD" } in a fixed currency. Example: { "field": "amount", "operator": "gte", "value": { "min": 100 }, "currency": { "mode": "base" } } - transactionType: { "field": "transactionType", "operator": "equals", "value": "income" | "expense" } - dayOfMonth: { "field": "dayOfMonth", "operator": "between", "value": { "min": 1, "max": 31 } } |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses evaluation order (appended last), firing scope (newly synced/imported bank transactions only), exclusions (not transfers, not planned), the non-retroactive guarantee, and the required finance:write scope. These are exactly the behavioral facts an agent needs before writing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then scope, then the preview prerequisite and scope requirement in order of importance. Four compact sentences with minimal waste, though the action enumeration slightly overlaps the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nested, multi-branch mutation tool with no annotations and no output schema, the description supplies the critical behavioral context (firing scope, ordering, exclusions, auth scope) that structured fields don't cover. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the nested action/condition schemas are exhaustively documented, so the schema does the heavy lifting. The description's action list ('categorizes, tags, sets a payee, or edits the note') merely restates action types already in the schema, adding little beyond it; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Create a transaction automation rule') and enumerates the four effects the rule can have (categorizes, tags, sets a payee, edits the note). This clearly distinguishes it from siblings like update_transaction_automation and delete_transaction_automation without needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent to preview_transaction_automation ('Preview the conditions ... first'), giving a concrete when-to-use instruction and a companion tool. It doesn't explicitly compare against update_transaction_automation for modifying an existing rule, so it falls short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_transaction_groupAInspect
Create a new transaction group that bundles related transactions together (e.g. a split bill). Requires at least 2 transactions. Transfer pairs are automatically included. Requires finance:write scope.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Display name for the group | |
| note | No | Optional note or description for the group | |
| transactionIds | Yes | IDs of transactions to include in the group (minimum 2, maximum 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses the finance:write scope and that transfer pairs are automatically included, but it does not explain what happens on failure, duplicate membership, or what the caller receives after creation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four short sentences, front-loads the core action, and includes only useful constraints and an example. There is no redundant or wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description covers the main call requirements: purpose, minimum transactions, automatic transfer inclusion, and auth scope. However, it does not state what is returned or how conflicting or duplicate transactions are handled, which leaves meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 name, note, and transactionIds including min/max constraints. The description repeats the minimum of 2 transactions but adds no parameter-level meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Create a new transaction group that bundles related transactions together.' The split-bill example makes the grouping concept concrete. It is clearly distinct from create_transaction and add_transactions_to_group, though it does not explicitly name those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives prerequisites such as 'Requires at least 2 transactions' and 'Requires finance:write scope,' but it does not say when to create a new group versus using add_transactions_to_group, update_transaction_group, or split_transaction. Usage is implied rather than explicitly routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_venture_dealAInspect
Create a venture deal (private/illiquid investment record). All monetary amounts are decimal strings in the deal's currency (e.g. "16000"). Fee percentages are decimal fractions in [0,1] — e.g. 0.085 for 8.5%, NOT 8.5. If platformId is provided, omitted fee fields are auto-filled from the platform's defaults. Optionally creates the initial_investment event in the same operation when initialInvestment is supplied. Only the SPV vehicle type is supported in v1.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Deal name (e.g. "SK 116 — Series A") | |
| notes | No | Free-text notes | |
| carryPct | No | Carry as a decimal fraction in [0,1] (e.g. 0.2 for 20%). | |
| entryFee | No | Entry fee absolute amount in currency units. Defaults to principal * entryFeePct. | |
| hurdlePct | No | Hurdle rate as a decimal fraction in [0,1]. | |
| principal | Yes | Principal amount as a decimal string (e.g. "16000") | |
| mgmtFeePct | No | Management fee as a decimal fraction in [0,1]. | |
| platformId | No | Optional platform id (from list_venture_platforms) | |
| spvSubtype | No | SPV subtype: single_company or multi_company | |
| entryFeePct | No | Entry fee as a decimal fraction in [0,1] (e.g. 0.085 for 8.5%). | |
| currencyCode | Yes | Three-letter ISO currency code (e.g. "USD") | |
| targetCompany | No | Free-text portfolio company name | |
| investmentDate | Yes | Investment date in YYYY-MM-DD | |
| expectedExitDate | No | Expected exit date (YYYY-MM-DD) | |
| initialInvestment | No | Optional: also create the initial_investment event in the same transaction. cashFlowMode=out_of_wallet records the investment without linking to bank txs (event amount is stored but not reflected on cash-flow charts). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it discloses genuinely useful behaviors beyond the schema: platform-default fee auto-fill when platformId is supplied, the side effect of also creating an initial_investment event in the same operation, and the v1 SPV-only limitation. It stops short of covering auth/permission requirements or error/reversibility behavior, so it is strong but not complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then ordered caveats (amount format, fee format, platform defaults, optional event, version limit). Each sentence carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter creation tool with a nested initialInvestment object and no output schema, the description adequately covers format conventions, defaulting behavior, and the composite side effect. It does not address permissions or failure modes, but the core invocation-critical context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real value: it clarifies that all monetary amounts are decimal strings in the deal currency, that fee percentages are fractions in [0,1] and emphatically NOT 8.5, and that omitted fee fields are auto-filled from platform defaults. This goes beyond what the schema descriptions convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Create a venture deal") and immediately disambiguates with the parenthetical "(private/illiquid investment record)", distinguishing it from create_portfolio and create_investment_transaction. An agent can tell it apart from sibling creation tools without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides contextual constraints (platformId triggers fee auto-fill; initialInvestment triggers event creation; only SPV is supported in v1) but never states when to choose this over siblings like create_venture_event or create_portfolio. Usage is only implied by the resource scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_venture_eventAInspect
Record an event on a venture deal. The deal must already have an initial_investment before any other event type can be created (initial_investment must come first). Event date cannot precede the initial_investment date.
Rules per type (the schema is flat but the service enforces these — invalid combinations return a clear ValidationError): • initial_investment: grossAmount is auto-derived from the deal's principal + entryFee — do NOT pass it. cashFlowMode must be 'linked' or 'out_of_wallet'. • capital_call, fee_payment, distribution: require grossAmount. cashFlowMode must be 'linked' or 'out_of_wallet'. • exit: requires grossAmount AND navAfter. cashFlowMode must be 'linked' or 'out_of_wallet'. • nav_update, writedown: require navAfter. cashFlowMode must be 'none'.
For cashFlowMode='linked', the sum of linked transactions' amounts must equal the event's lpNetAmount (derived from grossAmount minus auto-computed carry for distribution/exit). For cashFlowMode='out_of_wallet', no transactions are linked — the event amount is recorded but does NOT affect bank balances or cash-flow charts.
Carry on distribution/exit is auto-computed (European waterfall by default). Pass lpNetAmountOverride / gpCarryOverride to override the computed values (e.g. when matching a GP's statement).
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Event type | |
| notes | No | Free-text notes | |
| dealId | Yes | Venture deal ID (from list_venture_deals) | |
| navAfter | No | Post-event NAV (decimal string). Required for nav_update, writedown, AND exit. | |
| eventDate | Yes | Event date in YYYY-MM-DD | |
| grossAmount | No | Gross amount (decimal string). Required for capital_call, fee_payment, distribution, exit. | |
| quantityPct | No | Optional partial-exit quantity fraction in [0,1] (used for partial exits). | |
| cashFlowMode | Yes | linked = tie to existing bank txs; out_of_wallet = record event only; none = required for nav_update / writedown | |
| transactionIds | No | Bank transaction ids to link. Required when cashFlowMode=linked; must NOT be provided otherwise. | |
| gpCarryOverride | No | Override the auto-computed gpCarryAmount (distribution/exit only). | |
| lpNetAmountOverride | No | Override the auto-computed lpNetAmount (distribution/exit only). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses auto-derived values (grossAmount from principal+entryFee, auto-computed carry), the side-effect difference between 'linked' (sum must equal lpNetAmount) and 'out_of_wallet' (no effect on bank balances or cash-flow charts), error behavior (clear ValidationError on invalid combos), and override escape hatches. This is materially beyond what the schema alone conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long but well-structured: the purpose and hard prerequisites are front-loaded, then bulleted per-type rules, then the cashFlowMode and carry semantics. Every section carries non-redundant information; the density is justified by the 11-parameter, 7-type surface.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description covers prerequisites, per-type requirements, side effects, and error behavior thoroughly. The main omission is any hint of the response shape or whether the call is idempotent, but for a create tool with documented validation this is close to complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 real conditional semantics the schema cannot express: which fields are required per event type, that grossAmount must NOT be passed for initial_investment, and that transactionIds must only accompany cashFlowMode='linked'. Only minor gaps remain (e.g. quantityPct usage is only lightly touched).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Record an event on a venture deal'), which cleanly separates it from create_venture_deal, create_venture_platform, and update_venture_event. It doesn't explicitly name a sibling to disambiguate against, but the resource boundary is unambiguous from the name and opening sentence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete preconditions ('deal must already have an initial_investment before any other event type can be created') and a date-ordering constraint, plus per-type validity rules. It stops short of naming alternatives (e.g. when to prefer update_venture_event over creating a new event), so it lacks explicit exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_venture_platformAInspect
Create a venture investment platform (e.g. AngelList, a syndicate, a fund manager) so its default fees can be auto-applied when creating new deals. Fee fields are decimal fractions in [0,1] — e.g. pass 0.085 for 8.5%, NOT 8.5. Returns the created platform's id for use with create_venture_deal.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Platform name (must be unique for this user) | |
| website | No | Platform website URL | |
| description | No | Free-text description | |
| defaultCarryPct | No | Default carry as a decimal fraction in [0,1] (e.g. 0.2 for 20%). Defaults to 0. | |
| defaultHurdlePct | No | Default hurdle rate as a decimal fraction in [0,1]. Defaults to 0. | |
| defaultMgmtFeePct | No | Default management fee as a decimal fraction in [0,1]. Defaults to 0. | |
| defaultEntryFeePct | No | Default entry fee as a decimal fraction in [0,1] (e.g. 0.085 for 8.5%). Defaults to 0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose the useful return behavior (the created platform's id, for use with create_venture_deal), but says nothing about permissions, whether a duplicate name fails, or any side effects of creating the record.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, correctly front-loaded with purpose before the unit convention and the return-value note. The middle sentence duplicates guidance already in the schema, slightly diluting conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-param creation tool with full schema coverage but no annotations and no output schema, the description supplies the two missing pieces an agent needs: the unit convention trap and what the call returns. Remaining gaps (auth requirements, uniqueness failure behavior) are modest.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all seven fields are already documented with units and defaults, making 3 the baseline. The description restates the decimal-fraction convention already present on each fee parameter ('NOT 8.5') and adds no new per-parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Create a venture investment platform') and grounds it with concrete examples (AngelList, syndicate, fund manager). It also states why the entity exists (to auto-apply default fees on new deals), which cleanly separates it from create_venture_deal and create_portfolio.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when-to-use rationale — creating a platform to carry default fee settings into future deals — and names the downstream tool (create_venture_deal) that consumes its output. It does not state any exclusions or when-not-to-use conditions, so it falls 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.
delete_categoryAInspect
Permanently delete a category by ID. This is destructive — if the category has linked transactions you must supply replaceWithCategoryId to reassign them first, otherwise the call will fail. Cannot delete a parent category that still has subcategories. Only call when the user explicitly confirms deletion.
| Name | Required | Description | Default |
|---|---|---|---|
| categoryId | Yes | ID of the category to delete. | |
| replaceWithCategoryId | No | ID of the category to reassign linked transactions to. Required when the category has transactions. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so well: it discloses permanence ('permanently'), the destructive nature, two distinct failure modes (linked transactions without a replacement, parent category with subcategories), and a required reassignment step. It stops short of describing permission requirements or what the response returns, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the action, the conditional prerequisite with its failure consequence, and the hard constraint plus confirmation guardrail. The core action is front-loaded in the first clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema or annotations exist, so the description must stand alone, and it covers action, prerequisites, failure modes, and a safety guardrail for a 2-parameter mutation. Minor gaps remain around permissions and side effects on the orphaned data once reassigned, but nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented, giving a baseline of 3. The description goes beyond that by tying replaceWithCategoryId to its triggering condition and the consequence of omitting it (the call fails), which is semantic value the schema's terse 'Required when the category has transactions' only partially conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Permanently delete a category by ID') with the scope qualifier 'permanently'. It is clearly distinguishable from sibling deletions like delete_budget, delete_tag, or delete_transaction, all of which target different resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition ('Only call when the user explicitly confirms deletion') and the exact condition under which the optional parameter becomes mandatory ('if the category has linked transactions you must supply replaceWithCategoryId'). It also names a hard when-not case: a parent category with subcategories cannot be deleted. No sibling tool offers category deletion, so no alternative needs naming.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_goalAInspect
Permanently delete a savings goal and free its account shares. Accounts and balances are not touched. Prefer update_goal with status archived to keep it. Returns { success: true }.
| Name | Required | Description | Default |
|---|---|---|---|
| goalId | Yes | ID of the goal to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden: it discloses irreversibility ("Permanently"), the side effect on account shares, an explicit non-effect on accounts/balances, and the return shape {"success": true}. What it omits is whether the deletion requires ownership/admin rights or fails when shares still exist — minor but real gaps for an irreversible mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the destructive verb, then consequences, then the alternative. "Free its account shares" is slightly opaque phrasing, but every sentence earns its place and nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter irreversible delete with no output schema and no annotations, the description covers purpose, side effects, alternative, and return value — enough to call it correctly. It stops short of error conditions or permission requirements, which is the only meaningful remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single required goalId parameter with 100% schema description coverage, so the schema already fully documents it. The description adds no format, sourcing, or validation nuance beyond that, which is the baseline expectation when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Permanently delete a savings goal") with the scope of the deletion spelled out. It clearly distinguishes itself from the sibling update_goal, which is named explicitly, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative ("Prefer update_goal with status archived to keep it") and the condition that selects it, which is exactly the fork an agent faces with a delete tool. It also bounds the blast radius up front by saying accounts and balances are not touched.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_investment_transactionAInspect
Permanently delete an investment transaction. The holding and portfolio cash balance are automatically recalculated after deletion. This action is irreversible — confirm with the user before calling. Obtain transactionId from get_investment_transactions.
| Name | Required | Description | Default |
|---|---|---|---|
| transactionId | Yes | Investment transaction ID to delete (from get_investment_transactions) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it declares the operation permanent and irreversible, warns to confirm first, and discloses the non-obvious side effect that the holding and portfolio cash balance are recalculated. It omits auth/permission requirements and error behavior, so it falls short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the action and its consequence, then the irreversibility warning, then the ID source. No sentence is filler and each adds a distinct fact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param destructive tool with no annotations and no output schema, the description covers the essentials: permanence, side effects, and ID provenance. It is nearly complete, though it could note permission requirements or what happens to the linked portfolio/holding records.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter is fully documented with a UUID pattern and source hint. The description's mention of obtaining transactionId from get_investment_transactions merely duplicates the schema, so it adds no meaning beyond structured data — baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('delete') and resource ('investment transaction'), and the qualifier 'investment' distinguishes it from the sibling delete_transaction. An agent can identify exactly what is being removed without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear pre-call guidance ('confirm with the user before calling') and tells the agent where to obtain the ID ('from get_investment_transactions'). However, it never explicitly contrasts this with delete_transaction or states when an agent should prefer an alternative such as update_investment_transaction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_payeeAInspect
Delete a Payee. Linked transactions retain their categoryId but their payeeId is set to null. Use cautiously — this is irreversible. Requires finance:delete scope.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Payee id to delete. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it declares irreversibility, the exact side effect on linked records (categoryId retained, payeeId nulled), and the required finance:delete scope. It stops short of describing the response or failure behavior (e.g., deleting a missing payee).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero waste, with the destructive side effect and the caution placed before the scope requirement. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with no annotations and no output schema, the description covers the critical unknowns: irreversibility, referential side effects, and authorization scope. Only the return/error behavior is left unstated, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single id parameter with 100% schema description coverage; the schema already says 'Payee id to delete.' The description adds nothing parameter-specific, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a Payee') and immediately qualifies the scope with what happens to linked transactions. An agent can distinguish it from create_payee, update_payee, and merge_payees without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use cautiously — this is irreversible' sets a usage caution, but it never names an alternative such as merge_payees for the common case of consolidating duplicate payees, nor states when-not-to-use. Usage is implied rather than routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_portfolioAInspect
Permanently delete a portfolio and, if force is true, all its holdings, transactions, and cash balances. Without force, deletion is blocked when the portfolio has any data. This action is irreversible — confirm with the user before calling. Obtain portfolioId from get_portfolios.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | If true, also deletes all holdings, transactions, and balances associated with this portfolio. Default: false. | |
| portfolioId | Yes | Portfolio ID to delete (from get_portfolios) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and does well: it discloses irreversibility, the cascade destruction of holdings/transactions/balances under force, the blocking condition, and a confirmation requirement. It omits permission/auth requirements and rate limits, which is the remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences: core action first, then the flag semantics, then the safety warning and ID source. No filler and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with no annotations and no output schema, the definition covers action, cascading effects, blocking condition, and irreversibility well. Missing only ancillary details like auth requirements or the effect on linked venture/transfer records.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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's explanation of force largely mirrors the schema's own description, and 'Obtain portfolioId from get_portfolios' repeats the schema note, so it adds little meaning beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Permanently delete a portfolio') and immediately qualifies scope with the cascade behavior tied to the force flag. An agent can distinguish this from the sibling create_portfolio, update_portfolio, and get_portfolios without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly explains the force/no-force decision ('Without force, deletion is blocked when the portfolio has any data') and prescribes a user confirmation step. It does not name a sibling alternative (e.g., a soft-archive path) for cases where deletion is undesirable, so it stops short of explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_splitAInspect
Delete a single split from a transaction by its split ID (UUID string). DESTRUCTIVE: the split amount returns to the primary category. Fails if the split has refunds targeting it.
| Name | Required | Description | Default |
|---|---|---|---|
| splitId | Yes | UUID of the split to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose key behavior: the operation is DESTRUCTIVE and the split amount returns to the primary category. It also names a failure condition when refunds target the split. It stops short of mentioning auth requirements or reversibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences that front-load the action and identifier, then layer the destructive side effect and failure condition. No filler text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter deletion tool with no output schema, the definition covers purpose, side effect, and failure condition. Minor gaps remain (auth needs, relationship to the parent transaction), 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single parameter is already fully documented as 'UUID of the split to delete'. The description's '(UUID string)' merely restates that format and adds no new semantics. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (split) with an explicit scope ('a single split from a transaction'). It clearly distinguishes itself from siblings like split_transaction (creates splits) and delete_transaction (removes the whole transaction), so an agent can identify it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an implicit when-not condition ('Fails if the split has refunds targeting it') but does not name alternatives such as split_transaction or delete_transaction or state prerequisites. Usage is only implied, not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_subscriptionAInspect
Permanently delete a subscription or recurring bill. Linked transaction associations are also removed. This action cannot be undone. Requires finance:delete scope.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | UUID of the subscription to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it discloses irreversibility ('cannot be undone'), a cascade side effect ('Linked transaction associations are also removed'), and the required auth scope ('finance:delete scope'). It stops short of clarifying whether linked transactions themselves are deleted or merely unlinked, so 'associations' remains ambiguous.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and its permanence, then the cascade effect, then the permission requirement. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with no annotations and no output schema, the description supplies the key context an agent needs before invoking: irreversibility, cascading deletion, and required scope. The only real gap is the ambiguity around what happens to the linked transactions themselves.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage ('UUID of the subscription to delete'), so the schema already carries the semantics. The description adds no format or sourcing detail (e.g., where to obtain the UUID), so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb ('Permanently delete') and resource ('a subscription or recurring bill'), immediately distinguishing it from neighboring delete_* tools that target other resources. An agent can select this tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'Permanently' implicitly contrasts with the sibling toggle_subscription_active, but the description never names an alternative or states when deletion is preferable to deactivation/archiving. Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_tagAInspect
Permanently delete a tag by ID. This is destructive — the tag will be removed and unlinked from all transactions. Only call when the user explicitly confirms deletion.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ID of the tag to delete. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses irreversibility ('permanently'), the cascading side effect ('unlinked from all transactions'), and the confirmation requirement. It omits permission/auth requirements and error behavior, keeping it out of 5 territory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the destructive nature before the confirmation gate. Every clause earns its place; nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter delete with no output schema, the description supplies the key facts an agent needs: permanence, unlinking side effect, and the confirmation precondition. Auth requirements and failure modes are the only notable omissions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (id) and schema description coverage is 100%, with a UUID format and pattern fully documented in the schema. The description's 'by ID' adds no syntax or constraint information beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Permanently delete a tag by ID'), and 'permanently' usefully distinguishes it from softer alternatives like archive/update operations in the sibling set. It does not explicitly name a sibling to route against, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit gating precondition: 'Only call when the user explicitly confirms deletion.' That is clear when-to-use guidance, though it does not contrast with alternatives such as update_tag or archive-style operations, nor describe what to do if confirmation is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_trackerBInspect
Permanently delete a tracker and all its transaction links. This action cannot be undone. Returns { success: true } on completion.
| Name | Required | Description | Default |
|---|---|---|---|
| trackerId | Yes | ID of the tracker to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose the key traits: irreversibility, cascading removal of transaction links, and the return payload. It says nothing about required permissions or any other side effects (e.g. impact on tracker lines or suggestions), so it is partial rather than complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action and immediately followed by the irreversible warning and return shape. Nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description supplies the success response shape, plus scope and irreversibility. Only permission requirements and collateral effects on adjacent resources are unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter is fully specified with type, format, pattern and description. The description adds no parameter-level detail, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (delete) plus resource (tracker) and scope (all its transaction links). The adverb 'Permanently' implicitly distinguishes it from archive_tracker, but no sibling is named, so an agent must infer the archive-vs-delete choice itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance. For an irreversible destructive tool with archive_tracker available as a non-destructive alternative, the absence of any routing hint is a meaningful gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_tracker_lineAInspect
Permanently delete a line from a tracker. Transactions are kept; their spending moves to the next matching line or to "other". Requires manage access to the tracker. Returns { success: true } on completion.
| Name | Required | Description | Default |
|---|---|---|---|
| lineId | Yes | ID of the line to delete | |
| trackerId | Yes | ID of the tracker the line belongs to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries the full burden and does so well: it discloses irreversibility ('Permanently delete'), the non-obvious side effect (transactions survive and their spending is reassigned to the next matching line or 'other'), the required permission level, and the return value. This is exactly the destructive-operation context 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler, and the destructive nature is front-loaded before the side-effect and permission details. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no output schema, the description covers permanence, cascade behavior, authorization, and the response shape ({ success: true }), leaving no gap an agent would need to guess at before calling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (lineId, trackerId) are documented in the schema, so the description adds no syntax or format detail beyond it. Baseline 3 for a fully-covered 2-parameter schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb plus resource ('Permanently delete a line from a tracker'), which cleanly separates it from delete_tracker, delete_transaction and update_tracker_line in a crowded sibling list. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when it applies ('Permanently delete a line') and gives a precondition ('Requires manage access to the tracker'), but never names an alternative or a when-not condition (e.g. archive_tracker, remove_transactions_from_tracker, update_tracker_line). Usage is inferable but not routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_transactionAInspect
Permanently delete a transaction by ID. DESTRUCTIVE: this cannot be undone. For transfer transactions, both sides of the transfer are deleted.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ID of the transaction to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does meaningful work: it discloses irreversibility ('cannot be undone') and the non-obvious cascade that both legs of a transfer are removed. It stops short of stating permission requirements or what happens to linked items like splits, tags, or refund links.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the destructive warning front-loaded immediately after the purpose. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with no output schema and no annotations, the key risks (permanence, transfer cascade) are covered. Remaining gaps are secondary details like auth needs and treatment of linked records.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'id' param is fully documented as a UUID with a pattern, so the schema already does the work. The description adds only 'by ID', which is baseline-level reinforcement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Permanently delete a transaction') and the identifier used to target it. It is distinguishable from the many other delete_* siblings by naming the resource, though it never explicitly contrasts itself with delete_investment_transaction or the archive_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus alternatives such as archive_account, delete_transaction_group, or delete_split, nor any prerequisites or preconditions. The agent is left to infer that this is the tool for removing a single transaction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_transaction_automationAInspect
Permanently delete a transaction automation rule. Transactions the rule already changed keep their values. This cannot be undone, so only call it when the user explicitly confirms deletion; to stop a rule temporarily set isEnabled to false via update_transaction_automation instead. Returns { success: true } on completion. Requires finance:delete scope.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | UUID of the automation to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses irreversibility ('This cannot be undone'), the side effect on already-changed transactions ('keep their values'), the required auth scope (finance:delete), and the return shape. Nothing critical is left undisclosed for a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five short sentences, each carrying distinct information (destructive semantics, side effect, confirmation requirement, alternative, return value, scope) and front-loaded with the core action. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive single-parameter tool with no annotations and no output schema, the description supplies everything an agent needs: irreversibility, confirmation requirement, alternative path, required scope, and the return value.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter whose schema description coverage is 100%, so the schema already documents 'id' as the UUID of the automation. The description adds no syntax or format detail beyond that, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (permanently delete) and precise resource (transaction automation rule), and distinguishes itself from sibling delete tools like delete_transaction_group by naming the exact entity. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call it (only on explicit user confirmation of deletion) and provides a named alternative for the adjacent case (set isEnabled to false via update_transaction_automation to stop a rule temporarily). This is a textbook when/when-not/alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_transaction_groupAInspect
Permanently delete a transaction group. The transactions themselves are NOT deleted — only the grouping is removed. This action cannot be undone. Requires finance:delete scope.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ID of the transaction group to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so well: it discloses irreversibility ('cannot be undone'), the exact scope of destruction (group only, not transactions), and the required permission scope (finance:delete). This is exactly the context an agent needs before invoking a destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action, then the critical scope caveat, then the reversibility warning and permission requirement. 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.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with no annotations and no output schema, the description covers everything an agent needs: what is destroyed, what is preserved, irreversibility, and auth scope. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% – the single 'id' parameter is fully documented as 'ID of the transaction group to delete' with format and pattern constraints. The description adds no syntax or format detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Permanently delete a transaction group') and immediately clarifies scope by distinguishing it from deleting the underlying transactions. This sharply differentiates it from the sibling delete_transaction and remove_transactions_from_group.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the use case clear (destructive group removal) and implicitly routes away from delete_transaction, but it doesn't name the alternative tool or explicitly state when to prefer removing transactions from a group versus deleting the group itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_venture_dealAInspect
Delete a venture deal. Cascade-deletes its events and event-link rows. Bank transactions previously linked to the deal's events remain intact in the main transactions list with their original state restored. With force=true the deal row is hard-deleted; otherwise it is soft-deleted. Confirm with the user before calling.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | If true, hard-delete the deal row. Default: false (soft-delete). | |
| dealId | Yes | Venture deal ID (from list_venture_deals) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses destruction scope (cascade-deletes events and event-link rows), a non-obvious side effect (linked bank transactions remain intact and are restored to their original state), and reversibility (soft-delete vs hard-delete via force). These are exactly the traits an agent needs before invoking a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action in the first sentence, then layers cascade scope, side effects, and confirmation guidance in a logical order. Slightly redundant with the schema on the force behavior, but every sentence is otherwise informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema or annotations exist, so the description must stand alone, and it covers destruction scope, side effects, and reversibility adequately for correct invocation. Permission/auth requirements and error conditions are unaddressed, which is the only meaningful remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents both parameters, including the force default and dealId provenance ('from list_venture_deals'). The description restates the force semantics rather than adding meaning beyond them, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a venture deal') and immediately scopes it with cascade behavior. An agent can distinguish it from sibling deletes like delete_venture_event or delete_venture_platform because the target resource is named precisely and the cascade relationship to those siblings is spelled out.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context including a precondition ('Confirm with the user before calling') and explains the force parameter's selection semantics. It does not name alternatives or when-not-to-use conditions, but there is no obvious competing sibling that needs routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_venture_eventAInspect
Delete a venture event. Linked bank transactions are unlinked first (their original state is restored). The initial_investment cannot be deleted while other events still exist on the deal — delete the other events first. Pass deleteLinkedTransactions=true to also remove the bank tx rows themselves (not just the link); only do this when the user explicitly asks. Confirm with the user before calling.
| Name | Required | Description | Default |
|---|---|---|---|
| eventId | Yes | Venture event ID (from list_venture_events) | |
| deleteLinkedTransactions | No | If true, also delete the bank transaction rows that were linked. Default: false (unlink only). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it discloses that linked bank transactions are unlinked first and their original state restored, that setting deleteLinkedTransactions=true permanently removes bank transaction rows, and that the initial_investment has a dependency constraint. It also adds a safety instruction to confirm with the user.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then each following sentence adds distinct operational value: side effects, dependency, parameter semantics, and a safety check. There is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a delete tool with no annotations and no output schema, the description covers the essential context: what is deleted, what happens to linked transactions, dependency restrictions, the destructive option, and a confirmation requirement. No critical behavioral gap remains 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, establishing a baseline of 3. The description goes beyond the schema by explaining the user-explicit-ask condition for deleteLinkedTransactions and the special constraint on the initial_investment event, but it adds no further semantic detail for the eventId parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Delete a venture event') and adds constraints that clarify the scope. However, it does not explicitly distinguish this tool from sibling delete tools such as delete_venture_deal or delete_venture_platform, so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong when/when-not guidance: deleteLinkedTransactions only 'when the user explicitly asks', initial_investment cannot be deleted while other events exist, and it says to confirm before calling. It does not name alternative tools (e.g., update_venture_event or delete_venture_deal) to route the agent, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_venture_platformAInspect
Delete a venture platform. Existing deals that reference it have their platformId cleared (deals are preserved). With force=true, hard-deletes the platform; otherwise it is soft-deleted. Confirm with the user before calling — operates against the user's records.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | If true, hard-delete the platform. Default: false (soft-delete). | |
| platformId | Yes | Venture platform ID (from list_venture_platforms) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations to lean on, the description carries the full load and does so well: it discloses the effect on related records (references have platformId cleared, deals preserved), the hard-vs-soft delete distinction for force, and the requirement to confirm with the user. This is exactly the behavioral context an agent needs before mutating user data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action and side effects; the confirmation warning comes last as an operative caveat. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation tool with no annotations and no output schema, this covers side effects, the force decision, and user confirmation. It stops short of stating whether a hard delete is irreversible or what permissions are required, which would fully close the gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds real meaning beyond the schema by explaining the consequence of force (hard delete vs default soft delete) and the preservation of referencing deals.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Delete a venture platform') and is clearly distinguishable from siblings like delete_venture_deal and delete_venture_event. An agent knows exactly what this targets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a confirmation instruction ('Confirm with the user before calling') and implies the force flag's decision point, but never states when to choose this over archive-style alternatives or when to prefer soft vs hard delete beyond the parameter's own semantics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detect_subscription_candidatesAInspect
Scan the past 12 months of transactions to detect recurring payment patterns and generate subscription candidates. This operation can be slow on large transaction histories. Results are cached for 1 hour — subsequent calls within the cooldown return cached candidates. Check isFromCache in the response to know if the data is fresh. Requires finance:write scope (writes candidate records).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it warns the operation 'can be slow on large transaction histories,' discloses a 1-hour result cache, tells the agent to read isFromCache for freshness, and states the required finance:write scope and its side effect (writes candidate records). This is exactly the behavioral context an agent needs before invoking a potentially expensive, mutating scan.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tightly packed sentences, front-loaded with the core action, then performance, caching, and scope. Every sentence adds a distinct operational fact with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description flags the isFromCache response field, and with no parameters and no annotations the remaining burden (performance, caching, auth, side effects) is fully covered. It could go slightly further on how results relate to the existing candidate list, but it is otherwise complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema is empty and there is nothing to document. Baseline for a parameterless tool is 4; the description correctly adds no parameter noise.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Scan the past 12 months of transactions to detect recurring payment patterns and generate subscription candidates.' This clearly distinguishes a detection/generation operation from the read-only sibling list_subscription_candidates. It does not explicitly name that sibling, so it falls just short of the top score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The caching note implies usage ('subsequent calls within the cooldown return cached candidates'), which tells the agent when calling again is worthwhile, but there is no explicit when-to-use versus list_subscription_candidates or create_subscription, and no stated prerequisites beyond the scope requirement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dismiss_subscription_candidateAInspect
Dismiss a pending subscription candidate so it no longer appears in the candidate list. The underlying transactions are unaffected. Only pending candidates can be dismissed. Requires finance:write scope.
| Name | Required | Description | Default |
|---|---|---|---|
| candidateId | Yes | UUID of the subscription candidate to dismiss |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden well: it discloses the non-destructive side effect on underlying transactions, the pending-only precondition, and the required auth scope. This is solid behavioral context for a mutation tool, though it lacks details on return value or reversibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and effect, followed by constraints and scopes. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and one simple parameter, the description provides sufficient context: purpose, side effects, precondition, and required scope. Only minor gaps such as error behavior or return format remain, which are acceptable here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already fully documents candidateId. The description adds no parameter-level detail, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (dismiss) and resource (pending subscription candidate) with the observable effect on the candidate list. Distinguishes from sibling tools like delete_subscription (permanent) and detect_subscription_candidates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly implies usage for pending candidates only ('Only pending candidates can be dismissed') and notes non-destructive relationship to transactions. Does not explicitly name alternatives (e.g., delete_subscription), but the constraint provides good context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_accountsBInspect
List all user accounts with current balances. Returns account name, type, currency, current balance (in original and base currency), and credit limit.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by account type (e.g., "checking", "savings", "credit_card") | |
| includeExcludedFromStats | No | Include accounts excluded from stats. Default: false |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; it implies a read-only listing operation and usefully enumerates the returned fields (balances in original and base currency, credit limit), which no output schema provides. However it says nothing about authentication needs, pagination, ordering, or whether excluded-from-stats accounts appear by default, so behavioral coverage is partial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the first front-loads the action and scope, the second enumerates return contents. Every clause earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless-required read tool with no annotations and no output schema, the description adequately covers purpose and return shape, and the schema covers both parameters. It stops short of noting that no filtering is applied by default or how results are ordered, but nothing essential to invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both the 'type' filter and 'includeExcludedFromStats' flag documented in the schema itself, so the baseline of 3 applies. The description adds nothing about either parameter, so it neither compensates nor detracts.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('List all user accounts with current balances') and enumerates what is returned, so the agent knows exactly what this tool fetches. It is clearly distinct from write siblings like adjust_account_balance or archive_account, though it never explicitly contrasts itself with the nearest read siblings such as get_portfolio_balances or get_user_profile.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to reach for this tool versus alternatives, no prerequisites, and no exclusions. The description only asserts that it lists all accounts, leaving the agent to infer context of use from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_balance_historyAInspect
Get account balance over time. If accountId is provided, returns balance history for that specific account. Otherwise, returns combined balance across all accounts.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | End date (ISO 8601). Default: today | |
| accountId | No | Specific account ID. Omit for combined balance across all accounts. | |
| startDate | No | Start date (ISO 8601). Default: 30 days ago |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. 'Get' implies a safe read, but the description says nothing about granularity of the returned series, pagination, result caps, or auth requirements. It usefully discloses the per-account vs. aggregate branching, but for a no-annotation tool that is only partial coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with the core purpose front-loaded and no filler. The branching clause is placed logically after the purpose statement, though it slightly restates what the schema's accountId description already says.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter, zero-required, read-only query with a fully documented schema and no output schema, the description covers what is queried and the aggregate-vs-single behavior. The main omission is any hint about the shape or granularity of the returned history, which matters slightly without an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — startDate, endDate and accountId all carry their own descriptions including defaults and the 'omit for combined' rule. The description restates the accountId semantics but adds no new syntax, format, or constraint information, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get account balance over time') and clarifies the branching behavior: per-account history when accountId is supplied, combined balance otherwise. It is clear on its own, but it never names the adjacent tools (get_cash_flow, get_portfolio_balances) that an agent might confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives conditional usage for its own parameter ('If accountId is provided... Otherwise...'), which is genuinely helpful. However it offers no guidance on when to prefer this tool over get_cash_flow or get_portfolio_balances, so routing among balance-related siblings 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.
get_cash_flowBInspect
Get income, expenses, and net cash flow for a period with configurable granularity (monthly/biweekly/weekly). Returns period-by-period breakdown plus totals with savings rate.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | Yes | Period end date (ISO 8601). Required. | |
| accountId | No | Filter by specific account ID | |
| startDate | Yes | Period start date (ISO 8601). Required. | |
| categoryIds | No | Filter by category IDs | |
| granularity | No | Time granularity. Default: monthly |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses the return shape (period-by-period breakdown, totals, savings rate), which is real value given there is no output schema. However, it says nothing about read-only safety, permissions, or rate limits for what is evidently a read query.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the resource and scope front-loaded and zero filler. Could be slightly tighter by folding the parenthetical enum restatement, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description compensates by describing the return contents (breakdown, totals, savings rate), which is the key missing structured info. It is complete enough to call the tool correctly, with the usage-guidance gap the main shortfall.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are already documented. The description restates the granularity options (monthly/biweekly/weekly) which are already in the enum, and adds no syntax or semantics beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb+resource: 'Get income, expenses, and net cash flow for a period' with configurable granularity. Distinguishes itself by aggregating income + expenses + net flow, but does not name any sibling such as get_expenses_for_period or get_spending_by_categories, so an agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies a per-period reporting use case but gives no explicit when-to-use, when-not-to-use, or alternatives. With siblings like get_expenses_for_period and get_spending_by_categories in the same family, the agent gets no routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_categoriesAInspect
List all transaction categories. Returns category ID, name, color, icon, type (income/expense), and parent ID for hierarchical categories.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully discloses the return fields (id, name, color, icon, type, parent id) and the hierarchical parent relationship, but says nothing about ordering, pagination, completeness, or whether it includes archived categories.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with no filler. The primary purpose is front-loaded and the return-field detail follows it, so every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description must carry the return contract itself, and it does enumerate the fields. It is close to complete for a trivial zero-param list tool; only ordering/archived-item behavior is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter syntax to document; the baseline for a 0-param tool is 4. The description appropriately uses its space to describe output rather than nonexistent inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List all transaction categories') and enumerates the fields returned, so the agent knows exactly what it produces. It does not explicitly differentiate itself from siblings like get_spending_by_categories or get_tags, but the resource is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no exclusions, and no named alternative. 'List all' implies no filtering, but the description never tells the agent when to prefer this over create_category/update_category/get_spending_by_categories or how to get a single category.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_expenses_for_periodAInspect
Get total expense amount for a date range. Returns a single total number. Use this for quick "how much did I spend" queries instead of summing transactions manually.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | End date (ISO 8601). Default: today | |
| accountId | No | Filter by specific account ID | |
| startDate | No | Start date (ISO 8601). Default: start of current month | |
| excludedCategoryIds | No | Exclude specific category IDs from total |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does disclose the return shape ('a single total number'), which is real value given there is no output schema, but it says nothing about whether transfers/refunds are included, permission requirements, or any rate limits. Adequate but thin for a zero-annotation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, zero filler, front-loaded with what it returns before the usage hint. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-param read tool with no output schema and no annotations, the description covers purpose, return type, and use case, while the schema covers all parameter semantics. The remaining gap is edge-case behavior (what is included or excluded in the total), which an agent would plausibly want.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% – defaults for startDate/endDate, the account filter, and the category-exclusion list are all documented in the schema. The description adds no syntax, format, or interpretation beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (get total expense amount) plus the scope (a date range) and the return shape (a single total number). The 'single total number' framing cleanly separates it from the aggregate-breakdown siblings like get_spending_by_categories or get_cash_flow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the use case ('quick how much did I spend queries instead of summing transactions manually'), which tells the agent when to reach for it over search_transactions. It does not name any sibling tool as an alternative or state when this tool is the wrong choice, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_goalsAInspect
List savings goals (active, paused, archived) in the user's order. Each goal has a target amount in its own currency (currencyCode), an optional targetDate and plannedMonthly, and the accounts backing it. Of an account's balance (minus its credit limit, never below 0), each fixedAmount (account currency) is taken first in fixedPosition order, then sharePercent is the part of what is left that counts toward the goal; exactly one of the two is set. progress holds currentValue, remaining, pace (plannedMonthly when set, else the median monthly change over recent full months), historicalPace, neededMonthly to hit targetDate, etaMonths and daysLeft, all amounts in the goal currency; progress.status is one of no_accounts, reached, overdue, no_date, insufficient_history, ahead, on_track, behind, paused, archived; it stays reached within reachedHoldDays of achievedAt even after a dip. progress is null when the goal currency has no exchange rate today. achievedAt/achievedAmount are set when the goal last reached its target; cleared when the target or currency changes, or when the goal is below target after reachedHoldDays. Not the envelope line goals of the Budget plan.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and largely meets it: it discloses computation semantics (fixedAmount vs sharePercent ordering, credit-limit floor), the status enumeration, the reachedHoldDays stickiness rule, achievedAt clearing conditions, and when progress is null. It does not discuss authorization, caching, or rate limits, so the behavioral picture of the read itself is incomplete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The basic purpose is front-loaded in the first sentence, but the remaining content is a single dense run-on covering currency conversion, allocation rules, and nine status values with no bullet structure or paragraph breaks. Every sentence carries information, but the wall of text makes it hard for an agent to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, so the description must explain the return shape, and it does so exhaustively: per-goal currency, target fields, backing accounts, the full progress object, all status values, and null-progress conditions. Nothing an agent needs to interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies; there are no parameter semantics to add or omit. The description does not need to explain inputs because none exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource ('List savings goals') plus scope ('active, paused, archived') and ordering, and the final sentence explicitly excludes the Budget plan's envelope line goals, which is the distinguishing feature from sibling get_trackers. An agent can select this tool without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context (read/list savings goals) and an explicit exclusion ('Not the envelope line goals of the Budget plan'), but never states when to prefer it over siblings such as get_trackers or when a goal list is inappropriate. The routing is inferable rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_investment_transactionsAInspect
Investment transaction history: buy, sell, dividend, transfer, tax, fee, cancel, other. Each transaction includes amount, quantity, price, fees, date, category, and the embedded security. Distinct from search_transactions, which covers regular (non-investment) spending. Default: 20 most recent across all portfolios.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default: 20) | |
| offset | No | Pagination offset (default: 0) | |
| endDate | No | End date (ISO 8601) | |
| category | No | Filter by transaction category | |
| startDate | No | Start date (ISO 8601) | |
| securityId | No | Restrict to a specific security | |
| portfolioId | No | Restrict to a specific portfolio |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden; it discloses the default window (20 most recent across all portfolios) and the returned fields, which is useful. However, it says nothing about pagination interaction with defaults, ordering guarantees, or any permission expectations for a financial data read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences that front-load what the tool returns before the sibling differentiation and default scope. The category enumeration is somewhat listy but earns its place by hinting at filterable values.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with a fully documented schema but no output schema, the description usefully enumerates the returned fields (amount, quantity, price, fees, date, category, embedded security) and the default scope. Only pagination/ordering semantics are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the schema; the description only reiterates the default limit of 20 and lists the category values already present as an enum. No additional syntax, format, or interaction guidance beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Investment transaction history') and enumerates the categories it covers, plus explicitly distinguishes itself from search_transactions which handles non-investment spending. An agent can unambiguously tell this apart from its closest sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative tool (search_transactions) and the condition that selects it, and states the default behavior (20 most recent across all portfolios). It lacks explicit 'when not to use' guidance for the other investment siblings like get_portfolio_holdings or list_portfolio_transfers, but the core routing is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_payeeAInspect
Fetch a single Payee with aliases and computed stats. Useful when the user references a merchant by id and wants its full record.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Payee id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It does reveal return content (aliases, computed stats), which is useful, but it never states that this is a read-only operation or what happens on an unknown id. Adequate but with a real gap for an annotation-free tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the primary action front-loaded and the usage condition second. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with no output schema, the description supplies the essentials: what it returns (aliases, stats) and when to reach for it. Only the absence of read-only confirmation and not-found behavior keeps it from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the sole parameter is documented as 'Payee id.' The description adds only that this id refers to a merchant/payee lookup, which is marginal. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch a single Payee') and adds the payload detail ('with aliases and computed stats'). The word 'single' implicitly separates it from the sibling list tool get_payees, though it never names that sibling explicitly, so it stops just short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger condition: use it when the user references a merchant by id and wants the full record. That is clear usage context, but it names no alternatives (e.g. get_payees for listing) and states no exclusions or failure cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_payeesAInspect
List Payees (merchants/counterparties) for the user, optionally filtered by a substring query. Returns Payee id, name, defaultCategoryId, and aggregated stats (transactionCount, netFlowRef, top category, last seen).
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Substring filter applied to the normalized Payee name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the disclosure burden. It partially meets it by naming the return shape (id, name, defaultCategoryId, aggregated stats) and the read-only listing semantics implied by 'List'. It stops short of stating pagination, result limits, or sort order — material omissions for a list endpoint with 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler, front-loaded with the verb and resource, then the filter, then the return shape in a parenthetical. The return enumeration is slightly dense but each clause carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter list tool with no output schema and no annotations, the description supplies the purpose, the filter semantics, and the return fields, which is the bulk of what an agent needs. The remaining gaps are pagination/limits and explicit sibling routing, both minor but non-trivial.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: the single 'q' parameter is already documented in-schema as a substring filter on the normalized payee name. The description adds only the word 'optional' beyond the schema. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List Payees') and disambiguates the domain term by defining a payee as 'merchants/counterparties for the user'. It also enumerates the returned fields, so an agent knows this is a bulk-listing read. It does not explicitly contrast with the sibling 'get_payee' (singular), leaving that differentiation to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description notes the filter is 'optional' and applied as a 'substring query', which implies the no-arg path lists everything. However, there is no explicit when-to-use guidance and no mention of the sibling tools an agent might reach for instead (get_payee for one payee, merge_payees for consolidation). 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_portfolio_balancesAInspect
Cash balances held in a portfolio, broken down per currency. Each entry includes totalCash and availableCash in the original currency plus their ref* equivalents converted to the user's base currency. Useful for answering 'how much cash do I have to invest'.
| Name | Required | Description | Default |
|---|---|---|---|
| portfolioId | Yes | Portfolio ID (from get_portfolios) | |
| currencyCode | No | ISO 4217 currency code (e.g., "USD"). Omit to return balances in all currencies. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the disclosure burden. It does useful work by describing the response shape (totalCash, availableCash, and converted ref* fields), but says nothing about read-only nature, permissions, or freshness of the balance data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core definition before the response detail and the use-case hint. No filler, though the third sentence is more of a nice-to-have than essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully explains what each entry contains and the base-currency conversion, covering the main return-value gap. For a simple read tool it is nearly complete; only permissions and read-only confirmation are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%: both portfolioId and currencyCode are documented in the schema, including the 'omit to return all currencies' behavior. The description adds no parameter-level detail beyond what the schema already provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (get) and resource (cash balances in a portfolio), plus the scope (broken down per currency). An agent can tell this apart from holdings/summary tools in spirit, but the description never names the closest siblings (get_portfolio_holdings, get_portfolio_summary), so differentiation is implicit rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The closing line gives an implied use case ('how much cash do I have to invest'), which signals when to reach for it. There is no explicit when-not guidance and no named alternative for portfolio value or holdings questions, so routing still requires inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_portfolio_holdingsBInspect
Positions held in a portfolio with dynamically calculated market value, cost basis, and realized/unrealized gain (value and percent). Each holding includes the embedded security (symbol, name, asset class, currency). Filter by securityId to look at a single position.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date for historical valuation (ISO 8601). Default: latest available prices | |
| securityId | No | Filter to a specific security | |
| portfolioId | Yes | Portfolio ID (from get_portfolios) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does usefully disclose that values are 'dynamically calculated' and that each holding embeds a security object, which sets expectations for the response shape. However, it says nothing about authorization requirements, pagination behavior for large portfolios, or how the historical date interacts with the required portfolioId, leaving real gaps for a read tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the core purpose and returned fields front-loaded, followed by supporting detail and the filter hint. Every sentence contributes; no filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 work of describing return values, covering computed fields, the embedded security, and the securityId filter. For a straightforward read tool this is nearly complete, though a note on result size or pagination would close the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented (date defaults to latest prices, securityId filters, portfolioId sourced from get_portfolios). The description reinforces the securityId filter with the phrase 'look at a single position' but adds little syntax or semantics beyond the schema. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (portfolio holdings) and enumerates the computed fields returned (market value, cost basis, realized/unrealized gain) plus the embedded security object. This is far more informative than a generic list tool. It doesn't, however, explicitly distinguish itself from siblings like get_portfolio_summary or get_portfolio_balances, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage hint is 'Filter by securityId to look at a single position,' which is parameter usage rather than when-to-use guidance. There is no statement about when to prefer this over get_portfolio_summary, get_portfolio_balances, or get_portfolios, which are the obvious alternatives in the sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_portfoliosAInspect
List the user's investment portfolios. Returns id, name, portfolio type (investment/retirement/savings/other), description, enabled state, and creation date. Use the returned id with get_portfolio_summary, get_portfolio_holdings, get_portfolio_balances, and get_investment_transactions.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results | |
| offset | No | Pagination offset (default: 0) | |
| isEnabled | No | Filter by enabled state | |
| portfolioType | No | Filter by portfolio type |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers: it enumerates the returned fields (id, name, type, description, enabled state, creation date), which is valuable since no output schema exists. It does not mention pagination behavior or auth, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, tightly front-loaded with the core purpose, then return shape, then downstream usage. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-param, no-output-schema list tool this is nearly complete: purpose, return fields, and follow-up routing are all present. Only pagination semantics and the enabled/type filter semantics go unmentioned, which is minor given the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so limit, offset, isEnabled, and portfolioType are already documented with the type enum inline. The description adds no format or semantics beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (user's investment portfolios), and distinguishes from drill-down siblings like get_portfolio_summary and get_portfolio_holdings. An agent can tell exactly what this returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent forward: 'Use the returned id with get_portfolio_summary, get_portfolio_holdings, get_portfolio_balances, and get_investment_transactions.' This is clear context for a list-then-drill workflow, though it offers no when-not or filter-selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_portfolio_summaryBInspect
Portfolio-level aggregates for a single portfolio: total current market value, total cost basis, realized and unrealized gains (value and percent), cash balances, and total portfolio value (holdings + cash). All monetary values are decimals in the user's base currency.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date for historical snapshot (ISO 8601). Default: latest available prices | |
| portfolioId | Yes | Portfolio ID (from get_portfolios) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It adds genuine context ('All monetary values are decimals in the user's base currency'), which is useful, but says nothing about permissions, read-only nature, or rate limits. Adequate but incomplete for an annotation-free tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single well-formed sentence that is front-loaded with the scope ('portfolio-level aggregates for a single portfolio') and then the returned fields. No wasted words, though the trailing currency note could be more tightly integrated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description takes on the job of explaining return values, and it does so by enumerating the aggregate metrics returned. Combined with the base-currency/decimal note, an agent knows what to expect. It would be complete at 5 if it also clarified the date-snapshot vs latest-price behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (portfolioId and date) are already fully documented in the schema, including the reference to get_portfolios. The description adds no parameter syntax or format detail beyond what the schema supplies, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource ('portfolio-level aggregates for a single portfolio') and enumerates exactly what it returns: market value, cost basis, realized/unrealized gains, cash balances, and total value. This is far more than a tautology. It falls short of a 5 because it never distinguishes itself from close siblings like get_portfolio_holdings or get_portfolio_balances.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by listing the aggregate fields, but never states when to choose this over get_portfolio_holdings, get_portfolio_balances, or get_portfolios. There is no when-to-use, when-not, or alternative routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_spending_by_categoriesBInspect
Get spending breakdown by category for a date range. Returns each category with its total amount. Great for understanding where money goes. Defaults to current month expenses.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | End date (ISO 8601). Default: today | |
| accountId | No | Filter by specific account ID | |
| startDate | No | Start date (ISO 8601). Default: start of current month | |
| categoryIds | No | Only include specific category IDs | |
| transactionType | No | Transaction type. Default: expense | |
| excludedCategoryIds | No | Exclude specific category IDs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose two useful traits: the per-category-total return shape and the current-month default window. It omits other behavioral context such as whether values are aggregated across accounts, currency, rounding, or sorting of results, so the safety/behavior profile is only partially covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences front-load the core behavior and return shape, with no wasted preamble. The sentence 'Great for understanding where money goes' is promotional filler rather than actionable information, which keeps it just short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter, flexible read tool with no output schema and no annotations, the description supplies the essential return format and default window, which is genuinely needed. It still leaves gaps around multi-filter interaction, aggregation scope, and result ordering that an agent would benefit from knowing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (accountId, categoryIds, excludedCategoryIds, transactionType, dates) is already documented in the schema. The description only restates the date range and the current-month default, adding nothing about the filter interplay, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource ('Get spending breakdown by category for a date range') and states the return shape ('each category with its total amount'). It is clearly distinguishable from generic list tools, though it never names the adjacent analysis siblings (get_budget_spending_stats, get_expenses_for_period, get_cash_flow) that an agent could confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Defaults to current month expenses' and 'Great for understanding where money goes' imply an analytical/browsing use case, but there is no explicit when-to-use or when-not-to-use guidance relative to the sibling spending/expense tools. Usage must be inferred from the phrasing 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_subscription_by_idAInspect
Retrieve a single subscription by its ID including all linked transactions (with match source and date) and the computed next expected payment date.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | UUID of the subscription to retrieve |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It does usefully disclose the response payload (linked transactions with match source and date, plus a computed next expected payment date), which is real value beyond the name. However, it says nothing about permissions, behavior when the ID is unknown, or whether the read is paginated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the verb and resource, and every clause (linked transactions, match source and date, next expected payment date) conveys distinct information. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the returned fields, which is exactly what an agent needs to interpret the result. It is close to complete for a one-parameter read; only error/edge-case behavior is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'id' parameter is already documented as a UUID in the schema. The description adds only the redundant framing of 'by its ID', so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Retrieve') and a precisely scoped resource ('a single subscription by its ID'), which implicitly separates it from the list-oriented sibling get_subscriptions. It does not name any sibling explicitly, so it falls just short of the top band.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'by its ID' tells the agent this is the point-lookup path when a subscription identifier is already known. There is no explicit statement of when to prefer this over get_subscriptions, get_subscriptions_summary, or get_upcoming_subscription_payments.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_subscriptionsBInspect
List all subscriptions and recurring bills for the user. Returns name, frequency, expected amount, linked account/category, active state, and linked transaction count. Use isActive to filter active-only.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by type: "subscription", "bill", or "installment" | |
| isActive | No | Filter by active state. Omit to return all subscriptions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the burden. It helpfully enumerates the returned fields (name, frequency, amount, linked account/category, active state, transaction count), but does not state that it is read-only, whether results paginate, or any auth/rate constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core purpose front-loaded and no filler. The trailing isActive sentence is slightly redundant against the schema but still short and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by listing return fields, and both parameters are covered. Adequate for a simple read-only list tool, though the lack of sibling routing leaves a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented in the schema; the description's isActive sentence largely restates the schema's 'Filter by active state' text. The enum parameter 'type' (subscription/bill/installment) is not mentioned in the description at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (subscriptions and recurring bills), plus what the records contain. Clear purpose, but it does not differentiate itself from close siblings like get_subscriptions_summary, get_subscription_by_id, or get_upcoming_subscription_payments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Only offers 'Use isActive to filter active-only', which is a parameter hint rather than usage guidance. No when-to-use-vs-alternatives or exclusions are given, so an agent must infer this is the unfiltered bulk-listing call from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_subscriptions_summaryAInspect
Aggregate summary across all active subscriptions with an expected amount, split by direction. Returns estimated monthly cost and projected yearly cost from expense subscriptions, expected monthly income from income subscriptions, active counts as { expense, income }, the user's average monthly income over the last 6 complete months (observed from transaction history, separate from subscription-based expected income), and percent of that income spent on subscriptions (all monetary values in the user base currency). Useful for "how much am I spending on subscriptions per month?", "how much recurring income do I have?", or "what share of my income goes to subscriptions?"
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Limit the summary to a specific type: "subscription", "bill", or "installment" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations and no output schema, the description carries the full disclosure burden and does so well: it details what each returned figure represents and even notes the average income is observed from transaction history and separate from subscription-based expected income. It says nothing about permissions, currency-conversion behavior, or performance, which caps it below 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the opening clause, and each subsequent item earns its place by specifying a return metric. It is a heavy run-on enumeration, though, and could be tightened with a list rather than one long sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must explain return values, and it does so comprehensively, plus it adds the six-month income calculation context. The only real gap is that the type filter from the schema is never acknowledged, creating a small mismatch with the 'all active subscriptions' framing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single enum parameter is fully documented in the schema, so the baseline is 3. The description never mentions the type filter and instead says 'all active subscriptions', which could mislead an agent into thinking the tool cannot be scoped to bills or installments.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific aggregate operation ('Aggregate summary across all active subscriptions... split by direction') and enumerates exactly which metrics it produces (monthly cost, yearly cost, expected income, active counts, average income, share spent). This scope is clearly distinct from the listing tools get_subscriptions / get_subscription_by_id, so an agent can route correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It supplies concrete trigger questions ('how much am I spending on subscriptions per month?', 'how much recurring income do I have?', 'what share of my income goes to subscriptions?') that map cleanly to invocation intent. It does not, however, name alternative tools or state when NOT to use it (e.g. use get_subscriptions for the raw list), so it stops short of 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_tagsAInspect
List all user tags. Returns tag ID, name, color, and icon.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It signals a non-mutating read and goes beyond the name by naming the returned fields, but it says nothing about ordering, pagination, or whether the list is workspace-scoped or filtered by user.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, purpose first and return fields second, with no filler. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema present, the description usefully enumerates the returned fields (ID, name, color, icon), covering the main gap an agent would otherwise have. It is complete enough for a simple parameterless list call, though ordering and result-shape caveats are unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to document. Per the baseline for parameterless tools, a 4 is appropriate; the description wastes no effort inventing arguments.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'List all user tags', which clearly distinguishes it from the sibling mutations create_tag, update_tag, and delete_tag. It does not, however, differentiate itself from the other get_*/list_* read siblings, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the usage ('List all user tags') but gives no explicit when-to-use guidance, prerequisites, or named alternatives such as retrieving a single tag by ID. For a trivial zero-parameter lister this implied framing is adequate but not instructive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_trackersAInspect
List trackers: spending watchers over a date range with an optional limit, holding hand-picked transactions plus those their category and tag rules link. They are not the period-based Budget plan (lines, assigned amounts, Ready to Assign), which no tool exposes. Filter by status (active, archived, closed). Returns tracker name, limit amount, status, date range, rule categories and tags, rulesEnabled (rules auto-link matching transactions of the owner), rulesCleanup (rule links that stop matching are removed), and lines: named category sets with their own optional limit (name, limitAmount as decimal, position, categories). A transaction lands in at most one line, the first by position whose categories (expanded to children) contain it; unmatched spending is "other". Per-line spent is in get_tracker_spending_stats. Smart tracking fields (owner-only): aiEnabled, aiDescription (what the AI looks for), aiPreWindowDays (days before startDate also scanned), aiLastScannedAt; its suggestions are in list_tracker_suggestions.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter by tracker status. Default: active |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the burden: it explains rulesEnabled (auto-links matching transactions), rulesCleanup (removes links that stop matching), the per-line allocation logic (first line by position whose categories contain the transaction, unmatched as 'other'), and owner-only AI fields. Rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and then elaborates on return fields. The text is dense but every clause conveys needed information about return structure; it could be split into bullet-like segments for readability but remains front-loaded and purposeful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must explain return values, and it does so comprehensively: tracker name, limit amount, status, date range, rule categories and tags, rulesEnabled, rulesCleanup, lines structure, and AI tracking fields. Complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter status has 100% schema coverage including enum values and default. The description merely repeats the enum values ('active, archived, closed') without adding new semantic detail, which matches the baseline 3 when the schema already documents parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'List trackers: spending watchers over a date range with an optional limit'. It explicitly distinguishes them from the period-based Budget plan and from related tools like get_tracker_spending_stats and list_tracker_suggestions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides context that these are not Budget plans and points to get_tracker_spending_stats for per-line spent and list_tracker_suggestions for AI suggestions. It does not explicitly say when to use this versus create_tracker or other siblings, but the scope and alternatives are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tracker_spending_statsAInspect
Get spending statistics for a tracker: spending broken down by category and a time-series of expense vs income over the tracker period. Granularity is daily for ranges ≤62 days, weekly ≤184 days, monthly otherwise. Also returns spending by original currency, the top 5 payees, the biggest spending day, a summary (income, expense, balance, limit utilization %), per-line spent (lines: [{ lineId, spent }], match lineId against get_trackers lines) and otherSpent for spending that matches no line. Amounts are decimals.
| Name | Required | Description | Default |
|---|---|---|---|
| trackerId | Yes | ID of the tracker to retrieve spending stats for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so largely: it discloses the return shape (category breakdown, time series, currency split, top 5 payees, biggest day, summary with limit utilization, per-line spent plus otherSpent fallback) and the daily/weekly/monthly granularity cutoffs (62/184 days). The implied read-only nature and decimal amount format are covered, though permissions/auth expectations are not mentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose followed by tightly packed detail, and every sentence adds information about returns or granularity. It is dense to the point of being a single long run-on paragraph, which slightly hurts scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 must describe returns, and it does so comprehensively: breakdowns, time series, currency, payees, summary metrics, per-line attribution and the otherSpent bucket. An agent has everything needed to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single trackerId parameter, so the schema already documents it; the description adds no extra semantics about the ID format or source. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get spending statistics for a tracker') and immediately scopes the output (category breakdown, expense-vs-income time series over the tracker period). It also references the sibling get_trackers as the source for lineId matching, so an agent can tell what this tool is for without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied (analyzing a tracker's spending), but the description never states when to prefer this over siblings like get_spending_by_categories, get_cash_flow, or get_trackers. It does explain the internal granularity thresholds, which is useful but not a when-to-use rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transaction_automationsAInspect
List the transaction automation rules (rules engine) of the user, ordered by evaluation order. Call it before updating, deleting, or reordering a rule to get its id. Returned fields: position is the 0-based evaluation order (rules run top to bottom on each newly synced or imported bank transaction and the first rule that applies an action wins), isEnabled whether the rule runs at all, matchCount and lastMatchedAt how often and when it last fired, and pausedReason which is non-null when a referenced category, tag, payee, or account was deleted (fix the rule and re-enable it). Automations fire only for new transactions on bank-connected accounts or imported rows, never for transfers, planned transactions, or transactions on manual (non-bank) accounts, and never change existing transactions retroactively.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it documents each returned field's semantics (position as 0-based eval order with first-match-wins, isEnabled, matchCount/lastMatchedAt, pausedReason) and the engine's firing constraints (new bank/imported transactions only, never transfers, planned, or manual-account transactions, never retroactive).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the call-before-mutation guideline, then field semantics and firing rules. Every sentence is informative, though the single dense paragraph is long enough that the field definitions and firing constraints run together.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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's field-by-field explanation of the return shape is exactly the missing context an agent needs, and the firing-condition caveats close the remaining gap for a zero-input list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description adds meaningful semantics about the returned data even though there are no input arguments to clarify.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (transaction automation rules / rules engine), plus scope (of the user, ordered by evaluation order). It is trivially distinguishable from create/update/delete/reorder_transaction_automation siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call it: before updating, deleting, or reordering a rule, in order to get its id. This is actionable routing guidance rather than an implied use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transaction_groupsAInspect
List all transaction groups for the user. Groups bundle related transactions (e.g. split expenses). When includeTransactions is true, each group contains the full transaction list; otherwise returns aggregate counts and date ranges.
| Name | Required | Description | Default |
|---|---|---|---|
| includeTransactions | No | When true, embed full transaction data in each group. Default: false (aggregates only) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose the branching return shape (full transaction list vs aggregate counts and date ranges), which is real behavioral value, but it says nothing about scope limits, pagination, permissions, or whether results are cached/filtered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with zero filler; the core purpose is front-loaded and the parameter behavior follows immediately. Every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter read tool with no output schema, the description adequately covers what is returned and how the flag changes it. Minor gaps remain around pagination and result limits, but nothing critical blocks correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 goes slightly further by characterizing what the false branch returns ('aggregate counts and date ranges'), which the schema only calls 'aggregates only', adding concrete meaning to the flag.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all transaction groups for the user') and explains the domain concept with a concrete example ('split expenses'). It does not explicitly distinguish itself from nearby siblings like get_transaction_automations or create_transaction_group, but the resource is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: the tool retrieves groups, and the flag paragraph hints at a lightweight vs detailed retrieval mode. There is no explicit when-to-use statement, no mention of alternatives, and no prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_upcoming_subscription_paymentsAInspect
List upcoming subscription payments sorted by next expected payment date (soonest first). Returns subscription name, expected amount, currency, next payment date, and category. Only active subscriptions with an expectedAmount are included.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by type: "subscription", "bill", or "installment" | |
| limit | No | Maximum number of upcoming payments to return. Default: 5 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses the sort order, the return fields, and the filtering criteria (only active subscriptions with expectedAmount). It does not mention pagination behavior or what happens if limit is omitted, but the core behavioral traits 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no waste. The sorting and scope constraints are front-loaded, followed by return fields and filtering criteria. Every phrase adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 optional params, no output schema), the description is nearly complete. It could note that results are limited by the 'limit' parameter or mention the default, but it already covers scope, sort, and return. Minor gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% – both parameters are fully described in the schema, including the enum values for 'type' and the default for 'limit'. The description does not add any syntax or format details beyond what the schema provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (upcoming subscription payments) with an explicit sort order (next expected payment date, soonest first). This is clearly distinguishable from siblings like get_subscriptions (all subscriptions) or get_subscription_by_id (single lookup).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through its scope ('upcoming', 'active subscriptions with an expectedAmount') but does not explicitly say when to use this tool vs alternatives like get_subscriptions or get_subscriptions_summary. The inclusion criteria act as implicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_profileAInspect
Get the user's base currency, configured currencies with exchange rates, and basic profile info. Call this first to understand the user's currency context.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It is clearly a read-only getter with no side effects, and it discloses the shape of returned data (currencies, exchange rates, profile). However, it says nothing about authentication context, caching, or whether the profile fields are truncated, leaving modest gaps for a zero-parameter read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero waste, with the returned content front-loaded and the usage directive second. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description must convey what comes back, and it does enumerate the returned fields while also stating when to call it. For a trivial zero-param getter this is near-complete; only the exact profile field set remains unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. There is nothing for the schema or description to disambiguate, and the description does not need to add parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and enumerates the resource contents: base currency, configured currencies with exchange rates, and basic profile info. 'Basic profile info' is slightly vague, but an agent can tell exactly what kind of data comes back. No sibling competes for this purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs 'Call this first to understand the user's currency context,' which is clear sequencing guidance an agent can act on. It does not name exclusions or alternatives, but there is no sibling that overlaps enough to need one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_venture_dealAInspect
Retrieve a single venture deal by id, including its platform and currency. Pass includeEvents=true to also embed the deal's event history (sorted asc). Obtain the dealId from list_venture_deals.
| Name | Required | Description | Default |
|---|---|---|---|
| dealId | Yes | Venture deal ID (from list_venture_deals) | |
| includeEvents | No | When true, embed the deal's event history in the response. Default: false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It usefully discloses what the response contains (platform, currency, optionally event history sorted ascending), but says nothing about permissions, error behavior, or what happens for a nonexistent id. Adequate but incomplete for a tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no waste. The core retrieval action is front-loaded, followed by the optional embedding and the ID source, in a logical order.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 must cover returns, and it does name the key response contents and the optional event history. Minor gaps remain around ordering guarantees, pagination (none needed for a single fetch), and failure modes, but it is sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented in the schema, including includeEvents' default of false. The description adds only the 'sorted asc' ordering detail for the embedded events; the dealId provenance note merely repeats the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Retrieve a single venture deal by id.' The scope ('single', by id) distinguishes it from list_venture_deals and from mutation siblings like update_venture_deal, though it does not explicitly contrast with get_venture_deal_metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: obtain the dealId from list_venture_deals, and use includeEvents=true when event history is wanted. There is no explicit when-not guidance or mention of the metrics sibling, but the usage path is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_venture_deal_metricsAInspect
Compute aggregated metrics for a venture deal: cost basis, current value (latest NAV), total distributions, absolute and percent P&L, TVPI (total value to paid-in), DPI (distributions to paid-in), and IRR. IRR returns null for degenerate cash flows (e.g. no inflows yet). Pass asOfDate (YYYY-MM-DD) to compute metrics as of a specific date.
| Name | Required | Description | Default |
|---|---|---|---|
| dealId | Yes | Venture deal ID (from list_venture_deals) | |
| asOfDate | No | Compute metrics as of this date (YYYY-MM-DD). Defaults to today. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose a genuinely useful edge case: 'IRR returns null for degenerate cash flows (e.g. no inflows yet).' However it omits other behavioral facts an agent would want, such as confirming this is a read-only computation and whether it depends on existing transactions/events.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the concrete metric list, follows with the IRR caveat, and closes with the parameter hint. Every sentence contributes; the acronym expansions (TVPI, DPI, NAV) add clarity without bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates well by enumerating the exact return fields and flagging the IRR null case. It is slightly incomplete on usage context (when this beats fetching the deal directly), but otherwise sufficient for a two-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented in the schema, including defaults and patterns. The description restates asOfDate's format and only adds a 'defaults to today' style hint, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Compute aggregated metrics') and resource ('a venture deal'), then enumerates the exact outputs (cost basis, NAV, distributions, P&L, TVPI, DPI, IRR). This clearly differentiates it from the sibling get_venture_deal, which would return the raw deal record rather than derived metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the purpose and the asOfDate hint ('Pass asOfDate ... to compute metrics as of a specific date'), but there is no explicit when-to-use guidance or routing against siblings like get_venture_deal or get_venture_event. The agent must infer that this tool supersedes the plain getter when metrics are wanted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_venture_eventAInspect
Retrieve a single venture event by id, including its link rows (bank transactions linked to this event). Obtain the eventId from list_venture_events.
| Name | Required | Description | Default |
|---|---|---|---|
| eventId | Yes | Venture event ID (from list_venture_events) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses that the response includes link rows (bank transactions linked to the event), which is real behavioral value, but it says nothing about authorization requirements or behavior when the id is not found. Partial coverage only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with the core purpose and followed by the operational hint about where to get the id. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-entity read with no output schema, the description compensates by describing the return composition (link rows) and the ID provenance. Error/failure behavior is unaddressed, but nothing essential for invoking the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single eventId parameter is fully documented (uuid format, pattern, and the 'from list_venture_events' note). The description's reminder of the ID source largely repeats what the schema already states, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (retrieve) and resource (venture event) with explicit scope (single, by id), and distinguishes itself from the list sibling by referencing list_venture_events as the ID source. An agent can tell it apart from list_venture_events and the other get_* venture tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies usage by pointing to list_venture_events for the eventId, which gives a usable workflow hint, but there is no explicit when-to-use vs when-not or statement of what to do instead if the caller wants many events. Usage is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_venture_platformAInspect
Retrieve a single venture platform by id. Returns full record including default fee fractions (decimals in [0,1]). Obtain the platformId from list_venture_platforms.
| Name | Required | Description | Default |
|---|---|---|---|
| platformId | Yes | Venture platform ID (from list_venture_platforms) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full disclosure burden; 'Retrieve' reasonably implies a read-only operation, and the note about returned fee fractions (decimals in [0,1]) adds unit/format context beyond the schema. It says nothing about permissions, error behavior for a missing/invalid id, or record size, so it only partially covers the behavioral surface.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences with the core action front-loaded and id sourcing trailing. 'Returns full record' is mildly vague, which is the only thing keeping this from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with no output schema, the description covers what is fetched, the key returned field semantics, and where the id comes from. Only minor gaps remain (auth requirements, behavior on unknown ids), which is appropriate for a tool of this simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter already documents itself as a UUID sourced from list_venture_platforms. The description restates that same provenance rather than adding new syntax or constraint detail, so the schema is doing the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Retrieve') plus resource ('a single venture platform') and a scoping qualifier ('by id'), which cleanly separates it from a list-style sibling. It does not explicitly name a tool it is not, but the phrase 'Obtain the platformId from list_venture_platforms' effectively signals the list/get division of labor.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear prerequisite ('Obtain the platformId from list_venture_platforms'), which tells the agent both when to use this tool and where its input comes from. There are no explicit exclusions or failure-path guidance, which keeps it out of 5 territory.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
link_refundAInspect
Mark an existing transaction as a refund of another transaction. Provide originalTxId (the transaction being refunded) and refundTxId (the refund transaction). The two transactions must have opposite types (income vs expense). Optionally target a specific split of the original.
| Name | Required | Description | Default |
|---|---|---|---|
| splitId | No | UUID of a specific split on the original transaction this refund targets | |
| refundTxId | Yes | ID of the transaction that represents the refund | |
| originalTxId | Yes | ID of the original transaction being refunded. Pass null for a standalone refund |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses a hard invariant (opposite income/expense types) and a null-for-standalone case is implied, but it says nothing about reversibility, required permissions, idempotency, or what the mutation returns on success/failure — meaningful gaps for a write operation with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with the core action front-loaded and the constraint placed before the optional parameter. Nothing is padded, though the parenthetical glosses on originalTxId/refundTxId repeat what the schema already says.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter mutation with no annotations and no output schema, the description covers the core semantics and one invariant but leaves the mutation's side effects, permission requirements, and failure behavior unaddressed. It is adequate, not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter is already documented in the schema; the baseline is 3. The description restates which ID is which and adds the split-targeting intent, but does not clarify the schema's 'pass null for a standalone refund' allowance, so it adds little beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Mark an existing transaction as a refund of another transaction') and immediately names the two operands, so the agent can distinguish this from link_transfer, link_transaction_to_portfolio, and the inverse unlink_refund without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a domain constraint that governs when the call is valid ('The two transactions must have opposite types (income vs expense)') and notes the optional split targeting, but never says when to use this tool versus unlink_refund or how to handle the case where the types don't match. Usage is implied rather than routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
link_transactions_to_subscriptionAInspect
Link one or more transactions to a subscription to mark them as payment instances. Use matchSource="manual" for user-initiated linking. If the subscription has a categoryId and matchSource="rule", the category is applied to the transactions automatically. Requires finance:write scope.
| Name | Required | Description | Default |
|---|---|---|---|
| matchSource | Yes | How the match was determined: manual, rule, or ai | |
| subscriptionId | Yes | UUID of the subscription | |
| transactionIds | Yes | IDs of transactions to link to the subscription |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden. It usefully adds the finance:write scope requirement and the side effect that a category is auto-applied when matchSource="rule" and the subscription has a categoryId, but it stays silent on mutation semantics (whether existing links are replaced, idempotency, partial-failure behavior).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each load-bearing: purpose first, then matchSource behavior, then the auth prerequisite. No redundancy with the schema, no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation with 100% schema coverage and no output schema, the description covers purpose, the key conditional side effect, and the required scope. It is nearly complete, only missing link-replacement/idempotency behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 goes beyond the schema's enum listing by explaining the functional consequence of manual vs rule values, adding real meaning the schema does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Link one or more transactions to a subscription to mark them as payment instances" gives a specific verb, resource, and the resulting business effect, so an agent can distinguish it from the inverse sibling unlink_transactions_from_subscription without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use matchSource="manual" (user-initiated linking) and explains the rule-driven branch, which guides selection among matchSource values. It does not, however, name the undo path or exclusion cases for when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
link_transaction_to_portfolioAInspect
Link an existing regular transaction to an investment portfolio as a cash transfer. An expense transaction moves cash from its account into the portfolio; an income transaction moves cash from the portfolio to its account. The transaction must not already be a transfer or linked to a portfolio. Returns the created portfolio transfer.
| Name | Required | Description | Default |
|---|---|---|---|
| portfolioId | Yes | Portfolio ID (from get_portfolios) | |
| transactionId | Yes | ID of the existing transaction (from search_transactions) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the required pre-state of the transaction, the cash-flow direction per transaction type, and that a portfolio transfer object is returned. It stops short of stating failure behavior, reversibility (unlink_transaction_from_portfolio), or any permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero padding, front-loaded with the action and followed by the directional rules and the constraint. Every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter linking tool with no output schema, the description covers the action, the two directional cases, the eligibility constraint, and the return value. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters already document their source tools (get_portfolios, search_transactions), so the baseline is 3. The description goes beyond the schema by explaining the semantic consequence of linking a given transaction type, which informs how the agent should choose the transactionId.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Link an existing regular transaction to an investment portfolio') and immediately elaborates the directional semantics for expense vs income transactions, which no sibling tool offers. The precondition ('must not already be a transfer or linked to a portfolio') cleanly separates it from link_transfer and link_transactions_to_subscription.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when the tool applies: an existing regular (non-transfer, non-portfolio-linked) transaction, plus the effect for each transaction direction. It does not name alternative tools it might be confused with (link_transfer, create_portfolio_cash_transaction, transfer_account_to_portfolio), so the when-not guidance is implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
link_transferAInspect
Link two existing transactions as a transfer pair. The two transactions must be in different accounts and have opposite types (one income, one expense). Provide baseTxId (the source/expense side) and oppositeTxId (the destination/income side).
| Name | Required | Description | Default |
|---|---|---|---|
| baseTxId | Yes | ID of the base (source) transaction — typically the expense side | |
| oppositeTxId | Yes | ID of the opposite (destination) transaction — typically the income side |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full behavioral burden. It usefully discloses preconditions (different accounts, opposite transaction types) and which side each ID represents, but it does not say whether the link is reversible, what happens to balances, what permissions are needed, or what the result of a successful link is. Some behavior is added beyond the schema, but key mutation details are missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences with zero waste. The core action is front-loaded, followed by the key constraints and parameter roles.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter mutation with no annotations and no output schema, the description covers what the agent needs to invoke it correctly — required parameters, their roles, and preconditions. However, it omits reversibility and side-effect information that would help an agent reason about the mutation, so it is adequate rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description reinforces the roles of baseTxId and oppositeTxId and adds the account/type relationship constraint, but it does not add syntax or format meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('Link') and resource ('two existing transactions as a transfer pair'), and the 'transfer pair' framing is distinctive enough to separate it from adjacent linking tools like link_refund or link_transaction_to_portfolio. It stops short of explicitly naming a sibling to avoid or a condition that selects it, so it is clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states prerequisites — different accounts and opposite types — which implies when the tool applies, but there is no explicit guidance on when to choose this over unlink_transfer or other linking tools. The usage context is therefore inferred rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_portfolio_transfersAInspect
Cash movement history of a portfolio: account↔portfolio transfers, direct deposits/withdrawals, linked bank transactions, and currency exchanges. Each entry names the source/destination portfolio or account. Sorted by date, newest first. Returns { transfers, totalCount }.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Only transfers on or before this date (YYYY-MM-DD) | |
| from | No | Only transfers on or after this date (YYYY-MM-DD) | |
| limit | No | Max results to return (default: 20) | |
| offset | No | Pagination offset (default: 0) | |
| portfolioId | Yes | Portfolio ID (from get_portfolios) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden. It usefully discloses sort order (newest first), the return shape ({ transfers, totalCount }), and that each entry names its counterparty, but it says nothing about permission requirements, mutation risk, or pagination behavior beyond what the schema states.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the resource scope, followed by contents, ordering, and return shape. No filler or repetition of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description properly discloses the return object ({ transfers, totalCount }) and ordering. Combined with fully documented input parameters, an agent has enough to invoke it correctly, though explicit filtering semantics (how from/to behave) and pagination expectations are left to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters (from/to/limit/offset/portfolioId) are already documented in structured data. The description adds no parameter-level meaning (its 'names the source/destination' line concerns output, not inputs), so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource (cash movement history of a portfolio) and enumerates exactly what it covers: account↔portfolio transfers, direct deposits/withdrawals, linked bank transactions, and currency exchanges. This scope definition lets an agent distinguish it from siblings like get_portfolio_summary or get_portfolio_balances without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied (fetch transfers for a given portfolio), and the schema ties portfolioId to get_portfolios, but the description offers no explicit when-to-use/when-not guidance or naming of an alternative sibling such as get_portfolio_summary or get_portfolio_holdings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_subscription_candidatesAInspect
List auto-detected subscription candidates sorted by confidence score. Call detect_subscription_candidates first to generate fresh candidates. Use status filter to see only pending, accepted, or dismissed candidates.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter by candidate status. Omit to return all statuses |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses ordering (by confidence score) and a workflow prerequisite, but says nothing about pagination, result limits, whether candidates persist between calls, or that this is a non-mutating read. Adequate for a simple list tool, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero waste. The primary action is front-loaded, the prerequisite follows, and the filter hint comes last.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter list tool with no output schema and no annotations, the description covers what the tool returns conceptually (candidates ranked by confidence), the prerequisite to populate them, and how to filter. It stops short of describing candidate fields or volume behavior, but an agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single enum parameter is fully documented in the schema. The description restates the filter and its values (pending, accepted, dismissed) without adding syntax or behavior beyond what the enum already conveys, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (auto-detected subscription candidates) with the ordering criterion (confidence score). It is immediately distinguishable from detect_subscription_candidates (which generates) and get_subscriptions (which lists actual subscriptions).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the prerequisite tool ('Call detect_subscription_candidates first to generate fresh candidates') and explains the purpose of the status filter. It does not call out when to prefer this over get_subscriptions or get_subscription_by_id, but the workflow dependency is the key guidance and it is stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tracker_suggestionsAInspect
Smart-tracking state of a tracker the user owns. pending: transactions the AI suggests linking, each with a suggestion id, score (0-1), the AI reason, and a transaction summary; accept or reject them by suggestion id with accept_tracker_suggestions / reject_tracker_suggestions. aiMatched: transactions the AI linked or the user accepted, still linked, with their reason. scan: status (idle, queued, running), startedAt, lastScannedAt, and pausedReason (archived, no_start_date, ended, plan, allowance, unavailable) when scanning cannot run; plan means the plan does not include smart tracking and the user has no AI connection of their own.
| Name | Required | Description | Default |
|---|---|---|---|
| trackerId | Yes | ID of a tracker the user owns |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does much of it: it details the structure of pending items (suggestion id, 0-1 score, AI reason), the meaning of aiMatched, and the full scan status/pausedReason vocabulary. It does not explicitly state read-only/side-effect-free behavior, but the richness of the return disclosure is well above the annotation-free baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is dense but front-loaded: the opening sentence frames the tool, then each subsequent clause maps to one bucket (pending, aiMatched, scan). Every sentence earns its place by disclosing return structure, though the enum-heavy scan sentence is fairly packed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, so the description must explain the return values, and it does so thoroughly across all three buckets including pausedReason values. It is nearly complete for a one-parameter read tool; only an explicit read-only statement is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter (trackerId) at 100% schema description coverage, so the schema already documents it fully. The description's phrase 'a tracker the user owns' restates ownership scope already captured in the schema, adding no new syntax or constraint, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (smart-tracking state of a tracker the user owns) and enumerates the three response buckets (pending, aiMatched, scan), which lets an agent tell it apart from action siblings like accept_tracker_suggestions. The listing verb itself is only implied rather than stated, so it falls short of a full 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It routes the agent to accept_tracker_suggestions / reject_tracker_suggestions for the follow-up actions, which is useful context. However, it never states when to call this tool versus get_trackers or get_tracker_spending_stats, so the guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_venture_dealsAInspect
List the user's venture deals (private/illiquid investments through SPVs, syndicates, or direct vehicles). Returns each deal's id, name, status (outstanding | partial_exit | fully_exited | written_off), platform, currency, principal, entry fee, fee fractions, dates, and target company. Use the returned id with get_venture_deal, get_venture_deal_metrics, list_venture_events, and update_venture_deal.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results | |
| offset | No | Pagination offset (default: 0) | |
| status | No | Filter by status | |
| platformId | No | Filter by platform id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. It does disclose the return payload's key fields (id, name, status, platform, currency, principal, entry fee, fee fractions, dates, target company) and enumerates the status enum values, which is helpful context. But it omits pagination behavior (default limit, max limit), ordering, and any auth or rate-limit details. For a list tool with no annotations, this is a moderate gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste. The first states purpose and scope; the second lists the return fields and then the follow-up tools. Front-loaded and earns every word.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is largely complete for a list tool: it explains what the tool returns, clarifies the domain, and routes the agent to related tools. It does not mention pagination defaults or limits despite offset/limit parameters, and there is no output schema to fall back on, leaving a small gap. Overall, adequate but not exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (limit, offset, status, platformId) are documented in the schema. The description does not repeat parameter syntax or add format details, and it correctly relies on the schema for that. Baseline 3 is appropriate when schema coverage is complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('venture deals'), plus a parenthetical clarifying the domain (private/illiquid investments through SPVs, syndicates, or direct vehicles). This distinguishes it from siblings like list_venture_events, list_venture_platforms, and list_portfolio_transfers, which cover adjacent but different resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear follow-up path: 'Use the returned id with get_venture_deal, get_venture_deal_metrics, list_venture_events, and update_venture_deal.' This tells the agent what to do next with the results. However, it doesn't state when this tool should be preferred over alternatives (e.g., if there were a search variant) or any prerequisites, so it stops short of explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_venture_eventsAInspect
List events for a venture deal in chronological order (oldest first). Each event has a type (initial_investment | capital_call | distribution | nav_update | exit | writedown | fee_payment), date, amounts, cashFlowMode, and embedded link rows (when the event is tied to bank transactions). Use the returned event ids with get_venture_event, update_venture_event, and delete_venture_event.
| Name | Required | Description | Default |
|---|---|---|---|
| dealId | Yes | Venture deal ID (from list_venture_deals) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses the ordering guarantee (oldest first) and the shape of returned rows, which is real added context, but it omits read-only/safety framing, pagination or result-size behavior, and permission needs for a listing operation. Useful but not complete for an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, purpose front-loaded before the return-shape detail, with no filler. Slightly dense in enumerating every event field, but each element serves an agent that has no output schema to consult.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because there is no output schema, the description must describe returns, and it does so by naming the event fields, the type enum values, and the conditional embedded link rows. It does not explain the amounts/cashFlowMode semantics or pagination, leaving minor gaps for a simple single-parameter list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (dealId) and schema description coverage is 100%, with the schema itself noting it comes from list_venture_deals. The description adds no format, constraint, or example beyond that, so the baseline 3 for schema-carried semantics is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (List) plus resource (venture events) scoped to a venture deal, with ordering disclosed up front. It names the follow-up siblings (get/update/delete_venture_event), so an agent can distinguish this listing tool from the mutation tools that share the same entity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent to the correct follow-up tools ('Use the returned event ids with get_venture_event, update_venture_event, and delete_venture_event'), which is genuine workflow guidance. It stops short of saying when NOT to use this tool or pointing to list_venture_deals to obtain the dealId, so a 5 is not warranted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_venture_platformsAInspect
List the user's venture investment platforms (SPV syndicators, fund managers). Returns each platform's id, name, website, description, and default fee fractions (entry fee, management fee, carry, hurdle). Fee values are decimals in [0,1] — e.g. 0.085 means 8.5%. Use the returned id with get_venture_platform, create_venture_deal, and update_venture_platform.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results | |
| offset | No | Pagination offset (default: 0) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the return shape (id, name, website, description, fee fractions) and, crucially, the unit semantics of fee values ('decimals in [0,1] — e.g. 0.085 means 8.5%'), which prevents a real class of misinterpretation. It does not cover pagination behavior or result ordering, but the units disclosure is high-value behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with purpose, then return fields, then unit clarification, then routing. Every sentence carries distinct information and none is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must describe returns — and it does, listing the exact fields and their semantics. Combine that with the downstream id usage and the tool is callable without further context. Minor gap: no mention of pagination or default result limits.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% — both limit and offset are documented in the schema. The description adds no additional parameter syntax, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List the user's venture investment platforms') and disambiguates the domain with parenthetical examples (SPV syndicators, fund managers). Clearly distinguishable from sibling list tools like list_venture_deals or list_venture_events.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear downstream routing: 'Use the returned id with get_venture_platform, create_venture_deal, and update_venture_platform.' This tells the agent when this tool is a prerequisite. However, it doesn't state when NOT to use it or contrast with other listing tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
merge_payeesAInspect
Merge a source Payee into a target Payee. Transactions and aliases move to the target; the target wins silently on defaultCategoryId conflict; the source is deleted. Use to dedupe near-duplicates like "Amazon" and "AMZN MKT". Requires finance:delete scope.
| Name | Required | Description | Default |
|---|---|---|---|
| sourceId | Yes | Payee id to merge from (will be deleted). | |
| targetId | Yes | Payee id to merge into (kept). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so well: it discloses that transactions and aliases move, that the target silently wins on defaultCategoryId conflict, that the source is deleted, and that finance:delete scope is required. This gives the agent a clear picture of the destructive and conflict-resolution behavior beyond the input schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it states the operation first, then the key side effects, then the use case and permission requirement. Every sentence adds distinct, necessary information with no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter merge tool with no annotations and no output schema, the description supplies the important behavioral, conflict-resolution, deletion, and permission context an agent needs to invoke it safely. Return values need not be explained because no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already explains that sourceId is deleted and targetId is kept. The description reinforces the source/target relationship but does not add new syntax, constraints, or format details for either parameter, so the schema does the heavy lifting and a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Merge a source Payee into a target Payee') and immediately distinguishes the operation from simple deletion or update by explaining that transactions and aliases move to the target while the source is deleted. An agent can identify this as a deduplication/merge operation without checking sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear trigger ('Use to dedupe near-duplicates like "Amazon" and "AMZN MKT"') and states a required scope ('Requires finance:delete scope'), which helps the agent decide when this tool is appropriate. It does not explicitly name alternatives such as update_payee or delete_payee, so it falls short of the highest bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_transaction_automationAInspect
Dry-run a set of automation conditions against up to the last 1000 eligible existing transactions and return { matchedCount, scannedCount, matches } where matches is capped at 5 sample transactions. Nothing is modified. Use it to sanity-check conditions before create_transaction_automation or update_transaction_automation. Note that a live automation fires on its own only for newly synced or imported bank transactions that are not transfers and not planned; existing transactions change only when the user runs "Apply to past transactions" for a saved rule in the app.
| Name | Required | Description | Default |
|---|---|---|---|
| conditions | Yes | Condition tree: { match: "all" | "any", items: [...] }. 1-10 items, at most one transactionType item. Item shapes by field: - note | merchant (merchant is the bank-provided merchant/description text): { field, operator, value }. operator: contains_any | not_contains_any | starts_with_any | ends_with_any | equals_any | is_empty. value: 1-20 case-insensitive keywords, max 64 chars each; required unless operator is is_empty. Example: { "field": "merchant", "operator": "contains_any", "value": ["uber", "bolt"] } - payee | account | accountGroup | bankConnection: { field, operator, value }. operator: in | not_in. value: 1-20 UUIDs of that entity, all owned by the user. Example: { "field": "account", "operator": "in", "value": ["<accountId>"] } - amount: { field, operator, value: { min?, max? }, currency }. operator: gte | lte | between | equals. gte and equals take min only, lte takes max only, between takes both. Bounds are decimals (e.g. 12.50). currency: { "mode": "transaction" } compares in the currency of the transaction itself, { "mode": "base" } in the user base currency, { "mode": "specific", "code": "USD" } in a fixed currency. Example: { "field": "amount", "operator": "gte", "value": { "min": 100 }, "currency": { "mode": "base" } } - transactionType: { "field": "transactionType", "operator": "equals", "value": "income" | "expense" } - dayOfMonth: { "field": "dayOfMonth", "operator": "between", "value": { "min": 1, "max": 31 } } |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: 'Nothing is modified' declares the safe read profile, plus a scan bound (last 1000 eligible transactions), a result cap (5 sample matches), and the return shape. It also discloses non-obvious domain behavior about when live automations fire versus existing transactions changing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the operation, then usage guidance, then caveats. Efficient overall, though the final sentence about when a live automation fires is lengthy and somewhat tangential to invoking this specific tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with no output schema, the description fully covers what an agent needs: the dry-run semantics, the scan ceiling, the sampled result shape, and the create/update context. Nothing required to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the nested conditions schema is exhaustively documented (per-field operators, value shapes, examples). The description adds only the phrase 'set of automation conditions' and does not extend parameter meaning beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (dry-run a set of automation conditions) against a specific resource (existing transactions), and explicitly contrasts itself with create/update_transaction_automation. An agent can distinguish it from sibling automation tools without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use it 'to sanity-check conditions before create_transaction_automation or update_transaction_automation,' naming both alternatives and the condition that routes to them. It further clarifies the live-vs-preview semantics so the agent knows when a preview is even meaningful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reject_tracker_suggestionsAInspect
Reject smart-tracking suggestions of a tracker the user owns: pending ones are dismissed, and AI-linked or accepted ones are also unlinked from the tracker. The AI will not suggest these transactions again. Suggestion ids come from list_tracker_suggestions (pending or aiMatched). Returns resolvedCount.
| Name | Required | Description | Default |
|---|---|---|---|
| trackerId | Yes | ID of a tracker the user owns | |
| suggestionIds | Yes | Suggestion IDs from list_tracker_suggestions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers: it explains the differing effects on pending vs AI-linked/accepted suggestions (dismissed vs unlinked), that the AI will not re-suggest, and that ownership of the tracker is required. It lacks detail on reversibility of the unlink or any permission/rate-limit notes, but covers the essential side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the core action and effect, then the id source and return value. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-param mutation tool with no annotations and no output schema, the description supplies the behavioral effects, the input provenance, and the single return value (resolvedCount). Only minor gaps remain around error/permission behavior and edge cases, so it is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is a 3; the description goes beyond the schema by narrowing which suggestions to pass ('pending or aiMatched') and reaffirming the trackerId ownership constraint, adding genuine semantic value even though the source tool is already in the schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Reject') and resource ('smart-tracking suggestions of a tracker the user owns'), which immediately distinguishes it from the sibling accept_tracker_suggestions. An agent can tell what the tool does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tells the agent where the required input comes from ('Suggestion ids come from list_tracker_suggestions (pending or aiMatched)'), giving clear context for invocation. It does not explicitly name accept_tracker_suggestions as the contrasting alternative or state when-not to use it, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_tags_from_transactionBInspect
Remove a tag from one or more transactions. Use when the user wants to untag transactions. Returns the count of removed tag links.
| Name | Required | Description | Default |
|---|---|---|---|
| tagId | Yes | ID of the tag to remove from transactions. | |
| transactionIds | Yes | List of transaction IDs to remove the tag from. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden for a mutation tool. It discloses the return value (count of removed tag links), but says nothing about whether the removal is reversible, what happens if some transactionIds are invalid or untagged, or that it only severs the link rather than deleting the tag. For a write operation with zero annotation coverage this is a notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, with no padding. The usage sentence is mildly redundant with the purpose sentence, keeping it just short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully states the return value (count of removed tag links), and it covers batch scope and the untagging intent. Missing confirmation of idempotency or partial-failure behavior, but the essential information for calling the tool correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (tagId, transactionIds) are already self-documenting with UUID formats. The description adds only the batch nuance ('one or more transactions'), which the array-typed schema already implies. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Remove') plus resource ('a tag') and scope ('one or more transactions'), which clearly distinguishes it from the inverse sibling assign_tags_to_transaction. It never names that sibling or any other alternative, so it stops short of explicit sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use when the user wants to untag transactions' states a use condition, but it essentially restates the purpose sentence rather than adding routing logic. No mention of when NOT to use it (e.g. deleting the tag itself via delete_tag, or removing from a single transaction vs bulk), and no prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_transactions_from_groupAInspect
Remove transactions from a group. If removal would leave fewer than 2 transactions, pass force=true to dissolve the group entirely (transactions are kept). Requires finance:write scope.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | When true, dissolves the group if too few transactions would remain. Default: false (returns error instead) | |
| groupId | Yes | ID of the transaction group | |
| transactionIds | Yes | IDs of transactions to remove from the group |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the auth scope (finance:write), the default error path when force is omitted, and that dissolving the group keeps the transactions. It leaves some side-effect detail unstated (e.g. whether the removed transactions persist independently in the ledger).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action, then the force rule, then the scope requirement. Every sentence carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description covers the key behaviors: conditional dissolution, the error path, and the required permission. It stops short of stating whether removal itself is reversible or whether transactions persist outside the group.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the force parameter is already well documented inline. The description adds only one nuance beyond the schema ('transactions are kept'), so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Remove transactions from a group.' The operation is unambiguous and clearly distinguishable from the add_transactions_to_group and remove_transactions_from_budget siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete conditional: pass force=true when the removal would leave fewer than 2 transactions, otherwise the call errors. It also names the required finance:write scope. It does not explicitly contrast with alternatives like delete_transaction_group, so a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_transactions_from_trackerAInspect
Unlink one or more transactions from a tracker. Does not delete the transactions themselves. Returns nothing on success.
| Name | Required | Description | Default |
|---|---|---|---|
| trackerId | Yes | ID of the tracker to unlink transactions from | |
| transactionIds | Yes | IDs of the transactions to remove from the tracker |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it does answer the two highest-value questions for a mutation tool: the operation is non-destructive to the underlying transactions, and it produces no return payload. It stops short of covering permission requirements, idempotency, or what happens when an ID is not currently linked to the tracker.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, the core action front-loaded, with each subsequent sentence adding a distinct fact (non-destructiveness, return behavior). Nothing is padded or repeated from the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with full schema coverage and no output schema, the description supplies the missing return-value information and the safety profile that annotations would otherwise carry. Remaining gaps are edge-case behavior on invalid or unlinked IDs rather than anything needed for a correct call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (trackerId, transactionIds) are documented in the schema, so the baseline is 3. The description's only added signal is the 'one or more' phrasing, which confirms array/batch semantics already implied by the array type — no format, ordering, or constraint detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb plus resource ('Unlink ... transactions from a tracker') and the plural scope is explicit, which cleanly separates it from the transaction-mutating siblings like delete_transaction. It does not name the near-identical siblings (remove_transactions_from_group, unlink_transactions_from_subscription), but the resource noun 'tracker' does the disambiguating work.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to reach for this tool versus remove_transactions_from_group, unlink_transactions_from_subscription, or delete_transaction — the reader must infer the selection rule from the noun alone. The only adjacent help is the scope clarification that transactions are not deleted, which hints at 'unlink' semantics but is not framed as usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reorder_transaction_automationsAInspect
Reorder the transaction automation rules of the user. Rules are evaluated top to bottom on each newly synced or imported bank transaction and the first rule that applies an action wins, so ordering decides which rule takes precedence when several match. Returns the rules in their new order. Requires finance:write scope.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Every automation id of the user, in the desired top-to-bottom order. Must contain exactly the current full set (get it from get_transaction_automations first) or the call fails with a conflict. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden, and it does well: it discloses overwrite semantics (the full ordered set replaces existing order), the conflict-failure behavior, the required finance:write scope, and the returned payload. It does not say whether the operation is reversible or how concurrent reorders are handled, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly written sentences: operation, the semantic reason ordering matters, then the return value and scope requirement. Nothing is repeated from the schema and the key constraint is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully states the return (rules in their new order), and it covers the prerequisite fetch, the scope requirement, and the evaluation semantics. Complete enough for a one-parameter mutation, though a note on authorization failure or undo behavior would round it out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter and schema coverage is 100%, so the schema already documents 'ids' as the full ordered UUID set with a max of 100 items. The description adds no syntax or format detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('reorder') plus the exact resource ('transaction automation rules of the user'), which cleanly distinguishes it from the create/update/delete_transaction_automation siblings. An agent knows immediately this is a bulk ordering operation, not an attribute edit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the operational context — rules evaluate top to bottom and the first match wins — which tells the agent why ordering matters, and the schema directs it to fetch the current set from get_transaction_automations first. It stops short of explicitly naming update_transaction_automation as the alternative for editing a single rule, so it is clear but not fully routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_securitiesAInspect
Search for securities (stocks, ETFs, crypto, etc.) by ticker symbol or company name. Call this before create_investment_transaction to resolve a human-readable ticker (e.g. "AAPL") into a securityId. If portfolioId is provided, each result includes isInPortfolio to indicate whether the security is already tracked in that portfolio.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (default: 20) | |
| query | Yes | Ticker symbol or company name to search for (e.g. "AAPL", "Apple") | |
| portfolioId | No | Portfolio ID to annotate results with isInPortfolio flag (from get_portfolios) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses meaningful conditional behavior — that supplying portfolioId enriches each result with an isInPortfolio flag — and frames itself as a lookup step producing a securityId. It does not mention result ordering, pagination, or ambiguity handling when a query matches multiple securities, which is a gap for a search endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences and no filler. The core purpose comes first, the workflow guidance second, and the conditional annotation behavior last — a well-ordered, front-loaded structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully names two returned fields (securityId, isInPortfolio) and the downstream consumer, which is enough for an agent to use the result correctly. It stops short of describing result shape, ranking, or what happens on zero matches, leaving a modest gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters (limit default 20, query format, portfolioId source). The description restates the portfolioId effect but adds no syntax or format detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search for securities') plus the accepted input domain (ticker, company name) and the covered asset classes. No sibling tool does security lookup, so it is easily distinguished from the many transaction/portfolio tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly sequences the tool: 'Call this before create_investment_transaction to resolve a human-readable ticker into a securityId.' This tells the agent both when to use it and why, which is exactly the routing information a multi-step workflow needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_transactionsBInspect
Search and filter transactions. Returns transaction amount (original + base currency), category, account, note, date, type, and tags. Use date filters to limit results. Default: last 30 days, 50 items.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default: 50, max: 500) | |
| order | No | Sort order by date (default: desc) | |
| offset | No | Pagination offset (default: 0) | |
| search | No | Search in transaction notes | |
| tagIds | No | Filter by tag IDs | |
| endDate | No | End date (ISO 8601). Default: today | |
| amountMax | No | Maximum amount (decimal, in original currency) | |
| amountMin | No | Minimum amount (decimal, in original currency) | |
| startDate | No | Start date (ISO 8601). Default: 30 days ago | |
| accountIds | No | Filter by account IDs | |
| categoryIds | No | Filter by category IDs | |
| excludeRefunds | No | Exclude refund transactions | |
| transactionType | No | Filter by transaction type | |
| excludeTransfers | No | Exclude transfer transactions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses the default scope (last 30 days, 50 items) and the return-field set, which matters with no output schema. It says nothing about permissions, how filters combine, or how pagination interacts with the defaults, leaving notable gaps for a 14-parameter query tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler, front-loaded with the core purpose. The return-field enumeration is a little list-like but each item is informational, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 14 optional parameters and no output schema, listing return fields is a valuable addition, and defaults are covered. Still missing are how multiple filters combine, the search field's scope beyond the schema note, and any indication that results are paginated via offset.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every filter, its unit, and its default is already documented in the schema. The description's reference to date filters and defaults merely echoes startDate/endDate/limit without adding syntax or semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Search and filter transactions") and enumerates the returned fields, so the agent knows exactly what kind of tool this is. However, with ~80 siblings including get_expenses_for_period, get_cash_flow, and get_spending_by_categories, it offers no differentiation from other transaction-read tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use date filters to limit results" is a usage hint, not a when-to-use rule, and the default window/size is behavioral context rather than guidance. No alternatives are named and no exclusions are given, despite several sibling tools that also return transaction data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
split_transactionAInspect
Split a transaction across multiple categories. Provide the transactionId and an array of splits whose amounts sum to the transaction total. Replaces any existing splits on the transaction.
| Name | Required | Description | Default |
|---|---|---|---|
| splits | Yes | Split portions — amounts must sum to the full transaction amount | |
| transactionId | Yes | ID of the transaction to split |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses that existing splits are replaced (a destructive overwrite) and imposes the sum-equals-total constraint, but it omits permission requirements, what happens if amounts don't sum correctly, atomicity, and the response shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with zero waste; the core action and the critical overwrite warning are front-loaded before the parameter guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description covers the essential semantics (sum constraint and replacement of existing splits). It still leaves meaningful gaps around error behavior on mismatched sums, permissions, and what the operation returns, which an agent would need to call it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters and nested split fields are already documented, including the sum constraint. The description restates the sum-to-total rule but adds no syntax or format detail beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Split a transaction across multiple categories'), which is unambiguous and clearly distinct from siblings like update_transaction or delete_split. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the invocation form (provide transactionId and splits summing to the total) and that existing splits are replaced, which implies usage context. However, it never states when to use this versus update_transaction or delete_split, nor any prerequisites or conditions that select this tool over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
toggle_subscription_activeAInspect
Activate or deactivate a subscription. Inactive subscriptions are excluded from upcoming payment calculations and summary totals. Requires finance:write scope.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | UUID of the subscription | |
| isActive | Yes | True to activate the subscription, false to deactivate it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does disclose a real downstream consequence: inactive subscriptions drop out of upcoming payment calculations and summary totals. It also states the required finance:write scope. It stops short of saying whether the change is reversible, idempotent, or what happens to already-generated payment records.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, then the side effect, then the permission requirement. 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.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter toggle with no annotations and no output schema, the description covers the action, the downstream data effect, and the auth requirement, which is enough to invoke it correctly. Only a note on reversibility or error behavior is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (id, isActive) are already documented in the schema with clear semantics, so the baseline of 3 applies. The description adds no syntax or format detail beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (activate/deactivate) and resource (subscription), so the operation is unambiguous. It does not, however, distinguish itself from the sibling update_subscription, which an agent could reasonably assume also flips the isActive field.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the name and description (use it to flip active state), but there is no explicit when-to-use guidance or contrast against update_subscription or delete_subscription. The prerequisite (finance:write scope) is stated, which helps but is an auth constraint rather than a usage rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transfer_account_to_portfolioAInspect
Move cash from a regular account into an investment portfolio. Creates an expense transaction on the account and increases the portfolio cash balance. Use link_transaction_to_portfolio instead when the bank transaction already exists.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Transfer date in YYYY-MM-DD format | |
| amount | Yes | Amount as a positive decimal string (e.g. "500.00") | |
| accountId | Yes | Source account ID (from get_accounts). The transfer uses the account currency | |
| description | No | Optional note for the transfer | |
| portfolioId | Yes | Destination portfolio ID (from get_portfolios) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does disclose the two concrete write effects: an expense transaction is created on the account and the portfolio cash balance increases. It stops short of permissions, reversibility, or failure behavior, but the mutation side effects are unusually well spelled out for an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with purpose, then side effects, then the disambiguation rule. No filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter mutation with no annotations and no output schema, the description covers purpose, side effects, and the sibling alternative, which is most of what an agent needs. Return-value expectations and error/currency edge cases remain unstated, but nothing critical for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents date format, positive decimal amount, currency behavior, and source/destination ID origins. The description adds only the account-to-portfolio direction already implied by the parameter names, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Move cash'), both resources ('regular account', 'investment portfolio') and the direction of transfer, which distinguishes it from transfer_portfolio_to_account and link_transaction_to_portfolio. An agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative (link_transaction_to_portfolio) and the condition that selects it ('when the bank transaction already exists'). This is a clear when-to-use-this vs when-to-use-that rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transfer_portfolio_to_accountAInspect
Withdraw cash from an investment portfolio into a regular account. Creates an income transaction on the account and decreases the portfolio cash balance. Use link_transaction_to_portfolio instead when the bank transaction already exists.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Transfer date in YYYY-MM-DD format | |
| amount | Yes | Amount as a positive decimal string (e.g. "500.00") | |
| accountId | Yes | Destination account ID (from get_accounts) | |
| description | No | Optional note for the transfer | |
| portfolioId | Yes | Source portfolio ID (from get_portfolios) | |
| currencyCode | Yes | Currency of the cash withdrawn from the portfolio (ISO 4217, e.g. "USD") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does meaningful work: it discloses both side effects (an income transaction is created on the account, the portfolio cash balance decreases). It stops short of stating reversibility, idempotency, or permission requirements for what is clearly a money-moving mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the operation, the resulting state change, and the alternative-route condition. The core action is front-loaded and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter mutation with no output schema and no annotations, the description supplies the essential causal model (transaction created, balance decreased) and the key routing rule. What's missing is whether the operation can be undone (unlink_transaction_from_portfolio exists as a sibling) and what the call returns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters are already documented, including the positive-decimal constraint and the source/destination ID provenance. The description adds only directional framing (portfolio is source, account is destination), which the schema's own descriptions largely cover; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and direction ('Withdraw cash from an investment portfolio into a regular account'), and the directionality distinguishes it from the reverse sibling transfer_account_to_portfolio without the agent needing to open either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes to link_transaction_to_portfolio with the selecting condition 'when the bank transaction already exists', which is exactly the discriminating case. It doesn't mention the mirror-image sibling transfer_account_to_portfolio or warn against double-counting an already-linked transfer, so it stops just short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unlink_refundAInspect
Remove the refund link between two transactions. DESTRUCTIVE: both transactions will no longer be marked as refund-linked. Requires both originalTxId and refundTxId that were previously linked.
| Name | Required | Description | Default |
|---|---|---|---|
| refundTxId | Yes | ID of the refund transaction | |
| originalTxId | Yes | ID of the original transaction. Pass null if no original was set |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it flags DESTRUCTIVE in caps and spells out the consequence (both transactions will no longer be marked as refund-linked). It omits whether the operation is reversible or what permissions are required, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action, then the destructive consequence, then the parameter precondition. No filler and nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool with no annotations and no output schema, the description covers purpose, consequence, and preconditions adequately. It lacks permission requirements and reversibility, but nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both UUID parameters and their nullability are already documented in the schema. The description adds only the precondition that the two must have been linked previously, which is slightly useful but mostly restates schema-level meaning — baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Remove') and resource ('the refund link between two transactions'), and the resource is distinct from the sibling link_refund. An agent can immediately tell this is the inverse operation of link_refund.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition — both transactions 'previously linked' — which tells the agent when this is applicable. It does not explicitly name link_refund as the alternative for creating the link, but the inverse relationship is obvious from the operation name and stated precondition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unlink_transaction_from_portfolioAInspect
Remove the portfolio link from a transaction: deletes the portfolio transfer, reverses the portfolio cash balance change, and restores the transaction to a regular income/expense. Succeeds even if the transaction has no portfolio link.
| Name | Required | Description | Default |
|---|---|---|---|
| transactionId | Yes | ID of the transaction currently linked to a portfolio |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses the destructive cascade (deletes the portfolio transfer, reverses the cash balance change, restores the transaction type) and the idempotent-like behavior ('Succeeds even if the transaction has no portfolio link'). These are exactly the behavioral traits an agent needs before invoking a mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence of purpose followed by a colon and a tight list of side effects, then a single clause on the no-op case. It is front-loaded and wastes no words, though it could be marginally tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter mutation tool with no annotations and no output schema, the description covers what the tool does, its side effects, and its behavior when the precondition is unmet. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single UUID parameter is fully documented in the schema. The description adds the constraint that the ID refers to a transaction 'currently linked to a portfolio', which subtly qualifies the parameter's expected state beyond the schema's generic description. Still, with zero description of parameter handling in the prose, it stays just above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Remove the portfolio link from a transaction') and immediately enumerates the three concrete side effects. It is clearly distinguishable from sibling link_transaction_to_portfolio (the inverse) and unlink_transfer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It describes the operation's context and clarifies it succeeds even when no link exists, which removes ambiguity about preconditions. It does not, however, name alternatives or explicitly state when to prefer this over manually updating the transaction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unlink_transactions_from_subscriptionAInspect
Unlink transactions from a subscription without deleting them. The link record is marked as unlinked and excluded from subscription history. Requires finance:write scope.
| Name | Required | Description | Default |
|---|---|---|---|
| subscriptionId | Yes | UUID of the subscription | |
| transactionIds | Yes | IDs of transactions to unlink from the subscription |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that the operation is non-destructive (records are marked unlinked, not deleted), that history visibility changes, and that a finance:write scope is required. It does not cover reversibility (can the link be restored?) or partial-failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each front-loaded and earning its place: the action, the non-deletion guarantee, the state effect, and the auth requirement. No filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool with no annotations and no output schema, the description covers the key facts an agent needs (effect, non-destructiveness, required scope). It omits what happens if IDs are not currently linked and whether the change is reversible, which are the remaining gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with only two parameters, so the schema already documents subscriptionId and transactionIds. The description adds no syntax, format, or constraint detail (e.g., whether IDs must currently be linked), leaving it at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (unlink), resource (transactions), and scope (from a subscription), and immediately distinguishes the operation from deletion ('without deleting them'), which separates it from siblings like delete_transaction. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'without deleting them' implicitly signals when to prefer this over a delete operation, and 'excluded from subscription history' hints at the effect desired. However, no alternative tool is named (e.g., its inverse link_transactions_to_subscription, or delete_transaction) and no explicit when/when-not condition is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unlink_transferAInspect
Unlink transfer transactions by their shared transferId (UUID string). Both transactions in the pair will become independent income/expense entries. Use search_transactions to find the transferId of a linked pair.
| Name | Required | Description | Default |
|---|---|---|---|
| transferIds | Yes | One or more transferId UUID strings identifying transfer pairs to unlink |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose the key state effect: both transactions in the pair become independent income/expense entries. However, it says nothing about permissions, reversibility (whether link_transfer can re-pair them), partial-failure behavior with multiple IDs, or error cases for an invalid transferId.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: purpose and mechanism first, the side effect second, and the helper-tool pointer last. Nothing is redundant and no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter mutation with no output schema and no annotations, the description covers purpose, outcome, and how to obtain the required ID. It would be complete with a note on reversibility/permissions, but the essential information an agent needs to invoke it correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the single transferIds parameter and its UUID format are already documented in the schema. The description reinforces that the ID is a shared UUID and implies multiplicity, but adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (unlink) and resource (transfer transactions) and states the exact mechanism (shared transferId UUID). This clearly separates it from sibling tools like link_transfer, unlink_refund, unlink_transaction_from_portfolio, and unlink_transactions_from_subscription without needing to open a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives actionable workflow guidance by pointing to search_transactions as the way to obtain the transferId. It does not state when-not to use it or contrast explicitly against the other unlink_* siblings, 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.
update_categoryBInspect
Update an existing category by ID. Use when the user wants to rename, recolor, or change the icon of a category. Returns the updated category records.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | New icon identifier, or null to clear it. | |
| name | No | New category name. | |
| color | No | New hex color code (e.g. "#4CAF50"). | |
| categoryId | Yes | ID of the category to update. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It says 'Returns the updated category records' but does not disclose permission requirements, whether partial updates are allowed, what happens to unspecified fields, or whether the change is reversible. For a mutation tool with zero annotation coverage, this is a major gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the verb and resource, with no redundant filler. Efficient and readable, though the return-value sentence is somewhat boilerplate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations, no output schema, and full schema coverage, the description is thin on behavioral context. It omits permissions, partial-update semantics, and error handling. It covers purpose but leaves significant operational gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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, including that icon can be null to clear it. The description only lists the field names and adds no syntax or semantics beyond the schema. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Update an existing category by ID') and names the mutable fields (rename, recolor, change icon). It does not explicitly distinguish itself from sibling update tools like update_tag or update_budget, but the resource is unambiguous. Clear but no sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The sentence 'Use when the user wants to rename, recolor, or change the icon of a category' gives a clear usage context tied to the updatable fields. It does not mention when not to use it or point to alternatives, so it stops short of explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_goalAInspect
Update a savings goal. Only passed fields change; accounts replaces the whole set. Use status to pause, archive or restore a goal. Fails when an account would pass 100% shared across non-archived goals, the new currency has no exchange rate, or fixed amounts alone fall short of the target. Needs the Goals feature on the plan or an active trial. Returns the goal in the get_goals shape.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New goal name | |
| goalId | Yes | ID of the goal to update | |
| status | No | active, paused or archived. Archiving frees the accounts' shares; restoring re-checks that every account stays within 100% | |
| accounts | No | Replaces the whole set of backing accounts, each { accountId, sharePercent } or { accountId, fixedAmount, fixedPosition? } as in create_goal. Each account's sharePercent values across non-archived goals cannot exceed 100% | |
| targetDate | No | New deadline (yyyy-MM-dd). Pass null to remove it | |
| currencyCode | No | New target currency (ISO 4217) | |
| targetAmount | No | New target, decimal in the goal currency | |
| plannedMonthly | No | New planned saving per month, decimal in the goal currency. Pass null to fall back to the historical pace | |
| reachedHoldDays | No | Days (0-365, default 30) after first reaching the target during which a dip below it still counts as reached. 0 follows the balance live |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses destructive replacement semantics for accounts, the failure conditions (100% share overflow, missing exchange rate, fixed-amount shortfall), plan prerequisites, and the return shape. These are the kind of side effects and constraints an agent needs before mutating state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and update semantics, then failure modes, prerequisites, and return shape. Dense but nearly every clause earns its place; only the enumerated failure list is a touch long, though it is high-value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter mutation with no annotations and no output schema, the description is complete: it covers partial-update behavior, replacement semantics, failure conditions, prerequisites, and explicitly names the return shape (get_goals shape). An agent can call it correctly without further inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 genuine value beyond the schema: it explains that accounts replaces the entire set and that status drives pause/archive/restore, which the schema enumerates but does not explain consequentially. This lifts it above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Update a savings goal") and the partial-update semantics ("Only passed fields change") distinguish it from a full create. It does not explicitly name create_goal/delete_goal as alternatives, but the verb is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context for use: partial field updates, accounts full-replacement behavior, and status to pause/archive/restore. It also states a prerequisite (Goals feature or active trial). No explicit when-not or named-alternative routing, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_investment_transactionAInspect
Update an existing investment transaction — correct the date, quantity, price, fees, category, or label. Obtain the transactionId from get_investment_transactions. Only provided fields are changed; the holding recalculation runs automatically after every update.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | When the trade occurred. Accepts a date-only value (ISO 8601, e.g. "2024-03-15") or a full datetime (e.g. "2024-03-15T09:30:00.000Z"); date-only is stored at UTC midnight. | |
| fees | No | New fees/commissions as a decimal string | |
| name | No | New label or note | |
| price | No | New price per share as a decimal string | |
| category | No | New transaction category | |
| quantity | No | New share quantity as a decimal string | |
| transactionId | Yes | Investment transaction ID (from get_investment_transactions) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does reasonably well: it discloses partial-update behavior and the automatic holding recalculation side effect after every update. It omits permissions/auth requirements and whether changes are reversible, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action, followed by the ID source and the update side effect. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description covers what is changed, where the ID comes from, and the recalculating side effect. It leaves the response shape and failure/validation behavior unaddressed, but nothing critical to invoking it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every field's type and format. The description's field list adds only high-level confirmation of what is editable and does not clarify formats, decimal-string semantics, or category enum meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Update an existing investment transaction') and enumerates the mutable fields (date, quantity, price, fees, category, label). The 'investment' qualifier cleanly distinguishes it from the generic update_transaction sibling, so an agent can route without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names get_investment_transactions as the source of the required transactionId, which is the key precondition. It also clarifies patch semantics ('Only provided fields are changed'), though it offers no when-not guidance or named alternative for related edits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_payeeBInspect
Rename a Payee or set/clear its defaultCategoryId. Renaming preserves the previous canonical name as an alias so historical matches still resolve.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Payee id. | |
| name | No | New display name. | |
| defaultCategoryId | No | New default category id, or null to clear. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must carry the behavioral burden. It does disclose one genuinely valuable trait – that renaming retains the prior canonical name as an alias so historical matches still resolve – but says nothing about partial-update semantics (whether omitted fields are left untouched), authorization needs, or reversibility of the category change.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences that front-load the two mutation modes, followed immediately by the one non-obvious side effect. No filler, no restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description covers the operations and one important side effect, which is the minimum viable level. It still omits whether updates are partial or full-replacement and what the caller gets back, leaving meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters are already documented, including 'null to clear' for defaultCategoryId. The description restates the clear-vs-set distinction without adding syntax, format, or constraint detail beyond the schema, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific actions precisely: renaming a payee and setting/clearing its default category, with the target resource named. It is distinguishable from create_payee, delete_payee, and get_payee, though it never explicitly contrasts itself with merge_payees, the nearest ambiguous sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through the two mutation variants but gives no explicit when-to-use guidance, no prerequisites, and no mention of alternatives such as merge_payees for consolidating duplicates. An agent must infer routing from context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_portfolioAInspect
Update an existing portfolio's name, type, description, or enabled state. Use when the user wants to rename, recategorize, or disable one of their portfolios. Obtain the portfolioId from get_portfolios first. Only the fields provided are changed.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New portfolio name (must be unique for this user) | |
| isEnabled | No | Enable or disable the portfolio | |
| description | No | New description (pass null to clear) | |
| portfolioId | Yes | Portfolio ID (from get_portfolios) | |
| portfolioType | No | New portfolio type: investment, retirement, savings, or other |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses partial-update semantics ('Only the fields provided are changed') and a prerequisite lookup step, but says nothing about required permissions, reversibility, side effects of disabling, or failure modes 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences that front-load the purpose, then usage, then prerequisite and partial-update behavior. No filler or repetition; every sentence contributes actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter mutation tool with a fully-described schema and no output schema, the description covers purpose, use cases, prerequisite, and update semantics. It lacks authorization/response details, but those gaps are modest given the schema coverage and lack of output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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, including uniqueness and null-clearing behavior. The description repeats the field names and adds partial-update meaning, but adds no syntax or constraints beyond the structured schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb + resource ('Update an existing portfolio') and enumerates the exact mutable fields (name, type, description, enabled state). This clearly distinguishes it from create_portfolio, delete_portfolio, and read-only get_portfolios without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('when the user wants to rename, recategorize, or disable') and gives the prerequisite to obtain the portfolioId from get_portfolios first. It does not name alternatives or conditions when not to use it, but the context is clear enough for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_subscriptionAInspect
Update fields on an existing subscription or bill. Only provided fields are changed. To toggle active state use toggle_subscription_active instead. Requires finance:write scope.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | UUID of the subscription to update | |
| name | No | New display name | |
| type | No | New type: "subscription", "bill", or "installment". Switching to installment requires maxOccurrences and dueDate to be set (pass them in the same call). | |
| notes | No | New notes, or null to clear | |
| dueDate | No | New first/next payment date (ISO 8601), or null to clear the schedule | |
| endDate | No | New end date (ISO 8601), or null to clear | |
| isActive | No | Active state (prefer toggle_subscription_active instead) | |
| accountId | No | New account ID, or null to clear | |
| frequency | No | New billing frequency | |
| startDate | No | New start date (ISO 8601) | |
| categoryId | No | New category ID, or null to clear | |
| expectedAmount | No | New expected payment amount as a decimal (e.g. 9.99) | |
| maxOccurrences | No | New total number of payments, or null for an indefinite schedule | |
| expectedCurrencyCode | No | New currency code for expectedAmount |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden; it usefully discloses partial-update semantics and the required finance:write scope, plus a redirect for the isActive field. It omits other behavioral traits such as reversibility, error behavior on invalid type switches, or effects on linked transactions, so it is adequate rather than rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, all front-loaded: purpose, partial-update behavior, then the alternative and prerequisite. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter mutation tool with no annotations and no output schema, the description covers the key items an agent needs: what it modifies, that updates are partial, the required scope, and the correct alternative for toggling. Missing only secondary details like return value or downstream effects, which is minor given the fully documented schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 14 parameters (including null-to-clear and installment constraints). The description's 'Only provided fields are changed' adds partial-update meaning, but no per-parameter detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Update') and resource ('fields on an existing subscription or bill'), and adds that it is a partial update ('Only provided fields are changed'). It also names the sibling toggle_subscription_active as the tool to use for the one case it does not cover, so an agent can distinguish it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-not/alternative ('To toggle active state use toggle_subscription_active instead') and a prerequisite ('Requires finance:write scope'). It does not address when to prefer this over link_transactions_to_subscription or update_transaction, but the routing to the closest sibling is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_tagAInspect
Update an existing tag by ID. Use when the user wants to rename, recolor, or change the icon/description of a tag. Returns the updated tag.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ID of the tag to update. | |
| icon | No | New icon identifier, or null to clear it. | |
| name | No | New tag name (must be unique for this user). | |
| color | No | New hex color code for the tag (e.g. "#FF5733"). | |
| description | No | New description, or null to clear it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the entire behavioral burden. It discloses that this mutates an existing record and that it 'Returns the updated tag,' which is useful given no output schema. However, it omits permission/auth requirements, whether unmentioned fields are preserved or cleared (partial-update semantics), and the uniqueness failure mode of name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the purpose front-loaded and no filler. Each sentence adds something (operation, trigger conditions, return value), though the structure is plain rather than notably well-organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a straightforward 5-parameter update with no annotations and no output schema, the description covers purpose, when-to-use, and the return value, which is the key gap output_schema would otherwise fill. It is only missing behavioral detail (auth, partial-update semantics) for a mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (id, name, color, icon, description) is already documented by the schema with formats and null semantics. The description only restates which fields are updatable (rename/recolor/icon/description) and adds no format or edge-case detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update an existing tag by ID'), so an agent immediately knows the operation. It does not explicitly differentiate itself from neighbors like create_tag, delete_tag, or update_category, but the resource noun makes the target unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use when the user wants to rename, recolor, or change the icon/description of a tag' gives clear, concrete trigger conditions. It stops short of stating when-not to use it or pointing to an alternative (e.g. delete_tag, assign_tags_to_transaction), so it lands at a solid 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_trackerAInspect
Update the name, date range, spending limit, or rules (categories, tags, auto-add) of an existing tracker. Only passed fields change; limitAmount null removes the limit. With rules on, every update re-checks all transactions against them. Lines are managed with create_tracker_line, update_tracker_line and delete_tracker_line. Changing smart-tracking fields or dates rescans the tracker and fails while a scan is already queued or running. Returns the updated tracker record.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New tracker name | |
| tagIds | No | Replace the rule tags | |
| endDate | No | New end date (ISO 8601) | |
| aiEnabled | No | Turn smart tracking on or off. Owner only; enabling needs a description and a start date (already saved or passed here) | |
| startDate | No | New start date (ISO 8601) | |
| trackerId | Yes | ID of the tracker to update | |
| categoryIds | No | Replace the rule categories; parent IDs include their children | |
| limitAmount | No | New spending limit as a decimal amount in the user's base currency (e.g. 500.00). Pass null to remove the limit | |
| rulesCleanup | No | Remove rule-added transactions that stop matching the rules | |
| rulesEnabled | No | Auto-add the user's transactions in the date range matching the rule categories or tags | |
| aiDescription | No | Plain-language description of what belongs in the tracker (max 500 chars). Owner only; null clears it | |
| aiPreWindowDays | No | Days before startDate the AI also scans. One of 0, 14, 30, 60, 90, 180. Owner only |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses partial-update semantics ('Only passed fields change'), that limitAmount null removes the limit, that every update re-checks all transactions when rules are on, and that date/smart-field changes trigger a rescan that can fail. It also states it returns the updated record. It omits permission requirements (owner-only) that appear only in schema descriptions, but the mutation and side-effect behavior is 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the primary action and scoping, then terse sentences covering partial-update semantics, side effects, line-tool routing, and the rescan failure condition. Every sentence carries functional information; it is slightly dense but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter mutation tool with no annotations and no output schema, the description covers the key operational risks (rescans, re-checks, failure while scanning) and states the return value. Permission details live in the schema, so an agent has enough to call this correctly; only per-field nuance depends on schema reading.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 cross-parameter meaning beyond the schema by explaining that only supplied fields change and that null on limitAmount removes the limit rather than erroring. It does not restate individual parameter constraints (enum, owner-only), which the schema already handles, so it stays a modest value-add over baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Update) and resource (existing tracker) and enumerates the updatable facets: name, date range, spending limit, rules. It also explicitly demarcates scope by naming create_tracker_line/update_tracker_line/delete_tracker_line as the tools for line management, so an agent can distinguish this from sibling tracker tools without reading schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Routes line editing to the three line-specific siblings and warns that changes to smart-tracking fields or dates fail while a scan is queued or running, which is genuine when/when-not guidance. It does not explicitly compare against create_tracker or archive_tracker, but the mutation scope and failure condition are clearly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_tracker_lineAInspect
Update a tracker line: name, categories, limit, or position. Only passed fields change. A transaction lands in at most one line — the first line by position whose category set (expanded to children) contains its category; spending matching no line counts as "other". Requires manage access to the tracker. Returns the updated line.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New line name | |
| lineId | Yes | ID of the line to update | |
| position | No | New 0-based order. Earlier lines win when category sets overlap | |
| trackerId | Yes | ID of the tracker the line belongs to | |
| categoryIds | No | Replace the categories the line covers; parents expand to their children | |
| limitAmount | No | New line limit as a decimal amount in the tracker owner's base currency. Pass null to remove the limit |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full behavioral burden and does so well: it discloses partial-update semantics, the manage-access requirement, the return value, and non-obvious domain rules about category precedence and the 'other' fallback bucket. This is exactly the context an agent cannot get from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the verb and resource, then layers semantics efficiently in four sentences. The middle sentence on transaction-to-line matching is somewhat expansive for an update tool but is justified because it explains how position and categoryIds actually behave.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description closes that gap by stating 'Returns the updated line.' It covers auth, mutation scope, and matching semantics. It does not describe the shape of the returned line object, a minor remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters are already documented, including 'Earlier lines win when category sets overlap' and 'parents expand to their children'. The description restates the field list and matching rule without adding syntax or constraints beyond the schema, which matches the baseline 3 for high-coverage schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (update) plus resource (tracker line) and enumerates exactly which fields are mutable: name, categories, limit, position. This cleanly separates it from create_tracker_line and delete_tracker_line, which share the same resource noun.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational context: 'Only passed fields change' establishes patch semantics, and 'Requires manage access to the tracker' states a prerequisite. It does not explicitly name alternatives such as update_tracker or create_tracker_line, so it falls short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_transactionAInspect
Update an existing transaction by ID. All fields except id are optional — only provide what you want to change. Pass tagIds: null to clear all tags, or tagIds: [] to do the same. Pass splits: null to clear all splits. Pass payeeId: null to clear the payee. Use originalAmount + originalCurrencyCode to record what the purchase cost in its invoice currency when that differs from the account currency. Use paymentLegs to change which accounts a multi-account payment is paid from.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ID of the transaction to update | |
| note | No | New note. Pass null to clear | |
| time | No | New date/time as ISO 8601 string | |
| amount | No | New amount as an unsigned decimal (e.g. 12.50). Never negative: transactionType sets the direction | |
| splits | No | Replace splits. Pass null or empty array to clear all splits | |
| tagIds | No | Replace tags. Pass null or empty array to clear all tags | |
| payeeId | No | Payee ID to assign. Pass null to clear | |
| accountId | No | Move transaction to a different account | |
| categoryId | No | New category ID | |
| paymentLegs | No | Replace the payment's other accounts (same item shape as create_transaction). Keep a current part by passing its transactionId (see paymentParts in search_transactions), optionally with a new amount unless it is a linked part; an omitted created part is deleted, an omitted linked part becomes a standalone transaction again. Pass null or [] to make it a single-account transaction. Omit to leave the parts unchanged | |
| paymentType | No | Payment method used | |
| originalAmount | No | Amount in the currency the purchase was originally priced in (decimal), e.g. 66.42 for a PLN invoice paid from a UAH account. Informational only: never affects balances. Requires originalCurrencyCode. Pass null on both to clear | |
| transferNature | No | Transfer type | |
| transactionType | No | Change whether this is income or expense | |
| destinationAmount | No | For transfers: new amount received in destination account (decimal, greater than 0) | |
| destinationAccountId | No | For transfers: new destination account ID | |
| originalCurrencyCode | No | ISO 4217 code of originalAmount (e.g. "PLN"). Requires originalAmount. Cannot be combined with transfer fields | |
| destinationTransactionId | No | For transfers: link to an existing destination transaction |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden well: it discloses destructive clearing semantics (null or [] clears tags/splits, null clears payee), that originalAmount is informational and never affects balances, and that omitting created payment legs deletes them while omitting linked legs makes them standalone. It does not mention required permissions, reversibility, or atomicity, which are meaningful gaps 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core update contract, then moves through clearing behavior and special fields in a logical order. A few sentences are slightly redundant (tagIds null vs [] 'to do the same'), but nothing is wasted overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 18-parameter mutation tool with no annotations and no output schema, the description covers the most error-prone behaviors: partial updates, clearing sentinels, originalAmount pairing, and payment-leg replacement semantics. It omits permissions, error behavior, and guidance on when to use specialized siblings, which leaves some contextual gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds patch semantics and explicitly distinguishes null from [] for tagIds and splits. It also frames originalAmount + originalCurrencyCode as an invoice-currency pair and paymentLegs as a multi-account payment modifier, adding useful meaning beyond the already-detailed schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 an existing transaction by ID.' That clearly scopes the tool to a single transaction and distinguishes it from bulk_update_transactions, though it never explicitly names any sibling alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the partial-update contract ('only provide what you want to change') and governs sentinel values for clearing tags, splits, and payee. It does not say when to use bulk_update_transactions, split_transaction, or delete_split instead, so exclusions are absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_transaction_automationAInspect
Update a transaction automation rule. Only provided fields change; conditions and actions are replaced wholesale, not merged. Setting isEnabled to true or changing conditions/actions re-validates every referenced category, tag, payee, and account and clears pausedReason, so this is how a rule paused by a deleted reference is repaired. Position is not changed here, use reorder_transaction_automations. Requires finance:write scope.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | UUID of the automation | |
| name | No | New display name | |
| actions | No | Actions applied when the conditions match. 1-4 actions, each type at most once. - { "type": "set_category", "categoryId": "<uuid>" } - { "type": "add_tags", "tagIds": ["<uuid>"] } with 1-20 tag ids - { "type": "set_payee", "payeeId": "<uuid>" } - { "type": "set_note", "mode": "replace" | "append" | "prepend", "value": "<text, max 200 chars>" } Every referenced category, tag, and payee must belong to the user, otherwise the call is rejected. | |
| isEnabled | No | Enable or disable the rule | |
| conditions | No | Condition tree: { match: "all" | "any", items: [...] }. 1-10 items, at most one transactionType item. Item shapes by field: - note | merchant (merchant is the bank-provided merchant/description text): { field, operator, value }. operator: contains_any | not_contains_any | starts_with_any | ends_with_any | equals_any | is_empty. value: 1-20 case-insensitive keywords, max 64 chars each; required unless operator is is_empty. Example: { "field": "merchant", "operator": "contains_any", "value": ["uber", "bolt"] } - payee | account | accountGroup | bankConnection: { field, operator, value }. operator: in | not_in. value: 1-20 UUIDs of that entity, all owned by the user. Example: { "field": "account", "operator": "in", "value": ["<accountId>"] } - amount: { field, operator, value: { min?, max? }, currency }. operator: gte | lte | between | equals. gte and equals take min only, lte takes max only, between takes both. Bounds are decimals (e.g. 12.50). currency: { "mode": "transaction" } compares in the currency of the transaction itself, { "mode": "base" } in the user base currency, { "mode": "specific", "code": "USD" } in a fixed currency. Example: { "field": "amount", "operator": "gte", "value": { "min": 100 }, "currency": { "mode": "base" } } - transactionType: { "field": "transactionType", "operator": "equals", "value": "income" | "expense" } - dayOfMonth: { "field": "dayOfMonth", "operator": "between", "value": { "min": 1, "max": 31 } } |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: partial-update semantics ('only provided fields change'), the destructive replace-not-merge behavior on conditions/actions, the side effect of re-validating references and clearing pausedReason, and the auth requirement. These are exactly the traits an agent needs before mutating nested rule data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the update semantics and side effects, then the exclusion and the required scope. No filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-annotation mutation tool with deeply nested schemas and no output schema, the description supplies the missing behavioral context: merge behavior, re-validation side effects, pause-repair use case, scope, and the sibling for reordering. Nothing essential to correct invocation is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 still adds value by clarifying merge vs replace semantics for conditions/actions, which the schema does not state. It does not, however, expand on id, name, or isEnabled beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Update a transaction automation rule') and immediately names the sibling it is not for position changes (reorder_transaction_automations). An agent can distinguish it from the create/delete/reorder siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('this is how a rule paused by a deleted reference is repaired') and when not to ('Position is not changed here, use reorder_transaction_automations'), plus the required finance:write scope. Both an alternative and a triggering condition are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_transaction_groupAInspect
Update the name or note of an existing transaction group. To change group membership use add_transactions_to_group or remove_transactions_from_group. Requires finance:write scope.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ID of the transaction group to update | |
| name | No | New display name for the group | |
| note | No | New note for the group (pass null to clear) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the load; it does disclose the required scope and the fact that only metadata (name/note) is touched, which prevents accidental membership changes. It does not state whether omitted fields stay unchanged, what errors look like for a bad UUID, or whether the call is idempotent, leaving some behavioral gaps 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and constrained scope, followed by the redirect and the permission requirement. Every sentence carries distinct information with no repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a small three-parameter mutation with a fully documented schema, the description covers purpose, exclusions, and authorization. It stops short of describing what comes back (no output schema exists) and whether a no-op body is rejected, but nothing essential to invoking it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including the null-clears-the-note semantics and the UUID pattern, so the schema does the heavy lifting. The description reinforces which two fields are in play but adds no format or edge-case detail beyond that baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update ... an existing transaction group') and immediately bounds the mutation surface to name or note. That scoping distinguishes it from the many other transaction-group siblings such as add_transactions_to_group and delete_transaction_group.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent elsewhere for the most likely confusion: 'To change group membership use add_transactions_to_group or remove_transactions_from_group.' It also names the precondition (finance:write scope), so the agent knows when the call is legal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_venture_dealAInspect
Update a venture deal. Only provided fields change. Once any event exists on the deal, the terms (principal, entryFee, entryFeePct, carryPct, hurdlePct, investmentDate, currencyCode) are locked — changing them would silently stale the carry math. Delete the events first if the user needs to fix terms. Status can be overridden manually (auto-progression normally derives it from events). Fee percentages are decimal fractions in [0,1].
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New deal name | |
| notes | No | New notes (or null to clear) | |
| dealId | Yes | Venture deal ID (from list_venture_deals) | |
| status | No | Override the deal status manually | |
| carryPct | No | New carry fraction in [0,1] (locked once events exist) | |
| entryFee | No | New entry fee amount (locked once events exist) | |
| hurdlePct | No | New hurdle fraction in [0,1] (locked once events exist) | |
| principal | No | New principal (locked once events exist) | |
| mgmtFeePct | No | New management fee fraction in [0,1] | |
| platformId | No | Move to a different platform (or null to clear) | |
| spvSubtype | No | New SPV subtype | |
| entryFeePct | No | New entry fee fraction in [0,1] (locked once events exist) | |
| currencyCode | No | New currency code (locked once events exist) | |
| targetCompany | No | New target company name | |
| investmentDate | No | New investment date (locked once events exist) | |
| expectedExitDate | No | New expected exit date (or null to clear) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and discharges it well: it discloses the terms-lock once events exist, the stale-carry-math hazard, status auto-progression vs manual override, and the decimal-fraction unit convention. It omits auth/permission needs and reversibility, but the mutation hazards unique to this tool are clearly surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the operation and patch semantics, then layers the lock rule, the remedy, the status override, and the unit convention. Every sentence is load-bearing with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-parameter mutation tool with no annotations and no output schema, the description covers the risky semantics an agent must know before calling. It leaves out error behavior on locked-field attempts and any permission requirements, but is otherwise sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning: it enumerates which fields are locked once events exist (principal, entryFee, entryFeePct, carryPct, hurdlePct, investmentDate, currencyCode) and reinforces that fee percentages are fractions in [0,1]. This cross-field conditional constraint is not expressible in the flat schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb ('Update') and resource ('venture deal'), and 'Only provided fields change' clarifies the patch semantics. It is distinguishable from update_venture_event / update_venture_platform by resource name, though it never explicitly contrasts itself with those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives actionable when-to-use context: 'Delete the events first if the user needs to fix terms' and 'Status can be overridden manually.' It explains the conditions under which locked fields become mutable, but does not name the alternative tool (update_venture_event) for editing events.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_venture_eventAInspect
Update a venture event. Only provided fields change. eventDate must stay on/after the initial_investment date (and moving an initial_investment past existing later events is rejected).
Override semantics for gpCarryAmount / lpNetAmount:
• Omit the field → no change.
• Pass a string value → set the manual override; flips the corresponding *Overridden flag to true.
• Pass null → currently treated the same as omitting (no semantic clear). To clear an existing override, use resetOverrides: true instead.
The event type cannot be changed — delete and recreate instead.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | New notes (or null to clear) | |
| eventId | Yes | Venture event ID (from list_venture_events) | |
| navAfter | No | New post-event NAV (decimal string) | |
| eventDate | No | New event date (YYYY-MM-DD) | |
| grossAmount | No | New gross amount (decimal string) | |
| lpNetAmount | No | Set the manual lpNetAmount override; flips lpNetAmountOverridden=true. To clear, use resetOverrides=true. | |
| quantityPct | No | New partial-exit quantity fraction in [0,1] | |
| gpCarryAmount | No | Set the manual gpCarry override; flips gpCarryOverridden=true. To clear, use resetOverrides=true. | |
| resetOverrides | No | When true, clears both override flags and re-computes carry from deal terms. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers: partial-update semantics, the eventDate constraint tied to initial_investment, rejection of retroactive moves, the override tri-state behavior including the non-obvious fact that null equals omitting, and that resetOverrides recomputes carry from deal terms. This is exactly the non-schema 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core operation and constraints, then a well-structured bullet block for the override rules. Every sentence carries real information; the formatting is slightly heavy but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter mutation tool with no annotations and no output schema, the description covers update semantics, validation constraints, and the override/reset behavior thoroughly. Gaps are minor: no note on permissions or on what the response returns, though the latter is not strictly required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description exceeds it by explaining the override semantics of gpCarryAmount/lpNetAmount (what flips which flag), the no-op nature of null, and what resetOverrides actually does. It does not, however, clarify navAfter/grossAmount/quantityPct beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Update a venture event") and immediately scopes it with partial-update semantics ("Only provided fields change"). It does not name a sibling tool for comparison, and the create/delete counterparts must be inferred from the mention of "delete and recreate".
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete routing guidance: event type cannot be changed, so delete and recreate instead; and to clear an override use resetOverrides rather than null. It does not explicitly name delete_venture_event or create_venture_event as the alternatives, but the when-to-use/when-not logic is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_venture_platformAInspect
Update an existing venture platform's name, website, description, or default fees. Only provided fields change. Updating default fees does NOT retroactively change fees on existing deals — those are snapshotted at deal creation. Fee fractions are decimals in [0,1].
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New platform name (must be unique for this user) | |
| website | No | New website URL (pass null to clear) | |
| platformId | Yes | Venture platform ID (from list_venture_platforms) | |
| description | No | New description (pass null to clear) | |
| defaultCarryPct | No | New default carry as a decimal fraction in [0,1] (e.g. 0.2 for 20%). | |
| defaultHurdlePct | No | New default hurdle rate as a decimal fraction in [0,1]. | |
| defaultMgmtFeePct | No | New default management fee as a decimal fraction in [0,1]. | |
| defaultEntryFeePct | No | New default entry fee as a decimal fraction in [0,1] (e.g. 0.085 for 8.5%). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does add real behavioral value: it discloses partial-update semantics and, importantly, that changing default fees is NOT retroactive because existing deals snapshot their fees. It does not cover auth/permission needs, uniqueness failure behavior, or 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tightly packed sentences with no filler; the mutable-field list, patch semantics, and the critical fee-snapshot caveat are front-loaded. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema but full schema coverage, the description covers the essential behavioral caveats. Remaining gaps (permissions, name-collision errors, return value) are modest given the rich schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 8 parameters are already documented, including the [0,1] fraction semantics and null-clearing for website/description. The description's 'Fee fractions are decimals in [0,1]' merely restates schema content, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Update an existing venture platform') with an enumeration of the mutable fields (name, website, description, default fees). An agent can distinguish it from update_venture_deal/update_venture_event by resource, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Only provided fields change' clarifies patch semantics, which implicitly tells the agent it can send a subset of fields. However, there is no explicit when-to-use guidance versus alternatives (e.g. create_venture_platform, delete_venture_platform) and no stated prerequisites or permissions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
- Changed
create_transaction3 fields changed- added
Input schema / properties / paymentLegsAdded value: +{ + "description": "Pay this income/expense from up to 4 more accounts. Each item is either { accountId, amount } to create a part on another account, or { transactionId } to link an existing transaction as a part (its amount stays). amount is in that account's currency; when it differs from this transaction's currency also pass paymentAmount, the part's value in this transaction's currency. Not allowed for transfers, refunds, planned or category-split transactions", + "items": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "amount": { + "exclusiveMinimum": 0, + "type": "number" + }, + "paymentAmount": { + "exclusiveMinimum": 0, + "type": "number" + }, + "transactionId": { + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "type": "string" + } + }, + "required": [ + "transactionId" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "accountId": { + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "type": "string" + }, + "amount": { + "exclusiveMinimum": 0, + "type": "number" + }, + "paymentAmount": { + "exclusiveMinimum": 0, + "type": "number" + } + }, + "required": [ + "accountId", + "amount" + ], + "type": "object" + } + ] + }, + "maxItems": 4, + "type": "array" +} - changed
Input schema / properties / paymentType / descriptionPrevious value: -"Payment method used"New value: +"Payment method used. Defaults to the account's default payment type, or bankTransfer" - changed
Input schema / requiredPrevious value: -[ - "accountId", - "amount", - "transactionType", - "paymentType", - "transferNature" -]New value: +[ + "accountId", + "amount", + "transactionType", + "transferNature" +]
- Changed
update_transaction1 field changed- added
Input schema / properties / paymentLegsAdded value: +{ + "anyOf": [ + { + "items": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "amount": { + "exclusiveMinimum": 0, + "type": "number" + }, + "paymentAmount": { + "exclusiveMinimum": 0, + "type": "number" + }, + "transactionId": { + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "type": "string" + } + }, + "required": [ + "transactionId" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "accountId": { + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "type": "string" + }, + "amount": { + "exclusiveMinimum": 0, + "type": "number" + }, + "paymentAmount": { + "exclusiveMinimum": 0, + "type": "number" + } + }, + "required": [ + "accountId", + "amount" + ], + "type": "object" + } + ] + }, + "maxItems": 4, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Replace the payment's other accounts (same item shape as create_transaction). Keep a current part by passing its transactionId (see paymentParts in search_transactions), optionally with a new amount unless it is a linked part; an omitted created part is deleted, an omitted linked part becomes a standalone transaction again. Pass null or [] to make it a single-account transaction. Omit to leave the parts unchanged" +}
7 tool updates
- Changed
adjust_account_balance1 field changed- added
Input schema / properties / note / maxLengthAdded value: +1000
- Changed
bulk_update_transactions1 field changed- added
Input schema / properties / note / maxLengthAdded value: +1000
- Changed
create_transaction2 fields changed- added
Input schema / properties / note / maxLengthAdded value: +1000 - changed
Input schema / properties / splits / items / properties / note / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 100, + "type": "string" + }, + { + "type": "null" + } +]
- Changed
create_transaction_group1 field changed- added
Input schema / properties / note / maxLengthAdded value: +500
- Changed
split_transaction1 field changed- changed
Input schema / properties / splits / items / properties / note / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 100, + "type": "string" + }, + { + "type": "null" + } +]
- Changed
update_transaction2 fields changed- changed
Input schema / properties / note / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 1000, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / splits / anyOfPrevious value: -[ - { - "items": { - "properties": { - "amount": { - "description": "Amount for this split portion (decimal, greater than 0)", - "exclusiveMinimum": 0, - "type": "number" - }, - "categoryId": { - "description": "Category ID for this split portion", - "format": "uuid", - "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", - "type": "string" - }, - "note": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Optional note for this split" - } - }, - "required": [ - "categoryId", - "amount" - ], - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "properties": { + "amount": { + "description": "Amount for this split portion (decimal, greater than 0)", + "exclusiveMinimum": 0, + "type": "number" + }, + "categoryId": { + "description": "Category ID for this split portion", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "type": "string" + }, + "note": { + "anyOf": [ + { + "maxLength": 100, + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Optional note for this split" + } + }, + "required": [ + "categoryId", + "amount" + ], + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +]
- Changed
update_transaction_group1 field changed- changed
Input schema / properties / note / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 500, + "type": "string" + }, + { + "type": "null" + } +]
3 tool updates
- Changed
create_tracker7 fields changed- changed
Input schema / properties / aiEnabled / descriptionPrevious value: -"Turn on smart tracking: an AI scans the date range and links or suggests matching transactions. Manual trackers only; requires aiDescription and startDate"New value: +"Turn on smart tracking: an AI scans the date range and links or suggests matching transactions. Requires aiDescription and startDate" - removed
Input schema / properties / autoIncludeRemoved value: -{ - "description": "Auto-include transactions in the date range when creating (manual trackers only)", - "type": "boolean" -} - changed
Input schema / properties / categoryIds / descriptionPrevious value: -"Category IDs to link (only used when type is \"category\")"New value: +"Rule categories; parent IDs include their children" - added
Input schema / properties / rulesCleanupAdded value: +{ + "description": "Remove rule-added transactions that stop matching the rules. Default: true", + "type": "boolean" +} - added
Input schema / properties / rulesEnabledAdded value: +{ + "description": "Auto-add the user's transactions in the date range matching any of categoryIds or tagIds. Needs at least one of them. Default: false", + "type": "boolean" +} - added
Input schema / properties / tagIdsAdded value: +{ + "description": "Rule tags", + "items": { + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "type": "string" + }, + "type": "array" +} - removed
Input schema / properties / typeRemoved value: -{ - "description": "Tracker type: manual (transactions linked explicitly) or category (auto-tracks by category). Default: manual", - "enum": [ - "manual", - "category" - ], - "type": "string" -}
- Changed
create_tracker_line1 field changed- changed
Input schema / properties / categoryIds / descriptionPrevious value: -"Category IDs the line covers; parents expand to their children. On a category tracker they must be categories the tracker tracks. Categories resolve against the tracker owner's tree."New value: +"Category IDs the line covers; parents expand to their children. Categories resolve against the tracker owner's tree."
- Changed
update_tracker6 fields changed- changed
Input schema / properties / aiEnabled / descriptionPrevious value: -"Turn smart tracking on or off. Owner only; manual trackers only; enabling needs a description and a start date (already saved or passed here)"New value: +"Turn smart tracking on or off. Owner only; enabling needs a description and a start date (already saved or passed here)" - removed
Input schema / properties / autoIncludeRemoved value: -{ - "description": "Whether to auto-include transactions in the date range", - "type": "boolean" -} - changed
Input schema / properties / categoryIds / descriptionPrevious value: -"Replace the linked category IDs (only applies to category-type trackers)"New value: +"Replace the rule categories; parent IDs include their children" - added
Input schema / properties / rulesCleanupAdded value: +{ + "description": "Remove rule-added transactions that stop matching the rules", + "type": "boolean" +} - added
Input schema / properties / rulesEnabledAdded value: +{ + "description": "Auto-add the user's transactions in the date range matching the rule categories or tags", + "type": "boolean" +} - added
Input schema / properties / tagIdsAdded value: +{ + "description": "Replace the rule tags", + "items": { + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "type": "string" + }, + "type": "array" +}
4 tool updates
- Added
create_goal - Added
delete_goal - Added
get_goals - Added
update_goal
28 tool updates
- Removed
accept_budget_suggestions - Added
accept_tracker_suggestions - Removed
add_transactions_to_budget - Added
add_transactions_to_tracker - Removed
archive_budget - Added
archive_tracker - Removed
create_budget - Removed
create_budget_line - Added
create_tracker - Added
create_tracker_line - Removed
delete_budget - Removed
delete_budget_line - Added
delete_tracker - Added
delete_tracker_line - Removed
get_budget_spending_stats - Removed
get_budgets - Added
get_tracker_spending_stats - Added
get_trackers - Removed
list_budget_suggestions - Added
list_tracker_suggestions - Removed
reject_budget_suggestions - Added
reject_tracker_suggestions - Removed
remove_transactions_from_budget - Added
remove_transactions_from_tracker - Removed
update_budget - Removed
update_budget_line - Added
update_tracker - Added
update_tracker_line
11 tool updates
- Added
accept_budget_suggestions - Changed
bulk_update_transactions1 field changed- added
Input schema / properties / payeeIdAdded value: +{ + "anyOf": [ + { + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Payee ID to assign to all transactions. Pass null to clear" +}
- Changed
create_budget3 fields changed- added
Input schema / properties / aiDescriptionAdded value: +{ + "anyOf": [ + { + "maxLength": 500, + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Plain-language description of what belongs in the tracker (max 500 chars), e.g. \"Trip to Lisbon: flights, hotels, food\"" +} - added
Input schema / properties / aiEnabledAdded value: +{ + "description": "Turn on smart tracking: an AI scans the date range and links or suggests matching transactions. Manual trackers only; requires aiDescription and startDate", + "type": "boolean" +} - added
Input schema / properties / aiPreWindowDaysAdded value: +{ + "description": "Days before startDate the AI also scans, for things booked in advance. One of 0, 14, 30, 60, 90, 180. Default: 60", + "enum": [ + 0, + 14, + 30, + 60, + 90, + 180 + ], + "type": "number" +}
- Added
create_budget_line - Changed
create_transaction1 field changed- added
Input schema / properties / payeeIdAdded value: +{ + "description": "Payee ID to assign", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "type": "string" +}
- Added
delete_budget_line - Added
list_budget_suggestions - Added
reject_budget_suggestions - Changed
update_budget6 fields changed- added
Input schema / properties / aiDescriptionAdded value: +{ + "anyOf": [ + { + "maxLength": 500, + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Plain-language description of what belongs in the tracker (max 500 chars). Owner only; null clears it" +} - added
Input schema / properties / aiEnabledAdded value: +{ + "description": "Turn smart tracking on or off. Owner only; manual trackers only; enabling needs a description and a start date (already saved or passed here)", + "type": "boolean" +} - added
Input schema / properties / aiPreWindowDaysAdded value: +{ + "description": "Days before startDate the AI also scans. One of 0, 14, 30, 60, 90, 180. Owner only", + "enum": [ + 0, + 14, + 30, + 60, + 90, + 180 + ], + "type": "number" +} - added
Input schema / properties / limitAmount / anyOfAdded value: +[ + { + "exclusiveMinimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - changed
Input schema / properties / limitAmount / descriptionPrevious value: -"New spending limit as a decimal amount in the user's base currency (e.g. 500.00)"New value: +"New spending limit as a decimal amount in the user's base currency (e.g. 500.00). Pass null to remove the limit" - removed
Input schema / properties / limitAmount / typeRemoved value: -"number"
- Added
update_budget_line - Changed
update_transaction1 field changed- added
Input schema / properties / payeeIdAdded value: +{ + "anyOf": [ + { + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Payee ID to assign. Pass null to clear" +}
8 tool updates
- Changed
add_transactions_to_budget2 fields changed- changed
Input schema / properties / budgetId / descriptionPrevious value: -"ID of the budget to link transactions to"New value: +"ID of the tracker to link transactions to" - changed
Input schema / properties / transactionIds / descriptionPrevious value: -"IDs of the transactions to add to the budget"New value: +"IDs of the transactions to add to the tracker"
- Changed
archive_budget2 fields changed- changed
Input schema / properties / budgetId / descriptionPrevious value: -"ID of the budget to archive or unarchive"New value: +"ID of the tracker to archive or unarchive" - changed
Input schema / properties / isArchived / descriptionPrevious value: -"true to archive the budget, false to restore it to active"New value: +"true to archive the tracker, false to restore it to active"
- Changed
create_budget6 fields changed- changed
Input schema / properties / autoInclude / descriptionPrevious value: -"Auto-include transactions in the date range when creating (manual budgets only)"New value: +"Auto-include transactions in the date range when creating (manual trackers only)" - changed
Input schema / properties / endDate / descriptionPrevious value: -"Budget end date (ISO 8601)"New value: +"Tracker end date (ISO 8601)" - changed
Input schema / properties / name / descriptionPrevious value: -"Budget name"New value: +"Tracker name" - changed
Input schema / properties / startDate / descriptionPrevious value: -"Budget start date (ISO 8601)"New value: +"Tracker start date (ISO 8601)" - changed
Input schema / properties / status / descriptionPrevious value: -"Budget status (default: active)"New value: +"Tracker status (default: active)" - changed
Input schema / properties / type / descriptionPrevious value: -"Budget type: manual (transactions linked explicitly) or category (auto-tracks by category). Default: manual"New value: +"Tracker type: manual (transactions linked explicitly) or category (auto-tracks by category). Default: manual"
- Changed
delete_budget1 field changed- changed
Input schema / properties / budgetId / descriptionPrevious value: -"ID of the budget to delete"New value: +"ID of the tracker to delete"
- Changed
get_budget_spending_stats1 field changed- changed
Input schema / properties / budgetId / descriptionPrevious value: -"ID of the budget to retrieve spending stats for"New value: +"ID of the tracker to retrieve spending stats for"
- Changed
get_budgets1 field changed- changed
Input schema / properties / status / descriptionPrevious value: -"Filter by budget status. Default: active"New value: +"Filter by tracker status. Default: active"
- Changed
remove_transactions_from_budget2 fields changed- changed
Input schema / properties / budgetId / descriptionPrevious value: -"ID of the budget to unlink transactions from"New value: +"ID of the tracker to unlink transactions from" - changed
Input schema / properties / transactionIds / descriptionPrevious value: -"IDs of the transactions to remove from the budget"New value: +"IDs of the transactions to remove from the tracker"
- Changed
update_budget3 fields changed- changed
Input schema / properties / budgetId / descriptionPrevious value: -"ID of the budget to update"New value: +"ID of the tracker to update" - changed
Input schema / properties / categoryIds / descriptionPrevious value: -"Replace the linked category IDs (only applies to category-type budgets)"New value: +"Replace the linked category IDs (only applies to category-type trackers)" - changed
Input schema / properties / name / descriptionPrevious value: -"New budget name"New value: +"New tracker name"
3 tool updates
- Changed
create_transaction6 fields changed- changed
Input schema / properties / amount / descriptionPrevious value: -"Transaction amount as a decimal (e.g. 12.50)"New value: +"Transaction amount as an unsigned decimal (e.g. 12.50). Never negative: transactionType sets the direction" - added
Input schema / properties / amount / minimumAdded value: +0 - changed
Input schema / properties / destinationAmount / descriptionPrevious value: -"For transfers: amount received in destination account (decimal)"New value: +"For transfers: amount received in destination account (decimal, greater than 0)" - added
Input schema / properties / destinationAmount / exclusiveMinimumAdded value: +0 - changed
Input schema / properties / splits / items / properties / amount / descriptionPrevious value: -"Amount for this split portion (decimal)"New value: +"Amount for this split portion (decimal, greater than 0)" - added
Input schema / properties / splits / items / properties / amount / exclusiveMinimumAdded value: +0
- Changed
split_transaction2 fields changed- changed
Input schema / properties / splits / items / properties / amount / descriptionPrevious value: -"Amount for this split portion (decimal)"New value: +"Amount for this split portion (decimal, greater than 0)" - added
Input schema / properties / splits / items / properties / amount / exclusiveMinimumAdded value: +0
- Changed
update_transaction5 fields changed- changed
Input schema / properties / amount / descriptionPrevious value: -"New amount as a decimal (e.g. 12.50)"New value: +"New amount as an unsigned decimal (e.g. 12.50). Never negative: transactionType sets the direction" - added
Input schema / properties / amount / minimumAdded value: +0 - changed
Input schema / properties / destinationAmount / descriptionPrevious value: -"For transfers: new amount received in destination account (decimal)"New value: +"For transfers: new amount received in destination account (decimal, greater than 0)" - added
Input schema / properties / destinationAmount / exclusiveMinimumAdded value: +0 - changed
Input schema / properties / splits / anyOfPrevious value: -[ - { - "items": { - "properties": { - "amount": { - "description": "Amount for this split portion (decimal)", - "type": "number" - }, - "categoryId": { - "description": "Category ID for this split portion", - "format": "uuid", - "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", - "type": "string" - }, - "note": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Optional note for this split" - } - }, - "required": [ - "categoryId", - "amount" - ], - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "properties": { + "amount": { + "description": "Amount for this split portion (decimal, greater than 0)", + "exclusiveMinimum": 0, + "type": "number" + }, + "categoryId": { + "description": "Category ID for this split portion", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "type": "string" + }, + "note": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Optional note for this split" + } + }, + "required": [ + "categoryId", + "amount" + ], + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +]
103 tool updates
- First observed
add_transactions_to_budget - First observed
add_transactions_to_group - First observed
adjust_account_balance - First observed
archive_account - First observed
archive_budget - First observed
assign_tags_to_transaction - First observed
bulk_update_transactions - First observed
create_attachment_upload_url - First observed
create_budget - First observed
create_category - First observed
create_investment_transaction - First observed
create_payee - First observed
create_portfolio - First observed
create_portfolio_cash_transaction - First observed
create_subscription - First observed
create_tag - First observed
create_transaction - First observed
create_transaction_automation - First observed
create_transaction_group - First observed
create_venture_deal - First observed
create_venture_event - First observed
create_venture_platform - First observed
delete_budget - First observed
delete_category - First observed
delete_investment_transaction - First observed
delete_payee - First observed
delete_portfolio - First observed
delete_split - First observed
delete_subscription - First observed
delete_tag - First observed
delete_transaction - First observed
delete_transaction_automation - First observed
delete_transaction_group - First observed
delete_venture_deal - First observed
delete_venture_event - First observed
delete_venture_platform - First observed
detect_subscription_candidates - First observed
dismiss_subscription_candidate - First observed
get_accounts - First observed
get_balance_history - First observed
get_budget_spending_stats - First observed
get_budgets - First observed
get_cash_flow - First observed
get_categories - First observed
get_expenses_for_period - First observed
get_investment_transactions - First observed
get_payee - First observed
get_payees - First observed
get_portfolio_balances - First observed
get_portfolio_holdings - First observed
get_portfolio_summary - First observed
get_portfolios - First observed
get_spending_by_categories - First observed
get_subscription_by_id - First observed
get_subscriptions - First observed
get_subscriptions_summary - First observed
get_tags - First observed
get_transaction_automations - First observed
get_transaction_groups - First observed
get_upcoming_subscription_payments - First observed
get_user_profile - First observed
get_venture_deal - First observed
get_venture_deal_metrics - First observed
get_venture_event - First observed
get_venture_platform - First observed
link_refund - First observed
link_transaction_to_portfolio - First observed
link_transactions_to_subscription - First observed
link_transfer - First observed
list_portfolio_transfers - First observed
list_subscription_candidates - First observed
list_venture_deals - First observed
list_venture_events - First observed
list_venture_platforms - First observed
merge_payees - First observed
preview_transaction_automation - First observed
remove_tags_from_transaction - First observed
remove_transactions_from_budget - First observed
remove_transactions_from_group - First observed
reorder_transaction_automations - First observed
search_securities - First observed
search_transactions - First observed
split_transaction - First observed
toggle_subscription_active - First observed
transfer_account_to_portfolio - First observed
transfer_portfolio_to_account - First observed
unlink_refund - First observed
unlink_transaction_from_portfolio - First observed
unlink_transactions_from_subscription - First observed
unlink_transfer - First observed
update_budget - First observed
update_category - First observed
update_investment_transaction - First observed
update_payee - First observed
update_portfolio - First observed
update_subscription - First observed
update_tag - First observed
update_transaction - First observed
update_transaction_automation - First observed
update_transaction_group - First observed
update_venture_deal - First observed
update_venture_event - First observed
update_venture_platform
Publisher details
- Operator
- Individual
- Operator website
- Not applicable
- Vendor relationship
- Not applicable
- Documentation
- https://docs.moneymatter.app/ · Publisher source
- Trust center
- Not applicable
- Restrictions
- Cloud is under subscription, self-hosted is free · Publisher source
Related MCP Connectors
Track expenses, budgets, balances, transfers, and multi-currency reports with OAuth-secured tools.
Personal finance for AI agents: budgets, receipts, net worth, spend checks. Read-only OAuth.
Personal finance for AI agents: accounts, budgets, goals, 9-strategy debt payoff, reports. OAuth 2.1
Family budget for couples: spending, budget, pace, bills and Monobank-synced entries. OAuth.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables users to read and analyze personal financial data and perform operations such as managing transactions, accounts, categories, budgets, and reminders through the official API.MIT
- AlicenseBqualityAmaintenanceopen-source personal finance app with a first-party MCP server. 91 HTTP tools (OAuth 2.1 + DCR) and 87 stdio tools cover transactions, budgets, accounts, portfolio analytics, FX conversion, loans, subscriptions, goals, importers, and rules. Users self-host with Docker + PostgreSQL or use the managed cloud8925AGPL 3.0
- FlicenseNot gradedqualityDmaintenanceExposes personal-finance tools like accounts, transactions, spending analysis, budgets, bills, reminders, portfolio, and goals via MCP, enabling any MCP client to query financial data.-
- AlicenseBqualityCmaintenanceEnables local-first personal finance management through deterministic tools for importing, categorizing, and analyzing bank transactions.36MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.