Final POS – Custom POS Builder
Server Details
Build custom POS apps with your AI agent. Final's MCP server gives developers what they need to ship a custom point of sale: scaffold a checkout flow, adapt vetted screen blueprints for counter POS, self-checkout kiosks, restaurant ordering and payment terminals, ground every call in Final's version-locked POS APIs, validate, boot a live preview and deploy to real hardware with integrated card payments. The same server also manages the store behind it: products, stock, orders, customers and sales reports. Remote Streamable HTTP with OAuth 2.1.
- Status
- Healthy
- Uptime
- 97.8% over 22 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- Final-Commerce/final-pos-mcp
- GitHub Stars
- 0
- Server Listing
- Final POS MCP
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 177 tools
Most tools target a clearly distinct resource+action, and descriptions go out of their way to pre-empt confusion (e.g. delete_tax_rate vs remove_tax_rate_from_group, update_modifier vs update_modifier_choice, import_customers vs import_products). Still, large parallel families (six hub_import_* tools, ~14 modifier tools, the meta layer of call_tool/call_write_tool/find_tools/ask_finai) create many near-neighbors an agent must read closely to pick correctly.
Strong, predictable scheme: flow_* for the builder surface, hub_* for the POS admin surface, both using verb_noun (create_product, update_outlet, get_sessions). Minor deviations are the un-prefixed meta tools (ask_finai, call_tool, find_tools, switch_company) and prose that drops prefixes (referring to 'write_flow_files', 'get_categories'), which is a small inconsistency.
177 tools is far beyond a well-scoped set and at the extreme end of the scale. The enable_packs/disable_packs + find_tools/call_tool mechanism is a deliberate mitigation to keep the listed set short, but the raw surface is still enormous for a single server.
Coverage is exceptionally deep: full CRUD/lifecycle for products, categories, customers, outlets, stations, roles, users, taxes, modifiers, suppliers, purchase orders, stock and bookings, plus bulk import/export and an entire app build/deploy toolchain. The few gaps (refunds and order status are read-only, no server-side sorting) are platform constraints that are explicitly documented with workarounds rather than dead ends.
Available Tools
177 toolsask_finaiAsk FinaiADestructiveInspect
Hand a task in words to Finai, Final's own AI agent, and get its finished answer. It runs as this connection's user on its company, within the allowed packs, and uses Final's tools itself (looking records up, creating products, building or deploying an app). Use it for multi-step merchant jobs you would rather describe than orchestrate; call tools directly when you need the raw data. Pass conversationId to continue an earlier thread.
| Name | Required | Description | Default |
|---|---|---|---|
| task | Yes | What to do or find out, in plain language, with every id or value Finai needs. | |
| conversationId | No | A conversationId from an earlier ask_finai result, to continue that thread. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true, openWorld=true, and non-idempotent, so the safety profile is covered. The description adds genuine delegation context beyond that: it runs as the connection's user, on its company, within allowed packs, and can perform writes (creating products, deploying apps). It stops short of spelling out failure modes or result formatting, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then scope, then the when-to-use/alternative split, then the continuation hint. Every sentence earns its place with no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an agent-delegation tool with no output schema, the description covers purpose, scope, permissions context, usage routing, and continuation. It could say more about what a 'finished answer' looks like or how failures surface, but it is complete enough 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 description coverage is 100%, including the meaning of both task and conversationId, so the schema carries the parameter burden. The description's mention of passing conversationId to continue a thread merely restates the schema, adding no new syntax or constraints. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('hand a task in words to Finai... get its finished answer') with the concrete resource (Final's own AI agent). It explicitly contrasts itself with the sibling tool family by describing that it uses Final's tools internally, so an agent can tell it apart from call_tool or individual hub_* 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?
Gives explicit when-to-use ('multi-step merchant jobs you would rather describe than orchestrate') and names the alternative condition ('call tools directly when you need the raw data'). Also instructs on thread continuation via conversationId, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
call_toolRun a read-only toolARead-onlyInspect
Run a read-only tool from any allowed pack by its full name (for example hub_find_low_stock) without it being listed. Only tools that read are accepted; tools that change data run through call_write_tool. Arguments follow that tool's own input schema, which find_tools returns.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The tool's gateway name, e.g. hub_get_products or flow_list_flows. | |
| arguments | No | The tool's arguments. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), so the bar is lower. The description still adds real context: it is an indirection layer that can invoke tools not present in the listing, it enforces a read-only filter, and argument shape is defined by the target tool rather than this one. It does not say what happens if a write tool name is passed or whether the target tool's own permissions still apply, which is the remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and scope, then the read-only constraint, then the argument contract. Every clause carries information; nothing is restated from the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a meta-dispatch tool with no output schema, the description covers everything needed to invoke it correctly: what it does, what it refuses, where the sibling for writes lives, and where to find the argument schema. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3, but the description adds meaning beyond the schema: 'name' must be a full gateway name of a read-only tool, and 'arguments' must conform to that target tool's own input schema (obtainable via find_tools). That clarifies the dynamic, non-obvious contract of the arguments object, which the schema alone does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('run a read-only tool from any allowed pack by its full name') plus a concrete example (hub_find_low_stock), and its dispatcher nature is unmistakable. It distinguishes itself from call_write_tool directly, so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names when to use this tool (read-only tools, including unlisted ones) and when not to (tools that change data go through call_write_tool), and points to find_tools as the source of the target tool's argument schema. Both the routing condition and the setup step are stated, not inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
call_write_toolRun a tool that changes dataADestructiveInspect
Run a tool that creates, changes, deletes, sends or deploys from any allowed pack by its full name (for example hub_update_product) without it being listed. Only tools find_tools marks as writes are accepted; read-only tools run through call_tool. Arguments follow that tool's own input schema, which find_tools returns.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The tool's gateway name, e.g. hub_update_product or flow_deploy_flow. | |
| arguments | No | The tool's arguments. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, so the safety profile is covered. The description adds genuinely new behavior beyond them: a validation gate that rejects non-write tools, and the convention that arguments must conform to the target tool's own schema as returned by find_tools. It stops short of describing failure behavior or partial-application semantics for destructive operations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, all load-bearing: the capability, the acceptance gate plus alternative, then the argument convention. The routing information is front-loaded and nothing is repeated from the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a meta-dispatch tool with no output schema and a fully documented 2-parameter schema, the description covers the essential unknowns: which tools it will accept, where the argument contract comes from, and which sibling to use instead. It could still say what happens when a rejected tool name is passed, but nothing critical to a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it clarifies that 'name' is the gateway name of an unlisted write tool, and it explains where the 'arguments' object's shape comes from (the target tool's own input schema, obtainable via find_tools). That resolves the main ambiguity of an open additionalProperties object.
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 concrete verb set (creates, changes, deletes, sends, deploys) and the resource (any allowed pack tool, addressed by full gateway name like hub_update_product), and explicitly frames itself as the unlisted counterpart to call_tool. An agent can distinguish it from call_tool and from find_tools without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit acceptance rule ('Only tools find_tools marks as writes are accepted') and an explicit alternative with the selecting condition ('read-only tools run through call_tool'). It also points to find_tools as the way to discover the tool and its schema, so both when-to-use and how-to-find are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
disable_packsList fewer packsAIdempotentInspect
Remove packs from tools/list for this connection to keep the list short. Tools stay reachable through call_tool and call_write_tool.
| Name | Required | Description | Default |
|---|---|---|---|
| packs | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=true, so safety is largely covered. The description adds real behavioral value by clarifying blast radius: tools are only hidden from tools/list and remain callable via call_tool/call_write_tool, which answers the main agent worry about breaking access.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the action and its effect, with no filler. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, no-output-schema tool the description covers the action, its scope, and the recovery path for affected tools. The remaining gap - how to obtain valid pack names - is real but narrow.
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 has 0% schema description coverage, so the description must compensate, but it never explains what a 'pack' identifier is, its format, or where to discover valid values (e.g., via list_packs). The array-of-strings input is left semantically opaque.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (remove) plus resource (packs) and, crucially, the non-obvious scope of the effect: removal from tools/list for this connection. This lets an agent distinguish it from enable_packs/list_packs without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The rationale ('to keep the list short') implies when to use it, but there is no explicit when-to-use or when-not-to-use guidance and no mention of the inverse sibling enable_packs. Usage must be inferred from the purpose statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
enable_packsList more packsAIdempotentInspect
Add packs to tools/list for this connection (remembered). Only allowed packs can be listed; the client refreshes its tool list.
| Name | Required | Description | Default |
|---|---|---|---|
| packs | Yes | Pack ids from list_packs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and idempotentHint=true, so the safety profile is covered. The description adds genuinely new context beyond that: the change is 'remembered' (persisted) and the client refreshes its tool list, which tells the agent a re-listing side effect follows the call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the effect on tools/list and followed by the constraint and side effect. No filler, though the parenthetical '(remembered)' is slightly terse for a property as important as persistence.
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 a single fully-documented parameter, the description covers the essentials: the effect, the constraint, persistence, and the client-side refresh. It stops short of stating error behavior for non-allowed packs or whether the addition merges with already-enabled packs, which is the main remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter and schema description coverage is 100%: the schema already says it is an array of required pack ids sourced from list_packs. The description adds nothing about id format, max size, or what happens if a mix of allowed and disallowed ids is supplied, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete verb and resource: it adds pack ids to the tools/list for 'this connection'. Combined with the name enable_packs and the sibling pair disable_packs/list_packs, an agent can tell what it does, though the 'tools/list' phrasing is protocol jargon that takes a moment to parse.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: 'Only allowed packs can be listed' hints that disallowed packs will not take effect, and the schema points to list_packs as the id source. There is no explicit when-to-use versus disable_packs, no prerequisite about how packs are made 'allowed', and no statement about behavior on an invalid id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_toolsFind toolsARead-onlyInspect
Search every allowed pack for tools by what you want to do ("low stock", "create a product", "deploy the app"). Returns matching tool names with their pack, whether they are listed and whether they change data. Run a read-only match with call_tool and a write with call_write_tool, or enable_packs to list its pack.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | Plain-language description of the task or the record type. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, destructiveHint=false, openWorldHint=false). The description adds scope ('every allowed pack') and, importantly, the shape of the result — matching names with pack, listed status, and whether they mutate data. No output schema exists, so this return-value disclosure earns real credit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero filler, with the search intent and examples front-loaded. The final sentence is over-compressed — 'or enable_packs to list its pack' reads ambiguously about whose pack and in what order — costing a 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?
With no output schema, the description carries the return-value burden and does so adequately (names, pack, listed flag, mutating flag). Remaining gap is the unmentioned limit/cap behavior, which matters for a discovery tool where matches can exceed 40.
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 50%: query is documented in-schema and reinforced by the plain-language examples, which is genuinely additive. However, limit (1–40, default 12) is undocumented in both schema and description, and there is no mention of what happens when more than `limit` tools match.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Search) and resource (every allowed pack, for tools) plus the matching dimension ('by what you want to do'), with three concrete query examples. This is clearly distinguishable from the ~150 domain siblings, which all act on catalog data rather than discovering 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?
Names the downstream alternatives explicitly — call_tool for read-only matches, call_write_tool for writes, enable_packs to list a pack. The routing is stated but compressed and lacks a stated when-not (e.g. if you already know the tool name, skip this).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_apply_blueprint_widgetsApply blueprint widgets into a flowADestructiveInspect
COPY vetted blueprint widgets into a flow as real files — byte-exact, no transcription. Pass picks of { blueprintId, widgetId } (from list_blueprints / search_blueprints); the widget files land under src/widgets// with their command-frame plumbing intact, persisted as a restorable checkpoint + builder-chat note like write_flow_files. Returns a manifest (paths, export names, props, a ready-to-paste import block) — never the code. Compose your screens by importing the manifest paths; adapt an applied widget with a small write_flow_files edit, never a wholesale rewrite, and never re-type code from get_blueprint. A selfPersisting blueprint's copied code reads/writes its OWN custom tables by exact name: this tool PROVISIONS those tables into your organization automatically, possibly under org-scoped names (see tables in the result — the copied code already uses the final names) — never create them yourself and never create a lookalike. Tables owned by a platform extension are reported under extensionTables (with extensionIds when pinned): only installing that extension provides them (install_extension, with user consent). Secrets the code reads are reported under secrets — each missing key gets a fill-in request in the builder automatically; values never travel over MCP. Re-applying a pick restores the widget's vetted contents.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | One-line summary of the change, shown in the builder chat. | |
| agent | No | ||
| picks | Yes | ||
| flowId | Yes | ||
| hubToken | No | Optional organization JWT for the Final hub, used to provision the blueprint's custom tables when your organization has no stored hub credential. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description goes well beyond them: it discloses that the widget files land under src/widgets/<blueprint>/, that a restorable checkpoint and builder-chat note are persisted 'like write_flow_files', that selfPersisting tables are provisioned automatically possibly under org-scoped names, that extension-owned tables are reported separately, and that secrets produce fill-in prompts with values never crossing MCP. The 'restores on re-apply' behavior is meaningful context for a destructive-hinted 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?
Front-loaded with the core action and byte-exact/no-transcription constraint in the first sentence, then layers the important caveats in a logical order. It is dense and somewhat repetitive (multiple 'never ... yourself' warnings), but nearly every clause carries a real routing or safety fact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, mutation-capable tool with no output schema, the description defines what comes back (a manifest with paths, export names, props, an import block — never the code), how tables/extension tables/secrets are surfaced, and the persistence side effects. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 40% across 5 params, so the description carries more burden. It explains picks well (shape {blueprintId, widgetId} and their origin) and the hubToken provisioning purpose is covered by the schema itself, but `note` and `agent` get no added meaning and flowId is left implicit. It partially compensates rather than fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (COPY vetted blueprint widgets into a flow as real files) and explicitly distinguishes itself from siblings by naming list_blueprints/search_blueprints as the pick source and get_blueprint as the thing NOT to re-type from. An agent can tell it apart from flow_write_flow_files and flow_create_flow_from_blueprint without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit alternatives and routing: obtain picks from list_blueprints/search_blueprints, compose screens by importing the returned manifest paths, adapt via a small write_flow_files edit rather than a wholesale rewrite, and never re-type code from get_blueprint. It also states re-applying restores vetted contents. This is unusually complete when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_apply_upstream_updateApply an upstream update to a cloneADestructiveInspect
Apply the update reviewed with get_upstream_update. Pass resolutions: exactly one entry per conflict — { path, contents } with the COMPLETE merged file, or { path, delete: true } when the file should not exist. Missing, unknown or ambiguous entries fail the whole call with nothing written (the plan is recomputed here, so re-review if the flow changed since). What it does, in order: saves the current files as a restorable "Before update" checkpoint, lands the merged tree (an open builder tab picks it up safely), records an "Update from upstream vX" checkpoint narrated in the builder chat, re-stamps the clone's update pointer so the next check compares against this release, provisions custom tables the update introduced (org-scoped names — the merged code already uses them), and raises a fill-in request for each missing secret (values never travel over MCP). If the review said adoptMode: true, call with adopt: true and NO resolutions to replace the files with the original's latest release wholesale — undoable via the safety checkpoint; confirm with your user first.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | One-line summary for the builder chat. | |
| adopt | No | Only when the review reported adoptMode: true — replace the flow's files with the original's latest release wholesale. | |
| agent | No | ||
| flowId | Yes | ||
| hubToken | No | ||
| resolutions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag destructiveHint=true; the description goes far beyond by disclosing atomicity ('nothing written' on bad resolutions), that the plan is recomputed server-side, the exact ordered effects (checkpoint, merged tree landing, update-pointer re-stamp, custom-table provisioning, secret fill-in requests), and that adopt mode is undoable via the checkpoint. This is unusually rich behavioral context for a destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the imperative action and the resolutions contract before the long ordered effect list, so the callable facts come first. The run-on paragraphs are dense but nearly every clause carries distinct operational meaning; only minor tightening is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, multi-effect tool with no output schema and low schema description coverage, the description supplies everything an agent needs: prerequisites, atomicity guarantees, the adopt-mode branch, and the side effects. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33%, and the description compensates by fully specifying the resolutions shape ({path, contents} with the COMPLETE merged file, or {path, delete:true}) and the adopt flag contract (requires adopt:true with NO resolutions). The agent, hubToken and note params remain undocumented, so it falls short of complete coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Apply the update') and immediately ties it to its counterpart 'get_upstream_update', making clear what this tool does and how it differs from the read-only sibling. An agent can distinguish it from flow_get_upstream_status/get_upstream_update without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gates invocation on a prior review ('the update reviewed with get_upstream_update') and names the alternative path when the review reported adoptMode: true. It does not spell out when *not* to call it (e.g. no pending upstream update), but the working context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_connect_chatConnect to an existing flowBInspect
Attach this agent session to an EXISTING flow as a chat in the builder's rail (so the flow's owner sees your work alongside their own chats). Also use log_message to narrate what you're doing.
| Name | Required | Description | Default |
|---|---|---|---|
| agent | No | ||
| flowId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark this as non-read-only but non-destructive, and the description adds real context beyond them: the action makes your work visible to the flow's owner in their chat rail, which is a meaningful side effect. It still omits whether the attach requires ownership, is idempotent, or can be detached.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, with the primary action front-loaded ahead of the secondary tip about log_message. The parenthetical is helpful rather than filler, though the sentence is 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?
With no output schema and only thin annotations, the description covers the main effect but leaves gaps an agent would want: the meaning of the 'agent' parameter, behavior when already connected, and any permission requirements.
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 parameter meaning. It implies flowId via 'EXISTING flow' but says nothing about the 'agent' parameter, leaving half the inputs undocumented in both schema and prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a concrete verb and resource ('Attach this agent session to an EXISTING flow as a chat in the builder's rail') and states the visible effect. It differentiates from creation siblings by capitalizing EXISTING, though it never names flow_create_flow as the contrasting 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?
Usage is implied rather than stated: the emphasis on 'EXISTING flow' steers away from creating a new one, and the tool points at log_message for narration. There is no explicit when-not-to-use, no prerequisite (e.g. needing a valid flowId or ownership), and no stated alternative for starting fresh.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_create_custom_tableCreate a custom data tableAInspect
Create a new custom data table (schema: name + typed columns) in your Final organization. USE THIS for any data the app must keep — loyalty stamps, waitlists, bookings, inventory logs, settings: the platform syncs the table to every station running the flow and keeps it working offline at the POS, so it replaces ANY browser-storage or hand-rolled persistence (localStorage/IndexedDB are forbidden and fail validate_flow). NEVER store credentials in a table — that's what the secrets vault (request_secret) is for. This creates the table IMMEDIATELY and ORG-WIDE (visible to every station and every flow, not just this one), so unless the user actually asked for stored data, confirm before creating; creation can also be plan-gated — surface a plan/permission error to the user rather than retrying. Check list_custom_tables first to reuse an existing table, and search_blueprints before building functionality around a new one: a selfPersisting blueprint brings its OWN tables by exact name and apply_blueprint_widgets provisions them for you, so a lookalike would sit dead while the feature keeps reading the real one. Create tables only for net-new data no applied blueprint persists. The name is normalized to kebab-case; generated code reads/writes rows via renderClient.getCustomTableData / upsertCustomTableData.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Table name; normalized to a kebab-case id, e.g. 'gift-cards'. | |
| fields | Yes | ||
| hubToken | No | Organization JWT fallback, only if the hub rejects your API key for this route. | |
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare it is a non-read-only, non-destructive, non-open-world write. The description adds far more: creation is immediate and org-wide (visible to every station and flow), it can be plan-gated with an error that should be surfaced rather than retried, names are normalized to kebab-case, and the table is synced offline to stations. It also flags a confirmation requirement for unintended persistence.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and then layers constraints, so the important guidance appears early. It is dense and somewhat run-on (multiple clauses per sentence, some restatement of the kebab-case rule already in the schema), but nearly every sentence carries a distinct operational instruction rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with no output schema, the description covers the full lifecycle an agent needs: reuse checks, blueprint-collision avoidance, org-wide scope, offline behavior, plan/permission failure handling, and credential exclusion. Nothing material to calling it correctly is omitted.
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 50%, and the description adds meaning for the two required params ("name + typed columns", kebab-case normalization) and how generated code reads/writes rows. However, hubToken and description are never mentioned, and the field type enum / reference-linkage semantics are left entirely to the schema, so it does not fully compensate for the coverage 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?
Opens with a specific verb+resource ("Create a new custom data table") and immediately scopes it with the schema shape (name + typed columns). It is trivially distinguishable from siblings like flow_update_custom_table, flow_list_custom_tables, and flow_request_secret, which the description names outright.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ("USE THIS for any data the app must keep — loyalty stamps, waitlists, bookings, inventory logs") and when not to (credentials → request_secret). It routes the agent to list_custom_tables for reuse and search_blueprints to avoid duplicating tables a blueprint already provisions, with the precise failure mode ("a lookalike would sit dead") spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_create_flowCreate a new flowAInspect
Create a new, empty flow (app build) in your Final organization for YOU to write the app into. It appears in the Miami builder immediately, with this agent session attached as a chat. Optional theme knobs seed the live palette. Optional device ("mobile", "kiosk", "iphone", …) sets the preview frame it opens in; see set_flow_device. Returns the flow id and a builder deep link. Call get_scaffold before writing files. For an app the user merely DESCRIBED, use start_build.
| Name | Required | Description | Default |
|---|---|---|---|
| agent | No | Display name for this tool in the builder chat rail, e.g. 'Claude Code'. | |
| color | No | A colour the user asked for, as they said it ("pink", "dark green", "navy and gold", or a hex). Resolved to a full custom palette for the flow's appearance — prefer this over guessing customColors hexes. Ignored when customColors is also given. | |
| fonts | No | ||
| shape | No | ||
| theme | No | ||
| title | Yes | ||
| device | No | Default preview device for the new flow (the frame the builder opens it in). Omit for the user's Settings default. | |
| palette | No | ||
| customColors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic mutation profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false). The description adds real behavioral context beyond that: the flow appears in the Miami builder immediately, the agent session is attached as a chat, and it returns a flow id plus a builder deep link. Still silent on permissions/org scoping and any rate or naming 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?
Purpose is front-loaded in the first clause, followed by behavior, parameters, and routing in a logical order. Slightly chatty in places ('It appears in the Miami builder immediately, with this agent session attached as a chat'), but no sentence is purely filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the essentials for a 9-param creation tool with no output schema: what it creates, the immediate side effect, the return value (flow id + deep link), the get_scaffold prerequisite, and the start_build alternative. Gaps are minor — org/permission requirements and most optional theme knobs go unqualified.
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 33% across 9 params, the description should carry more weight. It does add useful framing for the theme group ('theme knobs seed the live palette') and clarifies `device` with examples and a cross-reference to set_flow_device, but title, agent, and the fonts/shape/theme nuance remain undocumented here. Partial compensation only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a new, empty flow (app build)') and immediately scopes it as agent-authored ('for YOU to write the app into'). It distinguishes itself from siblings: 'empty' contrasts with flow_create_flow_from_blueprint, and the closing line names start_build as the different path for merely-described apps.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names an explicit alternative for one case ('For an app the user merely DESCRIBED, use start_build') and a prerequisite ('Call get_scaffold before writing files'). It implies but never explicitly excludes flow_create_flow_from_blueprint, so the when-not coverage is not fully complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_create_flow_from_blueprintStart a new build by copying an FBBAInspect
Create a NEW flow that starts as a complete, vetted application rather than an empty file tree — the fastest path to a working build when an FBB (a Final Business Blueprint: a whole app) matches what the user wants. For an app the user merely DESCRIBED, use start_build (the website's own start picks the FBB); this verb is for when the user asked YOU to copy one. Find one with search_blueprints({ kind: "fbb" }). The app's screens, navigation and command-frame wiring are copied byte-exact from the build the FBB points at, its custom tables are re-created under THIS organization's names (the copied code already uses those names — keep them), and a fill-in request is raised for each secret it reads. This ALWAYS creates a new flow: an FBB cannot be merged into an existing build (there are no screen-graph merge semantics). To add parts to a build you already have, use apply_blueprint_widgets instead. THE COPY ENDS YOUR TURN. It is the finished deliverable, not step one — the app is vetted and already runs. When it returns, say its report line and stop: do NOT preview, validate, edit or extend it, and do not start on anything else the user described. The result names the tools not to call.
| Name | Required | Description | Default |
|---|---|---|---|
| agent | No | ||
| color | No | A colour the user asked for, as they said it ("pink", "dark green", "navy and gold", or a hex). Resolved to a full custom palette for the flow's appearance — prefer this over guessing customColors hexes. Ignored when customColors is also given. | |
| fonts | No | ||
| shape | No | ||
| theme | No | ||
| title | No | Name for the new flow. Defaults to the blueprint's title. | |
| device | No | Override the copy's default preview device (the frame the builder opens it in): a surface word (mobile, tablet, kiosk, …), a get_scaffold profile, a skin (iphone, ipad, …) or a full DeviceConfig. Omit to follow the blueprint's surface. Changeable later with set_flow_device. | |
| flowId | No | NOT SUPPORTED — passing this returns an error. An FBB replaces an app's entire screen graph, so it can only start a NEW build. It is declared here purely so a caller that assumes otherwise fails loudly instead of having the field stripped and getting a second flow it never asked for. To add parts to an existing build, use apply_blueprint_widgets({ flowId, picks }). | |
| palette | No | ||
| hubToken | No | ||
| blueprintId | Yes | The exact FBB id, e.g. 'flow.coffee-quick-service'. An id without a version suffix resolves to the newest published version. | |
| customColors | No | ||
| supersedesFlowId | No | The EMPTY placeholder flow you were told to build into, when a starter prompt pinned you to one before you knew an FBB would be used. This does NOT write into that flow — nothing can — it marks it as abandoned in favour of the flow created here, so the human's already-open builder tab follows you instead of watching an empty workspace forever. Pass the flow id from your instructions. Ignored (reported back as superseded:false) if that flow has any files, so it can never redirect a real build. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, destructiveHint=false, openWorldHint=false), disclosing that screens/navigation/command-frame wiring are copied byte-exact, custom tables are re-created under THIS organization's names with names that must be kept, and that a fill-in request is raised for each secret read. It also warns that the result names tools not to call and that flowId cannot redirect the copy.
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?
Purpose and sibling routing are front-loaded and nearly every sentence carries a distinct instruction, which is justified for a high-consequence one-shot operation. It is nevertheless verbose, with all-caps emphasis and some restatement ('it is the finished deliverable, not step one' / 'do NOT preview, validate, edit or extend it').
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 13-parameter, nested-object mutation tool with no output schema and low schema description coverage, the description still conveys the critical behavioural contract: what gets copied, what gets re-created, what causes an error, that the operation is terminal, and what the returned report line means. Nothing an agent needs to avoid misusing it appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 46%, and the description compensates well for the highest-risk parameters: it explains how to obtain blueprintId (search_blueprints), why flowId errors out, and what supersedesFlowId does (and does not) affect. However it adds nothing for the eight appearance/infra parameters (color, fonts, shape, theme, palette, customColors, agent, hubToken), so the gap is only partially closed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource (create a NEW flow by copying an FBB, defined inline as 'a Final Business Blueprint: a whole app') and immediately contrasts it with the sibling start_build and the search path search_blueprints({ kind: "fbb" }). An agent can tell this apart from flow_create_flow, flow_apply_blueprint_widgets and flow_get_blueprint without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('when the user asked YOU to copy one' vs an app merely DESCRIBED), names the alternative for each case (start_build, apply_blueprint_widgets), and states the hard exclusion that an FBB cannot be merged into an existing build. The terminal instruction ('THE COPY ENDS YOUR TURN') also tells the agent what not to do afterwards.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_delete_flow_filesDelete files from a flowADestructiveInspect
Remove files from a flow's tree by path. Engine-owned paths are rejected. Recorded as a checkpoint + chat note like writes.
| Name | Required | Description | Default |
|---|---|---|---|
| agent | No | ||
| paths | Yes | ||
| flowId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation profile is covered. The description adds real value beyond that: engine-owned paths are rejected (a guarded constraint) and the deletion is recorded as a checkpoint plus chat note, which is non-obvious side-effect behavior an agent wouldn't infer from 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?
Three short sentences, each earning its place, with the core action front-loaded before the path restriction and side-effect notes. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive 3-parameter mutation with no output schema, the description covers the action, a guard condition, and side effects, which is decent. However it omits reversibility/undo behavior, permission requirements, and any return/error detail beyond the engine-path rejection.
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 parameter meaning. 'By path' and 'a flow's tree' give partial semantics for the paths array and imply flowId, but the 'agent' parameter is completely unexplained and no path syntax/format is given. Coverage of the three parameters remains thin.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (remove) plus resource (files in a flow's tree) and the scoping mechanism (by path). It clearly contrasts with the sibling read/write pair, flow_read_flow_files and flow_write_flow_files, since 'remove' names the delete operation distinctly.
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 establishes the delete context and notes that engine-owned paths are rejected, but it never explicitly says when to choose this over flow_write_flow_files or what prerequisites apply. Usage is implied by the verb rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_deploy_flowBuild and deploy a flowADestructiveInspect
Direct deploy for CI/agent workflows: builds the app in a server sandbox (npm install + vite build) and publishes the dist to Final web-hosting as a new live version. Two things stop a deploy: a failing build, and a hardcoded credential (a build is distributable to other companies, so a baked-in secret would ship to all of them — use request_secret). Guardrail and type findings do NOT block; run validate_flow first if you want them. Omit changelog and the release notes are drafted for you from what changed since your last deploy — call log_message (or pass note on write_flow_files) as you work so those notes describe intent rather than just file names. Uses your organization's provisioned hub credential automatically (the same long-term org JWT the extension tools use) — no token argument needed once you've connected. Pass hostingToken only as an escape hatch to override it; if no credential is available, reconnect via the Connect dialog or use open_in_builder and deploy from the Launch tool instead.
| Name | Required | Description | Default |
|---|---|---|---|
| flowId | Yes | ||
| version | Yes | ||
| changelog | No | ||
| hostingToken | No | Organization JWT accepted by hosting.finalpos.com. Optional escape hatch — omit to use your organization's stored hub credential (the same long-term org JWT the extension tools use). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: enumerates exactly what blocks a deploy (failing build, hardcoded credential), what does not (guardrail/type findings), the reason credentials block (build is redistributable), the implicit credential provisioning behavior, and the changelog auto-draft side effect. Annotations only give the generic destructive/openWorld flags; this text supplies the operational reality.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then blockers, then credential mechanics, then changelog. Dense but every clause carries information; the final credential-fallback sentence is slightly long but justified for a tool whose main failure mode is missing auth.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive publish with no output schema and partial param coverage, it covers prerequisites, blockers, side effects and auth. It does not say what a successful deploy returns (version identifier/URL) or whether the previous live version is replaced, which are minor but real omissions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 25% (only hostingToken documented), so the description must compensate — and it does for changelog ('omit and the release notes are drafted for you') and hostingToken (escape-hatch semantics beyond the schema's wording). flowId and version are left to the schema/pattern, which is the one small 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?
States a specific verb+resource ('builds the app in a server sandbox ... publishes the dist to Final web-hosting as a new live version'), with the two constituent steps spelled out. It routes the agent away from sibling tools by naming validate_flow, request_secret, log_message, open_in_builder and write_flow_files where relevant.
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?
Explicit when-to-use (CI/agent workflows, direct deploy), when-not (guardrail/type findings don't block; run validate_flow first if you care), and alternatives (open_in_builder + Launch tool when no credential is available). The hostingToken escape hatch is framed as an override, not the default path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_get_blueprintInspect one blueprint's codeARead-onlyInspect
INSPECTION ONLY — read a blueprint's overlay code by id (from list_blueprints) to understand how it works. To USE a blueprint, apply it: apply_blueprint_widgets for a widget-set (materializes its widgets byte-exact with the command-frame plumbing intact AND provisions the custom tables its code depends on), create_flow_from_blueprint for an FBB. Do NOT re-type code from this tool into write_flow_files — that silently drops the vetted plumbing and leaves its tables unprovisioned. tables (when present) lists the custom tables the code binds to by exact name. For a WHOLE-FLOW blueprint this returns the screen manifest WITHOUT file bytes by default — an entire app is far too large to read this way, and you never need to: instantiation copies it server-side. Pass includeFiles: true only to audit the source.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| includeFiles | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, non-destructive), and the description adds substantial behavioral context beyond them: whole-flow blueprints return the screen manifest without file bytes by default, instantiation copies server-side, includeFiles is audit-only, and `tables` lists bound custom tables. This is unusually rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the mode ('INSPECTION ONLY') leads, followed by purpose, routing, anti-pattern, and the includeFiles caveat. Every sentence earns its place and no clause is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still explains the return shape (tables list, manifest-without-bytes default, file bytes only under includeFiles). Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the params — and it does for includeFiles ('pass true only to audit the source') and gives provenance for id ('from list_blueprints'), plus documents the returned `tables` field. The only gap is that id's expected format is not specified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — read a blueprint's overlay code by id — and explicitly distinguishes itself from the write/apply path. The opening 'INSPECTION ONLY' immediately frames it against flow_apply_blueprint_widgets and flow_create_flow_from_blueprint.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (understand how a blueprint works), when-not-to-use (to actually use it, apply instead), names the two alternative tools by name, and adds a strong anti-pattern warning against re-typing code into write_flow_files with the reason why.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_get_preview_statusCheck preview health + logsBRead-onlyInspect
Authoritative server-side health probe of the flow's preview sandbox, plus a short snapshot of recent dev-server logs (useful to diagnose a red screen or crash).
| Name | Required | Description | Default |
|---|---|---|---|
| flowId | Yes | ||
| logSeconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered by structured data. The description adds that the probe is 'authoritative server-side' and returns logs, but does not explain logSeconds behavior, timeout/rate behavior, or what the health result contains.
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 that states the primary function first and the auxiliary log snapshot second. No filler, though it is a bit compact given the two undocumented parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does carry the burden of conveying return content, and it does so at a high level (health status + log snippet). However, the unexplained logSeconds parameter and the absence of any indication of the health response shape leave clear gaps for a diagnostic tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for two parameters. The description never mentions flowId and only indirectly gestures at logSeconds via 'short snapshot of recent dev-server logs', without clarifying that it bounds the log window (1-20s). It fails to compensate for the missing 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?
Specific verb+resource ('server-side health probe of the flow's preview sandbox') plus a stated secondary output (recent dev-server logs). It is clearly a status/read tool, distinguishable in intent from siblings like flow_start_preview and flow_stop_preview, though it does not name them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical 'useful to diagnose a red screen or crash' implies when to reach for it, but there is no explicit when/when-not framing and no comparison to alternatives such as flow_start_preview or flow_sync_preview. Usage is suggested rather than specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_get_scaffoldGet the app scaffold contractARead-onlyInspect
The contract every Final flow app is built against: which files the ENGINE owns (never write them — they are re-asserted verbatim), the baseline package.json (Vite + React 19 + TS + Tailwind + command-frame), the rules your files must follow, and the runtime contracts that compile and preview fine but fail on a real device (money in minor units, the first-load handshake, getX response unwrapping, tender success semantics). Call this once before writing any files; pass device for layout guidance.
| Name | Required | Description | Default |
|---|---|---|---|
| device | No | Target surface — "portrait-handheld", "counter-tablet", "wall-kiosk" or "tv-display". Approximate words work ("kiosk", "phone", "menu board"); an unrecognized value just returns the device-agnostic contract. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/openWorldHint=false/destructiveHint=false, and the description goes well beyond them: it warns that engine-owned files are re-asserted verbatim (never write them), and that certain runtime contracts compile and preview fine but fail on a real device, naming concrete traps (money in minor units, first-load handshake, getX unwrapping, tender semantics). That is unusually rich 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 core purpose is front-loaded in the first clause, followed by a dense but informative enumeration, then the imperative call-to-action. It is long but every clause carries distinct information; the packed runtime-contract list is the only mild density cost.
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 carries the burden of describing the return and does so thoroughly (engine-owned files, baseline package.json contents, file rules, runtime contracts), while annotations already cover the safety profile. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already lists the accepted device values plus the fallback behavior for unrecognized input. The description adds the param's intent ('for layout guidance'), which the schema does not state, so it contributes a little beyond the structured field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource (retrieve the scaffold contract every Final flow app is built against) and then enumerates the contract's contents, so an agent knows exactly what it gets. It is clearly distinguishable from siblings like flow_get_blueprint or flow_lookup_engine_component, which serve different lookup purposes.
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 timing ('Call this once before writing any files') and a conditional ('pass `device` for layout guidance'), which is strong usage direction. It stops short of naming alternatives or stating when not to call it, so it is not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_get_upstream_statusCheck a clone for upstream updatesARead-onlyInspect
Has the build this flow was copied from released a newer version? Covers both a "Make it yours" clone of a listing and a build started from an FBB. Returns update.status: "available" (a newer deployed release exists — review it with get_upstream_update), "current" (up to date), "unknown" (the original has no comparable release), or "gone" (the original was DELETED — for a share clone, also if it was un-shared; an FBB's parent stays reachable while it exists, because the catalog vouches for it rather than the owner's share toggle), with the release notes published since the copy. Flows that are not snapshot-sourced copies return update: null. Cheap — safe to call whenever the user asks about updates.
| Name | Required | Description | Default |
|---|---|---|---|
| flowId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safe-read profile (readOnlyHint, destructiveHint=false), and the description goes well beyond them: it enumerates every return branch of update.status with meaning ('available'/'current'/'unknown'/'gone'), notes the DELETED and un-shared edge cases, explains the FBB parent staying reachable, and states that non-snapshot copies return update: null.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core question, and the dense status enumeration is necessary information rather than padding. The nested parentheticals make it slightly heavy to parse, but every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the full burden of explaining return values, and it does so completely, including the null case and each status meaning. An agent has everything needed to call and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single flowId parameter, and the description never defines it. The name is self-evident (the flow to check), so the practical gap is small, but the description adds no semantic detail beyond what is already obvious from the parameter name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific question the tool answers ('Has the build this flow was copied from released a newer version?') plus the two sourcing cases it covers (a listing clone and an FBB build). It is clearly distinguishable from the sibling flow_get_upstream_update, which it names as the follow-up for reviewing an available update.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger ('safe to call whenever the user asks about updates') and routes the agent to flow_get_upstream_update when status is 'available'. It does not spell out when-not to call or the cost relative to other checks beyond 'cheap', but the guidance is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_get_upstream_updateReview a pending upstream updateARead-onlyInspect
Review what an update from the original build would change — the same review the builder shows its maker, shaped for an agent. Returns the releases since the clone, the clean changes (added/changed/removed paths, with full incoming contents for added+changed), and CONFLICTS: files where this flow's own edits and the update collide, each with complete base/ours/theirs contents. RESOLUTION CONTRACT (match the builder's behavior): when both sides' changes serve different purposes, merge them yourself — one file keeping BOTH sides' improvements; never wholesale-pick a side out of convenience. ONLY when the two sides genuinely contradict on the same visible thing (a color, a layout, a label, a behavior) ask YOUR user which they want, in plain product language — describe the visible difference, never file names or code. Then call apply_upstream_update with exactly one resolution per conflict. The trees you see are already in THIS organization's table namespace — never rename tableName literals yourself. adoptMode: true means the merge base is unrecoverable, so no merge is possible: offer the user adopting the latest release wholesale (apply_upstream_update with adopt: true) or staying put. upToDate: true means there is nothing to do.
| Name | Required | Description | Default |
|---|---|---|---|
| flowId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read (readOnly, non-destructive), yet the description adds substantial context beyond them: exactly what is returned (releases, clean changes, conflicts with base/ours/theirs), the resolution contract, and the meaning of adoptMode and upToDate edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then the return shape, then the resolution contract. The prose is dense and long but most sentences carry distinct operational content; it could be trimmed but nothing is clearly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden and does so: it enumerates return fields (releases, added/changed/removed paths, conflict base/ours/theirs contents) and covers both adoptMode and upToDate terminal states.
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% and the description never explains flowId, so it does not fully compensate for the gap. However flowId is self-evident from the tool's name and sibling conventions, keeping this at a baseline adequacy rather than a failure.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource clearly: 'Review what an update from the original build would change,' framed as a read operation 'shaped for an agent.' It is readily distinguishable from the sibling apply_upstream_update (which it routes to) and flow_get_upstream_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?
Gives strong next-step guidance ('Then call apply_upstream_update with exactly one resolution per conflict') and explains branch conditions via adoptMode and upToDate. It does not explicitly contrast with flow_get_upstream_status, but the when-to-use context is otherwise clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_install_extensionInstall an extension org-wideADestructiveInspect
Install an extension ORG-WIDE: creates the install link on EVERY company in your Final organization (demo companies included), skipping companies that already have it, so it is safe to retry. Installing is deliberate and org-visible — confirm with your user and call this ONLY when they explicitly asked for the extension. Find the id with list_extensions (organization and public extensions both install); after a successful install the extension's surfaces become embeddable — inspect them with list_extension_surfaces and build the ones carrying requirementsMd natively instead of embedding. Per-company failures are collected in the result rather than thrown, and installState reports the org-wide outcome (installed / partial / none).
| Name | Required | Description | Default |
|---|---|---|---|
| hubToken | No | Organization JWT fallback, only if the hub rejects your API key for this route. | |
| extensionId | Yes | The extension's id (the `id` from a list_extensions result — org or public source). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations confirm readOnly=false and destructive=true, and the description adds substantial context beyond that: installs skip companies that already have the extension so the call is retry-safe, the action is deliberate and org-visible, per-company failures are collected rather than thrown, and installState returns installed/partial/none. This is exactly the idempotency and error-semantics detail annotations cannot express.
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?
Scope and destructive intent are front-loaded, and the closing sentence packs failure handling, outcome field, and its enum values efficiently. It is dense and oriented toward maximal information rather than tight brevity, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden itself and does so: it explains that per-company failures come back in the result and that installState summarizes the org-wide outcome. Prerequisite discovery, confirmation requirements, and post-install next steps are all covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents extensionId's source ('the `id` from a list_extensions result — org or public source') and hubToken's fallback role, so the description's restatement adds little. Baseline 3 applies since the schema carries parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource plus an explicit scope qualifier: 'Install an extension ORG-WIDE ... on EVERY company in your Final organization (demo companies included)'. This cleanly distinguishes it from the single-company sibling hub_install_extension and from read-side siblings like flow_list_extensions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition ('call this ONLY when they explicitly asked for the extension' / 'confirm with your user'), a prerequisite step ('Find the id with list_extensions'), and follow-up routing ('inspect them with list_extension_surfaces'). An agent knows both when to call it and what to do next.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_list_blueprintsList the blueprint catalogARead-onlyInspect
List EVERY vetted, type-checked blueprint available to reuse — working functionality (gift cards, loyalty, payment surfaces, product grids, carts, customer views, order tickets, receipts), not just screen layouts. Check the catalog BEFORE creating custom tables or hand-rolling a capability. Returns id, kind, slot, title, summary, surfaces, tags, and selfPersisting per blueprint — selfPersisting: true means it reads/writes its OWN custom tables by exact name inside its code, which applying then provisions in your organization automatically (some are extension-owned and come from installing that extension); never create a table for a feature it covers. TWO KINDS, used differently: kind "widget-set" (the default this returns) is a set of parts you copy into an existing build with apply_blueprint_widgets; kind "fbb" is a Final Business Blueprint — a COMPLETE APP. It has no widgets to copy and is used with create_flow_from_blueprint to start a NEW flow. Pass kind: "fbb" to browse complete apps, or kind: "any" for both. To find the best match for a specific capability instead of scanning the whole catalog, use search_blueprints. get_blueprint is read-only inspection.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare a safe read (readOnlyHint, destructiveHint=false, openWorld=false); the description goes well beyond them by enumerating the returned fields, explaining the side effect of selfPersisting blueprints (tables are provisioned in the organization automatically, some extension-owned), and warning never to create a table a blueprint already covers. That is exactly the kind of consequence detail annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the pre-check guidance, and the return-field list plus kind taxonomy are both load-bearing for a tool with no output schema. It is dense and heavy on capitalization/emphasis, and a couple of clauses (the parenthetical functionality list, the restated 'never create a table for a feature it covers') could be trimmed without loss.
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-required-param listing tool with no output schema, the description supplies everything needed: what comes back per blueprint, what selfPersisting implies, the two kinds and which sibling tool consumes each, and how to narrow the result. No material gap remains for an agent deciding whether and how to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the single enum parameter, and it largely does: it identifies 'widget-set' as the default returned, 'fbb' as complete apps used with create_flow_from_blueprint, and 'any' as both. It never explains the fourth enum value, 'whole-flow', leaving one value's meaning undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List EVERY vetted, type-checked blueprint available to reuse') and immediately scopes what a blueprint is (working functionality, not just screen layouts). It also distinguishes itself in the same breath from search_blueprints, get_blueprint, apply_blueprint_widgets and create_flow_from_blueprint, so an agent can route correctly without opening any sibling schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when ('Check the catalog BEFORE creating custom tables or hand-rolling a capability') and names two alternatives with the condition that selects them ('To find the best match for a specific capability instead of scanning the whole catalog, use search_blueprints'). It also notes get_blueprint's role as read-only inspection, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_list_custom_tablesList the org's custom data tablesARead-onlyInspect
List your organization's custom data tables with their column schemas. Custom tables are Final's built-in, station-syncing database — data written on one station is automatically synced to every other station running the flow, and keeps working OFFLINE at the point of sale. They are the ONLY sanctioned persistence for generated apps (browser storage is per-device, never syncs, and is wiped on real Render terminals — validate_flow rejects it). Call this before create_custom_table to reuse an existing table instead of duplicating one. For NEW functionality, check search_blueprints before designing tables — a vetted blueprint may already provide the feature, and a selfPersisting blueprint's tables may NOT appear in this list (often extension-owned, resolved by name at runtime): their absence is never a reason to create lookalikes. Generated code reads/writes rows at runtime via renderClient.getCustomTableData / upsertCustomTableData (ground with lookup_command_frame).
| Name | Required | Description | Default |
|---|---|---|---|
| hubToken | No | Organization JWT fallback, only if the hub rejects your API key for this route. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, yet the description still adds meaningful behavioral context: tables sync across stations and work OFFLINE, they are the only sanctioned persistence (browser storage is rejected by validate_flow), and some blueprint-owned tables are invisible here. It does not disclose result size, pagination, or ordering, which keeps it short of a 5 for a listing endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then layered caveats in descending priority. The sentences each carry information, though the domain primer on what custom tables are and the closing renderClient API note are somewhat tangential to a pure listing call, making it longer than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by stating what is returned ('tables with their column schemas') plus the important caveat that the list can be incomplete for selfPersisting blueprints. Combined with annotations covering the safety profile and full schema coverage on the one parameter, an agent has everything needed to call this 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?
There is a single optional parameter (hubToken) with 100% schema description coverage, so the schema already explains it fully. The description adds no parameter-level detail, which is the expected baseline of 3 when the schema does the heavy lifting and the parameter is a fallback auth token.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a precise verb+resource+payload: 'List your organization's custom data tables with their column schemas.' It is clearly distinguishable from siblings flow_create_custom_table, flow_update_custom_table, and flow_list_extension_custom_tables, which the description implicitly scopes away from by talking about org-owned tables.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states exactly when to call it ('Call this before create_custom_table to reuse an existing table instead of duplicating one') and routes to alternatives for adjacent needs (search_blueprints for new functionality, lookup_command_frame for runtime data access). It even covers the when-not case: a selfPersisting blueprint's tables may be absent, and 'their absence is never a reason to create lookalikes.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_list_extension_custom_tablesList an extension's custom tablesARead-onlyInspect
List the CUSTOM TABLES an extension registers (table name + typed columns), so generated code can read/write its data at runtime via renderClient.getCustomTableData / upsertCustomTableData by table name (ground the calls with lookup_command_frame). Only the org's OWN extensions expose their tables — a public / other-org extension returns an empty list with a note. Pass the extension's id from list_extensions; the org's non-extension tables come from list_custom_tables. Read-only. Does not write files.
| Name | Required | Description | Default |
|---|---|---|---|
| hubToken | No | Organization JWT fallback, only if the hub rejects your API key for this route. | |
| extensionId | Yes | The extension's id (the `id` from a list_extensions result). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds genuine behavioral context beyond the annotations: the empty-list-plus-note behavior for public/other-org extensions, and how the returned tables are consumed at runtime via renderClient.getCustomTableData / upsertCustomTableData, plus a grounding pointer to lookup_command_frame. 'Read-only. Does not write files.' largely restates readOnlyHint, which is why this is a 4 rather than a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and the runtime-consumption rationale before the constraints, and no filler sentences. It is a single dense paragraph with stacked parentheticals, which costs a bit of 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?
No output schema exists, and the description compensates by describing the returned content (table name plus typed columns) and the empty-list case. Combined with annotations that cover the safety profile and a fully documented schema, an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters (hubToken, extensionId) are already documented in the schema, including the same 'id from a list_extensions result' note. The description adds no format, constraint, or edge-case detail about the parameters themselves, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (List) plus resource (an extension's registered custom tables) with the return shape spelled out as 'table name + typed columns'. It also distinguishes itself from two siblings: flow_list_custom_tables (org's non-extension tables) and flow_list_extensions (source of the id). An agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit prerequisites ('Pass the extension's id from list_extensions'), an exclusion ('Only the org's OWN extensions expose their tables'), and a named alternative for the other case ('the org's non-extension tables come from list_custom_tables'). It even states the outcome when the precondition fails: an empty list with a note.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_list_extensionsList available extensionsARead-onlyInspect
List the platform EXTENSIONS available to your organization — the org's own plus the public marketplace — so you can suggest, inspect, or install one. Each entry carries an id, label, category, short description, and its source (organization or public); public results need no hub credential, and a note tells you when the org-owned side was unavailable. Pass query with the capability the user asked for — results are relevance-ranked against it (label, category, and the vocabulary of the blueprints each extension enables) and capped to the genuine matches, so an empty list means NO extension provides that capability. Omit query to browse the whole catalog with skip/limit paging — publicTotal reports how many marketplace rows exist. Inspect a result with list_extension_surfaces / list_extension_custom_tables; install it org-wide with install_extension ONLY when your user explicitly asked for it. Read-only. Does not write files.
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | Public-marketplace page offset (default 0). | |
| limit | No | Public-marketplace page size (default 24, max 50). | |
| query | No | The capability the user asked for, in their own words (e.g. 'loyalty points', 'age gate', 'gift card') — results are relevance-ranked and capped to genuine matches. Omit to browse the org's own plus the first public page. | |
| hubToken | No | Organization JWT fallback, only if the hub rejects your API key for this route. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, but the description adds genuinely new behavior: public results need no hub credential, a note flags when the org-owned side is unavailable, results are relevance-ranked and capped to genuine matches (so an empty list means no capability exists), and publicTotal reports marketplace row count. This is rich context 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?
Purpose and scope are front-loaded, and the sentences about ranking, empty-list meaning, and routing all earn their place. It is dense and long, with minor redundancy in the closing 'Read-only. Does not write files.' that repeats the annotation.
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 carries the return burden and does so: entry fields (id, label, category, short description, source), the org/public split, and publicTotal are all described. Nothing needed to call or interpret it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: query is ranked against label, category, and blueprint vocabulary and capped to genuine matches, and omitting it browses the catalog with skip/limit paging. It goes beyond restating the schema fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (extensions available to the org plus the public marketplace) and immediately distinguishes scope from the inspection/install siblings. An agent can tell this apart from install_extension and list_extension_surfaces without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes: use this to 'suggest, inspect, or install', inspect results with list_extension_surfaces / list_extension_custom_tables, and install org-wide with install_extension ONLY when the user explicitly asked. Both the alternative tools and the condition that selects them are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_list_extension_surfacesList an extension's surfacesARead-onlyInspect
List the SURFACES an extension exposes — embeddable iframe injection points, each with a surfaceId, a platform (builder/hub/render), a type, and a url. Render an installed surface inside a generated screen with the engine component <ExtensionSurface surfaceId="<surfaceId>" /> (ground it with lookup_engine_component). A surface may carry requirementsMd — full markdown build instructions for re-implementing it NATIVELY in the app: when present, prefer building that surface as first-class native screens in the app's own styling with real command-frame wiring, and embed <ExtensionSurface> only for surfaces without it. Works for the org's own extensions (hub credential) and public ones (resolved via the public marketplace, no credential needed). Pass the extension's id from list_extensions. Read-only. Does not write files.
| Name | Required | Description | Default |
|---|---|---|---|
| hubToken | No | Organization JWT fallback, only if the hub rejects your API key for this route. | |
| extensionId | Yes | The extension's id (the `id` from a list_extensions result). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), so "Read-only. Does not write files" is largely redundant. The description earns credit by disclosing behavior annotations can't: auth resolution differences between org and public extensions, and how to interpret the `requirementsMd` field. No pagination or error behavior is mentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose in the first sentence, and the rest is dense with actionable detail rather than filler. It is on the long side because return-field semantics and the build-vs-embed workflow are interleaved, but each clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description appropriately compensates by naming the surface fields and explaining the meaning of `requirementsMd`, plus credential handling. It is nearly complete for a small read tool; only pagination/volume expectations are unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are already documented in the schema, including that extensionId is "the `id` from a list_extensions result" and hubToken is a JWT fallback. The description's "Pass the extension's id from list_extensions" repeats that verbatim and adds nothing, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource+scope: "List the SURFACES an extension exposes — embeddable iframe injection points." It enumerates the returned fields (surfaceId, platform, type, url), which distinguishes it clearly from sibling read tools like hub_get_extension_surfaces or flow_list_extension_custom_tables.
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?
Explicit routing guidance: pass the id "from list_extensions," and a decision rule for results — prefer building natively when `requirementsMd` is present, embed `<ExtensionSurface>` only when it's absent, grounding via lookup_engine_component. It also names both credential paths (own hub extension vs public marketplace), which is exactly the when/how an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_list_flowsList your flowsARead-onlyInspect
List the flows (app builds) in your organization, newest first: id, title, timestamps, and live theme knobs. Final staff sessions also see Final's own flows, marked owner: "Final". Use a flow id with the other tools, or create_flow to start fresh. Clones of listed builds carry an upstreamUpdate field when the build they were copied from has released a newer version — review and apply it with get_upstream_update / apply_upstream_update.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the read-only, non-destructive, closed-world profile, so the description only needs to add beyond that — and it does: result ordering, the visibility rule that Final staff additionally see Final's own flows marked owner: "Final", and the presence of an upstreamUpdate field on clones. It stops short of mentioning pagination or whether limit truncates the list.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action and scope, then the special-case visibility rule, then the follow-up routing. Dense but every clause carries information; the upstreamUpdate sentence is slightly tangential but still actionable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does the work of naming returned fields (id, title, timestamps, live theme knobs, upstreamUpdate) and the owner marker, which is exactly what an agent needs to consume the result. The remaining hole is the undocumented limit/pagination behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter (limit, 1-100) has 0% schema description coverage and is never mentioned in the description. The "newest first" phrasing hints at ordering but gives no guidance on what limit controls or how to page through a large result set, so the description fails to compensate for the schema 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?
States a specific verb+resource ("List the flows (app builds)") and pins the scope to the caller's organization with an ordering guarantee ("newest first"). It also names the fields returned and clarifies the special-case owner value, so an agent can distinguish it from flow_create_flow and the flow_read/write file tools without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It routes the agent forward explicitly: "Use a flow id with the other tools, or create_flow to start fresh," and points clones at get_upstream_update / apply_upstream_update. That covers when to use this result and what to do next, but there is no explicit statement of when not to call it (e.g. a search/filter alternative).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_list_secret_keysList stored secret key namesARead-onlyInspect
List the key NAMES already stored in your organization's encrypted secrets vault — never the values (no tool returns a secret value). Use this to (a) reuse an existing key instead of requesting a new one, and (b) poll whether a request_secret ask has been fulfilled by the human. Generated code reads a secret at RUNTIME with renderClient.getSecretVal({ key }) — the build ships key names only.
| Name | Required | Description | Default |
|---|---|---|---|
| hubToken | No | Organization JWT fallback, only if the hub rejects your API key for this route. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safe read profile (readOnlyHint=true), but the description adds substantial non-structured context: no tool returns secret values, and generated code resolves secrets at runtime via renderClient.getSecretVal({ key }) with only key names shipping in the build. This is materially beyond 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?
What-it-does is front-loaded, followed by usage cases and a runtime clarification. The parenthetical and closing sentence about runtime resolution are dense but genuinely useful for a secrets tool, though the final clause is slightly tangential to the act of listing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description explains what is returned (key names only), why that is safe, and how consumers use them at runtime. For a zero-required-param read tool, an agent has everything it needs to call this 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%, so the single hubToken parameter is documented in the schema itself (a JWT fallback for when the hub rejects the API key). The description adds nothing about it, so the baseline 3 for high coverage is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource — listing the key NAMES stored in the organization's encrypted secrets vault — and immediately scopes what it does NOT return (never values). It is clearly distinguishable from siblings, particularly the referenced request_secret.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two explicit when-to-use cases: (a) reuse an existing key rather than requesting a new one, and (b) poll whether a request_secret ask has been fulfilled. The alternative (request_secret) is named with the condition that selects it, so nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_log_messageLog a message to the flow's chatBInspect
Record a message in this agent's chat inside the builder — the user's request (role 'user') or your own progress/summary (role 'assistant'). Keeps the builder timeline faithful to what happened in this session.
| Name | Required | Description | Default |
|---|---|---|---|
| role | Yes | ||
| text | Yes | ||
| agent | No | ||
| flowId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=false, so the write-but-non-destructive profile is known. The description adds that the message is scoped to this session and keeps the builder timeline faithful, but says nothing about persistence, ordering, idempotency, or auth needs. Adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and resource, with no wasted filler. The second sentence adds rationale rather than redundancy, though it is slightly more prose than strictly needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter write tool with no output schema and zero schema-level parameter docs, the description covers role semantics but leaves flowId and agent undocumented. It is minimally viable but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for all four parameters. It only gestures at 'role' (values already exposed by the schema enum) and says nothing about flowId, text format, or the optional agent parameter, leaving the majority of parameters unexplained.
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?
Names a specific verb (record/log) and resource (a message in the builder chat), and clarifies the two roles it can carry. It does not compare itself to any sibling, but no obvious overlapping flow_* tool exists, so the purpose is still 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 clause about the user's request (role 'user') versus your own progress/summary (role 'assistant') hints at when each role applies, but there is no explicit statement of when to call this tool versus other builder-facing tools, and no when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_lookup_command_frameLook up command-frame APIARead-onlyInspect
Look up the EXACT, version-locked command-frame API a generated Final POS app runs on: renderClient method signatures + params, CF* entity field lists, pub/sub topic event vocabularies, and worked examples. Pass one of method/entity/topic for a precise lookup, entity+field to confirm a field exists, query for fuzzy search, or the plural batch forms. Ground every renderClient call in this before writing it — fabricated fields/methods fail on real Render devices. Typed signatures and entity fields are authoritative; the worked examples come from upstream docs and are NOT typechecked, so where they disagree, trust the types. Results carry traps for known field-level gotchas.
| Name | Required | Description | Default |
|---|---|---|---|
| field | No | ||
| query | No | ||
| topic | No | ||
| entity | No | ||
| method | No | ||
| topics | No | ||
| methods | No | ||
| entities | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only establish read-only/non-destructive, and the description adds substantially more: fabricated names fail on real devices, typed signatures outrank worked examples that are explicitly not typechecked, and results carry `traps` for known field gotchas. This is exactly the kind of consequence and reliability context annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what the tool returns, then usage modes, then the authority caveat and traps note — no filler sentences. The prose is dense and could be split with the parameter modes listed tersely, but every sentence carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does mention the shape of results in part (traps) and where the data comes from, and it addresses the conflicting-authority problem that could otherwise mislead an agent. It stops short of describing overall result structure or limits, which is a minor gap for a read-only reference tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 8 parameters, so the description carries the full burden and largely meets it by explaining the intent behind method/entity/topic/field/query and the plural batch variants. It does not say what happens when multiple lookup keys are combined or how query matching works, leaving some ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource with unusual precision: 'version-locked command-frame API' covering renderClient signatures, CF* entity fields, pub/sub topics, and examples. The scope is narrow enough that an agent can tell it apart from the sibling lookup tools (flow_lookup_pos_api, flow_lookup_engine_component) by subject matter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear triggering condition ('ground every renderClient call in this before writing it — fabricated fields/methods fail on real Render devices') and maps each parameter mode to a distinct intent: single key for precise lookup, entity+field for existence checks, query for fuzzy search, plurals for batch. It never names or contrasts the sibling lookup tools, so the agent must infer which lookup to reach for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_lookup_engine_componentLook up engine helper componentsARead-onlyInspect
Look up the exact props/signature of an engine-owned ./final/* helper: the @/final/ui primitives (Button, IconButton, Card, Tile, Input, Field, Chip, ListRow, Dialog, Sheet, Toolbar, Heading, EmptyState, cn) plus usePrint, StationHomeButton, SwitchUserButton, useStationHome, Barcode, BootSplash. These are re-asserted into every generated app — compose screens from the primitives (see get_scaffold contracts.designLadder) and import the rest instead of hand-rolling buttons/cards/dialogs, printing, station-home/switch-user, barcodes, or the loading splash. Pass name for a precise lookup, query for fuzzy search, or neither to list all.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| query | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered by structured data. The description adds real context beyond that — that these helpers are re-asserted into every generated app and that lookups return props/signature — but says nothing about result size, latency, or what a miss returns.
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 dense paragraph, front-loaded with the verb and resource before the enumeration. The long component list is justified because exact membership is what the agent needs, but the sentence is packed and could have been split for scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must carry return-value semantics; it does so at a high level ('exact props/signature'). Combined with the usage rules and mode selection, an agent has enough to call this correctly, though the shape of the returned signature data is unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and neither parameter is documented in the schema, so the description carries the full burden. It does this credibly: name = precise lookup, query = fuzzy search, neither = list all. It stops short of giving format details (e.g. path-style vs bare component name).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb ('Look up') and a well-defined resource ('x engine-owned ./final/* helper') and then enumerates the exact component surface (Button, Card, Dialog, usePrint, Barcode, etc.), so an agent knows exactly what it will retrieve. It is clearly distinguishable from sibling lookups like flow_lookup_command_frame and flow_lookup_pos_api, which target different surfaces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong prescriptive guidance: compose screens from the primitives, import the rest, and stop hand-rolling buttons/cards/dialogs, printing, station-home, barcodes or splash. It also routes the agent between modes (name for precise lookup, query for fuzzy, neither to list all). It does not explicitly contrast itself against sibling lookup tools, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_lookup_pos_apiLook up Final POS REST APIARead-onlyInspect
Look up the Final POS REST API (https://api.finalpos.com) — endpoint method/path, request fields, response shape, and a worked fetch example. This is the ONLINE-ONLY fallback for admin/management operations command-frame cannot express (creating products/variants/categories, customer management, outlets/stations/tax tables, webhooks). Command-frame is ALWAYS first choice for live POS data — it works offline and the host owns money/totals. A call to this API is network egress from the station: it fails whenever connectivity does, so never put one in the sale path — use it for setup/admin work and degrade gracefully. Pass resource to list a domain, operation for one endpoint, or query for fuzzy search.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| resource | No | ||
| operation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly/non-destructive/closed-world, so the description carries the interesting behavior and does it well: online-only dependency, network egress from the station, failure whenever connectivity drops, and the warning not to place it in the sale path. One mild tension is openWorldHint=false against an 'ONLINE-ONLY' framing, but the network-egress sentence describes calls made through the documented API rather than this lookup itself, so it is not a genuine 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?
Front-loaded with the purpose and return shape, then the routing rule, then the constraint — a sound order. It is dense and long-ish (roughly five clauses), and a couple of parenthetical enumerations could be trimmed, but essentially every sentence carries decision-relevant content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description states what the lookup yields (method/path, request fields, response shape, worked fetch example), which parameters select which result granularity, the alternative tool, and the operational constraint. For a 3-param read-only lookup, nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the schema gives bare string types, so the description must compensate and largely does: 'Pass resource to list a domain, operation for one endpoint, or query for fuzzy search' assigns distinct semantics to all three parameters and disambiguates resource vs operation vs query. It does not document accepted resource/operation identifiers or formats, but the three-way distinction is the key information an agent needs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (look up) and resource (the Final POS REST API) and enumerates exactly what it returns: endpoint method/path, request fields, response shape, and a worked example. It also explicitly distinguishes itself from the sibling flow_lookup_command_frame and from command-frame for live POS data, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (admin/management operations command-frame cannot express: products/variants/categories, customers, outlets/stations/tax tables, webhooks), when-not (never in the sale path; command-frame is ALWAYS first choice for live POS data), and the failure mode to plan for (network egress that fails offline; degrade gracefully). This is close to a complete routing rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_open_in_builderGet the builder hand-off linkBRead-onlyInspect
The recommended way to finish: a deep link that opens this flow in the Miami builder, where the owner can review the work, restore checkpoints, and deploy through the Launch tool (validation gates, listing media, changelog, version history).
| Name | Required | Description | Default |
|---|---|---|---|
| flowId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered without the description's help. The description adds genuine context beyond that — that the output is a link consumed by a human owner who can restore checkpoints and deploy via the Launch tool. It omits practical traits an agent would want: link lifetime/expiry, any permission requirement to generate it, and whether the link is single-use.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single sentence, but a padded one: 'The recommended way to finish' is promotional framing, and the parenthetical inventory (validation gates, listing media, changelog, version history) describes the Launch tool rather than this tool's behavior. The actual fact — it returns a deep link into the builder — could be front-loaded more cleanly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only tool with no output schema, the essentials are mostly present: what it produces (a deep link) and who consumes it (the owner, in the builder). Missing pieces are the undisclosed flowId semantics and the return shape (is the link a plain string?), which matter because there is no output schema to fall back on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter, flowId, and schema description coverage is 0% — the schema alone tells the agent nothing about what the id refers to. The description only indirectly gestures at it via 'this flow,' with no statement that flowId is the flow to be opened, nor any format/example. With low coverage the description is expected to compensate and it largely does not.
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 outcome: it returns 'a deep link that opens this flow in the Miami builder.' An agent can tell this is a hand-off/link-generation tool rather than a deploy or preview tool. It does not, however, name or contrast itself with any sibling (e.g. flow_deploy_flow, flow_get_preview_status), so differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'The recommended way to finish' implies this is called at the end of a flow authoring session and hands control to the owner, which is useful context. But it gives no explicit when-not guidance and never mentions alternatives such as flow_deploy_flow or flow_validate_flow, so the agent must guess at the boundary between this and the deploy path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_read_flow_filesRead a flow's filesARead-onlyInspect
Read a flow's generated source tree. Omit paths to list all file paths (cheap); pass paths to fetch specific files' contents.
| Name | Required | Description | Default |
|---|---|---|---|
| paths | No | ||
| flowId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds the useful detail that listing is 'cheap' versus fetching contents, but says nothing about sizing, errors, or what the tree contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler; the core purpose comes first and the parameter guidance follows immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with annotations covering the safety profile and no output schema to explain, the description supplies everything needed to invoke it correctly in either mode.
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, and it does so well for `paths` (omit vs pass semantics and cost). It says nothing about `flowId`, though its meaning is largely inferable from the tool name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: reading a flow's generated source tree. An agent can distinguish it from write/delete siblings by the verb, though the description never names flow_write_flow_files or flow_get_scaffold to draw the boundary explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly explains the two invocation modes: omit `paths` to list paths (cheap), pass `paths` to fetch contents. This is practical when/how guidance for the parameters, but it offers no guidance on when to prefer this over sibling tools like flow_get_scaffold.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_rename_flowRename a flowAInspect
Rename a build (flow) authoritatively across the platform in one call: the builder header, list_flows / open_in_builder, and the Deerlake catalog all reflect the new title, and updatedAt is bumped. A deployed build keeps its hosted web app: the hostname and version history are unchanged, and the next deploy_flow publishes the next version. Does NOT edit the app source: rename a hardcoded old name yourself with write_flow_files.
| Name | Required | Description | Default |
|---|---|---|---|
| agent | No | ||
| title | Yes | ||
| flowId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare non-readonly/non-destructive; the description goes far beyond by enumerating the concrete effects (builder header, list_flows, open_in_builder, Deerlake catalog, updatedAt bump) and the deployment consequences (hosted web app retained, next deploy_flow publishes next version). This is exactly the mutation context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the scope, then the deployment behavior, then the exclusion. Every sentence carries distinct, non-redundant information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and only weak annotation coverage, the description fully covers effects and side effects, so an agent understands the outcome. The remaining gap is parameter-level guidance (flowId, agent) for a tool with three undocumented parameters.
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 parameter meaning, but it never names flowId or the agent parameter and only obliquely implies that title is the new name. The 120-char limit and required/optional status are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Rename a build (flow)') plus the authoritative scope ('across the platform in one call'), which separates it from the many other flow_* tools. An agent can identify this as the dedicated rename operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly carves out what this tool does NOT do and names the alternative ('Does NOT edit the app source: rename a hardcoded old name yourself with write_flow_files'). It also tells the agent when the rename is safe for a deployed build (hostname and version history unchanged).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_request_secretAsk the human to store a secretAInspect
Ask the flow's owner to enter a third-party credential (API key, auth token, webhook secret) into Final's encrypted vault. THIS TOOL TAKES NO VALUE and no tool ever returns one — the human types it into a masked input in the Miami builder, and it goes straight into the vault. Why: flow builds are DISTRIBUTABLE to other companies, so a credential must never be baked into the code (validate_flow and deploy_flow scan for and block hardcoded secrets). Your generated code reads it at RUNTIME with renderClient.getSecretVal({ key }) and must degrade gracefully while the key isn't stored yet (disable the integration + tell the user to configure it — never crash). After calling this: tell YOUR user to open the builder link and enter the value, and poll list_secret_keys to detect when it lands.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Kebab-case vault key the code will read, e.g. 'twilio-auth-token'. | |
| agent | No | ||
| label | Yes | Human label shown in the builder, e.g. 'Twilio Auth Token'. | |
| flowId | Yes | ||
| reason | Yes | Why the app needs this credential. | |
| docsUrl | No | Where the user can find/generate the credential. | |
| hubToken | No | Organization JWT fallback, only if the hub rejects your API key for this route. | |
| provider | No | The third-party service, e.g. 'Twilio'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare only non-readonly, non-destructive, closed-world. The description goes far beyond that: it takes no secret value, no tool ever returns one, the human types into a masked builder input, the value lands in an encrypted vault, and the code must degrade gracefully until the key exists. That is exactly the operational context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then justified with the why, the runtime contract, and the post-call steps; nearly every sentence carries new information. It runs long and leans on caps-lock emphasis and a dense final sentence, which costs it the top mark.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, no-output-schema tool, the description covers the full lifecycle: why the call is needed, that no value flows through the tool, how generated code consumes the key, the degradation requirement, and the required follow-up (notify the user, poll list_secret_keys). Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so most parameters are self-documented; the description still adds real meaning by tying 'key' to runtime consumption via renderClient.getSecretVal({ key }) and by implying the credential is never passed in. It does not explain hubToken, agent, docsUrl or provider beyond their schema text, which is the only 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?
States a specific actor, action and resource: it asks the flow's owner to enter a third-party credential into Final's encrypted vault. It also implicitly separates itself from flow_list_secret_keys, which it names only as a polling detector, so an agent can tell the requesting tool from the reading 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 supplies when to use it (a credential is needed and must not be hardcoded), why not to inline it (builds are distributable and validate_flow/deploy_flow block hardcoded secrets), and what to do afterwards (tell your user to open the builder link and poll list_secret_keys). Alternatives and follow-up actions are explicit rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_search_blueprintsSearch the blueprint catalogARead-onlyInspect
SEMANTIC search over the vetted blueprint catalog — matches are ranked by what you MEAN, not by shared words, so describe the capability in plain language ('rewards for repeat customers' finds the loyalty blueprint). RUN THIS FIRST — before creating custom tables or hand-rolling a capability: blueprints ship working FUNCTIONALITY (gift cards, loyalty, payment surfaces, carts), not just screen layouts. Search once per FEATURE you're adding (smart grid, gift cards, loyalty points, receipts) and REPEAT it for each distinct capability rather than issuing one broad query — a build usually combines several. Returns { results, note? }: blueprint summaries (id, slot, title, summary, surfaces, tags, selfPersisting, match score in [0,1]) best match first. selfPersisting: true means the blueprint reads/writes its OWN custom tables by exact name inside its code, and apply_blueprint_widgets provisions them in your organization automatically (extension-owned ones come from installing that extension) — NEVER create a table for a feature it covers. Prefer this over list_blueprints when you know what you need. Pick the widgets you need and copy them with apply_blueprint_widgets({ flowId, picks }) — applied ON TOP of the current build, never replacing it. Low match scores across the board mean no vetted blueprint fits — only then build that piece from scratch grounded in the command-frame docs. Optional slot/surface narrow the results; limit caps how many are returned (default 10).
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| slot | No | ||
| limit | No | ||
| query | Yes | ||
| surface | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=false, destructiveHint=false), yet the description adds substantial non-obvious behavior: the { results, note? } return shape, the meaning of selfPersisting, the fact that apply_blueprint_widgets auto-provisions the blueprint's own tables, the 'NEVER create a table for a covered feature' constraint, and that applied widgets stack on top of rather than replace the current build.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core 'what' and the RUN THIS FIRST directive, and every sentence carries actionable information. It is dense and long with heavy capitalization emphasis, which slightly hurts scanability, but there is little pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only search tool with no output schema, the description supplies the return shape, the ranking semantics, the follow-up action (apply_blueprint_widgets) and its provisioning side effects, and the fallback when no match is found. Nothing an agent needs to invoke or act on the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It explains slot/surface as result narrowers and limit as a cap with default 10, but omits the `kind` enum (widget-set/fbb/whole-flow/any) entirely and gives no guidance on the enum values for slot/surface. Query semantics are only implied by the plain-language matching example, so compensation is partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (semantic search over the blueprint catalog) and explains the ranking mechanism (meaning, not shared words) with a concrete example. It explicitly distinguishes itself from the sibling flow_list_blueprints ('Prefer this over list_blueprints when you know what you need'), so an agent can route between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('RUN THIS FIRST — before creating custom tables or hand-rolling a capability'), when-not ('Low match scores across the board mean no vetted blueprint fits — only then build that piece from scratch'), and the alternative (list_blueprints). It even prescribes the query strategy: one search per distinct feature rather than a single broad query.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_start_previewStart (or sync) the live previewAInspect
Boot the flow's server-side preview sandbox (Vite dev server) — or reconcile a running one to the flow's current files — and return its public HTTPS URL already pinned to this flow's mock dataset: the maker's pick, else its vertical's (sushi, not restaurant). Open the URL in a browser to see the app; call again after write_flow_files to sync. Previews idle-stop on their own; call stop_preview when done to free resources sooner.
| Name | Required | Description | Default |
|---|---|---|---|
| flowId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, openWorldHint=false, but the description adds genuinely non-derivable behavior: previews idle-stop on their own, calling stop_preview frees resources sooner, the URL is public HTTPS and pre-pinned to a mock dataset (maker's pick, else vertical's). It does not cover auth/permission needs or concurrency behavior when a preview is already live beyond the parenthetical 'reconcile a running one'.
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 primary action and return value are front-loaded, and the lifecycle guidance follows in sequence with no filler sentences. It is somewhat dense with em-dashed parentheticals (e.g., 'sushi, not restaurant') that add flavor but mild reading overhead.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description covers the return value (public HTTPS URL), the dataset-pinning rule, the sync trigger, and the resource lifecycle, which is what an agent needs to invoke it correctly. Remaining gaps are the undocumented flowId and the relationship to the sibling preview-status/sync tools.
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% and the single required parameter flowId is never explained in the description. The text refers to 'this flow's mock dataset' and 'the flow's current files' but never states what flowId must contain (ID vs name) or where to get it, so the description does not compensate for the documentation 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?
Specific verb+resource with return value stated: 'Boot the flow's server-side preview sandbox (Vite dev server)... and return its public HTTPS URL'. It names the sibling it is not in the lifecycle case (stop_preview) and the follow-up trigger (call again after write_flow_files). It stops short of disambiguating from flow_sync_preview and flow_get_preview_status, despite the title's '(or sync)' overlapping with a dedicated sync sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational context: open the URL in a browser, call again after write_flow_files to sync, and call stop_preview when done to free resources sooner. That is real when-to-use guidance with one explicit alternative. It omits any routing guidance versus flow_sync_preview/flow_get_preview_status, so the agent must guess which of the overlapping preview tools to pick.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_stop_previewStop the previewADestructiveInspect
Stop the flow's preview sandbox and free its resources. The next start_preview cold-boots in a couple of seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| flowId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (destructiveHint=true, readOnlyHint=false), so the description's job is to add context. It does: it discloses that resources are freed and, usefully, that the next start_preview incurs a cold boot, a restart-cost trait not present in the annotations. It does not explicitly state that live preview state is discarded.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, purpose front-loaded ahead of the consequence note, with zero filler. Every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter teardown tool with no output schema and annotations already covering safety, the description is nearly sufficient: purpose plus restart consequence are covered. Minor gaps remain around unsaved-state loss and behavior when no preview is running.
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% and the single parameter flowId is never named or explained in the description. The phrase "the flow's preview" implies a flow identifier is needed, which partially compensates, but with one undocumented parameter the description leaves the argument semantics to inference.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (stop) plus a precise resource (the flow's preview sandbox), and it names the counterpart operation start_preview, which lets an agent separate it from flow_get_preview_status and flow_sync_preview. It stops short of explicitly contrasting with those other preview siblings, keeping it at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use guidance; the agent must infer that this is called to tear down a preview. The cold-boot note hints at a trade-off but never states conditions, prerequisites, or alternatives such as whether a running preview is required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_sync_previewSync the preview to the flow's filesAInspect
Reconcile a (running or cold) preview sandbox to the flow's current files and run the green-build gate (tsc + vite build). Returns the gate result — the fastest way to know your code actually compiles. The engine forces parts of package.json on every sync: the dev/build/typecheck scripts, and the vendored command-frame + mock packages to their bundled tarballs. Baseline and build dependencies are re-added only when you declared them nowhere, so your own additions and pins survive. Shares one rate bucket with start_preview — sync once per change-set, not per file.
| Name | Required | Description | Default |
|---|---|---|---|
| flowId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only tell the agent this is a non-read-only, non-destructive, non-open-world call. The description goes much further: it discloses that the engine force-overwrites parts of package.json (dev/build/typecheck scripts and vendored command-frame + mock packages), that baseline/build deps are re-added only when undeclared so user pins survive, and that it shares a rate bucket with start_preview. This is exactly the mutation-side detail annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and its payoff (the build gate result) are front-loaded, and every subsequent sentence adds non-redundant behavior (forced package.json fields, dep re-add rules, rate bucket). It is dense and slightly long, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still explains the return value ('Returns the gate result'), covers the mutation side effects, the running/cold precondition, and the rate-limit interaction with a sibling. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter (flowId) with 0% schema description coverage, and the description never mentions it or its format. It is self-evident from the name and required, so the gap is mild rather than disqualifying, but the description adds no semantic value over the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (reconcile/sync) and resource (preview sandbox vs. the flow's current files), plus the concrete downstream action (run the green-build gate: tsc + vite build). An agent can distinguish this from flow_start_preview, flow_get_preview_status and flow_write_flow_files without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real usage context — 'the fastest way to know your code actually compiles' — and names the sibling it shares a rate bucket with (start_preview), with the explicit instruction 'sync once per change-set, not per file.' It stops short of a full when-to-use/when-not matrix against every preview sibling, but the routing guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_update_custom_tableChange a custom table's schemaADestructiveInspect
Evolve an EXISTING custom data table's schema: add columns, change existing ones (rename/retype — destructive for stored rows, use sparingly), or drop columns. The table is identified by its kebab-case name from list_custom_tables. Tables are ORG-WIDE, so a schema change lands for every flow and station already using this one — check who reads it before reshaping. NEVER rename or reshape a table a selfPersisting blueprint reads/writes — its copied code references the exact current names. Per-operation failures are collected rather than aborting the whole change. Row data itself stays a runtime concern of the generated app (renderClient).
| Name | Required | Description | Default |
|---|---|---|---|
| hubToken | No | Organization JWT fallback, only if the hub rejects your API key for this route. | |
| addFields | No | ||
| tableName | Yes | The existing table's kebab-case name (see list_custom_tables). | |
| removeFields | No | Columns to drop (destructive: their data is removed). | |
| updateFields | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, but the description adds substantial context beyond that: exactly what is lost (stored rows on retype, row data orphaned under the old key on rename), the org-wide blast radius ('a schema change lands for every flow and station'), the blueprint constraint, and the partial-failure model ('Per-operation failures are collected rather than aborting'). This is meaningful disclosure an agent could not infer from the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then layered with the scoping constraint, the safety rule and the failure model. Every sentence carries distinct, load-bearing information and none restates the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but the description needn't explain return values; it instead covers the things that matter for a destructive mutation: scope, irreversibility, downstream dependents, and error behavior. Nothing an agent needs in order to call this safely 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 60%, so the schema already documents tableName, hubToken, removeFields and the reference fields. The description maps its language onto addFields/updateFields/removeFields and reinforces that rename/retype is destructive, but adds no syntax or format detail beyond the schema. A 3 baseline is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Evolve an EXISTING custom data table's schema') and enumerates the three sub-operations (add, change, drop columns). It is clearly distinguishable from sibling flow_create_custom_table and flow_list_custom_tables, which it references by name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('EXISTING' table, identified by kebab-case name from list_custom_tables), when-not ('use sparingly' for rename/retype) and hard exclusions ('NEVER rename or reshape a table a selfPersisting blueprint reads/writes'). The alternative path (list_custom_tables) is named directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_validate_flowValidate a flow against the platform contractARead-onlyInspect
Deterministic STATIC checks against the platform contract: (1) guardrails — fabricated renderClient methods, forbidden browser APIs/imports, engine-file writes; (2) a REAL TypeScript check of command-frame usage against the PINNED .d.ts the app installs (the version is stamped in the result) — this proves TYPES, never runtime behaviour and never device parity; (3) a hardcoded-credentials scan; (4) flowTypeErrors — a whole-tree tsc against REAL react types, which catches what (2) cannot see (e.g. a useEffect cleanup that returns a value, a hard TS2345 the builder's in-chat gate will report to whoever opens this flow); plus advisory warnings (client money math, hardcoded catalog data, missing station-home/data-test, tip-as-cart-fee) that don't affect clean but each predict a real on-device failure. secretFindings BLOCK deploy_flow; everything else is advisory. Run it after each write batch, before start_preview.
| Name | Required | Description | Default |
|---|---|---|---|
| flowId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false, destructiveHint=false, so the safety profile is covered. The description goes well beyond that: it clarifies the checks are deterministic/static, that the TS check proves types but never runtime behavior or device parity, that a version is stamped in the result, and which findings block deploy vs. remain advisory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core claim ('Deterministic STATIC checks against the platform contract') then enumerates the checks in order. The content is dense and warranted by the tool's complexity, though the single run-on sentence with nested parentheticals hurts 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?
There is no output schema, so the description must explain returns, and it does: it names flowTypeErrors, warnings, secretFindings, and the stamped .d.ts version, and explains what each means for the agent's next action. Nothing needed to interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single required parameter flowId, and the description never mentions the parameter or what value it expects. Though flowId is inferable from the tool name, the description adds no semantic meaning beyond the obvious, so it fails to compensate for the coverage 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?
States a specific verb+resource ('Validate a flow') and immediately enumerates the exact checks performed (guardrails, real tsc against pinned .d.ts, credential scan, whole-tree type check, advisory warnings). This is unmistakably distinct from siblings like flow_deploy_flow or flow_start_preview.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit workflow timing ('Run it after each write batch, before start_preview') and a routing rule tied to a sibling ('secretFindings BLOCK deploy_flow; everything else is advisory'). The agent knows both when to call it and how its result gates another tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_write_flow_filesWrite files into a flowADestructiveInspect
Create or overwrite files in a flow's tree (full contents, not diffs). Engine-owned paths are rejected — see get_scaffold. Every write lands as a restorable checkpoint and is narrated in the builder chat. If a live preview is running, follow up with start_preview to sync it. Validate with validate_flow before deploying. If a call returns an error the files may STILL have landed (and a very large payload can truncate mid-file) — re-read with read_flow_files before retrying, never blind-retry. Because writes replace whole files, keep files small and single-purpose so an edit can't clobber unrelated working code.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | One-line summary of the change, shown in the builder chat. | |
| agent | No | ||
| files | Yes | ||
| flowId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, but the description adds substantial context beyond them: writes land as restorable checkpoints, are narrated in the builder chat, and carry non-obvious failure semantics (files may still have landed on error, large payloads can truncate mid-file). It also discloses the whole-file replacement model and the engine-owned path restriction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and then layered with behavior; nearly every sentence carries operational value rather than filler. It is dense and fairly long, but the density is justified for a destructive write tool with tricky error semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation tool with no output schema, the description covers everything an agent needs: mutation semantics, checkpoint/rollback behavior, engine-owned path rejection, preview-sync follow-up, validation step, error-recovery guidance, and safe file-sizing advice. Only the per-parameter docs are thin, which the schema partially covers.
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 25% (just the 'note' field), so the description is expected to compensate. It clarifies the semantics of the files payload (full contents, whole-file replacement, keep files small, engine-owned paths rejected) and indirectly explains 'note' via chat narration, but it never addresses the 'agent' or 'flowId' parameters, leaving part of the coverage gap unfilled.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create or overwrite files in a flow's tree') and immediately scopes it ('full contents, not diffs'), which separates it from a diff/patch tool. It also names related siblings (get_scaffold, read_flow_files, validate_flow, start_preview), so an agent can place it in the workflow without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when/when-not and follow-up routing: engine-owned paths are rejected and redirected to get_scaffold, validation should happen via validate_flow before deploying, and a live preview requires a follow-up start_preview call. It even prescribes the correct recovery path (re-read with read_flow_files, never blind-retry), which is unusually actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_connectionAbout this connectionBRead-onlyInspect
Who this connection acts as: organisation, user, the company Hub tools act on and the companies you may switch to, the allowed and listed packs, and how to reach tools that are not listed.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so the safety profile is fully covered by structured data. The description usefully adds that this is an identity/context introspection call whose output includes switchable companies and unlisted-tool access, but it says nothing about auth scope, caching, or freshness of the connection 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?
It is a single sentence with no filler, which is efficient, but it is a flat list of five items with no leading verb and no front-loaded summary of purpose, making it harder to parse quickly than it needs to be. A short opening clause such as 'Returns the current connection context:' would have improved scannability at negligible cost.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of explaining return contents, and it does so by enumerating the fields of interest (organisation, user, acting company, switchable companies, packs, unlisted-tool path). That is reasonably complete for a zero-parameter introspection tool, though it stops short of saying whether the packs list is filtered by permissions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so by the rubric this is a baseline 4. The description appropriately spends its words on what is returned rather than on inputs, which is the right allocation for a no-arg tool.
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 enumerates what the tool surfaces (caller identity, organisation/user, active company, switchable companies, allowed/listed packs, how to reach unlisted tools), which is concrete content rather than a restatement of the name. It lacks an explicit verb (e.g. 'Returns...'), so it reads as a content list, but an agent can still infer that this is a connection-context/introspection read. It does not explicitly differentiate itself from near-neighbours like list_packs or switch_company.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this tool, no prerequisite or ordering advice (e.g. 'call this first to orient yourself'), and no exclusion of alternatives. The mention of 'how to reach tools that are not listed' hints at a discovery role, but that is inference, not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_add_customer_noteAdd customer noteAInspect
Add a note to a customer — an allergy, a preference, what happened with an order. Existing notes are KEPT; this appends. Takes the customer ID from get_customers. Staff read these in the cabinet, so write what the merchant said, not your own summary.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | The note text | |
| customerId | Yes | Customer id from get_customers — not a name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this writes but is non-destructive. The description adds real behavior beyond them: append semantics ('Existing notes are KEPT'), and that output is staff-facing. It doesn't cover permissions or failure modes, but for a low-risk note append this is solid added context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, all load-bearing: purpose, append-vs-replace behavior, prerequisite source, and authoring guideline. Front-loaded with the action and zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter append tool with 100% schema coverage, full annotations and no output schema, nothing an agent needs to invoke it correctly is missing. Return-value detail is unnecessary here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description goes slightly beyond it by framing what the message should contain ('write what the merchant said, not your own summary'), which is genuine content-level guidance the schema's 'The note text' does not supply.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Add a note to a customer') and immediately disambiguates the mutation flavor: existing notes are KEPT, this appends. That separates it from hub_update_customer and any replace-style sibling without needing the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition ('Takes the customer ID from get_customers'), routing the agent to the lookup tool first. It doesn't name an explicit when-not case (e.g., when to edit the customer record instead of annotating), but the usage context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_add_modifier_choiceAdd a choiceAInspect
Add one choice to an existing modifier, leaving the rest alone. This is the safe way to extend a modifier — unlike update_modifier, it cannot drop anything. Appends to the end unless sortOrder says otherwise. price is the extra charge per unit as a human amount ("0.70"); omit it for a choice that costs nothing, which still prints on the receipt.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | What the cashier sees, e.g. "Oat milk" | |
| price | No | Extra charge per unit, e.g. "0.70". Omit or "0" for a choice that costs nothing | |
| isDefault | No | Pre-selected at the till. On "Pick one" at most one choice may have it | |
| sortOrder | No | Position in the list. Omit to append | |
| modifierId | Yes | Modifier id from get_modifiers | |
| defaultQuantity | No | Starting count — stepper modifiers only | |
| unavailableOutletIds | No | Outlets where this choice is NOT sold (an exception list — omit or [] means sold everywhere). Outlet ids from get_outlets |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so safety is partly covered; the description reinforces and extends this with concrete behavior — appends to the end unless sortOrder overrides, and cannot drop existing choices. It adds real context beyond the annotations, though it doesn't mention auth/permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with verb+resource+scope, then the safety contrast, then the parameter nuance. Every sentence earns its place with no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the operation's key nuances (safe append, price format, ordering) for a write tool with no output schema. It doesn't describe the success response, a minor gap, but nothing needed to invoke correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds genuine meaning: price is a human-readable amount ('0.70'), omitting it still prints a free choice on the receipt, and sortOrder controls append vs position. These go beyond the schema's own text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add one choice to an existing modifier') and scopes it precisely ('leaving the rest alone'). It explicitly distinguishes itself from update_modifier, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'This is the safe way to extend a modifier — unlike update_modifier, it cannot drop anything' names the alternative and the condition that selects this tool. The add-vs-update distinction is spelled out rather than left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_add_product_imagesAdd product imagesAInspect
Add photos to an existing product — from public URLs, or as base64 bytes when the merchant attached the file itself and there is no URL. URL images are downloaded and stored on the platform, so the product never depends on someone else's site staying up. Existing photos are KEPT — this adds to them. JPEG/PNG/WebP/GIF/HEIC, up to 20MB each. Takes the product ID from get_products, never a name.
| Name | Required | Description | Default |
|---|---|---|---|
| imageUrls | No | Public URLs of the photos to add | |
| productId | Yes | Product id from get_products — not a name | |
| imageFiles | No | Photos the merchant attached — use when there is no public URL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations' safety profile, it discloses non-obvious behavior: URL images are downloaded and stored server-side (so the product doesn't depend on an external site), existing photos are KEPT (additive, not destructive), and it lists format and size limits (JPEG/PNG/WebP/GIF/HEIC, 20MB each). This is genuinely valuable context not derivable from 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?
Dense and front-loaded, with each sentence carrying a distinct fact (source options, storage behavior, additive semantics, limits, ID source). The final sentence repeats the schema's productId note, a minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, it covers sources, storage side effects, additive semantics, and resource constraints. It doesn't address return value/error behavior, duplicate handling, or auth/permission requirements, leaving a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, but the description adds meaning the schema lacks: accepted formats and the 20MB-per-image bound, plus the URL-vs-base64 selection logic. The productId guidance duplicates the schema description verbatim, which caps it below 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (add) and resource (photos/images to an existing product), and clarifies it augments rather than replaces existing photos. An agent can distinguish it from hub_upload_media or hub_update_product without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains the URL-vs-base64 decision rule ('base64 bytes when the merchant attached the file itself and there is no URL') and routes the agent to get_products for the ID. It stops short of naming concrete alternative tools (e.g. hub_upload_media) for the no-URL case, so it's clear context without explicit alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_add_tax_rate_to_groupAdd rate to groupADestructiveInspect
Add an EXISTING rate to a tax group, or change that rate’s compounding flag within the group. Both ids come from get_taxes. This shares the rate — it does not copy it. The group starts charging the rate’s existing per-outlet percentages, and a later edit to that rate changes this group too. Use create_tax_rate instead when the rate does not exist yet. The rate is appended last in the charging order; use update_tax_group with rateIdsInOrder to move it. CONFIRM WITH THE MERCHANT — this immediately adds tax to every product in the group. Sales already rung up are NOT recalculated — this only affects sales from now on.
| Name | Required | Description | Default |
|---|---|---|---|
| taxRateId | Yes | Tax rate id from get_taxes — an existing rate, shared not copied | |
| taxGroupId | Yes | Tax group id from get_taxes | |
| compounding | No | Charge this rate on the running total including the rates above it. Default false |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=true and readOnlyHint=false; the description goes well beyond by explaining that the rate is shared not copied, that later edits to the rate propagate to this group, that the rate is appended last in charging order, that merchant confirmation is required, and that past sales are not recalculated. This is exactly the side-effect context an agent needs for a destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Six short sentences, each carrying distinct, load-bearing information (scope, id source, sharing semantics, alternative tool, ordering, confirmation/retroactivity). The most important constraints — eligibility and side effects — are front-loaded rather than buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-read-only mutation with no output schema, the description covers prerequisites (existing rate, ids from get_taxes), propagation semantics, ordering behavior, and retroactivity limits. Nothing material an agent needs to invoke it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so taxRateId, taxGroupId, and compounding are already documented in the input schema, establishing a baseline of 3. The description adds the useful nuance that compounding is modifiable and that ids come from get_taxes, but repeats rather than extends the schema's per-parameter definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add an EXISTING rate to a tax group') plus a secondary modification mode (changing that rate's compounding flag). The word EXISTING and the contrast with create_tax_rate make it immediately distinguishable from hub_create_tax_rate, hub_remove_tax_rate_from_group, and hub_update_tax_group.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: use create_tax_rate when the rate does not exist yet, and use update_tax_group with rateIdsInOrder to reposition an already-added rate. It also names the source of both ids (get_taxes), so an agent knows the prerequisite lookup.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_adjust_stockAdjust stockADestructiveInspect
Change the count of ONE variant at ONE outlet — the cabinet's "Adjust Inventory" action. CONFIRM WITH THE MERCHANT FIRST, repeating the product, the outlet, the reason and the number: this writes immediately, is permanently recorded against the employee in the stock history, and there is no undo from here. Reasons: STOCK_RECEIVED (a delivery arrived) and RESTOCK_RETURN (a return put back on the shelf) ADD the quantity; DAMAGE, THEFT and LOSS SUBTRACT it; INVENTORY_RECOUNT SETS the count to exactly the quantity you pass (a physical stocktake). Always pass quantity as a positive number — the reason decides the direction. Pick the reason the merchant actually gave; these end up in reports, so recording theft as damage misstates their loss. If stock is not tracked for that variant at that outlet, NOTHING is written and the result says applied: false — do not report success, and do not read it as "the stock is 0". Tracking has to be turned on for the product first. To move units between outlets use create_stock_transfer instead.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Why the count changed. Adds: STOCK_RECEIVED, RESTOCK_RETURN. Subtracts: DAMAGE, THEFT, LOSS. Sets: INVENTORY_RECOUNT | |
| outletId | Yes | Outlet id from get_outlets — the adjustment applies only there | |
| quantity | Yes | Always positive. Units added or removed — or, for INVENTORY_RECOUNT, the new total on hand | |
| productId | Yes | Product id from get_products | |
| variantId | Yes | Variant id from get_products — the exact variant being counted |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, but the description goes well beyond them: writes immediately, permanently recorded against the employee in stock history, no undo from here. It also discloses a non-obvious failure mode — applied: false with nothing written when stock isn't tracked — and warns against misreading that as zero stock.
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 core action and the confirm-first instruction are front-loaded, and every later sentence carries distinct operational content (reason semantics, applied:false handling, the transfer alternative). It runs longer than a tight two-sentence ideal, but there is no filler to cut.
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 five-parameter destructive write with no output schema, the description covers safety, prerequisites, reason semantics, and the return-signal case (applied: false), so an agent has everything needed to call it and interpret the outcome 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%, so the enum direction mapping and quantity meaning are already documented. The description nonetheless adds decision-relevant meaning: quantity is always positive because the reason decides direction, INVENTORY_RECOUNT sets rather than adds, and picking the wrong reason misstates loss in reports. That enum-choice guidance is value beyond the schema, though the core direction mapping is duplicated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource with scope: "Change the count of ONE variant at ONE outlet — the cabinet's 'Adjust Inventory' action." It also names the sibling it is not (create_stock_transfer) for the between-outlet case, so an agent can disambiguate without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition (confirm with the merchant, repeating product/outlet/reason/number), an explicit when-not (use create_stock_transfer to move units between outlets), and a tracking prerequisite (tracking must be turned on for the product first). Routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_assign_roleAssign roleADestructiveInspect
Move a team member onto a different role — this is how someone gains or loses access. Answers 'give Maria access to the reports', 'make him a cashier again', 'take away her permissions'. PERMISSIONS ARE POWER. Confirm with the merchant first, naming the person and the role out loud ("give Maria the Manager role — yes?"), and never act on a role change you inferred rather than were asked for. The change is live on the next request: rights are re-read from the role every time, so no one logs out and no agent key stops working — including yours, if the change reaches your own account. It swaps their WHOLE permission set for that role’s, so read get_roles first and check the new role really carries what the merchant asked for and nothing dangerous besides — if no existing role fits, say so rather than picking the closest one. You may also point the merchant’s own account at another role, including the account this agent key belongs to, which would change your own permissions from the next call onward: never do that unless the merchant asked for it in those words. To change what a role itself allows, without moving anyone, use update_role.
| Name | Required | Description | Default |
|---|---|---|---|
| roleId | Yes | Role id from get_roles — not a role name | |
| userId | Yes | User id from get_team — not a name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, but the description goes well beyond: the change takes effect on the next request with no logout, it replaces the user's entire permission set rather than merging, and it can alter the calling agent key's own permissions from the next call. It also states the failure mode (if no existing role fits, say so rather than picking the closest one).
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?
Purpose and the confirmation rule are front-loaded, and nearly every sentence carries a distinct behavioral constraint (live effect, whole-set swap, self-impact, update_role alternative). It is on the long side for a two-parameter tool, with a bit of restatement around not acting on inferred changes, but the density is justified by the destructiveness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-open-world mutation with no output schema, the description covers what an agent needs: intent routing, mandatory human confirmation, prerequisites, blast radius on permissions, self-account risk, and the sibling to use instead. Nothing required to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema itself already specifies that roleId comes from get_roles (not a name) and userId from get_team (not a name). The description reinforces reading get_roles first and validating that the target role carries the requested access, but adds no new identifier format or constraint beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource ('Move a team member onto a different role') and immediately frames the consequence ('this is how someone gains or loses access'), with merchant-phrasing examples that map real intents to the tool. It explicitly distinguishes itself from the nearest sibling by naming update_role for editing a role's permissions rather than moving a person.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use conditions, a mandatory confirmation protocol (name the person and role out loud), and a prohibition ('never act on a role change you inferred rather than were asked for'). It also names the alternative tool (update_role) and the prerequisite step (read get_roles first), plus the edge case of reassigning the agent's own account.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_cancel_bookingCancel a bookingADestructiveInspect
Release a booked window. The order stays as it is — cancelling a booking is not a refund, and money is never moved here; if the customer is owed money, do that on the order. Confirm with the merchant before cancelling a booking somebody already paid for.
| Name | Required | Description | Default |
|---|---|---|---|
| holdId | Yes | The booking to release |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, so the write semantics are known. The description still adds real value beyond them: the order is left untouched, no money moves, and human confirmation is advised for paid bookings. It does not say whether the released slot is freed for rebooking or whether the cancellation is reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, then the boundary condition, then the operational caution. Every sentence carries distinct information; nothing is redundant with the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive mutation with no output schema, the description covers the important non-structural facts: side-effect boundary (order unchanged, no money), and the human-confirmation prerequisite. Minor gaps remain around reversibility, freed-slot behavior, and required permissions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (holdId) and schema description coverage is 100% ("The booking to release"), so the schema already carries the semantics. The description adds no format, sourcing, or lookup guidance for holdId, making this the standard baseline case where structured fields do the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ("Release a booked window") and, more importantly, delimits scope: it is not a refund and does not touch the order. That scope statement lets an agent separate it from sibling tools like hub_confirm_booking, hub_hold_booking, and the refund/order tools without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-not: money movement and refunds belong on the order, not here. It also states a precondition (confirm with the merchant before cancelling a booking somebody already paid for). It stops short of naming the exact alternative tool (e.g. hub_get_refunds / order-level refund), so routing is clear but not fully enumerated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_cancel_purchase_orderCancel purchase orderADestructiveInspect
Cancel an order the merchant no longer wants. CONFIRM FIRST, naming the supplier and the PO number — there is no undo, and the order disappears from the list rather than showing as cancelled. REFUSED once any stock has been received against it: that stock is real and the record has to stay. Receive the rest instead, or leave it partially received. Cancelling does NOT tell the supplier anything. If the order was already sent, the merchant still has to contact them — say so.
| Name | Required | Description | Default |
|---|---|---|---|
| purchaseOrderId | Yes | Purchase order id from get_purchase_orders — not a PO number |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint annotation: mandates CONFIRM FIRST, warns there is no undo, notes the order vanishes from the list rather than showing as cancelled, explains the stock-received refusal rule, and clarifies that cancelling does NOT notify the supplier. Rich operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then layers behavioral warnings in short, ordered sentences. The emphasis formatting is dense but every clause (no-undo, refusal rule, supplier non-notification) is load-bearing for a destructive irreversible operation.
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, no-output-schema mutation, the description fully covers the safety profile, the refusal edge case, and the downstream consequence. An agent has everything needed to call it correctly and advise the merchant.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already clarifies the id is 'not a PO number'. The description's mention of 'the PO number' is about the human confirmation step, not the input parameter, so it adds little param-level meaning beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Cancel an order') and implicitly distinguishes itself from siblings like hub_receive_purchase_order and hub_send_purchase_order by explaining cancellations relationship to receiving and sending. An agent can tell exactly what this 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?
Explicitly names the when ('an order the merchant no longer wants'), the when-not ('REFUSED once any stock has been received'), and the alternatives ('Receive the rest instead, or leave it partially received'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_confirm_bookingConfirm a held bookingAInspect
Turn a hold into a real booking once the order behind it is paid, so it stops expiring. Needs the order the booking was sold on — confirming without one is refused, because a confirmed booking nobody can find on a receipt is worse than an expired hold.
| Name | Required | Description | Default |
|---|---|---|---|
| holdId | Yes | From hold_booking | |
| orderId | Yes | The paid order carrying this booking |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (not read-only, not destructive), so the description carries the extra burden and does add value: it discloses the required orderId precondition, the refusal behavior when it is missing, and the effect (stops expiring, becomes receipt-findable). Idempotency and return behavior are still unstated, keeping it below 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and effect, then the requirement and rationale. The closing rationale ('a confirmed booking nobody can find on a receipt is worse than an expired hold') is colorful but does justify why orderId is mandatory, so it earns its place; slightly verbose overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-param mutation with no output schema, the description covers purpose, precondition, and error behavior, and annotations cover the safety profile. It is nearly complete, missing only idempotency and what the confirmed result returns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented, and the description largely restates them ('the order the booking was sold on'). Baseline 3 is appropriate since the schema does the heavy lifting and the description adds little new syntax or format detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource plus the state transition ('turn a hold into a real booking'), which cleanly separates it from hub_hold_booking (creates the hold) and hub_cancel_booking (kills it). An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear triggering condition ('once the order behind it is paid') and a hard precondition (orderId required, refused without it). It does not explicitly name the sibling alternatives (hold/cancel) or state when to prefer them, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_create_booking_resourceCreate a booking resourceAInspect
Add one bookable thing to the company directory. Call get_booking_resources first — a resource is reused across every service, so a second "Marco" would split one barber into two calendars and let him be booked twice at once. The name is what staff will see in the calendar.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Identifier of this exact instance if it has one: room number, plate, QR, e.g. "SC-07" | |
| kind | Yes | What sort of thing it is — drives the labels the merchant sees | |
| name | Yes | As the merchant says it, e.g. "Marco", "Room 101", "Scooter 7" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, closed-world write, so the safety profile is covered. The description adds genuine behavioral context beyond that: resources are global and reused across every service, and duplicates cause double-booking. It does not cover auth requirements or what the call returns, keeping it out of 5 territory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action, then the prerequisite, then the naming consequence. No filler and every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering the safety profile and no output schema required to be explained, the description supplies purpose, precondition, and naming semantics — enough to call it correctly. A note on what the created resource returns (e.g. an id) would close the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3 — all three parameters are already documented. The description adds meaning beyond the schema for `name` by explaining that it is what staff see in the calendar, which clarifies naming intent rather than just echoing the schema's example.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource — adding a single bookable entity to the company directory — and the title plus text make clear this is the booking-resource creator, not hub_create_product, hub_create_station, or hub_create_outlet. An agent can identify the correct tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit precondition — "Call get_booking_resources first" — and explains the consequence of skipping it (a duplicate splits one barber into two calendars). That is strong, actionable routing guidance. It does not state when-not to use the tool or name a sibling alternative, 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.
hub_create_booking_rulesCreate a booking rule setAInspect
Create a booking policy. Call get_booking_rules FIRST and reuse a matching set instead — these are shared company-wide, not per product. weeklyHours are LOCAL wall-clock times at the outlet; if neither the outlet nor the company has a timezone the engine refuses availability with a 400, so fix the outlet rather than guessing an offset. bufferMinutes consumes grid time for slot bookings (cleaning between appointments); for overnight stays use checkInTime/checkOutTime instead and leave the buffer at 0 — the cleaning window lives in the gap and does not consume a night.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | How the merchant refers to it, e.g. "Haircuts 9–18" | |
| ratePeriod | Yes | What ONE unit of price buys. `slot` for appointments and hourly rental. `week` and `month` are in the enum but NOT offered: the grid still cuts them one day at a time, so a weekly rate would be charged per day | |
| bookingType | Yes | appointment = a person's time; rental = an asset; overnight = nights; group = a class | |
| checkInTime | No | Overnight only, "15:00" | |
| holdMinutes | No | How long an unpaid hold survives before the window frees itself. Default 10 | |
| weeklyHours | Yes | Opening hours per weekday, local time. Days left out are closed. For overnight stays leave hours off only if the property has none — an empty list there means every day. | |
| checkOutTime | No | Overnight only, "11:00" | |
| bufferMinutes | No | Dead time after each booking, e.g. 15 for cleaning. Consumes the grid | |
| maxAdvanceDays | No | How far ahead bookings open. 0 = no limit | |
| minNoticeMinutes | No | Shortest notice accepted, e.g. 60 | |
| slotLengthMinutes | Yes | How long one booking lasts, e.g. 30 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic mutation profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false). The description adds real behavioral context beyond that: the company-wide blast radius of a created set, a concrete failure mode (engine refuses availability with a 400 when neither outlet nor company has a timezone), and the interaction between bufferMinutes and overnight checkIn/checkOut windows. It omits auth/permission requirements, which is the only meaningful gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tightly packed sentences, front-loaded with the core action and the redirect to the read tool before any field-level detail. Every sentence carries non-obvious operational information; there is no filler or restated schema text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter mutation with no output schema, the description covers the highest-risk interactions (shared scope, timezone failure, buffer vs overnight). It does not say what is returned on success or how duplicate/conflicting rule sets are handled, but with no output schema declared that omission is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description genuinely adds cross-parameter semantics the schema does not: weeklyHours are LOCAL wall-clock times at the outlet (with the timezone precondition), bufferMinutes consumes grid time for slots, and overnight stays should use checkInTime/checkOutTime with buffer at 0. That is additive meaning rather than restatement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Create a booking policy') and immediately distinguishes itself from the sibling hub_get_booking_rules by telling the agent to call that first. An agent can tell this is the write side of the booking-rules pair without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-not guidance: 'Call get_booking_rules FIRST and reuse a matching set instead — these are shared company-wide, not per product.' It names the alternative tool and the condition (shared scope) that should route the agent away from this call, which is exactly the exclusion guidance most definitions lack.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_create_categoryCreate categoryAInspect
Create a product category. Call get_categories FIRST — a second "Drinks" is easy to make and there is no merge. Pass parentId to make it a subcategory; leave it out for a top-level one. The cabinet's own form asks for a description, so ask the merchant for one rather than inventing it. This does NOT move any product into the category — do that with update_product and its categoryIds.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Category name as the merchant said it, e.g. "Beverages" | |
| image | No | Image URL, or a Lucide icon reference like "lucide:coffee" | |
| parentId | No | Parent category id from get_categories — a name is rejected. Omit for top level | |
| sortOrder | No | Position among its siblings, lowest first. Omit to leave it unsorted | |
| description | No | Short description shown in the cabinet |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is covered. The description goes further by disclosing that duplicates cannot be merged (irreversibility-adjacent) and that no products are moved as a side effect, plus guidance to source the description from the merchant. It stops short of auth/permission or response-shape detail, so a 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five tight sentences, each carrying distinct information (purpose, prerequisite, parameter branching, field-sourcing rule, exclusion+alternative). Front-loaded with the core action and no filler or restatement of the title.
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 a create tool whose annotations already state the safety profile, the description supplies everything needed to invoke it correctly: dedup prerequisite, nesting behavior, field guidance, and explicit scope boundaries. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description still adds semantic value beyond the schema: parentId controls subcategory vs top-level nesting, and the description field should be supplied by the merchant rather than invented. That is real meaning layered on top of the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Create a product category') and immediately distinguishes itself from the update path by stating what it does NOT do (move products into the category). An agent can separate it from hub_update_category, hub_import_categories, and hub_create_product without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite ('Call get_categories FIRST'), the reason (duplicates are easy to make and there is no merge), and a named alternative for the adjacent task ('do that with update_product and its categoryIds'). This is exactly the when-to-use / when-not / alternative structure the dimension rewards.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_create_customerCreate customerAInspect
Create a customer. Call get_customers with the email or name FIRST — a duplicate splits one person’s order history in two and there is no merge from here. Email is required, exactly as in the cabinet's own customer form. Ask the merchant for anything you do not know instead of inventing it — an invented phone number or address is worse than a missing one.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | A first note about this customer, if the merchant gave one | |
| Yes | Required — the customer’s email address | ||
| phone | No | Phone as the merchant said it, e.g. "+1 555 123 4567" | |
| billing | No | Billing address | |
| lastName | No | ||
| shipping | No | Shipping address. Omit to reuse the billing address | |
| firstName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe-create profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), so the bar is lower, and the description still adds a non-obvious, irreversible consequence: duplicates are unmergeable. It also stresses email fidelity to the merchant's own form. It stops short of auth/permission or rate-limit details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, followed by the sequencing rule and the data-integrity rule in tight, waste-free prose. Every sentence carries a distinct warning or instruction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-param, nested-object mutation tool with no output schema, the description covers the critical risks (duplicates, required email, not fabricating data) but says nothing about partial-address handling or what the call returns on success. Since no output schema exists, the missing return detail is a minor, acceptable gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 71%, so the schema carries most parameter meaning. The description nonetheless reinforces the one required field ('Email is required, exactly as in the cabinet's own customer form') and adds data-quality semantics for phone/address. It does not clarify the billing/shipping override relationship beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a precise verb+resource combination ('Create a customer') that is unambiguous. It also references the sibling get_customers as a prerequisite, which helps positioning, though it does not explicitly contrast with hub_update_customer or hub_import_customers. Clear but not maximally differentiated from all siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states an explicit precondition ('Call get_customers with the email or name FIRST'), explains the cost of skipping it (duplicate splits order history, no merge exists), and adds an escalation rule ('Ask the merchant for anything you do not know instead of inventing it'). This is exactly the when/when-not guidance the dimension rewards.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_create_modifierCreate modifierAInspect
Create a new question the till can ask, with its choices. THIS ALONE DOES NOTHING AT THE TILL — follow it with link_modifier_to_category, or the modifier sits unused. Choose selectionType carefully, because it CANNOT be changed afterwards: "single" = pick exactly one (milk, cooking temperature); "multiple" = tick any number of different choices (toppings); "multiple" with allowQuantity true = tick choices AND say how many of each; "quantity" = every choice is a stepper (extra shots). The last two count UNITS, not distinct choices. allowQuantity is only accepted on "multiple" and is refused on the others. Names must be unique for the merchant, ignoring case.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | What the cashier sees, e.g. "Milk" or "Toppings" | |
| choices | No | The choices. Can also be added later one at a time | |
| allowQuantity | No | Only with selectionType "multiple": let each ticked choice carry a count. CANNOT be changed later | |
| selectionType | Yes | How it is answered. CANNOT be changed later |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide the generic safe-write profile (readOnly=false, destructive=false). The description adds real behavioral facts annotations cannot carry: selectionType and allowQuantity are immutable after creation, allowQuantity is rejected on non-'multiple' types, and modifier names must be unique per merchant ignoring case.
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 most consequential warning (the tool alone does nothing) is front-loaded, followed by the irreversible selectionType decision and then the conditional allowQuantity rule. Every sentence carries a constraint the agent cannot infer from structured fields; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a create operation with no output schema, the description covers creation semantics, the chaining requirement and immutability constraints very well, but never states what is returned (notably the new modifier id needed by link_modifier_to_category). That is a minor but real gap in an otherwise complete definition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description meaningfully exceeds the schema by defining each enum value with concrete examples ('single' = milk/temperature, 'multiple' = toppings, 'multiple'+allowQuantity = tick and count, 'quantity' = steppers) and by clarifying that the last two count units rather than distinct choices — information absent from the bare enum list.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a new question the till can ask, with its choices') and immediately distinguishes itself from hub_add_modifier_choice and hub_create_product_option by scoping to the whole modifier rather than a later-added choice. An agent knows exactly what object is being produced.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the required follow-up ('follow it with link_modifier_to_category, or the modifier sits unused'), which is the single most important routing fact for this tool. It also implicitly routes choice-by-choice authoring to the add-choice flow via the schema note, so the agent has both when-to-use and when-not-standalone guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_create_outletCreate outletAInspect
Open a new point of sale — the cabinet’s Add Outlet form. Name and the full street address (address, city, state, postCode) are all REQUIRED, exactly as on that form. Do NOT try to set a country: every outlet inherits the company’s country, and it can never be changed per outlet. Ask the merchant for any part of the address you do not know — an invented address ends up on receipts. This is BILLABLE: a new outlet counts against the company plan’s outlet allowance and the call is refused once that allowance is used up. Confirm with the merchant before calling. Afterwards the platform seeds a stock row of 0 for every product at the new outlet in the background, so its stock reads as empty until someone receives or transfers stock in. Linking a Stripe account to the outlet is NOT possible from here — the merchant does that in Settings → Outlets.
| Name | Required | Description | Default |
|---|---|---|---|
| city | Yes | City | |
| name | Yes | Outlet name as the merchant calls it, e.g. "King Street" | |
| alias | No | Short code used by the WooCommerce / Metorik integration. Can never be changed once set — leave it out unless the merchant asked for it | |
| phone | No | Phone number of this location | |
| state | Yes | State or province, e.g. "ON" | |
| taxId | No | Business tax number printed on this outlet’s receipts (BN / GST / HST / VAT / EIN) | |
| address | Yes | Street address, e.g. "123 King St W" | |
| address2 | No | Unit, suite or floor | |
| postCode | Yes | ZIP / postal code |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly=false, destructive=false), and the description adds substantial behavior beyond them: the call is BILLABLE against the plan's outlet allowance and is refused once exhausted, the platform asynchronously seeds a stock row of 0 for every product, and outlet country is immutable. These are exactly the traits an agent would otherwise miss.
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?
Purpose is front-loaded in the first clause, and every sentence carries a distinct operational fact (required fields, no country, billable, stock seeding, no Stripe). It is long — eight sentences — but none is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-output-schema creation tool, the description covers preconditions (required address, merchant confirmation), cost/limits (billable allowance), post-call side effects (background stock rows), and out-of-scope integrations (Stripe). Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the schema already documents every parameter and marks the five required ones. The description reiterates that name/address/city/state/postCode are REQUIRED and adds the consequence that an invented address ends up on receipts, but supplies no format or syntax detail beyond that.
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 concrete verb+resource ('Open a new point of sale') and pins down exactly which form it corresponds to (the cabinet's Add Outlet form). This is clearly distinguishable from sibling hub_update_outlet, hub_get_outlets and hub_delete_outlet.
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 ('Confirm with the merchant before calling') and when-not guidance ('Do NOT try to set a country', 'Linking a Stripe account... is NOT possible from here — the merchant does that in Settings → Outlets'). The alternative action path for Stripe linking is named outright.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_create_productCreate productAInspect
Create a product in the merchant's catalogue. Call get_products first to make sure it does not already exist. Prices are HUMAN strings like "19.99" — this tool converts them into the company's currency itself, so never send cents. Tax: the company's standard tax table is applied by default; pass taxable:false for an untaxed product. Ask the merchant for anything you do not know instead of inventing it.
| Name | Required | Description | Default |
|---|---|---|---|
| sku | No | ||
| name | Yes | Product name as the merchant said it | |
| price | Yes | Selling price as a human string, e.g. "19.99" | |
| barcode | No | EAN/UPC if the merchant gave one | |
| options | No | Variation axes and the values to build variants from, e.g. {"Size":["Small","Large"]}. Every combination becomes a variant. Call get_product_options FIRST and reuse existing axes. Every variant gets `price` unless variantPrices says otherwise. | |
| taxable | No | Default true: applies the standard tax table | |
| costPrice | No | What the merchant pays for it, human string | |
| outletIds | No | Outlet ids. Omit for everywhere | |
| taxTableId | No | A specific tax table, for non-standard tax | |
| categoryIds | No | Category ids — names are rejected | |
| description | No | ||
| productType | No | Only pass this for "booking" — a service sold as TIME (a haircut, a room for the night, an hour on a scooter). simple/variable are derived from `options`, so leave it out for goods. A booking product is not bookable until set_product_booking_setup gives it a rule set and resources. | |
| variantPrices | No | Per-variant prices at creation, one entry per combination that differs from `price`, e.g. {"options":{"Size":"Large"},"price":"21.99"}. `options` must name one value for EVERY axis in `options`. | |
| trackInventory | No | Default false. True manages stock | |
| shortDescription | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, destructive=false, openWorld=false, so the safety profile is covered. The description adds real behavioral context beyond that: prices are human strings auto-converted to company currency, and the standard tax table is applied unless taxable:false is passed.
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 short paragraph front-loaded with the core purpose, followed by targeted notes on dedup, price format, and tax. Each sentence earns its place with no filler, though the tax and price rules could be slightly tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter tool with no output schema, the description covers the highest-risk semantics (price format, tax default, dedup, no fabrication). The complex variant and booking paths are left to the schema, which documents them well, so completeness is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the schema largely documents the 15 parameters. The description still adds value by spelling out the price-string convention ("never send cents") and the taxable:false override, reinforcing key semantics the agent must get right.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Create a product in the merchant's catalogue"), so the agent knows exactly what it does. However, it does not differentiate itself from close siblings like hub_import_products (bulk) or hub_update_product, so it stops short of the top band.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete workflow guidance — call get_products first to dedupe, and ask the merchant rather than inventing values. It does not, though, explicitly frame when to use this versus hub_import_products, which is the closest alternative for creating products.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_create_product_optionCreate product optionAInspect
Create a new variation axis with its possible values. Use it only when get_product_options shows nothing suitable. The axis is shared across the whole catalogue, not one product — so confirm the name and values with the merchant first and reuse an existing axis when one fits.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Axis name as the merchant says it, e.g. "Size" | |
| values | Yes | Possible values in display order, e.g. ["Small","Medium","Large"] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false (a safe write), and the description adds valuable context beyond that: the axis is catalogue-wide, not product-scoped, and should be confirmed with the merchant first. It does not disclose what happens on a duplicate axis name (error vs. merge), leaving one behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, followed by the routing condition and the merchant-confirmation caveat. No sentence is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-required-parameter create tool with no output schema and full schema coverage, the description covers purpose, routing, and global-scope impact well. The only missing piece is the failure/duplicate-handling behavior, which is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (name, values) are already fully documented with examples in the schema. The description only alludes to "name and values" without adding syntax or format detail, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: "Create a new variation axis with its possible values." It also names the sibling hub_get_product_options, so an agent can distinguish this create tool from the read tool without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gates usage: "Use it only when get_product_options shows nothing suitable" and directs the agent to "reuse an existing axis when one fits." Both the when-to-use and when-not-to-use conditions are stated, with the alternative named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_create_purchase_orderCreate purchase orderAInspect
Write a new order to a supplier. It is created as a DRAFT — nothing reaches the supplier and no stock moves until send_purchase_order. PREREQUISITES, in this order: get_suppliers for the supplierId, get_outlets for the outlet the goods will be delivered INTO, then get_supplier_items WITH that outletId for the lines — variantId and unitCost come from there, and an item that is not linked to this supplier is refused. unitCost is what the merchant pays per unit as a human amount ("12.50"), prefilled from the supplier link but editable if this order was negotiated differently. quantity is in the item’s selling unit and may be fractional for goods sold by weight or length. Read the lines back to the merchant with the total before sending — a wrong quantity here becomes wrong stock later.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | What to order | |
| notes | No | Note for the supplier / for the merchant’s own records | |
| discount | No | Flat discount on the whole order, e.g. "25.00". Not with discountPercent | |
| dutyFees | No | Duty / customs charged on the order | |
| outletId | Yes | Outlet id from get_outlets — where the goods will be received | |
| customFees | No | Any other named charge on the order, e.g. "Handling" | |
| supplierId | Yes | Supplier id from get_suppliers | |
| shippingFee | No | Shipping charged on the order, e.g. "18.00" | |
| expectedDate | No | ISO date the merchant expects delivery | |
| discountPercent | No | Discount as a percentage of the items subtotal |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, so the mutation/safety profile is partly covered; the description goes beyond them by disclosing that nothing reaches the supplier and no stock moves until send_purchase_order, and that unlinked items are rejected. That draft-state semantics is the key behavioural fact an agent needs and is not derivable from 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?
Front-loads the create-as-draft fact first, then the prerequisite order, then per-field caveats, then the confirm-before-send advice. Sentences are dense but every one carries a decision-relevant fact with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation tool with no output schema, the description covers workflow, prerequisites, side-effect semantics and field conventions well. The only gap is that it never says what comes back (e.g. the created draft order id) that the agent would need to chain into send_purchase_order; with no output schema that would have been worth one clause.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds sourcing and editability context the schema lacks: variantId/unitCost come from get_supplier_items with the matching outletId, unitCost is prefilled from the supplier link but editable for negotiated prices, and quantity is in the item's selling unit. It largely restates the schema's string-amount and fractional-quantity notes, hence not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Write a new order to a supplier') and immediately distinguishes itself from hub_send_purchase_order and hub_update_purchase_order by clarifying that the record is only a DRAFT. An agent can route between create/send/update without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit, ordered prerequisite chain (get_suppliers → get_outlets → get_supplier_items with that outletId), names the follow-up call (send_purchase_order), and states the exclusion condition (an item not linked to this supplier is refused). This is exactly the when/when-not/alternatives guidance the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_create_roleCreate roleAInspect
Create a new role with a chosen set of permissions — for when no existing role fits what the merchant wants someone to do. Check get_roles first; a near-match plus update_role is usually better than a fourth almost-identical role. PERMISSIONS ARE POWER. Confirm with the merchant first, naming the person and the role out loud ("give Maria the Manager role — yes?"), and never act on a role change you inferred rather than were asked for. The change is live on the next request: rights are re-read from the role every time, so no one logs out and no agent key stops working — including yours, if the change reaches your own account. Permission ids come from get_permissions. List back in plain words what the role will be able to do and get an explicit yes before calling. Creating a role gives nobody anything until assign_role puts a person on it. If you are signed in as an employee you can only grant permissions you hold yourself — the cabinet works the same way — and the call is refused otherwise.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | What the merchant calls it, e.g. "Shift lead" | |
| permissionIds | Yes | Permission ids from get_permissions — everything not listed is switched off |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover safety hints (destructive=false, openWorld=false); the description adds substantial context the agent cannot get elsewhere: rights are re-read on the next request with no re-login, an employee may only grant permissions they themselves hold, the call is refused otherwise, and the role grants nothing until assign_role is called. That is real mutation semantics, not restatement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the alternative-role routing, which is the most decision-relevant content. It is on the long side and the confirmation instruction is stated twice ('Confirm with the merchant first, naming the person and the role out loud' and 'get an explicit yes before calling'), which costs it a 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?
Two-parameter mutation tool with no output schema, and the description covers what the agent needs: prerequisites, privilege constraints, confirmation protocol, and the downstream dependency on assign_role. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both name and permissionIds (including the 'everything not listed is switched off' semantics). The description repeats the get_permissions sourcing rather than adding format or edge-case detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new role with a chosen set of permissions') and immediately frames scope — only when no existing role fits. It distinguishes itself from get_roles, update_role and assign_role in the same breath, so an agent can place it precisely 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?
Explicitly conditions use: 'for when no existing role fits', 'Check get_roles first; a near-match plus update_role is usually better'. It names the alternatives and the preferred path, plus the prerequisite that permission ids come from get_permissions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_create_stationAdd virtual tillAInspect
Add a VIRTUAL till — a browser-based station, the cabinet’s "Add Virtual Station". It is created at one outlet and starts AVAILABLE. You CANNOT create a native (device) station from here and must not try: a physical till enrols itself when someone opens the POS app on the device and names it there. THIS IS BILLABLE — a new station counts against the company plan’s station allowance and the call is refused once that allowance is used up. Confirm with the merchant before calling. flowSrcId is the POS layout the till runs. The cabinet’s wizard makes picking one mandatory and there is no tool here that lists flows, so unless the merchant gave you an id, create the station and then tell them plainly to open Run → Stations and choose the flow — until they do, the station exists but cannot be launched.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Station name as staff will see it, e.g. "POS 2" | |
| outletId | Yes | Which outlet this till belongs to — id from get_outlets, not a name | |
| flowSrcId | No | Id of the POS layout (flow) the till runs, if the merchant gave one |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, destructiveHint=false, openWorldHint=false) by disclosing the billable nature, that the call is refused once the plan allowance is exhausted, that the station starts AVAILABLE, and that it cannot be launched until a flow is chosen. This is exactly the kind of consequence and auth/limit context the annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the virtual-vs-native distinction and the billable warning, and every sentence carries distinct information (creation state, billing limit, flowSrcId caveat). It is on the long side and occasionally emphatic ('and must not try'), but nothing is redundant padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, it covers what the agent needs: cost/refusal behavior, required confirmation with the merchant, and the post-creation instruction to have the merchant pick a flow in Run → Stations. No material gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning for flowSrcId: it is the POS layout the till runs, the wizard treats it as mandatory, no tool lists flows, and the station is unlaunchable until one is set. That is genuine semantic value beyond the schema, though name and outletId are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a VIRTUAL till — a browser-based station') and immediately distinguishes it from what it is not ('You CANNOT create a native (device) station from here'). This lets an agent separate it from siblings like hub_delete_station, hub_rename_station, and hub_get_stations without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use and when-not-to-use guidance: virtual tills here, native tills self-enrol via the POS app. It also surfaces the gating condition (billing allowance) and the prerequisite workflow for flowSrcId, naming the alternative path (cabinet wizard) where no listing tool exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_create_stock_transferSend stock transferADestructiveInspect
Move stock from one outlet to another — 'send 10 of these from the warehouse to the King Street shop'. CONFIRM WITH THE MERCHANT FIRST, naming both outlets and every quantity: this writes immediately and there is no undo from here. The stock LEAVES the source outlet at once; the destination only gains it when someone confirms arrival with receive_stock_transfer, so until then those units are in transit and count in neither shop. Tell the merchant that. Variant ids come from get_products, outlet ids from get_outlets. Check availability with get_stock first: sending more than the source holds is rejected, and so is sending a variant whose stock is not tracked at the source — there is no count there to move. To correct a count in place (damage, theft, a recount) use adjust_stock instead; to book in a supplier delivery use adjust_stock with STOCK_RECEIVED.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | A note staff will read on the transfer | |
| items | Yes | What to move. One entry per variant | |
| invoice | No | Invoice or reference number, if the merchant gave one | |
| toOutletId | Yes | Destination outlet id from get_outlets — must differ from the source | |
| fromOutletId | Yes | Source outlet id from get_outlets — stock leaves here immediately |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, it discloses that the write is immediate and irreversible, that stock leaves the source at once while the destination only gains it on receive_stock_transfer, that in-transit units count in neither shop, and that over-sending or sending untracked variants is rejected. These are the operationally decisive facts an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and the confirm-first warning are front-loaded, and every sentence carries operational weight. It is dense as a single block of prose and could be scannable with structure, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent mutation with no output schema, it covers the write's side effects, the two-step nature of the flow, validation rejections, prerequisite reads, and alternatives. Nothing needed to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are already documented in the schema. The description reinforces id provenance and the 'one entry per variant' semantics but adds little syntax or meaning beyond what the schema already states, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a concrete verb+resource ('move stock from one outlet to another') plus a worked example ('send 10 of these from the warehouse to the King Street shop'). It explicitly distinguishes itself from receive_stock_transfer (arrival confirmation) and adjust_stock, so an agent can route correctly without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states prerequisites (check availability with get_stock first), where ids come from (get_products, get_outlets), and names two alternatives with the conditions that select them: adjust_stock for in-place corrections and adjust_stock with STOCK_RECEIVED for supplier deliveries. It also mandates confirming with the merchant before calling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_create_supplierCreate supplierAInspect
Add a business the merchant buys from. Only the name is required, and it must be unique among this company’s suppliers. Set contactEmail if the merchant will ever email purchase orders to this supplier — send_purchase_order has nowhere to send without it. A brand-new supplier carries NO items, so it cannot be ordered from yet: link its items with link_supplier_items before creating a purchase order. Ask the merchant for details you do not have rather than inventing them — this ends up on the orders their supplier reads.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | ||
| name | Yes | Supplier name as the merchant calls it | |
| notes | No | Free-text notes, e.g. delivery days or account number | |
| phone | No | ||
| state | No | State or province | |
| country | No | ||
| address1 | No | Street address | |
| address2 | No | Unit, suite or floor | |
| postCode | No | ZIP / postal code | |
| contactName | No | Person the merchant deals with | |
| contactEmail | No | Where purchase orders are emailed |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly=false, destructive=false and openWorld=false, but the description adds substantive behavioral context: the uniqueness constraint on name, the dependency that contactEmail is required for send_purchase_order to function, and the consequence that a new supplier carries no items and cannot be ordered from yet. These are non-obvious mutation semantics that annotations do not 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?
Purpose is front-loaded in the first clause, and each subsequent sentence delivers actionable information (uniqueness, contactEmail dependency, item-linking prerequisite, data-integrity warning). It is slightly dense with four distinct instructions, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter mutation with no output schema and partial schema coverage, the description covers the essential creation constraints, the key optional field's purpose, and the downstream workflow. It omits any note on the return value, though for a create tool with sibling getters that is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 73%, so the baseline is 3, but the description adds meaning the schema lacks: it clarifies that only name is required, that name must be unique, and crucially explains what contactEmail is actually for (the destination for emailed purchase orders). The remaining 9 optional address/contact fields are left to 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?
Opens with a specific verb+resource: 'Add a business the merchant buys from', which unambiguously identifies a supplier-creation tool. It distinguishes itself from siblings like hub_update_supplier and hub_delete_supplier by describing creation, and references the downstream workflow (link_supplier_items, send_purchase_order) that only applies to new suppliers.
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 set contactEmail ('if the merchant will ever email purchase orders'), the required prerequisite (name, unique among company suppliers), and the workflow ordering constraint (link items before creating a purchase order). It also instructs the agent to ask the merchant rather than invent details, covering a real edge case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_create_tax_groupCreate tax groupAInspect
Create an empty tax group (a tax profile that products get assigned to, e.g. "Standard", "Food", "Zero-rated"). Call get_taxes FIRST — a second group with the same meaning splits the catalogue and is a common way to end up charging two different taxes for one thing. The group charges nothing until you add rates with create_tax_rate or add_tax_rate_to_group, and no product uses it until someone assigns it. isStandard marks the company default — set it only if the merchant explicitly says so. CONFIRM the name with the merchant before calling.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | What the merchant calls it, e.g. "Standard Tax" | |
| isStandard | No | Make this the company default group. Default false |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=false and destructiveHint=false, so safety is partly covered. The description adds genuinely useful behavioral context: the group charges nothing until rates are added, no product uses it until assigned, and the isStandard default caveat — all beyond structured fields. It doesn't cover permissions/auth or what the call returns, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and definition, then workflow guidance. Every sentence carries a distinct instruction (definition, prerequisite, lifecycle, isStandard caveat, confirmation). Slightly dense but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-param create tool with no output schema, the description covers purpose, prerequisites, side effects, and the risky parameter. It doesn't indicate what the caller gets back (e.g., the new group's ID), but with no output schema that 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?
Schema coverage is 100%, so the baseline is 3. The description adds real semantic weight beyond the schema: isStandard is the company default and should only be set on explicit merchant instruction, and the name must be confirmed with the merchant before calling.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource and defines what a tax group actually is ("a tax profile that products get assigned to") with examples. It clearly differentiates itself from siblings like create_tax_rate, add_tax_rate_to_group, and update_tax_group by describing the object and its lifecycle.
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?
Explicit sequencing ("Call get_taxes FIRST"), an explicit warning about the duplicate-meaning failure mode, and named alternatives for the follow-up actions (create_tax_rate, add_tax_rate_to_group). It also states when NOT to set isStandard ("only if the merchant explicitly says so").
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_create_tax_rateCreate tax rateAInspect
Create a named tax rate ("State Sales Tax", "GST") with its percentage, and optionally put it straight into a tax group. Check get_taxes first: if a rate with this meaning already exists, add_tax_rate_to_group reuses it, which is almost always what the merchant wants — duplicating a rate means the next change has to be made twice and one of them gets forgotten. Give either percentage (the same at every outlet) or perOutlet (different per store) — never both, and never neither, since a rate with no percentage charges nothing. Without taxGroupId the rate exists but is charged nowhere. CONFIRM THE EXACT PERCENTAGE WITH THE MERCHANT before calling — do not infer it from suggest_tax_rate or from what is usual in that region. Sales already rung up are NOT recalculated — this only affects sales from now on.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | What appears on the receipt, e.g. "GST", "State Sales Tax" | |
| perOutlet | No | Outlet-specific percentages, using outlet ids from get_taxes. REPLACES the stored list whole — an outlet you leave out stops charging this rate | |
| percentage | No | One percentage for every outlet, e.g. 13 for 13% | |
| taxGroupId | No | Tax group id from get_taxes to add it to right away | |
| compounding | No | Only with taxGroupId: charge on the running total including the rates above it. Default false |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false; the description goes well beyond that. It discloses that a rate with no taxGroupId is charged nowhere, that percentage and perOutlet are mutually exclusive (never both, never neither, or it charges nothing), that perOutlet replaces the stored list whole, and that past sales are not recalculated.
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?
Purpose is front-loaded in the first clause, and each subsequent sentence carries a distinct, non-redundant constraint (reuse alternative, percentage/perOutlet exclusivity, taxGroupId effect, merchant confirmation, no retroactive recalculation). Length is justified by the number of real behavioral constraints, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-param mutation tool with no output schema, the description covers the decision context and side effects thoroughly. The only minor gap is it does not indicate what the call returns (e.g. the new rate id needed for later group operations), which the absence of an output schema leaves to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning beyond the schema: the percentage/perOutlet exclusivity rule and its consequence ('a rate with no percentage charges nothing'), plus that compounding only applies with taxGroupId. It does not restate syntax the schema already gives.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (create a named tax rate with a percentage) and explicitly distinguishes itself from sibling flows by naming get_taxes, add_tax_rate_to_group, and suggest_tax_rate. An agent can tell exactly what this does versus reuse or suggestion tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('Check get_taxes first') and when-to-prefer-an-alternative ('add_tax_rate_to_group reuses it, which is almost always what the merchant wants'), with the reasoning (duplication means double maintenance). It also states a hard precondition: confirm the exact percentage with the merchant, not infer from suggest_tax_rate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_create_userCreate POS userAInspect
Add a POS user — someone who signs in at the till with a PIN. Mirrors the cabinet’s "New POS user" form: first and last name, a 4-6 digit PIN, a role, optionally a phone. They get access to every outlet of the company, which update_user can narrow afterwards. BACK-OFFICE (Hub) users are NOT created here: those are invited by email from the cabinet, and that invitation flow is not available through this tool. If the merchant wants someone who can log in to the back office, say that and point them at Manage → Team → Users → Add User. The role decides what the new person may do, so PERMISSIONS ARE POWER. Confirm with the merchant first, naming the person and the role out loud ("give Maria the Manager role — yes?"), and never act on a role change you inferred rather than were asked for. The change is live on the next request: rights are re-read from the role every time, so no one logs out and no agent key stops working — including yours, if the change reaches your own account. A new user also counts against the company plan’s user allowance and the call is refused once it is used up.
| Name | Required | Description | Default |
|---|---|---|---|
| phone | No | Phone as the merchant said it, e.g. "+1 555 123 4567" | |
| roleId | Yes | Role id from get_roles — required, and it decides their permissions | |
| pincode | Yes | Required — 4 to 6 digits, what they type at the till | |
| lastName | Yes | Required | |
| firstName | Yes | Required |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnly/openWorld/destructive flags, so the description carries the real behavioral load: role assignment drives permissions, changes take effect on the very next request with no logout, the change can affect the caller's own account, and the call is refused once the plan's user allowance is exhausted. That is substantive context beyond the structured 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?
Front-loaded with purpose, then exclusions, then warnings – good ordering. It is on the long side and the permissions paragraph drifts into role-change semantics ('no one logs out and no agent key stops working') that are only indirectly about creating a user, so it is not maximally tight.
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 non-destructive mutation with no output schema, the description covers everything an agent needs: what gets created, required fields, permission implications, confirmation protocol, quota refusal behavior, and where the sibling tools take over. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are already documented, including the PIN pattern and the roleId/get_roles linkage. The description's field list ('first and last name, a 4-6 digit PIN, a role, optionally a phone') largely restates the schema, adding only the qualitative note that the role decides what the person may do. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Add a POS user') and immediately defines the resource by its distinguishing trait: signs in at the till with a PIN. It explicitly separates itself from back-office/Hub users and names the sibling (update_user) that handles outlet narrowing, so an agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (till user with PIN), when-not-to-use (back-office users are email-invited and 'not available through this tool'), an alternative (update_user for narrowing, cabinet Manage → Team → Users → Add User), and a procedural precondition: confirm the person and role with the merchant out loud first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_delete_categoryDelete categoryADestructiveInspect
Delete a category. Takes the category id ONLY — look it up with get_categories and never guess. CONFIRM WITH THE MERCHANT BEFORE CALLING, naming the category: there is no undo from here. Products in the category are NOT deleted — they are kept and simply lose this category, so a product that had no other category ends up uncategorised. A category that still has subcategories is refused: move or delete those first. So is a category synced from an integration.
| Name | Required | Description | Default |
|---|---|---|---|
| categoryId | Yes | Category id from get_categories — not a name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, but the description goes well beyond them: no undo, products survive and simply lose the category (orphaned products become uncategorised), and two hard refusal conditions are disclosed. This is unusually rich consequence disclosure for a delete operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action, then the id constraint, then the irreversible-confirmation warning, then the side effects and refusals. Dense but every clause carries decision-relevant information; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with no output schema, the description covers everything an agent must know: how to obtain the id, that confirmation is required, that the action is irreversible, what happens to dependent products, and the two blocking conditions.
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 says 'Category id from get_categories — not a name', so the baseline is 3. The description reinforces the constraint ('takes the category id ONLY ... never guess'), adding a procurement instruction rather than new syntax, so it sits just above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a category') that is immediately distinguishable from hub_create_category, hub_update_category, and the other hub_delete_* siblings. The scope is further pinned down by describing exactly what is and is not removed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions and alternatives: look the id up via get_categories, never guess, and confirm with the merchant before calling. It also names the two refusal cases (category with subcategories, integration-synced category) and what to do first, which is exactly the when-not guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_delete_customerDelete customerADestructiveInspect
Remove a customer from the merchant's list. Takes the customer ID ONLY — look it up with get_customers and never guess. CONFIRM WITH THE MERCHANT BEFORE CALLING, naming the customer: there is no undo from here. Their past orders are kept. If several customers match, list them and ask which one instead of picking.
| Name | Required | Description | Default |
|---|---|---|---|
| customerId | Yes | Customer id from get_customers — not a name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, and the description goes well beyond them by disclosing irreversibility ("no undo from here") and the side-effect boundary ("their past orders are kept"). That is exactly the context an agent needs before executing a destructive call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the action, then the input constraint, then the confirmation requirement, then the ambiguity fallback. No filler and no repetition of annotation data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with full schema coverage and no output schema, everything an agent needs is present: ID provenance, mandatory human confirmation, irreversibility, retained-order behavior, and multi-match handling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns extra credit by repeating the ID-only constraint at the call site and pointing to the sibling that produces valid values, reducing hallucinated name-as-ID inputs. It stops short of adding format detail beyond what the schema says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb+resource ("Remove a customer from the merchant's list") that unambiguously separates it from hub_delete_product, hub_delete_media_file, and the other delete siblings. The agent needs no schema access to know what it 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?
Gives explicit preconditions and alternatives: resolve the ID via get_customers, never guess, confirm with the merchant naming the customer, and if multiple customers match, list them and ask rather than picking. It is effectively a decision procedure, not just a usage hint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_delete_media_fileDelete media fileADestructiveInspect
Permanently delete one file from the media library. Takes the file ID from get_media_library ONLY — never guess it. CONFIRM WITH THE MERCHANT BEFORE CALLING, naming the file: the image is destroyed and there is NO UNDO. Tell them this too, because the platform does not check it and nothing is cleaned up afterwards: if any product or category uses this image, it KEEPS the dead URL and its picture turns into a broken image — the file is not detached, it is only made unreachable. There is no reverse lookup here from a file to the products using it, so if they are unsure, say so and let them check on the Media screen in the cabinet rather than deleting on a guess. The file may also stay listed on that screen afterwards, because that screen is fed by a separate service. Removing a photo from ONE product without destroying the file is not this tool — that is a product edit.
| Name | Required | Description | Default |
|---|---|---|---|
| fileId | Yes | File id from get_media_library — not a name or a URL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past destructiveHint=true: no undo, the image is destroyed, referencing products/categories keep a dead URL and show a broken image because the file is not detached, no reverse lookup from file to products exists, and the file may linger on the Media screen due to a separate service. This is exactly the kind of consequence detail annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded correctly: purpose, then ID source, then confirmation, then consequences. The consequence block is long and contains conversational asides ('Tell them this too'), so a few sentences could tighten, but nearly every sentence carries operational information for a destructive, irreversible call.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive one-parameter tool with no output schema, the description covers the prerequisites, the human confirmation step, the exact blast radius on referencing products, the lack of reverse lookup, and the misleading Media screen state. Nothing an agent needs before firing this call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already says 'File id from get_media_library — not a name or a URL.' The description adds the harder imperative 'ONLY — never guess it,' which reinforces sourcing rather than restating type, but adds no format or syntax detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource and an explicit scope limiter: 'Permanently delete one file from the media library.' It also distinguishes itself from the nearest confusable sibling by stating that removing a photo from one product is a product edit, not this 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?
Gives explicit when/when-not: the file ID must come from get_media_library and never be guessed, the merchant must be asked to confirm naming the file, and if the caller is unsure it should send them to the Media screen instead. The alternative (product edit for unlinking a single image) is named outright.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_delete_modifierDelete modifierADestructiveInspect
Remove a modifier from the catalogue AND detach it from every category at once — the till stops asking it everywhere. Check get_modifier first and tell the merchant which categories lose it. To stop asking it in ONE place only, use unlink_modifier_from_category. Past orders keep the options that were already rung up.
| Name | Required | Description | Default |
|---|---|---|---|
| modifierId | Yes | Modifier id from get_modifiers |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag destructiveHint=true; the description goes further by disclosing the blast radius (detached from every category, till stops asking everywhere) and what survives the deletion (past orders keep already-rung-up options). That is precisely the extra context the lower bar with annotations asks for.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the scope of destruction, then prerequisite, then alternative, then the historical-data caveat. Every sentence carries decision-relevant information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with no output schema, the description covers effect, blast radius, prerequisite, alternative, and irreversibility boundary. An agent has everything needed to call it correctly and warn the merchant.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and schema description coverage is 100% ('Modifier id from get_modifiers'), so the schema already carries the semantics. The description adds no format, constraint, or sourcing detail beyond it — baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource with exact scope: removes the modifier from the catalogue AND detaches it from every category at once. It explicitly names the sibling it is not (unlink_modifier_from_category), so an agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a prerequisite (call get_modifier first), a merchant-facing action (tell them which categories lose it), and an explicit alternative with its selecting condition ('to stop asking it in ONE place only, use unlink_modifier_from_category'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_delete_modifier_choiceDelete a choiceADestructiveInspect
Remove one choice from a modifier. Refused when it would leave a category asking for more choices than remain — the explanation names the category.
| Name | Required | Description | Default |
|---|---|---|---|
| choiceId | Yes | Choice id from get_modifier | |
| modifierId | Yes | Modifier id from get_modifiers |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the basic safety profile is covered. The description adds a genuine business rule beyond that: the delete is refused if it would leave a category requiring more choices than remain, and the error explanation names the offending category. It does not say what happens to historical orders referencing the choice.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, zero filler, with the operation stated first and the failure condition second. Every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter destructive delete with no output schema and annotations covering the safety profile, the description is nearly sufficient: it states scope and the one non-obvious refusal condition. Minor gap is the absence of any cascade/impact note.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters already point at their source lookups (get_modifier, get_modifiers). The description adds nothing about parameter format or provenance, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb plus resource with explicit cardinality ('Remove one choice from a modifier'), which also implicitly separates it from hub_delete_modifier (the whole modifier) and hub_add_modifier_choice. An agent can route to this tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The refusal precondition signals when the call will fail, which is useful, but the description never names the alternatives an agent should consider instead (hub_update_modifier_choice to rename, hub_reorder_modifier_choices to reorder, hub_delete_modifier for the whole set). Usage is only implied by the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_delete_outletDelete outletADestructiveInspect
Close a point of sale permanently. Takes the outlet id from get_outlets. CONFIRM WITH THE MERCHANT FIRST, naming the outlet — there is NO undo from here. Tell them what goes with it: the stock recorded AT that outlet is removed and is NOT moved anywhere else (transfer it out first if they want to keep it), and so are the outlet’s tax rate values and its per-outlet product visibility. Past orders, sessions and reports still name the outlet and are not touched, and the stations that belonged to it are NOT deleted — they have to be dealt with separately. An outlet that WooCommerce uses as its default is refused: the merchant must change that default or uninstall the WooCommerce extension first.
| Name | Required | Description | Default |
|---|---|---|---|
| outletId | Yes | Outlet id from get_outlets — not a name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds substantial value beyond them: no undo, stock removal without relocation, tax-rate and product-visibility loss, preserved entities (orders, sessions, reports, stations), and a hard precondition (WooCommerce default outlet refusal). This is exactly the cascade detail an agent needs for an irreversible mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then dense but non-redundant safety detail. The multi-clause sentences are heavy, yet nearly every clause covers a distinct consequence or precondition, so little could be cut without losing critical 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?
Single-parameter destructive tool with no output schema; the description covers the safety profile, cascade effects, preserved data, and blocking preconditions. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already states "Outlet id from get_outlets — not a name." The description repeats the get_outlets sourcing but adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Close a point of sale permanently") and immediately distinguishes itself from related siblings like hub_update_outlet and hub_delete_station by specifying what is and isn't removed. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit about when and how to use it: confirm with the merchant first, transfer stock out before deleting if it should be kept, deal with stations separately, and change the WooCommerce default before attempting deletion. Prerequisites and the refusal condition are both named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_delete_productDelete productADestructiveInspect
Remove a product from the merchant's catalogue. Takes the product ID ONLY — look it up with get_products and never guess. CONFIRM WITH THE MERCHANT BEFORE CALLING, naming the product: this also removes all of its variants and there is no undo. If several products match, list them and ask which one instead of picking.
| Name | Required | Description | Default |
|---|---|---|---|
| productId | Yes | Product id from get_products — not a name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, but the description adds the crucial cascade behavior (all variants are removed too) and the irreversibility ('no undo'), plus the mandatory merchant-confirmation gate. These are material traits the annotations alone do not 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?
Three tight sentences, front-loaded with the scoping rule, then the confirmation requirement and the multi-match fallback. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with no output schema, the description supplies everything an agent needs: identity source, confirmation gate, cascade scope, and irreversibility. Nothing relevant is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter's schema text ('Product id from get_products — not a name') already carries the semantics. The description's 'takes the product ID ONLY — never guess' reinforces but does not add new parameter information beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Remove a product from the merchant's catalogue' — which cleanly separates it from the many sibling delete tools (hub_delete_category, hub_delete_modifier, etc.). An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes the workflow: look the ID up via get_products, never guess, confirm with the merchant naming the product, and if several match, list them and ask rather than picking. This is when-to-use, prerequisites and a disambiguation rule all in one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_delete_roleDelete roleADestructiveInspect
Delete a role the merchant no longer uses. Takes the roleId from get_roles. CONFIRM FIRST, naming the role — there is no undo. A role that anyone still holds cannot be deleted: the server refuses and tells you how many people are on it. Move them with assign_role first, and check with the merchant which role they should land on — that move changes what those people can do. You cannot delete the role you are signed in under.
| Name | Required | Description | Default |
|---|---|---|---|
| roleId | Yes | Role id from get_roles — not a role name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, but the description goes well beyond that: it warns there is no undo, explains the server-side refusal when holders exist and that it reports the headcount, and states the self-deletion block. These are concrete failure modes and side effects an agent cannot infer from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action, then confirmation, then failure modes in a logical order; nearly every sentence carries a distinct constraint. The one weak spot is the 'Takes the roleId from get_roles' sentence, which duplicates the schema description and could be dropped.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with no output schema, the description covers confirmation protocol, irreversibility, the dependent-entity precondition, the required remediation tool, and the self-deletion guard. Nothing an agent needs to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents roleId as 'Role id from get_roles — not a role name'. The description's 'Takes the roleId from get_roles' largely repeats that, adding no new format or syntax detail. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a role') with the scoping qualifier 'the merchant no longer uses', which distinguishes it from hub_create_role and hub_update_role in the sibling list. An agent can identify the operation and its intent without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the prerequisite workflow: reassign holders via assign_role first, consult the merchant about the target role, and it rules out deleting the signed-in role. It also references get_roles as the source of the id. When-to-use and when-not-to-use are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_delete_stationDelete tillADestructiveInspect
Remove a till from Run → Stations. Takes the station id from get_stations. CONFIRM WITH THE MERCHANT FIRST, naming the station — there is NO undo from here, and it takes a working register out of service: the device that used it has to be set up again in the POS app, and it comes back as a NEW station with a new id. A station reporting IN_USE is REFUSED, exactly as the cabinet greys the button out — the shift has to be closed on the device first. If the merchant insists that till is idle, the flag is stale (it was closed while the device was offline); it clears once the device reconnects, so try again then instead of forcing anything. Past orders, sessions and End of Session reports keep naming this station and are not touched.
| Name | Required | Description | Default |
|---|---|---|---|
| stationId | Yes | Station id from get_stations — not a name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description goes far beyond them: no undo, a working register taken out of service, the device needing re-provisioning in the POS app, and the station returning as a new object with a new id. It also explains the IN_USE refusal semantics and that past orders, sessions and End of Session reports are preserved.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the action and then layers confirmation and edge-case handling in logical order. The IN_USE and stale-flag discussion is dense and runs a little long, but nearly every sentence carries actionable information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, no-undo tool with one parameter and no output schema, the description supplies everything an agent needs: the scope of destruction, the refusal condition, recovery guidance for a stale flag, and the reassurance that historical records are untouched.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter already documents 'Station id from get_stations — not a name.' The description restates the same source but adds no format, syntax, or edge-case detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Remove a till from Run → Stations') and pins down the exact object via 'Takes the station id from get_stations.' An agent can immediately distinguish this from hub_create_station and hub_rename_station among the siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-apply rules: confirm with the merchant first, the deletion is refused while the station reports IN_USE (close the shift on the device first), and if the flag is stale, wait for reconnection rather than forcing. This covers usage, prerequisites, and exclusions better than most definitions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_delete_supplierDelete supplierADestructiveInspect
Remove a supplier the merchant no longer buys from. CONFIRM WITH THE MERCHANT FIRST, naming the supplier — there is no undo from here. Its item links go with it, so any auto-reorder rule pointing at this supplier stops producing suggestions. REFUSED while the supplier still has an open purchase order (anything not fully received): receive or cancel those first — get_purchase_orders filtered by this supplier shows them. Purchase orders already placed are kept and still name the supplier.
| Name | Required | Description | Default |
|---|---|---|---|
| supplierId | Yes | Supplier id from get_suppliers — not a name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description goes well beyond them: no undo, cascading removal of item links, downstream effect on auto-reorder rules, and the open-PO refusal condition. It also clarifies what survives (previously placed purchase orders keep naming the supplier), which an agent cannot infer from 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?
Front-loads the confirmation warning and the irreversible consequence, then covers refusal conditions. Four dense sentences, each carrying distinct operational facts, though the closing note on retained purchase orders could be tightened.
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 needed for a delete, the description supplies the prerequisites, cascade effects, refusal path, and survival behavior an agent needs to invoke this safely. Nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter is documented as 'Supplier id from get_suppliers — not a name'. The description only alludes to the supplier obliquely ('naming the supplier') and adds no format or sourcing detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Remove a supplier') and scopes it to the merchant's no-longer-used suppliers, which distinguishes it from hub_update_supplier and hub_delete_* siblings. An agent immediately understands this is a hard removal, not a deactivation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to confirm with the merchant first, states the precondition that blocks deletion (an open purchase order), and names the exact sibling (get_purchase_orders filtered by this supplier) to check eligibility. It also tells the agent what to do instead when refused: receive or cancel the POs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_delete_tax_groupDelete tax groupADestructiveInspect
Delete a tax group. Takes the tax group id from get_taxes. THIS MOVES PRODUCTS: every product assigned to this group is re-pointed at replacementTaxGroupId, or — if you omit it — left with NO tax group at all, meaning those products are sold UNTAXED from that moment. Always ask the merchant which of the two they want and pass a replacement unless they say otherwise. The rates inside it are NOT deleted; they stay available to the other groups (use delete_tax_rate if the merchant really wants a rate gone). CONFIRM WITH THE MERCHANT BEFORE CALLING, naming the group and how many products it affects. There is no undo. Sales already rung up are NOT recalculated — this only affects sales from now on.
| Name | Required | Description | Default |
|---|---|---|---|
| taxGroupId | Yes | Tax group id from get_taxes — not a name | |
| replacementTaxGroupId | No | Tax group its products move to. OMIT ONLY if the merchant wants those products left untaxed |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, but the description carries far more: products are re-pointed to the replacement group or left completely untaxed if the parameter is omitted, tax rates survive deletion, there is no undo, and past sales are not recalculated. These are distinct behavioral traits (cascading side effects, irreversibility, non-retroactivity) that annotations alone cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the highest-stakes consequence (products move / may go untaxed), then the rate-preservation clarification, then the confirmation requirement. Every sentence carries operational weight. The all-caps emphasis is heavier than necessary for an otherwise disciplined structure, which costs it the top mark.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and none is needed — the description covers cascading effects, the safe default choice, the confirmation step, irreversibility, and the temporal scope of the change. Nothing an agent needs in order to call this safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description goes beyond the schema text by attaching the business consequence to each parameter value — omitting replacementTaxGroupId means 'those products are sold UNTAXED from that moment' — which maps the parameter choice to an outcome rather than just a 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?
States a specific verb and resource ('Delete a tax group') and immediately distinguishes it from sibling operations by explaining what is preserved rather than deleted: 'The rates inside it are NOT deleted... use delete_tax_rate if the merchant really wants a rate gone.' An agent can route between hub_delete_tax_group, hub_delete_tax_rate, and hub_update_tax_group without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use and when-not guidance, plus routing to the correct alternative ('use delete_tax_rate'). It also prescribes the agent's workflow — 'Always ask the merchant which of the two they want' and 'CONFIRM WITH THE MERCHANT BEFORE CALLING, naming the group and how many products it affects' — which is exactly the missing guidance most destructive tools omit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_delete_tax_rateDelete tax rateADestructiveInspect
Permanently delete a tax rate FROM THE WHOLE COMPANY. Takes the tax rate id from get_taxes. THIS CASCADES: the rate is stripped out of every tax group that lists it and all of its per-outlet percentages are deleted with it. Products in those groups immediately stop being charged this tax. This is almost never what a merchant means when they say "remove the tax from X" — that is remove_tax_rate_from_group. Use this one only when they say the rate should not exist at all any more. CONFIRM WITH THE MERCHANT BEFORE CALLING, naming the rate and listing every group it will disappear from. There is no undo and no way to recover the percentages. Sales already rung up are NOT recalculated — this only affects sales from now on.
| Name | Required | Description | Default |
|---|---|---|---|
| taxRateId | Yes | Tax rate id from get_taxes — not a name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, but the description goes well beyond them by disclosing the cascade into tax groups, deletion of per-outlet percentages, immediate tax impact on products, irreversibility, and that past sales are not recalculated. These are exactly the consequences an agent needs before invoking a destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the irreversible action and scope, then layers cascade effects, the safer alternative, confirmation requirements, and retroactivity limits. It is long but every sentence is decision-critical for a destructive tool, and capitalization is used deliberately to surface risk.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, no-output tool with only one parameter, the description covers the cascade, the alternative tool, confirmation prerequisites, irreversibility, and the forward-only effect on sales. Nothing essential for correct invocation appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single required parameter taxRateId is documented as coming from get_taxes and not being a name. The description repeats that same sourcing ('Takes the tax rate id from get_taxes') without adding syntax, format, or validation detail beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Permanently delete a tax rate') and immediately scopes it ('FROM THE WHOLE COMPANY'). It explicitly distinguishes this from the sibling hub_remove_tax_rate_from_group, so an agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-not guidance: 'This is almost never what a merchant means... that is remove_tax_rate_from_group.' It also states the narrow condition for using this tool ('only when they say the rate should not exist at all any more') and adds a required confirmation step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_export_recordsExport recordsARead-onlyInspect
Dump one resource in spreadsheet shape — every record flattened to the same columns the import tools accept, WITH its id. Answers 'export my catalogue / my customers', and it is the required first step before any import that changes existing records: the updates arrays all key on the ids this returns. For QUESTIONS about the data ("how many products", "find John") use get_products / get_customers / get_categories / get_outlets / get_options instead — they read better and filter server-side. LIMITATIONS: no filtering and no sorting; records come back in stored order, one window at a time. It also cannot produce a FILE — if the merchant wants a .csv/.xlsx download, send them to Settings → Import / Export → Export in the cabinet and do not page through thousands of rows to imitate it. Money is in minor units (cents), matching what the import tools read back.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Records to return, default 100, max 500 | |
| offset | No | Records to skip, default 0 | |
| resource | Yes | Which resource to dump. "options" means product attributes (Size, Colour) — the cabinet calls them Attributes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly/non-destructive/non-open-world. The description adds real behavioral traits on top: no filtering, no sorting, stored order, one window at a time, cannot emit a file, and money values in minor units. These are exactly the operational facts an agent needs and are not derivable from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose before pivoting to alternatives and limitations, and every sentence carries weight (import dependency, alternatives, limitations, file caveat, money units). It is dense and fairly long, but the length is justified by the tool's ambiguity risk; only marginal tightening is possible.
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?
Although there is no output schema, the description compensates by describing the return shape (flattened spreadsheet columns, ids included, minor-unit money) and the pagination behavior (one window at a time). For a 3-parameter read tool, all decision-relevant context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents limit/offset/resource. The description still adds meaning: it clarifies the 'options' resource maps to product attributes, explains the id-bearing flat shape the update arrays key on, and frames limit/offset as windowing. It goes modestly beyond the baseline without restating syntax.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a concrete verb+resource ('Dump one resource in spreadsheet shape') and states the exact output shape (records flattened to import-compatible columns WITH id). It explicitly distinguishes itself from the read siblings (get_products/get_customers/etc.) that answer questions, so an agent can route correctly without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the primary trigger ('export my catalogue / my customers'), the workflow prerequisite ('required first step before any import that changes existing records'), the correct alternative for questions, and the correct alternative for file downloads (Settings → Import / Export → Export). When-to-use, when-not, and alternatives are all explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_export_stock_csvExport stock CSVARead-onlyInspect
The stock export file for ONE outlet, as CSV text: Variation ID, Product Name, Variation name, SKU, Stock Management, Cur Qty, New Qty. Use it when the merchant asks for the stock sheet itself — a stocktake worksheet, a hand-off to a supplier, 'give me my stock as CSV'. For stock QUESTIONS — how many of X are left, what is running out, history of a change — use get_stock, find_low_stock and get_stock_history: they filter on the server and explain when tracking is switched off. This dump includes untracked rows and cannot tell "zero" apart from "not counted here". It is READ-ONLY: to write counts back, edit the New Qty column and send the file to import_stock_csv. Large catalogues are truncated — the reply reports the true row count.
| Name | Required | Description | Default |
|---|---|---|---|
| maxRows | No | Data rows to return, default 200, max 2000 | |
| outletId | Yes | Outlet id from get_outlets — not a store name | |
| statuses | No | Restrict to these product statuses | |
| categoryIds | No | Category ids from get_categories | |
| productTypes | No | Restrict to these product types |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly/destructive/openWorld), it discloses real behavior: the dump includes untracked rows, cannot distinguish 'zero' from 'not counted here', is READ-ONLY with the write-back path via import_stock_csv, and truncates large catalogues with a true row count in the reply. Rich context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what the file is and its columns before usage guidance. Dense but every sentence carries distinct information (routing, limitations, write-back path, truncation). Slightly long but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the returned columns and covering truncation and the untracked-row caveat. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters, making 3 the baseline. The description reinforces single-outlet scope ('ONE outlet') and the output columns but adds no syntax or format guidance beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: 'The stock export file for ONE outlet, as CSV text,' and then enumerates the exact columns returned. It clearly distinguishes itself from sibling stock tools (get_stock, find_low_stock, get_stock_history).
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?
Explicit when-to-use ('stocktake worksheet, a hand-off to a supplier, give me my stock as CSV') and when-not ('For stock QUESTIONS... use get_stock, find_low_stock and get_stock_history'), naming the alternatives by role. Routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_find_low_stockLow stockARead-onlyInspect
What is running out. Answers 'what is low', 'what do I need to reorder', 'what has run out at the warehouse'. Returns the stock-tracked (variant, outlet) lines at or below a threshold, lowest first. Threshold defaults to 5; pass threshold: 0 for "what has actually hit zero". Lines where stock is NOT tracked are excluded on purpose — they have no count, so they can never be low, and reporting them would invent a shortage that does not exist. This is per outlet: the same variant can be empty in one shop and full in another. For one specific product use get_stock instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many lines to return, default 25 | |
| outletId | No | Outlet id from get_outlets. Omit to cover every outlet | |
| threshold | No | Report lines with this many units or fewer. Default 5; use 0 for out-of-stock only |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), but the description adds real behavioral context beyond them: it explains that non-stock-tracked lines are deliberately excluded and why (reporting them would invent a shortage), and that results are per-outlet so the same variant can be empty in one shop and full in another. It also discloses result ordering (lowest first).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the answer ('What is running out') and each subsequent sentence carries distinct content: scope, default behavior, exclusion rationale, outlet granularity, alternative tool. It runs slightly long — the triple phrasing of the same intent and the exclusion justification could be trimmed — but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by describing the returned lines (variant/outlet), the cutoff condition, and the sort order. Combined with 100% schema coverage and clear annotations, an agent has everything needed to call and interpret this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so limit, outletId and threshold are already fully documented, including the default 5 and the threshold:0 convention that the description repeats. The per-outlet explanation ('the same variant can be empty in one shop and full in another') adds genuine interpretive meaning to outletId, but overall the description mostly restates the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource outcome ('What is running out... Returns the stock-tracked (variant, outlet) lines at or below a threshold, lowest first') and explicitly distinguishes itself from the sibling get_stock for single-product lookups. An agent can identify the tool's output shape and scope without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit user-intent phrasings ('what is low', 'what do I need to reorder', 'what has run out at the warehouse'), the threshold condition that selects each case (default 5 vs threshold: 0 for zero-stock), and names the alternative for a narrower question ('For one specific product use get_stock instead'). Only hub_get_reorder_suggestions is left unmentioned as a possible overlap, which is a minor omission against otherwise complete routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_booking_availabilityCheck booking availabilityARead-onlyInspect
The bookable windows for a product over a date range, per resource, with what is already taken. Quote times from THIS — never compute a grid yourself: the engine applies the hours, the buffer, notice and advance limits, and the outlet timezone, and a hold whose start is not exactly a slot start is refused. Ask for a few days at a time; a year-wide range is slow and pointless.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ISO instant, end of the range | |
| from | Yes | ISO instant, start of the range, e.g. "2026-09-12T00:00:00Z" | |
| outletId | No | The shop the booking is for — decides the local wall clock. Omit for the company default | |
| productId | Yes | Product id from get_products |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read (readOnlyHint=true, destructiveHint=false, openWorldHint=false), so the bar is lower, yet the description still adds real behavior: the engine applies opening hours, buffers, notice and advance limits and the outlet timezone, and off-slot holds are rejected. It also discloses a latency characteristic for wide ranges. It stops short of describing the shape or volume of the returned windows, which is the one remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with what is returned, then the authoritative-source rule, then the performance caveat. Every sentence carries distinct information with no restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, four-parameter tool with no output schema, the description covers purpose, authoritative semantics, cross-tool constraints (slot boundaries for holds), timezone handling and cost. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: the range parameters are practically bounded (a few days, not a year) and results are per resource, tying the inputs to the expected granularity of 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?
States a specific resource and scope: the bookable windows for a product over a date range, per resource, with what is already taken. An agent can tell this is the read-side availability query and not hub_hold_booking or hub_confirm_booking without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use and when-not-to: quote slot times from THIS result rather than computing a grid, because a hold starting off a slot boundary is refused. It also gives a practical range limit (a few days at a time; year-wide is slow and pointless), which is concrete guidance rather than implication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_booking_eventsRead booking historyARead-onlyInspect
The trail of what happened to bookings — held, confirmed, cancelled, expired — newest first, with who did it. Use it to answer "what happened to this booking"; an actor of system is the server freeing an expired hold, not a person. Each row is immutable, so this is the record even when the booking itself is gone.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many rows, newest first. Default 100 | |
| productId | No | Narrow to one product. Omit for the whole company |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safe-read profile (readOnlyHint, destructiveHint=false), yet the description adds genuinely new behavioral context: rows are immutable, the log survives deletion of the booking itself, and an actor of `system` means an automated expiry rather than a person. That last point is the kind of interpretation detail an agent cannot derive from 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?
Three sentences, zero filler, and the core scoping/ordering facts are front-loaded before the interpretive guidance. Nothing is repeated from the schema or annotations.
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 carry return-shape information; it supplies event types, ordering, and the actor column, but does not describe the remaining per-row fields. Still, for a two-param read tool this covers nearly everything an agent needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters carry their own descriptions (including the default of 100 and the product-scoping behavior). The description echoes ordering ("newest first") and column scope but adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: the immutable event trail for bookings (held, confirmed, cancelled, expired), newest first, with the actor. This is unmistakably distinct from siblings like hub_get_booking_rules or hub_get_booking_availability, which are configuration/availability rather than history.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use trigger: "Use it to answer 'what happened to this booking'," and further clarifies actor semantics for interpreting `system`. It does not name a sibling alternative or state when NOT to use it, 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.
hub_get_booking_resourcesList booking resourcesARead-onlyInspect
List what can be booked — the staff, rooms, tables or assets in the company directory. A resource is whatever can only be in one place at a time, and it is shared across services: the same barber is one resource whether he cuts hair or trims a beard, which is why booking him for one closes the other. Read this before creating anything and reuse what is there.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false). The description adds real domain behavior beyond that: a resource is single-location and shared across services, so booking a barber for one service closes the other. That cross-service coupling is useful context an agent cannot get from annotations. It does not describe return shape or pagination, but no output schema exists to cover it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action ('List what can be booked') followed by the concept definition and the reuse instruction. The barber example is illustrative rather than padding since it explains the cross-service behavior, though it is slightly long for the value delivered.
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, read-only listing tool with no output schema, the description supplies what an agent needs: what a resource is and why to reuse existing ones. Nothing critical is missing, though a brief note on what fields come back would round it out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to expand on; the baseline for 0 params is 4. No parameter semantics are missing or misleading.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('what can be booked — staff, rooms, tables or assets'), and concretely enumerates the resource types. It is clearly distinguished from the sibling hub_create_booking_resource, so an agent can tell read-listing apart from creation without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Read this before creating anything and reuse what is there' gives clear directional context — consult this before writing. However, it never explicitly names the alternative (hub_create_booking_resource) or states exclusions, so the routing is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_booking_rulesList booking rule setsARead-onlyInspect
List the reusable booking policies the merchant already has — opening hours, slot length, buffer, how far ahead people may book. A rule set is shared by every product pointing at it, exactly like a tax table, so ALWAYS read this before creating one and offer an existing set when it fits. Editing a set changes every product that uses it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: rule sets are shared across products like a tax table, and editing one cascades to every dependent product. It does not describe return shape or pagination, keeping it at a 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the purpose and fields, then the usage directive, then the sharing warning. The tax-table analogy and the editing caveat slightly overlap the sharing concept, but every sentence carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only list tool with annotations covering safety and no output schema, the description is nearly sufficient: it explains what a rule set holds and the cross-product sharing semantics. A brief note on what identifiers a returned set carries would fully close the loop.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a parameterless tool is 4. No contradicting or redundant parameter text is present.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (reusable booking policies/rule sets) and enumerates the fields contained (opening hours, slot length, buffer, lead time). It explicitly distinguishes itself from the sibling hub_create_booking_rules by framing itself as the prerequisite read step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an unambiguous when-to-use directive: 'ALWAYS read this before creating one and offer an existing set when it fits.' This names the alternative action (creating) and the condition (an existing set fits), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_categoriesList categoriesARead-onlyInspect
The merchant's product categories, as the tree they see in the cabinet: every category with its subcategories nested inside it, sorted by sortOrder. Answers "what categories do I have", "is there a Drinks category", "where does Beer sit". Use it to get the category id any other tool needs. It returns categories ONLY — never products, and never a product count. There is no way to list the products of a category from this server today: get_products searches by name or SKU and cannot filter by category, so say that plainly instead of guessing. To put a product INTO a category, go to the product side: create_product / update_product take categoryIds. The whole tree comes back at once — there is no paging and no search argument, so filter by name yourself.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/non-destructive/openWorld=false, yet the description still adds real behavioral context: the entire tree returns at once, there is no paging and no search argument, filtering must be done client-side, and it returns categories only (never products or counts). That return-shape disclosure matters because there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core behavior, then routing guidance, then explicit negatives; each sentence earns its place, though the sequence of separate 'never products / no way to list products / say that plainly' statements is slightly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A zero-parameter, read-only list tool with no output schema is fully covered: the description explains the return shape, the lack of filtering, and where to go for the adjacent product-assignment task.
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?
Zero parameters, so the baseline is 4; the description correctly notes the absence of any search or paging argument, which is the only parameter-relevant fact an agent needs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (list the merchant's product categories as a nested tree, sorted by sortOrder) and explicitly distinguishes itself from hub_get_products, hub_create_product and hub_update_product. An agent can tell exactly what this returns without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (get the category id any other tool needs), when-not-to-use (this server cannot list a category's products; get_products searches by name/SKU only), and names the alternative tools for the adjacent task (create_product/update_product for assigning categoryIds).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_category_modifiersList modifier placementsARead-onlyInspect
Where modifiers are actually asked: one row per category↔modifier link, with that category’s own rules (required, min, max, order). This is what makes a modifier reach the till, so use it to answer "what options does this category ask" or "where is this modifier used". Narrow to one category with categoryId. Remember products also inherit their ancestors’ links, so a subcategory asks more than its own rows show. The id on each row is the LINK id — that is what update_category_modifier and unlink_modifier_from_category take.
| Name | Required | Description | Default |
|---|---|---|---|
| categoryId | No | Category id from get_categories. Omit for every category |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/no-destructive annotations, it discloses non-obvious behavior: products inherit ancestors' links so a subcategory returns effectively more options than its own rows, and the row 'id' is the LINK id consumed by two named write tools. Those are exactly the traits that prevent misuse of the returned ids.
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 core identity is front-loaded in the first clause, and each subsequent sentence carries distinct payload (use cases, scoping, inheritance, id semantics). It is slightly dense with four sentences, but none is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-shape burden and does so: row grain (one per link), the per-category rule fields (required, min, max, order), and the id's meaning. An agent has everything needed to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameter's meaning ('Category id from get_categories. Omit for every category') is already documented in the schema. The description reinforces the narrowing behavior but adds no format or syntax detail beyond it, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb+resource: it returns 'one row per category↔modifier link' with the category's own rules. It is clearly distinguishable from hub_get_modifiers (modifier definitions) because it is framed as 'where modifiers are actually asked.' The named relation to update_category_modifier and unlink_modifier_from_category sharpens its identity further.
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 concrete use cases ('what options does this category ask', 'where is this modifier used') and tells the agent to narrow with categoryId. What is missing is an explicit when-not / alternative routing, e.g. telling the agent to use hub_get_modifiers when it wants modifier definitions rather than placements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_customerGet customer detailsARead-onlyInspect
Everything known about ONE customer: addresses, notes, how many orders they placed, what they spent and what was refunded. Takes the customer ID from get_customers, never a name. Use it before answering a question about a specific person — the list leaves notes and refunds out.
| Name | Required | Description | Default |
|---|---|---|---|
| customerId | Yes | Customer id from get_customers — not a name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered without the description. The description adds useful scope disclosure (it returns notes and refund history, unlike the list) but says nothing about the return shape or how large a customer record can be, so it only modestly exceeds the annotation bar.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, zero filler, and the highest-value fact (what the tool returns) is front-loaded in the first clause. The two constraints that follow — ID source and when to call — each earn their 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?
There is no output schema, so the description carries the burden of telling the agent what comes back, and it does enumerate the key fields (addresses, notes, order count, spend, refunds). What is missing is any note on result size or whether the record is a flat object, but for a single-parameter read tool this is close to sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter is already documented as 'Customer id from get_customers — not a name'. The description restates the same constraint ('Takes the customer ID from get_customers, never a name'), which reinforces but does not extend the schema. Baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (get) and resource (ONE customer) plus the exact payload it returns: addresses, notes, order counts, spend and refunds. The word 'ONE' and the pointer to 'the list' distinguish it from the sibling hub_get_customers without the agent opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit timing guidance ('use it before answering a question about a specific person') and justifies it by contrast with the list, which 'leaves notes and refunds out'. It does not name hub_get_customer_orders, hub_get_refunds, or hub_get_transactions as narrower alternatives, so routing among the per-customer siblings is left partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_customer_ordersCustomer order historyARead-onlyInspect
ONE customer's history as a single timeline, newest first: their orders AND the refunds taken against them, each row marked type "order" or "refund" — the same list the customer screen shows. Answers 'what has this person bought', 'did we refund them', 'when were they last in'. Takes the customer ID from get_customers, never a name. get_orders with customerIds returns the orders alone and a total count; use this tool when the refunds belong in the answer. No total count comes back here — keep paging until a page returns fewer rows than asked for.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, default 1 | |
| pageSize | No | Rows per page, default 20 | |
| customerId | Yes | Customer id from get_customers — not a name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), so the bar is lower. The description adds genuinely useful behavior: result ordering (newest first), row typing, and the absence of a total count with a concrete pagination termination rule ('keep paging until a page returns fewer rows than asked for'). It does not mention default page size, but the schema covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core differentiator and free of filler, but five sentences is on the long side and the three quoted example questions plus 'the same list the customer screen shows' are partly rhetorical padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, yet the description compensates by describing the return shape (rows typed order/refund, newest first, no total count) and the paging contract. Nothing needed to call and consume this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented, including the 'not a name' note on customerId, which the description merely repeats. The pagination guidance adds marginal meaning but no new parameter-level syntax. Baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with precise scope: one customer's merged order+refund timeline, newest first, with row type markers. It explicitly distinguishes itself from hub_get_orders and hub_get_refunds, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit alternative and the exact condition that selects this tool: 'get_orders with customerIds returns the orders alone and a total count; use this tool when the refunds belong in the answer.' It also states the ID must come from get_customers and never a name, which is a real invocation constraint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_customersList customersARead-onlyInspect
List the merchant's customers. Answers 'who are my customers', 'find John's email', 'has this person bought from us'. Search matches email, first name, last name and full name — NOT phone numbers, addresses or notes. LIMITATION — there is no sorting: results come back in stored order and cannot be ordered by spend, name or last visit. So 'my best customers' or 'who spent the most' CANNOT be answered from this tool, and you must NOT page through everyone trying. Say plainly that sorting is not supported yet, then offer what does work: search by a name or email, or ask the merchant to narrow it down.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, default 1 | |
| search | No | Filter by email, first name, last name or full name | |
| pageSize | No | Results per page, default 20 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, non-destructive, closed-world), and the description adds genuinely new behavior: search scope is limited to email/name fields and explicitly excludes phone/address/notes, and results are returned in stored order with no sorting. These constraints materially change how an agent should behave and are not derivable from the annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with capability, then search scope, then the limitation and the prescribed response. Slightly longer than needed — the no-sorting point is restated three ways ('cannot be ordered by spend, name or last visit', 'my best customers', 'who spent the most') — but no sentence is off-topic.
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 filtered-list tool with no output schema, the definition covers capability, search coverage, the hard limitation, and the required user-facing behavior. An agent has everything it needs to answer or correctly refuse a customer query.
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 page/pageSize/search semantics already come from the schema (baseline 3). The description adds marginal but real value with the negative enumeration of what 'search' does NOT match (phone, address, notes), which the schema does not state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('List the merchant's customers') and immediately frames the questions it answers ('who are my customers', 'find John's email', 'has this person bought from us'). This distinguishes it from hub_get_customer (single record), hub_create_customer, and hub_get_customer_orders without needing the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Goes beyond context to explicit exclusions: no sorting means 'my best customers'/'who spent the most' cannot be answered, and paging through everyone is forbidden. It also prescribes the fallback (search by name/email, or ask the merchant to narrow down), which is exactly the when-not/alternative guidance the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_employee_ordersEmployee ordersARead-onlyInspect
The orders ONE staff member rang up in a date range. Takes the employee id from get_employee_sales, never a name. Use it to back up a claim about a person — 'show me the sales behind Maria's number', 'which orders did he refund'.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, default 1 | |
| endDate | Yes | End of the window, ISO 8601. Inclusive of the day when a bare date is given | |
| outlets | No | Outlet ids to restrict to. Omit for all outlets | |
| pageSize | No | Orders per page, default 20 | |
| stations | No | Station ids to restrict to. Omit for all stations | |
| startDate | Yes | Start of the window, ISO 8601, e.g. "2026-08-01" or "2026-08-01T00:00:00Z" | |
| employeeId | Yes | Employee id from get_employee_sales — not a name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and a closed-world scope, so the safety profile is covered. The description adds one real behavioral constraint beyond that — the id must be sourced from get_employee_sales and cannot be a name — but says nothing about pagination behavior or what the result set looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the scope constraint, and the illustrative quotes carry real disambiguating weight rather than filler. Nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only filtered-list tool with full schema coverage and annotations covering safety, the description supplies the one thing structured data cannot: the dependency chain on get_employee_sales. Return shape is undocumented, but with no output schema and a list-style tool that is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all seven parameters (including page, pageSize, outlets, stations, and date bounds) are already documented. The description's only parameter-level contribution repeats the schema's own wording for employeeId, adding no syntax or format detail beyond it. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with an explicit scope limit: 'The orders ONE staff member rang up in a date range.' The capitalized 'ONE' plus the employee-scoped framing cleanly separates it from hub_get_orders and hub_get_customer_orders without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-to-use context ('back up a claim about a person') with two worked examples, and states the prerequisite that the employee id must come from get_employee_sales rather than a name. It never explicitly names the sibling to prefer when you want all orders, so routing is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_employee_salesEmployee salesARead-onlyInspect
Sales per staff member for a date range — Reports → Employee Sales. Answers 'who is my best seller', 'how much did Maria sell', 'who took the most refunds', 'average ticket per employee'. One row per employee with orders, gross sales, refunds, tips and average transaction. Staff lists are short, so ranking is safe: pull the rows and sort them yourself rather than asking the merchant to narrow down. Pass employeeId to get a single person. For the actual orders one person rang up, use get_employee_orders.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, default 1 | |
| endDate | Yes | End of the window, ISO 8601. Inclusive of the day when a bare date is given | |
| outlets | No | Outlet ids to restrict to. Omit for all outlets | |
| pageSize | No | Rows per page, default 50 | |
| stations | No | Station ids to restrict to. Omit for all stations | |
| startDate | Yes | Start of the window, ISO 8601, e.g. "2026-08-01" or "2026-08-01T00:00:00Z" | |
| employeeId | No | Restrict to one employee, by id from a previous call |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, closed-world), but the description adds return-shape context that no output schema provides: one row per employee with orders, gross sales, refunds, tips and average transaction. It also discloses that ranking is safe for small lists. It stops short of stating pagination behavior beyond the schema's defaults.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what the tool returns, then layers in use-cases, ranking guidance, the employeeId shortcut, and the sibling alternative. Every sentence contributes; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully compensates by describing the row contents and grain (one row per employee). For a read-only reporting tool it gives an agent everything needed to call it correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all seven parameters are already documented. The description only re-states employeeId's single-employee behavior, which the schema already explains ('Restrict to one employee, by id from a previous call'), adding no new syntax or semantics. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb-and-resource ('Sales per staff member for a date range'), maps it to a UI location (Reports → Employee Sales), and explicitly contrasts with the sibling get_employee_orders. The concrete example questions ('who is my best seller', 'how much did Maria sell') make the tool's scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: use get_employee_orders for individual order detail, pass employeeId for a single person, and pull-and-sort rows yourself rather than asking the merchant to narrow (with reasoning: staff lists are short). Both the when and the alternative are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_extension_catalogBrowse extension catalogARead-onlyInspect
The extension STORE: every built-in extension the platform offers, the same list for every merchant. Answers 'what can I add', 'do you have a WooCommerce integration', 'can I get X'. For 'what do I already have', use get_installed_extensions instead — this tool only flags each entry with installed. availableOnYourPlan: false means the subscription plan excludes it: the store hides it in the cabinet and install_extension will refuse — say so instead of trying. LIMITATIONS, do not paper over them: the platform stores only a name, a category, a price and an id per built-in extension — there is NO stored description, so do not invent what an extension does; say what the name and category say and offer to open its page in the cabinet. price is a bare stored string with no currency attached — quote it verbatim, never as a formatted amount. Custom extensions built by an organisation are NOT in this list (they need an organisation scope this agent key does not carry); they do show up in get_installed_extensions once installed.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the read-only safety profile, and the description adds substantial traits beyond them: that only name/category/price/id are stored with NO description, that price is an unformatted bare string, that plan-excluded items will be rejected by install_extension, and that custom extensions require an organisation scope this key lacks.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core identity ('The extension STORE') and every sentence carries a distinct usable fact, but at roughly 130 words for a zero-parameter read it is longer than strictly necessary, and the editorial phrasing ('do not paper over them', 'say so instead of trying') is guidance padding rather than specification.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must carry return semantics itself, and it does: the per-entry fields, the installed flag, and the availableOnYourPlan meaning. Combined with the routing and limitation notes, an agent has everything needed to call it and report results honestly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4 and there is nothing for the description to disambiguate. It instead documents the shape of each returned entry (name, category, price, id, installed, availableOnYourPlan), which is return-value information rather than parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the exact resource (the extension STORE) and its scope: every built-in extension, identical for every merchant. It explicitly distinguishes itself from get_installed_extensions and explains that custom extensions are excluded, so an agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete trigger questions ('what can I add', 'do you have a WooCommerce integration') and the explicit counter-case ('what do I already have' -> get_installed_extensions). It also states the consequence of availableOnYourPlan: false (store hides it, install_extension refuses), which is exactly the when-not-to-act guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_extension_surfacesList extension screensARead-onlyInspect
What the installed extensions ADD to the apps — the answer to "where did this new menu item come from", "what is this extra block on the product page", "what did installing X actually change". Every entry belongs to an installed extension; nothing here is part of the base product. Read platform to know where it shows up: hub = this admin cabinet, builder = the POS flow builder, render = the station screen. Within hub, type merchant-hub-page is a navigation entry of its own and merchant-hub-widget is a block embedded in a detail page — attachedTo says which one (products / orders / customers / users). LIMITATION: this tells you which extension-provided screens EXIST, not what they contain — each one is an embedded page owned by its extension, and this agent cannot open or read it. It also cannot say which extension contributed a given entry. To go the other way — what is installed at all — use get_installed_extensions.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only safety profile, yet the description adds substantial behavioral context: every entry belongs to an installed extension, platform values map to hub/builder/render, and it discloses hard limitations (cannot open or read the embedded page, cannot attribute an entry to a contributing extension). That limitation disclosure is exactly what an agent needs before promising a user anything.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what the tool does, then field semantics, then limitations, then the alternative. Dense and mostly earning its length, though the three quoted rhetorical questions add a little padding that plain use-case phrasing would have covered.
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 parameters and no output schema, the description carries the burden of explaining returns — and it does, covering platform/type/attachedTo and explicitly bounding what cannot be known. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description goes further by explaining the meaning of returned fields (platform, type, attachedTo), which is useful even though it is technically output rather than input 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?
States a specific verb and resource (list the screens extensions add to apps) and grounds it in recognizable symptoms ("where did this new menu item come from", "what is this extra block on the product page"). It explicitly separates itself from get_installed_extensions, so an agent can pick the right one without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative and the condition that selects it: "To go the other way — what is installed at all — use get_installed_extensions." The motivating questions imply when to reach for it. It does not address the similarly named flow_list_extension_surfaces sibling, leaving a small ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_financial_summaryFinancial summaryARead-onlyInspect
THE headline money report for a date range — the same numbers as Reports → Financial Summary. Answers 'how much did we make last week', 'what were sales this month', 'how much tax do I owe', 'what lands in my bank'. Returns gross sales, discounts, refunds, fees, tax, tips, net sales, and the settlement split (card / cash / custom) down to what the merchant actually receives. Start here for any "how did the business do" question, and only reach for get_sales_breakdown when the merchant wants the individual orders behind these totals.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | Yes | End of the window, ISO 8601. Inclusive of the day when a bare date is given | |
| outlets | No | Outlet ids to restrict to. Omit for all outlets | |
| stations | No | Station ids to restrict to. Omit for all stations | |
| startDate | Yes | Start of the window, ISO 8601, e.g. "2026-08-01" or "2026-08-01T00:00:00Z" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds real value beyond that by disclosing the returned content and framing it as equivalent to a UI surface ('same numbers as Reports → Financial Summary'), which helps the agent trust and interpret the output. It doesn't cover auth requirements or pagination/limits, but with annotations carrying safety this is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and return contents, then routes the agent to the sibling. A few phrases are stylistic ('what lands in my bank'), but every sentence carries either scope, return content, or routing information, so it earns 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 carries the burden of describing returns, and it does so by enumerating every headline figure and the settlement split. Combined with annotations covering safety and a fully documented schema, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents startDate, endDate, outlets, and stations with format and inclusivity rules. The description adds nothing parameter-specific beyond implying a date range, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('headline money report for a date range'), enumerates the exact figures returned (gross sales, discounts, refunds, fees, tax, tips, net sales, settlement split), and explicitly distinguishes itself from get_sales_breakdown. An agent can identify and differentiate this tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit selection rule: 'Start here for any "how did the business do" question, and only reach for get_sales_breakdown when the merchant wants the individual orders behind these totals.' Names the alternative and the condition that routes to it, plus example user questions that map to it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_installed_extensionsList installed extensionsARead-onlyInspect
What THIS company actually has installed — built-in and organisation-built (custom) extensions alike. This is the answer to 'which extensions do I have', 'is WooCommerce turned on for me', 'what am I paying for'. Not to be confused with get_extension_catalog, which lists what exists on the platform whether or not this merchant has it. Each row carries extensionId (pass this to install_extension / uninstall_extension) and companyExtensionId (the install record itself — you never need to pass that one). description is filled in only for custom extensions; built-in ones store no prose, so do not guess what they do. LIMITATION: the install date is not stored — you cannot say when an extension was added or who added it. To answer what an installed extension CHANGED in the cabinet — a new menu entry, a block on a detail page — use get_extension_surfaces.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, yet the description adds material behavioral caveats: the LIMITATION that install date/installer is not stored, that `description` is only populated for custom extensions (so agents must not guess built-in behavior), and the ID-handling rule. It stops short of describing result shape or ordering, but clearly 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?
Front-loaded with the core distinction before the caveats, and every sentence carries routing or field semantics. It is slightly dense and telegraphic (multiple em-dash asides, ALL-CAPS emphasis), which costs a little readability, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, no output schema steps, and rich annotations, this description supplies everything else an agent needs: scope, sibling disambiguation, field semantics for the returned rows, an explicit data limitation, and a pointer for the follow-up question. 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 tool takes zero parameters, so the baseline is 4. The description still adds field-level meaning for the response (extensionId vs companyExtensionId), which is a bonus rather than a requirement given there is nothing to parameterize.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (list installed extensions) and immediately distinguishes scope: built-in and organisation-built extensions this company actually has. It explicitly names the sibling it is not (get_extension_catalog) and frames the user questions it answers, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('which extensions do I have', 'is WooCommerce turned on for me'), an explicit when-not with the alternative (get_extension_catalog lists the whole platform regardless of install), and a second routing pointer (get_extension_surfaces for cabinet changes). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_linkable_itemsList items a supplier could carryARead-onlyInspect
Catalogue items this supplier does NOT carry yet but could — the picker behind "add items to supplier". Feed what you choose to link_supplier_items. Only stock-managed items appear: something the merchant does not track stock for cannot be purchase-ordered at all, so if an expected item is missing here and missing from get_supplier_items too, the reason is almost always that stock tracking is off for it — say that instead of guessing. Omit supplierId to search the whole linkable catalogue, e.g. while deciding which supplier to create. Returns everything matching, unpaged, so pass a search.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | Match product name, item name, SKU or barcode | |
| supplierId | No | Supplier id — omit to see the whole linkable catalogue |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the read-only safety profile; the description adds the substantive behaviors: results are unpaged (so a search should be passed), only stock-managed items are returned, and missing items are almost always explained by stock tracking being off. That is real operational context an agent could not infer from 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?
Front-loaded with the purpose and the consumer of its output, and every sentence carries information. It is dense with em-dash asides and runs three long sentences, so it is slightly heavier than it needs to be, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description takes on the burden of describing returns ('returns everything matching, unpaged') and covers the tool's edge case around missing items. An agent has everything needed to call it correctly and interpret an empty result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both params are already documented. The description still adds meaning beyond the schema by explaining the consequence of omitting supplierId (whole linkable catalogue) and why a search should be supplied (unpaged return), though it adds nothing about the search matching semantics already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('catalogue items this supplier does NOT carry yet but could') and positions itself precisely against siblings — it is the picker behind 'add items to supplier' and feeds link_supplier_items. An agent can distinguish it from hub_get_supplier_items and hub_link_supplier_items without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit workflow routing: feed results to link_supplier_items; omit supplierId to search the whole catalogue while deciding which supplier to create. It even covers the negative case — what to say when an expected item is missing from both this tool and get_supplier_items.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_media_libraryList media filesARead-onlyInspect
List the image files stored on the merchant's account. Answers 'what images do I have', 'do I already have a photo of X', 'what did I upload recently', and it is where you get a file id before deleting one, or a URL to reuse on a product or category. Newest first; search is a case-insensitive match on the FILE NAME only. LIMITATIONS, state them rather than working around them: there is no other sorting, and no title, alt text, description, folder, file size or image dimensions here — the Media screen in the cabinet shows those, but they are stored by a different service that this tool cannot read, so it may list files this tool does not and vice versa. There is also NO WAY TO RENAME a file from here: if the merchant asks to rename one, or to change its alt text, title or folder, say that has to be done on the Media screen in the cabinet. Do not delete and re-upload to fake a rename.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, default 1 | |
| search | No | Filter by file name, e.g. "logo" or "shirt" | |
| pageSize | No | Results per page, default 20 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare read-only/non-destructive, but the description adds substantial behavior the annotations cannot: newest-first ordering, case-insensitive search scoped to file name only, no other sorting, and the critical divergence that the cabinet Media screen reads a different service so listings may differ both ways.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose, then capabilities, then limitations. It is longer than average, but the limitation warnings (no rename, avoid delete-and-reupload) are load-bearing rather than padding; a slight trim of the example questions would lose nothing.
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 still covers ordering, search semantics, pagination defaults (via schema), what it returns (file id, URL), and what it cannot do, which is everything an agent needs to call it correctly and to avoid fabricating rename support.
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% with defaults and bounds already documented, so the baseline is 3, but the description adds real semantic value: search is a case-insensitive match on file name only, which sharpens the schema's terser 'Filter by file name'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the image files stored on the merchant's account') and implicitly distinguishes itself from hub_upload_media and hub_delete_media_file by noting it is the source of a file id before deletion and a URL for reuse.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the questions it answers ('what images do I have', 'do I already have a photo of X'), states when to reach for it (getting a file id or URL), and gives clear negative routing: renames/alt text/title/folder changes must happen on the Media screen, and deleting-and-reuploading to fake a rename is prohibited.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_modifierGet modifierARead-onlyInspect
One modifier in full: its choices with prices and defaults, and every category it is linked to with that category’s own rules. Read this before editing — update_modifier REPLACES the whole choice list, so you need the current one to send back. Each choice carries price (formatted, for reading out) and priceAmount (plain, what the write tools accept back). Pass priceAmount, never price.
| Name | Required | Description | Default |
|---|---|---|---|
| modifierId | Yes | Modifier id from get_modifiers |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=true, destructive=false, so safety is covered. The description adds real behavioral context beyond annotations: the price vs priceAmount distinction and the instruction to 'Pass priceAmount, never price' guards against a write-time error. It could say more about pagination or auth, but the return-shape disclosure is genuinely useful with no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with what the tool returns, then the precondition, then the critical price/priceAmount caveat. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully describes the return shape (choices, prices, defaults, linked categories with rules) and even warns about the price format mismatch when writing back. Nothing needed to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single param modifierId is documented ('Modifier id from get_modifiers'), so the schema carries the load. The description adds no further meaning for the parameter, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('One modifier in full') and enumerates exactly what comes back: choices with prices and defaults, plus every linked category with its own rules. This clearly distinguishes it from the sibling list tool hub_get_modifiers.
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 tells the agent when to use it: 'Read this before editing — update_modifier REPLACES the whole choice list, so you need the current one to send back.' This names the alternative (update_modifier) and the workflow condition that selects this read.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_modifiersList modifiersARead-onlyInspect
Every modifier the merchant has — the questions the till can ask about an item, with their choices and prices. Start here for anything about options, add-ons, extras, toppings, sizes, milk, cooking temperature or "how do I let them choose X". Each row says how it is answered: "Pick one" (radio), "Pick many" (checkboxes), "Pick many · qty" or "stepper per choice" (the last two count UNITS, so one choice taken three times counts as 3). usedIn is how many categories it is linked to — a modifier with usedIn 0 is invisible at the till no matter how well it is set up.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly=true, destructive=false, openWorld=false), so the description's added value is the field semantics: how each modifier is answered and the unit-counting behavior of 'Pick many · qty'/'stepper per choice'. The usedIn=0 warning ('invisible at the till no matter how well it is set up') is a genuinely useful, non-obvious operational caveat.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core identity of the resource before the routing hint and the field glossary. Dense but each sentence carries information; the answer-mode enumeration is slightly list-heavy but earns its place given no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully explains the shape of returned rows (answer modes, usedIn) and flags the usedIn=0 trap. It omits ordering, pagination, and any statement that the list is unfiltered/unbounded, which is the only meaningful gap for a zero-param list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the 4 baseline applies. The prose is spent instead on return-field meaning, which is appropriate for a no-arg list call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Every modifier the merchant has') and immediately grounds the abstract term with a concrete gloss ('the questions the till can ask about an item, with their choices and prices'). An agent can tell this is the bulk-list of modifiers and not the single-record or category-scoped 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?
'Start here for anything about options, add-ons, extras, toppings, sizes, milk, cooking temperature or "how do I let them choose X"' gives strong entry-point routing by intent. It stops short of naming when-not or the alternatives (hub_get_modifier, hub_get_category_modifiers), so the boundary with siblings is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_orderGet order detailsARead-onlyInspect
Everything inside ONE order: line items with quantity, unit price and per-line tax, custom sales, gift-card and other non-revenue lines, the totals block, every payment taken (method, processor, card type and last 4, tip, change), every refund already made against it, plus the customer, outlet, station, employee and order notes. Answers 'what was in order 1042', 'how did they pay', 'was this one refunded', 'why is this total different'. Takes the order ID from get_orders — a receipt number will NOT work, search for it with get_orders first. READ-ONLY, and there is no sibling tool that writes: an order's status cannot be changed, an order cannot be cancelled or completed, and a refund cannot be created from this API — refunds are taken on the POS terminal against the original payment. Say that plainly instead of hunting for another tool.
| Name | Required | Description | Default |
|---|---|---|---|
| orderId | Yes | Order id from get_orders — not a receipt number |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and destructiveHint=false, but the description adds real behavioral context beyond them: the mutation surface is entirely absent from this API, status is immutable, and refunds are taken on the POS terminal against the original payment. That prevents an agent from fruitlessly searching sibling tools for a write path, which the annotations alone would not 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?
It is front-loaded correctly — contents first, then example questions, then the ID prerequisite, then the read-only constraints. Every sentence carries information, though the closing 'Say that plainly instead of hunting for another tool' is meta-instruction that overlaps with the preceding negative enumeration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the full burden of describing the return shape — and it does, field group by field group, down to card last-4, tip and change. With one fully documented parameter and no nested objects, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single required parameter, so the baseline is 3. The description's note that the ID comes from get_orders and is not a receipt number largely restates the schema's own property description, adding emphasis rather than new syntax or format detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource and then enumerates the exact payload of a single order — line items, tax, totals, payments, refunds, customer, outlet, employee. It is unmistakably distinct from hub_get_orders (list) and hub_get_refunds (refund-only) without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit entry conditions ('Takes the order ID from get_orders — a receipt number will NOT work, search for it with get_orders first') and names the alternative when the caller has a receipt. It also states what NOT to attempt (no status change, no cancel/complete, no refund creation) and where refunds actually happen, so the agent is routed away from dead ends.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_order_countCount ordersARead-onlyInspect
How many orders the company has, in total or at given outlets — 'how many orders do we have', 'how busy is the King Street shop'. Cheap: it counts, it loads no order data. It counts EVERY order ever recorded and takes no date, status or source filter. For anything time-boxed or filtered, call get_orders and read its matching count, or use get_financial_summary for a period.
| Name | Required | Description | Default |
|---|---|---|---|
| outlets | No | Outlet ids to restrict to. Omit to count every outlet |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/non-destructive safety, but the description adds valuable traits beyond them: it is cheap, loads no order data, counts every order ever recorded, and accepts no date/status/source filter. This discloses performance and scope behavior that an agent cannot get from annotations or schema alone.
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, front-loaded with purpose and examples, then cost/scope behavior, then alternatives. Every sentence earns its place: the examples clarify intent, the cost note justifies use, and the alternative routing prevents misuse.
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 count tool with 100% schema coverage and no output schema, the description supplies everything needed: what it returns (a count), what it ignores (filters), and where to go for filtered/time-boxed needs. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the `outlets` parameter is already fully documented. The description reinforces its meaning ('in total or at given outlets') but adds no syntax, format, or edge-case detail beyond what the schema provides. Baseline 3 is appropriate when the schema carries the parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('How many orders the company has') and immediately scopes it ('in total or at given outlets'). It explicitly distinguishes itself from siblings by naming get_orders and get_financial_summary as alternatives, so an agent can select correctly without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use (unfiltered total counts, outlet-specific counts) and when-not-to-use ('anything time-boxed or filtered'), then names the correct alternatives: get_orders with its `matching` field, or get_financial_summary for periods. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_ordersList ordersARead-onlyInspect
Find orders — the same rows as Manage → Orders. Answers 'show me order 1042', 'what did we sell on Saturday', 'are there parked orders', 'orders rung up by Maria', 'orders over $500 at the King Street shop'. Filter by receipt number, status, source, employee, customer, product, date window, order total, outlet or station. Results are ALWAYS newest first — there is no other sorting, so a "biggest order" question needs the amount filter, not paging. Search matches the receipt number and the order id ONLY, never customer names or product names: for those, pass customerIds from get_customers or productIds from get_products. One row per order with its total; for what is INSIDE an order — line items, payments, refunds, notes — call get_order with the id from here. For how much the business took over a period use get_financial_summary or get_sales_breakdown instead of adding these rows up.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, default 1 | |
| search | No | Receipt number or order id. Does NOT match customer or product names | |
| source | No | e.g. ["in-store"], ["woo-commerce"] | |
| status | No | Final POS statuses: "completed", "refunded", "partial-refund", "parked". WooCommerce orders keep their own ("processing", "on-hold", "pending", "cancelled", "failed") — pass "other" to match every status outside the four Final POS ones | |
| endDate | No | Only orders created at or before this ISO 8601 moment | |
| outlets | No | Outlet ids. Combined with stations by OR | |
| maxTotal | No | Maximum order total in MINOR units (cents) | |
| minTotal | No | Minimum order total in MINOR units (cents), e.g. 50000 for $500 | |
| pageSize | No | Orders per page, default 20 | |
| stations | No | Station ids. Combined with outlets by OR | |
| startDate | No | Only orders created at or after this ISO 8601 moment | |
| productIds | No | Product ids from get_products — matches orders containing them | |
| customerIds | No | Customer ids from get_customers, not names | |
| employeeIds | No | Employee ids — from get_employee_sales, not names |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/non-destructive annotations, the description discloses key non-obvious behavior: results are ALWAYS newest-first with no other sorting, search matches receipt number and order id ONLY (never names), and the return is one row per order with its total. These are exactly the traits an agent would otherwise get wrong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and example queries, then filters, then sorting caveats, then sibling routing. It is long but nearly every clause adds actionable guidance; a small trim of the enumerated filter list would tighten it further.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter, no-required, list-style tool with no output schema, the description covers selection context, sort behavior, search limitations, and the shape of the returned rows. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description enumerates the filterable dimensions and notes the cents-based amount filter, but this largely restates what the schema already documents (e.g. minTotal MINOR units with the $500 example), adding no new syntax or constraint detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Find orders') and anchors it to a known UI surface ('the same rows as Manage → Orders'). It clearly distinguishes itself from hub_get_order (which returns what's inside an order) and from the financial-summary siblings, so an agent can pick it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use prompts ('show me order 1042', 'orders over $500 at the King Street shop') and explicit when-not routing: customer/product names must go through get_customers/get_products, totals over a period through get_financial_summary or get_sales_breakdown. It even warns that a 'biggest order' question needs the amount filter rather than paging.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_outletsList outletsARead-onlyInspect
Every point of sale (store, location, branch) the merchant has — the same list as Settings → Outlets. Answers 'how many stores do I have', 'what is the address of the King Street shop', 'what is that location’s phone number'. ALSO THE WAY TO TURN A STORE NAME INTO AN ID: the reports, inventory and station tools filter by outlet ID and never by name, so when the merchant says 'sales for King Street' or 'stock at the warehouse', call this FIRST and pass the id you find here. Returns every outlet in one call — the list is short, there is no paging and no server-side search, so match the name yourself. Deleted outlets are not returned. Outlets carry NO opening hours, timezone or currency: store hours are not stored anywhere on this platform and currency is a company-wide setting, so say that plainly instead of guessing. Per-outlet tax percentages are not here either — those belong to the tax tools.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/openWorldHint=false annotations, it discloses that the full list returns in one call with no paging or server-side search, and that deleted outlets are excluded. It also states negative facts (no opening hours, timezone, currency, or per-outlet tax) and where the tax data actually lives — the kind of non-obvious behavior an agent cannot infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core definition before the ID-resolution guidance and negative disclosures, with every sentence earning its place. It runs long and the capitalized emphasis is somewhat shouty, but it remains structured and skimmable rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter, no-output-schema list tool the description covers everything an agent needs: what it returns, paging/search behavior, deleted-record handling, the ID-resolution role relative to sibling tools, and explicit boundaries on adjacent data (hours, currency, tax).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. The description appropriately adds no parameter detail because there is nothing to document; its filtering guidance concerns the returned list, not inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Every point of sale (store, location, branch) the merchant has') and anchors it to a familiar UI surface (Settings → Outlets). It is clearly distinguishable from the sibling mutation tools hub_create_outlet, hub_update_outlet, hub_delete_outlet and hub_import_outlets, and it gives concrete example queries it answers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: reports, inventory and station tools filter by outlet ID and never by name, so this must be called FIRST to resolve a store name into an id. It also names the constraint (no server-side search, match the name yourself) and tells the agent what not to guess at.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_payment_methods_breakdownPayment methods breakdownARead-onlyInspect
How customers paid over a date range, netted of refunds — 'how much came in on card vs cash', 'what did processing fees cost me', 'how much hits my bank account'. Card and each custom processor also report their processing fees and the resulting deposit; cash has no fees. The same aggregation the Financial Summary settlement section uses, so the two always agree.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | Yes | End of the window, ISO 8601. Inclusive of the day when a bare date is given | |
| outlets | No | Outlet ids to restrict to. Omit for all outlets | |
| stations | No | Station ids to restrict to. Omit for all stations | |
| startDate | Yes | Start of the window, ISO 8601, e.g. "2026-08-01" or "2026-08-01T00:00:00Z" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish a safe, read-only, closed-world read. The description adds real domain behavior beyond that: amounts are netted of refunds, card and custom processors carry processing fees and a resulting deposit figure, and cash has no fees. That is meaningful disclosure about what the numbers mean, though it says nothing about permissions, rate limits, or result shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose and followed by the examples and the consistency note. No filler, though the final sentence about Financial Summary is somewhat incidental to invoking the tool correctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description usefully compensates by naming what comes back per payment method: netted totals, processing fees, and deposit amounts. Combined with the 100% schema coverage on inputs and the read-only annotations, an agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so startDate, endDate, outlets and stations are all already documented in the schema, including the inclusive-day semantics. The description adds no date-format, timezone, or outlet/station filtering detail beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb, resource and scope: how customers paid over a date range, netted of refunds. The quoted example questions ('how much came in on card vs cash', 'what did processing fees cost me') pin down exactly what dimension of the data this tool reports, distinguishing it from a generic sales or transaction 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 paraphrased user questions give clear positive-use context, and the note that this is the same aggregation the Financial Summary settlement section uses tells the agent when the two should agree. It does not, however, explain when to prefer hub_get_sales_breakdown or hub_get_transactions instead, so there is no explicit exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_permissionsList permissionsARead-onlyInspect
The catalogue of permissions a role can be given — every switch on the Roles screen, with the id create_role and update_role need. Call this to turn a request like 'let her see the reports' into the right permission id; match on the label and the permission path, and ask the merchant if two of them could both be meant. Permissions are granted exactly as named — there is no parent-grants-the-children cascade here — so pass every line the merchant actually needs. The list is the same for every merchant; it is not their current setup. For what a role currently grants, use get_roles.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/non-destructive, and the description adds genuinely non-obvious semantics beyond them: there is no parent-grants-the-children cascade, permissions must be passed exactly as named, and the catalogue is global rather than merchant-specific. These are the kind of facts that change how an agent calls the dependent create_role/update_role tools.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five sentences for a zero-argument tool, each carrying distinct information (purpose, downstream use, ambiguity handling, no-cascade, global scope). It is a little long and the opening could name the tool's action more directly before the 'catalogue' framing, but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, no output schema, and annotations that already cover the safety profile, the description still closes every loop an agent needs: what the data is, what it is used for, how to resolve matching ambiguity, and where to go for the merchant-specific alternative.
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?
Zero parameters, so there is nothing to document and the baseline is 4. The description usefully explains the semantics of the identifiers returned (permission id consumed by create_role/update_role), which is consumer-side meaning rather than schema repetition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (the catalogue of permissions a role can be given) and pins down the exact artifact returned — 'every switch on the Roles screen, with the id create_role and update_role need'. It also explicitly distinguishes itself from the sibling hub_get_roles, which covers the merchant's *current* grants.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete triggering scenario ('turn a request like "let her see the reports" into the right permission id') and an explicit alternative with its condition ('For what a role currently grants, use get_roles'). It even tells the agent how to resolve ambiguity (ask the merchant if two labels could both be meant).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_product_booking_setupRead a product booking setupARead-onlyInspect
Which resources serve this bookable product. Use it to check a product is actually ready to take bookings before quoting availability — an empty resource list means every hold will be refused, however correct the rule set looks.
| Name | Required | Description | Default |
|---|---|---|---|
| productId | Yes | Product id from get_products — not a name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, non-destructive, and closed-world, and the description adds non-obvious domain behavior: an empty resource list causes every hold to be refused no matter how correct the rule set looks. It omits auth, pagination, and output shape, but for a read-only setup check this is meaningful added 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?
Two sentences, front-loaded with the returned data and then the reason to call the tool; there is no filler, repetition, or buried detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with no output schema, the description explains what is returned (a resource list) and what an empty list implies, which is enough for correct invocation. It stops short of describing exact return fields or what to do when resources are missing, a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single productId parameter is fully documented in the schema ('Product id from get_products — not a name'). The description adds no parameter-level syntax or constraints, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the exact data it reports ('which resources serve this bookable product'), which together with the 'booking setup' name tells an agent it reads per-product booking resource bindings. It does not explicitly distinguish itself from sibling tools like hub_get_booking_resources or hub_set_product_booking_setup, but 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?
It gives a clear when-to-use ('check a product is actually ready to take bookings before quoting availability') plus a concrete failure condition (empty resource list means every hold will be refused). It does not name the alternative tool to use once setup is confirmed, which keeps it short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_product_optionsList product optionsARead-onlyInspect
List the variation axes the merchant already has — e.g. 'Size' with Small/Medium/Large. Call this BEFORE creating a product with variants and offer the existing axes instead of inventing new ones. Only call create_product_option when the merchant needs an axis that is not in this list.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false and destructiveHint=false, so the safe-read profile is fully covered structurally. The description adds some context that this returns pre-existing data ('the axes the merchant already has'), but discloses nothing beyond that about return shape, ordering, or limits. With annotations carrying the safety burden, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, well front-loaded: purpose first, then workflow context, then the exclusion rule. Slightly verbose but each sentence carries distinct routing or sequencing value; nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only list tool with no output schema, the description supplies enough: what it returns (variation axes with values) and when to call it. The one remaining gap is that with no output schema it could more precisely describe the returned object shape, but the example mostly compensates.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and the schema is empty, so there is nothing to disambiguate; the baseline of 4 applies. The description correctly implies a no-argument list operation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (variation axes / product options) and gives a concrete example ('Size' with Small/Medium/Large). It clearly distinguishes itself from the sibling hub_create_product_option, so an agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes when to call it ('BEFORE creating a product with variants') and when not to ('Only call create_product_option when the merchant needs an axis that is not in this list'). It names the alternative tool and the exact condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_productsList productsARead-onlyInspect
List products in the merchant's catalogue. Answers 'what products do I have', 'find the Coca-Cola product', 'how much is X'. Pass categoryIds to answer 'what is in the Drinks category' — take the ids from get_categories, which does not return products itself. LIMITATION — there is no sorting: results come back in catalogue order and cannot be ordered by price, name or date. So 'the most expensive products' CANNOT be answered from this tool, and you must NOT page through the whole catalogue trying. Say plainly that sorting is not supported yet, then offer what does work: search by a name or SKU, filter by category, or ask the merchant to narrow it down.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, default 1 | |
| search | No | Filter by product name or SKU (partial match) | |
| pageSize | No | Results per page, default 20 | |
| categoryIds | No | Only products in these categories. Ids come from get_categories; a product matching any of them is returned |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, but the description adds a critical behavioral constraint beyond them: there is no sorting, results come back in catalogue order, and paging through the whole catalogue must not be attempted. That is exactly the kind of operational context structured fields cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and the categoryIds workflow, then the limitation and the recommended agent phrasing. It is on the longer side and repeats the sorting limitation across two sentences, but every sentence carries actionable content rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter read-only list tool with full schema coverage and no output schema, the description is nearly complete: it covers scope, filtering, and the sorting limitation. It does not describe pagination behavior (page/pageSize) or the return shape, a minor gap given the read-only profile.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description restates search and categoryIds semantics that the schema already documents ('Ids come from get_categories' appears verbatim in the schema), adding no format, default, or boundary detail beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List products in the merchant's catalogue') and distinguishes itself from the adjacent get_categories tool by noting it 'does not return products itself.' The example questions ('what products do I have', 'how much is X') make the scope unambiguous without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes usage: pass categoryIds for category questions, take ids from get_categories, and it names a hard limitation plus the alternatives that do work (search by name or SKU, filter by category, ask the merchant to narrow down). When-to-use, when-not-to-use, and alternatives are all covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_purchase_orderGet purchase orderARead-onlyInspect
One purchase order in full: supplier, outlet, status, and every line — what was ORDERED and what has actually ARRIVED, per item, across each delivery. Answers 'what is on this order', 'what is still outstanding', 'did the price change from what we agreed'. Money appears twice on every writable field: the formatted one (CA$12.50) is for reading out to the merchant, the *Amount twin (12.50) is what update_purchase_order accepts back. The ordered block is the agreed order; each entry in receipts is one delivery booked against it, with its invoice number. Compare an item’s ordered quantity against the sum of its received quantities to see what is still owed — receiving more than ordered is allowed, so an overage is real, not an error. ALWAYS CALL THIS AFTER receive_purchase_order instead of retrying the receive: it is the way to confirm what was booked.
| Name | Required | Description | Default |
|---|---|---|---|
| purchaseOrderId | Yes | Purchase order id from get_purchase_orders — not a PO number |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld=false safety, but the description adds real behavioral context: money is duplicated as formatted vs raw, each receipts entry carries an invoice number, and receiving more than ordered is an allowed overage rather than an error. These are non-obvious semantics an agent could not infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line summary, then layered detail on money fields and receipts. It is a dense paragraph with no filler, though it is longer than strictly necessary and could be split for faster scanning.
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 carries the return-shape burden and does so thoroughly: field groups, the ordered vs receipts distinction, the quantity comparison rule, and the overage caveat. An agent can interpret the response without further docs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is already documented in-schema as an id from get_purchase_orders, not a PO number. The description adds no further parameter detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('One purchase order in full') and enumerates exactly what is included: supplier, outlet, status, ordered lines, and per-delivery receipts. It is clearly a single-record fetch, distinguishing it from the list sibling hub_get_purchase_orders, which the schema also references as the id source.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-not guidance ('ALWAYS CALL THIS AFTER receive_purchase_order instead of retrying the receive') and routes the agent to update_purchase_order for writing the raw *Amount values back. It also frames the questions the tool answers, so selection is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_purchase_ordersList purchase ordersARead-onlyInspect
Stock the merchant has ordered from suppliers — the same list as Purchasing → Purchase Orders, and THE tool for any purchasing question over a period: 'what did I spend on stock last month', 'what is still on order', 'what have I ordered from this supplier', 'what is arriving this week'. Filter by status, supplier, outlet and a created-date range. READ totalCost CAREFULLY: it is what the order was placed FOR, not what was paid, and it sits on suggested and draft rows too — summing the whole list answers 'what have I proposed', not 'what did I spend'. For spend, filter status to ['sent','partially_received','fully_received']; for what a delivery actually cost, read the receipts block of get_purchase_order. Statuses, in order: suggested (auto-proposed by a reorder rule, not ordered), draft (being written), sent (with the supplier), partially_received (some arrived), fully_received (all in). "Open" means anything not fully_received. Cancelled orders are gone from this list entirely. The date range filters on when the order was CREATED, not when it was sent or received. Costs here are what the merchant pays suppliers — for sales and revenue use the report tools instead.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page, default 1 | |
| search | No | Match the PO number | |
| sortBy | No | Default createdAt | |
| status | No | Keep only these statuses | |
| endDate | No | ISO date — orders created up to and including this day | |
| pageSize | No | Rows per page, default 20 | |
| outletIds | No | Outlet ids from get_outlets | |
| sortOrder | No | Default desc | |
| startDate | No | ISO date — orders created on or after this day | |
| supplierIds | No | Supplier ids from get_suppliers |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnly annotations already covering safety, the description adds substantial behavioral context: totalCost means the amount ordered FOR not paid, it appears on suggested/draft rows, cancelled orders are excluded entirely, and the date range filters on creation not send/receive date. These are non-obvious semantic traits an agent could not infer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long but densely packed and front-loaded, leading with the scope and the headline use-case before caveats. Nearly every sentence carries a distinct constraint or disambiguation; only marginal trimming is possible, so it is well-structured though not maximally tight.
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 10-parameter list tool with no output schema, the description covers the critical return-field caveat (totalCost), the status vocabulary, exclusion behavior, and date-range semantics. An agent has everything needed to call it correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description meaningfully enriches two parameters: it defines each status value in ordered progression and clarifies that startDate/endDate filter on creation date. It also explains how to combine status values to answer the spend question, going beyond the schema's terse field 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?
States a specific verb and resource ('Stock the merchant has ordered from suppliers'), anchors it to a UI location (Purchasing → Purchase Orders), and claims the domain ('THE tool for any purchasing question over a period'). It distinguishes itself from the singular get_purchase_order by routing delivery-cost questions to that sibling's receipts block.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger questions ('what did I spend on stock last month', 'what is still on order'), states the status filter needed for spend vs. proposed costs, and names an alternative domain ('for sales and revenue use the report tools instead'). When-to-use, when-to-switch, and the exclusion are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_receive_progressProgress of a delivery being booked inARead-onlyInspect
How far a delivery has got in being applied to stock. A large delivery is applied item by item in the background, so its order keeps its old status until the work finishes — this is the only place that shows the real progress. Call it with the receiptId that receive_purchase_order returned, or the one get_purchase_order reports as still being received. Read failures seriously: those items did NOT get their stock and say why (the item was deleted, the outlet no longer exists, the supplier link was removed). Everything else on the delivery still landed, so the fix is per item, not a re-receive of the whole thing.
| Name | Required | Description | Default |
|---|---|---|---|
| receiptId | Yes | Receipt id from receive_purchase_order |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover read-only/non-destructive, but the description adds substantial behavioral context: application happens item-by-item in the background, the order keeps its old status until completion, and `failures` items did NOT receive stock for concrete reasons (deleted item, removed outlet, removed supplier link). It also states the correct remediation scope (per item, not full re-receive), which is exactly the kind of context structured fields cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then background mechanics, then the failure-handling caution. Slightly long with a dash-heavy sentence, but every sentence contributes actionable information about status lag or failure semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description pre-explains the most decision-relevant return field (`failures`) and what its entries mean, plus what to do about them. An agent has everything needed to call this correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the receiptId field is already documented as 'Receipt id from receive_purchase_order'. The description adds a second legitimate source (get_purchase_order's still-receiving ID), which is meaningful guidance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific concept — how far a delivery has progressed in being applied to stock — and explicitly positions itself as the only source of the real progress status, distinguishing it from get_purchase_order which shows the stale 'receiving' 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?
Tells the agent exactly how to obtain the required ID (from receive_purchase_order's return, or get_purchase_order's still-being-received field) and why to call it at all (the order status lags behind background work). It also implicitly rules out a whole re-receive approach by saying the fix is per item.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_refundsList refundsARead-onlyInspect
Refunds recorded against orders, newest first: what was refunded, why, by whom, on which order and for which customer. Answers 'what did we refund lately', 'show the refunds on order 1042', 'who processed that refund'. Filter by order id, or search by the REFUND's own receipt number. LIMITATIONS: no date filter and no total count — for refunds in a date range use get_sales_breakdown (one row per refund) or get_financial_summary (refund totals). Refunds CANNOT be created here: they are taken on the POS terminal against the original payment. This tool only reads.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, default 1 | |
| search | No | Search by the refund's receipt number | |
| orderId | No | Only refunds against this order — id from get_orders | |
| pageSize | No | Refunds per page, default 20 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: sort order (newest first), the absence of a date filter and of a total count, and the workflow constraint that refunds originate on the POS terminal. It stops short of describing permissions or pagination edge 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 returned fields and sort order come first, then queryable filters, then limitations and the create-refund exclusion. Every sentence carries distinct information; nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating returned fields and sort order, and it covers filtering, limitations, and the create-refund exclusion. Combined with complete schema coverage and annotations, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so page, pageSize, search, and orderId are already documented in the schema. The description largely restates these (order-id filter, refund receipt search) and adds only the mild clarification that the search targets the REFUND's own receipt number rather than the order's. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Refunds recorded against orders, newest first') and enumerates the returned dimensions (what, why, by whom, which order, which customer). It clearly separates itself from sibling reads like hub_get_sales_breakdown, hub_get_financial_summary, and hub_get_order.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete user questions it answers, names both supported filters (order id, refund's own receipt number), and explicitly routes the date-range case to get_sales_breakdown or get_financial_summary. It also states the exclusion that refunds cannot be created here, pointing to the POS terminal instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_reorder_suggestionsWhat needs reorderingAInspect
What the platform thinks should be reordered: rescans stock against the merchant's auto-reorder rules and returns the suggested orders it left behind, grouped by supplier and outlet. Answers 'what am I running low on', 'what should I order this week'. A suggestion is NOT an order — nothing has been sent and no supplier knows about it. Turn one into a real order with update_purchase_order (which accepts it as a draft) and then send_purchase_order. Only items with an auto-reorder rule can appear here, so an empty result usually means no rules are set rather than nothing being low — say that, and offer set_reorder_rule. The rescan is skipped and the stored suggestions returned when one ran moments ago; rescanned: false says so.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, openWorldHint=false, destructiveHint=false. The description goes well beyond them: it discloses that the tool rescans and stores suggestions, exposes the `rescanned: false` caching signal, explains that only rule-bearing items can appear, and warns that nothing has been sent to a supplier. This is rich, non-obvious behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then flows through scope, the suggestion-vs-order distinction, the follow-on workflow, the empty-result caveat, and the caching nuance. Every sentence carries actionable content with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description conveys the return shape (suggested orders grouped by supplier and outlet, plus the `rescanned` flag) and covers the empty-result edge case. An agent has everything needed to call it and interpret the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so schema coverage is 100% and no parameter meaning is needed (baseline 4 for 0 params). The description usefully mentions the `rescanned` return field, adding a little beyond the empty schema, but there are no parameters to disambiguate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('rescans stock against the merchant's auto-reorder rules and returns the suggested orders'), including the grouping by supplier and outlet. It sharply distinguishes a suggestion from an order and clarifies what an empty result means, so an agent can tell this apart from related stock/PO tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use phrasing ('what am I running low on', 'what should I order this week'), an explicit follow-on workflow ('turn one into a real order with update_purchase_order ... then send_purchase_order'), and a when-empty branch ('offer set_reorder_rule'). Alternatives and conditions are named rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_rolesList rolesARead-onlyInspect
The roles this merchant has defined and exactly what each one is allowed to do — Settings → Roles. Answers 'what can a cashier do', 'which roles exist', 'who is on the Manager role'. A role is the ONLY place permissions live: people do not carry their own. Read this before changing anything, and take permission ids from the granted list when revoking. Owners and organisation-level accounts hold no role and are never restricted by one — a role change cannot take anything away from them.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, yet the description adds substantial non-obvious context: permissions live only in roles, people carry none of their own, and owners/org-level accounts hold no role and are never restricted by a role change. That owner caveat is exactly the kind of behavioral disclosure an agent cannot derive from 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 core purpose is front-loaded and the FAQ-style examples and owner caveat each earn their place. It runs slightly long with a few overlapping clauses, keeping it just below a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only list tool with no output schema and full annotation coverage, the description supplies everything needed: what it returns conceptually, when to call it, how to reuse the output (permission ids for revocation), and the important owner exception.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4 per the rubric. The description correctly adds no parameter detail because there is nothing to parameterize, and schema coverage is 100%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource ('The roles this merchant has defined and exactly what each one is allowed to do') and scopes it further with the concrete questions it answers. It is clearly distinguishable from siblings like hub_get_permissions, hub_create_role, or hub_get_team without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit timing guidance ('Read this before changing anything, and take permission ids from the granted list when revoking'), which is a real when-to-use signal. It stops short of naming the alternative tools (e.g. hub_get_permissions) or stating when NOT to call it, so it does not reach a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_sales_breakdownSales breakdownARead-onlyInspect
Order-by-order breakdown for a date range — the same rows as Reports → Sales Breakdown. One row per order AND per refund. Answers 'show me the orders from Saturday', 'which order had that big discount', 'how many refunds last month', 'sales per day'. The totals and dailyTrend in the reply cover the WHOLE date range, not just the returned page — quote them directly instead of adding up rows. For headline figures alone use get_financial_summary; this tool is for when the merchant wants to see the actual orders.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, default 1 | |
| endDate | Yes | End of the window, ISO 8601. Inclusive of the day when a bare date is given | |
| outlets | No | Outlet ids to restrict to. Omit for all outlets | |
| pageSize | No | Rows per page, default 50 | |
| stations | No | Station ids to restrict to. Omit for all stations | |
| timezone | No | IANA timezone for the daily grouping, e.g. "America/Toronto". Defaults to the server timezone | |
| startDate | Yes | Start of the window, ISO 8601, e.g. "2026-08-01" or "2026-08-01T00:00:00Z" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, closed-world), and the description goes well beyond them by disclosing a non-obvious behavioral trap: `totals` and `dailyTrend` cover the WHOLE date range rather than the returned page, so the agent must quote them rather than sum rows. That is exactly the kind of guidance annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core identity in the first clause, then intent examples, then the pagination/totals caveat, then the sibling routing rule. Every sentence carries a distinct, actionable payload with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the reply's key fields (`totals`, `dailyTrend`) and explaining their scope, plus the row-per-order/refund shape. For a paginated reporting tool this is complete enough for an agent to call it and interpret the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all seven parameters (page, pageSize, outlets, stations, timezone, start/end) are already documented in the schema with defaults and formats. The description adds no parameter-level syntax or constraints beyond that, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('order-by-order breakdown for a date range') plus the exact row granularity ('one row per order AND per refund'), which is the key distinguishing detail versus aggregate siblings. It also anchors the tool to a known UI surface (Reports → Sales Breakdown), so an agent can map user intent directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit user-intent examples ('show me the orders from Saturday', 'how many refunds last month') and names the alternative with the condition that selects it: 'For headline figures alone use get_financial_summary; this tool is for when the merchant wants to see the actual orders.' When-to-use and when-not are both present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_session_reportEnd of session reportAInspect
The full End of Session report for ONE shift: sales, taxes, settlement, refunds, staff sales, tips and the cash drawer. Answers 'does the drawer balance', 'was the till short last night', 'what did that shift take'. Takes the session id from get_sessions, never a station or a person. The cash drawer section is what tells you over / short — report it plainly, and do not compute it yourself from the other sections.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | Session id from get_sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real guidance beyond the annotations: the report covers one shift only, the cash drawer section is the authoritative over/short figure, and the agent must not recompute it from other sections. Annotations are present (openWorldHint=false, destructiveHint=false) but readOnlyHint=false on a report getter is unexplained; the description neither contradicts it nor clarifies what non-read-only behavior occurs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource and its scope, then triggering questions, then input constraint, then the interpretation caveat. No sentence is filler; each carries either scope, selection, or output-interpretation information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one required parameter, no output schema, and no nested objects, the description supplies what the schema cannot: the report's section inventory (acting as a return preview), where the id comes from, and how to read the drawer result. Nothing needed to call or interpret it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and already says 'Session id from get_sessions', so the baseline is 3. The description still adds value by reinforcing the source and, more usefully, ruling out station ids and user ids — a common mistaken input for this family of tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and scope — 'the full End of Session report for ONE shift' — and enumerates the sections it contains (sales, taxes, settlement, refunds, staff sales, tips, cash drawer). The 'ONE shift' emphasis and 'never a station or a person' carve it out from the many sales/financial siblings like hub_get_sales_breakdown and hub_get_financial_summary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete triggering questions ('does the drawer balance', 'what did that shift take') and specifies the prerequisite source, the session id from get_sessions. It stops short of naming a specific sibling alternative to use for multi-shift or aggregate reporting, so the exclusion is implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_sessionsRegister sessionsARead-onlyInspect
Register sessions (shifts) opened and closed in a date range — the list behind Reports → End of Session. Answers 'what shifts ran yesterday', 'who closed the register last night', 'is a session still open'. Returns who opened and closed each one, the opening float and the declared closing amounts. A session with no closeTime is still open. For the full money report of one shift, pass its id to get_session_report.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | Yes | End of the window, ISO 8601. Inclusive of the day when a bare date is given | |
| outlets | No | Outlet ids to restrict to. Omit for all outlets | |
| stations | No | Station ids to restrict to. Omit for all stations | |
| startDate | Yes | Start of the window, ISO 8601, e.g. "2026-08-01" or "2026-08-01T00:00:00Z" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint/destructiveHint/openWorldHint, so safety is covered. The description adds real domain semantics beyond that: a session with no closeTime is still open, and it enumerates what each record contains (opener, closer, opening float, declared closing amounts). Pagination and row limits are not addressed, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what it is, then use cases, then return contents, then the routing note to the sibling. Every sentence carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by stating what comes back (who opened/closed, opening float, declared closing amounts). Combined with the open-session rule and the sibling hand-off, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: startDate, endDate, outlets, and stations are all documented in the schema, including ISO 8601 format and the inclusive-bare-date rule. The description adds no parameter-level detail beyond reinforcing the date-range window, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and scope: register sessions (shifts) opened and closed in a date range, tied to a concrete UI location (Reports → End of Session). It also disambiguates from the closest sibling by naming get_session_report as the single-shift money report.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete triggering questions ('what shifts ran yesterday', 'who closed the register last night', 'is a session still open'). Explicitly names the condition that routes to the alternative: pass an id to get_session_report for one shift's full money report.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_stationTill detailsARead-onlyInspect
Everything about ONE station, including what its device last reported about itself — app version, OS, network, printer, battery and whatever else that device sends. THIS IS THE TOOL FOR 'the till will not connect', 'it will not print', 'the card reader is not working', 'this register is acting up'. Takes the station id from get_stations, never a name. How to read it when troubleshooting: kind tells you whether it is a physical device or a browser till (a browser till has no device to blame — check the share link and the flow instead); an empty deviceId on a native station means no device ever enrolled under it; enrolledBy and createdAt say who set it up and when; an empty deviceEnvironment means the device has never reported anything, which is itself the finding. The values carry NO timestamp — they are the last ones received, and there is no way to tell how old they are. recordUpdatedAt is the last time the station RECORD changed (mostly a shift opening or closing, or a rename) — it is NOT a heartbeat: the platform stores no online/offline ping for a till, so never report a station as "online" or "last seen". Card readers shown here are read-only: pairing and unpairing a reader happens on the Terminals screen of the cabinet, not through any tool.
| Name | Required | Description | Default |
|---|---|---|---|
| stationId | Yes | Station id from get_stations — not a name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only profile, and the description adds substantial non-obvious behavior: values carry no timestamp and their age is unknowable, recordUpdatedAt is not a heartbeat, no online/offline ping exists so 'last seen' must never be reported, empty deviceEnvironment is itself a finding, and card reader data is read-only. These are exactly the nuances that prevent agent hallucinations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with scope and identity before the field-by-field reading guide, and almost every sentence carries troubleshooting value. It is on the long side for a single-parameter read, but the length is driven by the absence of an output schema rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description correctly takes on the burden of explaining return fields (kind, deviceId, enrolledBy, createdAt, deviceEnvironment, recordUpdatedAt) and their interpretation. It also fills the sibling gap by pointing to the Terminals screen for card reader actions. Nothing needed to call or interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is already documented in the schema as 'Station id from get_stations — not a name'. The description repeats that constraint ('Takes the station id from get_stations, never a name') without adding format, length, or lookup detail beyond it. Baseline 3 applies when the schema carries the parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Everything about ONE station'), scopes it to a single station versus the sibling list tool, and explicitly separates itself from hub_get_stations by stating where the id comes from. An agent can distinguish it from hub_get_stations, hub_create_station, hub_delete_station and hub_rename_station without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger phrases ('the till will not connect', 'it will not print', 'the card reader is not working') and an explicit when-not: card reader pairing/unpairing happens on the Terminals screen of the cabinet, not through any tool. It also names hub_get_stations as the required upstream call, which is exactly the routing guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_stationsList tillsARead-onlyInspect
Every POS station (till, register, checkout lane, cash desk) the merchant has — the same list as Run → Stations. Answers 'how many tills do I have', 'which register is busy right now', 'which store is this till at', 'which of them are browser tills'. Each station belongs to exactly ONE outlet and the outlet name is resolved here, so you do not need get_outlets to answer where a till stands — call get_outlets only to turn a store NAME the merchant said into the outletId filter of this tool. WHAT status MEANS, EXACTLY: the server does not compute it. The POS app on the till writes it — IN_USE when a cashier opens a register shift on that station, AVAILABLE when the shift is closed. It is best-effort: the update is lost while the device is offline and only flushed when it reconnects, and older app versions never sent it at all, so a station can sit at AVAILABLE with a shift open on it or at IN_USE hours after one was closed. Read it as "what this till last told us", never as proof. NEVER answer a shift or money question from it: for shifts that are actually open, who opened them and what they took, use get_sessions (a session with no closeTime is open) and get_session_report. If those disagree with this flag, they are right and the flag is stale. The whole list comes back in one call — it is short and plan-capped, there is no paging; search matches the station NAME only. Deleted stations are not returned.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | native = a physical device running the POS app; virtual = a browser till | |
| search | No | Filter by station name, e.g. "POS 2" | |
| status | No | IN_USE = the till last reported an open register shift; AVAILABLE = it did not | |
| outletId | No | Only stations at this outlet — id from get_outlets, not a store name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare a safe read (readOnly/openWorld/destructive false), and the description adds substantial context beyond that: status is written by the client app, is best-effort, is lost while offline, and may be stale in either direction. It also discloses that the whole list returns in one plan-capped, non-paged call and that deleted stations are excluded.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and the get_outlets/generic fallback immediately after; the status paragraph is long but every clause (offline loss, old app versions, stale-in-both-directions) changes how the agent should read the value. The four-synonym parenthetical is slightly padded but supports name matching.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description covers what comes back (all stations, one call, no paging, deleted excluded) and what the flags mean, plus the cross-tool trust hierarchy. Nothing an agent needs to call and interpret this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds real meaning on top, notably that search matches the station NAME only and that outletId must come from get_outlets and is not a store name. It also surfaces the browser-till ('virtual') case that kind's enum encodes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Every POS station ... the same list as Run → Stations') and enumerates synonyms (till, register, checkout lane, cash desk) so name-based routing works. It also explicitly disambiguates from siblings get_outlets and get_sessions rather than leaving that to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: don't call get_outlets to answer 'where is this till', call it only to convert a store name into an outletId; and never answer shift/money questions here — use get_sessions and get_session_report instead, with the tie-breaker rule that sessions win over the flag.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_stockCheck stockARead-onlyInspect
How many of ONE product are on hand, broken down by variant and by outlet. Answers 'how many of these do I have', 'how many are left at the King Street shop', 'where is this product in stock'. Takes the product id from get_products — get_products itself returns prices, never quantities. Pass outletId (from get_outlets) to narrow it to a single shop. CRITICAL — "tracked: false" means the merchant switched stock counting OFF for that variant at that outlet, so there is NO count at all. It is NOT "0 in stock". Never say "you have 0" or "it is out of stock" about an untracked line; say stock is not being tracked there. Only lines with tracked: true carry a real quantity. Outlets where the product is hidden do not appear at all. For 'what is running out' across the whole catalogue use find_low_stock instead — do not page through products with this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| outletId | No | Outlet id from get_outlets. Omit for every outlet | |
| productId | Yes | Product id from get_products — not a name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only safety, so the description's remaining value is its critical semantic caveat: tracked: false means counting is off and there is NO count, not zero. It also discloses that hidden outlets are omitted entirely and prescribes the exact phrasing to avoid ('you have 0'). This is genuine behavioral context the agent cannot get from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: the purpose, the ID provenance, the tracked:false rule, and the sibling routing are all load-bearing. The critical warning is capitalized and placed before the alternative-tool guidance, keeping the important content front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by describing the return breakdown by variant and outlet, and by pre-interpreting the track/untracked field the agent will encounter. Nothing needed to call this tool correctly or to interpret its result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds value by tying each parameter to its source tool (productId from get_products, outletId from get_outlets) and clarifying that omitting outletId spans every outlet. The schema has little more to add, but the description reinforces provenance and narrowing behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (how many of one product are on hand), and explicitly demarcates the response shape: broken down by variant and by outlet. It distinguishes itself from siblings by noting get_products returns prices never quantities, anchoring exactly what this tool is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative for a different job — find_low_stock for 'what is running out' across the catalogue — and explicitly warns against paging through products with this tool. It also tells the agent where each id comes from and when to pass outletId to narrow to a single shop.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_stock_historyStock historyARead-onlyInspect
Every recorded stock movement for ONE product, newest first — the audit trail behind a count. Answers 'why is the number wrong', 'who changed this', 'when did we last receive these'. Each entry says what happened (SALE, STOCK_RECEIVED, DAMAGE, THEFT, LOSS, RESTOCK_RETURN, INVENTORY_RECOUNT, TRANSFER, BULK_RECOUNT), the signed quantity, the resulting on-hand, the outlet and the employee. Use this when the merchant disputes a number: state what the log shows rather than guessing at a cause. Only changes that were actually applied appear — an adjustment on an untracked line writes no history at all, which is itself the explanation when the log looks empty.
| Name | Required | Description | Default |
|---|---|---|---|
| actions | No | Limit to these action names, e.g. ["DAMAGE","THEFT"] | |
| endDate | No | ISO date. Pass together with startDate or neither | |
| outletIds | No | Limit to these outlets (ids from get_outlets) | |
| productId | Yes | Product id from get_products | |
| startDate | No | ISO date. Pass together with endDate or neither |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/non-destructive, so the bar is lower, yet the description adds real behavioral context: it enumerates the event types the log can contain, describes each entry's payload (signed quantity, resulting on-hand, outlet, employee), and — most valuably — explains that only applied changes appear, so an empty log on an untracked line is itself the answer. That is non-obvious behavior an agent could not infer from 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?
Front-loaded with scope and ordering, then use cases, then payload shape, then the empty-log caveat — a sensible progression. It runs four sentences and includes a long action-name enumeration that is somewhat list-heavy, but each sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description correctly compensates by describing entry contents and the ordering. Filter parameters remain unexplained, but the schema documents them at full coverage. For a read-only history tool this is close to complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description implicitly surfaces the action vocabulary (SALE, DAMAGE, THEFT, ...) that the `actions` filter accepts, but it says nothing about the action/outlet/date-range filters, their pairing rule (startDate with endDate or neither), or what 'newest first' means for ordering control.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource scoped precisely ('Every recorded stock movement for ONE product, newest first') and frames it as 'the audit trail behind a count', which cleanly separates it from hub_get_stock (current on-hand) and hub_export_stock_csv (bulk export). An agent can pick it out of ~130 siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit use case — 'Use this when the merchant disputes a number: state what the log shows rather than guessing at a cause' — which is genuine when-to-use guidance. It does not name an alternative sibling (e.g. hub_get_stock) for the 'what is the number now' case, so the routing is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_stock_transferView stock transferARead-onlyInspect
ONE transfer in full: both outlets, the employee, the invoice, the notes and the line items with quantities. Takes the transactionId AND the type exactly as get_stock_transfers returned them — the type decides which leg is read, and a wrong one fails. For send-transfer and receive-transfer this also returns the sibling leg, so you can name where the stock came from and where it is going, plus stockTransferId, which is what receive_stock_transfer needs. Line quantities are the amounts MOVED, recorded when the transfer was created — they are not current stock. Use get_stock for that.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | The same type get_stock_transfers reported for that row | |
| transactionId | Yes | transactionId from get_stock_transfers |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive), yet the description adds meaningful behavior: the type decides which leg is read and a wrong value fails, sibling-leg returns for send/receive transfers, and stockTransferId being the input receive_stock_transfer needs. It even disambiguates that quantities are amounts MOVED at creation, not current stock — genuinely useful 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?
Front-loads the core outcome (one transfer in full) before the mechanics of the type argument and the quantity caveat. Dense but each clause carries a distinct fact; only slightly long, but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of describing return contents and it does so thoroughly (outlets, employee, invoice, notes, line items, sibling leg, stockTransferId). Combined with the readOnly annotations, an agent has everything needed to call and interpret 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%, so the baseline is 3, but the description adds real semantics: transactionId and type must be passed exactly as get_stock_transfers returned them, and the type selectively determines which leg is fetched. That is more than the enum/schema restates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (retrieve a single stock transfer in full) and enumerates the returned contents — both outlets, employee, invoice, notes, line items with quantities. It clearly distinguishes itself from the plural hub_get_stock_transfers (list source) and hub_get_stock (current stock), so an agent can tell them apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete context: the type value must come from get_stock_transfers, and it explicitly redirects to get_stock for current stock levels. It also explains the downstream use of the returned sibling leg and stockTransferId for receive_stock_transfer. It doesn't explicitly state the when-to-prefer-this-over-list condition, keeping it 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.
hub_get_stock_transfersList stock transfersARead-onlyInspect
The Stock Transfers list. Answers 'what transfers are open', 'what is still in transit', 'did the warehouse send those yet'. Each row is ONE LEG: a move between outlets produces a send-transfer (already completed — the stock has left the source) and a receive-transfer (in-transit until the destination confirms). receive-stock is stock booked in from a supplier; bulk-edit is a recount. To find work that is still open, filter status "in-transit". Search matches the transfer number and the invoice only — not product names. Rows carry no line items: open one with get_stock_transfer to see what was actually moved.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, default 1 | |
| type | No | Only this leg type. Omit for all | |
| search | No | Matches the transfer number or the invoice number | |
| status | No | "in-transit" = waiting to be received | |
| pageSize | No | Rows per page, default 20 | |
| outletIds | No | Only legs at these outlets (ids from get_outlets) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already say readOnly/non-destructive, and the description adds genuine domain behavior beyond that: each row is one leg, a move produces both a send-transfer (already completed) and a receive-transfer (in-transit until confirmed). It also discloses a real limitation — search matches transfer number and invoice only, not product names — that would otherwise cause failed queries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and tightly packed; nearly every sentence carries distinct information (leg model, type definitions, search limitation, line-item gap). The clipped, fragment-heavy style is efficient but slightly dense for a first read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, six-parameter list tool with a fully documented schema and no output schema, the description covers the gaps an agent would hit: what a row represents, why counts may seem doubled, what search cannot do, and where to go for details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: it disambiguates the 'in-transit' status value, constrains what 'search' actually matches, and defines the non-obvious enum values 'receive-stock' and 'bulk-edit'. It does not address pagination or the outletIds filter specifically.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('The Stock Transfers list') and immediately frames the questions it answers ('what transfers are open', 'what is still in transit'), so an agent knows exactly what the tool is for. It also distinguishes itself from the detail sibling by noting that rows carry no line items and that get_stock_transfer opens a single transfer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance: filter status 'in-transit' to find open work, and use get_stock_transfer instead when line-level detail is needed. It also pre-empts confusion by explaining that 'receive-stock' is supplier stock and 'bulk-edit' is a recount, which are not transfers to chase.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_supplierGet supplierARead-onlyInspect
One supplier in full: contact details, address, notes, how many catalogue items it is linked to and how many of its purchase orders are still open. Does NOT list the items themselves or the orders — those are get_supplier_items and get_purchase_orders (filter it by this supplier id).
| Name | Required | Description | Default |
|---|---|---|---|
| supplierId | Yes | Supplier id from get_suppliers — not a name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds real value beyond them by disclosing that the response includes aggregate counts (linked items, open POs) rather than just static fields, which tells the agent it gets summary data without extra calls.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with what is returned and followed by the exclusion/alternative routing. Zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must convey the return shape, and it does so credibly (fields plus counts) and routes the agent to siblings for detail. It leaves minor gaps such as id format or empty-result behavior, but nothing blocking for a single-entity read.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter already carries its own 'from get_suppliers — not a name' guidance. The description adds no additional syntax, format, or lookup semantics, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (get one supplier) and enumerates the exact payload: contact details, address, notes, linked-catalogue-item count and open-PO count. It is immediately distinguishable from hub_get_suppliers (plural list) and the item/order siblings named in the same sentence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states what the tool does NOT return and names the two alternatives (get_supplier_items, get_purchase_orders) with a filter hint for the latter. It stops short of saying when to reach for this versus hub_get_suppliers when the agent doesn't yet know the id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_supplier_itemsList a supplier’s itemsARead-onlyInspect
The catalogue items one supplier carries, with the cost the merchant pays and the supplier’s own part number. Answers 'what do I buy from this supplier', 'what does this supplier charge me for X'. CALL THIS BEFORE create_purchase_order: an order may only contain items the supplier is linked to, and the variantId + unitCost you need for each line come from here. PASS outletId when you are about to build an order: that narrows the list to items whose stock is actually tracked at that outlet — the only ones a receive can add stock to — and adds onHand, the quantity there right now, so you can see what genuinely needs reordering. Search and paging work the same either way. An item the merchant expects but does not see here is simply not linked yet — get_linkable_items then link_supplier_items.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page, default 1 | |
| search | No | Match product name, item name, SKU, barcode or part number | |
| outletId | No | Outlet id from get_outlets — narrows to stock-managed items there and adds onHand | |
| pageSize | No | Rows per page, default 20 | |
| supplierId | Yes | Supplier id from get_suppliers — not a name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly, non-destructive), and the description goes well beyond that: it discloses that outletId restricts results to stock-tracked items and adds an onHand field, that an item absent from the list simply is not linked yet, and what each row carries. That is real operational context an agent cannot get from 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?
Front-loaded with purpose before workflow guidance, and each sentence carries distinct information (purpose, ordering, outletId behavior, fallback path). It is on the dense side at five sentences, but nothing reads as filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with no output schema, the description supplies the missing return-shape information (cost, part number, onHand), the parameter-dependent behavior, and the workflow position relative to create_purchase_order and link_supplier_items. Nothing needed to call it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning beyond the schema for outletId (why to pass it: narrowing to stock-managed items and adding onHand) and confirms search/paging behave identically with or without it. supplierId's 'not a name' constraint is already in the schema, so credit is limited to the outletId explanation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('the catalogue items one supplier carries') and immediately enumerates the payload that matters: merchant cost and supplier part number. It also contrasts implicitly with hub_get_linkable_items and hub_get_suppliers by framing what this list does and does not contain.
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?
Explicit preconditions and routing: 'CALL THIS BEFORE create_purchase_order', 'PASS outletId when you are about to build an order', and a named fallback path ('get_linkable_items then link_supplier_items') for items that are missing. This tells the agent when to use it, when to pass an extra parameter, and what to do instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_suppliersList suppliersARead-onlyInspect
The businesses this merchant BUYS stock from — the same list as Purchasing → Suppliers. Answers 'who do I order from', 'what is my supplier’s email', 'which suppliers have open orders'. ALSO THE WAY TO TURN A SUPPLIER NAME INTO AN ID: every purchase-order and item-linking tool takes a supplier id and never a name. Each row carries openPoCount — purchase orders not yet fully received — and itemCount, how many catalogue items that supplier is linked to. This is the buying side. For what the merchant SELLS and at what price, use get_products.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page, default 1 | |
| search | No | Match supplier name, contact name or email | |
| pageSize | No | Rows per page, default 20 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and a closed world, so safety is covered and the description isn't obliged to restate it. It adds genuinely useful behavior beyond that: each row carries openPoCount (POs not fully received) and itemCount (linked catalogue items), which are the kind of return-shape details annotations can't express.
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 core purpose is front-loaded, then the id-resolution role, then the sibling contrast — a sensible ordering. It is somewhat dense with em-dash asides and parenthetical clarifications, but each sentence carries distinct information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully compensates by naming the per-row fields (openPoCount, itemCount), and it covers purpose, use cases, id semantics, and the alternative tool. Pagination mechanics are left entirely to the schema, which is acceptable but the only real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (page, search, pageSize all documented in-schema), so the baseline is 3. The description only loosely touches the search parameter by framing the name-to-id lookup; it adds no syntax, matching, or pagination detail beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('The businesses this merchant BUYS stock from') and immediately frames the domain scope via 'Purchasing → Suppliers'. It explicitly contrasts itself with get_products ('the buying side' vs 'what the merchant SELLS'), so an agent can separate it from the product-listing sibling without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete trigger questions ('who do I order from', 'which suppliers have open orders') and a critical routing rule: this is the way to convert a supplier name into an id, since purchase-order and item-linking tools take ids only. It also names get_products as the alternative for the selling side, covering both when-to-use and when-not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_suppliers_for_productWho supplies a productARead-onlyInspect
The other direction: given a product from get_products, which suppliers carry its items and at what cost. Answers 'who can I reorder this from', 'who is cheapest for this', 'am I buying this from more than one place'. Nothing comes back when the product is linked to no supplier — that is a real answer, not an error: it cannot be purchase-ordered until it is linked.
| Name | Required | Description | Default |
|---|---|---|---|
| productId | Yes | Product id from get_products |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safe read-only profile, so the bar is lower, but the description adds a genuinely important behavioral fact: an empty result is a legitimate answer, not an error, because the product cannot be purchase-ordered until linked. That EMS relationship is not derivable from the annotations or schema. It does not cover result shape details such as cost fields beyond the passing 'at what cost'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the directional framing, then the questions it answers, then the edge case. Three sentences, each carrying distinct information, with no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and only one parameter, the description does the needed work: it states what comes back (suppliers plus cost) and how to interpret an empty result. Only minor gaps remain, such as whether multiple supplier entries are grouped per item, which is not critical to invoking the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter carries its own description ('Product id from get_products'). The description restates that the id comes from get_products but adds no format or constraint detail beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (which suppliers carry a product's items) and adds the crucial scope marker 'the other direction', which distinguishes it from the sibling hub_get_supplier_items. An agent can tell the two apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names concrete use cases ('who can I reorder this from', 'who is cheapest', 'am I buying this from more than one place') and points at get_products as the parameter source. It implies the alternative via 'the other direction' but never states an explicit when-not-to-use condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_taxesTax settings overviewARead-onlyInspect
The whole Settings → Taxes screen: every tax group, the rates inside it in charging order, and each rate’s percentage at each outlet. Answers 'what sales tax do I charge', 'what tax applies in the King Street store', 'which tax group is the standard one', 'do I charge GST and PST separately'. ALWAYS call this before any other tax tool — every other tool takes ids from here (tax group ids, tax rate ids, outlet ids) and none of them accept names. It also reports which rates are shared across groups and which belong to no group, both of which change what an edit will do. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly=true, destructive=false, closed world), yet the description adds real value: it discloses that shared rates and ungrouped rates are reported and that these 'change what an edit will do'. It doesn't discuss volume/pagination, but for a zero-param settings read that is minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource and its contents, then the critical 'call this first' rule, then the group-membership caveat. It is somewhat dense with quoted example questions, but every sentence carries actionable information and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-shape burden and does so thoroughly (groups, ordered rates, per-outlet percentages). Read-only status is stated and preconditions (must be called before id-consuming tax tools) are given, so nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the baseline is 4. The description still adds useful semantics by clarifying which id families originate here (tax group ids, tax rate ids, outlet ids) and that names are not accepted elsewhere.
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?
Names a specific verb+resource ('hub_get_taxes' = read the whole Settings → Taxes screen) and enumerates exactly what it returns: tax groups, rates in charging order, and per-outlet percentages. It is unmistakably distinct from sibling list/read tools like hub_get_outlets or hub_get_tax_* mutations.
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 sequencing ('ALWAYS call this before any other tax tool') and the reason (every other tool takes ids from here and none accept names). It also lists the concrete questions it answers, giving the agent clear selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_teamList team membersARead-onlyInspect
Everyone who works for this merchant — Manage → Team → Users. Answers 'who works here', 'what role does Maria have', 'who can see reports', 'what is Tom's phone number'. This is about who works here and what they are allowed to do — for how much anyone SOLD, use get_employee_sales instead. Returns the whole team at once: there is no search and no paging, so filter the rows yourself instead of asking the merchant to narrow down. Removed people are not listed at all. Every other tool in this domain takes its userId from here.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, openWorldHint=false, destructiveHint=false), it discloses that the whole team is returned at once with no search or paging, that callers must filter rows themselves, that removed people are absent, and that other tools source userId here. This is rich operational context an agent cannot get from 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?
Front-loaded with purpose and the alternative, and each sentence carries useful information (return scope, no paging, exclusions, userId source). The example-question list is slightly padded but still aids routing.
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 input or output schema, the description carries the full burden and does so: it explains what is returned, that it is unpaginated, what is excluded, and how the result feeds other tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description correctly does not invent parameter semantics; there is nothing to document.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (everyone who works for the merchant) with a concrete UI path and example queries ('who works here', 'what role does Maria have'). It explicitly distinguishes itself from the sibling get_employee_sales, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives both when-to-use (who works here, roles, permissions) and when-not (for sales figures use get_employee_sales instead). The condition selecting the alternative is stated explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_get_transactionsTransactionsARead-onlyInspect
Individual payments and refunds — Reports → Transactions. This is the PAYMENT level, not the order level: one order can hold several transactions. Answers 'find the payment for receipt 1042', 'show every Amex refund last week', 'which transactions failed'. Filter by payment method, processor, card provider or status, or search by order number. For sales figures use get_financial_summary — this tool is for locating a specific payment.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, default 1 | |
| search | No | Search by order / receipt number | |
| status | No | Transaction status to filter by | |
| endDate | Yes | End of the window, ISO 8601. Inclusive of the day when a bare date is given | |
| outlets | No | Outlet ids to restrict to. Omit for all outlets | |
| pageSize | No | Rows per page, default 50 | |
| stations | No | Station ids to restrict to. Omit for all stations | |
| startDate | Yes | Start of the window, ISO 8601, e.g. "2026-08-01" or "2026-08-01T00:00:00Z" | |
| processors | No | Processor ids | |
| cardProviders | No | e.g. ["Visa", "Mastercard", "Amex"] | |
| paymentMethods | No | e.g. ["card", "cash"] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds the semantic grain (payment vs order level), but says nothing about pagination behavior, result volume, or auth expectations. With annotations carrying the safety burden, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five short sentences, each load-bearing: identity + UI location, grain clarification, example queries, filter inventory, and the alternative route. The disambiguating grain statement is front-loaded immediately after the opening rather than buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only filtered-list tool with full schema coverage and safety annotations, the description is nearly complete and no output schema is needed. The one gap is sibling overlap: it claims to cover 'refunds' while hub_get_refunds also exists, and it never clarifies the split.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (including page/pageSize limits and the date-inclusivity rule) is already documented. The description's filter list ('payment method, processor, card provider or status, or search by order number') maps onto existing parameters but adds no syntax or format detail beyond the schema. Baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (individual transactions) with an explicit grain clarification: 'This is the PAYMENT level, not the order level: one order can hold several transactions.' It also names the sibling it is not (get_financial_summary), so an agent can separate payment-location from sales-figures work without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use phrasings ('find the payment for receipt 1042', 'which transactions failed') and an explicit when-not with the alternative named: 'For sales figures use get_financial_summary — this tool is for locating a specific payment.' Routing to the correct tool is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_hold_bookingHold a booking windowAInspect
Claim a window on one resource. The hold is what makes the window unavailable to everybody else, and it expires by itself if nobody pays — so holding is safe, and a hold nobody confirms costs nothing. startAt must be exactly a slot start from get_booking_availability, and endAt exactly where the last slot ends; anything else is refused rather than rounded. A refusal with 409 means somebody took it first: re-read availability and offer what is left, do not retry the same window.
| Name | Required | Description | Default |
|---|---|---|---|
| endAt | Yes | ISO instant, exactly where the booked window ends | |
| startAt | Yes | ISO instant, exactly a slot start from availability | |
| outletId | No | The shop the sale happens at | |
| productId | Yes | Product id | |
| customerId | No | Who it is for, id from get_customers. Omit for a walk-in nobody identified | |
| resourceId | Yes | Which resource — the barber, room or asset being booked |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, but the description adds substantial behavioral context: the hold makes the window unavailable to others, it expires automatically if unpaid, holding is safe and costs nothing if unconfirmed, exact timestamps are enforced without rounding, and a 409 means a race was lost. This is rich disclosure 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?
Four sentences, front-loaded with the core purpose, then the safety model, then the strict timestamp rule, then conflict handling. Every sentence earns its place and there is no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, behavior, prerequisites, and error handling well for a write operation with no output schema. However, it does not describe what a successful response returns (e.g., a hold identifier) or explicitly point to hub_confirm_booking as the follow-up action, leaving minor gaps for an agent orchestrating the full booking flow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds semantic meaning for startAt and endAt by stating they must be exact slot boundaries and that anything else is refused rather than rounded, which goes beyond the schema's static descriptions. It does not add information for productId, resourceId, outletId, or customerId.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Claim a window on one resource.' It distinguishes the hold from a confirmed booking by explaining that the hold is temporary and expires if nobody pays, which separates it from sibling tools like hub_confirm_booking and hub_cancel_booking.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear prerequisites ('startAt must be exactly a slot start from get_booking_availability') and conflict handling ('re-read availability and offer what is left, do not retry the same window'). However, it does not explicitly name hub_confirm_booking as the next step or state when to prefer a hold over other booking actions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_import_categoriesImport categoriesADestructiveInspect
Load a category tree in one call — a whole department structure, a migration. For one or two categories use create_category. Parents and children may sit in the SAME batch: parentRef takes a parent NAME (matched inside this batch first, then against existing categories) or an existing id, which is what makes a flat spreadsheet importable. Loops and unresolvable parents fail those rows and their descendants, not the batch. This tool does NOT match rows against what already exists — the cabinet does that in the browser, not on the server. Every row in creates becomes a NEW record even if an identical one is already there. To change existing records, read them with export_records and pass their ids in updates. Two rows named the same thing in one batch, or a name that already exists, will produce two categories with that name. On updates this is the only import with true merge-patch semantics: omit a field to leave it, pass null to CLEAR it, and pass parentId: null to move a category back to the top level (which create_category and update_category cannot do). Products are untouched — importing categories neither assigns nor removes products; that is the products side. Rows are independent and per-row failures come back in the reply. Max 500 rows per call. BEFORE CALLING: show the merchant a preview of the first few rows, state the EXACT number of rows and which resource they hit, and get an explicit yes. There is NO undo and no dry-run — nothing here validates without writing. If you are unsure a row is right, ask; a wrong bulk import is far more expensive to repair than a question. Afterwards, tell the merchant what landed: an import done here does NOT appear in the cabinet's Recent Imports list, which only records uploads made through the wizard.
| Name | Required | Description | Default |
|---|---|---|---|
| creates | No | ||
| updates | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructive=true, but the description goes well beyond: it discloses that creates never match existing rows, that duplicate names silently produce duplicate categories, that per-row/descendant failures are isolated, that there is no undo or dry-run, and that imports do not appear in the cabinet's Recent Imports list. It even explains the parentRef batch-then-existing resolution order.
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?
Purpose and the sibling alternative are front-loaded, and despite its length nearly every sentence carries a distinct behavioral rule that an agent must know before a destructive bulk write. It is dense and slightly sprawling, but the length is warranted 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?
For a destructive, no-dry-run bulk import with no output schema, the description covers resolution logic, failure isolation, merge semantics, limits, and post-call expectations (per-row errors returned, no Recent Imports entry). Nothing essential 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?
Adds substantial meaning beyond the schema: parentRef accepts a NAME (matched in-batch first, then existing) or an id, updates use merge-patch where omission leaves a field and null clears it, and `parentId: null` demotes a category to top level — a behavior the schema's description field does not state this clearly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Load a category tree in one call') and immediately scopes it against the sibling create_category, so the agent can distinguish bulk-tree import from single-category creation without opening either schema. The department-structure/migration framing adds concrete intent.
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?
Explicit routing: use create_category for one or two categories, use export_records plus `updates` to change existing records, and only this tool supports true merge-patch. It also names the 500-row cap and the mandatory preview-and-confirm precondition, covering both when to use it and when not to.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_import_customersImport customersADestructiveInspect
Load a customer list in one call — a mailing list, a migration from another system. For one person use create_customer. This is the ONE import that recognises records it already has: pass rows and the server looks each one up BY EMAIL, updating that customer instead of duplicating them. A row with no email is always created new and can never be matched again, so push for emails before importing. Fields you pass overwrite the stored ones; fields you omit are left alone — but an address you pass replaces the stored address whole, and tags replaces the whole tag list. ALL-OR-NOTHING: unlike the other imports this one runs in a single transaction, so one bad row rolls the entire batch back and nothing is written. There is no per-row failure list. Max 500 rows per call. BEFORE CALLING: show the merchant a preview of the first few rows, state the EXACT number of rows and which resource they hit, and get an explicit yes. There is NO undo and no dry-run — nothing here validates without writing. If you are unsure a row is right, ask; a wrong bulk import is far more expensive to repair than a question. Afterwards, tell the merchant what landed: an import done here does NOT appear in the cabinet's Recent Imports list, which only records uploads made through the wizard.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | No | Spreadsheet rows — matched by email, then created or updated by the server | |
| updates | No | Use only when you already hold the id and do not want email matching |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply the destructive/read-only profile; the description adds substantial behavior beyond them: email-based upsert matching, no-email rows always created, field-level overwrite semantics, whole-address and whole-tag-list replacement, all-or-nothing transaction with no per-row failure list, 500-row cap, and the fact that it does not appear in Recent Imports.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long but front-loaded and dense with actionable detail; nearly every sentence carries unique constraints (matching, overwrite rules, atomicity, limits, confirmation protocol). Slightly sprawling, which keeps it short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive bulk-mutation tool with no output schema, the description covers the missing pieces an agent needs: return/failure behavior (no per-row list, all-or-nothing), durability (no undo), confirmation protocol, and the Recent Imports caveat.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both params, but the description adds genuine semantics beyond it: how `rows` are matched by email and created-or-updated, and the overwrite/omit rules. It does not explicitly explain the `updates` parameter's role, leaving that to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Import customers' / load a customer list in one call) and explicitly distinguishes itself from create_customer for single records and from the other imports ('the ONE import that recognises records it already has'). An agent can identify it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative (create_customer) with the selecting condition (one person), describes the appropriate scenarios (mailing list, migration), and gives explicit preconditions via the BEFORE CALLING block plus the 'no undo, no dry-run' warning.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_import_optionsImport product attributesADestructiveInspect
Load product attributes and their values in one call — "Size: S,M,L", "Colour: Red,Blue,Green" — the axes variants are built from. For one axis use create_option. Attribute names are unique per company: a creates row whose name already exists is REJECTED (that row only), so read get_options first and send existing ones through updates. On updates, values are APPEND-ONLY: the list you pass is merged into what is there and existing values are never renamed or removed, because variants reference them by name and would be orphaned. Renaming the attribute itself does cascade to its variants. To remove a value, use the cabinet. This creates no products and no variants — it only defines the axes. Rows are independent and per-row failures come back in the reply. Max 500 rows per call. BEFORE CALLING: show the merchant a preview of the first few rows, state the EXACT number of rows and which resource they hit, and get an explicit yes. There is NO undo and no dry-run — nothing here validates without writing. If you are unsure a row is right, ask; a wrong bulk import is far more expensive to repair than a question. Afterwards, tell the merchant what landed: an import done here does NOT appear in the cabinet's Recent Imports list, which only records uploads made through the wizard.
| Name | Required | Description | Default |
|---|---|---|---|
| creates | No | ||
| updates | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry the safety profile (destructiveHint=true, readOnlyHint=false), and the description adds substantial context beyond them: exists-named creates are rejected per-row, updates are append-only, attribute renaming cascades but value renaming does not, rows are independent, max 500 rows, no undo/dry-run, and results do not appear in the cabinet's Recent Imports list.
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?
Purpose and the create/update distinction are front-loaded, and nearly every sentence adds distinct actionable information. It is dense and long for a tool definition, but little of it is filler, with only mild redundancy in the repeated safety/undo emphasis.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive bulk import with no output schema, the description covers preconditions, per-row failure reporting, failure isolation, limits, irreversibility, and post-call expectations. An agent has everything needed to call this correctly and safely.
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 effectively 0% at the top level, so the description must carry the burden, and it does: it defines the difference between creates and updates, the unique-name rejection behavior, and the append-only merge semantics and cascade rules that no schema description 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 opens with a specific verb and resource ('Load product attributes and their values') and clarifies scope ('the axes variants are built from'). It explicitly distinguishes itself from the sibling create_option ('For one axis use create_option') and states what it does NOT do ('This creates no products and no variants').
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 names the alternative (create_option for one axis), gives a prerequisite workflow (read get_options first, route existing names through updates), and prescribes a pre-call procedure (show a preview, state exact row count, get explicit yes). When-to-use and when-not-to-use are both explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_import_outletsImport outletsADestructiveInspect
Load a list of store locations in one call — opening a chain, migrating from another system. For one shop use create_outlet. Name, street address, city, state and postal code are ALL required on new rows, exactly as in the cabinet form; ask the merchant rather than inventing an address. Country is not settable: every outlet takes the company country, and the import fails outright if the company has none. This tool does NOT match rows against what already exists — the cabinet does that in the browser, not on the server. Every row in creates becomes a NEW record even if an identical one is already there. To change existing records, read them with export_records and pass their ids in updates. Bulk-created outlets differ from ones added in the cabinet in two ways worth telling the merchant: no Stripe location is wired up (payments must be linked per outlet afterwards) and stock rows are seeded in the background, so a fresh outlet can look empty for a while. This path also does NOT check the plan allowance, so it can push the company past the number of outlets it pays for — say so before importing more than a couple. Updates only set what you pass; alias and country cannot be changed here. Rows are independent and per-row failures come back in the reply. Max 500 rows per call. BEFORE CALLING: show the merchant a preview of the first few rows, state the EXACT number of rows and which resource they hit, and get an explicit yes. There is NO undo and no dry-run — nothing here validates without writing. If you are unsure a row is right, ask; a wrong bulk import is far more expensive to repair than a question. Afterwards, tell the merchant what landed: an import done here does NOT appear in the cabinet's Recent Imports list, which only records uploads made through the wizard.
| Name | Required | Description | Default |
|---|---|---|---|
| creates | No | ||
| updates | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as a non-read-only, destructive write operation, and the description substantially adds beyond them: it explains that creates rows are never matched or deduplicated, updates only set passed fields, alias and country are immutable, plan allowance is not checked, Stripe locations are not wired, stock rows seed in background, max is 500 rows, per-row failures return in the reply, and imports do not appear in the cabinet's Recent Imports list.
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 purpose and scope before caveats. Every sentence addresses a distinct operational risk of bulk destructive import, and the imperative 'BEFORE CALLING' guidance is easy to locate.
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 a destructive bulk import with no output schema, the description covers preconditions, row requirements, update semantics, failure behavior, limits, side effects, and post-import communication needs. An agent has everything required to call it correctly and warn the merchant.
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 carries the parameter burden. It clearly differentiates the two top-level arrays: every row in `creates` becomes a new record, while `updates` requires ids from export_records or get_outlets and only sets fields that are passed. It also identifies the required create fields and the fields that cannot be changed here (alias and country).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Load a list of store locations in one call', with bulk scope made explicit by 'in one call'. It distinguishes itself from the sibling single-record tool by name: 'For one shop use create_outlet'. The creates/updates arrays are also clearly identified as the two modes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use scenarios ('opening a chain, migrating from another system') and the alternative tool ('For one shop use create_outlet'). It also states prerequisites (required fields, company country), prohibitions (no undo, no dry-run), and a pre-call protocol (preview rows, state row count, get explicit yes).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_import_productsImport productsADestructiveInspect
Load a spreadsheet of products in one call — "here are my 200 items", a catalogue from another POS, a price list. For one or two products use create_product instead: it can build variants from options, this cannot (every created row is a SIMPLE product with a single variant). This tool does NOT match rows against what already exists — the cabinet does that in the browser, not on the server. Every row in creates becomes a NEW record even if an identical one is already there. To change existing records, read them with export_records and pass their ids in updates. An update row is found by productId OR by sku (the SKU of its variant — what a spreadsheet has); a SKU that matches no product or several fails that row. price, costPrice, barcode and sku in an update go to the product's single variant; a product with several variants fails that row — use update_product for it. An update cannot clear categories; omit the field to leave them as they are. Prices are written as the merchant says them ("19.99"), in the company currency. Category entries may be names or ids: an unknown NAME is created as a new top-level category, so check the spelling against get_categories first or the import will litter the catalogue. Rows are independent — the reply lists per-row failures alongside what landed, so a bad row does not stop the rest. Max 500 rows per call. BEFORE CALLING: show the merchant a preview of the first few rows, state the EXACT number of rows and which resource they hit, and get an explicit yes. There is NO undo and no dry-run — nothing here validates without writing. If you are unsure a row is right, ask; a wrong bulk import is far more expensive to repair than a question. Afterwards, tell the merchant what landed: an import done here does NOT appear in the cabinet's Recent Imports list, which only records uploads made through the wizard.
| Name | Required | Description | Default |
|---|---|---|---|
| creates | No | New products, one per spreadsheet row | |
| updates | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations declare destructiveHint=true, and the description richly adds behavior beyond that: no matching against existing rows, no undo, no dry-run, no server-side validation, per-row independence, ambiguous SKU failures, variant constraints, and no appearance in Recent Imports. This is unusually complete for a destructive bulk operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Though long, the description is front-loaded and every sentence carries operational weight: purpose, alternatives, matching behavior, update constraints, pre-call confirmation, and post-call reporting. There is no filler, and the warning structure suits a destructive bulk 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 complex, destructive, two-array import tool with no output schema, the description covers row limits, partial failures, update lookup, field routing, category side effects, and required merchant confirmation. It supplies what the schema and annotations do not.
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 only 50% schema description coverage, the description compensates with crucial semantics: update rows are matched by productId or variant SKU, ambiguous SKUs fail, price fields target the single variant, multi-variant products fail, and categories cannot be cleared. It adds meaning well beyond the structured schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: loading a spreadsheet of products in bulk. It explicitly distinguishes itself from siblings like create_product and update_product, including variant limitations and update behavior. An agent can identify when this bulk-import tool applies without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names clear alternatives and conditions: use create_product for one or two products, export_records plus updates for existing records, and update_product for multi-variant products. It also gives explicit pre-call procedure and size limits, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_import_stock_csvImport stock CSVADestructiveInspect
Write stock counts for ONE outlet from the CSV that export_stock_csv returns — the cabinet's stock upload. Edit only the New Qty column; each row SETS that variant's quantity at the outlet (it is not a +/- adjustment). Keep the header and the Variation ID column as exported. Rows whose Variation ID is not in this company are skipped. For one or two variants use adjust_stock instead. BEFORE CALLING: show the merchant a preview of the first few rows, state the EXACT number of rows and which resource they hit, and get an explicit yes. There is NO undo and no dry-run — nothing here validates without writing. If you are unsure a row is right, ask; a wrong bulk import is far more expensive to repair than a question. Afterwards, tell the merchant what landed: an import done here does NOT appear in the cabinet's Recent Imports list, which only records uploads made through the wizard.
| Name | Required | Description | Default |
|---|---|---|---|
| csv | Yes | The CSV text, header row included | |
| outletId | Yes | Outlet id from get_outlets — the one the CSV was exported for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description discloses that the operation has NO undo and no dry-run, that nothing validates without writing, that rows with foreign Variation IDs are skipped, and that the import does not appear in the cabinet's Recent Imports list. These are meaningful side-effect and irreversibility details 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 core operation and the SETS-not-adjusts constraint are front-loaded, followed by the critical pre-call safety workflow and post-call reporting note. Despite its length, every sentence earns its place for a high-risk bulk write operation, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive bulk import with no output schema, the description covers the input format constraints, the destructive and irreversible nature, the absence of validation, the pre-call confirmation requirement, and the post-call reporting expectation. Nothing essential for safe invocation appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already defines both parameters. The description adds useful semantics beyond the schema by specifying that csv comes from export_stock_csv, that only the New Qty column should be edited, and that the header and Variation ID column must be kept as exported; it adds less about outletId beyond what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it writes stock counts for ONE outlet from the CSV returned by export_stock_csv. It distinguishes the operation from adjust_stock and clarifies that each row SETS the variant quantity rather than applying a +/- adjustment, so an agent can identify the tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes small jobs to adjust_stock ("For one or two variants use adjust_stock instead") and provides a pre-call workflow requiring a preview, row count, and explicit merchant confirmation. It also warns there is no undo or dry-run, giving clear when-to-use and when-not-to-use conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_install_extensionInstall extensionAInspect
Install an extension for the whole company. Takes the extensionId from get_extension_catalog, never a name. CONFIRM WITH THE MERCHANT BEFORE CALLING, naming the extension: this is not a personal setting — it changes the cabinet for EVERY user of the company, and several extensions do real work on install (WooCommerce connects the store and starts syncing, TIMEmSYSTEM writes default settings, Custom Payment schedules Stripe billing). MONEY: an extension with a non-zero price starts costing the merchant from the moment it is installed — quote the stored price string and let them decide. Installing is not enough to finish a setup: most extensions then need their own settings page in the cabinet (a WooCommerce store URL, a payment gateway key), which this agent cannot fill in — say that plainly after installing. Refused when the plan excludes the extension, when the caller lacks the Extensions permission, or when it is already installed (installing twice is not a no-op — it would run the side effects again).
| Name | Required | Description | Default |
|---|---|---|---|
| extensionId | Yes | extensionId from get_extension_catalog — not a name, not a guid |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, destructiveHint=false, openWorldHint=false; the description adds far more than that – the company-wide blast radius, named per-extension side effects (WooCommerce sync, TIMEmSYSTEM defaults, Stripe billing), the money implication of a non-zero `price`, and the fact that installation alone does not complete setup. This is exactly the behavioral context annotations cannot carry.
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?
Dense but well ordered: action and ID sourcing first, then the confirmation requirement, then side effects, money, and post-install caveats, ending with refusals. The length is justified by the high-stakes mutation, though a couple of clauses could be trimmed without loss.
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 mutation with no output schema, the description covers everything the agent needs: prerequisites, blast radius, monetary consequences, follow-up obligations, and failure modes. Nothing material about calling it correctly is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter's schema description already says 'extensionId from get_extension_catalog — not a name, not a guid'. The description restates this constraint rather than adding new syntax or format detail, so it meets the baseline without exceeding it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with explicit company-wide scope ('Install an extension for the whole company'), which cleanly separates it from the sibling flow_install_extension. It also pins the required input ('Takes the `extensionId` from get_extension_catalog, never a name'), so the agent knows exactly what this does before opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a hard precondition (CONFIRM WITH THE MERCHANT BEFORE CALLING, naming the extension), the sourcing rule for the ID, and explicit refusal conditions (plan excludes the extension, caller lacks the Extensions permission, already installed). The 'installing twice is not a no-op' note further clarifies the when-not boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_link_modifier_to_categoryAsk a modifier on a categoryAInspect
Start asking a modifier on every product in a category — THIS is what puts it on the till. The rules are per category, so the same modifier can be required here and optional elsewhere. required means the cashier cannot finish the line until they answer. min/max count distinct choices, or UNITS when the modifier uses quantities. Refused when the category already inherits this modifier from a parent category (link it to the parent or the child, not both), when it is already linked, and when the rules could not be satisfied — for example asking for at least 3 when only 2 choices are sold at every outlet. Linking a modifier to a PARENT category detaches it from any subcategories that already had it, since they now inherit it.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | Most that may be chosen. Omit for no cap | |
| min | No | Fewest that must be chosen. Setting this makes it required | |
| required | No | The cashier must answer before ringing up. Default false | |
| sortOrder | No | Position among this category’s modifiers. Omit to append | |
| categoryId | Yes | Category id from get_categories | |
| modifierId | Yes | Modifier id from get_modifiers |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say it is a write operation that is not read-only and not open-world; the description goes well beyond that, disclosing refusal conditions, the unit-counting semantics of min/max, and the key side effect that linking to a PARENT category detaches it from subcategories that already had it. That side-effect disclosure is exactly the kind of context a destructiveHint=false annotation cannot convey, and there is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and every sentence carries decision-relevant information (rules, refusals, side effects). It is, however, one dense block with nested parentheticals that make the refusal conditions harder to scan than a short list would.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter mutation with no output schema, the description covers what an agent needs to decide and call correctly: rules semantics, failure modes, and the parent-category cascade. The only real gap is that it says nothing about what comes back on success, which matters somewhat given there is no output schema to fall back on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description earns above that by clarifying interactions the schema does not: that setting min makes the entry required, that required blocks the cashier from finishing the line, and that min/max count UNITS rather than choices when quantities are used. sortOrder is left entirely to the schema, keeping it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource with scope: creating a modifier-ask link across every product in a category, framed as 'THIS is what puts it on the till.' That is enough to separate it from hub_unlink_modifier_from_category, but it never explicitly distinguishes itself from hub_update_category_modifier, which also sets min/max/required rules — the boundary an agent most needs is left implicit.
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 concrete when-not conditions (already inherited from a parent, already linked, unsatisfiable rules) and the 'link to the parent or the child, not both' routing rule, which is genuinely useful decision guidance. It does not name the alternative tools (update/unlink/get_category_modifiers) an agent should reach for in those cases, so routing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_link_supplier_itemsLink, re-price or unlink supplier itemsADestructiveInspect
Change what a supplier carries and what it charges, in one call: add new items, update the cost or part number of items already linked, remove items it no longer sells. variantId comes from get_linkable_items for add and from get_supplier_items for update / remove. unitCost is what the merchant PAYS per unit, as a human amount like "12.50" in the company currency — never the selling price, and never cents. It is only the DEFAULT that prefills new order lines: changing it does not re-price purchase orders already placed. Adding an item that is already linked is refused, so read the current list first rather than re-adding blindly. REMOVING is the destructive half — confirm it with the merchant, and tell them it also EDITS ORDERS THAT ARE ALREADY WRITTEN: the item’s line is dropped from every suggested and draft order from this supplier, which changes their totals. Orders already sent keep their lines, the item stays in the catalogue, but it can no longer be added to a new order from this supplier, and any auto-reorder rule pointing at this supplier for it stops producing suggestions.
| Name | Required | Description | Default |
|---|---|---|---|
| add | No | Items to start buying from this supplier | |
| remove | No | Item ids from get_supplier_items to stop buying from this supplier | |
| update | No | Already-linked items to re-price or re-code | |
| supplierId | Yes | Supplier id from get_suppliers — not a name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=true; the description adds far more: unitCost is a default that never re-prices placed purchase orders, and removal also drops the line from every suggested and draft order (changing totals) while leaving sent orders intact. It even states the side effects on auto-reorder rules and catalogue membership, which no annotation conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The three operations are front-loaded in the first clause and every sentence carries needed information, but the passage is long and the removal warning is a dense, clause-heavy run-on. It is appropriately sized for a three-mode destructive tool, though slightly more structure would help.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive multi-mode mutation with no output schema, the description covers prerequisites, parameter sourcing, semantic traps, idempotency behavior on re-adding, and downstream order/reorder consequences. Nothing an agent needs to invoke it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so baseline is 3, but the description adds genuine disambiguation the schema lacks: unitCost is what the merchant PAYS per unit, is a human-format amount in company currency, and is 'never the selling price, and never cents'. That resolves the most likely mis-invocation (passing cents or retail price).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb set (add/update/remove) against a specific resource (supplier items) and states the scope as 'what a supplier carries and what it charges, in one call'. Each of the three mutation modes is distinguished by what it does, so an agent can pick the right array without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes parameter sourcing: variantId comes from get_linkable_items for `add` and get_supplier_items for `update`/`remove`. It also gives an operational precondition ('read the current list first rather than re-adding blindly') and a usage warning to confirm removals with the merchant, which is exactly when-to-use/when-to-be-careful guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_receive_purchase_orderReceive a deliveryADestructiveInspect
Book a delivery in against an order that was sent: ADDS THE RECEIVED QUANTITIES TO REAL STOCK at the order’s outlet and updates the item cost book. This is not a note — it changes inventory. CONFIRM THE QUANTITIES WITH THE MERCHANT FIRST, item by item, and record what genuinely ARRIVED, not what was ordered — they differ, which is the whole point of receiving. Only sent and partially_received orders can be received; each item must be one that was ordered; receiving more than ordered is allowed. A short delivery leaves the order partially_received — receive again when the rest turns up. A CALL THAT RETURNS IS NOT PROOF EVERY ITEM LANDED — check partialFailure, and stockApplied.complete on a large delivery. IF IT FAILS, DO NOT RETRY BLINDLY: "still being received" means a previous delivery is being applied right now (get_receive_progress), and a wrong-status error means it was already fully received. Call get_purchase_order to see what actually landed before deciding anything. unitCost is what this delivery actually cost per unit — pass the invoice price if it differs from the order. When it does differ, the supplier’s stored cost is NOT updated unless you list that item in updateSupplierCostVariantIds, so ask the merchant whether the new price is the going rate or a one-off.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | What actually arrived | |
| discount | No | Flat discount on the whole order, e.g. "25.00". Not with discountPercent | |
| dutyFees | No | Duty / customs charged on the order | |
| customFees | No | Any other named charge on the order, e.g. "Handling" | |
| receivedAt | No | ISO date the goods arrived — defaults to now | |
| invoiceDate | No | ISO date on the invoice | |
| shippingFee | No | Shipping charged on the order, e.g. "18.00" | |
| invoiceNumber | No | Supplier invoice number for this delivery | |
| discountPercent | No | Discount as a percentage of the items subtotal | |
| purchaseOrderId | Yes | Purchase order id from get_purchase_orders — not a PO number | |
| updateSupplierCostVariantIds | No | Items whose new unitCost should become the supplier’s stored cost from now on |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag a destructive, non-read-only mutation, and the description adds substantially more: that stock and the cost book are mutated, partial-failure semantics via partialFailure and stockApplied.complete, and retry hazards ('still being received' means an in-flight delivery; a wrong-status error means already fully received). It also discloses the side effect that the supplier's stored cost is NOT updated unless an item is listed in updateSupplierCostVariantIds.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core effect and mutation warning, then the preconditions and failure handling — a sensible order. It is long and leans heavily on ALL-CAPS emphasis, which is slightly noisy, but nearly every sentence carries operational content rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter mutation tool with no output schema, the description covers the mutation's consequences, allowed order states, partial-receipt behavior, failure/retry semantics, and the cost-book side effect. An agent has everything it needs to call this correctly and interpret the ambiguous outcomes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: unitCost is 'what this delivery actually cost per unit' (invoice price, may differ from the order), lines represent 'what actually arrived' rather than what was ordered, and it explains the interaction between unitCost and updateSupplierCostVariantIds. It adds value without re-documenting every field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ('Book a delivery in against an order that was sent') and spells out the effect ('ADDS THE RECEIVED QUANTITIES TO REAL STOCK... updates the item cost book'), explicitly contrasting it with a mere note. It does not, however, explicitly differentiate itself from close siblings like hub_record_received_goods or hub_receive_stock_transfer, so an agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions ('Only sent and partially_received orders can be received'), state transitions ('A short delivery leaves the order partially_received — receive again when the rest turns up'), and operating advice ('CONFIRM THE QUANTITIES WITH THE MERCHANT FIRST'). It also routes the agent to get_purchase_order and get_receive_progress for follow-up, which is exactly the when/when-not guidance the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_receive_stock_transferReceive stock transferADestructiveInspect
Confirm that a transfer arrived: the destination outlet gains the units and the transfer closes. CONFIRM WITH THE MERCHANT FIRST — this adds stock and cannot be undone from here. Only do it when they say the goods are physically there; confirming a transfer that never arrived hides a loss instead of recording one. Takes stockTransferId (from get_stock_transfer), NOT the transactionId. Only applies to a receive-transfer leg still in-transit; a transfer already completed has nothing left to receive.
| Name | Required | Description | Default |
|---|---|---|---|
| stockTransferId | Yes | stockTransferId from get_stock_transfer — not the transactionId |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, and the description adds substantial context beyond them: the effect is stock-increasing and irreversible from this tool, and confirming an arrival that never happened conceals a loss rather than recording one. It also constrains the operation to a receive-transfer leg still in-transit.
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?
Opens with the action and its effect, then front-loads the merchant-confirmation warning before the mechanical detail. Every sentence carries a distinct piece of information — effect, risk, precondition, ID source, applicability — with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, no-output-schema mutation with annotations covering the safety profile, the description supplies everything an agent needs: the state change, the irreversibility, the required human confirmation, the correct identifier, and the in-transit precondition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already states the parameter is the stockTransferId from get_stock_transfer and not the transactionId, so the description largely restates it. It adds minor value by tying the ID source to a sibling tool, but the schema carries the parameter documentation. Baseline 3 applies for a fully covered 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?
States a specific verb ('Confirm that a transfer arrived'), the resource (stock transfer), and the concrete state change (destination outlet gains units, transfer closes). This cleanly distinguishes it from siblings such as hub_create_stock_transfer, hub_receive_purchase_order, and hub_record_received_goods without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('only do it when they say the goods are physically there'), an explicit prerequisite ('CONFIRM WITH THE MERCHANT FIRST'), and an explicit when-not ('a transfer already completed has nothing left to receive'). It also names hub_get_stock_transfer as the source of the ID, giving the agent a clear entry point.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_record_received_goodsRecord goods received with no orderADestructiveInspect
Stock that arrived with no purchase order behind it — the merchant bought it on the spot, or it was ordered outside the platform. Creates the order already fully received and ADDS THE QUANTITIES TO REAL STOCK at the outlet, in one step. Use this ONLY when no order exists. If the goods match an order that was sent, use receive_purchase_order instead — otherwise the same delivery is counted twice, once here and once when someone receives the real order. Check get_purchase_orders for an open order from this supplier before calling. The items must already be linked to the supplier (get_supplier_items) and stock-managed at the outlet. There is no undo: correcting a mistake means a stock adjustment afterwards.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | What arrived | |
| notes | No | ||
| discount | No | Flat discount on the whole order, e.g. "25.00". Not with discountPercent | |
| dutyFees | No | Duty / customs charged on the order | |
| outletId | Yes | Outlet id from get_outlets — where the goods physically arrived | |
| customFees | No | Any other named charge on the order, e.g. "Handling" | |
| receivedAt | No | ISO date the goods arrived — defaults to now | |
| supplierId | Yes | Supplier id from get_suppliers | |
| invoiceDate | No | ISO date on the invoice | |
| shippingFee | No | Shipping charged on the order, e.g. "18.00" | |
| invoiceNumber | No | ||
| discountPercent | No | Discount as a percentage of the items subtotal | |
| updateSupplierCostVariantIds | No | Items whose unitCost should become the supplier’s stored cost from now on |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, but the description adds substantial context beyond them: quantities are added to REAL STOCK in one step, there is no undo, and recovery requires a manual stock adjustment. This is exactly the kind of consequence disclosure a mutation tool needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but every sentence earns its place: purpose first, then the routing rule, then the double-count warning, then prerequisites, then the irreversibility note. No filler, and the highest-stakes information (only when no order exists) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter destructive mutation with no output schema, the description covers the gaps that matter: prerequisites, side effects on stock, irreversibility, and the sibling it must not be swapped with. An agent has everything needed to decide and to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 85%, so the baseline is 3, and the description adds real value on top: it constrains variantId (must be supplier-linked via get_supplier_items) and outletId (must be stock-managed where goods physically arrived). The remaining 13 parameters are documented in the schema itself, so no further compensation is required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (record received goods) and immediately scopes it: goods that arrived with NO purchase order. It explicitly names the sibling it must not be confused with (receive_purchase_order) and explains the distinction, so an agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (no order exists), when-not (goods match a sent order), the alternative tool to use instead, and the failure mode of getting it wrong (double counting). It also lists preconditions: check get_purchase_orders for an open order, items must be linked via get_supplier_items, and stock-managed at the outlet.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_remove_reorder_ruleTurn off auto-reorder for an itemADestructiveInspect
Stop watching one item: it will no longer be suggested for reordering however low it runs. Its thresholds are forgotten, so turning it back on means setting them again. Suggestions already produced for this item are not withdrawn — cancel those orders separately if the merchant wants them gone.
| Name | Required | Description | Default |
|---|---|---|---|
| variantId | Yes | Item id from get_supplier_items |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the destructiveHint/readOnlyHint annotations by specifying exactly what is destroyed ("Its thresholds are forgotten"), what re-enabling costs, and an important non-effect ("Suggestions already produced for this item are not withdrawn"). This is precisely the side-effect detail an agent needs before a destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Action is front-loaded in the first clause, followed by consequence and side-effect scope. Three sentences, all informative; only marginal tightening is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, no-output single-parameter mutation whose annotations already declare destructiveHint=true, the description supplies the missing pieces: what is lost, reversibility, and the untouched existing suggestions. Nothing an agent needs is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single variantId parameter is documented in the schema as "Item id from get_supplier_items." The description adds no parameter-level detail, so baseline 3 applies — the schema does the work 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?
States a specific action and scope: "Stop watching one item: it will no longer be suggested for reordering." This clearly distinguishes it from its counterpart hub_set_reorder_rule, which the description implicitly references by noting that re-enabling requires re-setting thresholds.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use context (stop auto-reordering for a specific item) and points to a related downstream action ("cancel those orders separately") plus the reversible-by-reconfiguration caveat. It stops short of explicitly naming hub_set_reorder_rule as the opposite operation, but the guidance is otherwise clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_remove_tax_rate_from_groupRemove rate from groupADestructiveInspect
Stop ONE tax group charging a rate. The rate itself, its percentages and its use by other groups are untouched — this only drops the link. This is what the merchant means by "remove the city tax from Food". Use delete_tax_rate ONLY when they want the rate gone from the whole company. CONFIRM WITH THE MERCHANT: every product in this group immediately stops being charged this tax. Sales already rung up are NOT recalculated — this only affects sales from now on.
| Name | Required | Description | Default |
|---|---|---|---|
| taxRateId | Yes | Tax rate id from get_taxes | |
| taxGroupId | Yes | Tax group id from get_taxes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds substantive context beyond them: only the link is dropped (the rate, its percentages, and other groups' usage survive), every product in the group immediately stops being charged, and past sales are NOT recalculated. It also mandates merchant confirmation. This is exactly the destructive-blast-radius detail an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the disambiguation, then the consequence and confirmation warning. Each sentence adds distinct information; nothing is repeated boilerplate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive link-removal tool with no output schema, the description covers impact scope, non-recalculation semantics, and required confirmation. Nothing an agent needs to invoke it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both required ids are documented there ('from get_taxes'), so the schema carries the parameter burden. The description adds no format or lookup detail beyond what the schema already states, which is the baseline-3 case when coverage is high.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource+scope: 'Stop ONE tax group charging a rate', explicitly scoping to a single group and a single link. It also translates the operation into merchant intent ('remove the city tax from Food'), which removes ambiguity about what object is affected. An agent can distinguish this from delete_tax_rate and hub_add_tax_rate_to_group without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative and the selecting condition: use delete_tax_rate ONLY when the rate should be gone from the whole company. It also flags the merchant-facing phrasing that should route to this tool. When-to-use and when-not-to-use are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_remove_userRemove team memberADestructiveInspect
Remove someone from the merchant's team — the tool for 'she left', 'take the leaver off'. Takes the userId from get_team ONLY, never a name. CONFIRM WITH THE MERCHANT BEFORE CALLING, naming the person: there is no undo from here. If two people share a name, list them and ask which. They stop being able to sign in immediately; their past orders and sales figures are kept, so reports about them still work. You cannot remove the account this agent key belongs to — the server refuses, so that an administrator cannot lock themselves out.
| Name | Required | Description | Default |
|---|---|---|---|
| userId | Yes | User id from get_team — not a name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=true; the description adds the consequences that matter: no undo, immediate loss of sign-in, retained orders/sales so reports still work, and a server-enforced block on removing the account the agent key belongs to. These are exactly the behavioral traits annotations cannot express.
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?
Purpose is front-loaded and every sentence carries information (routing triggers, precondition, edge case, side effects, server constraint). It is on the long side and the colloquial example list is slightly padded, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still covers what an agent needs to call safely: the id source, the confirmation requirement, name-collision handling, irreversible effects, and the self-removal guard. Nothing material is left unspecified for a high-risk mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single param's description already says 'User id from get_team — not a name'. The description largely repeats that ('Takes the userId from get_team ONLY, never a name'), adding emphasis rather than new semantics, so the baseline 3 for a fully documented schema is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (remove someone from the merchant's team) and grounds it in colloquial routing cues an agent can match ('she left', 'take the leaver off'). It also distinguishes itself from the read path by naming get_team as the source of the userId, so the agent can tell it apart from siblings like hub_update_user or hub_delete_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?
Explicit when-to-use is given via the 'she left' triggers, plus a hard precondition (CONFIRM WITH THE MERCHANT BEFORE CALLING, naming the person) and a disambiguation rule for duplicate names (list them and ask which). The source of the required id is pinned to get_team ONLY, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_rename_stationRename tillADestructiveInspect
Rename one station. Takes the station id from get_stations. Renaming is safe and takes effect everywhere — past orders, sessions and reports store the id and look the name up. The name is the ONLY thing the cabinet lets anyone change on an existing station, and the only thing this tool changes. A station cannot be moved to another outlet, and its device, card reader and POS layout are not editable from here — moving a till to another store means creating a new station there and deleting this one, which loses its id.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The new station name | |
| stationId | Yes | Station id from get_stations — not a name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: rename propagates because orders/sessions/reports store the id and look up the name, the id is preserved, and only the name is mutable. The one soft spot is calling renaming 'safe' while annotations carry destructiveHint=true — the description means referentially safe, but an agent may read 'safe' as low-risk, so the risk framing could be sharper.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then layered with rationale and constraints. Every sentence carries information, though the doubled emphasis in 'the ONLY thing the cabinet lets anyone change... and the only thing this tool changes' is slightly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter mutation with no output schema, the description covers the prerequisite, side effects, and scope limits well. It does not say what a successful rename returns, which is the only remaining gap an agent might want filled.
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 already documents both fields, including 'Station id from get_stations — not a name.' The description only restates the id source, adding no format, validation, or naming-constraint detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a precise verb+resource+scope: 'Rename one station.' It further delimits the tool by stating the name is the ONLY field it changes, which cleanly separates it from hub_create_station, hub_delete_station and hub_get_stations without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('rename one station'), explicit prerequisite routing ('Takes the station id from get_stations'), and an explicit when-not with an alternative path: moving a till to another store means creating a new station there and deleting this one. That is the full when/when-not/alternative triad.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_reorder_categoriesReorder categoriesADestructiveInspect
Set the display order of several categories in one call — "put Drinks first", "sort my categories alphabetically". Lowest sortOrder shows first, and ordering only applies among categories that share the same parent. Send every category whose position should change, with the ids from get_categories; ones you leave out keep their current order, which can leave two categories tied. It changes NOTHING but the order — for a rename or a move use update_category.
| Name | Required | Description | Default |
|---|---|---|---|
| categories | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing side-effect semantics: ordering only applies among siblings sharing a parent, omitted categories keep their current order, and that omission can leave two categories tied. The 'changes NOTHING but the order' claim sits in mild tension with destructiveHint=true, but is not a true contradiction since it is still a persisted write and the description supplies the tie/omission caveat.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: purpose plus examples, sort semantics, call shape and omission behavior, then the boundary and alternative. Purpose is front-loaded and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter mutation with no output schema, the description covers the intent vocabulary, the prerequisite source of ids, the sibling scoping rule, the omitted-item side effect, and the alternative tool. Nothing an agent needs to invoke it correctly appears 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 reported as 0%, so the description must carry the load, and it does: it explains what sortOrder means relative to siblings, that ordering is parent-scoped, and that categoryId should come from get_categories. It adds the omission/leave-out semantics and tie behavior that the schema does not express, though 'lowest first' and 'id from get_categories' partially duplicate the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (set the display order of several categories) and immediately bounds the operation with two concrete intent examples. It also explicitly names sibling hub_update_category as the tool for rename/move, so an agent can distinguish it without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('put Drinks first', 'sort alphabetically'), an explicit when-not ('for a rename or a move use update_category'), and the prerequisite that ids come from get_categories. It also instructs on call shape: send every category whose position should change.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_reorder_category_modifiersReorder a category’s modifiersAInspect
Set the order the till asks a category’s modifiers in. Pass EVERY link id for that category exactly once, in the order wanted — a partial list is refused. Read them from get_category_modifiers with that categoryId.
| Name | Required | Description | Default |
|---|---|---|---|
| categoryId | Yes | Category id from get_categories | |
| orderedIds | Yes | Every link id for this category, each once, in ask order |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), and the description adds a genuine behavioral trait beyond them: a partial list is refused and each link id must appear exactly once. It stops short of describing idempotency or behavior on unknown ids, but the failure mode is a real addition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the operation and followed by the operative constraint and data source. No filler; every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, no-output-schema tool, the description covers the operation, the data source, and the key failure mode. Minor gaps remain (atomicity, behavior on invalid/duplicate ids), but nothing essential to calling it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented, but the description goes beyond the schema by naming the sibling tool to source the ids from and reinforcing the completeness constraint that governs orderedIds. That is meaningful semantic context, not a restatement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Set the order the till asks a category's modifiers in'), and is clearly distinguishable from siblings like hub_reorder_modifier_choices, hub_reorder_categories, and hub_update_category_modifier. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite and data source: 'Read them from get_category_modifiers with that categoryId,' plus the constraint that the list must be complete or it is refused. It does not explicitly say when to prefer this over hub_update_category_modifier, so it falls just short of a full when/when-not statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_reorder_modifier_choicesReorder choicesAInspect
Set the order the choices appear in at the till. Pass EVERY current choice id exactly once, in the order wanted — a partial list is refused. Read them from get_modifier first.
| Name | Required | Description | Default |
|---|---|---|---|
| modifierId | Yes | Modifier id from get_modifiers | |
| orderedChoiceIds | Yes | Every current choice id, each exactly once, in display order |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic write profile (readOnlyHint=false, destructiveHint=false), so the description's disclosure that the list must be complete and that partial input is rejected adds real behavioral value — it tells the agent this is a whole-order replacement, not a merge. It doesn't describe success output or any permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the core action front-loaded and the constraint and prerequisite following in priority order.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no output schema, the description covers the action, the input completeness constraint, and how to source the ids. Only the post-success state (what the till shows after) is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema. The description reinforces the 'every id exactly once, in order' constraint but adds no syntax or format detail beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Set the order the choices appear in at the till'), which is distinct from the reorder siblings (hub_reorder_categories, hub_reorder_category_modifiers) and from hub_update_modifier_choice. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the prerequisite workflow ('Read them from get_modifier first') and the failure condition ('a partial list is refused'), which is strong routing guidance. It stops short of saying when to use this versus hub_update_modifier_choice for individual choice edits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_send_purchase_orderSend purchase order to supplierADestructiveInspect
Place the order: moves a draft or suggested order to sent and, when asked, EMAILS IT TO THE SUPPLIER. ASK THE MERCHANT WHETHER TO EMAIL, EVERY TIME, and only then pass sendEmail: true — that message leaves the platform and cannot be recalled. Default is false, which records the order as placed without mailing anything: the right choice when they ordered by phone, in person, or through the supplier’s own portal. Emailing needs a contactEmail on the supplier; without one, send with sendEmail: false and tell them why. The email carries the order in its body — this tool cannot attach the PO PDF the cabinet produces. After sending, the order can no longer be edited; only receiving or cancelling remain.
| Name | Required | Description | Default |
|---|---|---|---|
| sendEmail | No | Email the supplier. Defaults to false — set true ONLY after the merchant said to send it | |
| purchaseOrderId | Yes | Purchase order id from get_purchase_orders — not a PO number |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=true; the description adds the state machine, the irreversibility of the outbound email ('cannot be recalled'), the contactEmail prerequisite, the fact that the email body carries the order rather than the PO PDF, and that the order becomes uneditable afterwards. These are consequential side effects an agent could not infer from 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?
Front-loaded with the imperative ('Place the order') and every sentence carries an operational instruction or a hazard warning. The all-caps emphasis and the repetition of the ask-before-emailing rule consume space, but they are safety-relevant rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, irreversible, no-output-schema mutation tool, the description covers preconditions, side effects, irreversibility, failure mode (missing contactEmail), and post-action state. An agent has everything needed to call it correctly and to explain the outcome to the merchant.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented, including the default and the 'ONLY after the merchant said to send it' guard. The description nonetheless adds decision criteria the schema lacks (phone/in-person/portal cases for false, and what happens when no contactEmail exists), plus the warning that purchaseOrderId is an id from get_purchase_orders, not a PO number.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Place the order') and pins the exact state transition (draft/suggested → sent), which no sibling name conveys. It is immediately distinguishable from hub_update_purchase_order, hub_receive_purchase_order and hub_cancel_purchase_order, which the description even names as the only remaining post-send 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?
Explicit when-to-use (order must be draft/suggested), when-not (sendEmail:false for phone, in-person, or supplier-portal orders), a mandatory precondition (ask the merchant every time), and a blocking prerequisite (contactEmail must exist on the supplier). Alternatives after sending are named. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_set_product_booking_setupMake a product bookableAInspect
Point a booking product at its rule set AND the resources that serve it — both in one call, because a product with only one of them takes no bookings at all. resourceIds REPLACES the current list rather than adding to it, so pass every resource that should serve the product. The product must already exist and be of the booking type (create_product with productType "booking").
| Name | Required | Description | Default |
|---|---|---|---|
| productId | Yes | Product id from get_products | |
| resourceIds | Yes | Every resource that can serve this product, ids from get_booking_resources | |
| bookingRulesId | Yes | Rule set id from get_booking_rules |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false. The description adds crucial behavioral context beyond annotations: resourceIds REPLACES the current list (so existing associations are lost if omitted), and the product must already exist and be a booking type. It does not cover permissions or error behavior, but the replacement semantics are a key disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose, followed by the replacement warning and prerequisite. Every sentence adds necessary information 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?
With no output schema and 100% schema coverage, the description provides enough context to call the tool correctly: purpose, prerequisites, and the replacement behavior of resourceIds. It omits error handling and return values, but the former is not essential for invocation and the latter is not required without an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds critical semantics for resourceIds: it replaces rather than appends, meaning the agent must pass every resource that should serve the product. It also implies productId must reference an existing booking-type product, which supplements the schema's 'Product id from get_products'.
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 phrase ('Point a booking product at its rule set AND the resources') and names the resource. It distinguishes itself from siblings like hub_get_product_booking_setup by emphasizing the write action and the combined setup. An agent can identify the tool's purpose without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use the tool (to make a product bookable, requiring both rules and resources) and gives the prerequisite that the product must already exist and be of the booking type. It does not name alternative tools or explicitly say when not to use it, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_set_reorder_ruleTurn on auto-reorder for an itemAInspect
Tell the platform to watch one item and suggest reordering it when stock runs low: below lowStockPoint, suggest ordering reorderQuantity from this supplier. Calling it again on the same item replaces the rule rather than adding a second one. The supplier MUST already carry this item (get_supplier_items) — otherwise the rule would draft orders to a supplier that cannot fulfil them, and it is refused. The thresholds apply company-wide unless you pass outletOverrides, which set a different point or quantity per outlet — a busy store may need a higher one than a quiet one. This only produces SUGGESTIONS. Nothing is ever ordered or emailed automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| variantId | Yes | Item id from get_supplier_items | |
| supplierId | Yes | Supplier to reorder from — must already carry this item | |
| lowStockPoint | Yes | Suggest reordering once stock falls below this | |
| outletOverrides | No | Per-outlet thresholds for outlets that differ from the default | |
| reorderQuantity | Yes | How many to suggest ordering |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only declare write/safe/local), the description discloses replace-not-duplicate semantics on repeated calls, the refusal behavior when the supplier doesn't carry the item, the company-wide default vs per-outlet override model, and the critical non-effect that nothing is ordered or emailed automatically. This is exactly the behavioral context structured fields cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five sentences, each carrying distinct information (trigger, idempotency, precondition, override rationale, safety caveat), with the core action front-loaded. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with no output schema, the description covers what it mutates, what it refuses, how repeated calls behave, and what downstream action it does and does not trigger. An agent has everything needed to call it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds meaning the schema lacks: what lowStockPoint/reorderQuantity jointly do, that thresholds are company-wide by default, and that outletOverrides exists specifically for outlets that differ. It stops short of detailing the inherit-on-omit fallback.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('watch one item and suggest reordering it when stock runs low') with the exact trigger (below lowStockPoint) and quantity (reorderQuantity). Clearly distinguishable from hub_remove_reorder_rule and hub_get_reorder_suggestions in the sibling 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?
Gives a concrete precondition (supplier must already carry the item, verified via get_supplier_items) and explains when to use outletOverrides ('a busy store may need a higher one than a quiet one'). It does not explicitly name the sibling to use for removal or suggestion retrieval, so it stops short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_suggest_tax_rateSuggest tax rateARead-onlyInspect
Look up the statutory headline rate for a country (and US state / Canadian province). Answers 'what should I charge in Ontario', 'what is the VAT in Germany'. This is a reference lookup — it changes NOTHING and creates nothing; use create_tax_rate to actually charge it. Report the confidence and any note back to the merchant verbatim: local / city taxes are not included and the merchant, not you, decides the real rate.
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | US state or Canadian province code, e.g. "NY", "ON". Needed for US and CA | |
| country | Yes | Two-letter ISO country code, e.g. "US", "CA", "DE" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/destructive profile, and the description adds substantive behavior beyond them: the tool returns `confidence` and `note` that must be relayed verbatim, local/city taxes are excluded, and the merchant decides the final rate. That is exactly the extra context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and the not-a-mutation warning, then layers examples and output-handling instructions. Every sentence earns its place, though the output-handling clause is somewhat dense in a single sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by explaining the `confidence` and `note` return fields and the exclusion of local taxes — the two things an agent would otherwise get wrong. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and already documents both `country` and `state` including the 'needed for US and CA' caveat, so the schema carries the parameter burden. The description's mention of country/state/province adds no syntax beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('look up') and resource ('statutory headline rate for a country / US state / Canadian province'), and explicitly distinguishes itself from hub_create_tax_rate. The example phrasings ('what should I charge in Ontario') make the scope 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?
Explicitly states when to use it and when not to: 'this is a reference lookup — it changes NOTHING and creates nothing; use create_tax_rate to actually charge it.' Names the alternative tool and the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_sync_order_to_ecommerceSync order to storeADestructiveInspect
Push one order to the company's connected online store (WooCommerce): creates it there the first time, updates it afterwards, and syncs its notes. Use ONLY when the merchant says an order is missing from or stale in their online store — 'this sale never showed up in WooCommerce'. CONFIRM WITH THE MERCHANT BEFORE CALLING, naming the order: it writes into their live store and nothing here can undo it. It changes NOTHING in Final POS — it is not a way to change status, cancel an order or refund anything. Companies with no supported platform connected get a no-op.
| Name | Required | Description | Default |
|---|---|---|---|
| orderId | Yes | Order id from get_orders — not a receipt number |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and openWorldHint=false, but the description adds material context beyond them: a mandatory merchant confirmation step naming the order, irreversibility ('nothing here can undo it'), the upsert-on-repeat behavior, and the no-op outcome for companies with no supported platform connected. That is exactly the pre-write risk disclosure an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then scope, then the safety gate, then the exclusions and the edge case. Every sentence carries a distinct obligation (confirm, irreversibility, no-op) with no restatement of the name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must set expectations about results — and it does, via the create/update lifecycle and the no-op case for unconnected platforms. Combined with the confirmation and irreversibility warnings, an agent has everything required to invoke this write safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter and schema description coverage is 100%, so the schema already documents that orderId comes from get_orders and is not a receipt number. The description adds only the indirect hint that the order should be named during confirmation; baseline 3 is appropriate when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Push one order to the company's connected online store (WooCommerce)') and goes further by spelling out the upsert lifecycle: created on first call, updated afterwards, notes synced. This distinguishes it from hub_sync_refund_to_ecommerce and the read-only hub_get_order siblings without needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when: 'Use ONLY when the merchant says an order is missing from or stale in their online store', with a quoted merchant utterance as a concrete trigger. Explicit when-not: 'It changes NOTHING in Final POS — it is not a way to change status, cancel an order or refund anything', which also steers refund cases toward hub_sync_refund_to_ecommerce.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_sync_refund_to_ecommerceSync refund to storeADestructiveInspect
Push a refund that ALREADY exists in Final POS to the connected WooCommerce store, so the online order shows as refunded there. Takes the REFUND id from get_refunds — the order id will not work. CONFIRM WITH THE MERCHANT BEFORE CALLING: it creates a refund on their live store, there is no undo from here, and calling it twice creates a second refund there. It does NOT move money back to the customer and it does NOT create a refund in Final POS — that happens on the POS terminal.
| Name | Required | Description | Default |
|---|---|---|---|
| refundId | Yes | Refund id from get_refunds — not an order id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag destructiveHint=true, but the description goes well beyond that: no undo from here, calling it twice creates a duplicate refund (idempotency warning), merchant confirmation required, and it is not a money movement. These are high-value operational facts the annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action then layers warnings; every sentence carries distinct information (scope, id source, confirmation/irreversibility, non-effects). The heavy capitalization is slightly noisy but functionally clarifying rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with no output schema, the description supplies everything an agent needs: precondition, input source, irreversibility, idempotency risk, human-confirmation gate, and explicit non-behaviors.
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 says 'not an order id', so the description's repetition alone would only rate baseline 3. It earns a 4 by naming get_refunds as the actual source of the identifier, which the schema does not state, closing the most likely invocation error.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (push/sync), resource (refund), direction (Final POS → connected WooCommerce store) and the resulting effect (online order shows as refunded). An agent can distinguish it from hub_sync_order_to_ecommerce and hub_get_refunds without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly scopes when to use it: only for a refund that ALREADY exists in Final POS, with the id sourced from get_refunds. It also names the when-not conditions (does not move money, does not create the POS refund — that is done on the terminal), which is exactly the exclusion guidance needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_uninstall_extensionUninstall extensionADestructiveInspect
Uninstall an extension from the company. Takes the extensionId from get_installed_extensions, never a name. CONFIRM WITH THE MERCHANT BEFORE CALLING, naming the extension: the install record is deleted for good — there is NO undo from here, and re-installing does not bring the extension’s own settings back. It also removes what the extension added to the cabinet (its menu entries and detail-page blocks disappear for every user) and runs the extension’s own teardown: WooCommerce stops syncing the store, Vendara and Zapier are disabled, TIMEmSYSTEM’s settings are deleted, Custom Payment queues a final invoice for the transactions already processed. Orders, products and customers that came in through the extension are NOT deleted. If the merchant only wants to stop using it for a while, tell them there is no pause — uninstall is the only option.
| Name | Required | Description | Default |
|---|---|---|---|
| extensionId | Yes | extensionId from get_installed_extensions — not a name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description goes far beyond: permanent deletion with no undo, reinstall does not restore the extension's own settings, cabinet menu entries and detail blocks vanish for every user, and per-extension teardown behavior is spelled out (WooCommerce sync stops, Vendara/Zapier disabled, TIMEmSYSTEM settings deleted, Custom Payment queues a final invoice). It also clarifies the blast radius boundary — orders, products and customers are NOT deleted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then the parameter source, then the confirmation warning, then consequences — a sensible order for a destructive tool. It is long, but nearly every clause carries distinct operational information; the only mild redundancy is the repeated extensionId/not-a-name instruction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with no output schema, the description supplies everything an agent needs: input provenance, confirmation protocol, irreversibility, cascade effects per integration, and what survives the uninstall. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema property already says 'extensionId from get_installed_extensions — not a name', so the description largely restates it. The reinforcement is useful for a destructive call but adds no new syntax or format detail beyond the structured field, making baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Uninstall an extension from the company') and immediately scopes it against sibling operations by requiring the extensionId from get_installed_extensions rather than a name. An agent can distinguish this from hub_install_extension and hub_get_installed_extensions without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states a precondition (CONFIRM WITH THE MERCHANT BEFORE CALLING, naming the extension), a required input source, and an alternative path for the 'pause' intent (there is no pause — uninstall is the only option, so tell the merchant). Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_unlink_modifier_from_categoryStop asking a modifier on a categoryADestructiveInspect
Stop asking a modifier in one category. The modifier itself survives and keeps working everywhere else — use delete_modifier to remove it entirely. Takes the LINK id from get_category_modifiers, not the modifier id. If the category inherits the same modifier from a parent, the till keeps asking it; unlink it from the parent instead.
| Name | Required | Description | Default |
|---|---|---|---|
| categoryModifierId | Yes | Link id from get_category_modifiers — the link, NOT the modifier and NOT the category |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description still adds real value beyond that: it clarifies the scope of the destruction (the modifier survives elsewhere), which removes the ambiguity a plain destructive flag leaves. It does not discuss permissions or any restore path, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action, followed by the sibling alternative, the id requirement, and the inheritance caveat. No filler; each sentence changes how the tool would be called.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive mutation with no output schema, the description covers the action, its side-effect scope, the correct id to supply, the sibling alternative, and the non-obvious parent-inheritance case. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter at 100% schema description coverage, the schema already documents the field thoroughly. The description's warning to pass the LINK id rather than the modifier id reinforces the schema's own note but adds no new syntax or format detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action on a specific resource: stop asking a modifier in one category. It explicitly contrasts itself with delete_modifier ("The modifier itself survives and keeps working everywhere else — use delete_modifier to remove it entirely"), so an agent can distinguish it from the sibling delete tool without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the alternative (delete_modifier) and the condition that selects it (wanting to remove the modifier entirely), and it additionally covers the inheritance case with its own alternative ("unlink it from the parent instead"). Both when-to-use-this and when-to-use-something-else are explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_update_categoryUpdate categoryADestructiveInspect
Rename a category, change its description or image, move it under a different parent, or set its sortOrder. Takes the category id from get_categories, never a name. Only the fields you pass are changed. parentId can only MOVE the category under another one; making an existing subcategory top-level again is not supported here, and neither is it in the cabinet. A category synced from an integration (WooCommerce and the like) is read-only and will be refused — it has to be changed in that platform. This never touches which products are in the category; that lives on the product (update_product, categoryIds).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| image | No | Image URL or "lucide:<icon>" reference | |
| parentId | No | New parent id from get_categories. Cannot be the category itself or one of its own subcategories | |
| sortOrder | No | Position among its siblings, lowest first | |
| categoryId | Yes | Category id from get_categories — not a name | |
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint=false / destructiveHint=true annotations: it discloses partial-update semantics, the read-only behavior of integration-synced categories that will be refused, the unsupported de-nesting operation, and the explicit guarantee that product membership is untouched.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what the tool changes, then constraints. Every sentence carries a distinct, actionable constraint; nothing is filler despite 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?
For a mutation tool with no output schema, it covers partial updates, refusal conditions, and cross-tool boundaries, which is everything an agent needs to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the description reinforces that categoryId must come from get_categories and is never a name, plus explains parentId's MOVE-only semantics. Image/description/name parameters get no additional semantics, but the key ambiguity is resolved.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a concrete verb+resource pair and enumerates the exact mutable fields (name, description, image, parentId, sortOrder). It is unmistakably distinct from siblings like hub_create_category, hub_delete_category, and hub_reorder_categories.
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 prerequisites (id from get_categories, never a name), partial-update behavior (only passed fields change), and two hard refusal cases (un-making a subcategory top-level, integration-synced categories). It also routes the agent away from product membership work to update_product with categoryIds.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_update_category_modifierChange a modifier’s rules on a categoryAInspect
Change how a modifier is asked in ONE category — required, min, max, order — leaving every other category alone. Omit a field to leave it as it is; pass null to min or max to CLEAR that limit. The two are different, so be deliberate. The platform tidies the combination and reports what it actually stored: turning required on sets a minimum of 1, any minimum of 1 or more turns required on, and a "Pick one" modifier keeps no min or max at all. Read the result rather than assuming your input was kept. required: false together with a minimum of 1 or more is a contradiction and is refused.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | null clears the cap | |
| min | No | null clears the minimum | |
| required | No | ||
| sortOrder | No | ||
| categoryModifierId | Yes | Link id from get_category_modifiers — the link, NOT the modifier and NOT the category |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic write profile (readOnly=false, destructive=false, openWorld=false). The description goes well beyond them: it discloses the platform's normalization rules (required=true forces min 1; min>=1 forces required=true; 'Pick one' keeps neither), the fact that contradictions are refused, and that the returned state may differ from the input, advising the agent to read the result. This is exactly the kind of behavior structured fields cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and scope, then parameter semantics, then normalization behavior, then the refusal rule. Every clause carries usable information — omit vs null, required/min coupling, contradiction refusal — with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description explicitly tells the agent that the platform reports what it actually stored and that the agent should read the result rather than assume the input was kept. Combined with the normalization and refusal rules, an agent has everything needed to call this correctly and interpret the outcome.
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 60% (max, min, categoryModifierId documented; required and sortOrder not). The description compensates by explaining the critical omit-vs-null distinction and the required/min coupling, which are not derivable from the schema. It never explains sortOrder semantics (direction/relative ordering), so it falls one step short of complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (change how a modifier is asked) and pins the exact scope: rules for ONE category, leaving every other category alone. That scope distinction is what separates it from the sibling hub_update_modifier, which changes the modifier itself rather than the per-category link.
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 'ONE category — leaving every other category alone' framing tells the agent when this tool is the right one versus editing the modifier globally, and the omit-vs-null rule plus the refusal condition give clear operating context. It stops short of naming an alternative tool explicitly, so it is clear context rather than full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_update_customerUpdate customerADestructiveInspect
Change contact details on an existing customer. Takes the customer ID from get_customers, never a name. Only the fields you pass are changed, but an address you pass REPLACES the stored one whole — read it back with get_customer first and resend the parts that should stay. Notes are not editable here: use add_customer_note.
| Name | Required | Description | Default |
|---|---|---|---|
| No | |||
| phone | No | ||
| billing | No | Replaces the stored billing address | |
| lastName | No | ||
| shipping | No | Replaces the stored shipping address | |
| firstName | No | ||
| customerId | Yes | Customer id from get_customers — not a name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag destructiveHint=true, and the description adds the crucial non-obvious semantics that annotations cannot convey: unspecified fields are left alone, but a passed address replaces the stored one whole, forcing a read-back-and-resend workflow. It does not cover permissions/auth requirements or what happens on an unknown customer ID, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each carrying a distinct constraint, front-loaded with the operation and back-loaded with the escape hatches (read-back, notes elsewhere). No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema and nested objects exposed, the description covers the destructive replace behavior and the ID sourcing that would otherwise cause data loss. Missing only error/permission outcomes, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 43%, but the description compensates for the riskiest gap: the billing/shipping objects are write-whole, not field-merged, and the customerId must be an ID rather than a name. The remaining scalar fields (email, phone, firstName, lastName) are self-explanatory and left to the schema, which is acceptable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Change contact details on an existing customer') and immediately distinguishes itself from siblings by naming get_customers as the ID source and add_customer_note for notes. An agent can tell this apart from hub_create_customer, hub_delete_customer, and hub_add_customer_note without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit prerequisites and routing: take the ID from get_customers (never a name), read the address back with get_customer before passing one, and notes must go to add_customer_note instead. Covers both when-to-use and when-not-to-use with the named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_update_modifierEdit modifierADestructiveInspect
Rename a modifier and/or REPLACE its whole choice list. Passing choices is a full replacement: whatever you send becomes the list and anything you leave out is DELETED. Read get_modifier first and send the complete set back, keeping each choice’s id so prices and till history stay attached. To change one choice, use update_modifier_choice instead — it is safer and cannot drop the others. selectionType and allowQuantity cannot be changed; a modifier that needs a different kind of answer has to be created fresh. Renaming alone never breaks a rule; replacing choices can, and is refused with an explanation if it would.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New name. Must stay unique for the merchant, ignoring case | |
| choices | No | The COMPLETE new choice list. Omitting this leaves the choices untouched | |
| modifierId | Yes | Modifier id from get_modifiers |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag destructiveHint=true; the description adds far more: choices are a full replacement with omitted entries DELETED, renaming is safe but choice replacement can be refused with an explanation, and ids must be preserved to keep prices and till history attached. This is exactly the extra context a destructive tool needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the destructive replacement warning, then layers prerequisites, the safer alternative, immutability, and refusal behavior in tight sentences. Every sentence carries actionable information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no output schema and full schema coverage, the description supplies the warnings, prerequisites, immutable-field limits, and refusal behavior an agent needs to call it safely. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning beyond the schema — it explains why choiceId must be kept (prices and till history stay attached) and clarifies replacement semantics for the choices array. The name uniqueness and immutability constraints are covered largely by 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 first sentence states a specific verb and resource ('Rename a modifier and/or REPLACE its whole choice list') and precisely delineates scope. It is immediately distinguishable from siblings like hub_update_modifier_choice, hub_create_modifier, and hub_delete_modifier_choice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use update_modifier_choice for single-choice edits because it is 'safer and cannot drop the others', and read get_modifier first before sending the complete set. It also states what cannot be done (selectionType/allowQuantity) and that such cases require creating fresh.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_update_modifier_choiceEdit a choiceAInspect
Change one choice — its name, price, whether it is pre-selected, or where it is sold. Everything you leave out stays as it is. unavailableOutletIds is the exception list and REPLACES the stored one: pass [] to make the choice available everywhere again. Marking a choice unsold somewhere can be refused if a category requires more choices than would remain available at every outlet.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| price | No | New extra charge, e.g. "0.90". Pass "0" to make it free | |
| choiceId | Yes | Choice id from get_modifier | |
| isDefault | No | ||
| sortOrder | No | ||
| modifierId | Yes | Modifier id from get_modifiers | |
| defaultQuantity | No | ||
| unavailableOutletIds | No | REPLACES the exception list. [] = sold at every outlet |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say this is a non-read-only, non-destructive, closed-world mutation. The description adds genuine behavioral detail beyond that: merge semantics for supplied fields, the fact that unavailableOutletIds REPLACES rather than appends (the destructive part of an otherwise non-destructive annotation), the [] reset escape hatch, and a server-side refusal condition. No contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the operation and its editable fields, then immediately states the merge rule, then the exception-list semantics, then the refusal caveat. Each sentence carries distinct, non-redundant information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutation with no output schema and only 50% schema coverage, the description covers the update contract, the risky replace semantics, and the failure mode well. The remaining gap is sortOrder/defaultQuantity, whose behavior an agent must infer or find in the reorder sibling tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%, and the description clarifies isDefault ('pre-selected') and outlet availability ('where it is sold') while restating the replace behavior already documented on unavailableOutletIds and price. sortOrder and defaultQuantity remain undocumented in both schema and description, so the description only partially compensates for the coverage 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?
States a specific verb and narrow resource ('Change one choice') and then enumerates exactly which attributes can be changed (name, price, pre-selection, outlet availability). This clearly separates it from hub_add_modifier_choice and hub_delete_modifier_choice, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong context for how to call it: it is a partial update, so omitted fields are left untouched, and it warns that unselling a choice can be refused by category rules. It does not explicitly route the agent to siblings such as hub_reorder_modifier_choices, so it stops short of full when/when-not/alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_update_outletUpdate outletADestructiveInspect
Change the details of one outlet. Takes the outlet id from get_outlets, never a name. Only the fields you pass are changed; the rest are left alone. Renaming is safe and takes effect everywhere, including past orders and reports — they store the outlet id and look the name up. Country cannot be changed here: it belongs to the company. An alias that is already set cannot be changed either and the attempt is refused. Stripe account linking is not editable from here.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | ||
| name | No | New outlet name | |
| alias | No | Only settable while it is still empty | |
| phone | No | ||
| state | No | State or province | |
| taxId | No | Business tax number printed on this outlet’s receipts (BN / GST / HST / VAT / EIN) | |
| address | No | Street address | |
| address2 | No | Unit, suite or floor | |
| outletId | Yes | Outlet id from get_outlets — not a name | |
| postCode | No | ZIP / postal code |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true), the description discloses genuinely useful behavior: partial-update semantics (only passed fields change), that renaming propagates to past orders/reports because they store the id, and that attempts to change a set alias are refused. This meaningfully softens the destructive hint, though it doesn't explain what the destructive aspect actually refers to.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and id rule, followed by the partial-update guarantee and then the constraint list. Every sentence carries information, though the run of constraints could be tightened slightly.
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 10-parameter mutation tool with no output schema, the description covers the highest-risk knowledge an agent needs: id sourcing, partial-update behavior, rename propagation, and three non-editable fields. It does not explain the destructiveHint=true flag or any permission requirements, leaving a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 80%, so the schema documents most parameters. The description adds real value for outletId (source is get_outlets, never a name) and for alias (only settable when empty), matching the baseline of 3 with modest compensation for the remaining coverage 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?
States a specific verb and resource ("Change the details of one outlet") and immediately scopes it against siblings by stating the id source (get_outlets) rather than a name. An agent can distinguish this from hub_create_outlet, hub_update_product, and hub_delete_outlet without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: obtain the id from get_outlets, and lists three things that cannot be done here (country, an already-set alias, Stripe linking), which steers the agent away from futile attempts. It does not formally name an alternative tool for those excluded actions, 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.
hub_update_productUpdate productADestructiveInspect
Change fields on an existing product. Takes the product ID — get it from get_products, never guess. Only the fields you pass are changed. Prices are HUMAN strings like "24.99". Variant fields (price, sku, barcode): for a product with several variants use variants with the ids from get_products; plain price/sku/barcode work only when there is exactly one variant.
| Name | Required | Description | Default |
|---|---|---|---|
| sku | No | New SKU, only for a single-variant product | |
| name | No | ||
| price | No | New price, only for a single-variant product | |
| status | No | e.g. "active" or "draft" | |
| barcode | No | New barcode, only for a single-variant product | |
| variants | No | Per-variant changes; ids and labels come from the variants list in get_products | |
| outletIds | No | ||
| productId | Yes | Product id from get_products — not a name | |
| categoryIds | No | ||
| description | No | ||
| shortDescription | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so safety is covered. The description usefully adds patch semantics ("Only the fields you pass are changed"), which is behavioral context not present in annotations, but it says nothing about permissions, whether removed values are recoverable, or how variant/plain-field conflicts are resolved. Adds value without being rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action, then prerequisites, then the two risky edge cases (price format, variant handling) in four tight sentences with no filler. Slightly dense but every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter mutation with no output schema and partial schema coverage, the description covers the highest-risk ambiguities (id sourcing, human-formatted prices, variant vs plain-field exclusivity). The remaining gap is semantics for the unannotated array parameters (categoryIds, outletIds) and the meaning of status transitions.
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 only 55%, the description compensates well: it specifies the price format ("HUMAN strings like \"24.99\""), clarifies productId is an id not a name, and explains the crucial rule that plain price/sku/barcode only work for single-variant products while multi-variant products must use `variants`. It leaves categoryIds/outletIds and status values ("active"/"draft" are only in schema) unaddressed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Change fields on an existing product") that cleanly separates it from hub_create_product, hub_delete_product and the read tools. It does not name those siblings explicitly, but the resource and action 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?
Gives concrete preconditions ("Takes the product ID — get it from get_products, never guess") and routing for variants. It stops short of explicitly contrasting with hub_create_product or hub_add_product_images, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_update_purchase_orderEdit purchase orderADestructiveInspect
Rewrite an order that has not been sent yet. ONLY works while it is suggested or draft — a sent or received order is refused, because the supplier already has it. This REPLACES the whole order: the lines and charges you pass become the order, and anything you leave out is dropped. Read it with get_purchase_order first and send the full set back. This is also how a suggestion is ACCEPTED: editing a suggested order turns it into a draft and gives it its PO number. To accept one unchanged, pass its existing lines back verbatim.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | The complete new set of lines | |
| notes | No | ||
| discount | No | Flat discount on the whole order, e.g. "25.00". Not with discountPercent | |
| dutyFees | No | Duty / customs charged on the order | |
| outletId | Yes | Outlet id the goods will be received into | |
| customFees | No | Any other named charge on the order, e.g. "Handling" | |
| supplierId | Yes | Supplier id — normally the order’s current supplier | |
| shippingFee | No | Shipping charged on the order, e.g. "18.00" | |
| expectedDate | No | ||
| discountPercent | No | Discount as a percentage of the items subtotal | |
| purchaseOrderId | Yes | Purchase order id from get_purchase_orders — not a PO number |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, but the description goes well beyond that: it explains the replacement semantics ('anything you leave out is dropped'), the status transition (suggested → draft plus PO number assignment), and the reason for refusal. This is exactly the context an agent needs to avoid data loss.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five tight sentences, each carrying a distinct fact (scope, precondition, replacement semantics, prerequisite read, accept flow). The most important constraint is front-loaded in sentence two.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no output schema, the description covers preconditions, data-loss semantics, and the secondary accept workflow. Nothing an agent needs in order to invoke it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 82%, so the schema already carries most parameter documentation. The description adds the crucial mental model for the `lines`/charges parameters — that the passed set becomes the whole order and omissions are dropped — which shapes how an agent must populate them, though it adds no per-field syntax detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Rewrite an order') and immediately scopes it to orders that have not been sent. It distinguishes itself from sibling operations like hub_create_purchase_order, hub_send_purchase_order, and hub_receive_purchase_order by naming the exact statuses it accepts.
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?
Explicit when (status `suggested` or `draft`), when-not (sent/received orders are refused), and the prerequisite workflow ('Read it with get_purchase_order first and send the full set back'). It also documents the non-obvious accept-a-suggestion path and how to accept unchanged.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_update_roleUpdate roleADestructiveInspect
Change what a role allows, or rename it. This is the tool for "let cashiers give discounts" or "stop them seeing the reports" — it changes things for EVERY person on that role at once, so name them from get_roles when you confirm. PERMISSIONS ARE POWER. Confirm with the merchant first, naming the person and the role out loud ("give Maria the Manager role — yes?"), and never act on a role change you inferred rather than were asked for. The change is live on the next request: rights are re-read from the role every time, so no one logs out and no agent key stops working — including yours, if the change reaches your own account. Grant and revoke by permission id: grant ids from get_permissions, revoke ids from the role’s granted list in get_roles. Permissions you do not mention are left exactly as they are. You cannot edit the role you are signed in under — the cabinet locks it too, because it decides your own powers. Ask someone on another role. To move one person instead of changing the role, use assign_role.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New name for the role | |
| roleId | Yes | Role id from get_roles | |
| grantPermissionIds | No | Permission ids to switch ON | |
| revokePermissionIds | No | Permission ids to switch OFF |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag destructiveHint=true, but the description adds far more: the change takes effect on the next request with no logout, unmentioned permissions are preserved, and you cannot edit the role you are signed in under. These are non-obvious side effects and constraints an agent needs before invoking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then routing, then constraints, so the ordering is sound. Some rhetorical padding ('PERMISSIONS ARE POWER', the cabinet metaphor, the repeated confirmation instruction) costs a little density but each paragraph still carries usable guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no output schema, the description covers effect timing, preservation of unlisted fields, self-role restriction, id sourcing, and the alternative tool. Nothing an agent needs to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics: grant ids come from get_permissions, revoke ids come from the role's granted list in get_roles, and permissions not listed are left untouched. That sourcing and default-behavior detail is not in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ('change what a role allows, or rename it') and gives concrete examples of the change ('let cashiers give discounts'). It explicitly distinguishes itself from the closest sibling by naming assign_role for per-person changes, so an agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit about when to use it (role-wide permission changes), when not to (single-person changes → assign_role), and the required preconditions: confirm with the merchant, name the person and role, and never act on an inferred change. Also names the hard exclusion of editing your own signed-in role.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_update_supplierUpdate supplierADestructiveInspect
Change one supplier’s details. Only the fields you pass change; the rest are left alone, and a blank string is ignored rather than blanking the stored value. Renaming is safe — past purchase orders store the id and look the name up. A name already used by another supplier of this company is refused. This does NOT change item costs: those live on the supplier–item link, so use link_supplier_items to re-price.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | ||
| name | No | ||
| notes | No | ||
| phone | No | ||
| state | No | ||
| country | No | ||
| address1 | No | ||
| address2 | No | ||
| postCode | No | ||
| supplierId | Yes | Supplier id from get_suppliers — not a name | |
| contactName | No | ||
| contactEmail | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint=false and destructiveHint=true; the description adds substantive semantics beyond that — partial-patch behavior ('only the fields you pass change'), blank-string handling that avoids accidental clearing, name-uniqueness refusal, and rename safety because purchase orders store the id. It stops short of stating auth/permission requirements or the response shape, which is the only reason it isn't a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five tight sentences, front-loaded with the core action and immediately followed by the most error-prone semantics (patch behavior, blank handling). Every sentence carries information; the name-related content is split across two sentences but neither is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter mutation with 8% schema coverage and no output schema, the description covers the semantics an agent most needs: partial update, blank handling, uniqueness conflict, and the cross-sibling boundary for costs. Return values aren't required without an output schema. Remaining omissions are per-field expectations and auth requirements.
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 8% (just supplierId documents 'id from get_suppliers — not a name'), so the description must compensate for 11 undocumented fields. It explains the update semantics (passed vs. omitted, blank ignored) but never describes what individual fields like contactEmail or postCode expect or constrain. Field names are largely self-descriptive, so the gap is tolerable but real.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource with singular scope: 'Change one supplier's details.' It also distinguishes itself from a close sibling by explicitly carving out item-cost changes to link_supplier_items. The only minor gap is that 'details' is elaborated only later, but the boundaries are clear enough to route without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-not with a named alternative: 'This does NOT change item costs... use link_supplier_items to re-price.' That is a concrete routing rule. It doesn't address other near-neighbors (e.g., create_supplier, delete_supplier) or prerequisites like permissions, but the primary alternative is covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_update_tax_groupUpdate tax groupADestructiveInspect
Rename a tax group, make it the standard one, or change the ORDER its rates are charged in. Takes the tax group id from get_taxes, never a name. Order matters for money: a compounding rate is charged on the running total including everything above it, so reordering changes what customers pay. rateIdsInOrder must list exactly the rate ids already in the group, once each — it reorders, it never adds or removes. Use add_tax_rate_to_group / remove_tax_rate_from_group for that. CONFIRM WITH THE MERCHANT before reordering or changing the standard group. Sales already rung up are NOT recalculated — this only affects sales from now on.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New name for the group | |
| isStandard | No | Make this the company default group | |
| taxGroupId | Yes | Tax group id from get_taxes — not a name | |
| rateIdsInOrder | No | Every rate id currently in the group, in the new charging order. A permutation, nothing else |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, and the description goes well beyond that by explaining the money impact (compounding on a running total, reordering changes what customers pay), the non-retroactive scope ("Sales already rung up are NOT recalculated"), and the exact-input constraint that rateIdsInOrder cannot add or remove rates. This is the kind of consequence detail an agent must have before invoking a destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the three things the tool does, then layers the consequence, the input constraint, the alternative tools, the merchant-confirmation rule, and the retroactivity caveat. Every sentence is functional, though the all-caps emphasis and length make it denser than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter, no-output-schema mutation with destructiveHint, the description covers inputs, consequences, prerequisites, and alternatives completely enough to call correctly. It does not address failure modes (e.g. a nonexistent or mismatched taxGroupId), which is the only notable gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it clarifies that taxGroupId must come from get_taxes rather than a name, and that rateIdsInOrder is a strict permutation of existing rates with no additions or removals. These restate the intent behind the terse schema descriptions rather than adding new syntax, so it lands just above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verbs and resource up front (rename a tax group, make it the standard one, change rate charging order), which lets an agent distinguish it from hub_update_tax_rate and hub_create_tax_group. It also explicitly distinguishes itself from the add/remove siblings in the same domain.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite ("Takes the tax group id from get_taxes, never a name"), explicit exclusions routed to named alternatives ("Use add_tax_rate_to_group / remove_tax_rate_from_group for that"), and an explicit confirmation requirement before reordering or setting the standard group.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_update_tax_rateUpdate tax rateADestructiveInspect
Change a tax rate’s name or its percentage. Takes the tax rate id from get_taxes, never a name. THE RATE IS SHARED: this changes EVERY tax group that lists it, not just the one the merchant was talking about. Call get_taxes first, tell them exactly which groups are affected, and get an explicit yes. If they only meant one group, the answer is a separate rate via create_tax_rate, not this tool. percentage sets the same value at every outlet. perOutlet REPLACES the stored per-outlet list whole — an outlet you leave out STOPS charging this rate, so read the current values back with get_taxes and resend every outlet that should keep charging. Sales already rung up are NOT recalculated — this only affects sales from now on. Reports and receipts for past sales keep the old rate.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New name for the rate | |
| perOutlet | No | Outlet-specific percentages, using outlet ids from get_taxes. REPLACES the stored list whole — an outlet you leave out stops charging this rate | |
| taxRateId | Yes | Tax rate id from get_taxes — not a name | |
| percentage | No | New percentage at every outlet, e.g. 13 for 13% |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag destructiveHint=true but the description goes far beyond that: it explains the shared-rate blast radius across every tax group, that perOutlet REPLACES the stored list whole and omitted outlets stop charging, and that past sales, receipts and reports are not recalculated. This is exactly the blast-radius detail an agent needs before a destructive call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and every sentence carries a consequence for calling the tool, though the perOutlet replacement warning is stated twice (prose and schema) and the all-caps emphasis is slightly heavy. Dense rather than wasteful, but not maximally tight.
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 still covers everything needed to call safely: identifier source, sharing blast radius, destructive replacement semantics, confirmation requirement, and the retroactivity boundary. Nothing material is missing for a 4-parameter destructive tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: 'percentage sets the same value at every outlet' clarifies how the scalar interacts with the array, and the perOutlet guidance tells the agent to read current values back and resend every outlet that should keep charging. That procedural semantics is not derivable from 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?
States a specific verb and resource ('Change a tax rate's name or its percentage') and immediately scopes the identifier source ('takes the tax rate id from get_taxes, never a name'). It also explicitly distinguishes itself from the create_tax_rate sibling when only one group was intended.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition ('Call get_taxes first'), a required confirmation step ('tell them exactly which groups are affected, and get an explicit yes'), and names the alternative tool with the condition that selects it ('If they only meant one group, the answer is a separate rate via create_tax_rate').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_update_userUpdate team memberADestructiveInspect
Change a team member's own details: name, phone, till PIN, and which outlets they work at. Takes the userId from get_team, never a name. Only the fields you pass change, but outletIds REPLACES their whole outlet list — read it back from get_team first and resend the ones that should stay, or you will quietly cut someone off from a location. Email cannot be changed here at all (the sign-in identity is not rotated, so the old address would keep working) — the merchant has to remove and re-invite the person. This tool does NOT change permissions: for that use assign_role.
| Name | Required | Description | Default |
|---|---|---|---|
| phone | No | ||
| userId | Yes | User id from get_team — not a name | |
| pincode | No | New till PIN, 4 to 6 digits | |
| lastName | No | ||
| firstName | No | ||
| outletIds | No | Replaces the outlets they may work at, ids from get_outlets. Omit to leave untouched |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply destructiveHint=true and readOnlyHint=false; the description goes well beyond that by disclosing patch semantics ('only the fields you pass change'), the destructive replace behavior of outletIds with its silent failure mode, and the fact that email is immutable because sign-in identity is not rotated. That is exactly the kind of consequence detail annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the operation and fields, then the warnings in descending severity; the em-dash asides are slightly dense but each sentence carries distinct, decision-relevant information. No filler or restated title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter mutation tool with no output schema, the description covers prerequisites, destructive semantics, and adjacent-tool routing. It does not mention permission/role requirements for the caller or what the response returns, which are minor but real gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50% and the description compensates: it explains which fields are editable, the role of userId (id not name), and the replace-vs-omit semantics of outletIds including the consequence of misuse. It does not add format or constraint detail for phone/pincode beyond what the schema already carries.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Change a team member's own details') and enumerates the mutable fields: name, phone, till PIN, outlet assignments. The negative scoping ('does NOT change permissions') cleanly separates it from assign_role and hub_update_role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit prerequisites (userId comes from get_team, never a name), a mandatory pre-read workflow for outletIds, and names the alternative tool for the adjacent task (assign_role). It also states the one thing the tool cannot do and the manual workaround for it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hub_upload_mediaUpload imagesAInspect
Store image files from public URLs in the media library so the merchant can use them later. Returns the stored URL of each file. JPEG/PNG/WebP/GIF, up to 20MB each. This ONLY stores the files — it attaches them to nothing. If the merchant wants a photo ON A PRODUCT, use add_product_images instead: it uploads AND attaches in one step, and doing it here first would upload the same picture twice. Use this one when they just want the file kept — a logo, a banner, a picture for later. A file uploaded here may not appear on the cabinet's Media screen, which is fed by a separate service; the file is stored and its URL works regardless.
| Name | Required | Description | Default |
|---|---|---|---|
| imageUrls | Yes | Public URLs of the images to store |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (non-read-only, non-destructive, closed-world); the description adds substantial behavioral context beyond that: accepted formats and 20MB size cap, the fact that files are stored but attached to nothing, and the caveat that the file may not surface on the cabinet's Media screen because that view is fed by a separate service.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then routing guidance, then constraints, then a caveat — a logical order. It is longer than strictly necessary and repeats the 'store only' idea, but nearly every sentence earns its place for a tool with a subtle overlap risk.
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 states the return value (stored URL per file) and the format/size limits; with annotations covering safety, nothing an agent needs to invoke this correctly is missing. The Media-screen caveat closes the one surprising behavioral gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is self-documented, so the schema carries most of the load. The description nonetheless reinforces that inputs are public URLs and that multiple files are handled per call ('the stored URL of each file'), adding mild value over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Store image files ... in the media library') and immediately draws the boundary against the sibling hub_add_product_images. An agent can distinguish this from hub_add_product_images and hub_get_media_library without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('when they just want the file kept — a logo, a banner, a picture for later'), when-not ('This ONLY stores the files — it attaches them to nothing'), and the named alternative with its tradeoff ('use add_product_images instead ... doing it here first would upload the same picture twice').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_packsList packsBRead-onlyInspect
Every tool pack with its product, description, tool count and whether it is allowed for this connection and listed right now.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the agent knows this is a safe, non-networked read. The description adds useful state context — it reports whether each pack is allowed for this connection and currently listed — but says nothing about ordering, filtering, or result size.
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 compact sentence with the resource front-loaded and the returned fields listed inline. It is a sentence fragment rather than a full sentence, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description partially compensates by enumerating the fields returned, which is the main thing an agent needs for a zero-param list tool. What is missing is the guidance on what to do with the result, e.g. routing to enable_packs/disable_packs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. There is no parameter surface for the description to clarify, and the schema is trivially complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (every tool pack) and enumerates the fields returned (product, description, tool count, allowed/listed status), so an agent knows exactly what this yields. It does not, however, distinguish itself from siblings such as find_tools or the enable_packs/disable_packs pair, which is the remaining gap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance, and no mention of the obvious complementary tools (enable_packs, disable_packs, find_tools). The agent must infer from the description alone that this is a discovery/inspection step before mutating pack state.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
switch_companySwitch companyAIdempotentInspect
Choose the company Hub tools act on, by id or name (get_connection lists them). Remembered on this connection.
| Name | Required | Description | Default |
|---|---|---|---|
| company | Yes | Company id or name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), so the bar is lower. The description adds genuinely new behavioral context: the selection is 'Remembered on this connection,' disclosing session-scoped persistence that the annotations do not 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?
One sentence, front-loaded with the action and its scope, with the lookup pointer in parentheses. Nothing is wasted and nothing needed is omitted.
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, annotation-covered state tool with no output schema, the description covers action, scope, valid-value source, and persistence. It is slightly thin on whether switching mid-session affects other pending state, but that is a marginal gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'company' param already says 'Company id or name.' The description goes beyond the schema by telling the agent where to obtain valid values (get_connection lists them), which is the one thing the schema does not provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (switch/choose the company) and the exact consequence: it determines which company all Hub tools subsequently act on. It also names the sibling that enumerates valid values (get_connection), so an agent can distinguish it from the hub_* family without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Hub tools act on' makes the usage context clear: call this before/among hub_* operations to scope them. It points to get_connection as the source of valid choices, but never states explicit when-not conditions or what happens to in-flight calls from the previous company.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
177 tool updates
- First observed
ask_finai - First observed
call_tool - First observed
call_write_tool - First observed
disable_packs - First observed
enable_packs - First observed
find_tools - First observed
flow_apply_blueprint_widgets - First observed
flow_apply_upstream_update - First observed
flow_connect_chat - First observed
flow_create_custom_table - First observed
flow_create_flow - First observed
flow_create_flow_from_blueprint - First observed
flow_delete_flow_files - First observed
flow_deploy_flow - First observed
flow_get_blueprint - First observed
flow_get_preview_status - First observed
flow_get_scaffold - First observed
flow_get_upstream_status - First observed
flow_get_upstream_update - First observed
flow_install_extension - First observed
flow_list_blueprints - First observed
flow_list_custom_tables - First observed
flow_list_extension_custom_tables - First observed
flow_list_extension_surfaces - First observed
flow_list_extensions - First observed
flow_list_flows - First observed
flow_list_secret_keys - First observed
flow_log_message - First observed
flow_lookup_command_frame - First observed
flow_lookup_engine_component - First observed
flow_lookup_pos_api - First observed
flow_open_in_builder - First observed
flow_read_flow_files - First observed
flow_rename_flow - First observed
flow_request_secret - First observed
flow_search_blueprints - First observed
flow_start_preview - First observed
flow_stop_preview - First observed
flow_sync_preview - First observed
flow_update_custom_table - First observed
flow_validate_flow - First observed
flow_write_flow_files - First observed
get_connection - First observed
hub_add_customer_note - First observed
hub_add_modifier_choice - First observed
hub_add_product_images - First observed
hub_add_tax_rate_to_group - First observed
hub_adjust_stock - First observed
hub_assign_role - First observed
hub_cancel_booking - First observed
hub_cancel_purchase_order - First observed
hub_confirm_booking - First observed
hub_create_booking_resource - First observed
hub_create_booking_rules - First observed
hub_create_category - First observed
hub_create_customer - First observed
hub_create_modifier - First observed
hub_create_outlet - First observed
hub_create_product - First observed
hub_create_product_option - First observed
hub_create_purchase_order - First observed
hub_create_role - First observed
hub_create_station - First observed
hub_create_stock_transfer - First observed
hub_create_supplier - First observed
hub_create_tax_group - First observed
hub_create_tax_rate - First observed
hub_create_user - First observed
hub_delete_category - First observed
hub_delete_customer - First observed
hub_delete_media_file - First observed
hub_delete_modifier - First observed
hub_delete_modifier_choice - First observed
hub_delete_outlet - First observed
hub_delete_product - First observed
hub_delete_role - First observed
hub_delete_station - First observed
hub_delete_supplier - First observed
hub_delete_tax_group - First observed
hub_delete_tax_rate - First observed
hub_export_records - First observed
hub_export_stock_csv - First observed
hub_find_low_stock - First observed
hub_get_booking_availability - First observed
hub_get_booking_events - First observed
hub_get_booking_resources - First observed
hub_get_booking_rules - First observed
hub_get_categories - First observed
hub_get_category_modifiers - First observed
hub_get_customer - First observed
hub_get_customer_orders - First observed
hub_get_customers - First observed
hub_get_employee_orders - First observed
hub_get_employee_sales - First observed
hub_get_extension_catalog - First observed
hub_get_extension_surfaces - First observed
hub_get_financial_summary - First observed
hub_get_installed_extensions - First observed
hub_get_linkable_items - First observed
hub_get_media_library - First observed
hub_get_modifier - First observed
hub_get_modifiers - First observed
hub_get_order - First observed
hub_get_order_count - First observed
hub_get_orders - First observed
hub_get_outlets - First observed
hub_get_payment_methods_breakdown - First observed
hub_get_permissions - First observed
hub_get_product_booking_setup - First observed
hub_get_product_options - First observed
hub_get_products - First observed
hub_get_purchase_order - First observed
hub_get_purchase_orders - First observed
hub_get_receive_progress - First observed
hub_get_refunds - First observed
hub_get_reorder_suggestions - First observed
hub_get_roles - First observed
hub_get_sales_breakdown - First observed
hub_get_session_report - First observed
hub_get_sessions - First observed
hub_get_station - First observed
hub_get_stations - First observed
hub_get_stock - First observed
hub_get_stock_history - First observed
hub_get_stock_transfer - First observed
hub_get_stock_transfers - First observed
hub_get_supplier - First observed
hub_get_supplier_items - First observed
hub_get_suppliers - First observed
hub_get_suppliers_for_product - First observed
hub_get_taxes - First observed
hub_get_team - First observed
hub_get_transactions - First observed
hub_hold_booking - First observed
hub_import_categories - First observed
hub_import_customers - First observed
hub_import_options - First observed
hub_import_outlets - First observed
hub_import_products - First observed
hub_import_stock_csv - First observed
hub_install_extension - First observed
hub_link_modifier_to_category - First observed
hub_link_supplier_items - First observed
hub_receive_purchase_order - First observed
hub_receive_stock_transfer - First observed
hub_record_received_goods - First observed
hub_remove_reorder_rule - First observed
hub_remove_tax_rate_from_group - First observed
hub_remove_user - First observed
hub_rename_station - First observed
hub_reorder_categories - First observed
hub_reorder_category_modifiers - First observed
hub_reorder_modifier_choices - First observed
hub_send_purchase_order - First observed
hub_set_product_booking_setup - First observed
hub_set_reorder_rule - First observed
hub_suggest_tax_rate - First observed
hub_sync_order_to_ecommerce - First observed
hub_sync_refund_to_ecommerce - First observed
hub_uninstall_extension - First observed
hub_unlink_modifier_from_category - First observed
hub_update_category - First observed
hub_update_category_modifier - First observed
hub_update_customer - First observed
hub_update_modifier - First observed
hub_update_modifier_choice - First observed
hub_update_outlet - First observed
hub_update_product - First observed
hub_update_purchase_order - First observed
hub_update_role - First observed
hub_update_supplier - First observed
hub_update_tax_group - First observed
hub_update_tax_rate - First observed
hub_update_user - First observed
hub_upload_media - First observed
list_packs - First observed
switch_company
Publisher details
- Operator
- Final Commerce Inc. (Final POS) · Publisher source
- Operator website
- https://finalpos.com
- Vendor relationship
- First-party
- Documentation
- https://github.com/Final-Commerce/final-pos-mcp
- Trust center
- Unknown
- Restrictions
- Requires a Final account (free to create at https://flow.finalpos.com/continue). Users choose the company and tool packs at OAuth sign-in, and every call runs with their own Final role. Usage follows the merchant's Final plan. Taking payments, refunds and voids is not available over MCP.
Related MCP Connectors
Hosted MCP for e-commerce: live product catalog, stock, and pricing for AI agents.
Build, validate, deploy — HTTP APIs, cron jobs, webhooks and MCP tools — from your AI client.
MCP server for Modern Treasury — payment orders, transactions, counterparties and ledgers.
MCP server for Boson Protocol — on-chain agentic commerce for physical & digital goods.
Related MCP Servers
- AlicenseAqualityBmaintenancePayment infrastructure MCP server enabling AI agents to make gasless USDC payments on Base and JIT single-use virtual card checkouts, with zero-trust card handling, merchant checkout hints, and signed receipts.13602 npm1MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that lets restaurants operate their point-of-sale through an LLM agent — edit menus, 86 items, check sales, restock inventory, monitor voids, and more via twenty tools over both stdio and Streamable HTTP transports with per-request tenancy from API keys.Apache 2.0
- FlicenseNot gradedqualityBmaintenanceThis MCP server enables AI agents to discover local businesses, inspect their offerings, prices, availability, hours, and contact or fulfillment options, and open real orders or bookings through the businesses’ own systems and checkout links.1-
- AlicenseNot gradedqualityCmaintenanceA remote MCP server that lets a coding agent turn a plain-language idea into a real, shareable product — creating the project and data model, serving live API endpoints, deploying custom endpoints and server-side functions, and reading request and function logs. It handles sign-up, OAuth-backed access, and OpenAPI spec generation so people can open, sign into, and use the app the agent builds.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.