Taokeh MCP server
Server Details
Malaysian SME accounting, e-Invoice and payroll — with an MCP server your AI works through. 49 tools: your AI reads the live books (P&L, balance sheet with server-computed period comparison, agings, cash and tax position), drafts every document type including adjusting journals, proposes bank classifications, stages a whole migration (chart of accounts, contacts, products, opening balances, historical documents) and even the workspace setup — and checks its own queue: what it filed, what you approved, what you rejected and why. It can never post: every entry waits for the owner's approval in Taokeh, most of it one tap on the /go page. RM29/month on every plan, included in the 14-day trial. Endpoint: taokeh.my/mcp
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
Glama MCP Gateway
Connect through Glama MCP Gateway for full control over tool access and complete visibility into every call.
Full call logging
Every tool call is logged with complete inputs and outputs, so you can debug issues and audit what your agents are doing.
Tool access control
Enable or disable individual tools per connector, so you decide what your agents can and cannot do.
Managed credentials
Glama handles OAuth flows, token storage, and automatic rotation, so credentials never expire on your clients.
Usage analytics
See which tools your agents call, how often, and when, so you can understand usage patterns and catch anomalies.
Tool Definition Quality
Average 4.6/5 across 49 of 49 tools scored. Lowest: 3.7/5.
Each tool targets a distinct resource and action, with detailed descriptions that clarify any potential overlaps. For example, `business_snapshot` is a subset of `daily_brief`, and `cash_forecast` vs `cash_position` are clearly differentiated by time scope. No two tools serve the same purpose.
Most tools follow a consistent `snake_case` pattern, with clear groupings like `create_*_draft`, `search_*`, `resolve_*`, and `stage_*`. However, a few names break the pattern (e.g., `my_work`, `find_in_taokeh`), and some report tools are just nouns (e.g., `balance_sheet`). Overall, the naming is predictable within functional areas.
With 49 tools, the set is far above the typical well-scoped range of 3-15. While each tool has a defined purpose, the high count makes it cumbersome for an agent to navigate and select the correct one, reducing coherence for everyday use.
The tool set covers virtually all major accounting functions: financial reports, AR/AP, bank operations, sales analysis, inventory, tax, document drafts (invoices, bills, credit notes, etc.), search across ledgers, and migration utilities. No obvious gaps are present for the stated domain.
Available Tools
51 toolsap_agingA/P agingARead-onlyInspect
Whom you owe money and how overdue it is — your accounts-payable aging by supplier.
| Name | Required | Description | Default |
|---|---|---|---|
| asOf | No |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, and the description complements this by explaining the report's structure (grouped by supplier, with aging/overdue information). No contradiction exists, and the description adds behavioral context about what the report presents beyond the safety hints.
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 a single, memorable sentence with an effective em-dash structure. It is front-loaded with a relatable question and wastes no 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?
The tool is simple: one optional parameter, no output schema, and safety annotations provided. The description explains what the report contains (payables aging by supplier). The only gap is the lack of clarification around the 'asOf' parameter, but for a simple report this is a minor omission.
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 description does not mention the only parameter 'asOf' at all. Since schema description coverage is 0%, the description fails to compensate for the lack of parameter explanation. The parameter name and pattern are somewhat self-explanatory, but the description adds no semantic value for how the date affects the aging report.
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 specifies the exact resource ('accounts-payable aging by supplier') and the informational content ('whom you owe money and how overdue it is'). It clearly distinguishes itself from the sibling tool 'ar_aging' by explicitly naming the accounts payable side.
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 provides clear context for when to use the tool: when you need to understand outstanding payables and their overdue status. It does not explicitly name alternatives, but the 'accounts-payable' phrasing versus the sibling 'ar_aging' implies the differentiation, and no exclusions are needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ar_agingA/R agingARead-onlyInspect
Who owes you money and how overdue it is — accounts-receivable aging across ALL customers, bucketed by age. For the unpaid invoices of ONE named customer, use open_invoices.
| Name | Required | Description | Default |
|---|---|---|---|
| asOf | No |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, so the description adds value by explaining the output is bucketed by age and spans all customers. It does not mention return format, but that is not required given the read-only nature and no output schema. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with a clear question and purpose, and includes a direct pointer to an alternative. 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 simple read-only report with one optional parameter and no output schema, the description covers the core purpose and when to use it. However, it omits explaining asOf, which is a minor completeness gap. Overall, it is sufficient for tool selection.
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 0%: the only parameter 'asOf' is not explained in the description. The description never mentions that an optional as-of date can be provided, leaving the agent to infer its meaning from the name and pattern. This is a notable gap.
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 the tool generates an accounts-receivable aging report across ALL customers, bucketed by age. It uses a specific verb and resource ('accounts-receivable aging') and distinguishes itself from the sibling tool open_invoices, which targets a single customer.
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 provides an alternative: 'For the unpaid invoices of ONE named customer, use open_invoices,' guiding when to use this tool vs. another. It also implies the scope is all customers, making the usage context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
balance_sheetBalance sheetARead-onlyInspect
Your balance sheet as of a date: assets, liabilities and equity, with the balanced check. COMPARISON (optional): a balance sheet is a POSITION AT A DATE, not a period — so unlike income_statement its comparison is ONE DATE against ANOTHER DATE, never two ranges. Set compare to 'previous_month_end', 'previous_year_end' or 'same_date_last_year', OR give an explicit earlier date as compareAsOf. You get both positions in full plus, per account line and per total, deltaCents and deltaPct computed server-side in integer cents — the movement in that balance BETWEEN the two dates. deltaPct is NULL whenever the earlier balance is zero (a percentage change from zero is undefined — say "no comparable base", never ∞% or 100%), and percentages are measured against the ABSOLUTE earlier balance. points gives both dates, how many days apart they are, and whether either is today or later (still open, so the balances can move); notes states the basis in plain words, including a warning if either sheet does not balance. Never describe the gap between the two dates as a 'period' figure: these are two positions, and the delta is the movement between them.
| Name | Required | Description | Default |
|---|---|---|---|
| asOf | No | ||
| compare | No | Named comparison POINT (a single earlier date, not a range). Omit for no comparison. | |
| compareAsOf | No | An explicit earlier date to compare the position against (overrides `compare`). |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint: true, openWorldHint: false) confirm this is a safe read operation. The description adds significant behavioral detail beyond annotations: server-side computation in integer cents, NULL handling for deltaPct when earlier balance is zero, and warning if either sheet does not balance. It loses one point for not explicitly stating that no data is mutated or destroyed, but annotations already cover this.
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 comprehensive but slightly long (10 sentences). It front-loads key information (purpose, date-position contrast) but later sentences could be tighter. Every sentence adds value, but minor streamlining would improve 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?
Given the tool's complexity (three parameters, no output schema), the description is fully complete. It explains the output structure (deltaCents, deltaPct, points, notes), edge cases (NULL deltaPct, unbalanced sheets), and comparative semantics. The output schema is absent, but the description thoroughly documents return values, leaving no significant 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 67% (two of three parameters have descriptions: compare enum and compareAsOf, but asOf lacks a description in schema). The description compensates fully by explaining how compare and compareAsOf work together, including the meaning of comparison names (previous_month_end, previous_year_end, same_date_last_year), the override behavior, and the semantic nuance that comparison is between two dates, not two ranges.
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 specific language ('Your balance sheet as of a date: assets, liabilities and equity, with the balanced check') to clearly state the verb (retrieve/compute) and resource (balance sheet). It distinguishes from siblings like income_statement by emphasizing the position-at-a-date nature, differentiating from period-based reports.
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 explicitly tells when to use this tool vs. alternatives, contrasting with income_statement and warning not to describe the gap as a 'period' figure. It provides clear instructions on how to use comparison parameters, including named options and an explicit date override, with detailed explanations of behavior like delta calculations and NULL deltaPct conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bank_reconciliation_statusBank reconciliation statusARead-onlyInspect
Where each bank account stands on reconciliation: the GL cash balance against the latest statement's closing balance (with the difference, or an honest "unknown" when a statement carries no balance figure), the row counts by status (SUGGESTED / UNCATEGORIZED / CONFIRMED / POSTED / IGNORED), the unreviewed backlog, and — per recent statement — the opening/closing balances, the arithmetic tie-out result and its status counts. These are the SAME figures the in-app Bank Reconciliation page shows. READ-ONLY: categorizing, confirming and posting rows are human actions in Taokeh.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses the exact semantics of the output: how the GL balance compares to statement closing, the honest 'unknown' when no balance figure exists, the exact status codes, the unreviewed backlog, and the per-statement tie-out arithmetic. It also states the data matches the in-app page, giving the agent a reliable expectation of return content. This goes far beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured. It leads with the core purpose, then enumerates the specific data points, and closes with an important read-only caveat. Every sentence contributes meaningful information without redundancy. It is concise enough for the complexity it conveys.
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 tool has no input parameters and no output schema, so the description must carry the full weight of explaining what the tool returns. It does so comprehensively: it defines the comparison, lists all statuses, mentions edge cases (unknown), and describes per-statement details. For a read-only status tool, this is essentially 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 input schema has zero parameters, so the baseline for this dimension is 4. The description adds context about what the tool returns rather than parameter semantics, but since there are no parameters to describe, it correctly focuses on output. No additional parameter explanation is needed.
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 clear statement of what the tool reports: where each bank account stands on reconciliation, comparing GL cash balance to the latest statement closing balance. It then enumerates specific data elements (status row counts, unreviewed backlog, per-statement tie-out). This clearly differentiates it from siblings like bank_review_queue or cash_position by focusing exclusively on reconciliation status.
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 to use the tool: when the user wants the bank reconciliation status figures shown in the in-app Bank Reconciliation page. It also explicitly excludes mutation by stating that categorizing, confirming, and posting are human actions in Taokeh, signaling this is a read-only reporting tool. It does not name alternative tools explicitly, but the context and scope are sufficiently clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bank_review_queueBank review queueARead-onlyInspect
The unposted bank-statement rows still waiting for review — for one statement, or the latest imported statement if you don't name one. Each row carries Taokeh's LIVE suggested category + contact, a confidence score (0–1) and a plain-language reason, computed the SAME way the in-app Banking → Review screen computes them. Sorted lowest-confidence first (the ones that need a human eye), capped at 200 with an honest truncation note, plus per-confidence bucket counts so you can say e.g. "46 are mechanical, 13 need eyes". What you CAN do with a row: review it, explain it, and PROPOSE a category with draft_bank_classification — your suggestion is written to the row as an "AI suggestion" the owner sees on Banking → Review. What you can NEVER do: CONFIRM or POST a row. Accepting a category and posting each line is always a human click in Taokeh; hand the owner the review link. (Since 2026-08-19 the owner can also accept Taokeh's confident suggestions, and post confirmed lines, from the /go command bar's approval deck — still one human tap either way. YOUR OWN proposals are accepted only on Banking → Review, where your reasons are shown.)
| Name | Required | Description | Default |
|---|---|---|---|
| statementId | No |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the readOnlyHint annotation: rows are sorted lowest-confidence first, capped at 200 with a truncation note, and per-confidence bucket counts are provided. It explicitly states that confirming or posting rows is never done by this tool, aligning perfectly with the annotation. This extra detail is valuable for the agent to understand the tool's exact capabilities and limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the core purpose, but it is quite lengthy, including multiple clauses and historical context that could be condensed. While every sentence adds value, the overall verbosity reduces conciseness; a more streamlined version would be optimal.
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 complexity (review queue with constraints, sorting, truncation, bucket counts) and the absence of an output schema, the description thoroughly explains what the tool returns (rows with live suggestions, confidence scores, reasons) and how the results are structured. It also covers permitted post-return actions (review, explain, propose), making it complete for agent 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 (statementId) has 0% schema description coverage, but the tool description fully compensates by explaining that it is optional and defaults to the latest imported statement. This provides complete semantic meaning beyond the raw 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 clearly states the tool's purpose: returning unposted bank-statement rows awaiting review, either for a specified statement or the latest imported one. It specifies the content (suggested category, contact, confidence score, reason) and distinguishes from siblings by focusing on the review queue rather than actions like classification or confirmation.
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 provides explicit guidance on when to use the tool (for unposted rows requiring review) and what actions are permitted (review, explain, propose a category) versus prohibited (confirm, post). It also mentions the alternative of the owner using the /go command bar. However, it does not directly name sibling tools for comparison; the guidance is implicit through the detailed prohibitions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
business_snapshotBusiness snapshotARead-onlyInspect
A one-glance health check of your business: today's and this-month's sales and expenses, so far. Sales and expenses ONLY — if you want the fuller morning read (cash position, who owes you, pending approvals, tax position, low stock) call daily_brief instead; it includes everything here.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered. The description adds scope context ('Sales and expenses ONLY', 'so far') which clarifies what data is returned without contradicting the read-only nature. It doesn't exhaustively describe edge cases but does enough for a simple read 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 two sentences with no wasted words. It front-loads the core purpose and then delivers a clear alternative, making every sentence earn 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 zero-parameter tool with no output schema, the description fully explains what the tool returns and how it relates to sibling tools. There is no missing context for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4 per rubric. The description compensates by explaining exactly what data is included (today's and this-month's sales and expenses), which adds meaning beyond the empty 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 clearly states it provides a one-glance health check of today's and this-month's sales and expenses, which is a specific verb+resource. It also explicitly differentiates from the daily_brief sibling tool by limiting scope to sales and expenses only.
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 explicitly names the alternative tool (daily_brief) for a fuller morning read and states that it includes everything this tool provides, effectively giving when-to-use and when-not-to-use guidance. This is exemplary usage differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cash_forecastCash-flow forecastAInspect
A forward 8-week cash-flow forecast — honest arithmetic from your books, not a model. Opening position is your LIQUID balances right now (cash + bank accounts + gateway clearing); money the owner has advanced to the business is a liability, not cash, so it is excluded — the assumptions list says so. Inflows are your OPEN customer invoices scheduled at their due dates; already-overdue receivables are NOT assumed collected — they are reported separately as overdueArCents (upside, stated honestly). If a sales channel is connected and reports money earned but not yet paid out (TikTok Shop's unsettled orders), that pool comes back SEPARATELY as channelUnsettled (amount, count, currency, and the date it should land, 14 days out — the late end of the channel's own settlement window). It is the channel's own ESTIMATE, so it is deliberately NOT counted into any week, any closing balance or the dip: a warning about cash running low must never be weakened by money that is not in the books. Treat it as stated upside, exactly like overdueArCents. If no channel is connected, the channel add-on has lapsed, or its API cannot be reached, the field is absent and the forecast is unchanged. Outflows are your open supplier bills (at bill date — Taokeh does not store supplier terms yet), payroll (estimated from your last finalized run: net pay + employer EPF/SOCSO/EIS on payday), PCB/EPF/SOCSO/EIS remittances (15th of the following month), loan installments (estimated from the last recorded installment), and SST payable at its return due date if you're SST-registered. Returns week-by-week inflows/outflows/closing balance, the dip (the lowest projected closing — when and how deep cash runs lowest), and an assumptions list spelling out every estimate. All amounts are integer CENTS (RM = cents ÷ 100).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the sparse annotations, disclosing that values are estimates, what happens when channel data is unavailable or the API fails, that estimates are deliberately not counted in the dip, and that amounts are integer cents. It also explains the 'assumptions' list and the treatment of owner advances as liabilities, making the tool's behavior highly 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 long and dense, but nearly every sentence adds necessary domain context: treatment of overdue amounts, channel unsettled pools, payroll components, remittance timing, and units. It is front-loaded with the core purpose and then expands into behavioral specifics. It could be tighter with bulleted structure, but the verbosity is justified by the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without an output schema, the description fully covers return values (week-by-week inflows/outflows/closing balance, dip, assumptions list), units, data sources, and edge cases such as disconnected or lapsed channel access. It is complete enough for an agent to invoke the tool and interpret results 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?
The input schema is empty, so the baseline for parameter semantics is 4. There are no parameters to document; the description instead explains the forecast's inputs implicitly from the books. No additional parameter-level detail is needed beyond what the empty schema already conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies this as an 8-week cash-flow forecast built from bookkeeping data, with a specific scope: opening liquid balances, scheduled inflows, and known/estimated outflows. It also distinguishes itself from related reporting tools by emphasizing it is 'not a model' and by explaining what is deliberately excluded or reported separately.
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 context for when to rely on this forecast: it states what is included, what is excluded (owner advances, overdue receivables, unsettled channel money), and how to treat those exclusions as stated upside. It does not explicitly name alternative sibling tools or say 'use this when you need X, not Y', but the inclusion/exclusion logic effectively guides selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cash_positionCash positionARead-onlyInspect
How much cash you have right now: every bank account and cash pocket with its current GL balance, plus a grand total. total is LIQUID money only — physical cash + bank accounts + the payment-gateway clearing float — and accounts lists exactly those accounts. Money the OWNER has advanced to the business (the Shareholder Loan) is returned SEPARATELY as ownerFunding: it is a LIABILITY the business owes back, not cash it holds, so it is never inside total and must never be added to it or described as cash. Balances are MYR-booked (the books are kept in ringgit); a foreign bank account shows its currency label for context, but the balance figure is still the MYR-booked GL balance.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses the exact composition of the returned data, the separate treatment of the Shareholder Loan as a liability, and the MYR-booked balance convention. This is rich behavioral context that prevents misinterpretation of the output.
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 longer than minimal but every sentence adds essential accounting context. It is front-loaded with the main query and then elaborates on inclusions/exclusions and currency treatment. While not as brief as a two-sentence description, it remains efficient and 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?
Without an output schema, the description carries full responsibility for explaining the return value. It thoroughly describes the 'accounts' list, the 'total' composition, the separate 'ownerFunding' field, and currency handling, making the tool's behavior fully understandable.
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 has zero parameters, so the schema coverage is trivially 100%. The baseline for 0 params is 4, and the description appropriately focuses on output semantics rather than parameter details, which are absent.
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 the tool's purpose: answering 'How much cash you have right now' with a breakdown of bank accounts and cash pockets. It distinguishes itself from siblings by focusing on current liquid cash and explicitly separating owner funding, which is a liability, from the cash total.
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 provides clear context for when to use the tool (when you need current cash position) and includes a crucial warning about never adding ownerFunding to total. However, it does not explicitly mention alternative tools for related queries, such as cash_forecast for future projections, leaving some inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
channel_summarySales-channel summaryARead-onlyInspect
Your sales broken down by CHANNEL (Shopee, TikTok, Shopify, your storefront, …) for a date range. Per channel: the order count, gross goods revenue, seller discounts (e.g. Shopee vouchers), shipping income (buyer-paid shipping), freight-out (what shipping cost you), marketplace fees, and netProceeds — the settlement booked on each sale's own entry: for credit marketplaces (Shopee/TikTok) that is the net A/R payout the channel owes you; for the storefront it is what settled into cash / the gateway clearing account at sale time. RETURNS: returns is the revenue reversed by that channel's credit notes (returns/refunds) in the range — the Sales Returns & Allowances booked on them; netGoodsRevenue = grossGoodsRevenue − returns. The other six figures (grossGoodsRevenue, discounts, shipping, freight, marketplaceFees, netProceeds) are GROSS of returns — they come from the INVOICE side only — so a channel with heavy returns no longer looks inflated. A row appears for every channel with sales OR returns in the range — returns lag sales, so a channel whose only in-range activity is returns still shows (saleCount 0, gross figures 0, its returns, and a negative netGoodsRevenue). (A Shopee-wallet FEE credit note books marketplace fees, not a goods return, so it adds 0 to returns.) A marketplace SETTLEMENT CORRECTION — the payout came in short because the buyer returned or cancelled after the invoice was already booked — is also a credit note approved by the owner against the original invoice, and the invoice side stays as it was booked. Only the GOODS portion of such a correction shows in returns: its fee and shipping components are reclassed to marketplace fees / freight on the credit note's OWN entry, while the per-channel marketplaceFees and freight figures here are read from the INVOICE side only — so a fee-only correction (the common, batched kind) moves neither returns nor marketplaceFees and is not visible in this tool's output at all. Marketplace invoices are therefore not final at import: a channel's figures for a past range can still move as corrections are approved. NOTE: marketplaceFees covers marketplace commission/service fees booked on the sale's own entry; storefront GATEWAY processing fees are booked on separate payout entries and are NOT included per-channel here (so storefront netProceeds is gross of gateway fees). Likewise TIKTOK fees: TikTok reports no per-order fee at import, so its fees (and the freight split out of its settlement) are booked LATER on a separate settlement entry by "Book settlement fees" — that entry is not on the sale, so TikTok's marketplaceFees and freight read 0 here even when the fees are fully booked. Read those from the income statement or the journal (reference TIKTOK-FEE-), not from this tool. Manual / non-channel sales are excluded. Give from and to as YYYY-MM-DD.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| from | Yes |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is exceptionally transparent about behavioral nuances: how returns are handled, how fees are treated differently per channel, and edge cases like credit notes and settlement corrections. This goes beyond typical descriptions and aligns with the readOnlyHint.
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 extremely verbose and repetitive, repeating the same explanations multiple times (e.g., return handling, fee treatment). It lacks clear structure and would benefit from significant trimming to improve readability.
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 covers a wide range of edge cases (returns, fees, corrections, exclusions) and provides guidance on alternative data sources. While it doesn't describe the output structure, it adequately explains the meaning of each metric, making it fairly complete for the tool's complexity.
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 provides only date patterns, but the description adds the required format (YYYY-MM-DD) and implies a date range. It doesn't specify inclusivity, but that's a minor gap. Overall, it compensates well for the lack of schema 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 clearly states that the tool provides sales broken down by channel over a date range, listing specific metrics. It distinguishes from sibling tools by explicitly mentioning channel-based breakdown and exclusions of manual/non-channel sales.
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 instructs to provide dates in YYYY-MM-DD format and clarifies exclusions (manual/non-channel sales) and where to find missing data (e.g., for TikTok fees). While it doesn't explicitly state when to use it versus alternatives, the context of sibling tools makes the intended use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
counter_dayCounter dayARead-onlyInspect
The Counter (Kaunter) till's day, for one date (default today, Malaysia time). Returns: the receipt count and voided count, the cash and DuitNow QR totals, the 5-sen cash-rounding total, whether the day is still OPEN or has been CLOSED into the books, the receipt-number range with any voided numbers listed, and separately the sales BILLED ON CREDIT at the till. IMPORTANT — a counter day is NOT in the ledger until it is closed: while status is 'open' these figures are the till's own receipts and NOTHING has posted, so they will not appear in sales_summary, cash_position or income_statement yet, and stock/COGS have not moved either (they move once, at close). Once status is 'closed', saleId names the ONE consolidated cash sale the whole day posted as, and the figures do reconcile to the books. THE ONE EXCEPTION, and it runs the other way: creditSales are the till's "Invoice it" sales, and they POST IMMEDIATELY as ordinary credit invoices (Dr accounts receivable to a named customer, stock moved at the moment of sale). So unlike the drawer takings they ARE already in sales_summary, income_statement, open_invoices and ar_aging even while the day is open — and they are NOT in cashTotal, qrTotal or the close, because no money changed hands. Never add creditSales.total to the cash and QR totals: the drawer holds cash + QR only, and it ties to the sen. cashTotal is the sum of ROUNDED cash receipt totals (what the drawer holds); qrTotal is never rounded — Malaysia's 5-sen rounding applies to cash only. Receipts of RM10,000 or more cannot join a consolidated e-invoice, so each posts as its own sale: consolidatedCount/consolidatedTotal cover only the receipts that joined the day sale, individualCount/individualTotal the rest, and awaitingBuyerCount is how many of those still have no buyer particulars captured. Counter is a paid add-on (RM49/mo); a workspace without it gets status 'not_available'.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | The business date, YYYY-MM-DD in Malaysia time. Omit for today. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses detailed behaviors: open vs closed day semantics, when posting happens, rounding rules for cash vs QR, consolidated e-invoice thresholds, and the not_available status for workspaces without the paid add-on. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured with clear lead-in, important caveats, and section-like headings (Returns, IMPORTANT, THE ONE EXCEPTION). Some redundancy exists (e.g., Malaysia time, rounding noted twice), but the length is justified by the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 all return values and edge cases. It covers receipt/void counts, cash/QR totals, rounding, open/closed status, receipt range, credit sales, consolidated vs individual counts, awaiting buyer count, and accounting interactions. This is complete for tool selection and 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 optional 'date' parameter is fully described in the schema (format YYYY-MM-DD, omit for today). The description repeats 'default today, Malaysia time' but adds no new meaning. With 100% schema coverage, the baseline of 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 clearly states what the tool does: it returns details of a counter day (receipt count, voided count, cash/QR totals, rounding, status, receipt range, credit sales). It distinguishes this from sibling financial reports by explaining how counter day figures relate to the ledger and other 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?
The description gives explicit when-to-use and when-not-to-use guidance: while status is 'open', figures are not in the ledger and will not appear in sales_summary, cash_position, or income_statement; credit sales post immediately and appear in those reports. It also warns 'Never add creditSales.total to the cash and QR totals' and notes the paid add-on condition for 'not_available'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_bill_draftFile bill draftAInspect
File a supplier-bill DRAFT into Taokeh from a bill you've read. INVENTORY-ONLY — every line must be a product you stock; for services / non-stock / mixed bills use the manual bill form, or create_expense_draft if already paid. This does NOT post to the books — it creates a pending draft the user reviews and approves in Taokeh; only then does it post (receive stock, blend moving-average cost, book input SST as a non-recoverable cost). Shape the fields with intake_contract(doc_type:'bill') + resolve_vendor + resolve_product first. The server re-computes every line quantity from the tally and the grand total — so present your working, but the server's figures are authoritative. Set needsReview and add a SHORT reviewer note in notes (one or two sentences naming what to double-check — not lengthy reasoning) for any doubt. If you have the ORIGINAL bill image/PDF, attach it — it rides the draft and lands on the posted bill automatically on approval, so the user never has to re-upload it. Small files: attachmentBase64 + attachmentMediaType inline. Anything bigger: request_attachment_upload → PUT the bytes → pass the returned attachmentToken.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | ||
| notes | No | A SHORT reviewer note: one or two plain sentences, written in the reviewer's language, flagging what the human should double-check before approving — a smudged or ambiguous total, a vendor/customer you weren't sure of, a judgment call you made. The reviewer reads this on a small approval card, so keep it brief and human. This is NOT a place to dump lengthy reasoning, your working, or boilerplate — just the one thing to check. Leave it empty when there is nothing to flag. | |
| vendor | No | ||
| vendorId | No | ||
| reference | No | ||
| needsReview | No | ||
| printedTotal | No | ||
| purchaseDate | Yes | ||
| paymentMethod | Yes | ||
| attachmentToken | No | The token from request_attachment_upload, AFTER you have PUT the file bytes to its uploadUrl. Use this instead of attachmentBase64 for any real photo/PDF — it carries the file out-of-band (no base64 in this call). Mutually exclusive with attachmentBase64. The uploaded file rides the draft and lands on the posted bill on approval, exactly as an inline one does. | |
| attachmentBase64 | No | The ORIGINAL bill as base64 — SMALL files only (a few KB). For a real photo or multi-page PDF use request_attachment_upload instead (attachmentToken). Rides the draft and lands on the posted bill on approval — no re-upload. A bad type/oversize file is rejected and NOTHING is filed. | |
| confirmNewVendor | No | Set to true ONLY after the user has EXPLICITLY confirmed this vendor is genuinely new. It skips the near-miss guard (which rejects a name that looks like shorthand for an existing vendor). Never set it to push a near-miss through — ask the user first. | |
| attachmentFilename | No | Optional original filename for the attachment, e.g. bill.pdf. | |
| attachmentMediaType | No | The attachment's MIME type, e.g. 'image/jpeg' or 'application/pdf'. Required when attachmentBase64 is given. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses critical behavioral traits beyond the annotations: it does not post to books initially, later posts with stock receipt and cost blending, server recomputes quantities/totals authoritatively, attachment rides through to the posted bill, and large files use out-of-band upload. With annotations all false, this full burden 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?
The description is long but every sentence earns its place: it front-loads the core purpose, then constraints, workflow, behavioral caveats, and attachment handling. It is structured logically and avoids redundant fluff, making it dense but efficient.
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 complexity (14 params, no output schema, low schema coverage), the description covers the full context: when to use, prerequisites, the draft-vs-post flow, server authority, attachment lifecycle, and file-size handling. It leaves no major gaps for 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 only 43%, so the description compensates by explaining the meaning of needsReview (set for doubts), notes (short reviewer note, not a dump), attachment methods (inline vs token, size limits), and the working field (present your work). It does not cover all line subfields, but it clarifies the most important semantic 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?
The description clearly states the verb 'File' and resource 'supplier-bill DRAFT into Taokeh', and explicitly distinguishes from siblings by limiting to inventory-only bills and pointing to create_expense_draft for already-paid services. This leaves no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use and when-not-to-use guidance: only for inventory bills, for services/non-stock use the manual form or create_expense_draft. It also names prerequisite tools (intake_contract, resolve_vendor, resolve_product) and explains the workflow for handling doubtful cases via needsReview and notes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_contact_draftFile contact draft from a name cardAInspect
File a pending CONTACT draft from a business card YOU have read. Read the card image yourself and pass the fields — personName (required), company, role, phones, emails, address — AND the card image itself, which is REQUIRED: the owner checks your fields against the picture before approving, so a draft without the image cannot be verified and is refused. This does NOT add anyone to the address book: it creates a draft the owner reviews and approves in Taokeh, and only that tap files the contact person (under the company, matched to an existing customer/vendor or created as a new one) with the card image kept on the record. BE HONEST about what you could not read: leave a field EMPTY and say so in notes — never guess a phone digit, an email spelling or a company name. If the photo is blurry, is not a business card, or lists two people, say that in notes and set needsReview. Attach the image with attachmentBase64 + attachmentMediaType (a card photo is usually small enough to inline), or for a large photo or a PDF use request_attachment_upload → PUT the bytes → pass the returned attachmentToken (never both). Say which side of the book it is with partyKind ('customer' for someone you sell to, 'vendor' for someone you buy from) — default customer — and pass partyName if the user tells you the company is really an existing one under a different spelling. Report the fields back to the user in chat so they can spot a misread before they tap.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | The person's job title / role as printed, e.g. 'Sales Manager'. | |
| notes | No | A SHORT reviewer note: one or two plain sentences, written in the reviewer's language, flagging what the human should double-check against the image before approving — a phone number you could not read cleanly, two people on one card, uncertainty about which line is the company. The reviewer reads this on a small approval card, so keep it brief and human. Leave it empty when there is nothing to flag. | |
| emails | No | The email addresses printed on the card (up to 3). Never guess a spelling; leave it out and flag it in notes instead. | |
| phones | No | The phone numbers printed on the card, as printed (up to 3). Leave out any digit-group you cannot read cleanly and say so in notes — a half-guessed phone number is worse than none. | |
| address | No | The address printed on the card, as one string. | |
| company | No | The company name printed on the card. Leave it out if the card does not show one. | |
| partyKind | No | Which side of the book the card belongs to: 'customer' (someone you sell to) or 'vendor' (someone you buy from). Defaults to customer. | |
| partyName | No | The company to file the contact under, when the user tells you it differs from what is printed on the card (e.g. the card shows a brand but the books use the registered name). Omit to use the company printed on the card — the reviewer can still change it before approving. | |
| personName | Yes | REQUIRED — the person's name exactly as printed on the card. If the name is genuinely illegible, do NOT guess and do NOT file: tell the user the card is unreadable. | |
| needsReview | No | Set true when something about the card gave you pause — a blurry photo, two people on one card, a field you could not read. It flags the draft for the reviewer. | |
| attachmentToken | No | The token from request_attachment_upload, AFTER you have PUT the image bytes to its uploadUrl. Use this instead of attachmentBase64 for a large photo or a PDF — it carries the file out-of-band (no base64 in this call). Mutually exclusive with attachmentBase64. The card lands on the created contact on approval, exactly as an inline one does. | |
| attachmentBase64 | No | The business-card IMAGE as base64 — REQUIRED (unless you pass attachmentToken). A card photo is normally small enough to inline. A bad type/oversize file is rejected and NOTHING is filed. | |
| attachmentFilename | No | Optional original filename for the card image, e.g. card.jpg. | |
| attachmentMediaType | No | The card image's MIME type, e.g. 'image/jpeg' or 'image/png'. Required when attachmentBase64 is given. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false and provide little context, so the description must cover behavioral traits. It discloses side effects (creates a reviewable draft, not an address book entry), the mandatory image requirement and refusal without it, failure behavior on bad files ('NOTHING is filed'), and honesty expectations about unreadable fields. This far exceeds what the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence carries operational weight for a complex 14-parameter tool. It is front-loaded with the core purpose and then details workflow. However, it's a single dense paragraph; better structuring with bullets or sections would improve scannability, so it loses one point.
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 complex tool with no output schema and sparse annotations, the description covers the full workflow: reading the card, attachment options, approval flow, edge cases, and reporting back. The only notable gap is that it never describes the response/return value of a successful call, which would be useful given the lack of 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 coverage is 100%, but the description adds substantial usage meaning: it explains the required image field (though not marked required in schema), mutual exclusivity of attachmentBase64 vs attachmentToken, default partyKind, and how notes should be written. This goes well beyond the baseline schema 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 opens with a specific verb+resource: 'File a pending CONTACT draft from a business card YOU have read.' It also clarifies that the tool does not add anyone to the address book but creates a draft for owner approval, which clearly distinguishes it from sibling create_*_draft 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?
The description explicitly states when to use the tool (after reading a card image) and provides usage alternatives for attachments (inline base64 vs request_attachment_upload), including 'never both.' It also gives practical guidance for blurry images, illegible fields, and two-person cards. It doesn't explicitly contrast with other create_*_draft siblings, but the tool name and focus make that clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_credit_note_draftFile credit-note draftAInspect
File a CREDIT NOTE draft into Taokeh — a sales return, short delivery, price correction or allowance that reduces what a customer owes. This does NOT post to the books: it creates a pending draft the user reviews and approves in Taokeh, and only then does it reduce the customer's balance, reverse the revenue and SST, and (if the user says the goods came back) put stock back. Shape the fields with intake_contract(doc_type:'credit_note') first. RESOLVE THE ORIGINAL INVOICE FIRST: a credit note is issued AGAINST an invoice — find it with search_documents and pass its id as originalDocId with kind:'against_invoice'. Only a credit with NO source invoice is kind:'allowance', and an allowance is never linked to an invoice, never capped by one, inherits no SST codes and never restocks — so do not file a real return as one; ask the user which invoice it is against. Send all amounts POSITIVE (Taokeh stores the credit note negative itself). A line can only credit back as MANY units as that invoice actually sold, net of earlier credit notes — an over-quantity line is refused naming what is left, so read the invoice's own unit of measure rather than converting it (1 carton is not 100 pieces). Whether goods physically came back into stock is the USER's decision at approval — goodsReturned is only a hint that pre-ticks their checkbox on the full review page, and a one-tap approval always posts money-only. Set needsReview and add a SHORT reviewer note in notes (one or two sentences naming what to double-check) for any doubt. Filed it wrong? Use revise_draft (kind: 'credit_note') rather than filing a second one.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | REQUIRED. 'against_invoice' = a return / short delivery / price correction on a SPECIFIC invoice (the usual case — give originalDocId or originalDocNumber). 'allowance' = a standalone money credit with NO source invoice (give the customer instead). They are different documents; when it isn't clear, ask the user which invoice it is against. | |
| lines | Yes | ||
| notes | No | A SHORT reviewer note: one or two plain sentences, in the reviewer's language, naming what the human should double-check before approving — whether the goods actually came back, an ambiguous quantity, which invoice you matched it to. Not lengthy reasoning. | |
| cnDate | Yes | ||
| reason | No | Why the credit is given — 'damaged goods returned', 'short delivery', 'agreed price adjustment'. It prints on the credit note. | |
| customer | No | allowance ONLY: the customer name, resolved with resolve_customer first. A credit note reduces an EXISTING customer's balance and can never create a customer. For an against_invoice credit note the customer comes from the invoice — leave this out. | |
| reference | No | The credit-note number already printed on paper, if any. Leave it out and Taokeh numbers it (CN…). | |
| customerId | No | allowance: the resolved customer id instead of the name. | |
| needsReview | No | ||
| printedTotal | No | The total printed on the paper, if any. Cross-check only — the server computes the real total and flags a mismatch on the approval screen. | |
| goodsReturned | No | An ADVISORY hint only: it pre-ticks the reviewer's 'the goods came back into stock' checkbox. It does NOT decide the stock movement — the human does, at approval. Ignored for an allowance (always money-only). | |
| originalDocId | No | against_invoice: the ORIGINAL invoice's id, from search_documents. The server verifies it exists, is an INVOICE and whose it is — it never guesses. | |
| originalDocNumber | No | against_invoice: the printed invoice number, when you have no id. Refused if more than one document carries it — find the right one with search_documents. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give generic hints (readOnlyHint=false, etc.). The description adds essential behavioral detail: it creates a pending draft, not a posting; balance/revenue/SST reduction happens only after user approval; stock return is the user's decision; goodsReturned is only a hint. It also explains that positive amounts are required and that over-quantity lines are refused, which goes far beyond structured fields.
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?
Though long, every sentence adds value. Key warnings are capitalized and front-loaded. The description is structured logically: purpose, workflow, key constraints, and error handling. It is dense but not redundant, and it avoids restating what the schema already shows.
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 complex tool with 13 parameters and no output schema, the description covers the full lifecycle: how to prepare via intake_contract, how to find the original invoice, what happens at approval, how to handle errors, and when to use alternatives. It leaves no critical gap for an agent to make a major mistake.
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 77%, but description expands meaning substantially: the distinction between kind values, the flow for resolving originalDocId, the 'no negative amounts' rule, the quantity cap relative to invoice sold units, and the advisory nature of goodsReturned. These clarifications are not in the schema and are critical for correct invocation.
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 ('File') and resource ('CREDIT NOTE draft') and immediately clarifies the business purpose ('sales return, short delivery, price correction or allowance'). It distinguishes this draft from other document types by explaining what it does NOT do (does not post to the books) and by referencing sibling tools like revise_draft.
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 explicit when-to-use guidance: 'RESOLVE THE ORIGINAL INVOICE FIRST' and tell users to find it with search_documents. It contrasts 'against_invoice' vs 'allowance' usage, warns against filing a real return as an allowance, and mentions using revise_draft (kind: 'credit_note') for corrections. This is strong alternative/context guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_debit_note_draftFile debit-note draftAInspect
File a SELL-SIDE DEBIT NOTE draft into Taokeh — an ADDITIONAL CHARGE on an invoice this business already issued (an undercharge, a price revised upward after delivery, a surcharge that was missed). This does NOT post to the books: it creates a pending draft the user reviews and approves in Taokeh, and only then does it increase what the customer owes and the output SST. Shape the fields with intake_contract(doc_type:'sales_debit_note') first. THE ORIGINAL INVOICE IS REQUIRED: find it with search_documents and pass its id as originalDocId. There is no allowance or standalone shape here — unlike a credit note, a debit note with no invoice behind it is not a document; if there is nothing to correct upward, the right document is a NEW INVOICE (create_invoice_draft), so say that rather than filing this. CHARGE THE SHORTFALL, NOT THE NEW PRICE: unitAmount is the amount being ADDED per unit, and quantity defaults to 1 because an additional charge is usually one line of money. Every line must name a product that actually appears on that invoice; anything else is refused. MONEY ONLY, ALWAYS — a debit note moves no stock, touches no COGS, and has no restock option anywhere in Taokeh (there is no goodsReturned field on this tool and no checkbox on its review screen), so a one-tap approval is money-only by construction and not by fence. If EXTRA GOODS were delivered, raise a new invoice instead. There is NO cap on the charge, so the approver is shown the original invoice's own total beside yours — keep the figure defensible. Set needsReview and add a SHORT reviewer note in notes (one or two sentences naming what to double-check) for any doubt. Filed it wrong? Use revise_draft (kind: 'sales_debit_note') rather than filing a second one. This is the SELL side; Taokeh's /debit-notes page is the separate BUY side (a purchase return against a supplier bill), which has no AI draft lane.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | ||
| notes | No | A SHORT reviewer note: one or two plain sentences, in the reviewer's language, naming what the human should double-check before approving — which invoice you matched it to, where the figure came from. Not lengthy reasoning. | |
| dnDate | Yes | ||
| reason | No | Why more is charged — 'price revised upward after delivery', 'surcharge missed'. It prints on the note. | |
| customer | No | OPTIONAL CROSS-CHECK: the customer you believe the invoice belongs to. The customer comes FROM the invoice; sending a name that does not match is refused, which is exactly what it is for. | |
| reference | No | The debit-note number already printed on paper, if any. Leave it out and Taokeh numbers it (DN…). | |
| customerId | No | The resolved customer id, as the same cross-check. | |
| needsReview | No | ||
| printedTotal | No | The total printed on the paper, if any. Cross-check only — the server computes the real total and flags a mismatch on the approval screen. | |
| originalDocId | No | REQUIRED (this or originalDocNumber): the ORIGINAL invoice's id, from search_documents. The server verifies it exists, is an INVOICE and whose it is — it never guesses, and it will not file a debit note without one. | |
| originalDocNumber | No | The printed invoice number, when you have no id. Refused if more than one document carries it — find the right one with search_documents. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Given the annotations are all false/neutral, the description carries the full burden. It discloses key behaviors: creates a pending draft, not posted to books; requires an original invoice; money-only with no stock/COGS effects; no cap on charge; server validation; and why the review screen shows the original total.
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 long but highly structured and information-dense. Each sentence serves a purpose, clarifying complex domain rules. Slightly verbose, but appropriate for the complexity of the financial document.
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 covers the tool's purpose, prerequisites, limitations, review workflow, and parameter nuances comprehensively. However, it does not describe the return value/output, which would be helpful since there is no output schema. Otherwise, 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 high (73%), but the description adds crucial semantics beyond the schema, such as unitAmount being the 'additional' amount not the new price, quantity defaulting to 1, and originalDocId requirements. This enhances the parameter understanding beyond the schema alone.
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 the tool's purpose: filing a SELL-SIDE DEBIT NOTE draft, an additional charge on an existing invoice. It explicitly contrasts this with credit notes, new invoices, and buy-side debit notes, making it easily distinguishable from 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?
It provides explicit when-to-use and when-not-to-use guidance, including alternatives like create_invoice_draft for extra goods or new invoices, revise_draft for corrections, and clarifies the sell-side vs buy-side distinction. This is exemplary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_expense_draftFile expense draftAInspect
File a paid-expense DRAFT into Taokeh from a receipt you've read. This does NOT post to the books — it creates a pending draft the user reviews and approves in Taokeh; only then does it hit the ledger. Shape the fields with intake_contract + expense_accounts first. Set amountUncertain when any digit of the printed total is uncertain; set needsReview and add a SHORT reviewer note in notes (one or two sentences naming what the human should double-check — not lengthy reasoning) for any other doubt. If you have the ORIGINAL receipt image/PDF, attach it — it rides the draft and lands on the posted entry automatically on approval, so the user never has to re-upload it. Small files: pass attachmentBase64 + attachmentMediaType inline. Anything bigger (a real photo or multi-page PDF): call request_attachment_upload, PUT the bytes to its uploadUrl, then pass the returned attachmentToken here instead.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | ||
| memo | No | ||
| notes | No | A SHORT reviewer note: one or two plain sentences, written in the reviewer's language, flagging what the human should double-check before approving — a smudged or ambiguous total, a vendor/customer you weren't sure of, a judgment call you made. The reviewer reads this on a small approval card, so keep it brief and human. This is NOT a place to dump lengthy reasoning, your working, or boilerplate — just the one thing to check. Leave it empty when there is nothing to flag. | |
| amount | Yes | ||
| currency | No | ||
| inputTax | No | ||
| reference | No | ||
| needsReview | No | ||
| amountUncertain | No | ||
| attachmentToken | No | The token from request_attachment_upload, AFTER you have PUT the file bytes to its uploadUrl. Use this instead of attachmentBase64 for any real photo/PDF — it carries the file out-of-band (no base64 in this call). Mutually exclusive with attachmentBase64. The uploaded file rides the draft and lands on the posted entry on approval, exactly as an inline one does. | |
| attachmentBase64 | No | The ORIGINAL receipt as base64 — SMALL files only (a few KB). Base64 inside a tool call is costly, so for a real receipt photo or a multi-page PDF use request_attachment_upload instead (attachmentToken). Rides the draft and lands on the posted entry on approval — no re-upload. A bad type/oversize file is rejected and NOTHING is filed. | |
| debitAccountCode | Yes | ||
| creditAccountCode | Yes | ||
| attachmentFilename | No | Optional original filename for the attachment, e.g. receipt.jpg. | |
| attachmentMediaType | No | The attachment's MIME type, e.g. 'image/jpeg' or 'application/pdf'. Required when attachmentBase64 is given. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false and thus uninformative, so the description carries the full burden. It discloses that the draft is pending, that attachments ride along and land on the posted entry, that a bad file causes rejection and nothing is filed, and provides specific instructions for amountUncertain, needsReview, and notes. This is rich behavioral transparency beyond any structured 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?
The description is long (~200 words) but every sentence earns its place: purpose, non-posting behavior, prerequisites, field semantics, and attachment size guidance. It is front-loaded with the core purpose, and the structure flows logically from what the tool does to how to use it. Given 15 parameters and a complex workflow, this is appropriately sized and not verbose.
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 15 parameters, the description covers all critical aspects: purpose, failure mode, attachment strategy, reviewer note style, what happens on approval, and the prerequisite call flow. An agent can correctly select and invoke this tool with high confidence. It is complete for its complexity.
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 only 33%, so the description compensates by explaining amountUncertain, needsReview, notes, attachmentBase64 vs attachmentToken, attachmentFilename/MediaType, and the prerequisite relationship to intake_contract/expense_accounts. However, it does not clarify date, amount, currency, inputTax, reference, or account codes—though these are relatively self-explanatory from names. Still, the description provides substantial added meaning for the most nuanced 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?
The description opens with a specific verb+resource: 'File a paid-expense DRAFT into Taokeh from a receipt you've read.' It immediately clarifies this is a draft, not a posted entry, and distinguishes it from sibling tools like create_bill_draft. The scope and outcome are 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?
The description explicitly states when to use this tool (after reading a receipt, for a draft) and what it does NOT do ('does NOT post to the books'). It gives prerequisites ('Shape the fields with intake_contract + expense_accounts first'), and names an alternative (request_attachment_upload) for larger attachments. This is strong usage guidance with clear exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_invoice_draftFile invoice draftAInspect
File a sales-invoice DRAFT into Taokeh from a sales note you've read. This does NOT post to the books — it creates a pending draft the user reviews and approves in Taokeh; only then does it post (and move stock). Shape the fields with intake_contract(doc_type:'invoice') + resolve_customer + resolve_product first. The server re-computes every line quantity from the tally and the grand total (with SST) — so present your working, but the server's figures are authoritative. Set needsReview and add a SHORT reviewer note in notes (one or two sentences naming what to double-check — not lengthy reasoning) for any doubt. If you have the ORIGINAL sales note image/PDF, attach the original document you extracted from — the owner sees it beside the draft at review (s.82 record-keeping) and it lands on the posted invoice automatically on approval, so the user never has to re-upload it. Small files: attachmentBase64 + attachmentMediaType inline. Anything bigger: request_attachment_upload → PUT the bytes → pass the returned attachmentToken.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | ||
| notes | No | A SHORT reviewer note: one or two plain sentences, written in the reviewer's language, flagging what the human should double-check before approving — a smudged or ambiguous total, a vendor/customer you weren't sure of, a judgment call you made. The reviewer reads this on a small approval card, so keep it brief and human. This is NOT a place to dump lengthy reasoning, your working, or boilerplate — just the one thing to check. Leave it empty when there is nothing to flag. | |
| customer | No | ||
| saleDate | Yes | ||
| reference | No | ||
| customerId | No | ||
| needsReview | No | ||
| printedTotal | No | ||
| paymentMethod | Yes | ||
| attachmentToken | No | The token from request_attachment_upload, AFTER you have PUT the file bytes to its uploadUrl. Use this instead of attachmentBase64 for any real photo/PDF — it carries the file out-of-band (no base64 in this call). Mutually exclusive with attachmentBase64. The uploaded file rides the draft and lands on the posted invoice on approval, exactly as an inline one does. | |
| attachmentBase64 | No | The ORIGINAL sales note as base64 — SMALL files only (a few KB). For a real photo or multi-page PDF use request_attachment_upload instead (attachmentToken). Rides the draft and lands on the posted invoice on approval — no re-upload. A bad type/oversize file is rejected and NOTHING is filed. | |
| attachmentFilename | No | Optional original filename for the attachment, e.g. sales-note.jpg. | |
| confirmNewCustomer | No | Set to true ONLY after the user has EXPLICITLY confirmed this customer is genuinely new. It skips the near-miss guard (which rejects a name that looks like shorthand for an existing customer). Never set it to push a near-miss through — ask the user first. | |
| attachmentMediaType | No | The attachment's MIME type, e.g. 'image/jpeg' or 'application/pdf'. Required when attachmentBase64 is given. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no useful annotations (all false), the description carries the full burden. It discloses key behaviors: not posting to books, server re-computes quantities and totals authoritatively, attachment flows (inline vs token) and its impact on review/approval, and the need for a short reviewer note. This exceeds the structured annotations and gives the agent actionable behavioral knowledge.
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 longer than typical but every sentence adds value: it front-loads the core purpose, then covers behavioral traps (server authoritative), reviewer notes, and attachment upload flow. It is well-structured and dense, though slightly verbose. It earns a 4, not 5, because it could be tightened without losing 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 complex tool with 14 parameters, no output schema, and no useful annotations, the description is remarkably complete. It covers the draft vs posted lifecycle, server-side recalculation, attachment instructions, and reviewer note guidance. It does not explicitly explain return values (no output schema anyway) or every edge case (e.g., near-miss customer guard), but it provides enough to invoke the tool 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 43% (6 of 14 params have descriptions). The description compensates significantly by explaining the semantics of lines (server recomputes), notes (short reviewer note, not reasoning), attachment handling (base64 vs token), and needsReview. It does not explicitly cover all remaining params (e.g., saleDate, paymentMethod, reference) but provides higher-level guidance via intake_contract and resolve_customer.
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: "File a sales-invoice DRAFT into Taokeh from a sales note you've read." It clearly distinguishes this tool from siblings by stating it does NOT post to the books and only creates a pending draft for review. This is a clear, differentiated 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?
The description provides clear context: use it when you've read a sales note and need to file a draft. It gives a workflow prerequisite ('Shape the fields with intake_contract + resolve_customer + resolve_product first') and explains the draft-vs-posted distinction. It does not explicitly name sibling alternatives (e.g., create_bill_draft) but the context is strong enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_journal_draftFile adjusting journal draftAInspect
File an ADJUSTING JOURNAL ENTRY as a draft in Taokeh — the accountant's entry, not a document: accruals, prepayments, depreciation, corrections, reclassifications, year-end adjustments, and REVERSING entries. This does NOT post to the books: it creates a pending draft with the debits and the credits laid out for the user to see, and only their approval writes it to the ledger. Shape the fields with intake_contract(doc_type:'journal') first — it returns this workspace's REAL chart of accounts, which is what every accountRef must match. IT MUST BALANCE TO THE SEN: debits equal credits or the draft is refused, with the difference named. Each line carries exactly one side (debit OR credit), and at least two lines are required. Accounts are matched by CODE (best) or by their exact name; an unknown ref is refused and an ambiguous name reports the candidates rather than picking. THIS TOOL NEVER CREATES AN ACCOUNT — if the adjustment needs one that does not exist, tell the user to add it in Taokeh and file again. FIXING A WRONG ENTRY THAT IS ALREADY POSTED: file a REVERSING entry here. Taokeh's connector never edits and never deletes posted history — that is deliberate and it is the point: a ledger you can rewrite is not a ledger, and every entry must stay auditable. So find the wrong entry with search_journal, file a reversing journal dated today (its debits become credits and its credits become debits, same accounts, same amounts), then file the correct entry. Tell the user plainly that this is what you are doing and why, rather than reporting that you 'cannot' fix it. CONTROL ACCOUNTS ARE ALLOWED BUT NEVER SILENT: a line on accounts receivable, accounts payable, inventory, the SST control or opening-balance equity is reconciled to a subledger, so a journal there moves the control with no document behind it and the aging-vs-control tie-out will show the difference. Such a draft is filed and flagged — it can be approved ONLY on its full review page in Taokeh, never by a one-tap email approval or a deck swipe. Say in notes why the control line is right. WHAT NOT TO USE THIS FOR: anything that has a real document. A supplier bill is create_bill_draft, a sale is create_invoice_draft, a paid expense is create_expense_draft, a customer payment is create_receipt_draft. Those carry party, SST and stock consequences a raw journal silently skips. Attach the WORKING PAPER you read the adjustment off — the depreciation schedule, the accrual computation, the bank letter. It rides the draft and the approver sees it beside your figures. Small files inline as attachmentBase64; anything real goes through request_attachment_upload then attachmentToken (never both). Set needsReview and add a SHORT reviewer note in notes for any doubt. Filed it wrong? Use revise_draft (kind: 'journal') rather than filing a second one.
| Name | Required | Description | Default |
|---|---|---|---|
| memo | No | What the entry is FOR, in one line — "accrue December electricity", "reverse the duplicated August rent". It prints on the entry and is the first thing the approver reads. | |
| lines | Yes | At least two lines. The debits must equal the credits TO THE SEN — an unbalanced entry is refused with the difference named. | |
| notes | No | A SHORT reviewer note: one or two plain sentences, in the reviewer's language, naming what the human should double-check before approving — which schedule the figure came from, which entry this reverses, why a control-account line is right. Not lengthy reasoning. | |
| entryDate | Yes | ||
| reference | No | Your own reference for the adjustment, if there is one (a schedule number, a working-paper ref). | |
| clientTotal | No | Your own arithmetic for the entry total — carried onto the review screen for the human to compare against, never used to compute anything. | |
| needsReview | No | ||
| attachmentToken | No | The token from request_attachment_upload, AFTER you have PUT the file bytes to its uploadUrl. Mutually exclusive with attachmentBase64. | |
| attachmentBase64 | No | The supporting WORKING PAPER as base64 — SMALL files only. For a real schedule or a multi-page PDF use request_attachment_upload instead (attachmentToken). A bad type/oversize file is rejected and NOTHING is filed. | |
| attachmentFilename | No | The original filename, for the reviewer. | |
| attachmentMediaType | No | The attachment's MIME type, e.g. 'application/pdf'. Required when attachmentBase64 is given. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations carrying no positive hints (all false), the description fully discloses behavior: it does NOT post to the books, requires balancing to the sen, refuses unknown account refs, never creates accounts, never edits/deletes posted history, flags control accounts with approval restrictions, and explains attachment handling. This goes far beyond what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured with clear sections like 'WHAT NOT TO USE THIS FOR,' and front-loaded with the core purpose. Every sentence adds necessary detail for a complex tool, though it could be slightly tighter without losing 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 complexity (11 params, no output schema, no enums), the description covers all key aspects: purpose, usage, constraints, balancing, account matching, control account rules, attachment guidance, error handling, and alternatives (revise_draft). No output schema means return values are not required, and the description fully addresses what the agent needs to invoke 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 82%, so baseline is 3, but the description adds significant meaning: it explains that lines must each carry exactly one side (debit or credit), how accountRef matching works (code best, exact name, ambiguous refused), the mutual exclusivity of attachmentToken vs attachmentBase64, and the purpose of notes/needsReview. This is valuable 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 opens with a precise verb and resource: 'File an ADJUSTING JOURNAL ENTRY as a draft in Taokeh' and immediately clarifies it is 'the accountant's entry, not a document.' It enumerates specific use cases (accruals, prepayments, depreciation, corrections, reclassifications, year-end adjustments, reversing entries) and explicitly distinguishes it from sibling document-draft 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?
Provides explicit when-to-use/when-not-to-use guidance with named alternatives: 'WHAT NOT TO USE THIS FOR' lists create_bill_draft, create_invoice_draft, create_expense_draft, create_receipt_draft. It also instructs to shape fields with intake_contract first and advises when to use reversing entries for posted errors.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_purchase_order_draftFile purchase-order draftAInspect
File a PURCHASE-ORDER draft into Taokeh — an order you intend to PLACE with a supplier, typically read off their quotation. It POSTS NOTHING and MOVES NOTHING: a purchase order is an intent to buy, so approving it creates no journal entry, no stock movement and no amount owing. The books move later, when the goods arrive and the user converts the order into a bill on its page in Taokeh — a step this tool never takes for them. Approval also saves the order as a DRAFT; issuing it to the supplier is the user's own tap, and Taokeh emails nobody. INVENTORY-ONLY — every line must be a product the workspace stocks; a service or one-off non-stock charge belongs on the manual purchase-order form. NO SST on this document: a purchase order in Taokeh carries no tax code and no tax line, and input SST is settled on the bill against the supplier's tax invoice. Shape the fields with intake_contract(doc_type:'purchase_order') + resolve_vendor + resolve_product first. The server re-computes every line quantity from the tally and the order total — so present your working, but the server's figures are authoritative. Set needsReview and add a SHORT reviewer note in notes (one or two sentences naming what to double-check — not lengthy reasoning) for any doubt. Filed it wrong? Use revise_draft (kind: 'purchase_order') rather than filing a second one. Goods that have ALREADY arrived are not this door — use create_bill_draft.
| Name | Required | Description | Default |
|---|---|---|---|
| term | No | The payment/delivery term line, e.g. 'Net 30'. | |
| lines | Yes | ||
| notes | No | A SHORT reviewer note: one or two plain sentences, written in the reviewer's language, flagging what the human should double-check before they order — a quantity you weren't sure of, a supplier name you guessed at, a judgment call you made. The reviewer reads this on a small approval card, so keep it brief and human. Leave it empty when there is nothing to flag. | |
| poDate | Yes | ||
| vendor | No | ||
| vendorId | No | ||
| reference | No | The BUYER'S OWN purchase-order number, if they already have one — it becomes this order's document number. NOT the supplier's quotation number (put that in `notes`). Usually omit it: Taokeh numbers the order itself (POxxxx). | |
| needsReview | No | ||
| expectedDate | No | When the goods are expected, YYYY-MM-DD. Optional — omit it rather than guess. | |
| printedTotal | No | ||
| confirmNewVendor | No | Set to true ONLY after the user has EXPLICITLY confirmed this supplier is genuinely new. It skips the near-miss guard (which rejects a name that looks like shorthand for an existing vendor). Never set it to push a near-miss through — ask the user first. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the sparse annotations (all false) to disclose key behaviors: it POSTS NOTHING and MOVES NOTHING, creates no journal entry, saves as draft, issues no emails, carries no SST, and the server recomputes quantities and totals. This provides rich context that annotations alone would not convey, with no contradictions to the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loaded with the core purpose and key non-behaviors. Every sentence adds value (e.g., inventory-only, no SST, server recompute, review guidance). It is structured as a coherent flow from purpose to boundaries to workflow. Slightly verbose with uppercase emphasis, but appropriate for the tool's complexity.
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 lack of an output schema, the description explains the tool's effect, limitations, and downstream steps thoroughly. It covers what the tool does not do, prerequisites (intake_contract, resolve_*), and error correction (revise_draft). It does not specify the return value, but for a draft-creation tool, that is less critical and the overall context is comprehensive.
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 only 45%, but the description compensates by explaining critical parameters in context: `reference` is the buyer's own PO number (not the supplier's quotation number), `notes` is for a brief reviewer note, and `confirmNewVendor` requires explicit user confirmation. It also references intake_contract/resolve_vendor/resolve_product for shaping fields, adding meaning beyond the raw 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: 'File a PURCHASE-ORDER draft into Taokeh.' It clearly distinguishes this from sibling tools by explicitly noting it creates an intent-to-buy document and differentiating from create_bill_draft ('Goods that have ALREADY arrived are not this door'). The scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage guidelines are explicit and thorough. It states when to use this tool (intending to place an order with a supplier) and when not to (services/non-stock items should use the manual form; already-arrived goods should use create_bill_draft). It also directs users to revise_draft for corrections, covering both alternatives and exclusions clearly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_quote_draftFile quote draftAInspect
File a quotation DRAFT into Taokeh from a request you've read or been told. A quote is an ESTIMATE — it does NOT post to the books or move stock; it creates a pending draft the user reviews and approves in Taokeh, which posts a real quotation they can then convert to an invoice or delivery order. Shape the fields with resolve_customer + resolve_product first. The server re-computes every line quantity from the tally and the grand total (with SST) — so present your working, but the server's figures are authoritative. A quote may have no customer (a walk-in estimate). Set needsReview and add a SHORT reviewer note in notes (one or two sentences naming what to double-check — not lengthy reasoning) for any doubt. If you read the request off a document, attach the original document you extracted from — the owner sees it beside the draft at review (s.82 record-keeping) and it lands on the posted quote automatically on approval. Small files: attachmentBase64 + attachmentMediaType inline. Anything bigger: request_attachment_upload → PUT the bytes → pass the returned attachmentToken.
| Name | Required | Description | Default |
|---|---|---|---|
| term | No | Payment term carried onto the quote, e.g. 'Net 30'. Defaults to 'Due on Receipt'. | |
| lines | Yes | ||
| notes | No | A SHORT reviewer note: one or two plain sentences, written in the reviewer's language, flagging what the human should double-check before approving — a smudged or ambiguous total, a vendor/customer you weren't sure of, a judgment call you made. The reviewer reads this on a small approval card, so keep it brief and human. This is NOT a place to dump lengthy reasoning, your working, or boilerplate — just the one thing to check. Leave it empty when there is nothing to flag. | |
| customer | No | ||
| quoteDate | Yes | ||
| reference | No | ||
| customerId | No | ||
| validUntil | No | Optional "valid until" date for the quotation (YYYY-MM-DD). | |
| needsReview | No | ||
| printedTotal | No | ||
| attachmentToken | No | The token from request_attachment_upload, AFTER you have PUT the file bytes to its uploadUrl. Use this instead of attachmentBase64 for any real photo/PDF — it carries the file out-of-band (no base64 in this call). Mutually exclusive with attachmentBase64. The uploaded file rides the draft and lands on the posted quote on approval, exactly as an inline one does. | |
| attachmentBase64 | No | The ORIGINAL request/quote document as base64 — SMALL files only (a few KB). For a real photo or multi-page PDF use request_attachment_upload instead (attachmentToken). Rides the draft and lands on the posted quote on approval — no re-upload. A bad type/oversize file is rejected and NOTHING is filed. | |
| attachmentFilename | No | Optional original filename for the attachment, e.g. rfq.pdf. | |
| confirmNewCustomer | No | Set to true ONLY after the user has EXPLICITLY confirmed this customer is genuinely new. It skips the near-miss guard (which rejects a name that looks like shorthand for an existing customer). Never set it to push a near-miss through — ask the user first. | |
| attachmentMediaType | No | The attachment's MIME type, e.g. 'image/jpeg' or 'application/pdf'. Required when attachmentBase64 is given. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the sparse annotations (readOnlyHint=false, destructiveHint=false), the description discloses critical behaviors: it does not post to the books or move stock, the server recomputes quantities and totals from the tally, and bad attachments are rejected with nothing filed. This gives the agent a realistic model of side effects and authority.
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 longer than average but every sentence earns its place, covering purpose, prerequisites, server behavior, review notes, and attachment handling in a logical flow. It avoids redundancy with schema field descriptions and is better structured than a simple tautology, though slightly dense.
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 complexity (15 parameters, no output schema, minimal annotations), the description is remarkably complete. It covers the full workflow: resolving customer/product, handling no-customer quotes, server recalculation, reviewer notes, attachment upload paths, and the near-miss guard. All critical invocation details are addressed.
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?
With schema coverage at 53%, the description compensates substantially by adding meaning to parameters: it explains `needsReview` and `notes` (short reviewer note, not lengthy reasoning), clarifies that `customer` can be empty for walk-in estimates, and details the `attachmentBase64` vs `attachmentToken` flow. It also warns that server figures are authoritative for `lines` and totals.
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: 'File a quotation DRAFT into Taokeh from a request you've read or been told.' It clearly distinguishes from siblings like create_invoice_draft by emphasizing that a quote is an estimate that does not post to the books or move stock, making its purpose unmistakable.
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 explicit prerequisites ('Shape the fields with resolve_customer + resolve_product first') and clear conditional guidance (e.g., attach original document when reading from a document, use request_attachment_upload for large files, set needsReview for any doubt). It does not explicitly name alternative draft tools for comparison, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_receipt_draftFile receipt draftAInspect
File a customer-payment DRAFT into Taokeh ("customer paid X"). This does NOT post — it creates a pending draft the user reviews and approves in Taokeh; only then does it write a real bank receipt and settle the invoices. A receipt settles an EXISTING customer's open invoices: resolve the customer (resolve_customer) and see what they owe (open_invoices) first, then give EITHER a lump total (auto-allocated oldest-first) OR explicit per-invoice allocations. MYR only — a foreign-currency invoice is refused and routes to Banking → Payments. The server re-derives the allocation against live outstanding, so its figures are authoritative. Set needsReview and add a SHORT reviewer note in notes (one or two sentences naming what to double-check — not lengthy reasoning) for any doubt. If you have the payment proof (bank-in slip / remittance advice), attach the original document you extracted from — the owner sees it beside the draft at review (s.82 record-keeping) and it lands on the settlement entry automatically on approval. Small files: attachmentBase64 + attachmentMediaType inline. Anything bigger: request_attachment_upload → PUT the bytes → pass the returned attachmentToken.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | A SHORT reviewer note: one or two plain sentences, written in the reviewer's language, flagging what the human should double-check before approving — a smudged or ambiguous total, a vendor/customer you weren't sure of, a judgment call you made. The reviewer reads this on a small approval card, so keep it brief and human. This is NOT a place to dump lengthy reasoning, your working, or boilerplate — just the one thing to check. Leave it empty when there is nothing to flag. | |
| total | No | ||
| customer | No | ||
| customerId | No | ||
| allocations | No | ||
| needsReview | No | ||
| receiptDate | Yes | ||
| printedTotal | No | ||
| bankAccountId | No | ||
| attachmentToken | No | The token from request_attachment_upload, AFTER you have PUT the file bytes to its uploadUrl. Use this instead of attachmentBase64 for any real photo/PDF — it carries the file out-of-band (no base64 in this call). Mutually exclusive with attachmentBase64. The uploaded file rides the draft and lands on the settlement entry on approval, exactly as an inline one does. | |
| attachmentBase64 | No | The ORIGINAL payment proof (bank-in slip / remittance advice) as base64 — SMALL files only (a few KB). For a real photo or multi-page PDF use request_attachment_upload instead (attachmentToken). Rides the draft and lands on the settlement entry on approval — no re-upload. A bad type/oversize file is rejected and NOTHING is filed. | |
| attachmentFilename | No | Optional original filename for the attachment, e.g. bank-in-slip.jpg. | |
| attachmentMediaType | No | The attachment's MIME type, e.g. 'image/jpeg' or 'application/pdf'. Required when attachmentBase64 is given. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the draft lifecycle (pending review/approval before posting), server-side re-derivation of allocations, currency restriction, and attachment carry-through behavior, all beyond the neutral annotations. It also notes failure behavior for bad/oversize attachments ('rejected and NOTHING is filed').
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 a dense paragraph but every sentence carries operational value, front-loading the critical 'does NOT post' caveat. It is longer than the simplest examples, but the complexity of the tool justifies the length.
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 neutral annotations, the description covers the core workflow, prerequisites, constraints, and failure modes. It omits only the response shape and a few self-evident parameter semantics, but overall a strong, operational spec.
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 description assigns meaning to key parameters: total = auto-allocated oldest-first, allocations = explicit per-invoice, needsReview = set for doubt, attachmentBase64/Token = small vs large file paths. However, some parameters (customerId, printedTotal, bankAccountId) remain undescribed in both schema and description, though the workflow implies their purpose.
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: 'File a customer-payment DRAFT into Taokeh' and immediately clarifies it does NOT post, distinguishing it from real receipt posting. It also differentiates from sibling create_*_draft tools by scoping to customer 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?
It explicitly names prerequisite tools (resolve_customer, open_invoices) and alternative upload path (request_attachment_upload), and says a foreign-currency invoice is refused and routes to Banking → Payments. It also explains when to set needsReview and how to structure notes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
daily_briefDaily briefAInspect
Your morning brief in one call: today's and this-month's sales & expenses, cash position (cash.total is LIQUID money only — cash + banks + gateway float; any owner advance comes back separately as cash.ownerFunding, a liability that must never be added to the cash total), who owes you (top debtors + overdue buckets), what's waiting for your approval, tax position, and low stock. Assembles the same figures as the individual tools (business_snapshot, cash_position, ar_aging, tax_position, low_stock) plus your pending-approval queue, so "brief me" is a single read.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description repeatedly frames the tool as a read operation, ending with "so 'brief me' is a single read." However, annotations set readOnlyHint to false, which indicates the tool is not marked as read-only. This is a direct annotation contradiction, so the description cannot be trusted for behavioral transparency despite its useful cash.total nuance.
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 "Your morning brief in one call" and packs the important contents into a structured list. The parenthetical cash.total clarification is valuable, though the second sentence partially repeats the first sentence's component list while adding tool names.
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 complex aggregator with no output schema, the description covers many output categories and even explains cash.total semantics. However, the readOnlyHint contradiction leaves the actual side-effect profile unclear, and the return structure is not described beyond field names.
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 has zero parameters and schema coverage is 100%, so there are no parameter semantics to clarify. The 0-parameter baseline of 4 applies; the description appropriately spends its words on output semantics instead of 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?
The description clearly states that this is an aggregated morning brief covering sales, expenses, cash, receivables, approvals, tax, and stock. It distinguishes itself from siblings by explicitly naming the individual tools whose figures it assembles and noting the added pending-approval queue.
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 clear context: use this when the user says "brief me" and wants a single aggregated read. It names the individual alternatives (business_snapshot, cash_position, ar_aging, tax_position, low_stock), though it does not explicitly state when NOT to use it in favor of those individual tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_bank_classificationPropose bank-row categoriesAInspect
Propose a category (and optionally a contact) for up to 50 imported bank rows still waiting for review — get their ids from bank_review_queue. PROPOSALS ONLY: this writes a suggestion the owner sees as an 'AI suggestion' badge on the Banking → Review screen; it never confirms, never posts, and nothing you send here moves money — the owner reviews and posts every line in /banking. Only SUGGESTED/UNCATEGORIZED rows accept a proposal (already-decided CONFIRMED/POSTED/IGNORED rows are rejected). category must be one of the review screen's own set. contactName applies only to CUSTOMER_PAYMENT (a customer) or SUPPLIER_PAYMENT (a vendor) and must match an EXISTING contact exactly — an unresolvable name rejects that row (create the contact first, or omit it). note is your stated reason (≤300 chars), shown to the owner — write it well, because the owner reads it when deciding. Your proposals are also collected into a 'Proposals from your AI' panel on Banking → Review, where the owner can accept a whole batch of them in one tap after reading them grouped by category with your reasons; that acceptance sets the category and contact only and is still the owner's decision — it never posts to the ledger. Per-row outcomes are reported — nothing is silently skipped.
| Name | Required | Description | Default |
|---|---|---|---|
| suggestions | Yes |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations only indicate false flags (not read-only, not idempotent, not destructive). The description enriches this by clarifying the actual write behavior: 'writes a suggestion the owner sees... never confirms, never posts... nothing you send here moves money'. It also discloses per-row error handling ('unresolvable name rejects that row'), output reporting ('Per-row outcomes are reported'), and the owner's batch-acceptance workflow, adding valuable context beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but each sentence adds critical operational detail, laid out in a front-loaded, logical flow: action, sourcing, limitations, parameter semantics, UI context, and error handling. It is appropriately sized for a tool that proposes financial categorizations with many user-facing constraints.
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 covers input sources, eligibility, contact validation, note expectations, the owner's review workflow, batch acceptance, and outcome reporting. It is self-sufficient for an agent to select, invoke, and understand the consequences of this tool, leaving no major 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 0%, so the description must carry the parameter semantics. It explains category must be from the review screen's set, contactName only for CUSTOMER_PAYMENT/SUPPLIER_PAYMENT and must match an existing contact exactly, note is limited to 300 chars and serves as the owner-facing reason, and transactionId comes from bank_review_queue. This fully compensates for the absent schema 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 opens with a specific verb 'Propose' and a precise resource: 'bank rows still waiting for review' with a scope cap of 50. It further distinguishes itself from siblings by noting it is proposal-only and by referencing bank_review_queue for IDs, differentiating from create_* draft tools and read-only reporting 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 use: 'PROPOSALS ONLY' and 'Only SUGGESTED/UNCATEGORIZED rows accept a proposal', and gives alternatives/conditions: 'get their ids from bank_review_queue', 'create the contact first, or omit it'. Also excludes when not to use: 'never confirms... the owner reviews and posts every line in /banking'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
employer_cost_estimateEmployer cost estimateARead-onlyInspect
Cost a HYPOTHETICAL hire: give a monthly wage and get back what that employee would really cost the employer each month — the wage plus employer EPF, SOCSO, EIS and the HRD Corp levy at this workspace's own rate — and what the employee would actually take home after employee EPF, SOCSO, EIS, SKBBK and PCB/MTD. Use it for "if I hire someone at RM4,000, what does it really cost me?" and "what would they take home?". Optional: residency (RESIDENT, the default, or NON_RESIDENT — a non-resident is taxed at a flat 30%), citizenship (MALAYSIAN or FOREIGNER — this drives the HRD Corp levy and makes SKBBK mandatory; it does NOT change the EPF, SOCSO or EIS rates applied, and it does not change tax residency, so set residency too), ageBand (UNDER_60 or 60_AND_OVER — reduced EPF and SOCSO Category 2), and epfEmployeeRate if the employee elects a reduced EPF rate. The PCB comes from Taokeh's implementation of LHDN's official computerised MTD method — the calculation IRBM confirmed in writing on 13 August 2026 (letter ref 2026-256) — not from a simplified formula. The defaults are RESIDENT, single, no children and NO TP1 reliefs, because reliefs are per-employee paperwork nobody has filled in for a person who does not exist yet; every assumption is spelled out in the reply and MUST be repeated to the user. Present it as an estimate on stated assumptions, never as a quote or as tax advice. READ-ONLY — it creates nothing, hires nobody and files nothing. ADMIN ONLY, like every payroll tool here.
| Name | Required | Description | Default |
|---|---|---|---|
| ageBand | No | ||
| residency | No | ||
| citizenship | No | ||
| monthlyWage | Yes | ||
| epfEmployeeRate | No |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the annotations (readOnlyHint: true, openWorldHint: false) by explicitly stating 'READ-ONLY — it creates nothing, hires nobody and files nothing.' It also clarifies that the estimate is based on Taokeh's implementation of LHDN's official method and that defaults are used. However, it does not cover potential rate limits or system 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?
The description is well-structured and front-loaded with the core purpose, but it is slightly lengthy due to detailed explanations of defaults and assumptions. Every sentence adds value, though some details could be condensed without losing clarity.
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 5 parameters, no output schema, and no nested objects, the description provides comprehensive information: defaults, optional parameter effects, calculation source, and usage context. It explains the output format (estimate with stated assumptions) and the tool's limitations (not tax advice, not a quote), making the description fully 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?
With schema description coverage at 0%, the description fully compensates by explaining each optional parameter's meaning and effect (e.g., residency, citizenship, ageBand, epfEmployeeRate). It describes their interplay, such as how citizenship drives HRD Corp levy and makes SKBBK mandatory but does not change EPF/SOCSO/EIS rates.
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 the tool's purpose: 'Cost a HYPOTHETICAL hire: give a monthly wage and get back what that employee would really cost the employer.' It uses specific verbs ('Cost', 'give', 'get back') and distinguishes itself from sibling tools like 'open_invoices' or 'payroll_summary' by focusing on hypothetical hiring cost estimates.
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 provides explicit guidance on when to use this tool (e.g., 'if I hire someone at RM4,000, what does it really cost me?') and what assumptions are made (e.g., defaults for residency, citizenship, age band, etc.). It also explains optional parameters and their effects, such as ‘NON_RESIDENT’ tax treatment and HRD Corp levy for foreigners.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
expense_accountsExpense accountsARead-onlyInspect
The expense accounts you can post to in this workspace — pick a category (what the money was for) and a paid-from account (where it came from) by code, for shaping a paid-expense draft.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already flags the tool as safe; the description adds functional detail by explaining that it provides a list of categories and paid-from accounts to pick from, identified by code. This goes beyond the annotation without contradicting it, offering enough context about what the tool returns and how it is used.
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 a single sentence that front-loads the core identity ('The expense accounts you can post to in this workspace') and then elaborates with usage context. It is appropriately concise for a reference tool, though the dash-and-parenthetical construction could be marginally clearer.
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 zero-parameter tool with no output schema, the description covers the essential purpose and usage context: what the tool provides (expense accounts), how to select them (category and paid-from account by code), and when to use it (shaping a paid-expense draft). It does not discuss pagination or response format, but these are not critical for such a simple lookup 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 has zero parameters, so there is nothing to define beyond the schema's empty object. The description's mention of 'by code' hints at how the list is structured (accounts are referenced by code), which is useful context for an agent handling the tool's output.
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 identifies the tool as a reference for expense accounts in the workspace, specifying that it covers categories (what the money was for) and paid-from accounts (where it came from), and that selection is by code. This distinguishes it from siblings like expenses_summary (a report) and create_expense_draft (the actual creation 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 states the intended use: 'for shaping a paid-expense draft,' which tells the agent when to invoke this tool. It does not explicitly name alternatives or exclusions, but the context is clear enough that an agent could differentiate it from create_expense_draft or expenses_summary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
expenses_summaryExpenses summaryARead-onlyInspect
How much you have spent: your paid expenses today and this month so far.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the read-only nature is known. The description adds useful context by specifying that only paid expenses are included and defining the time periods (today and month-to-date). It does not mention return format or any aggregation behavior, but that is less critical with annotations present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence conveys the purpose without any wasted words. It is appropriately concise for a simple zero-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?
For a simple read-only summary tool with no parameters and no output schema, the description is reasonably complete. It covers the subject (paid expenses) and time range (today and month), though it leaves ambiguous whether the response is one total or two separate figures. This is a minor gap given the tool's 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?
The tool has zero parameters, and the schema is an empty object with 100% coverage. Per guidelines, the baseline for 0 params is 4, and the description does not need to add parameter details. It adds meaning by indicating the nature of the summary.
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 the tool reports how much the user has spent, specifically on paid expenses today and this month to date. It distinguishes from siblings like sales_summary and expense_accounts by mentioning 'paid expenses' and time ranges, though it lacks an explicit verb like 'get' or 'list'.
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 when the user wants a quick view of paid expenses for today and this month. It does not explicitly state when to use this tool versus alternatives such as search_expenses or expense_accounts, nor does it mention exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_in_taokehFind in TaokehARead-onlyInspect
Use this to tell the user WHERE in Taokeh to do something or change a setting — it returns the exact page(s) and what each one does, grounded in Taokeh's LIVE feature catalogue, so you never guess or invent navigation. Give a natural-language query ("where do I turn on payment reminders", "how do I connect Shopee", "where's the SST setting") and it ranks the real features and hands back the top matches, each with the page's absolute deep-link URL(s), a one-line description of what the page does, an optional configHint (Taokeh keeps a feature's options on its OWN page, not in a global Settings menu), and an addOn flag (a paid add-on this workspace may not have). It GUIDES to the UI only — it changes nothing: no setting is ever toggled by the connector, that stays a human action in-app. If nothing matches it says so honestly — then tell the user to browse the left sidebar or contact support; never make up a path.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint annotation by explicitly stating 'it changes nothing' and 'no setting is ever toggled', and adds behavioral details such as ranking matches, returning deep-link URLs, configHint, addOn flag, and honest no-match behavior. It also notes the live catalogue grounding to prevent hallucinated navigation.
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 longer than a simple two-liner but every sentence adds necessary information about behavior, output, and constraints. It is front-loaded with the core purpose and the extra details are all relevant, though slightly verbose.
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?
Despite no output schema, the description fully explains the return format (ranked matches, page URLs, descriptions, configHint, addOn flag) and the tool's safety and failure modes. It is complete for a 1-parameter lookup tool with plenty of context.
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 for the one string parameter is 0%, so the description carries the full burden. It defines the query as a natural-language request and gives three concrete examples, giving the agent clear guidance on what to pass.
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 the tool returns exact Taokeh pages for a user's intended action, with a specific verb ('tell the user WHERE') and a well-defined resource (Taokeh's live feature catalogue). It is clearly distinguished from sibling tools, which are financial reports and draft-creation actions.
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 ('to tell the user WHERE in Taokeh to do something or change a setting'), provides natural-language query examples, and gives exclusions ('it changes nothing' and 'never make up a path'). It also instructs what to do on no match: browse sidebar or contact support.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_attachmentGet original document linkARead-onlyInspect
Get a short-lived link to the ORIGINAL DOCUMENT filed against something in the books — the receipt behind a posted expense, or the receipt/sales note/supplier bill/bank-in slip/name card riding a PENDING draft. Use it to CHECK a document is on file, or to re-read one you filed earlier. Find what to ask for first: search_expenses reports hasAttachment and an attachments list (with an attachmentId) on every posted expense it returns, and each create_*_draft / revise_draft result reports whether an original rides that draft. Give owner plus the id of the thing that owns it — for a posted expense that is the expenseId from search_expenses, plus the attachmentId when the entry carries more than one file; for a draft it is the draftId. Returns a signed URL (about 15 minutes, works for anyone holding it — so treat it as you would the document itself), the filename, the media type and the size in bytes; the bytes themselves are NEVER inlined here, because a base64 blob in a tool result costs about one token per character. Download it and read it yourself: Taokeh does not read, OCR or interpret the file for you — your own AI does that, on your own subscription. Read-only; it changes nothing, emails nobody, and no link it hands out can reach another workspace. An APPROVED draft honestly reports no original: on approval the file moves onto the posted document, so ask for it there instead.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The owner's id — the expenseId from search_expenses for 'expense', otherwise the draftId a create_*_draft or revise_draft call returned. | |
| owner | Yes | What the original hangs off: 'expense' = a POSTED paid expense (use the expenseId from search_expenses); 'expense_draft' / 'invoice_draft' / 'bill_draft' / 'quote_draft' / 'receipt_draft' / 'contact_draft' = a PENDING draft (use its draftId). | |
| attachmentId | No | Which file, when a posted expense carries more than one — the `attachmentId` from that expense's `attachments` list in search_expenses. Omit for a draft (a draft carries at most one original), and omit for an expense with exactly one file. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description reveals the signed URL is short-lived (~15 minutes), works for anyone holding it, and that bytes are never inlined. It also states 'Read-only; it changes nothing, emails nobody, and no link it hands out can reach another workspace'—adding network-scope and side-effect guarantees. This significantly exceeds the annotation's minimal signal.
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 long but every sentence carries distinct value—purpose, usage, parameter guidance, return behavior, security caveats, and lifecycle nuance. It front-loads the core purpose in the first clause. Slightly dense but justified given the tool's complexity.
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 fully specifying the return shape (URL, filename, media type, size) and behavior. It also covers edge cases like approved drafts having no original, making it a self-sufficient reference.
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%, but the description enriches the meaning: it explains the relationship between owner and id, when to use expenseId vs draftId, and when to omit attachmentId. This adds operational context the schema alone lacks.
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 'Get a short-lived link to the ORIGINAL DOCUMENT...' which precisely identifies the verb (get), object (original document link), and scope (filed against expenses/drafts). It also differentiates itself from siblings like get_document_pdf by emphasizing it returns a link, not inlined bytes.
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 states 'Use it to CHECK a document is on file, or to re-read one you filed earlier.' It also provides a clear path to finding what to ask for ('search_expenses reports hasAttachment and attachments...'). However, it doesn't name an alternative tool for when you need the actual file content, so no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_document_pdfGet document PDF linkARead-onlyInspect
Get a shareable link to the ACTUAL PDF of one invoice, quote or credit note — so you can hand the user (or their customer) the real document, e.g. "here's your invoice". Identify the document by its docId (from search_documents) OR its printed docNumber (e.g. the invoice number) — give one; if a number matches several documents I'll list them so you can pick the id. Returns a short-lived signed URL (works for ~15 minutes, for anyone who has it — so share it deliberately), the document number, and when it expires. Covers invoices, quotes and credit notes (they share one document layout). This does not email anyone — it hands YOU a link to pass on.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | No | The document id (from search_documents). Give this or docNumber. | |
| docType | Yes | Which document: 'invoice', 'quote' or 'credit_note'. | |
| docNumber | No | The printed document number (e.g. the invoice/quote reference). Give this or docId; resolved case-insensitively and must match exactly one document. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds rich behavioral context beyond the readOnlyHint annotation: the returned URL is short-lived (~15 minutes), shared-access means anyone with it can use it, and sharing should be deliberate. It also discloses that multiple matches will be listed for the user to pick, and clarifies that this tool does not send emails. This is exemplary transparency.
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 systematically covers identification, return value, expiry, scope, and non-email behavior. Every sentence adds relevant information, and the structure makes the tool's behavior easy to parse for an agent.
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 there is no output schema, the description carries the full burden of explaining return values, and it does so explicitly: the signed URL, the document number, and expiration time are all mentioned. It also covers document coverage and disambiguation behavior, making the tool's behavior complete for an agent invoking 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?
With 100% schema description coverage, the schema already documents all three parameters clearly. The description reinforces the relationship between docId and docNumber ('give one') but does not add significant new semantics beyond what the schema provides. This meets the baseline but does not exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get a shareable link to the ACTUAL PDF of one invoice, quote or credit note'. It clearly distinguishes the tool from generic document tools by emphasizing the real PDF artifact and explicitly noting it does not email anyone. This makes the purpose unmistakable.
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 provides clear when-to-use context: when you need to hand the user or their customer the actual document. It explains the two identification paths (docId from search_documents or printed docNumber) and the disambiguation behavior if multiple matches occur. It stops short of explicitly naming alternative tools for when not to use it, but the guidance is still strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_bank_statementImport bank statementAInspect
Import a bank statement into Taokeh for reconciliation, from a statement you've read (PDF/CSV/image). This does NOT post to the books — every row lands in Banking → Review for the user to categorize and post line by line. A statement is the bank's own list of transactions for ONE account over a period: use intake_contract(doc_type:'statement') first to see the tenant's bank accounts + the arithmetic law. Give the account id, the printed opening + closing balances, and every transaction row (signed amount: + money in, − money out). The server checks opening + the rows tie to the closing balance and rejects with the exact delta if they don't — never invent or omit rows to force it to balance. Single receipts, invoices or bills go through their own draft doors, not here. ARCHIVING THE ORIGINAL: this import archives the statement file WHEN you send one — call request_attachment_upload FIRST, PUT the statement's raw bytes to its uploadUrl, then pass the returned attachmentToken here; the original is then kept on the statement (s.82 record-keeping) and the user can download it from the statement page, exactly as the web upload at Banking → Import does. Without a token nothing is archived and the books carry rows with no source document behind them. Already filed one bare? Call this tool AGAIN with the IDENTICAL account, balances and rows plus attachmentToken — the identical reading matches the same statement, so the file is ADOPTED onto it and no rows are staged twice.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | Yes | ||
| bankAccountId | Yes | ||
| closingBalance | Yes | ||
| confirmOverlap | No | Set to true ONLY after the user has confirmed this is a genuinely new, separate statement whose period overlaps one already imported. It bypasses the overlap guard that stops the same transactions being counted twice. Never set it to push an overlap through — ask the user first. | |
| openingBalance | Yes | ||
| attachmentToken | No | The token from request_attachment_upload, AFTER you have PUT the statement bytes to its uploadUrl. This is the normal way to archive a statement PDF — it carries the file out-of-band (no base64 in this call). Mutually exclusive with attachmentBase64. The file is archived on the statement and the user downloads it from the statement page in Taokeh. | |
| attachmentBase64 | No | The ORIGINAL statement as base64 — SMALL files only (a few KB). A real bank statement PDF is never that small, so in practice use request_attachment_upload + attachmentToken instead. Mutually exclusive with attachmentToken. A bad type/oversize file is rejected and NOTHING is imported. | |
| attachmentFilename | No | The original filename, for the user browsing their statements. | |
| attachmentMediaType | No | The attachment's MIME type, e.g. 'application/pdf'. Required when attachmentBase64 is given. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations providing behavioral cues (readOnlyHint=false, etc.), the description fully discloses behavior: the server checks balances, rejects with exact delta, never invent rows. It explains the archiving mechanism, the consequence of no token (no source document), and idempotent retry behavior. No contradictions with annotations found.
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 relatively long but each sentence is meaningful. It front-loads the core purpose and non-posting behavior, then details constraints and attachment workflow. Minor redundancy around 'never invent or omit rows' is justified by criticality. Could trim 'never invent or omit rows to force it to balance' slightly, but overall well-structured.
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 9 parameters, no output schema, and complex workflow (pre-requisite intake_contract, optional attachment via two methods, idempotent retry, overlap guard), the description covers all aspects: prerequisites, error handling, archiving, user confirmation for overlaps, and parameter relationships. Nothing significant 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 56% (5 of 9 params have descriptions). For undocumented params (bankAccountId, openingBalance, closingBalance, rows), the description compensates richly: it explains the account id comes from intake_contract, opening/closing balances are printed balances, rows must include signed amounts. For documented params, the description adds workflow context (mutual exclusion, size constraints for base64).
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 the tool imports a bank statement for reconciliation, distinguishes it from posting to books, and contrasts with single-receipt/invoice/bill tools. The verb 'import' plus 'bank_statement' and the explicit 'does NOT post to the books' make the purpose unmistakable.
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 provides explicit when-to-use guidance: use intake_contract first to discover bank accounts and the arithmetic law. It states when NOT to use it (single receipts, invoices, bills go through draft doors). It instructs on attachment upload process, and even explains how to retroactively add an attachment without duplicating rows. No ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
income_statementIncome statementARead-onlyInspect
Your profit and loss for a period: revenue, cost of goods sold, gross profit, expenses and net income. COMPARISON (optional): to answer "how does this month compare with last?" ask for it here — NEVER call this tool twice and subtract the figures yourself. Set compare to 'previous_period' (the window of EQUAL LENGTH immediately before this one) or 'same_period_last_year' (the same dates one year earlier), OR give an explicit earlier window with BOTH compareFrom and compareEnd. You get both periods' full statements plus, for every account line and every total, deltaCents and deltaPct computed server-side in integer cents. deltaPct is NULL whenever the earlier figure is zero — a percentage change from zero is undefined, so report it as "no comparable base", never as ∞% or 100%. Percentages are measured against the ABSOLUTE earlier figure, so a movement out of a loss keeps the sign of the movement. windows states both windows, each one's day count, whether they are the same length, and whether either is still open (running to today or beyond, so its figures can still move); notes says all of this in plain words. READ notes BEFORE quoting a variance: if equalLength is false you are looking at a partial period against a full one and must say so.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| from | Yes | ||
| compare | No | Named comparison window. 'previous_period' = the equal-length window immediately before from…to; 'same_period_last_year' = the same dates one year earlier. Omit for no comparison. | |
| compareEnd | No | End of an explicit comparison window (use WITH compareFrom). | |
| compareFrom | No | Start of an explicit comparison window (use WITH compareEnd; overrides `compare`). |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, but the description adds substantial behavioral context beyond that: it explains that comparison returns deltaCents and deltaPct computed server-side, details about deltaPct being NULL when the earlier figure is zero, how percentages are measured, and the structure of the `windows` and `notes` fields. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose in the first sentence. Every subsequent sentence earns its place by explaining comparison behavior, return fields, and edge cases. Despite being longer, the structure is logical and all content is necessary for correct tool usage.
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 5 parameters (2 required), no output schema, and moderate complexity, the description provides complete coverage. It explains the output structure (deltaCents, deltaPct, windows, notes), handles edge cases (NULL deltaPct, unequal window lengths), and gives usage instructions. No gaps are apparent.
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?
Despite 60% schema description coverage, the description adds significant meaning to all five parameters. It explains the purpose of `from` and `to` as the primary period, details the `compare` enum options with clear definitions, and explicitly states that `compareFrom`/`compareEnd` must be used together and override `compare`. This fully compensates for schema gaps.
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 it provides profit and loss for a period, listing major line items (revenue, COGS, gross profit, expenses, net income). This distinguishes it from sibling tools like balance_sheet or cash_forecast by specifying the exact financial statement. The verb 'your profit and loss' is specific and the resource is well-defined.
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 explicitly states when to use the comparison feature and, crucially, tells the agent NEVER to call the tool twice and subtract manually. It provides clear instructions on setting the `compare` parameter or using explicit `compareFrom`/`compareEnd`. It also warns to read `notes` before quoting a variance and explains how to handle unequal length windows.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
intake_contractIntake contractARead-onlyInspect
The shape a Taokeh document needs, so you can turn a paid receipt, a sales note, a supplier bill, a customer payment, a sales return, a bank statement or a whole set of OPENING BALANCES into a correctly-formed submission: required fields, how to read totals / measurements / SST, and a worked example grounded in this workspace. Pass doc_type 'expense' (default), 'invoice', 'bill', 'purchase_order', 'statement', 'receipt', 'credit_note', 'sales_debit_note', 'journal', or — when this workspace is SWITCHING from another accounting system — 'trial_balance', 'aged_receivables' or 'aged_payables', which are staged in one call each with stage_opening_balances, and 'accounts', 'products', 'contacts' or 'settings' (its CHART OF ACCOUNTS, its item list, its customer/supplier book and its WORKSPACE SETUP — company name, registration number, TIN, address, state, statutory officer, language, measurement profile and accounting start date), which are staged in one call each with stage_master_data — do 'accounts' first, since the trial balance matches against the chart. The 'settings' contract lists the ALLOWLIST of fifteen settings an AI may propose, what each one means, its current value, and the settings an AI may never write, with the reason for each. An expense draft is filed with create_expense_draft; an invoice draft with create_invoice_draft; a bill draft with create_bill_draft; an ORDER you intend to place with a supplier ('purchase_order') with create_purchase_order_draft; a customer-payment ('receipt') draft with create_receipt_draft; a sales return or allowance ('credit_note') with create_credit_note_draft; an ADDITIONAL CHARGE on an invoice you already issued ('sales_debit_note') with create_debit_note_draft; an ADJUSTING JOURNAL — an accrual, a prepayment, a correction, a year-end adjustment or the REVERSING entry that fixes a wrong posted entry ('journal') with create_journal_draft; a bank statement is imported with import_bank_statement (its rows land in Banking → Review). Nothing posts on its own — the user reviews everything in Taokeh.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_type | No |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description reinforces this by stating 'Nothing posts on its own'. It adds context about workspace grounding and the content of each contract variant, though it does not cover error conditions or prerequisites. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and then systematically maps doc_types to actions. It is somewhat verbose but every sentence adds value given the tool's complexity; slight trim could improve readability without losing 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?
Given no output schema, the description covers the contract contents (required fields, totals, SST, worked example) and special cases like settings allowlists. It is complete for operational use, though it does not define the exact JSON structure of the returned contract.
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 sole parameter doc_type has no schema enum or description, but the text exhaustively lists valid values with explanations and defaults, fully compensating for the 0% schema coverage and adding concrete 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?
The description clearly states it provides 'the shape a Taokeh document needs' for various documents, distinguishing it from sibling create_*_draft tools by focusing on the contract/schema rather than submission.
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 details which doc_type values correspond to which business scenarios, maps each to a specific draft creation tool (e.g., create_expense_draft), and emphasizes that nothing posts automatically, giving the agent clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
low_stockLow stockARead-onlyInspect
Which products are at or below their reorder point right now — the "what do I need to reorder" list. Each row: sku, name, on-hand quantity, reorder point and unit. Capped, with the true count so you know if more exist. Uses the same rule as the dashboard low-stock chip (reorder point set AND on-hand ≤ reorder point). If this workspace uses Counter (the till), quantities are as at the last day-close: counter sales move stock once, when the day is closed, so an open trading day shows more on hand than the shelf does.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint annotation by disclosing that the response is capped but includes a true count to indicate additional records exist. It also reveals the behavioral impact of Counter mode, where sales are only posted at day-close, thus affecting the accuracy of on-hand quantities during the trading day. This is valuable, non-obvious context that annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each earning its place. The first sentence states the purpose, the second explains the rule and capping, and the third covers the Counter nuance. It is front-loaded, concise, and free of redundant phrasing.
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?
Considering the lack of an output schema and the tool's moderate complexity, the description is remarkably complete. It explains the exact low-stock rule, the output fields, the capping behavior with a true count, and the counter day-close caveat. Together these cover the important behavioral aspects without needing additional documentation.
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?
With zero parameters and 100% schema coverage, there is no parameter ambiguity. The description adds value by detailing the output row fields (sku, name, on-hand quantity, reorder point, unit), which clarifies the return data. This aligns with the baseline of 4 for no-parameter tools, as the description enriches understanding beyond the empty 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 clearly states the tool's purpose: identifying products at or below their reorder point, framed as the 'what do I need to reorder' list. It specifies the resource (products) and the exact condition, making it a specific and distinguishable query. Although it doesn't explicitly contrast with sibling tools like stock_level, the focused reorder-point scope provides strong 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 clear context for when to use the tool, such as reordering decisions, and aligns its rule with the dashboard's low-stock chip. It also explains the Counter mode caveat, which informs the user about data freshness. However, it does not explicitly state when not to use it or name alternative tools, so it falls short of a perfect 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
my_workMy workAInspect
YOUR OWN QUEUE in this workspace, in one call — what you filed and what happened to it. Answers four questions: (1) PENDING — everything of yours still waiting on the owner's approval, across every lane (expense, invoice, bill, quote, receipt, contact, credit note, debit note, purchase order, adjusting journal, your bank-category proposals), each with its reference, party, amount, how many days it has waited, and the exact next step in words plus the owner's review link; (2) APPROVED — what the owner approved since since (default: the last 7 days) and WHAT IT BECAME, with the posted document's own reference, so you can say "that one is now invoice INV-0042"; (3) REJECTED — what the owner or the engine refused, with the reason VERBATIM whenever one is stored. Every reject door in Taokeh offers the owner an optional "Why?" box, and staged migration rows carry the engine's own refusal text; where a reason is present, reason holds those exact words and reasonRecorded is true — READ IT and fix precisely what it names rather than re-filing the same thing. The box is never compulsory, so a refusal with an empty box reports reason: null and reasonRecorded: false; read that as "unknown", ask the owner what was wrong, and do NOT guess why before re-filing; (4) STAGED — your migration work (historical documents, opening balances, master data) sitting at a commit door. Params: since (YYYY-MM-DD or ISO, optional), kind (optional single-lane filter), limit (default 50, max 200 — every bucket reports total, returned and an honest truncation note; nothing is silently dropped). READ-ONLY. It changes nothing, it cannot approve anything, no tool can approve on the owner's behalf, and no tool of any kind moves money — every pending item is one human tap in Taokeh.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| limit | No | ||
| since | No |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description claims 'READ-ONLY' and 'It changes nothing,' but the annotations declare readOnlyHint=false, which implies the tool may modify state. This is a direct contradiction between the description and structured metadata, severely undermining trust. Despite rich behavioral detail otherwise, the contradiction forces a score of 1 per scoring rules.
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 lengthy but front-loaded with purpose and structured by the four questions. Every sentence adds value for an agent, though some repetition (e.g., 'READ-ONLY' stated multiple times) could be trimmed. For the complexity of the tool, it strikes a reasonable balance.
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 is provided, so the description must convey return structure. It does so thoroughly: pending items include reference, party, amount, days waited, next step, and review link; approved items include what they became; rejected items include verbatim reason and reasonRecorded flag; staged items cover migration work. Pagination and truncation are also documented.
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 0%, so the description must fully compensate. It explains all three parameters: `since` (optional, YYYY-MM-DD or ISO), `kind` (optional single-lane filter), and `limit` (default 50, max 200, with truncation honesty). It also adds context about what `kind` values correspond to the four buckets. This exceeds the baseline and provides actionable 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 identifies the tool as returning the user's own queue in a workspace, answering four specific questions (pending, approved, rejected, staged). It distinguishes itself from 40+ sibling tools by being the personal queue aggregator for all document types.
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 explicitly states when to use this tool (to see your own queue) and what it does not do: 'READ-ONLY. It changes nothing, it cannot approve anything, no tool can approve on the owner's behalf, and no tool of any kind moves money.' It also explains that every pending item requires human action, guiding the agent not to attempt approvals.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_invoicesOpen invoicesARead-onlyInspect
The unpaid (or part-paid) invoices for one customer, oldest first — search by customer name.
| Name | Required | Description | Default |
|---|---|---|---|
| customer | Yes |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already signals a safe read operation. The description adds that results are unpaid/part-paid, oldest first, and filtered by customer name. It does not describe returned fields, but with annotations covering safety, this is acceptable.
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 a single, front-loaded sentence with no filler. Every phrase adds value: unpaid/part-paid, one customer, oldest first, search by 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 simple one-parameter, read-only tool with no output schema, the description sufficiently covers scope, ordering, and search key. It does not enumerate return fields, which might be useful but is not critical for tool selection.
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 has zero description coverage for the single 'customer' parameter. The description compensates by explaining it is a customer name, which is essential for correct invocation and adds meaning beyond the raw schema type.
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 it returns unpaid/part-paid invoices for a single customer, ordered oldest first, searchable by customer name. This distinguishes it from aggregate tools like ar_aging or search_documents.
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 use when needing open invoices for one customer and specifies search by customer name. It does not explicitly name alternative tools or exclusion scenarios, but the scope is clearly constrained to a single customer, providing adequate context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
payer_historyPayer historyARead-onlyInspect
How this workspace has treated a given bank counterparty (a payer or payee, named as printed on the statement line) before: the historical bank rows a human already CONFIRMED or POSTED for that name — grouped by category, contact and GL account, with a count, date range and total amount each — plus the live suggestion Taokeh's learned memory would now make for it. This is the tenant-scoped PRECEDENT behind a suggestion, so you can explain WHY a row is being categorized a certain way. READ-ONLY; the owner still confirms every categorization in Taokeh.
| Name | Required | Description | Default |
|---|---|---|---|
| counterparty | Yes |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly declares READ-ONLY and explains it returns grouped historical data plus a learned suggestion, adding context beyond the annotations. It also clarifies the owner's confirmation role, which is useful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, well-structured, and front-loaded with the core purpose. Every sentence contributes specific value without 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?
Despite lacking an output schema, the description details the response structure (grouped by category, contact, GL account, with counts, date range, and totals) and the intended use case, making it self-contained for an agent.
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?
With 0% schema description coverage, the description compensates by defining 'counterparty' as a payer or payee named as printed on the statement line, giving clear meaning to the single 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 clearly states the tool shows historical bank rows for a given counterparty, including grouping by category/contact/GL account and a live suggestion. It distinguishes itself by explaining it provides tenant-scoped precedent behind a suggestion.
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 conveys a clear use case: explaining why a row is being categorized a certain way based on historical precedent. While it implies when to use it, it does not explicitly name alternatives or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
payroll_summaryPayroll summaryARead-onlyInspect
A month's payroll from gross to net, as it was actually run: total gross (basic, allowances, overtime, public-holiday pay and any bonus), what was deducted from staff (EPF, SOCSO, EIS, SKBBK, PCB/MTD, zakat), what the employer contributed on top (EPF, SOCSO, EIS, HRD Corp levy), the total net pay, and the employer's TRUE total cost for the month — wages plus every employer contribution. Also lists who is on approved leave in the next 14 days, so "what does payroll look like this month" and "who is out next week" are one call. With no month it reads the latest FINALIZED or POSTED run; give a month as YYYY-MM for a specific one. Set perEmployee: true for the per-person breakdown — those are individual salaries, so ask for them only when the user actually wants them. Every figure is a sum of the STORED payslips of that run — the same numbers the staff were paid on and the payroll journal was posted from — never a recalculation. If nothing has been run, it says so plainly rather than returning a month of zeros. ADMIN ONLY: payroll sits behind its own seat in Taokeh and this tool refuses on any other connection. READ-ONLY — it cannot create a run, pay anybody, or file anything with LHDN, KWSP or PERKESO.
| Name | Required | Description | Default |
|---|---|---|---|
| month | No | ||
| perEmployee | No |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false. The description adds substantial behavioral context: the tool returns stored payslip figures never recalculated, refuses on non-admin connections, and plainly says if nothing has been run. It also clarifies it cannot create runs, pay anyone, or file with government agencies, exceeding what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is informative and front-loaded, starting with the core payroll purpose. It is moderately lengthy but every sentence adds value. Minor redundancy: the 'READ-ONLY' near the end repeats the annotation, but still useful for emphasis. Could be slightly more concise without losing meaning.
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 has high complexity (payroll with many components, different runs, per-employee data), and no output schema, the description thoroughly explains what is returned (gross components, deductions, employer costs, leave data) and behavior (stored figures, admin only, read-only). It covers edge cases (empty month defaults, nothing-run message) completely.
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 0%, so the description must compensate fully. It does so by explaining `month` is an optional YYYY-MM string, and `perEmployee` is a boolean for per-person breakdowns. It adds semantics by noting the default behavior for `month` and the privacy/prudence warning for `perEmployee`. The description makes both parameters clear despite no schema 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 clearly states the tool provides a month's payroll from gross to net, including specific components and employer costs. It distinguishes itself by also listing who is on approved leave in the next 14 days, making it clear this tool covers both 'what does payroll look like this month' and 'who is out next week' in one call.
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 provides explicit when-to-use guidance: without `month` it reads the latest FINALIZED or POSTED run; with `month` as YYYY-MM it fetches a specific month. It warns to use `perEmployee: true` only when the user actually wants per-person breakdowns. It also states it is READ-ONLY and ADMIN ONLY, clarifying when not to use it versus create or admin tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
profit_driversProfit driversARead-onlyInspect
The DIAGNOSTIC breakdown of WHY net profit moved — deterministic, not a model's arithmetic. Compares the current month-to-date against the SAME day-span of the previous month (day 1 through min(today's day, the prior month's last day)), so a partial month is never compared against a full one. Returns: the net-profit figure for both windows and the delta; a drivers bridge (revenue delta, COGS delta, then the operating-expense accounts that moved most — top 5 by absolute change plus an other roll-up); oneOffs (disposal and FX gains/losses, pulled out of the movers so a lumpy asset sale doesn't read as an operating trend — empty if you have no such accounts); the prior month's FULL-month net profit as a stated secondary reference (priorMonthFull); and an assumptions list. Each driver's direction is its effect on PROFIT ('improving'/'worsening'/'flat'). All amounts are integer CENTS (RM = cents ÷ 100). Optional month (YYYY-MM) picks a month other than the current one — a completed past month compares its whole length; omit for the current month-to-date.
| Name | Required | Description | Default |
|---|---|---|---|
| month | No | Month to analyse, YYYY-MM. Omit for the current month-to-date. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only annotation, the description adds rich behavioral details: deterministic computation, specific period comparison, handling of one-offs, cents units, and behavior for optional month. This goes well beyond what annotations convey, giving the agent a thorough understanding of the tool's 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?
The description is long but every sentence adds value, covering purpose, methodology, return fields, and parameter semantics. It is front-loaded with the core purpose and structured logically, making it easy to process despite its length.
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 thoroughly explains all return components, units, and the behavior of the optional month parameter. It is complete for a tool of this complexity, covering all necessary context for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single optional parameter, but the description adds meaningful behavior beyond the schema: it explains that for a completed past month, the whole month is compared, and for the current month it uses month-to-date. This enriches the parameter's 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?
The description clearly states it is a diagnostic breakdown of why net profit moved, using specific verbs and a defined resource. It also distinguishes itself from sibling tools by emphasizing the deterministic comparison logic and the focus on profit drivers, which is unique among the listed 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 provides clear context for when to use the tool, explaining the comparison methodology and return values. However, it does not explicitly mention when not to use it or point to alternative tools (e.g., income_statement), so the guidance is strong but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_attachment_uploadRequest attachment uploadAInspect
Get a one-time link to upload a receipt/bill/statement/document that is too large to inline as attachmentBase64 (a real photo or a multi-page PDF — base64 inside a tool call is very costly). Returns an uploadUrl and an attachmentToken: PUT the file's RAW bytes to uploadUrl within the time limit, then pass attachmentToken IN PLACE OF attachmentBase64 to create_expense_draft / create_invoice_draft / create_bill_draft / create_quote_draft / create_receipt_draft / create_contact_draft / create_journal_draft — the file rides that draft and lands on the posted document on approval, exactly as an inline attachment does — or to import_bank_statement, which archives it as the statement's original. CALL THIS FIRST, BEFORE the create/import call: filing bare and adding the file after is the harder path. If you DID already file bare, the repair on the five document lanes (expense, invoice, bill, quote, receipt) is to call the same create tool AGAIN with the IDENTICAL reference + date + amount plus attachmentToken — while the draft is still pending the file is ADOPTED onto it (the result says duplicateAttachment:'added') and no second draft is created; the same repair works on import_bank_statement with the identical account, balances and rows. The link is single-use, expires quickly, and works only for this workspace. Use this for anything bigger than a few KB; keep attachmentBase64 for tiny files only.
| Name | Required | Description | Default |
|---|---|---|---|
| filename | No | Optional original filename, e.g. receipt.jpg — travels with the upload and shows on the review card. | |
| mediaType | No | Optional hint of the file's MIME type, e.g. 'image/jpeg'. Advisory only — the server determines the real type from the file's own bytes (magic bytes), so a wrong hint changes nothing. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description transparently discloses behavioral traits: the link is single-use, expires quickly, workspace-specific, and the server determines the real MIME type from file bytes despite a provided hint. It explains how the attachmentToken works with various draft creation tools and what happens on approval. Annotations (readOnlyHint=false, etc.) are consistent, and the description adds significant context beyond them.
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 primary purpose and use case, but it becomes quite verbose with detailed workflow instructions, alternative scenarios, and repair logic. While all information is valuable, a more structured format (e.g., sections or bullet points) could improve readability. It is not wasteful, but could be more concise.
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 complexity (0 required parameters, no output schema, multiple downstream integrations, and a non-trivial workflow), the description is remarkably complete. It covers the return values (uploadUrl, attachmentToken), the exact usage sequence, error recovery, and constraints. Everything an agent needs to use 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 coverage is 100%, and the schema already provides clear descriptions for both 'filename' and 'mediaType'. The description adds minor reinforcement (e.g., filename shows on review card, mediaType is advisory) but does not substantially increase understanding beyond what the schema already communicates. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: obtaining a one-time upload link for large files (receipts, bills, etc.) that are too costly to inline as base64. It distinguishes this from the alternative inline approach and explicitly lists the downstream tools that accept the returned token, making its role unambiguous among 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 provides explicit when-to-use guidance (for files larger than a few KB) and when-not-to-use (keep base64 for tiny files). It prescribes the invocation order (call this first, before the create/import call) and warns against filing bare. It also explains the repair path if the order is violated, giving agents concrete instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_customerFind customerARead-onlyInspect
Resolve a customer name for an invoice draft against this workspace's real customers. Statuses: resolved (with id + current outstanding A/R balance — the credit-check-in-chat moment), ambiguous (with candidates), or none. When there is no exact/prefix match but existing customers look CLOSE (nearMiss:true), the name is likely salesperson shorthand for one of them ("JJ Dungun" for "PERNIAGAAN JJ") — ask the user which one; only file as new if they confirm it is genuinely new. Never guess among candidates — ask the user.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description details important behaviors: statuses returned, the 'credit-check-in-chat' moment (A/R balance), nearMiss detection, and the instruction to always ask the user rather than guessing among candidates. This fully discloses the tool's decision logic.
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 appropriately sized and well-structured, starting with a clear purpose, then detailing statuses and edge-case handling. Every sentence adds value, including the nearMiss example and the imperative 'Never guess among candidates — ask the user.'
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 tool with no output schema, the description is complete: it explains the resolution statuses, the nearMiss behavior, and what action to take (ask user) vs. what not to do (guess). The agent has enough information to invoke and interpret the tool 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?
With 0% schema description coverage, the description compensates by contextualizing the single 'name' parameter as the customer name to resolve, including an example of a shorthand variant. It adds practical meaning beyond the bare schema field, though it doesn't provide exhaustive format rules.
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 ('Resolve') and resource ('customer name for an invoice draft'), clearly distinguishing it from sibling tools like resolve_product and resolve_vendor. It also outlines the statuses (resolved, ambiguous, none), making the tool's function unmistakable.
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 use — resolving customer names during invoice drafting — and provides explicit decision rules for handling near misses (ask the user, don't guess). It doesn't explicitly name alternative tools, but the context and examples offer sufficient guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_productFind productARead-onlyInspect
Resolve a product by name or SKU for an invoice line. Returns id, sku, name, unit and the default sell price the form would use. Plain names or SKUs work best. Statuses: resolved / ambiguous (candidates) / none — never guess among candidates.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses return fields (id, sku, name, unit, default sell price), statuses (resolved/ambiguous/none), and the critical rule 'never guess among candidates.' This goes well beyond the readOnlyHint annotation by explaining how ambiguity is handled.
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 sentences with no fluff: purpose, return values, and behavior. It is front-loaded with the core action and immediately useful details.
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 lookup tool with one parameter and no output schema, the description is complete. It specifies input semantics, output fields, statuses, and a safety rule against guessing, making the tool's behavior fully transparent.
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?
With 0% schema description coverage, the description fully compensates by explaining that 'query' accepts a product name or SKU, and that plain forms work best. This gives the agent the semantic meaning needed to invoke the tool correctly.
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 'Resolve a product by name or SKU for an invoice line,' using a specific verb and resource. It distinguishes from sibling tools like resolve_customer and resolve_vendor by explicitly targeting products.
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 'for an invoice line' provides clear usage context, and 'Plain names or SKUs work best' offers practical input guidance. However, it does not explicitly name alternatives or state when not to use this tool, 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.
resolve_vendorFind vendorARead-onlyInspect
Resolve a supplier / vendor name for a bill draft against this workspace's real vendors. Statuses: resolved (with id), ambiguous (with candidates), or none. When there is no exact/prefix match but existing vendors look CLOSE (nearMiss:true), the name is likely shorthand for one of them — ask the user which one; only file as new if they confirm it is genuinely new. Never guess among candidates — ask the user.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, but the description goes beyond by detailing the three possible statuses (resolved, ambiguous, none), the nearMiss flag, and the explicit instruction to ask the user rather than guess. This adds significant behavioral context beyond what annotations provide, without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, all dense with useful information: purpose, statuses, nearMiss handling, and a clear rule against guessing. No filler or redundancy; 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 only one parameter, no output schema, and annotations present, the description fully explains the tool's behavior: statuses returned, nearMiss semantics, how to proceed when close matches exist, and the instruction to ask the user. This is complete for the tool's purpose and complexity.
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 has one required string parameter 'name' with no description (0% coverage). The description does explain that 'name' is the supplier/vendor name to resolve, providing basic semantics. However, it does not add details like matching behavior (exact/prefix), case sensitivity, or formatting. For a simple single parameter, this is adequate but not rich.
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 precisely states the action: 'Resolve a supplier / vendor name for a bill draft against this workspace's real vendors.' This clearly identifies the verb, resource, and scope, and distinguishes it from sibling tools like resolve_customer and resolve_product by focusing on vendors.
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 provides clear context on when to use (for a bill draft) and detailed conditional guidance: ask the user on nearMiss, only file as new after confirmation, and never guess among candidates. It does not explicitly name alternatives or state when not to use, but the vendor-specific scope and decision rules give strong usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
revise_draftRevise a pending draftAInspect
Correct a draft you already filed, instead of filing it again. Pass the draft's kind and id plus a patch of just the fields that were wrong — the server re-validates them exactly as it did at filing (same account rules, same date rules, same line derivation, same totals) and updates the draft in place. Use this whenever you realise a filed draft is wrong: for an expense, re-calling create_expense_draft with corrected fields is refused as a duplicate of the very draft you are trying to fix, and for every kind a second create files a CONFUSING SECOND DRAFT the human then has to notice and reject — revise the one you filed instead. ONLY a PENDING draft can be revised; a draft the user has already approved or rejected (or one that has expired) is refused, naming its status — file a fresh draft in that case. Fields you do not send are left exactly as filed. REVISING DOES NOT APPROVE ANYTHING: the draft stays pending, nothing posts, and the human still taps Approve in Taokeh — the same one-tap link from the original filing still works and shows the revised figures. The reviewer is TOLD it changed: a short 'revised by your AI' line naming the changed fields is appended to the note they read on the approval card, so add a plain-language note saying WHY you revised it.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | Which kind of draft to amend — the same ten kinds the create_*_draft tools file. 'sales_debit_note' is the SELL-side debit note create_debit_note_draft files (an additional charge on an invoice you issued); 'journal' is the adjusting entry create_journal_draft files. | |
| note | No | A SHORT plain-language reason for the revision, in the reviewer's language — 'the paid-from account should be the owner's capital account, not petty cash'. It is APPENDED to the note they already have (nothing is overwritten) and shows on the approval card. Keep it to a sentence. | |
| patch | Yes | Only the fields you are correcting. Every key must belong to this draft kind — a misspelled or foreign key is refused rather than silently ignored. The card IMAGE of a contact draft and the original document riding any other draft are deliberately NOT patchable: they are the evidence the approver checks your fields against. | |
| draftId | Yes | The draftId the create_*_draft call returned. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no meaningful annotations (all hints false), the description carries the full burden and delivers rich behavior: 'updates the draft in place', 'Fields you do not send are left exactly as filed', 'REVISING DOES NOT APPROVE ANYTHING... stays pending', and the reviewer is told it changed via an appended note. This goes far beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph but every sentence adds necessary information: purpose, duplicate pitfalls, status restriction, no-approval behavior, and reviewer notification. It is long but not bloated; a lightly structured layout would improve scannability, but the content is efficient.
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 complexity of the patch object and the lack of an output schema, the description is remarkably complete. It covers the re-validation rules, unsent-field behavior, approval status constraints, and the note mechanism. The agent can safely select and invoke this tool without asking for clarifications.
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 adds important semantics beyond bare schema: patch keys must belong to the draft kind ('a misspelled or foreign key is refused rather than silently ignored'), the card image is not patchable, and the note is appended, not overwriting. This elevates it above the schema-only 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 opens with 'Correct a draft you already filed, instead of filing it again' and later 'updates the draft in place'. The verb 'revise' is specific to the resource (pending draft) and the description explicitly contrasts with calling create_*_draft again, distinguishing it from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use: 'Use this whenever you realise a filed draft is wrong', and gives alternatives: 're-calling create_expense_draft ... is refused as a duplicate' and 'a second create files a CONFUSING SECOND DRAFT'. It also specifies when not to use: 'ONLY a PENDING draft can be revised ... file a fresh draft in that case'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sales_summarySales summaryARead-onlyInspect
How much you have sold. With no dates: today and this month so far. With a date range: the invoiced sales for that period, broken down by month, customer and product.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ||
| from | No |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context beyond the readOnlyHint annotation by explaining how the absence or presence of date parameters changes the output, and by specifying the grouping dimensions. It does not describe return structure, but it provides meaningful behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise, front-loaded sentences. The first states the purpose, the second explains parameter behavior and output breakdown. Every word 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?
Given the tool has no output schema and only two optional parameters, the description covers the essential behavior: what is returned and how date ranges affect it. It could specify whether the breakdown is separate or combined, but for a summary tool this is sufficiently 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 0% (no descriptions for 'from' and 'to'), so the description must compensate. It does so by explaining the effect of date ranges vs. no dates. It implicitly maps the parameters to the range, giving them semantic meaning beyond the schema's basic format.
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 'How much you have sold' and specifies it covers invoiced sales, distinguishing it from other financial reports. It also mentions the breakdown dimensions (month, customer, product), making its purpose 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?
The description gives clear guidance on usage: with no dates it shows today and this month, with a date range it shows the period's sales. It does not explicitly mention alternatives or when not to use, but the context is sufficient for selecting the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_documentsSearch documentsARead-onlyInspect
Find invoices, credit notes, sell-side debit notes, quotes, delivery orders, bills, buy-side debit notes and purchase orders by any combination of: doc number (partial), party (customer/vendor) name (partial), date range, amount range, and doc type. Returns compact rows (docId, type, number, date, party, total, status), newest first, capped — with a more flag when there are further matches to narrow down. Invoices, credit notes, bills and quotes also report whether their ORIGINAL document (a scan or upload) is on file: hasAttachment plus an attachments list you can fetch with get_attachment. Delivery orders and purchase orders omit that field because they cannot carry an original. INVOICES, CREDIT NOTES and SELL-SIDE DEBIT NOTES (sales_debit_note — additional charges this business added to an invoice it issued; not to be confused with debit_note, the buy-side one raised against a supplier bill) also carry an einvoice field — this business's MyInvois posture for that document AS RECORDED IN TAOKEH: validated (a MyInvois validation is recorded here, with uuid + validatedAt), consolidated (covered by a consolidated e-invoice, which holds the uuid — the individual document has none by design), platform (a marketplace sale: Shopee/TikTok Shop/Lazada issues the e-invoice, nothing for this business to submit), exported (put into a MyInvois batch export from Taokeh, nothing recorded back yet) or none. Taokeh CANNOT see the MyInvois portal, so say "no validation recorded in Taokeh" — never "never submitted to LHDN". Bills and buy-side debit notes omit the field. Use the docId with get_attachment (the SOURCE document someone filed) or get_document_pdf (the PDF Taokeh generates).
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ||
| from | No | ||
| party | No | Partial customer or vendor name (case-insensitive contains). | |
| number | No | Partial doc number / reference (case-insensitive). | |
| docType | No | Restrict to one type: 'invoice','credit_note','sales_debit_note','quote','delivery_order','bill','debit_note','purchase_order'. Omit for all. NOTE the two debit notes: 'sales_debit_note' is one this business ISSUED to a customer (additional charges on an invoice — money owed TO this business); 'debit_note' is the BUY side, issued to a supplier against a bill. | |
| maxAmount | No | ||
| minAmount | No |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true and openWorldHint=false. The description adds a wealth of behavioral detail: capping with `more` flag, field omission rules per doc type, e-invoice status semantics, and the critical MyInvois visibility limitation. All of this is consistent with the annotations—the capping is presented as self-aware via `more`, preserving completeness semantics.
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 long, but every sentence carries useful information for a multifaceted search tool. It is front-loaded with the search purpose, then organized into result rows, attachments, and e-invoice semantics. Slightly verbose, but the complexity justifies the length.
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 7 parameters and no output schema, the description covers nearly everything an agent needs: return format, ordering, cap behavior, attachment availability by doc type, e-invoice state details, and how to chain to get_attachment/get_document_pdf. It even includes a caveat about Taokeh's inability to see MyInvois. This is exceptionally 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 only 43% (party, number, docType have descriptions; to, from, minAmount, maxAmount do not). The description compensates fully by explicitly identifying to/from as a date range, min/maxAmount as an amount range, and by adding partial/case-insensitive semantics for party and number. It also clarifies docType values and distinguishes the two debit notes.
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 'Find invoices, credit notes, ...' naming eight distinct document types and all filter dimensions, making it unmistakably clear what the tool does. It also lists the exact return fields (docId, type, number, date, party, total, status), which helps distinguish it from sibling search tools like search_expenses or get_document_pdf.
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 usage context: which doc types exist, how filters combine, the meaning of the `more` flag, and explicit pointers to get_attachment/get_document_pdf for follow-up. It also warns against saying 'never submitted to LHDN' because Taokeh cannot see the portal. However, it does not explicitly contrast with sibling search tools such as find_in_taokeh or search_expenses, so it lacks 'when not to use' guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_expensesSearch paid expensesARead-onlyInspect
Search PAID EXPENSES already posted to the books (the /expenses ledger) by any combination of: reference (partial), text in the memo/description (partial), date range, amount range, and category account. Returns compact rows (expenseId, date, amount, category account code + name, memo, reference), newest first, capped — with a more flag. Every row also says whether the ORIGINAL RECEIPT is on file: hasAttachment plus an attachments list (filename, media type, size) — an empty list means genuinely no receipt is attached, not "unknown". To read one, pass the row's expenseId and attachmentId to get_attachment. ALWAYS check here BEFORE filing an expense draft (create_expense_draft): if the same receipt is already booked, filing again would double-book it. search_documents does NOT cover paid expenses — this tool is the only way to see them.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ||
| from | No | ||
| text | No | Partial text to match in the expense memo/description (case-insensitive contains). | |
| maxAmount | No | ||
| minAmount | No | ||
| reference | No | Partial supplier/receipt reference (case-insensitive contains). | |
| accountCode | No | Restrict to one expense category by its account code (exact). |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite readOnlyHint and openWorldHint annotations, the description adds rich behavioral detail: newest-first ordering, capping with a 'more' flag, the exact meaning of hasAttachment/attachments (empty list means genuinely no receipt, not unknown), and the ledger context. This goes well beyond annotations without contradiction.
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 long but every sentence adds value: filters, return format, attachment flag semantics, usage guidance, and sibling differentiation. No filler or repetition; it is dense yet structured.
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 7 parameters and no output schema, the description explains return rows, fields, ordering, flags, attachment behavior, and the critical workflow check. It is fully self-sufficient for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 43%, and although schema provides descriptions for text, reference, and accountCode, it lacks descriptions for date/amount range parameters. The description compensates by explicitly listing all filter dimensions (reference, text, date range, amount range, category account) and adds semantics like partial matching and exact account code. It doesn't name each parameter but conceptually covers 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?
Description specifies a precise verb ('Search') and resource ('PAID EXPENSES already posted to the books'), lists exact filter dimensions, and distinguishes itself from search_documents and expense drafts. Unambiguous and specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool: 'ALWAYS check here BEFORE filing an expense draft' to avoid double-booking, and clarifies search_documents does NOT cover paid expenses, making this the only way. Clear alternatives and exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_journalSearch journal entriesARead-onlyInspect
Search the general ledger's JOURNAL ENTRIES — every posting, whatever door created it (a manual journal, a scanned receipt, an invoice, a bank row, a paid expense, payroll, depreciation…). Returns each entry WITH its balanced lines (account code + name, debit, credit, line description), so you can see exactly HOW something was booked, not just that it exists. Filter by any combination of: date range, text (case-insensitive, matched against the entry memo AND its line descriptions), accountCode (entries touching that account), source (the door that created it), and an amount range on the entry's total debits. Give at least one filter — this never dumps the whole ledger. Newest first, capped, with a more flag. Pairs with search_expenses for reconciling: search_expenses shows what the /expenses register holds, search_journal shows every ledger entry including journal-era postings the register never covered. Read-only — it changes nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ||
| from | No | ||
| text | No | Partial text matched against the entry memo AND its line descriptions (case-insensitive contains). | |
| source | No | The door that created the entry (exact, case-insensitive). One of: MANUAL, SALE, PURCHASE, ADJUSTMENT, BANK, CREDIT_NOTE, DEBIT_NOTE, PAYROLL, IMPORTED_SERVICE, FX_REVAL, DEPRECIATION, ASSET_DISPOSAL, EXPENSE, LOAN, REVENUE_RECOGNITION, ASSET_ACQUISITION, BANK_OPENING. Omit for all. | |
| maxAmount | No | Maximum entry size, measured on the entry's total debits (MYR). | |
| minAmount | No | Minimum entry size, measured on the entry's total debits (MYR). | |
| accountCode | No | Restrict to entries that have a line on this account code (exact). |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description adds substantial behavioral context: it returns entries with balanced lines, is capped with a 'more' flag, orders newest first, and explicitly states it changes nothing. This goes beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence serves a purpose: purpose, return format, filter options, usage constraints, ordering, sibling differentiation, and read-only assurance. It is well-structured and front-loaded with the core 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?
Given the tool has no output schema, the description fully discloses return values (balanced lines, more flag). It covers all major aspects: filters, behavior, limits, and relationship to siblings, making it highly complete for a complex 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 71%, and the description fills gaps for date range, case-insensitive text matching, accountCode semantics, source concept, and amount range on total debits. It adds meaning beyond the schema, especially for 'from' and 'to' which lack 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 clearly states the tool searches the general ledger's journal entries, with a precise verb and resource. It distinguishes itself from siblings, especially search_expenses, by emphasizing that it returns balanced lines and covers all entry sources.
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 search_journal vs search_expenses for reconciling, and states the requirement to provide at least one filter to avoid dumping the entire ledger. This gives clear context and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stage_documentStage a historical documentAInspect
Bring ONE already-issued historical document (a sales invoice, or a supplier bill) across from the system this workspace is migrating FROM. This is the BULK migration door and it is NOT create_invoice_draft: nothing is posted, nothing is drafted for individual approval, and no approval card is raised per document. Staged documents group into monthly batches the owner reviews and approves together at /switch/documents. Use it ONLY for documents that were genuinely issued in the old system (or written in a paper book) — a NEW document belongs in create_invoice_draft / create_bill_draft. The lane must be OPEN (the owner turns it on at /switch → "Bring over your documents") and it can only be open before the books are locked; if it is closed the call is refused with instructions. IDEMPOTENCY IS ON sourceDocId: staging the same sourceDocId again UPDATES that pending row instead of filing a second one. Once the owner has ENTERED it, or deliberately LEFT IT OUT, nothing you send can change it, re-book it or bring it back — only the owner can. So re-running your whole export is always safe. THE CUTOVER: bring over only documents dated AFTER the workspace's accounting start date. Anything dated on or before it is already carried by the owner's opening balances, and Taokeh will flag it and refuse to enter it — staging those wastes both our time, so filter them out of your export if you can. ORDER MATTERS: stage the SUPPLIER BILLS for a period before the sales invoices for it, because Taokeh works out cost of sales from the stock that was bought. The server re-computes every quantity and the grand total from the lines (with SST); your own printed total goes in sourceTotal and is used ONLY to show the owner a tie against the server's figure. Anything the server cannot settle — a product that does not resolve, a customer name matching several contacts, a printed total that disagrees — is staged anyway, FLAGGED, and held out of bulk approve for the owner to open individually. The document keeps its ORIGINAL number (reference) and its ORIGINAL date, and posts marked as historical so Taokeh never e-invoices or chases it.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | ||
| notes | No | A SHORT note for the owner about this document — one or two sentences naming anything they should check. Not a place for lengthy reasoning. | |
| party | No | The customer (sales invoice) or supplier (purchase bill) name as printed. Matched against the existing contacts; a name matching several, or one that looks like shorthand for an existing contact, is flagged for the owner rather than guessed. Omit for a walk-in cash sale with no named customer. | |
| docDate | Yes | The date the document was ORIGINALLY issued, YYYY-MM-DD. Never today unless it really was today — the whole point is that these documents keep their real dates. | |
| docKind | Yes | 'sales_invoice' = an invoice this workspace ISSUED to a customer. 'purchase_bill' = a bill a supplier issued TO this workspace (inventory lines only, same rule as create_bill_draft). Other kinds are not supported yet. | |
| partyId | No | The Taokeh customer/vendor id, when you already resolved it with resolve_customer / resolve_vendor. Wins over `party`. | |
| reference | No | The document number exactly as printed in the old system (e.g. INV1603). Taokeh keeps it, so the customer's copy and yours still match. It must be unique in this workspace: a number already on the books is refused by name. Leave it out only if the document genuinely has no number, and Taokeh will mint one. | |
| needsReview | No | Set true when you want the owner to look at this one specifically. It is then held out of bulk approve and gets its own door. | |
| sourceDocId | Yes | The id this document has in the system you are migrating FROM — the primary key, row id or export id. THIS IS THE DEDUPE KEY: staging the same sourceDocId twice updates one row instead of booking the document twice, which is what makes re-running your export a no-op. If the old system has no id, use the document number, but use it consistently across the whole export. | |
| sourceTotal | No | The grand total PRINTED on the source document. Advisory only — Taokeh re-derives its own figure and shows the two side by side, so the owner can see a whole batch tie to the old system's report. Send it whenever the paper states one; it is the single most useful check in the whole migration. | |
| paymentMethod | No | 'CREDIT' (default) = it was on account, so it carries into receivables/payables. 'CASH' = it was settled at the counter. Get this right: it decides whether the document leaves a balance behind. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses many behavioral traits: idempotency on sourceDocId, server recalculation of totals, flagging of unresolved items, and historical posting. However, annotations state idempotentHint=false, directly contradicting the description's claim that 'IDEMPOTENCY IS ON sourceDocId.' Per the rubric, a contradiction yields a score of 1.
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 lengthy but well-structured, with clear signposts like 'IDEMPOTENCY IS ON' and 'THE CUTOVER' to separate concerns. It front-loads the purpose and distinguishes from siblings early. Still, there is some redundancy (e.g., 're-running your whole export is always safe' restates idempotency), preventing a perfect score.
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 complex migration tool with 11 parameters and no output schema, the description covers preconditions, exclusions, ordering, idempotency, error handling, and the fate of staged documents (flagged vs. approved). It gives the agent enough context to use the tool correctly without needing to read other documentation.
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 91%, so the baseline is 3. The description adds some context (e.g., sourceTotal is advisory, sourceDocId is the dedupe key), but these points are already present in the schema's parameter descriptions. No significant new parameter-level meaning is introduced.
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 clear action: 'Bring ONE already-issued historical document... across from the system this workspace is migrating FROM.' It explicitly distinguishes itself from siblings like create_invoice_draft and create_bill_draft, labeling itself as the bulk migration door. This leaves no ambiguity about its scope.
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 provides explicit when-to-use and when-not-to-use guidance: 'Use it ONLY for documents that were genuinely issued in the old system... a NEW document belongs in create_invoice_draft / create_bill_draft.' It also covers preconditions (lane open), cutover date filtering, ordering of bills before invoices, and error refusal conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stage_master_dataStage master dataAInspect
Bring this workspace's MASTER DATA across from the system it is switching FROM: its CHART OF ACCOUNTS (every ledger code it keeps its books in), its PRODUCT CATALOGUE (every item it buys, stocks or sells, with the stock each was carrying at the cutover) or its CONTACT BOOK (every customer and supplier). Call intake_contract(doc_type: 'accounts' | 'products' | 'contacts') FIRST — it gives the exact fields, the rules and this workspace's own current counts. This WRITES NOTHING: the rows land on the owner's existing Import screens, where they confirm the columns and import them. THE UNIT IS THE WHOLE LIST: send every row of one kind in ONE call, and calling again for the same kind REPLACES the entire staged set rather than adding to it. Found a mistake? Send the corrected list in full. UNLIKE stage_opening_balances there is NO 'already imported' refusal, because master data is a CATALOGUE and not a ledger: the product upsert key is the SKU (an existing SKU is updated in place and ONLY the fields you actually sent are changed — a corrected three-field price list leaves its unit, barcode and buying-unit conversion untouched — its on-hand quantity is never touched by an import, and an opening quantity on a SKU that already exists is ignored), and contacts are de-duplicated case-insensitively by name — so staging a corrected list after an import is normal and double-counts nothing. OPENING STOCK IS THE ONE PART THAT TOUCHES THE BOOKS: a NEW SKU with both an opening quantity and a cost posts a real opening-stock journal entry (Dr Inventory / Cr Opening balance equity) when the owner approves, dated at this workspace's accounting start date while it is still migrating. Send the cutover quantity and the cutover cost, never a guess — a zero or missing cost still seeds the quantity but posts nothing. PRESENTATION FIELDS DO NOT MIGRATE: web addresses, storefront visibility and product images stay with the website, there is no field for them here, and you should TELL THE OWNER to keep those before the old system is switched off. Bill-of-materials links (combination SKUs built from components) are a separate sheet with their own review step and are NOT staged here — the owner uploads that sheet on the Import products page. Every contact row must say which side it is on (isCustomer / isVendor, or defaultRole for the whole list); Taokeh names any row that says neither straight back to you, so fix those before the owner sees the screen. THE CHART OF ACCOUNTS ('accounts') is the step to do FIRST, because the trial balance and every document afterwards land on its codes — and it is the quietest of the three: it writes NO journal line and carries NO figures, so opening balances still come across separately with stage_opening_balances(kind:'trial_balance'). Its key is the account CODE: an existing code is updated in place and keeps every posting attached to it, a new code is created, a code is never rewritten, and NOTHING IS EVER DELETED OR DEACTIVATED — an account missing from your list is simply left alone, so do not imply to the owner that it will disappear. A RENAME is always allowed on every account, including the ones Taokeh posts to automatically. A CHANGE OF TYPE OR NORMAL BALANCE IS REFUSED, row by row, on any account that already has postings or that a system role or bank account depends on, because it would silently restate reports the owner has already read and filed; intake_contract(doc_type:'accounts') marks exactly which accounts those are, so shape the list to avoid the refusal, and when a reclassification really is wanted, tell the owner the honest route — a new account plus a dated reclassification journal (create_journal_draft). THE WORKSPACE SETUP ('settings') is the LAST MILE: once the books are across, this is how the workspace itself stops being a form the owner types — its registered name, SSM registration number, TIN, address, state, statutory officer, the language it reads in, the measurement profile it prices by, and the date its books start. IT IS GOVERNED BY A STRICT ALLOWLIST OF FIFTEEN SETTINGS and nothing outside it can be created: call intake_contract(doc_type:'settings') for the list, each key's meaning, its current value, and the settings an AI may NEVER write — payment credentials (a secret is never AI-written), publishing a storefront and advertising consent (outward and consent acts the owner takes), the AI and legal terms acceptances (an AI must never accept terms on the owner's behalf, least of all its own), the books lock (a money-integrity control) and every e-Invoice setting (they change statutory filing behaviour and follow the owner's own LHDN status). Those are refused BY NAME with the reason so you can tell the owner what to set rather than retrying. SEND ONLY WHAT THE OWNER TOLD YOU OR WHAT THE OLD SYSTEM PRINTS — an inferred TIN, registration number or employer number passes this import and fails at LHDN months later on a document that has already gone out; a blank is honest. The accounting start date is the highest-consequence key (it defines what counts as before the books started) and is refused if the workspace already has posted entries dated earlier; the measurement divisor is a NUMBER, not a label. Nothing is ever cleared: a setting missing from your list is left alone, and a row with a blank value is refused rather than read as 'erase this'.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | 'products' = the item list / catalogue, one row per SKU. 'contacts' = the customer and supplier book, one row per business. 'accounts' = the CHART OF ACCOUNTS, one row per ledger code — send this one FIRST when switching, because the trial balance matches against it. 'settings' = the WORKSPACE SETUP, one row per setting (settingKey + settingValue) — the company's name, registration number, TIN, address, state, statutory officer, language, measurement profile and accounting start date. Only an allowlist of fifteen settings may be proposed; call intake_contract(doc_type:'settings') for the list, each one's meaning, and the ones an AI may never write. | |
| rows | Yes | EVERY row of the list, in the order the export prints them. This replaces any previously staged set for this kind. | |
| sourceName | No | What you read — the export's file name or the report's own title, e.g. 'Item list export (Financio) — 412 items'. Shown to the owner as the evidence for what they are approving. | |
| defaultRole | No | contacts only: the side a row that carries neither isCustomer nor isVendor lands on — the same choice the upload page offers as a Customers / Suppliers radio. Send it when the export is a single-sided list. Per-row flags always win over it. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are minimal (readOnlyHint false, destructiveHint false). The description goes far beyond annotations: it explains that staging is idempotent per kind (sending again replaces the set), that opening stock posts a real journal entry, that chart accounts are never deleted/deactivated, that rename is always allowed but change of type/normal balance is refused on posted accounts, and that setting a blank value is refused. It also warns about presentation fields not migrating and bill-of-materials links being separate. Contradiction false.
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 extremely comprehensive but verbose—over 1000 words. While it front-loads key points (call intake_contract first, writes nothing, unit is the whole list), the density of detail makes it hard to scan. Some sections repeat concepts (e.g., 'never infer TIN' appears for both contacts and settings). It earns its place with high value content but could be more structured with bullet points or sections.
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 complexity (4 distinct kinds, 4 parameters, one array of up to 5000 rows with 30+ fields), no output schema, and rich sibling set including stage_opening_balances, the description is remarkably complete. It covers sequencing prerequisites, behavioral side effects, per-field constraints, error cases (refused type changes, deduplication rules, AI-prohibited settings), and actionable guidance for the agent (tell the owner about presentation fields, fix rows Taokeh names back). There are no gaps that would leave the agent uncertain.
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 adds significant value beyond the schema: it explains the semantics of the 'kind' enum in detail (accounts sent first, settings last), clarifies that 'rows' replaces the entire staged set, and adds context about openingQty only seeding new SKUs, avgCost being the valuation basis, and settingKey being from an allowlist of fifteen. A minor deduction for not explaining every field in the description (e.g., barcode uniqueness is in schema description already).
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 the tool brings workspace master data across from the old system, specifying four distinct kinds (chart of accounts, product catalogue, contact book, workspace setup). It distinguishes each kind's purpose and differentiates from sibling stage_opening_balances by noting there is no 'already imported' refusal for master data.
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 call intake_contract FIRST for each doc_type to get fields, rules, and current counts. Also states that accounts should be sent first because the trial balance matches against it, and settings is the last mile. Notes what NOT to do: never infer TIN/registration numbers, never send presentation fields, and never write settings that are on the strict allowlist of AI-prohibited keys.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stage_opening_balancesStage opening balancesAInspect
Bring this workspace's OPENING BALANCES across from the accounting system it is switching FROM: its closing TRIAL BALANCE, its AGED RECEIVABLES (invoices customers still owed) or its AGED PAYABLES (bills still owed to suppliers). Call intake_contract(doc_type: 'trial_balance' | 'aged_receivables' | 'aged_payables') FIRST — it gives the exact fields, the rules, and for the trial balance this workspace's own chart of accounts. This posts NOTHING: the rows land on the owner's existing "Switch to Taokeh" review screens, where they match each account to their chart (trial balance) or check each party (aged lists) and post it themselves. THE UNIT IS THE WHOLE SET: send every row of one kind in ONE call, and calling again for the same kind REPLACES the entire staged set rather than adding to it — a trial balance only balances as a whole, so a partial patch would produce a set that ties to no report. Found a mistake? Send the corrected set in full. Taokeh re-derives every total from the rows you sent and shows it beside the total you say was printed on the report, so the owner can see the set tie to the cent; send that printed total in sourceTotal, and never adjust a row to make a total work — report the gap instead. THESE ARE THE CUTOVER, so unlike stage_document there is no "too old" fence: an aged invoice dated before the accounting start date is exactly right, and that is what makes it an opening document. REFUSED in two cases, both permanent until the owner acts: the books are LOCKED, or that kind's opening balances are ALREADY POSTED (staging over them would double-count — only the owner can undo them). A CREDIT balance on an aged list (an overpayment, an unapplied credit note) is not an opening invoice or bill: Taokeh will not enter it, so leave those rows out and TELL THE OWNER they exist, naming the party and the amount, so they can enter them by hand.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | 'trial_balance' = the closing balances of every account in the old system. 'aged_receivables' = the invoices customers still owed at the cutover, one row each. 'aged_payables' = the bills still owed to suppliers, one row each. | |
| rows | Yes | EVERY row of the set, in the order the report prints them. This replaces any previously staged set for this kind. | |
| sourceName | No | What you read — the export's file name or the report's own title, e.g. 'Trial Balance as at 31-12-2025 (Financio)'. Shown to the owner as the evidence for what they are approving. | |
| sourceTotal | No | The grand total PRINTED on the report (for a trial balance, the DEBIT total). Advisory: Taokeh re-derives its own figure and shows the two side by side. This is the single most useful check in the whole migration — send it whenever the report states one. | |
| sourceTotalCredit | No | trial_balance only: the CREDIT total printed on the report, if it is stated separately. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behavior beyond annotations: it posts nothing, only stages rows for review; calling again replaces the entire set; and it refuses when books are locked or already posted. It also explains how totals are re-derived and compared, and the handling of credit rows. Annotations only state readOnlyHint=false, etc., so this adds substantial 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?
The description is long but every sentence contributes essential operational detail. It is front-loaded with a clear purpose, then follows a logical flow: prerequisites, staging behavior, whole-set semantics, mistake correction, cutover context, refusal conditions, and special-case handling. 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?
Given the tool's complexity (5 parameters, no output schema, nested row objects), the description covers all necessary context: return/landing behavior (review screens), error conditions (locked, already posted), exclusions (credit rows), and the unique no-fence treatment for opening documents. This is complete enough for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers 100% of parameters with detailed descriptions, which sets a baseline of 3. The description goes further by emphasizing critical usage: send the printed total in sourceTotal, never adjust rows to force a tie, and leave out credit-balance rows from aged lists. This adds semantic depth 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 exactly what the tool does: brings opening balances (trial balance, aged receivables, aged payables) from a prior accounting system. It uses a specific verb ('bring ... across') and names the resource and scope, and distinguishes itself from the sibling stage_document by noting the 'no too old fence' difference.
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 explicit when-to-use guidance: call intake_contract first, then use this tool for cutover data. It also gives when-not-to-use context: credit balances on aged lists should be excluded and handled manually, and notes permanent refusal cases (locked books or already-posted balances). The alternative stage_document is explicitly contrasted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stock_levelStock levelsARead-onlyInspect
How many units of a product you have on hand right now — search by product name or SKU. If this workspace uses Counter (the till), the figure is as at the last day-close: counter sales move stock once, when the day is closed, not at each scan.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the read-only nature is known. The description adds valuable behavioral context beyond annotations: the Counter day-close timing and how stock moves (per day, not per scan). This helps the agent interpret data freshness and avoid misleading users. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with the core action in the first and a relevant caveat in the second. Every word earns its place; no fluff 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 one-parameter tool with no output schema, the description covers purpose, usage, parameter semantics, and a key data-freshness caveat. It is appropriately complete for the tool's 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 coverage is 0%, so the description carries the full burden for parameter understanding. It explicitly explains that the 'query' parameter accepts a product name or SKU, which significantly enhances the bare string field. This is sufficient for the single required 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 uses a specific verb ('how many units') and resource ('of a product you have on hand'), directly answering 'what does this do'. It distinguishes from siblings like low_stock (which likely lists products below threshold) and resolve_product (which maps identifiers) by focusing on quantity 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?
It clearly states the search mechanism ('search by product name or SKU') and provides an important timing caveat about Counter day-close, which clarifies when to trust the figure. It doesn't explicitly name alternative tools, but the context is sufficiently clear for most use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tax_positionTax positionARead-onlyInspect
Your current tax posture in one read: (1) SST — the current bi-monthly period's SST payable if you're SST-registered (registration 'none' ⇒ not registered, nothing to remit); and (2) e-invoice consolidation — whether monthly consolidation is on, the open month, last month's filing due date, and whether last month's consolidated document is generated / LHDN-validated. Basis: SST-02 return figures + the consolidated-e-invoice register.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false. The description adds value by detailing the specific data sources (SST-02 return figures, consolidated-e-invoice register) and explaining edge cases like registration 'none' meaning no remittance. It does not contradict the annotations and provides meaningful behavioral context beyond safety.
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 well-structured with a colon and numbered items, front-loading the core purpose. It is a single long sentence but each clause carries essential information, and there is no redundant filler. Minor complexity from nested clauses prevents a perfect score.
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 serve as the primary documentation of return values. It covers both major sections (SST status and e-invoice consolidation) and their key fields, including dates and validation status. It omits minor formatting details but is adequate for a read-only status check.
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 has zero parameters, so the schema provides complete coverage (100%). The description focuses on the output rather than parameters, which is appropriate. It explains the meaning of the returned data, which is the relevant semantic content here.
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 identifies a specific resource (tax position) and a specific read action ('one read'), and enumerates the exact components (SST payable and e-invoice consolidation) it returns. This distinguishes it from sibling financial reports like cash_position or business_snapshot, which cover different domains.
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 does not provide any guidance on when to use this tool versus alternatives, nor does it mention related tools or conditions that would make it the appropriate choice. The phrase 'in one read' implies a quick lookup, but no explicit context, exclusions, or alternatives are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Claim this connector by publishing a /.well-known/glama.json file on your server's domain with the following structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"maintainers": [{ "email": "your-email@example.com" }]
}The email address must match the email associated with your Glama account. Once published, Glama will automatically detect and verify the file within a few minutes.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceCukaiMax Tax Authority is an MCP server that gives AI agents source-linked Malaysian individual tax information and deterministic draft preparation checks for YA2025 Form BE/B and YA2026 planning, via a public read-only Streamable HTTP endpoint.MIT
- AlicenseNot gradedqualityAmaintenanceMCP server that connects AI agents to 34,500+ Australian Taxation Office documents, providing cited answers, tax deduction discovery, depreciation scheduling, BAS checklists, and audit risk assessment through 13 specialized tools.1445AGPL 3.0
- AlicenseNot gradedqualityAmaintenanceAccounting AI - MCP server providing AI-powered tools and automation by MEOK AI Labs9MIT
- AlicenseNot gradedqualityBmaintenanceEnables issuing and managing validated Malaysian e-invoices via MyInvois (LHDN) directly from MCP clients, with tools for TIN validation, invoice drafting, submission, and document management.111Do What The F*ck You Want To Public