RoboTrunk
Server Details
Search independent stores, check recalls and product facts, and prepare checkout at the store.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
TDQS
Scored across 23 tools
The product-information cluster (check_product, check_listing, check_fit, ask_product_manual, get_product, enrich_product, compare_products) genuinely overlaps, but each description draws explicit boundaries with 'Not for X; use Y' cross-references, which makes selection tractable. The checkout and watch families are cleanly separated. A few boundaries (check_product vs check_listing vs check_fit) still require careful reading, so not perfect.
Every tool is snake_case verb_noun following a small, predictable verb set (get_, check_, create_/update_/complete_/cancel_, watch_/stop_, search_/compare_/enrich_/submit_). The only mild liberty is 'watch' used as a verb, but it is applied consistently across watch_back_in_stock/watch_recalls and their get_/stop_ counterparts.
23 tools is on the heavy side, but the surface spans a genuinely broad domain (catalog search, product research, manual QA, fit checks, listing checks, a full checkout lifecycle, two watch types, and meta tools). Nearly every tool has a distinct role with paired lifecycle methods, so the count is justified rather than padded.
The checkout lifecycle (create/update/get/complete/cancel/order) and both watch lifecycles (start/get/stop) are fully covered, and product discovery, research, and safety checks are well represented. The main gap is post-purchase ops: get_order explicitly notes shipping, cancellation, and refund status are not readable, which could dead-end an agent handling those cases.
Available Tools
23 toolsask_product_manualAsk one product's manual a questionARead-onlyIdempotentInspect
Asks one product's maker manual a specific question and returns the matching passage word for word, with the manual's link, the page and the section heading where the retained text has them, or says plainly that the manual does not cover it. Use when a shopper asks something the manual decides (installation, weight and height limits, age range, care, safety) about a product you hold a product_id for. Not for browsing; use search_catalog. It answers only from manuals RoboTrunk has read and checked, and never guesses. Error recovery: PRODUCT_NOT_FOUND means the store or product is not available through RoboTrunk right now (paused, or a wrong id), not that it is missing, so call search_catalog; INVALID_REQUEST names the field to fix; RATE_LIMITED means wait 60 seconds; unavailable means try again shortly; unverified means read the listed document or ask again; not_covered or no_manual means the manual does not answer it, so read the product's page with get_product; MANUAL_ASK_FAILED (or any other unexpected error): retry once, then call submit_feedback. Next: get_product, or create_checkout. Full guide: get_tool_guide or /agent/tools.json#ask_product_manual Example call: {"merchant":"anbbaby-com","product_id":"gid://shopify/Product/1234567890","question":"What is the maximum weight for the seat?"}
| Name | Required | Description | Default |
|---|---|---|---|
| merchant | Yes | The store slug from the earlier search_catalog result. | |
| question | Yes | The person's question in plain words. | |
| product_id | Yes | The product_id from search_catalog or get_product, or its bare numeric Shopify id. Example: "gid://shopify/Product/1234567890" or "1234567890", never a page link. | |
| shopping_session_id | No | Optional server-issued shopping session correlation ID. It is not purchase authority. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: it answers only from manuals RoboTrunk has read and checked, never guesses, and returns verbatim passages rather than paraphrases. The exhaustive error-recovery mapping (PRODUCT_NOT_FOUND, INVALID_REQUEST, RATE_LIMITED with a 60s wait, not_covered, MANUAL_ASK_FAILED) is exactly the behavioral disclosure the readOnly/idempotent hints 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 purpose and return shape, then usage, then exclusions, then error recovery. It is dense and long, but nearly every sentence carries operational value; the only mild bloat is the trailing 'Next:' and guide pointers, which are cheap to keep.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 does so fully (verbatim passage, manual link, page, section heading, or an explicit not-covered signal). Combined with the error taxonomy and follow-up routing (get_product, submit_feedback), an agent has everything needed to call and recover 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 schema already documents all four parameters and the baseline would be 3. The description adds modest value: it clarifies product_id provenance ('try a product you hold a product_id for') and supplies a full example call showing merchant/product_id/question formatting, nudging it 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 (asks) and resource (one product's maker manual) and specifies the return shape: the matching passage word for word with link, page, and section heading. It explicitly distinguishes itself from browsing by naming the sibling search_catalog, 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?
Gives concrete trigger conditions ('installation, weight and height limits, age range, care, safety') plus the prerequisite (a product you hold a product_id for), an explicit exclusion ('Not for browsing'), and the alternative to use instead (search_catalog). 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.
cancel_checkoutCancel a prepared checkoutADestructiveIdempotentInspect
Declines a prepared checkout, returning status canceled: it asks the store to cancel that checkout. Use when the person declines, so a refusal is a recorded outcome rather than an inferred one. Not for reversing a payment: RoboTrunk holds no stock and charges nothing. Not for after approval; use get_order. Next: search_catalog for something else, or submit_feedback to say why. Error recovery: not_found (the demo) or CHECKOUT_NOT_FOUND (a store's checkout) means that checkout was never prepared here, so call create_checkout; continuation_not_found or RUN_AUTH_REQUIRED means send checkout_id exactly as an earlier answer returned it and, if you did, the checkout can no longer be read from here, so call create_checkout again; UCP_MERCHANT_BUSY, UCP_MERCHANT_REFUSED or UCP_MERCHANT_UNAVAILABLE means the store did not take the cancel, so try again shortly; on the demo a failed decline record is only a warning and the cancel still stands; any other error, including tool_layer_failure: retry once, then call submit_feedback. For RoboTrunk's test demo checkout (merchant null) it closes the checkout here and records the decline. Full guide: get_tool_guide or /agent/tools.json#cancel_checkout Example call: {"checkout_id":"the checkout_id create_checkout returned","reason":"Above the person's ceiling"}
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Why the checkout was declined, or null. Free text up to 300 characters; do not put personal data here. | |
| checkout_id | Yes | The `checkout_id` returned by `create_checkout` in this browser. | |
| shopping_session_id | No | Optional server-issued shopping session correlation ID. It is not purchase authority. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, idempotentHint=true and openWorldHint=true, yet the description adds substantial context beyond them: that no stock is held and no payment is charged, that retries are safe ('retry once'), that on the demo a failed decline record is only a warning while the cancel still stands, and a full error-code taxonomy (not_found, CHECKOUT_NOT_FOUND, continuation_not_found, UCP_MERCHANT_BUSY, tool_layer_failure) with prescribed recovery per 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?
Front-loaded correctly: purpose, then usage/exclusions, then recovery, then demo behavior and an example. It is long and the error-recovery block is dense, but nearly every sentence carries actionable routing 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 still tells the agent the returned status ('canceled'), the demo-vs-real-merchant distinction, idempotent retry behavior, and per-error-code recovery. An agent has everything needed to call it 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 100%, so the baseline is 3, but the description adds real meaning: it clarifies checkout_id must be sent exactly as an earlier answer returned it, that a missing continuation means the checkout can no longer be read, and it demonstrates both checkout_id and reason in a concrete example 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 ('Declines a prepared checkout, returning status canceled') and immediately scopes what it does at the store ('asks the store to cancel that checkout'). It is clearly distinguishable from siblings like create_checkout, complete_checkout and get_order, which are named in the text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 ('Use when the person declines, so a refusal is a recorded outcome rather than an inferred one') plus two explicit exclusions with alternatives ('Not for reversing a payment... Not for after approval; use get_order'), and it routes to next steps (search_catalog, submit_feedback). 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.
check_fitCheck whether a listing fits somethingARead-onlyIdempotentInspect
Asks whether one listing fits a named thing, such as a car, pram or bottle, and answers yes, no or not_known, from the listing's published checked facts and its own store page only. A yes or no always carries the exact quote it was read from and that quote's source; not_known means nothing RoboTrunk holds settles it. Never a guess. Use when a shopper asks whether a listing fits something they own; take merchant and product_id from search_catalog. For what the maker's manual says, fit included, use ask_product_manual: this tool reads only the listing and its store page. Confirm with the maker before relying on a fit for safety. Error recovery: PRODUCT_NOT_FOUND means the store or product is not available through RoboTrunk right now (paused, or a wrong id), not that it is missing, so call search_catalog; INVALID_REQUEST names the field to fix; RATE_LIMITED means wait 60 seconds; unavailable means try again shortly; FIT_ASK_FAILED (or any other unexpected error): retry once, then call submit_feedback. Next: get_product, or create_checkout. Full guide: get_tool_guide or /agent/tools.json#check_fit Example call: {"merchant":"anbbaby-com","product_id":"gid://shopify/Product/1234567890","fits":"2022 Toyota RAV4"}
| Name | Required | Description | Default |
|---|---|---|---|
| fits | Yes | The thing to check fit against, in plain words, such as a car, pram or bottle. | |
| merchant | Yes | The store slug from the earlier search_catalog result. | |
| product_id | Yes | The product_id from search_catalog or get_product, or its bare numeric Shopify id. Example: "gid://shopify/Product/1234567890" or "1234567890", never a page link. | |
| shopping_session_id | No | Optional server-issued shopping session correlation ID. It is not purchase authority. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld/idempotent annotations, it discloses the answer contract (a yes/no always carries an exact quote and its source; not_known means nothing settles it; never a guess), the source scope (listing and store page only), a safety caveat, and a full error-recovery map including RATE_LIMITED wait 60 seconds. That is substantial behavior the annotations do not cover.
Agents need to know what a tool does to the 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 answer semantics are front-loaded, and the routing/error content is genuinely useful, so little is wasted. It is nonetheless one dense block that crams quoting rules, safety advice, five error codes and next-step tools together, which slightly taxes 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-value burden well: it explains the three possible answers and that yes/no include the verbatim quote and source. Combined with the error-code recovery and next-tool pointers, an agent has everything needed to invoke and interpret the call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents fits, merchant, product_id and shopping_session_id. The description adds provenance and meaning beyond the schema—where merchant/product_id come from (search_catalog) and that the check is scoped to the listing, not the manual—but does not clarify the optional session 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 gives a concrete verb (asks/checks) and resource (one listing vs. a named thing) and defines the answer space (yes, no, not_known). It explicitly distinguishes itself from the sibling ask_product_manual, so an agent can route between the two without opening their 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 when to use it ('when a shopper asks whether a listing fits something they own'), where to source inputs ('take merchant and product_id from search_catalog'), and names the alternative with its selecting condition ('For what the maker's manual says ... use ask_product_manual'). Prerequisites and exclusions are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_listingCheck a second-hand listingAIdempotentInspect
You read the listing; RoboTrunk checks it. Use it for a second-hand listing on Facebook Marketplace or any other marketplace, such as a used car seat, cot, pram or heater: it adds a recall check and the sourced facts the listing leaves out, which can help the person decide. Send the listing's title, price, description and seller's notes as listing_text (and up to three photos), read with a Marketplace tool such as facebook-cli if you have one, otherwise a browser. One call returns the exact model; whether a product-safety regulator has recalled it, with the notice; what the listing leaves out (specifications, the maker's manual, expiry where the maker sets one, what to inspect in person, known problems), each with its source; and what the same product costs new against the asking price. If the exact product cannot be identified, the answer is not_identified and nothing is guessed: ask the person for the brand and model. If the person wants a second-hand listing checked but has not shared it yet, the check needs its link or text. If the person gives only a link, send it as listing_link: RoboTrunk never fetches Facebook Marketplace links, so when the answer is listing_text_required, read the listing yourself, first with a Facebook Marketplace tool if you have one, such as facebook-cli, and only otherwise in a browser, and call again with its title, price, description and seller notes as listing_text plus the link; if you cannot read it without logging in or passing a CAPTCHA, ask the person to paste those details. Other public pages RoboTrunk reads directly. Amazon links are never fetched. If resource.leaves_out.state is pending, call again in about a minute for the rest. Error recovery: invalid_request names the field to fix; not_identified means ask the person for the brand and model and call again; unavailable with hourly_bound_full means wait and try later, any other unavailable means try again shortly; check_listing_failed (or any other unexpected error): retry once, then call submit_feedback. Next: check_product with the identified brand and model, or search_catalog to shop for it new. Full guide: get_tool_guide or /agent/tools.json#check_listing Example call: {"listing_text":"DaVinci Kalani 4-in-1 convertible crib in white. Used for one child, all hardware and the toddler rail included, a few teething marks on the top rail. Mattress not included.","asking_price":{"amount":90,"currency":"USD"},"country":"US"}
| Name | Required | Description | Default |
|---|---|---|---|
| photos | No | Up to three data:image/jpeg|png|webp;base64 images, at most 2 MB each decoded. | |
| country | No | Two-letter buyer country, such as US. | |
| asking_price | No | The listing's asking price, when it states one. Example: {"amount": 90, "currency": "USD"} for $90: the amount as written (89.5 for $89.50), not cents. | |
| listing_link | No | A listing link; public pages can be read without signing in. For a Facebook Marketplace link, read the listing with a Marketplace tool such as facebook-cli if you have one and send its text as listing_text too. | |
| listing_text | No | The listing's own words as the person sees them. | |
| shopping_session_id | No | Optional server-issued shopping session correlation ID. It is not purchase authority. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), but the description adds substantial behavior beyond them: what gets returned, that it never fetches Facebook Marketplace or Amazon links, that other public pages are read directly, the pending/leaves_out.state polling rule, and a full error-recovery map (invalid_request, not_identified, unavailable/hourly_bound_full, check_listing_failed -> retry once then submit_feedback).
Agents need to know what a tool does to the 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 before the branching detail, and organized into recognizable phases (usage, inputs, returns, error recovery, next steps, example). It is long, and the instruction to read the listing yourself with facebook-cli-then-browser is restated in two places, so it is slightly repetitive rather than 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 complex tool with no output schema, the description must carry the return contract, and it does: it enumerates the exact outputs (identified model, recall status with notice, what the listing leaves out with sources, new-price comparison) and explains the not_identified and pending outcomes. Combined with the error map and next-step routing, nothing an agent needs to call and interpret this correctly 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 baseline is 3, but the description adds real semantic guidance beyond the schema: it says exactly which listing fields to pack into listing_text (title, price, description, seller notes), that up to three photos go with it, and that a bare link should be sent as listing_link with the text supplied additionally. This is additive routing guidance the schema alone does not express.
Input schemas describe structure but not intent. Descriptions should explain 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 ('check a second-hand listing') and immediately frames the division of labor: 'You read the listing; RoboTrunk checks it.' It names the concrete examples (used car seat, cot, pram, heater) and explicitly separates itself from siblings check_product and search_catalog, which are named as follow-on 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 (any marketplace listing), when-not (Amazon links are never fetched; Facebook Marketplace links are never fetched), and precise fallbacks (read the listing with facebook-cli first, browser only otherwise; ask the person to paste details if login/CAPTCHA blocks it). It also covers the prerequisite case where the person has not yet shared the listing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_productCheck one product before buying itAIdempotentInspect
Answers one question about one product: send its name, barcode, any product page link or a RoboTrunk reference. Returns the checked facts with a source for each, the live recall status, every store selling the same variant with the cheapest not sold out, and the exact create_checkout arguments; with a country, landed_cost adds price_plus_delivery (not a total). It helps before recommending or buying a product, wherever it is sold: on any product the person is weighing, it adds the live recall check, the checked facts and the price new to what you already know. For a second-hand listing they have in front of them, use check_listing, which runs this check on the listing's text. Not for browsing; use search_catalog. Use resource.recall.status as the recall headline. For lookup_pending, wait about 60 seconds and use its exact-input check_product action once; for identification_pending, wait about 15 seconds and use that action once. If it remains pending or incomplete, stop automatic retries. A found result stays the headline; listings_read[] is historical and does not override it. lookup_incomplete and lookup_skipped have no retry action; recall_lookup_incomplete means the live lookup ended without a complete result. none_found_after_lookup is not a safety guarantee. Next: create_checkout with resource.next_step.arguments (choose a variant or offer first when next_step says so); the answer also lifts that step to next_actions and suggested_tools. Error recovery: invalid_request names the field to fix; not_identified means ask the person for the product's page link or its brand and model, then call again (gtin_not_known: send a store link instead of the barcode); ambiguous means show the person the candidates and call again with the one they choose; not_found or not_indexed means call again with the product's name; unavailable means an unlisted check may be tried once later with the same inputs; if it remains unavailable, stop automatic retries and tell the person the check did not run. A candidate's reference or a link on a store RoboTrunk offers needs no model; rate_limited means wait the seconds it names; check_failed means retry once, then use search_catalog and get_product; checked_not_listed is not a failure: relay the recall result and say RoboTrunk does not sell it; any other error, including tool_layer_failure: retry once, then call submit_feedback. Full guide: get_tool_guide or /agent/tools.json#check_product Example call: {"product":"Nuna PIPA urbn infant car seat","buyer_country":"US"}
| Name | Required | Description | Default |
|---|---|---|---|
| country | No | ISO country code the person has said the item is going to, so the cheapest offer from a store shipping there is chosen. Null if not said; never guess. | |
| product | Yes | The product's name in the person's words, its barcode, any product page link, or a RoboTrunk reference. One product. | |
| postcode | No | With buyer_country or country: postcode the person has said, used only to price shipping and never stored. Null when not said; never guess. | |
| buyer_country | No | Shopper's ISO country: what you know, else your best guess; unknown if none. Left out, it is read as unknown and the answer asks you to send it. Example: "AU", "US" or "unknown", never a country name. | unknown |
| buyer_country_basis | No | Optional, with buyer_country: known if you know the country, guessed if it is your best guess. Null if neither. | |
| shopping_session_id | No | Optional server-issued shopping session correlation ID. It is not purchase authority. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds what annotations provide: pending-state timeouts (60s lookup_pending, 15s identification_pending), retry stop conditions, rate-limit handling, the fact that postcode is never stored, recall-result precedence over listings_read[], and the caveat that none_found_after_lookup is not a safety guarantee. Nothing here contradicts readOnlyHint=false / idempotentHint=true.
Agents need to know what a tool does to the 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, siblings and next steps are front-loaded, but the body is a very long error-code catalog (invalid_request, not_identified, ambiguous, not_found, not_indexed, unavailable, rate_limited, check_failed, checked_not_listed, tool_layer_failure) that largely duplicates the referenced full guide. It is dense but not wasteful in intent, so it lands at a middling score rather than failing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 returns (checked facts with sources, live recall status, sellers with cheapest in-stock, exact create_checkout arguments) plus full recovery behavior. An agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3; the description still adds interpretation beyond the schema, notably that a supplied country makes landed_cost add price_plus_delivery rather than a total, and that a candidate reference or store link needs no model. It does not add new syntax for the remaining params.
Input schemas describe structure but not intent. Descriptions should explain 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: 'Answers one question about one product', with the accepted input forms enumerated. It explicitly distinguishes itself from check_listing and search_catalog, 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 ('before recommending or buying a product, wherever it is sold') and when-not ('Not for browsing; use search_catalog'; second-hand listings go to check_listing). Alternatives are named with the condition that selects them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_productsCompare products on checked factsAIdempotentInspect
Writes a comparison of products RoboTrunk lists, now, from their checked facts: a short answer, a table with one row per product and a cited fact in every cell, each value with its source link. Name two to eight products, or leave products out and send only a question ("lightest travel strollers", "car seats that fit a small car") and RoboTrunk finds the listed products with checked facts that the question is about. The first call asks for it and answers started; call again with exactly the same arguments and it answers done with the comparison (usually within a minute), or running while it is still being written. Every value in it is a checked fact with its source; nothing is invented, and prices and stock are not in it. The comparison is kept and published at a page address RoboTrunk's pages and sitemap carry. Use it for a side-by-side of checked facts on products the person is choosing between, including ones found with search_catalog; it can help them decide. A named product needs checked facts: enrich_product starts research on one that has none. Error recovery: INVALID_REQUEST names the field to fix; PRODUCT_NOT_FOUND means a named product is not listed, so call search_catalog; NO_CHECKED_FACTS names the products to research with enrich_product or leave out; COMPARE_KEY_LIMIT, COMPARE_ADDRESS_LIMIT and COMPARE_BUSY say how long to wait, then call again; COMPARE_UNAVAILABLE means comparisons are not running, so compare with check_product; a failed answer carries COMPARE_FAILED or COMPARE_NOT_STARTED and says why: if it says no product, or only one product, with checked facts is about the question, ask a different question or search_catalog, otherwise call once more; COMPARE_FAILED_UNEXPECTEDLY (or any other unexpected error): retry once, then call submit_feedback. Next: get_product for price and stock, then create_checkout. Full guide: get_tool_guide or /agent/tools.json#compare_products Example call: {"products":[{"merchant":"anbbaby-com","product_id":"gid://shopify/Product/1234567890"},{"merchant":"strolleria-com","product_id":"gid://shopify/Product/9876543210"}],"question":"Which folds smallest for a plane?"}
| Name | Required | Description | Default |
|---|---|---|---|
| products | No | Two to eight different listed products to compare. Leave out (or send null or an empty list) to send only a question. Example: [{"merchant": "anbbaby-com", "product_id": "gid://shopify/Product/1234567890"}, {"merchant": "strolleria-com", "product_id": "gid://shopify/Product/9876543210"}]. | |
| question | No | What the person wants to know. Optional with products; required when products is left out, and then RoboTrunk finds the products it is about. | |
| shopping_session_id | No | Optional server-issued shopping session correlation ID. It is not purchase authority. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, idempotentHint=true), the description discloses the asynchronous job pattern (first call returns started, a repeat with identical args returns done/running 'usually within a minute'), idempotency semantics, and persistence ('kept and published at a page address'). It also constrains content ('nothing is invented, and prices and stock are not in it'), which the annotations cannot convey. 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, async behavior, and alternatives are front-loaded before the error taxonomy, and the dense error-recovery block earns most of its length given there is no output schema or structured error field. It loses a point for minor redundancy such as the inline 'Example call' that duplicates the schema's own example and the pointer to the full guide.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 specifies the return value (short answer, one-row-per-product table, cited facts with source links, published page address), the polling pattern, and a per-error-code recovery path. Nothing an agent needs in order to call and re-call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 merchant, product_id, question, and the products array bounds. The description restates the 2–8 product range and the question-only mode rather than adding syntax or format detail beyond the schema. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource with its output shape: 'Writes a comparison of products ... a short answer, a table with one row per product and a cited fact in every cell.' It also distinguishes itself from siblings by naming search_catalog and check_product as alternatives. An agent can identify the tool's job 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 reach for it ('a side-by-side of checked facts on products the person is choosing between, including ones found with search_catalog') and when to route elsewhere, e.g. 'COMPARE_UNAVAILABLE means comparisons are not running, so compare with check_product.' Prerequisites are explicit: a named product needs checked facts, so enrich_product first for one that has none.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
complete_checkoutHand off to the store's checkout to payADestructiveIdempotentInspect
Creates a short-lived tracked payment handoff for a checkout at a store and returns its link. Use this when the checkout is ready to pay. The checkout can be finished in either of two ways: the person taps the link in their own browser, or you open it and complete the store's own checkout. human_tap.budget_ceiling_minor is the highest total, shipping and tax included, that RoboTrunk checked the store's total against, and RoboTrunk refuses the handoff with BUDGET_EXCEEDED when the store's total is above it. human_tap.affiliate.disclosure is present when an affiliate link applies. RoboTrunk never takes the payment or sees the card. The link goes through RoboTrunk straight to the store's own checkout, with no approval page, and can be opened again within its 30 minutes, each time landing on the same store checkout; a HEAD request or a request with a Purpose header gets an empty 204 and goes nowhere. Not for claiming an order was placed. Outputs: human_tap.url and the envelope. If the status is requires_escalation or the answer carries store_checkout_step, the store needs a step finished on its own checkout page: the link opens that page, and the step is finished there before paying, by the person or by you. With click_and_collect_on_store_page, keep this checkout's link to collect: the choice is on that page; send the person there, not to the store's website separately. Error recovery: buyer_identity_contact_method_required means send buyer.email from the person with update_checkout, then call this again; HANDOFF_NOT_AVAILABLE means the store has not supplied a handoff yet, so call get_checkout and try again later; CHECKOUT_NOT_FOUND, continuation_not_found or RUN_AUTH_REQUIRED means the handle cannot be used, so send checkout_id exactly as an earlier answer returned it and, if you did, call create_checkout again; HANDOFF_SESSION_INVALID means the link cannot be used, so call complete_checkout again for a new one; BUDGET_EXCEEDED means the store's total is now over the ceiling, so tell the person the new total and raise budget_ceiling_minor with update_checkout only on their new approval; IDEMPOTENCY_CONFLICT means use a new key only for a different request; any other error, including tool_layer_failure: retry once, then call submit_feedback. Next: read the result with get_checkout once the payment is made at the store; watch_recalls then watches the products for a recall. Full guide: get_tool_guide or /agent/tools.json#complete_checkout Example call: {"checkout_id":"ucp_transcend-dev-lab_abc123"}
| Name | Required | Description | Default |
|---|---|---|---|
| checkout_id | Yes | The UCP checkout id returned by an earlier checkout tool. | |
| idempotency_key | No | A printable ASCII key for safe retries, or null to generate one. | |
| shopping_session_id | No | Optional server-issued shopping session correlation ID. It is not purchase authority. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive, idempotent, and open-world traits, yet the description still adds real behavior: the 30-minute replayable link, the no-approval-page path, the HEAD/Purpose-header 204 dead-end, BUDGET_EXCEEDED refusal, and 'RoboTrunk never takes the payment or sees the card'. That is well beyond what the structured fields convey, though the budget/affiliate fields are output-surface details rather than caveats about the call itself.
Agents need to know what a tool does to the 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 and trigger are front-loaded, but the body is a dense single-block run-on that bundles handoff mechanics, output fields, and a long error-recovery catalog into one paragraph with no visual separation. Most clauses earn their place given the tool's complexity, yet the structure makes it harder to scan than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 return values (human_tap.url and the envelope), enumerating the error codes and their fixes, and pointing to the follow-up tools get_checkout and watch_recalls. An agent has everything needed to call it and recover from failure without consulting external docs, which remain linked as a fallback.
Complex tools with many parameters or behaviors need more documentation. Simple 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 would be 3, but the description adds operational meaning to the params: checkout_id must be sent 'exactly as an earlier answer returned it', and idempotency_key is constrained to a new key only for a different request. That is genuine semantics beyond the schema strings.
Input schemas describe structure but not intent. Descriptions should explain 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 — 'Creates a short-lived tracked payment handoff for a checkout at a store and returns its link' — which separates it cleanly from create_checkout, get_checkout, and update_checkout. The 'not for claiming an order was placed' clause further sharpens the boundary against neighboring 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 trigger ('Use this when the checkout is ready to pay'), two completion paths (person taps the link, or agent opens it), and an exclusion. The error-recovery block routes to alternatives by name (update_checkout, get_checkout, create_checkout, submit_feedback) with the condition that selects each.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_checkoutPrice a checkout at the storeAIdempotentInspect
Prepares a checkout at a named store and returns its envelope. merchant is the store slug search_catalog returned (required). Use when asked to buy, purchase or order. One checkout per store, all its products in line_items, each at the quantity the person wants (1 to 100); products from two stores make two checkouts; send the delivery address and the buyer's email (from the person, here or saved in your app) on this call, so the store prefills them and the first total includes delivery. Set budget_ceiling_minor here to the highest total, shipping and tax included, the person approved. Not for placing the order; complete_checkout issues the store link: the person taps it in their own browser, or you open it and complete the store's checkout. Next: if the store still asks for a detail, send what the person gives with update_checkout; read progress any time with get_checkout; when the status is ready_for_complete call complete_checkout. Error recovery: buyer_identity_contact_method_required means send buyer.email from the person with update_checkout; BUDGET_EXCEEDED means the store's total, shipping and tax included, is over budget_ceiling_minor: tell the person the total, then raise the ceiling with update_checkout once they approve, or call cancel_checkout (the checkout still exists); MERCHANT_REJECTED_INPUT names the field the store refused, so fix it and retry with a new idempotency_key; invalid_request names the field to fix; address_not_accepted means you left out merchant or sent null, so this ran RoboTrunk's test demo: add the store's merchant slug and call again; MERCHANT_NOT_FOUND means that store is not offered, so call search_catalog; out_of_stock means tell the person and call search_catalog; quote_expired or checkout_expired_or_invalid_state means call create_checkout again; idempotency_conflict means retry with a new idempotency_key or null; rate_limited means wait 60 seconds; price_not_fresh means retry in a minute; network_error means call again; UCP_MERCHANT_BUSY, UCP_MERCHANT_UNAVAILABLE or UCP_MERCHANT_REFUSED means try again shortly; payment_unavailable means call submit_feedback; any other error, including tool_layer_failure: retry once, then call submit_feedback. An explicit merchant: null runs RoboTrunk's test demo instead (one item, one test address, nothing charged). Full guide: get_tool_guide or /agent/tools.json#create_checkout Example call: {"merchant":"merchant-from-result","line_items":[{"product_id":"product-id-from-result","variant_id":"variant-id-from-result","quantity":2},{"product_id":"product-id-2-from-result","variant_id":"variant-id-2-from-result","quantity":1}],"buyer_country":"US","shipping_address":{"first_name":"first-name-from-person","last_name":"last-name-from-person","street_address":"street-from-person","address_locality":"city-from-person","address_region":"state-from-person","postal_code":"zip-code-from-person","address_country":"US"},"buyer":{"email":"email-from-person@example.com"}}
| Name | Required | Description | Default |
|---|---|---|---|
| buyer | No | Buyer fields for the named merchant, including the email it requires, or null. Example: {"email": "<the person's email>"}: the <...> is the person's own address, never invented. | |
| context | No | Optional merchant context such as destination or language, or null. The currency is the merchant's own and is never taken from a caller. | |
| merchant | Yes | The store slug search_catalog returned with the product. Required: a call without it is refused. Only an explicit null runs RoboTrunk's one-product test demo, which sells nothing. | |
| discounts | No | Discount codes for the store, or null. | |
| line_items | Yes | For a store: one line per product, up to 50, quantity 1 to 100 each; the store has the final say on stock. For the RoboTrunk demo (merchant null): exactly one line at quantity 1. Example: [{"product_id": "<product_id from search_catalog>", "variant_id": "<variant_id from the same result>", "quantity": 2}], the ids exactly as returned, never a page link. | |
| buyer_country | No | Shopper's ISO country: what you know, else your best guess; unknown if none. Left out, it is read as unknown and the answer asks you to send it. Example: "AU", "US" or "unknown", never a country name. | unknown |
| idempotency_key | No | 16 to 128 printable ASCII characters, or null to have the tool generate one. Each internal step gets its own suffixed key, so a repeat is safe. | |
| shipping_address | No | The person's shipping address, or null. Example: {"first_name": "<from the person>", "last_name": "<from the person>", "street_address": "<street>", "extended_address": "<apartment or suite, or null>", "address_locality": "<city>", "address_region": "<two-letter state code, such as CA>", "postal_code": "<ZIP code>", "address_country": "US"}: every <...> is the person's own value, never invented. | |
| buyer_country_basis | No | Optional, with buyer_country: known if you know the country, guessed if it is your best guess. Null if neither. | |
| shopping_session_id | No | Optional server-issued shopping session correlation ID. It is not purchase authority. | |
| budget_ceiling_cents | No | Demo only (merchant null); ignored at a store, so use budget_ceiling_minor there. Null otherwise. | |
| budget_ceiling_minor | No | The total the person approved, shipping and tax included, in minor units, or null. A store total above it is refused BUDGET_EXCEEDED; ask the person. Example: 24995 for a total of 249.95. | |
| budget_ceiling_currency | No | The ISO-4217 currency of the ceiling, or null for the merchant's own. Any other is refused, naming the merchant's. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the safety profile (idempotent, open-world, non-read-only), and the description goes well beyond them: one checkout per store, the idempotency-key/suffix behaviour that makes retries safe, the budget-ceiling refusal path, the demo mode triggered by explicit merchant:null, and a full error taxonomy with recovery actions. That is substantial added behaviour 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?
The purpose and routing are front-loaded, but the body is a single dense block that mixes usage, sequencing, a long error-code dictionary, and a full example call that duplicates the schema's own example. Most sentences carry weight, yet structure is poor and the duplicated example call does not earn its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 13 parameters, no output schema, and an open-world, likely-mutating operation, the description still covers prerequisites (merchant slug, address, email), limits (quantity 1–100, 50 lines, one store per checkout), the budget gate, the demo fallback, and a next-step/error-recovery map. Nothing essential for 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 description coverage is 100%, so a baseline of 3 is warranted, but the description adds real meaning: merchant must be the slug search_catalog returned, the delivery address and buyer email belong on this call so the first total includes delivery, and budget_ceiling_minor is the approved all-in total in minor units. Minor overlap with the schema examples keeps 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?
States a specific verb and resource ('Prepares a checkout at a named store and returns its envelope') and immediately scopes the boundary: it is not the tool that places the order. An agent can distinguish it from complete_checkout, update_checkout and get_checkout 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 trigger ('Use when asked to buy, purchase or order'), an explicit exclusion ('Not for placing the order; complete_checkout issues the store link'), a named handoff sequence (update_checkout, get_checkout, complete_checkout), and named alternatives in cancel_checkout and search_catalog. This is about as complete as usage routing gets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
enrich_productStart research on a product nowAIdempotentInspect
Starts research on one product RoboTrunk lists that has no checked facts yet, now, so the facts can be read in a few minutes. The first call starts it and answers started straight away, with an estimate of when it will be done once enough recent runs exist; it never waits for the research. Call this tool again with the same merchant and product_id at any time to see where it is up to: running (started at, expected by) or done. When it is done the checked facts, each with its source, are in check_product and on the product's page. Use it for a listed product that check_product or get_product shows with no checked facts: its sourced findings can help the person choose. A product that already has checked facts answers done and starts nothing, and a repeat call never starts a second research. Not for browsing; use search_catalog. Error recovery: INVALID_REQUEST names the field to fix; PRODUCT_NOT_FOUND means RoboTrunk does not list it, so call search_catalog; RESEARCH_KEY_LIMIT, RESEARCH_ADDRESS_LIMIT and RESEARCH_BUSY say how long to wait, then call again; RESEARCH_DAILY_LIMIT means no more can be started today, so carry on with check_product and say there are no checked facts; RESEARCH_PAUSED or RESEARCH_UNAVAILABLE means research is not running right now, so carry on without it and try again later; a failed answer carries RESEARCH_FAILED, RESEARCH_TIMED_OUT, RESEARCH_INTERRUPTED or RESEARCH_NOT_STARTED, so call again once to start it afresh; ENRICH_FAILED (or any other unexpected error): retry once, then call submit_feedback. Next: check_product to read the findings, then create_checkout. Full guide: get_tool_guide or /agent/tools.json#enrich_product Example call: {"merchant":"anbbaby-com","product_id":"gid://shopify/Product/1234567890"}
| Name | Required | Description | Default |
|---|---|---|---|
| merchant | Yes | The store slug, as search_catalog or get_product returned it. | |
| product_id | Yes | The product_id, as search_catalog or get_product returned it, or its bare numeric Shopify id. Example: "gid://shopify/Product/1234567890" or "1234567890", never a page link. | |
| shopping_session_id | No | Optional server-issued shopping session correlation ID. It is not purchase authority. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say non-read-only, open-world, idempotent, non-destructive; the description adds the substantive behavior: the call never blocks, it reports started/running/done states with an ETA once enough runs exist, a repeat call never starts a second run, and an already-researched product answers done and starts nothing — all consistent with idempotentHint=true. It also discloses quota and outage conditions (RESEARCH_KEY_LIMIT, DAILY_LIMIT, PAUSED, UNAVAILABLE) that no annotation communicates.
Agents need to know what a tool does to the 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, then poll semantics, then when-to-use, then exclusions, then errors, then next steps — well front-loaded and every block is actionable. The error-recovery enumeration is long and partly duplicated by the get_tool_guide pointer, so it could be tightened, but it is dense 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 an asynchronous, quota-limited, open-world mutation tool with no output schema, the description supplies everything an agent needs: non-blocking contract, state vocabulary, idempotency guarantee, failure taxonomy with recovery actions, and where results land. 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 description coverage is 100%, so the schema already explains merchant, product_id and the optional shopping_session_id precisely, including the bare-numeric-id allowance the description repeats. The description adds only usage-level meaning (pass the same merchant and product_id to poll) plus a literal example call, which is a small increment over structured data rather than new 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?
Specific verb and resource: starts research on one listed product that has no checked facts yet, and returns immediately. It explicitly distinguishes itself from check_product (which reads findings) and search_catalog (browsing), so an agent can place it among siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the exact trigger (a product that check_product or get_product shows with no checked facts), the anti-pattern ("Not for browsing; use search_catalog"), the polling pattern with the same arguments, and the follow-up path (check_product, then create_checkout). It goes further with a per-error-code recovery table, so nothing about when-to-call or what-to-do-on-failure is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_back_in_stock_watchRead a back-in-stock watchARead-onlyIdempotentInspect
Reads a back-in-stock watch's current state, from stored rows only: no store call, no model call, so it is cheap to poll often. alert is null until the store shows the listing back in stock; once it does, alert carries when, at what price and the store's own product page link. Use the watch_token watch_back_in_stock returned when the watch started. Error recovery: watch_not_found means the token is wrong or the watch does not exist, so there is nothing to recover; rate_limited means wait a minute and poll again; watch_failed (or any other unexpected error): retry once, then call submit_feedback. Next: when alert appears, read the listing with get_product and buy with create_checkout. Full guide: get_tool_guide or /agent/tools.json#get_back_in_stock_watch Example call: {"watch_token":"rwt_exampletokenvaluehere00000000000000000000000"}
| Name | Required | Description | Default |
|---|---|---|---|
| watch_token | Yes | The watch_token watch_back_in_stock returned when the watch started. | |
| shopping_session_id | No | Optional server-issued shopping session correlation ID. It is not purchase authority. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description goes well beyond them: it discloses that no store or model call happens, explains the alert lifecycle (null → populated with when/price/link), and enumerates failure modes and retry policy — exactly the behavioral 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 core purpose and polling economy before error recovery and next steps. Dense but each sentence earns its place; the example call is slightly redundant given the schema but harmless.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 alert payload fields (when, price, store product page link) and full error semantics, so an agent can both call and interpret the result without additional documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description's watch_token guidance ('use the watch_token watch_back_in_stock returned when the watch started') largely repeats the schema. The optional shopping_session_id is not addressed in the description at all. 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 ('Reads a back-in-stock watch's current state') and immediately scopes it ('from stored rows only: no store call, no model call'), which cleanly distinguishes it from siblings like watch_back_in_stock (creates) and stop_back_in_stock_watch (cancels).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says the tool is cheap to poll often, that alert is null until the store restocks, and lays out error recovery per error code (watch_not_found, rate_limited, watch_failed) plus the next-step chain (get_product, create_checkout). The agent knows when and why to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_checkoutRead a checkout at the storeARead-onlyIdempotentInspect
Reads the current state of a checkout at a store, by checkout_id. Use this when you need the latest merchant status after creation, update or payment at the store. Not for the demo checkout's id (merchant null); read that one with get_order. Outputs: resource, status, next_actions and suggested_tools. A status of requires_escalation, or the message store_checkout_step, means the store needs a step finished on its own checkout page: call complete_checkout; its link opens that page, and the step is finished there before paying, by the person or by you. With click_and_collect_on_store_page, keep this checkout's link to collect: the choice is on that page; send the person there, not to the store's website separately. Error recovery: buyer_identity_contact_method_required means send buyer.email from the person with update_checkout; NOT_A_RAIL_CHECKOUT means the id is not a ucp_ checkout, so call create_checkout with a merchant; continuation_not_found means that reference is unknown, expired (they last up to 24 hours) or from another environment, so call create_checkout again; RUN_AUTH_REQUIRED means checkout_id was not the reference an earlier answer returned, or the 24-hour run behind it has ended, so send it back exactly as given and, if you did, call create_checkout again; CHECKOUT_NOT_FOUND means that checkout cannot be read, so never guess an id; RATE_LIMITED means wait and retry; SERVICE_UNAVAILABLE or a store error (UCP_MERCHANT_BUSY, UCP_MERCHANT_UNAVAILABLE) means retry shortly; any other error, including tool_layer_failure: retry once, then call submit_feedback. Next: update_checkout while the status asks for details, complete_checkout when it is ready_for_complete. Full guide: get_tool_guide or /agent/tools.json#get_checkout Example call: {"checkout_id":"ucp_transcend-dev-lab_abc123"}
| Name | Required | Description | Default |
|---|---|---|---|
| checkout_id | Yes | The checkout handle an earlier UCP checkout tool returned as resource.id. Pass it back exactly as given. | |
| shopping_session_id | No | Optional server-issued shopping session correlation ID. It is not purchase authority. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false), yet the description adds substantial behavior: the returned fields, the 24-hour expiry of references, rate-limit and service-unavailable retry semantics, and a full error-code-to-remediation table. This is well beyond what structured fields 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 and the key get_order exclusion are front-loaded, and every clause carries actionable content, but the error-recovery material is compressed into a single dense run-on paragraph that is harder to scan than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 fields (resource, status, next_actions, suggested_tools) and covering the status states, escalation path, and error recovery, leaving nothing an agent needs 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 beyond the schema by tying checkout_id to an earlier tool's resource.id, emphasizing it must be returned exactly as given, and explaining that RUN_AUTH_REQUIRED signals a stale reference or expired 24-hour run.
Input schemas describe structure but not intent. Descriptions should explain 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 ('Reads the current state of a checkout at a store, by checkout_id') and explicitly distinguishes itself from the sibling get_order for the demo checkout. An agent can tell what this returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('after creation, update or payment at the store'), a when-not ('Not for the demo checkout's id ... read that one with get_order'), and downstream routing ('update_checkout while the status asks for details, complete_checkout when it is ready_for_complete').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_orderRead back an orderARead-onlyIdempotentInspect
Reads back a store's order: the status and the totals as the store recorded them, in the store's own currency, and whether the store's own record is behind them (order_source, merchant_read). Use after the person has paid at the store and you want to check the order exists and read it back. Pass order_id or checkout_id. A store checkout_id reads that checkout's state while it has no order: a cancelled or expired checkout answers with its status and the message no_order_placed, saying no order was placed, and one still waiting on the person says no order has been confirmed yet, so call again in a moment; once the person has paid at the store's page, the store reports the order on a read of its checkout: the answer is status completed with the message order_confirmed ("The store confirmed order #1019.") and the store's order number in resource.order.label (resource.label on the order), shown only when the store reports one; resource.order.local_order_id is the order_id to read the order itself with (order_source, merchant_read, and order_from_checkout when the store's own order record was not read for it). Shipping, cancellation and refund after that are not shown. Not for placing or approving an order. Error recovery: identifier_required means pass order_id or checkout_id; not_found means no order can be read with that id, because over /mcp an order is read only with the order_id or checkout_id exactly as an earlier answer returned it, so call submit_feedback if the person did confirm, then start again with search_catalog; run_authority_missing or RUN_AUTH_REQUIRED on an id you were given means the run that owns the order has ended and no retry reaches it, so call submit_feedback; continuation_not_found means that reference is unknown, expired (references last up to 24 hours) or from another environment, so call search_catalog; rate_limited means wait 60 seconds; network_error means call again; any other error, including tool_layer_failure: retry once, then call submit_feedback. Next: submit_feedback to say what was unclear. It also reads RoboTrunk's test demo order (merchant null): pass that checkout_id while the person decides. Full guide: get_tool_guide or /agent/tools.json#get_order Example call: {"checkout_id":"the checkout_id create_checkout returned"}
| Name | Required | Description | Default |
|---|---|---|---|
| order_id | No | The order id from `/orders/{order_id}` after the person confirms, or null to look it up from `checkout_id`. | |
| checkout_id | No | The `checkout_id` from `create_checkout`, or null when you already hold `order_id`. At least one of the two must be non-null. | |
| shopping_session_id | No | Optional server-issued shopping session correlation ID. It is not purchase authority. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations it discloses the read-back currency and provenance (order_source, merchant_read), the full checkout state machine (no_order_placed, no order confirmed yet, order_confirmed with message and label), that references expire in 24 hours, and a 60-second rate-limit wait. This is far richer than the structured fields 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?
Front-loaded with purpose and trigger, so the opening earns its place, but the middle and tail are a sprawling run-on with hard-to-parse parentheticals and interleaved error taxonomy. It is closer to over-stuffed than tight, and the structure taxes reading more than it needs to.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with an ambiguous dual-identifier lookup and no output schema, the description covers return shape (status, totals, messages, labels), the checkout-vs-order distinction, and full error recovery. An agent has everything needed to call it and interpret the result without the 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, but the description adds real semantics the schema lacks: which of order_id/checkout_id to pass and why, and that resource.order.local_order_id is the order_id to re-read with. The parenthetical labeling (order_source, merchant_read, order_from_checkout) is dense but adds mapping meaning above 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 ('Reads back a store's order: the status and the totals') and explicitly distinguishes itself from the write siblings ('Not for placing or approving an order'). An agent can separate this from complete_checkout/create_checkout 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 trigger ('after the person has paid at the store and you want to check the order exists'), a negative case ('Not for placing or approving an order'), and routes to specific siblings (submit_feedback, search_catalog) for each recovery path. 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.
get_productRead one product recordARead-onlyIdempotentInspect
Returns one product's published record from the named store: its variants, availability, and the store's own price and currency. Send merchant as the store slug search_catalog returned. Use when you hold a product_id, or the number in a product's robotrunk.com page address, and want the full record. Use create_checkout when asked to buy. Not for browsing the catalogue; use search_catalog. For checked facts with a source for each, call check_product. Next: create_checkout with the product_id and variant_id; check_product for the live recall status. Error recovery: product_not_found or out_of_stock means call search_catalog (and tell the person if it was out of stock); PRODUCT_NOT_FOUND (a store's product) means the store holds no product with that id, so send product_id as search_catalog returned it or call search_catalog; MERCHANT_NOT_FOUND means that store slug is not offered, so call search_catalog; price_not_fresh means retry in a minute; rate_limited (RATE_LIMITED for a store's product) means wait 60 seconds; network_error means call again; any other error, including tool_layer_failure: retry once, then call submit_feedback. Full guide: get_tool_guide or /agent/tools.json#get_product Example call: {"merchant":"merchant-from-result","product_id":"product-id-from-result","response_format":"concise"}
| Name | Required | Description | Default |
|---|---|---|---|
| merchant | Yes | The store slug search_catalog returned with the product. Required: a call without it is refused. Only an explicit null runs RoboTrunk's one-product test demo, which sells nothing. | |
| product_id | Yes | The product id from `search_catalog`, or a store product's page-address number. | |
| response_format | No | How much to return. `concise` is the default when null: acting fields plus source_retailer and price_may_differ. `detailed` adds the source block. | concise |
| include_evidence | No | Demo only (merchant null): attaches the demo product's cited evidence pack. For a store's product, call check_product for checked facts with sources. | |
| shopping_session_id | No | Optional server-issued shopping session correlation ID. It is not purchase authority. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world, but the description adds behavior they do not cover: rate limiting with a 60-second wait, a price_not_fresh retry-in-a-minute case, and a per-error-code recovery map that distinguishes store-scoped errors from generic ones. That is meaningful operational context beyond the structured 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 is front-loaded and the paragraphs are ordered sensibly (what it returns, when to use, when not, next steps, errors). The enumerated error-code list is long and partially redundant with the 'Full guide: get_tool_guide' pointer, which costs some tightness, but each line still carries actionable recovery 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?
There is no output schema, and the description compensates by naming the returned fields (variants, availability, price, currency) and the response_format effect. Combined with the error-recovery map and rich annotations, an agent has everything needed to call this correctly and handle failure.
Complex tools with many parameters or behaviors need more documentation. Simple 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, and the description adds only provenance for merchant/product_id ('send merchant as the store slug search_catalog returned'), which overlaps the schema text. Baseline 3 is appropriate; it does not extend the schema with new format or edge-case 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 first sentence states a specific verb and resource plus the scope of the return: a single published product record with variants, availability, and the store's price and currency. It explicitly distinguishes itself from search_catalog (browsing), check_product (checked facts), and create_checkout (buying), so an agent can route 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 trigger (you hold a product_id or the number in a store page URL), explicit exclusions ('Not for browsing the catalogue; use search_catalog'), and named alternatives for adjacent intents (check_product for sourced facts, create_checkout for purchasing). It even adds a 'Next:' hand-off path, 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.
get_recall_watchRead a recall watchARead-onlyIdempotentInspect
Reads a recall watch's current state and every alert newer than a given cursor, from stored rows only: no regulator call, no model call, no store call, so it is cheap to poll often. Use the watch_token watch_recalls returned when the watch started. First call: since null. Then pass the next_since value each answer returns to read only new alerts. Error recovery: watch_not_found means the token is wrong or the watch is stopped and past its term, so there is nothing to recover; rate_limited means wait the seconds stated and poll again; watch_failed (or any other unexpected error): retry once, then call submit_feedback. Next: stop_recall_watch when the person asks to stop. Full guide: get_tool_guide or /agent/tools.json#get_recall_watch Example call: {"watch_token":"rwt_exampletokenvaluehere00000000000000000000000"}
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | The next_since cursor from a previous get_recall_watch answer, or null to read every alert from the start. | |
| watch_token | Yes | The watch_token watch_recalls returned when the watch started. | |
| shopping_session_id | No | Optional server-issued shopping session correlation ID. It is not purchase authority. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds genuinely new behavior: the read is served purely from stored rows so it is cheap to poll, plus a rate-limit backoff rule and a retry-once-then-feedback failure policy. The 'no regulator/model/store call' statement is exactly the kind of side-effect disclosure 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-loaded with the core purpose and the cheap-to-poll property, then proceeds through usage, error recovery, and the next step; a concrete example call closes it. It is dense and somewhat run-on in the error-recovery sentence, but every clause carries information an agent needs, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so: it says the answer contains the watch's current state plus alerts newer than the cursor, and that each answer returns a next_since value for the next poll. Error semantics, the escalation path, and a pointer to get_tool_guide for the full guide round out what a caller 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%, so the schema already documents all three parameters and the baseline is 3. The description adds the round-trip semantics for the cursor ('pass the next_since value each answer returns to read only new alerts') and ties watch_token to its origin in watch_recalls, which clarifies how the two parameters work together rather than in isolation.
Input schemas describe structure but not intent. Descriptions should explain 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 ('Reads a recall watch's current state and every alert newer than a given cursor') and immediately bounds the scope of the read ('from stored rows only: no regulator call, no model call, no store call'). This distinguishes it cleanly from siblings like watch_recalls (which creates the watch) and stop_recall_watch (which ends it).
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 operational guidance: use the watch_token returned by watch_recalls, start with since=null, then feed back the next_since value each answer returns. It also routes forward ('Next: stop_recall_watch when the person asks to stop') and gives per-error handling for watch_not_found, rate_limited, and watch_failed, including when to escalate to submit_feedback.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tool_guideRead one tool's complete guideARead-onlyIdempotentInspect
Returns the complete guide for one RoboTrunk tool: summary, when to use it, what not to use it for, parameters, caveats, outputs, error recovery and worked examples. Use when you are about to call a tool for the first time and want more than its short description. Error recovery: not_found is the only error; its message lists every valid name, so pick one and call again. Next: call the tool you read about, feeding an example's input straight back in. Every tool is listed at /agent/tools.json. Full guide: get_tool_guide or /agent/tools.json#get_tool_guide Example call: {"tool_name":"create_checkout"}
| Name | Required | Description | Default |
|---|---|---|---|
| tool_name | No | The exact name of a registered tool, as it appears in this catalogue, or null for the list of every tool with its title. | |
| shopping_session_id | No | Optional server-issued shopping session correlation ID. It is not purchase authority. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuinely new behavioral context beyond the annotations: the single error mode (not_found), that its message enumerates all valid names, and that the guide's return payload includes error-recovery and worked examples. It stops short of describing size or latency characteristics.
Agents need to know what a tool does to the 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 payload and the trigger condition, then packed with actionable detail. Minor waste in the self-referential tail ("Full guide: get_tool_guide or /agent/tools.json#get_tool_guide") and the repeated catalogue pointer, which cost it the top score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the guide's full contents (summary, when to use, what not to use, parameters, caveats, outputs, error recovery, worked examples) plus the error and next-step behavior. Nothing an agent needs in order 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 both parameters are documented there, including the null case for tool_name and the non-authority caveat for shopping_session_id. The description only adds an example invocation ({"tool_name":"create_checkout"}) and does not restate or extend the null-list behavior, 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 (returns/reads) and resource (the complete guide for one RoboTrunk tool), and enumerates the guide's contents, so an agent knows exactly what comes back. It is clearly distinguishable from every sibling, all of which act on products, checkouts, or watches rather than on tool metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 ("about to call a tool for the first time and want more than its short description") and gives the follow-up step ("call the tool you read about, feeding an example's input straight back in"). It also covers the error path: not_found is the only error and its message lists every valid name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_trust_manifestRead RoboTrunk's trust manifestARead-onlyIdempotentInspect
Returns RoboTrunk's trust manifest whole: what the service is, and that checkout at a listed store is real: the store is the seller, charges and ships, and RoboTrunk never sees the card. It also holds RoboTrunk's published statistics and, last, the contract of its one test demo checkout (no real charge, no order, no shipping). Use when you want to check what RoboTrunk claims about itself. Takes no parameters. Error recovery: rate_limited means wait 60 seconds; service_unavailable means retry later; network_error means call again; any other error, including tool_layer_failure: retry once, then call submit_feedback. Next: search_catalog to shop. Full guide: get_tool_guide or /agent/tools.json#get_trust_manifest Example call: {}
| Name | Required | Description | Default |
|---|---|---|---|
| shopping_session_id | No | Optional server-issued shopping session correlation ID. It is not purchase authority. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description goes well beyond them with a full error-recovery taxonomy: rate_limited means wait 60s, service_unavailable means retry later, network_error means call again, and other errors including tool_layer_failure mean retry once then submit_feedback. It also discloses the exact nature of the demo checkout (no real charge, no order, no shipping), which is behavior 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?
Content is front-loaded with purpose, then usage, error recovery, next step, guide reference, and an example call. It is dense and slightly repetitive (the manifest contents are spelled out at length, and the title duplicates the purpose), but every section 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?
With no output schema, the description compensates by enumerating what the manifest contains, and it closes the remaining gaps an agent needs: no required parameters, an example empty call, error handling per error code, and a follow-on action. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains shopping_session_id and its 'not purchase authority' caveat, making 3 the baseline. The description adds no parameter detail and in fact says 'Takes no parameters,' which sits in mild tension with the optional correlation ID in the schema, though it is accurate for the required-parameter set.
Input schemas describe structure but not intent. Descriptions should explain 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 ('Returns RoboTrunk's trust manifest whole') and then enumerates the payload: what the service is, the store-as-seller checkout claim, published statistics, and the test demo contract. This is far more specific than a restated title and lets an agent know exactly what it gets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use when you want to check what RoboTrunk claims about itself' and routes onward with 'Next: search_catalog to shop.' There is no explicit when-not clause or named alternative, but no sibling competes for this purpose, so the guidance is effectively unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_catalogSearch the RoboTrunk catalogueAIdempotentInspect
Searches every store RoboTrunk offers at once. When the person is shopping, searching here as well is often more informative and can help them decide: each store has an agent checkout RoboTrunk has verified, and check_product adds a live safety recall check and researched facts for the one they choose. Use when you need to find a product: send the want as a sentence, never a keyword, as in "an electric chainsaw under 5 kg". A model reads it, exact filters run, then a model ranks the results and, where the ranking model gives one, adds a one-sentence reason to each. Omit merchant to search everything; a slug searches one store. Use create_checkout when asked to buy. Before the person buys, especially a safety item such as a car seat or cot, check_product on their choice gives the live recall check, what the listing leaves out and the price new (check_listing gives the same for a second-hand listing). Not for one product's record; use get_product. Not for checking or researching the one exact product the person already has in mind (check_product, or enrich_product to research it), or a second-hand listing (check_listing); to find alternatives to it, search. Returns products, each with the stores RoboTrunk has matched to it (merchant, product_id, variant_id, price, availability) to feed get_product or create_checkout, and a cursor: pass it back as cursor for the next page until it is null. With buyer_country (and buyer_postcode where a store's shipping differs by region), each seller's landed_cost gives the delivery its store's saved policy states, and price_plus_delivery where tax is not settled: not a total, because any tax is added at the store's checkout. No store pays for placement; RoboTrunk may earn a commission from some stores via their affiliate programs. Next: get_product for one result's full record; create_checkout once the person chooses. Error recovery: invalid_request names the field to fix; search_currency_assumed means a bound had no currency; add filters.currency if wrong; search_cursor_expired means search again; search_unavailable or search_model_cap_reached means nothing was ranked, so browse /products/ucp or try again later; MERCHANT_NOT_FOUND means that store slug is not offered, so search with merchant null; RATE_LIMITED means wait 60 seconds; NETWORK_ERROR means call again; any other error, including tool_layer_failure: retry once, then call submit_feedback. Full guide: get_tool_guide or /agent/tools.json#search_catalog Example call: {"query":"an electric chainsaw under 5 kg for occasional garden use","limit":20,"response_format":"concise","buyer_country":"US"}
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many candidates the ranking model reads. Site-wide: 10 to 30, and 20 when null. Store-scoped: 1 to 20. | |
| query | Yes | The want in the person's own words, as a sentence: the thing, what it must do, any constraints. A model reads this. Never a keyword. | |
| cursor | No | The next page of the same candidate set, from a previous answer's resource.cursor. Held for fifteen minutes. | |
| filters | No | Exact filters, applied before ranking. What you set here beats what the model inferred. Null lets the sentence decide. Example: {"max_price_minor": 25000, "currency": "USD", "in_stock_only": true} is USD 250.00 or less, in stock. | |
| merchant | No | Null searches every store RoboTrunk offers: usually what you want. A slug from /agent/merchants searches that one store. Example: "anbbaby-com", a slug, never a store name or a link. | |
| buyer_country | No | Shopper's ISO country: what you know, else your best guess; unknown if none. Left out, it is read as unknown and the answer asks you to send it. Example: "AU", "US" or "unknown", never a country name. | unknown |
| buyer_postcode | No | Site-wide only, with buyer_country: postcode the person has said, used only to price shipping and never stored. Null when not said; never guess. | |
| response_format | No | How much to return. `concise` is the default when null: acting fields plus source_retailer and price_may_differ. `detailed` adds the source block. | concise |
| buyer_country_basis | No | Optional, with buyer_country: known if you know the country, guessed if it is your best guess. Null if neither. | |
| shopping_session_id | No | Optional server-issued shopping session correlation ID. It is not purchase authority. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses the internal pipeline (model reads the sentence, exact filters run, a model ranks and may add a reason), cursor lifetime (fifteen minutes), that landed_cost/price_plus_delivery are not totals because tax is added at the store's checkout, the no-paid-placement and commission disclosure, and a full error-recovery table including RATE_LIMITED wait 60 seconds. This 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?
Front-loaded with purpose and alternatives, and every block is substantively useful, but the entire definition is delivered as one dense run-on paragraph mixing routing, returns, pricing caveats, and a long error list. Readability and scannability suffer; some sentences chain four or five clauses.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 10 parameters, no output schema, and a complex ranking/pagination pipeline, the description covers what is needed: the return shape (products with merchant, product_id, variant_id, price, availability plus a cursor), pagination, pricing caveats, and an exhaustive error-recovery mapping. 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; the description reinforces the key semantics (sentence not keyword, omit merchant to search everything, pass cursor back until null) and adds error-driven parameter guidance such as adding filters.currency when search_currency_assumed fires. Most of it overlaps with the schema descriptions, but the currency/error linkage adds genuine value.
Input schemas describe structure but not intent. Descriptions should explain 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 scope: 'Searches every store RoboTrunk offers at once.' It then explicitly distinguishes itself from siblings (get_product for one record, check_product for verification, check_listing for second-hand, create_checkout for buying), 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 ('Use when you need to find a product'), when-not ('Not for one product's record', 'Not for checking or researching the one exact product...'), and names the alternative tool for each excluded case. It also prescribes the input form (a sentence, never a keyword) and the follow-up flow (get_product, then create_checkout).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_back_in_stock_watchStop a back-in-stock watchADestructiveIdempotentInspect
Stops a back-in-stock watch for good: instant, permanent and idempotent. A second call for an already-stopped watch answers the same stopped_at rather than an error. Use when the person no longer wants the watch. Error recovery: watch_not_found means the token is wrong or the watch does not exist; there is nothing further to do; watch_failed (or any other unexpected error): retry once, then call submit_feedback. Nothing follows. Full guide: get_tool_guide or /agent/tools.json#stop_back_in_stock_watch Example call: {"watch_token":"rwt_exampletokenvaluehere00000000000000000000000"}
| Name | Required | Description | Default |
|---|---|---|---|
| watch_token | Yes | The watch_token watch_back_in_stock returned when the watch started. | |
| shopping_session_id | No | Optional server-issued shopping session correlation ID. It is not purchase authority. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructive and idempotent, and the description adds genuine context beyond them: it spells out what 'permanent' means, that a repeat call answers with the same stopped_at instead of an error, and it enumerates specific error codes with recovery actions. This is exactly the extra behavioral 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 core semantics ('for good: instant, permanent and idempotent') before edge-case handling; the example call and guide link are purposeful rather than filler. The error-recovery sentence is dense but every clause maps to a real decision the caller must make.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 discloses the return signal (stopped_at) and the error taxonomy, and points to get_tool_guide / the tools.json fragment for the full contract. Nothing an agent needs to invoke this destructive, idempotent operation 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 both parameters are documented in the schema, including the shopping_session_id's non-authority note, so the description only reinforces via the example call. Baseline 3 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?
"Stops a back-in-stock watch for good: instant, permanent and idempotent" gives a specific verb, resource and effect, and the resource ('back-in-stock watch') distinguishes it from the sibling stop_recall_watch 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 states the trigger condition ("Use when the person no longer wants the watch") and routes failure paths (retry once, then submit_feedback; watch_not_found = nothing to do). It does not name a sibling alternative such as stop_recall_watch, but the guidance for when and what happens next 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.
stop_recall_watchStop a recall watchADestructiveIdempotentInspect
Stops a recall watch for good: instant, permanent and idempotent. Erases the stored callback URL or email address in the same step the watch stops; the checkout this watch covered can never be watched again. Use when the person asks to stop the watch. Error recovery: watch_not_found means the token is wrong or the watch is already stopped and past its term; there is nothing further to do; watch_failed (or any other unexpected error): retry once, then call submit_feedback. Nothing follows. Full guide: get_tool_guide or /agent/tools.json#stop_recall_watch Example call: {"watch_token":"rwt_exampletokenvaluehere00000000000000000000000"}
| Name | Required | Description | Default |
|---|---|---|---|
| watch_token | Yes | The watch_token watch_recalls returned when the watch started. | |
| shopping_session_id | No | Optional server-issued shopping session correlation ID. It is not purchase authority. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it specifies what is actually destroyed (the stored callback URL or email), that the covered checkout can never be watched again, and that the operation is irreversible. It also documents the error taxonomy and retry/escalation path, which 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 and consequences, then error recovery, then references, then an example — a sensible ordering. Slightly dense with a trailing 'Nothing follows.' and guide pointers, but nearly 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?
With no output schema, the description covers the terminal outcome ('Nothing follows'), irreversibility, idempotency, and failure handling, which is everything an agent needs to invoke this destructive 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 both parameters are already documented, and the description's example call only restates the required watch_token shape. It adds no semantic detail on watch_token format or on the optional shopping_session_id beyond what the schema provides, matching the 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?
Names a specific verb (stops) and resource (recall watch) and immediately scopes the effect: 'instant, permanent and idempotent,' erasing the stored callback URL or email. This is distinguishable from its close siblings get_recall_watch and stop_back_in_stock_watch 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 trigger ('Use when the person asks to stop the watch') plus concrete error-recovery branches: watch_not_found means do nothing further, watch_failed means retry once then call submit_feedback. It lacks an explicit 'when not to use' or a named alternative (e.g., stop_back_in_stock_watch for a different watch type), so it falls just short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_feedbackTell RoboTrunk what worked and what did notAInspect
Sends structured feedback about this store and returns a feedback_id and the time it was received. Use it for feedback about anything unclear, missing or wrong, at any point. Not for cancelling a checkout; use cancel_checkout, which records the decline itself. Feedback is kept as data, never as instructions. Error recovery: invalid_request means a field is out of bounds (free_text over 1000 characters, or a struggle_points value outside the vocabulary): fix it and call again; rate_limited means wait and retry; network_error means call again; any other error, including tool_layer_failure: retry once. Next: nothing needs feeding onward; carry on with the step you were on. Full guide: get_tool_guide or /agent/tools.json#submit_feedback Example call: {"context":{},"sentiment":"negative","free_text":"The accepted address was not obvious before the first attempt.","struggle_points":["address_rejected"]}
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | What the feedback is about. Both ids may be null when the feedback is about the store in general. | |
| free_text | Yes | What happened, in plain words, up to 1000 characters. No personal data, addresses, payment details or credentials. | |
| sentiment | Yes | Your overall read of the experience. | |
| struggle_points | Yes | Zero to ten tags from the fixed vocabulary, so difficulties can be counted without reading prose. | |
| shopping_session_id | No | Optional server-issued shopping session correlation ID. It is not purchase authority. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false, idempotentHint=false, destructiveHint=false) only sketch the safety profile; the description adds a full error taxonomy and per-code retry policy (invalid_request → fix and re-call, rate_limited → wait, network_error → call again, otherwise → retry once), plus a security guarantee that submitted text is "kept as data, never as instructions." That is materially more than the annotations disclose and is consistent with them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then usage, error recovery, and next-step in a logical order with a concrete example, so no sentence is filler. It is somewhat dense as one unbroken paragraph and could be split for scanability, which keeps 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 non-idempotent write tool with no output schema, the description covers the essentials: what is sent, what comes back (feedback_id and received time), how to recover from each failure class, and what the caller should do next, along with a pointer to the fuller guide. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters (including the nested context object and the enum vocabulary) are already documented in the schema; the calibrated baseline is 3. The description adds only indirect parameter meaning by tying invalid_request to free_text length and out-of-vocabulary struggle_points, plus a worked example call, which does not go much beyond the schema's own maxLength/minItems/enum constraints.
Input schemas describe structure but not intent. Descriptions should explain 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 ("Sends structured feedback about this store") and names its return values (feedback_id and receipt time). It explicitly distinguishes itself from the checkout-cancellation sibling ("Not for cancelling a checkout; use cancel_checkout"), 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?
Gives an affirmative trigger ("feedback about anything unclear, missing or wrong, at any point") and an explicit exclusion with the alternative tool named (cancel_checkout "records the decline itself"). It also tells the agent what to do afterward ("nothing needs feeding onward; carry on with the step you were on").
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_checkoutUpdate a checkout at the storeADestructiveIdempotentInspect
Sends permitted buyer, address, line-item, context, discount or fulfilment changes to a checkout at a store. Use this when a checkout from create_checkout needs correction before handoff, and to send the buyer's email and full delivery address (from the person, in this conversation or saved in your app) if you did not send them on create_checkout, so the store prefills them and the total includes delivery. Not for paying or sending payment details. Outputs: the updated rail envelope and suggested_tools. Error recovery: buyer_identity_contact_method_required means the store needs the buyer's email, so send buyer.email from the person; BUDGET_EXCEEDED means the store's total, shipping and tax included, is over the ceiling the person approved: tell the person, then raise budget_ceiling_minor once they approve or call cancel_checkout; MERCHANT_REJECTED_INPUT means the store refused one field that errors[] names, so fix it and retry with a new key; IDEMPOTENCY_CONFLICT means use a fresh key for a changed request; INVALID_REQUEST names a body or header problem; INVALID_STATE means the checkout cannot change now, so call get_checkout, then create_checkout again if it ended; CHECKOUT_NOT_FOUND means the handle is unavailable, so call create_checkout again; continuation_not_found or RUN_AUTH_REQUIRED means send checkout_id exactly as an earlier answer returned it and, if you did, call create_checkout again; PAYMENT_INSTRUMENT_NOT_ACCEPTED means remove payment data and retry; any other error, including tool_layer_failure: retry once, then call submit_feedback. Next: get_checkout to read the new status, complete_checkout when it is ready_for_complete. Full guide: get_tool_guide or /agent/tools.json#update_checkout Example call: {"checkout_id":"ucp_transcend-dev-lab_abc123","buyer":{"email":"buyer@example.test"}}
| Name | Required | Description | Default |
|---|---|---|---|
| buyer | No | Buyer details for the merchant, or null to leave them unchanged. Example: {"email": "<the person's email>"}: the <...> is the person's own address, never invented. | |
| context | No | Optional merchant context, or null to leave it unchanged. | |
| discounts | No | Discount codes for the merchant, or null to leave them unchanged. | |
| line_items | No | Replacement line items: the whole basket, every line the checkout should hold, up to 50 at a quantity of 1 to 100 each, all from this checkout's store; or null to leave the current set unchanged. Example: [{"product_id": "<product_id from search_catalog>", "variant_id": "<variant_id from the same result>", "quantity": 1}], the ids exactly as returned, never a page link. | |
| checkout_id | Yes | The UCP checkout id from create_checkout or get_checkout. | |
| idempotency_key | No | A printable ASCII key for safe retries, or null to generate one. | |
| shipping_address | No | The merchant shipping address, or null to leave it unchanged. Example: {"first_name": "<from the person>", "last_name": "<from the person>", "street_address": "<street>", "extended_address": "<apartment or suite, or null>", "address_locality": "<city>", "address_region": "<two-letter state code, such as CA>", "postal_code": "<ZIP code>", "address_country": "US"}: every <...> is the person's own value, never invented. | |
| shopping_session_id | No | Optional server-issued shopping session correlation ID. It is not purchase authority. | |
| budget_ceiling_minor | No | The total the person approved, shipping and tax included, in minor units, or null. A store total above it is refused BUDGET_EXCEEDED; ask the person. Example: 24995 for a total of 249.95. | |
| fulfillment_option_id | No | The selected fulfillment option id, or null. | |
| budget_ceiling_currency | No | The ISO-4217 currency of the ceiling, or null for the merchant's own. Any other is refused, naming the merchant's. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With destructiveHint=true and idempotentHint=true already declared, the description adds real context: the error taxonomy, the fresh-key rule on IDEMPOTENCY_CONFLICT, the budget ceiling enforcement, and the prefill rationale for buyer/address. It does not disclose that line_items replaces the entire basket (destructive semantics) — that only appears in the schema — but the annotation coverage keeps the bar low enough for 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?
Front-loaded with purpose, then usage, outputs, error recovery, next steps, and a concrete example call. The error-recovery block is dense and long, but each entry maps to a distinct, actionable failure mode, so it earns its space 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?
Despite having no output schema, the description names the outputs (updated rail envelope and suggested_tools), enumerates recovery paths for every named error code, states next steps, and provides an example call. 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 100%, so the baseline is 3, but the description adds meaning beyond the schema: it explains why buyer.email and the full delivery address should be sent (so the store prefills and the total includes delivery) and ties budget_ceiling_minor to the BUDGET_EXCEEDED behavior and the need for explicit approval.
Input schemas describe structure but not intent. Descriptions should explain 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 (sends changes) and resource (a checkout at a store), and the description explicitly distinguishes itself from create_checkout, get_checkout, complete_checkout, and cancel_checkout. An agent can tell exactly what this tool mutates 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 when-to-use (a checkout from create_checkout needs correction before handoff, or the buyer email/address was omitted at creation) and when-not-to-use ('Not for paying or sending payment details'). It also routes forward with 'Next: get_checkout ... complete_checkout when it is ready_for_complete', naming the alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
watch_back_in_stockWatch a sold-out listing for restockAInspect
Starts a poll-only watch on one listing the store itself currently shows as sold out, and returns a bearer token to poll or stop it. Refused not_sold_out on any listing that is not shown as sold out right now (unknown or not-published stock counts as available, never sold out), and listing_not_found for a store, product or variant RoboTrunk does not hold. Nothing is emailed or called back; poll get_back_in_stock_watch to learn when it flips. Use when a shopper wants to know when a sold-out listing comes back in stock. Keep the watch_token; stop with stop_back_in_stock_watch. Error recovery: invalid_request names the field to fix; listing_not_found means call search_catalog; not_sold_out means no watch is needed; rate_limited means wait a minute; watch_failed (or any other unexpected error): retry once, then call submit_feedback. Next: get_back_in_stock_watch to poll for the restock. Full guide: get_tool_guide or /agent/tools.json#watch_back_in_stock Example call: {"merchant":"anbbaby-com","product_id":"gid://shopify/Product/1234567890"}
| Name | Required | Description | Default |
|---|---|---|---|
| merchant | Yes | The store slug from the earlier search_catalog result. | |
| product_id | Yes | The product_id from search_catalog or get_product, or its bare numeric Shopify id. Example: "gid://shopify/Product/1234567890" or "1234567890", never a page link. | |
| variant_id | No | One sold-out variant to watch, or null/omitted to watch the whole product, which alerts as soon as any variant is available again. | |
| shopping_session_id | No | Optional server-issued shopping session correlation ID. It is not purchase authority. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover only safety hints (readOnly false, non-idempotent, non-destructive), so the description must and does carry the behavioral burden: poll-only, nothing emailed or called back, bearer token returned, refusal semantics for not-sold-out/unknown stock, and rate-limit/retry behavior. This is well beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is front-loaded with purpose, then conditions, then routing, then error recovery, so an agent can stop reading early. It is dense and longer than typical, but nearly every clause (refusal codes, keep-the-token, next step) is actionable 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?
No output schema exists, so the description must describe the return value, and it does ('returns a bearer token to poll or stop it'). Combined with the refusal conditions, token retention guidance, and next-step routing, an agent has everything needed to invoke and follow up 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 merchant, product_id, variant_id, and shopping_session_id are already documented. The description adds only a bare example call and no additional parameter-level meaning, so the baseline of 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 (starts a watch) on a specific resource (one sold-out listing) and names the token it returns. It is easily distinguished from siblings like get_back_in_stock_watch (polling) and stop_back_in_stock_watch (stopping), which the description explicitly references.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 ('Use when a shopper wants to know when a sold-out listing comes back in stock'), explicit preconditions (store itself shows sold out right now), and routes to the alternative states via get_back_in_stock_watch and stop_back_in_stock_watch. Error recovery even maps each failure to its next action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
watch_recallsWatch a purchase's products for a recallAIdempotentInspect
Starts a post-purchase recall watch on every product in a checkout that has been handed to the store to pay, once the person (or an agent authorised to accept on their behalf) has agreed to the current consent statement. RoboTrunk re-checks each watched product whenever a regulator publishes a new notice naming its brand; a match only ever flags with the regulator's own citation and never changes, cancels or delays the purchase. An item not matched to a listed product is watched by its checkout name, not refused; each product says watched_by "product" or "name". The full consent statement, version recall-watch-consent-v1: "RoboTrunk will watch the products in this purchase for a recall. What is watched: each product bought through this checkout hand-off, re-checked whenever a regulator publishes a new notice naming its brand. What is stored: the product and its title, the channel chosen to be told (poll, an agent callback URL, or a person's email address), and, only for a channel that is switched on, that URL or address; never a name, a postal address or payment details. Channels: an agent can always poll get_recall_watch for the result; a callback URL is used only when RoboTrunk has switched callbacks on; a person's email is used only when RoboTrunk has switched email on, the person consents under the Australian Spam Act, and the address holder confirms it by a link sent to that address. Frequency cap: at most three messages a day on one channel, and at most one email a day to one address, several alerts combined into one. How to stop: call stop_recall_watch at any time, or use the one-click stop link in an email; stopping is instant and permanent, and removes the stored channel data. This watch never changes, cancels, blocks or delays the purchase it watches; a recall only ever flags with its regulator citation." channels is optional: leave it out for the poll-only watch every purchase gets, and a channels value that cannot be read is left out the same way, with the answer saying poll was used. One watch per checkout: a second call returns the existing watch unchanged, and a stopped watch cannot be restarted. Use it after complete_checkout; keep the watch_token it returns (shown once) for get_recall_watch and stop_recall_watch. Error recovery: consent_required means show the person the statement above and call again with it; invalid_request names the field to fix; channel_not_available means retry with channels left out (poll only); checkout_not_handed_off means call complete_checkout first; checkout_ended means there is nothing to watch; watch_stopped means this checkout's watch was stopped and cannot restart; product_not_resolved means no item could be matched or named; use check_product; checkout_too_large means more than 50 different products; forbidden, not_found or checkout_not_found means that checkout cannot be read here, so send checkout_id exactly as an earlier answer returned it; continuation_not_found means that reference is unknown or expired, so call create_checkout again; rate_limited means wait and retry; service_unavailable means try again later; watch_failed (or any other unexpected error): retry once, then call submit_feedback. Next: get_recall_watch to poll for alerts. Full guide: get_tool_guide or /agent/tools.json#watch_recalls Example call: {"checkout_id":"mcp1_c_examplereferencevaluehere0000000000000","consent":{"given_by":"person","statement_version":"recall-watch-consent-v1"},"channels":[{"kind":"poll"}]}
| Name | Required | Description | Default |
|---|---|---|---|
| consent | Yes | ||
| channels | No | Optional: leave it out for a poll-only watch (poll is always on); a value that cannot be read as this list is left out and the answer says poll was used. When sent, one or more channels: callback and email are refused channel_not_available until RoboTrunk switches them on. Example: [{"kind": "poll"}]. | |
| checkout_id | Yes | The reference get_checkout accepts for this checkout. | |
| shopping_session_id | No | Optional server-issued shopping session correlation ID. It is not purchase authority. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (idempotentHint=true, destructiveHint=false), and the description adds far more: exactly what data is stored, the 3-message/1-email daily cap, that the watch never alters the purchase, the one-watch-per-checkout behavior, and that a stopped watch cannot be restarted. The stated idempotency ('a second call returns the existing watch unchanged') is consistent 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?
The purpose and preconditions are front-loaded, which is good, but the description is extremely long and embeds the entire consent statement verbatim even though it is also available via get_tool_guide, creating substantial bloat. The exhaustive error enumeration, while useful, compounds the length beyond what a tool description 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 still tells the agent that a watch_token is returned (shown once) and how to use it, plus full consent and error handling. For a complex, consent-gated, idempotent mutation tool, every piece an agent needs to call it correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, and the description compensates well: it explains that channels is optional and defaults to poll-only, describes the three channel kinds and their activation conditions, and emphasizes the exact statement_version requirement. It adds real meaning beyond the schema, though shopping_session_id is not addressed in 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 opening sentence states a specific verb and resource ('Starts a post-purchase recall watch on every product in a checkout'), and it clearly separates itself from siblings by naming get_recall_watch (poll) and stop_recall_watch (stop). An agent can distinguish this from watch_back_in_stock 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 preconditions ('Use it after complete_checkout', checkout must be handed off, consent required), explicit next steps (get_recall_watch to poll), and a full error-recovery table that maps every error code to the corrective action. 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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
23 tool updates
- First observed
ask_product_manual - First observed
cancel_checkout - First observed
check_fit - First observed
check_listing - First observed
check_product - First observed
compare_products - First observed
complete_checkout - First observed
create_checkout - First observed
enrich_product - First observed
get_back_in_stock_watch - First observed
get_checkout - First observed
get_order - First observed
get_product - First observed
get_recall_watch - First observed
get_tool_guide - First observed
get_trust_manifest - First observed
search_catalog - First observed
stop_back_in_stock_watch - First observed
stop_recall_watch - First observed
submit_feedback - First observed
update_checkout - First observed
watch_back_in_stock - First observed
watch_recalls
Related MCP Connectors
Search live local & nationwide retail stock, check prices, and run zero-click AI agent checkouts.
Look up a packaged food by barcode, search and compare products, and check listed allergens.
Search direct grocery storefronts and create product-link pickup handoffs.
Search live store shelves, verify delivery windows, and run instant AI agent checkouts.
Related MCP Servers
- AlicenseAqualityDmaintenanceAllows users to search for products, access detailed nutritional and allergen information, and find nearby store locations. It also provides tools to browse new and featured items across various grocery categories.47 npm1MIT
- AlicenseNot gradedqualityBmaintenanceEnables product search and authenticated grocery shopping-list management, including adding items, setting quantities, removing items, emptying the list, and reading purchase history.1MIT
- AlicenseNot gradedqualityCmaintenanceEnables users to search grocery products and stores, manage a cart, sync purchase history, and predict needed items through MCP tools. It also stores food preferences as server instructions so connected agents can respect them automatically.MIT
- AlicenseCqualityAmaintenanceShopify catalog search and product lookup via MCP; the Portage CLI adds full agentic buying162MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.