Skip to main content
Glama

Nova Amazon MCP Server

Server Details

Amazon Seller Central, Vendor Central and Ads data, profit-ready, for Claude, ChatGPT and any AI

Ownership verified
Status
Healthy
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
nova-data-analytics/nova-amazon-mcp
GitHub Stars
0
Server Listing
MCP Nova Data Analytics

TDQS

A4.2/5.0

Scored across 40 tools

Disambiguation4/5

The tools split cleanly across distinct domains (metrics, P&L, ads console, search terms, SQP, DSP, reviews, BSR, inventory, inbound shipments, listing health, Subscribe & Save, events, and the data-input worksheets/imports), and descriptions go out of their way to state which tool to use versus its neighbour. The main frictions are the three deprecated importers (import_stock_params, import_external_stock, import_supplier_orders) that now duplicate import_supply_chain, and adjacent pairs like query_metrics vs find_movers/explain_movement or query_metrics' Subscribe & Save metrics vs query_subscribe_and_save that need careful reading to separate.

Naming Consistency5/5

Every tool follows a verb-first snake_case pattern with a predictable prefix family: query_*, get_*_worksheet, import_*, list_*, set_*, plus create_events, describe_metric, explain_movement, find_movers. Prefixes map to intent (query = analytics read, get_*_worksheet = pre-import template, import_* = two-step write), so the name alone signals the role.

Tool Count3/5

40 tools is heavy for any single server, though the Amazon seller-analytics domain is genuinely broad and almost every tool maps to a distinct page or report. The surface is inflated by three explicitly deprecated importers and by a repetitive setup → worksheet → import triple repeated across six input domains, which could be consolidated into fewer schema-driven tools.

Completeness4/5

Coverage of the stated analytics + data-input purpose is strong: every read surface has a dedicated tool, and each input domain (COGS, FBM, VAT, stock, supply chain, tags) has setup inspection, a worksheet, and a validated two-step import. Remaining gaps are mostly write-side: events can be created but not edited/deleted, and advertising, listings, reviews and BSR are read-only with no bid, negative-keyword, or content-change operations.

Available Tools

40 tools
create_eventsAInspect

Log one or several EVENTS on Nova — dated notes drawn on the charts so a later movement can be explained ("changed the A+ of B0…", "price +10% on amazon.es", "new PPC campaign", "launch"). The seller tells you what they did; log each change with the day it happened. One event covers MANY ASINs and marketplaces when it is the same change (one A+ rework on five ASINs = one event); distinct changes (different day, type or description) are separate entries of events, logged in ONE call. TWO-STEP: call WITHOUT commit; the server resolves each event's account, marketplaces and ASINs against the catalog (child or parent, product name, listed where — a mistyped ASIN shows here) and returns ONE preview with a confirmationToken; show it to the user and only after their approval call again with commitPayload plus commit:true and the token. type is the dashboard's vocabulary: content_change for title/bullets/images/video/A+, price_change for price/deals/coupons, ppc_change for campaigns/bids/budgets, product_launch, other. Check list_events first when the seller may already have logged it. Requires the OAuth connection (a workspace API token cannot write).

NameRequiredDescriptionDefault
commitNoOmit/false = preview (resolution + catalog check, no write). true = write; requires the confirmationToken from the preview.
eventsYesOne entry per distinct change. A single event is a one-entry array.
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
confirmationTokenNoThe token the preview returned — proves the user saw exactly these events.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=false, so the description carries the full burden and does: the TWO-STEP preview/commit contract, the confirmationToken returned by the preview, the requirement to show the preview to the user before writing, and the auth constraint ("a workspace API token cannot write", OAuth required). It also discloses what the preview resolves (account, marketplaces, ASINs against the catalog) and that mistyped ASINs surface there.

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

Conciseness4/5

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

Front-loaded with purpose, then granularity, then the two-step flow, then the type vocabulary — a sensible order for a dense tool. It is long, and the sentence enumerating `type` values duplicates the schema enum descriptions nearly verbatim, which is the one passage that does not earn its space.

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

Completeness5/5

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

No output schema exists, and the description compensates by describing what the preview returns (resolved account/marketplaces/ASINs plus a confirmationToken) and what the commit call requires. For a mutating, two-phase tool with auth constraints, an agent has everything needed to call it correctly and safely.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3; the description adds genuine semantics the schema does not, namely the grouping rule for the `events` array (one call, multiple entries, max 50) and the purpose of the two-step commit/confirmationToken pair. The per-`type` vocabulary is largely a restatement of the enum descriptions in the schema, which keeps it from a 5.

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

Purpose5/5

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

States a specific verb and resource ("Log one or several EVENTS on Nova") and immediately grounds it with a concrete metaphor ("dated notes drawn on the charts so a later movement can be explained") plus four real-world examples. An agent can distinguish this from list_events or explain_movement 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.

Usage Guidelines5/5

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

Explicit routing: "Check list_events first when the seller may already have logged it" names the sibling and the condition. It also prescribes the trigger ("the seller tells you what they did") and the granularity rule (same change across many ASINs = one event; different day/type/description = separate entries), which is exactly the decision an agent would otherwise get wrong.

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

describe_metricA
Read-only
Inspect

Get the full definition of a single metric (meaning, unit, grains it is valid at; for a Vendor Central (1P) metric, its basis; for a Subscribe & Save metric, readingNote: how it reads over a period and when a day of it is final).

NameRequiredDescriptionDefault
keyYesA metric key from list_metrics, e.g. "netSales" — or a natural name that means exactly one metric (tacos, avgPrice…).
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true, so the description carries the real informational load — and it does, spelling out the exact definitional facets returned and the two conditional facets (1P `basis`, S&S `readingNote` including period reading and finality of a day). It does not cover behavior on an unknown or ambiguous key, which is the remaining gap.

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

Conciseness5/5

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

A single sentence, front-loaded with the verb and resource, followed by a parenthetical that lists return facets — every clause earns its place and nothing is repeated from the schema or annotations.

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

Completeness4/5

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

With no output schema, the description must convey the return shape, and it does so precisely for a two-parameter read tool whose inputs are fully specified in schema. Only the failure/ambiguity path for `key` is left unaddressed.

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

Parameters3/5

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

Schema coverage is 100% and both parameters are thoroughly documented in the schema, including that `key` comes from list_metrics and that `reason` must be English and is user-visible. The description adds no parameter meaning beyond that, so the baseline 3 applies.

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

Purpose4/5

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

The description gives a specific verb+resource ("Get the full definition of a single metric") and enumerates what that definition contains: meaning, unit, valid grains, 1P `basis`, and Subscribe & Save `readingNote`. It is clearly distinguishable from list_metrics by the word "single," though it never names the sibling explicitly.

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

Usage Guidelines3/5

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

Usage is only implied — an agent infers it should call this when it needs to understand what a metric means or how it reads. There is no explicit when-to-use, no exclusion, and no reference to list_metrics as the source of keys (that routing only lives in the schema's `key` description).

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

explain_movementA
Read-only
Inspect

For one SKU, pull the causal signal bundle (traffic, conversion, price, buy box, promotions, ads, rank) for a period vs a baseline, so you can reason about WHY its sales moved. Returns each signal with value, comparison value and variance. 💱 CURRENCY: monetary values are served in the caller's Nova display currency when it is one of the organization's configured currencies (its primary or up to four secondary currencies), else in the organization's primary. In the response, currency is the code, currencyBasis says why (user_preference | organization | pinned) and currencyNotice, when present, MUST be relayed to the user. Quote the code; never assume a symbol from the marketplace. Pass currency to pin any configured code — e.g. to reproduce a figure the seller read on a dashboard set to another currency. 🏷️ 3P / 1P: an Amazon account sells through ONE programme: Seller Central (3P, channel SELLER: the seller sells its products to Amazon's customers) or Vendor Central (1P, channel VENDOR: Amazon BUYS the products from the vendor and resells them itself). On a Vendor Central read, the basis of units, sales and netSales is the answer's vendorTopLineNetReceived (said in its channelNote): when it is 1, units and sales of a Vendor Central row are Amazon's net received (what Amazon received from the vendor, net of what it returned, at its cost, on the day of the receipt: the Net received of the Vendor Central console) and netSales the net received less the quick-pay and early-payment discounts; what the vendor invoiced reads in vendorInvoiced; when it is 0, units and sales are what the vendor invoiced Amazon (its books, at the invoice date) and netSales the invoiced amount less Amazon's claims; Amazon's shelf (what it shipped to its customers, at its retail price, the latest days provisional, on ordered units) is read with vendorShippedUnits, vendorShippedRevenue and vendorShippedCogs. A vendor's profit is netProfit, the P&L's Net Profit: the P&L's top line (Amazon's net received when the answer's vendorTopLineNetReceived is 1, what the vendor invoiced Amazon when it is 0) less what Amazon takes off (its claims on the invoices, the discounts, the co-op, the chargebacks, the returns to vendor), the product cost and the ad spend. vendorShelfProfit is the result on what Amazon shipped, at the ship date: Amazon's shelf, the figure to compare products on, never added to the P&L. channel in list_accounts says which programme each account sells through. A call reads Seller Central, unless you pass channels=['VENDOR'] (do so only when the user asks about Vendor Central / 1P), the accounts of the call are all Vendor Central accounts, or you pass channels=['SELLER','VENDOR'] for All channels (when the user asks for the total across both programmes): Nova then reads both together as the app's All channels reading does, adding the seller's sales and the vendor's P&L top line. NEVER add 3P and 1P figures yourself: ask for All channels, or make one call per channel and present the two side by side, labelled 3P and 1P. When your scope holds a Vendor Central account the response says which channel it read ('SELLER', 'VENDOR' or 'ALL'), and channelNote what it read and what it left out; a metric the channel does not report (sessions, buy box, promotions on Vendor Central) comes back null with an unservedMetrics note, never 0.

NameRequiredDescriptionDefault
toYesPeriod end, INCLUSIVE (YYYY-MM-DD): a calendar month is from=YYYY-MM-01 to=its LAST day. to=the 1st of the next month adds one extra day to every total (and one extra bucket with a time grain).
skuYesThe SKU to explain.
fromYesPeriod start, INCLUSIVE (YYYY-MM-DD).
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
accountsNoRestrict to a subset of your own seller account IDs (from list_accounts). Omit to include all your accounts. A brand/account name is accepted and resolved to its id when it matches one of your accounts unambiguously; a label that carries the id ("Brand (A1B2C3D4E5F6G)") resolves to that id.
channelsNoThe Amazon programme the call reads. 'SELLER' = Seller Central (3P): the seller's own sales to Amazon's customers. 'VENDOR' = Vendor Central (1P): Amazon buys the products from the vendor and resells them. Omit = SELLER whenever the accounts of the call include a Seller Central account, else VENDOR. Pass ['VENDOR'] only when the user asks for Vendor Central / 1P figures. Pass ['SELLER','VENDOR'] for All channels, when the user asks for the total across both programmes: Nova reads them together as the app's All channels reading does, adding the seller's sales and the vendor's top line (Amazon's net received when the answer's vendorTopLineNetReceived is 1, what the vendor invoiced Amazon when it is 0), while a metric one programme measures stays that programme's figure.
currencyNoPin the reporting currency: one of the organization's configured codes — its primary or any of its secondary currencies (e.g. "USD"). Omit to follow the caller's Nova display currency, the dashboard's rule. Any other code is refused.
comparisonToYesBaseline period end (inclusive).
comparisonFromYesBaseline period start (inclusive).

TDQS

A4/5.0
Behavior5/5

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

The description adds substantial behavioral context beyond the readOnlyHint annotation: it explains the returned signal structure, currency handling and notice relaying, channel-specific metric basis, null-vs-zero behavior for unserved metrics, and the response fields channel and channelNote. There is no contradiction with the read-only annotation. This is unusually transparent for a read-only analytical tool.

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

Conciseness3/5

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

The description is front-loaded with purpose and return behavior, then structured into currency and channel sections. However, it is very long and repeats a great deal of parameter-schema detail, with dense vendor/channel exposition that could be tighter. The complexity justifies some length, but the description is not concise.

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

Completeness5/5

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

Given the tool's complexity, nine parameters, read-only annotation, and no output schema, the description is complete enough for an agent to call it correctly. It explains what is returned, how currency and channel affect results, what null metrics mean, and how channel notes should be interpreted. No critical invocation or interpretation detail appears to be missing.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description still adds useful operational meaning, especially around currency pinning, channel selection, and why 3P and 1P figures must not be manually combined. It largely reinforces schema text but adds enough policy-level guidance to exceed baseline.

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

Purpose4/5

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

The description states a specific verb and resource: pulling a causal signal bundle for one SKU across a period vs a baseline in order to explain why sales moved. It also lists the signal families included and what is returned. It does not explicitly name sibling tools such as find_movers or query_metrics, so sibling differentiation is implicit rather than sharp.

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

Usage Guidelines3/5

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

The description makes the analytical use case clear: use it to reason about why a SKU's sales moved by comparing a period with a baseline. It also gives conditional channel guidance, including when to pass channels=['VENDOR'] and when to request All channels. However, it never explicitly compares this tool with sibling alternatives such as find_movers or query_metrics, and it gives no when-not-to-use-this-tool guidance.

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

find_moversA
Read-only
Inspect

Find the entities (SKUs by default) whose value moved the most for a metric between a period and a baseline. Use direction="down" to surface the biggest losers. This answers "which SKUs lost the most sales"; with tags (ids from list_tags) it ranks inside a brand or any tagged set. A metric of Amazon's S&S report is ranked only between two complete periods, past Amazon's delay and with S&S data every day: otherwise the answer has no rows, and notRanked and subscribeAndSaveNotice say why. 🧾 COST CATEGORIES: every cost has one of four categories (variable, product, oneOff, account; costCategory in list_metrics / describe_metric, and the totals orderCosts "Variable costs", productCosts, oneOffCosts, accountCosts). To compare products on their recurring economics, pass costCategories rather than subtracting lines yourself: the response then carries costCategories (what was counted) and costCategoriesNote, which you MUST relay, since the figures are no longer the P&L the app shows by default. 💱 CURRENCY: monetary values are served in the caller's Nova display currency when it is one of the organization's configured currencies (its primary or up to four secondary currencies), else in the organization's primary. In the response, currency is the code, currencyBasis says why (user_preference | organization | pinned) and currencyNotice, when present, MUST be relayed to the user. Quote the code; never assume a symbol from the marketplace. Pass currency to pin any configured code — e.g. to reproduce a figure the seller read on a dashboard set to another currency. 🏷️ 3P / 1P: an Amazon account sells through ONE programme: Seller Central (3P, channel SELLER: the seller sells its products to Amazon's customers) or Vendor Central (1P, channel VENDOR: Amazon BUYS the products from the vendor and resells them itself). On a Vendor Central read, the basis of units, sales and netSales is the answer's vendorTopLineNetReceived (said in its channelNote): when it is 1, units and sales of a Vendor Central row are Amazon's net received (what Amazon received from the vendor, net of what it returned, at its cost, on the day of the receipt: the Net received of the Vendor Central console) and netSales the net received less the quick-pay and early-payment discounts; what the vendor invoiced reads in vendorInvoiced; when it is 0, units and sales are what the vendor invoiced Amazon (its books, at the invoice date) and netSales the invoiced amount less Amazon's claims; Amazon's shelf (what it shipped to its customers, at its retail price, the latest days provisional, on ordered units) is read with vendorShippedUnits, vendorShippedRevenue and vendorShippedCogs. A vendor's profit is netProfit, the P&L's Net Profit: the P&L's top line (Amazon's net received when the answer's vendorTopLineNetReceived is 1, what the vendor invoiced Amazon when it is 0) less what Amazon takes off (its claims on the invoices, the discounts, the co-op, the chargebacks, the returns to vendor), the product cost and the ad spend. vendorShelfProfit is the result on what Amazon shipped, at the ship date: Amazon's shelf, the figure to compare products on, never added to the P&L. channel in list_accounts says which programme each account sells through. A call reads Seller Central, unless you pass channels=['VENDOR'] (do so only when the user asks about Vendor Central / 1P), the accounts of the call are all Vendor Central accounts, or you pass channels=['SELLER','VENDOR'] for All channels (when the user asks for the total across both programmes): Nova then reads both together as the app's All channels reading does, adding the seller's sales and the vendor's P&L top line. NEVER add 3P and 1P figures yourself: ask for All channels, or make one call per channel and present the two side by side, labelled 3P and 1P. When your scope holds a Vendor Central account the response says which channel it read ('SELLER', 'VENDOR' or 'ALL'), and channelNote what it read and what it left out; a metric the channel does not report (sessions, buy box, promotions on Vendor Central) comes back null with an unservedMetrics note, never 0.

NameRequiredDescriptionDefault
toYesPeriod end, INCLUSIVE (YYYY-MM-DD): a calendar month is from=YYYY-MM-01 to=its LAST day. to=the 1st of the next month adds one extra day to every total (and one extra bucket with a time grain).
fromYesPeriod start, INCLUSIVE (YYYY-MM-DD).
tagsNo"Your Filters" tag IDS from list_tags (manual custom tags or predefined segmentations) — a tag NAME is rejected. Tags of one drawer OR together, tags of different drawers AND together (the dashboard rule).
limitNo
metricYesA single metric key, e.g. "netSales" or "units" (natural names that mean exactly one metric are accepted too).
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
accountsNoRestrict to a subset of your own seller account IDs (from list_accounts). Omit to include all your accounts. A brand/account name is accepted and resolved to its id when it matches one of your accounts unambiguously; a label that carries the id ("Brand (A1B2C3D4E5F6G)") resolves to that id.
channelsNoThe Amazon programme the call reads. 'SELLER' = Seller Central (3P): the seller's own sales to Amazon's customers. 'VENDOR' = Vendor Central (1P): Amazon buys the products from the vendor and resells them. Omit = SELLER whenever the accounts of the call include a Seller Central account, else VENDOR. Pass ['VENDOR'] only when the user asks for Vendor Central / 1P figures. Pass ['SELLER','VENDOR'] for All channels, when the user asks for the total across both programmes: Nova reads them together as the app's All channels reading does, adding the seller's sales and the vendor's top line (Amazon's net received when the answer's vendorTopLineNetReceived is 1, what the vendor invoiced Amazon when it is 0), while a metric one programme measures stays that programme's figure.
currencyNoPin the reporting currency: one of the organization's configured codes — its primary or any of its secondary currencies (e.g. "USD"). Omit to follow the caller's Nova display currency, the dashboard's rule. Any other code is refused.
dimensionNoWhat to rank. Defaults to sku.
directionNodown = biggest losers (default), up = biggest gainers.
comparisonToYesBaseline period end (inclusive).
comparisonFromYesBaseline period start (inclusive).
costCategoriesNoThe cost categories the figures COUNT. Omit for every cost (the default, the P&L as the app shows it). "variable" = triggered by a unit sold or returned: cost of goods, FBM cost, referral and closing fees, FBA fulfillment, refund costs. "product" = keeping the product in stock and replenished: storage, long-term storage, inbound transportation and placement, prep. "oneOff" = a decision or a correction on the product: removals, disposals, deals and coupons, Vine, inventory reimbursements and clawbacks. "account" = billed to the account whatever the products: subscription, paid services, EPR. A category left out reads 0 on its own lines and is out of every total (totalAmazonFees, grossProfit, netProfit, the margins); sales, units and advertising never move. PROFIT WITHOUT ONE-OFFS = netProfit with costCategories ["variable","product","account"]; the profit on unavoidable costs alone = ["variable"]. One-offs are often a net CREDIT (reimbursements), so a profit without them can be lower than net profit.

TDQS

A4.1/5.0
Behavior5/5

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

readOnlyHint=true already covers the safety profile, yet the description still discloses return-side behavior that annotations cannot: notRanked and subscribeAndSaveNotice on Amazon S&S ranking, currencyBasis and a currencyNotice that must be relayed, channelNote and unservedMetrics coming back null rather than 0, and vendorTopLineNetReceived switching what units/sales/netSales mean. This is exactly the kind of operational context the schema does not carry.

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

Conciseness2/5

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

The purpose sentence is correctly front-loaded and the emoji section headers help navigation, but the body runs to many hundreds of words, with the entire 3P/1P P&L taxonomy, net-received-vs-invoiced mechanics and vendor shelf metrics expanded in full inside a find-the-biggest-movers tool. Much of that is shared domain background rather than this call's contract, so the actionable core is buried and each sentence does not earn its place.

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

Completeness5/5

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

With 14 parameters, five of them required, and no output schema, the description carries the full burden and does: it explains the ranking semantics, the period/baseline requirements, the currency resolution, what the response fields mean when channels are mixed, and what happens with unserved metrics. Nothing an agent needs in order to call this correctly or interpret the result is missing.

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

Parameters4/5

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

Coverage is 93%, so the schema already documents most parameters; the description still adds semantics the schema does not, notably the interaction rules for tags (one drawer ORs, different drawers AND), the reason costCategories should be used instead of manual subtraction, and the profit recipes (["variable","product","account"] for profit without one-offs). limit and reason get no mention in the description, but the schema handles them.

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

Purpose4/5

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

Opens with a concrete verb+resource+scope: rank entities (SKUs by default) by how far a metric moved between a period and a baseline, with direction="down" for losers. An agent knows exactly what it gets. It never names the sibling it is adjacent to (explain_movement), so the differentiation from that tool is left to inference.

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

Usage Guidelines4/5

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

Gives concrete selection rules for the non-obvious parameters: pass costCategories instead of subtracting lines yourself, pass channels=['VENDOR'] only when the user asks about 1P, ask for All channels rather than adding 3P and 1P yourself, pass currency to pin a code. That is real conditional guidance with an explicit anti-pattern ("NEVER add 3P and 1P figures yourself"). What is missing is guidance on when this tool rather than explain_movement or query_metrics is the right call.

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

get_cogs_worksheetA
Read-only
Inspect

One region's COGS worksheet — the import template as JSON: a row per (account, ASIN, SKU) catalog product and per existing cost period/batch, with the CURRENT value (currentCogs null = no COGS yet). Use it to match a seller's source file to exact SKUs/ASINs before building import_cogs rows (match by SKU first, ASIN as fallback), and to read a SKU's full FIFO ladder before restating it. missingOnly=true keeps only rows without a value. Paginate with limit/offset (total is returned). Vendor Central (1P) products are listed too, each row then carrying its channel ('SELLER' = Seller Central, 'VENDOR' = Vendor Central).

NameRequiredDescriptionDefault
limitNo
offsetNo
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
regionYesCOGS region code (from get_setup domain=cogs): 'US', 'UK', the Pan-EU pool 'EU', an EU country ('DE', 'FR', …), …
accountsNoRestrict to a subset of your own seller account IDs (from list_accounts). Omit to include all your accounts. A brand/account name is accepted and resolved to its id when it matches one of your accounts unambiguously; a label that carries the id ("Brand (A1B2C3D4E5F6G)") resolves to that id.
missingOnlyNotrue = only products without a current COGS value.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=true, but the description adds substantial context beyond that: currentCogs null meaning, missingOnly filtering, that total is returned with pagination, and that Vendor Central (1P) rows carry a `channel` field distinguishing SELLER vs VENDOR. This is exactly the extra behavioral detail the annotation can't convey.

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

Conciseness4/5

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

Front-loaded with the return shape and scope, then the usage workflow, then pagination and the channel caveat. Dense but well-ordered; the parenthetical detail is efficient. A touch long but every clause carries information.

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

Completeness5/5

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

No output schema exists, so the description must describe return values — and it does thoroughly (row granularity, currentCogs null, total, channel per row, missingOnly filtering). Given 6 params at 67% coverage, an agent has what it needs to call and interpret the result correctly.

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

Parameters4/5

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

Schema coverage is 67%, and the description adds value on top: it explains limit/offset pagination returns total, clarifies missingOnly semantics, and mentions the `channel` field appearing on each row. It doesn't elaborate on region or accounts, but those are well documented in the schema, so the incremental gain is solid but not exhaustive.

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

Purpose5/5

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

Names the specific resource (one region's COGS worksheet) and precisely describes its contents: a row per (account, ASIN, SKU) catalog product and per cost period/batch, with currentCogs. This distinguishes it cleanly from the other worksheet siblings (get_fbm_worksheet, get_vat_worksheet, etc.) as the COGS one.

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

Usage Guidelines5/5

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

Explicitly routes the agent: 'Use it to match a seller's source file to exact SKUs/ASINs before building import_cogs rows' names the downstream sibling and the prerequisite step, and 'read a SKU's full FIFO ladder before restating it' gives a second concrete use case. Match-by-SKU-then-ASIN precedence is spelled out.

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

get_fbm_worksheetA
Read-only
Inspect

One delivery zone's per-product FBM worksheet: a row per (account, ASIN, SKU) catalog product with its channel (isFbm), L24M sales and the CURRENT per-product override for that zone (currentCost null = the product falls on the seller's rate book). Use it to match a seller's per-product shipping file to exact SKUs/ASINs before building import_fbm_costs rows. Defaults to FBM products only (fbmOnly=false includes FBA); missingOnly=true keeps rows without an override. Paginate with limit/offset.

NameRequiredDescriptionDefault
zoneYesDelivery zone: an ISO-3166 alpha-2 country ('DE', 'GB' — never 'UK') or 'ROW' (rest of world).
limitNo
offsetNo
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
fbmOnlyNotrue (default) = merchant-fulfilled products only.
accountsNoRestrict to a subset of your own seller account IDs (from list_accounts). Omit to include all your accounts. A brand/account name is accepted and resolved to its id when it matches one of your accounts unambiguously; a label that carries the id ("Brand (A1B2C3D4E5F6G)") resolves to that id.
missingOnlyNotrue = only products without a per-product override for this zone.

TDQS

A4.4/5.0
Behavior4/5

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

readOnlyHint=true already establishes safety, and the description adds meaningful behavior: default FBM-only scope, fbmOnly=false including FBA, missingOnly behavior, pagination via limit/offset, and the key semantic that currentCost null means the seller's rate book applies. It leaves minor operational details (ordering, auth) unstated but covers the important data behavior.

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

Conciseness5/5

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

Front-loads the resource definition, then the intended use, then defaults/filters/pagination. Every clause carries information about the result shape or call behavior, with no filler.

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

Completeness4/5

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

There is no output schema, so the description appropriately explains the returned row composition (account, ASIN, SKU, isFbm, L24M sales, currentCost) and the null override meaning. It omits return ordering and pagination metadata, but is otherwise sufficient for an agent to call and interpret this read-only worksheet.

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

Parameters4/5

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

Schema coverage is high (71%), so the baseline is 3, but the description adds meaning beyond the schema by clarifying that fbmOnly=false includes FBA and by explaining the null-currentCost interpretation. It does not extend the accounts or reason parameters, but it meaningfully supplements the filtering semantics.

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

Purpose5/5

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

States the specific resource and shape: a per-delivery-zone FBM worksheet with one row per (account, ASIN, SKU) product, including channel, L24M sales, and current override. It distinguishes itself from the downstream import_fbm_costs sibling by positioning itself as the matching step before import, so an agent can identify its role without opening schemas.

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

Usage Guidelines4/5

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

Gives a clear use case ('match a seller's per-product shipping file to exact SKUs/ASINs before building import_fbm_costs rows') and explains the fbmOnly/missingOnly filtering modes. It does not explicitly name exclusion cases or contrast with all sibling worksheet tools, but the intended workflow is clear.

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

get_setupA
Read-only
Inspect

Start here for any seller input: the setup surface of ONE domain, as the header of its Data Inputs page shows it. Read it before an import (target format, valid codes, import steps) and again after, to verify. domain: 'cogs' (cost of goods): default currency, each region's catalog SKU count and how many SOLD SKUs are missing COGS (profit overstated there), region inheritance policies, the valid region codes. soldSkusMissingCogs drops after an import. Covers Seller Central (3P) and Vendor Central (1P) accounts alike; when the scope holds a 1P account, vendorCentral lists it with the rules of a 1P cost (the vendor's OWN product cost, never Amazon's Shipped COGS; period-based only). Next: get_cogs_worksheet, import_cogs. 'fbm' (merchant-fulfilled shipping cost): per account, WHERE the seller ships (delivery countries with their share of FBM sales over 24 months, grouped in containers — Europe, North America, Far East — each led by its biggest destination), which countries have a shipping rate ('priced'), which read their container's rate ('container'), which fall on the rest-of-world rate ('row'), and which have NOTHING ('required' — the P&L cannot price those orders), plus packing/picking handling rates, per-product overrides and legacy rows; the zone/kind/rule vocabulary and how the P&L resolves a cost. Next: get_fbm_worksheet, import_fbm_zone_rates, import_fbm_costs. 'stock' (replenishment: reorder quantities, lead times, external / 3PL stock, supplier orders): per account, the stock regions it holds stock in, how many products are fully parameterised (the five reorder parameters — production lead time, transit from the factory to the warehouse, transit lead time to Amazon, target days of cover at Amazon and at the external location — resolved per product × region: product row → product 'ALL' row → seller default per region → seller default 'ALL' → fleet default (Nova's number for the warehouse, read from the seller's shipments and never typed; the Warehouse & 3PL page shows it in gold); a product whose five do not all resolve gets NO recommendation), the seller defaults, how many products carry an external (own warehouse / 3PL) count, how many supplier orders are open, and the last imports. Read it before query_inventory with includeReorder=true, to know whether the recommendations rest on entered parameters. Next: get_stock_worksheet, import_stock_params, import_external_stock, import_supplier_orders. 'supply_chain' (the TOP table of the Supply chain page): per account the production lead time; per warehouse its name and city, the territories it ships to with their transit to Amazon and target stock at Amazon, the target stock held at the warehouse and the transit from the factory, each number with its source ('yours' = the seller typed it, 'fleet default' = Nova's proposal from the fleet's shipments, the page's gold figure; beside a number the seller typed, fleetDefault is the proposal it replaces), how many products it holds and how many have a count; and the factory lines (goods straight from a country to a territory). Per warehouse also: key, the departure point the warehouse is named after, as query_inventory's departurePoints[].key names it; departurePoints, its other departure points (name, city, country, sharePct of the units shipped into its territories, shipments, units, status alive or past, factory) and otherPoints, the smaller ones folded (count, shipments, units); shippedToAmazonL12M, what it sent to Amazon over twelve months (units, shipments, onTheWay counts, and lastShipment, the date of its last plan, read from the name Seller Central gives a plan by default: null as soon as a plan of the window carries no readable date, since a seller who renames its plans would otherwise read its last default-named plan, months old, as its last shipment; undatedShipments counts those renamed plans, still listed by Amazon); onTheWay, its shipments on their way to Amazon (id, name, Amazon's status, phase, destination, units, unitsReceived, skus, created: null on a renamed plan); awdSharePct, the share of its units sent to Amazon through AWD, in %; freight, how its transit from the factory was read (zone, factory country, averageLotUnits, toConfirm when no factory shipment was read). Per account remote: the territories Amazon serves from another territory's stock. evidenceSince: the first day of the shipments read. Nova reads the warehouses from the seller's shipments: they are never configured. Next: set_stock_defaults (writes these numbers), import_supply_chain (takes a warehouse's name on its lines), get_supply_chain_products (the product lines). 'vat': PER ACCOUNT and per VAT region (EU, UK, Mexico, and OutsideEU read-only…), whether AMAZON prices the tax (VCS — then the seller's categories never reach the P&L) or the seller's product category does, with the count of SOLD SKUs Nova has no VAT for (profit wrong there); the account's default category; the full category referential (code + name, incl. the Nova codes A_NOVA_ZERO / A_NOVA_STANDARD / A_NOVA_REDUCED); how the P&L resolves VAT. Read the account you import for — verdicts are never pooled across accounts. Next: get_vat_worksheet, import_vat_categories, set_vat_default_category.

NameRequiredDescriptionDefault
domainYesWhich seller input: 'cogs', 'fbm', 'stock' (replenishment parameters), 'supply_chain' (warehouses & 3PL) or 'vat'.
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
accountsNoRestrict to a subset of your own seller account IDs (from list_accounts). Omit to include all your accounts. A brand/account name is accepted and resolved to its id when it matches one of your accounts unambiguously; a label that carries the id ("Brand (A1B2C3D4E5F6G)") resolves to that id.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations only declare readOnlyHint; the description carries the real burden and does so richly — it discloses that warehouses are read from shipments and never configured, that lastShipment is null on renamed plans, that missing COGS/VAT means overstated profit, how the P&L resolves costs and VAT, and the parameter-resolution fallback chain for stock. This is exactly the kind of behavioral context annotations cannot provide.

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

Conciseness3/5

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

It is front-loaded with 'Start here for any seller input' and organized domain by domain, and most detail is genuinely interpretive. But it is a very long, semicolon-chained wall of text for a three-parameter tool, with some over-specified asides (the full lastShipment null rationale, the five-parameter resolution chain) that slow tool selection rather than enabling it.

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

Completeness5/5

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

With no output schema, the description compensates by describing the return contents per domain in enough depth to reason about what the call yields. For a read-only setup tool covering five domains, nothing essential to correct invocation or interpretation is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description earns more by expanding each `domain` enum value into a concrete inventory of what will be returned (e.g., soldSkusMissingCogs for cogs, priced/container/row/required for fbm). It does not add anything about the `reason` parameter, and `accounts` scoping is only implied ('verdicts are never pooled across accounts'), keeping it from a 5.

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

Purpose4/5

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

The description states the resource (the setup state of ONE seller-input domain) and enumerates each domain's contents in detail, which lets an agent distinguish it from the worksheet/import siblings. The opening phrase 'setup surface ... as the header of its Data Inputs page shows it' is somewhat abstract, but the per-domain breakdown removes ambiguity.

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

Usage Guidelines5/5

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

Explicit sequencing is given: read before an import to learn target format/valid codes, read again after to verify; for stock, read before query_inventory with includeReorder=true; for VAT, read the specific account because verdicts are never pooled. Each domain also names the next tools (get_cogs_worksheet, import_cogs, etc.), so the agent knows the alternatives and when they apply.

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

get_stock_worksheetA
Read-only
Inspect

One stock region's replenishment worksheet — the rows of the Data Inputs 'Stocks' page as JSON: a row per (account, ASIN) that holds or sells stock in the region, with the row's OWN values (own: what import_stock_params wrote for that product × region), what each of the five parameters RESOLVES to (resolved: product row → product 'ALL' row → account default for the region → account default 'ALL'), where each came from (source: asin_region | asin_all | seller_region | seller_all | null = nothing → no recommendation), paramsComplete, and the velocity / FBA stock next to it. region 'ALL' lists the product × 'ALL' rows (where a production lead time naturally lives). Use it to match a seller's lead-time file to exact ASINs before import_stock_params; missingOnly=true keeps the products that still resolve nothing for at least one parameter. Paginate with limit/offset.

NameRequiredDescriptionDefault
limitNo
offsetNo
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
regionYesA stock region as get_setup domain=stock lists them ('USA', 'EU_FBA', 'UK', 'Canada'…; 'US', 'EU', 'GB' are accepted) or 'ALL' (every region without its own row).
searchNoASIN or product name substring.
accountsNoRestrict to a subset of your own seller account IDs (from list_accounts). Omit to include all your accounts. A brand/account name is accepted and resolved to its id when it matches one of your accounts unambiguously; a label that carries the id ("Brand (A1B2C3D4E5F6G)") resolves to that id.
missingOnlyNotrue = only products whose five RESOLVED parameters are not all set.

TDQS

A4.3/5.0
Behavior4/5

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

With readOnlyHint=true the safety profile is covered, and the description adds substantive behavior: the resolution precedence chain (product row → product 'ALL' → account default region → account default 'ALL'), the meaning of source=null (no recommendation), and region 'ALL' semantics. It doesn't describe pagination totals or return envelope, but the resolution model is unusually well disclosed.

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

Conciseness3/5

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

Purpose is front-loaded, but the body is a single dense run-on packed with internal jargon (own/resolved/source/paramsComplete) that is harder to parse than it needs to be. Most clauses earn their place, yet the structure could be broken up for readability.

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

Completeness5/5

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

For a 7-param tool with no output schema, the description explains the return shape inline (own values, resolved values, source provenance, paramsComplete, velocity/FBA stock) and covers the resolution logic and 'ALL' region, so an agent knows both what it gets and how to interpret it.

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

Parameters4/5

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

Schema coverage is 71% and already documents region, reason, search, accounts, and missingOnly. The description adds meaning beyond the schema: what region 'ALL' actually lists (product × 'ALL' rows where a production lead time lives) and that missingOnly filters on RESOLVED parameters resolving nothing. limit/offset are only touched by 'Paginate with limit/offset'.

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

Purpose5/5

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

States a specific verb+resource ('get_stock_worksheet' → one region's replenishment worksheet = Data Inputs 'Stocks' page rows) and defines the row grain as (account, ASIN). It clearly differentiates itself from the *_worksheet siblings (cogs, fbm, vat, tags) by naming the exact page and the resolution semantics it returns.

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

Usage Guidelines4/5

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

Gives an explicit use case ('match a seller's lead-time file to exact ASINs before import_stock_params') and a conditional behavior (missingOnly=true keeps products that resolve nothing). It ties sequencing to import_stock_params, but doesn't explicitly say when to use a different worksheet tool instead.

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

get_supply_chain_productsA
Read-only
Inspect

The PRODUCT table of the Supply chain page ("Product overrides") as the page shows it (2026-10-22): one line per product × warehouse, the lines of the page's file, which import_supply_chain writes. Each line carries the account, the warehouse (its name as get_setup domain=supply_chain lists it, its region: the territory its count and orders are keyed on, its country), the ASIN with its name and SKU count, dailyUnitsSold (Daily units sold, summed over the territories the warehouse ships to), the count At warehouse / 3PL (warehouseUnits: 0 is a count, null = never counted; countedOn; countLocation 'own' or '3pl'), the OPEN supplier orders one by one (orders: reference, units, expectedOn, overdue = expected before today UTC, createdOn; import_supply_chain closes an order on its reference), On order (onOrderUnits, nextExpectedOn, overdueOrders) and numbers, the six numbers of the line (casePack, targetStockAtAmazonDays, targetStockAtWarehouseDays, transitToAmazonDays, transitToWarehouseDays, productionLeadTimeDays), each { value, source } by the page's rule: the product's own number ('product': its override, the page's black figure) → the warehouse's number saved in the Warehouse & 3PL setup ('warehouse': the page's grey inherited figure), or for the production lead time the account's ('account') → Nova's fleet default ('fleet default': read from the fleet's shipments, the page's gold figure) → null when nothing resolves (a case pack is the product's or nothing). On a line straight from the factory (warehouse.straightFromFactory, the page's « Straight from the factory ») there is no warehouse on the way: warehouseUnits is null, targetStockAtWarehouseDays and transitToWarehouseDays read { value: null, source: 'not applicable' } (the page's n/a; the recommendation reads them 0) and transitToAmazonDays is the whole trip, factory to sellable at Amazon. view reads the page's views: missing-count (no count at the warehouse; never a line straight from the factory), overdue-deliveries (an open order past its expected date), missing-lead-time (no production lead time typed on the product or on the account); counts gives the size of each view under the same search and filters. Use it to match a seller's file to the exact lines before import_supply_chain, and after, to verify. Paginate with limit/offset.

NameRequiredDescriptionDefault
skusNoOnly the products of these SKUs.
tagsNo"Your Filters" tag IDS from list_tags (manual custom tags or predefined segmentations, Brand included) — a tag NAME is rejected.
viewNoThe page's view: 'all' (default), 'missing-count' (no count at the warehouse), 'overdue-deliveries' (an open supplier order past its expected date), 'missing-lead-time' (no production lead time typed on the product or on the account).
asinsNoOnly these ASINs.
limitNo
offsetNoRow offset for pagination (default 0).
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
searchNoASIN, SKU or product name substring (the page's search).
accountsNoRestrict to a subset of your own seller account IDs (from list_accounts). Omit to include all your accounts. A brand/account name is accepted and resolved to its id when it matches one of your accounts unambiguously; a label that carries the id ("Brand (A1B2C3D4E5F6G)") resolves to that id.
warehouseNoOne warehouse: its name as get_setup domain=supply_chain lists it ("UNIS, Buena Park", or "UNIS"), or a stock region ('USA', 'EU_FBA', 'UK', 'Canada'…; 'US', 'EU', 'GB' are accepted) for the warehouse serving it. Omit for every warehouse.

TDQS

A4.2/5.0
Behavior5/5

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

Beyond the readOnlyHint, the description discloses a great deal: the six-number resolution chain (product → warehouse → account → fleet default → null), the straight-from-factory exception with null warehouseUnits and 'not applicable' sources, overdue defined as expected before today UTC, and that import_supply_chain closes orders by reference. These are exactly the non-obvious behaviors an agent would otherwise get wrong.

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

Conciseness3/5

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

It front-loads the identity of the resource correctly, but the bulk is one long run-on paragraph of field-by-field column semantics with parenthetical asides. Nearly every detail is substantive, yet the packing makes it hard to scan and would benefit from being split into purpose / fields / views / usage sections.

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

Completeness5/5

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

With no output schema and only a readOnly annotation, the description carries the full burden of explaining the returned rows — and it does, covering accounts, warehouses, regions, ASIN/SKU counts, units, open orders and the numbers object with sources. An agent can reason about the payload without ever calling the tool.

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

Parameters4/5

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

Schema coverage is already 90%, so the baseline is 3, but the description adds genuine meaning: view semantics (missing-count never applies to straight-from-factory lines), warehouse resolution and region aliases, and what 'counts' returns. It does, however, reference a `counts` capability that has no corresponding parameter in the schema, which is mildly confusing.

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

Purpose4/5

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

States a concrete verb+resource: reading the Product table of the Supply chain page, one line per product × warehouse, with a named producer (import_supply_chain) and a named consumer workflow. It is unambiguously distinguishable from siblings like get_stock_worksheet or query_inventory, though the sheer density of field-level detail buries the core statement.

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

Usage Guidelines4/5

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

Explicitly says to use it 'to match a seller's file to the exact lines before import_supply_chain, and after, to verify', which is a real when-to-use condition tied to a specific sibling. It also cross-references get_setup for warehouse naming and explains pagination, but offers no explicit exclusions for when another worksheet tool is the better choice.

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

get_tags_worksheetA
Read-only
Inspect

The product-tagging worksheet of ONE workspace — the template as JSON: the drawers (tag groups) the workspace has, and a row per (account, ASIN, SKU) catalog product with its CURRENT tags per drawer (tags: {Brand: ['Acme']}; predefined rule-based drawers are computed and never listed). Use it to match a seller's tagging file to exact SKUs/ASINs before building import_product_tags rows; drawer + untaggedOnly=true lists the products not yet tagged in that drawer. CHANNELS: lists Seller Central (3P) products by default; pass channels=['VENDOR'] for the Vendor Central (1P) products, or ['SELLER','VENDOR'] for both. Each row then carries channel; a 1P row is one product per (account, ASIN), tagged under its ASIN: its sku IS the ASIN (copy it as is into import_product_tags with channel 'VENDOR') and vendorCode is the code the 1P pages print. An ASIN sold on both channels is two rows, tagged apart. One workspace in scope = implicit; several = pass workspace. Paginate with limit/offset.

NameRequiredDescriptionDefault
limitNo
drawerNoRestrict the tags shown to this drawer.
offsetNo
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
channelsNoSelling channels to list: 'SELLER' = Seller Central (3P) products, 'VENDOR' = Vendor Central (1P) products, both = one list. Omit = SELLER only.
workspaceNoWorkspace id or name (from list_accounts). Required only when several workspaces are in scope.
untaggedOnlyNoWith drawer: only products with no tag in that drawer.

TDQS

A5/5.0
Behavior5/5

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

With `readOnlyHint: true` already covering safety, the description adds substantial behavior: predefined rule-based drawers are computed and never listed, channel filtering changes row structure, and 1P rows have `sku` equal to the ASIN. It also explains that an ASIN sold on both channels appears as two separate rows.

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

Conciseness5/5

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

Despite being a dense paragraph, it is front-loaded with the core purpose and every sentence carries operational information about filtering, channels, row semantics, or pagination. There is no filler or repetition.

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

Completeness5/5

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

For a complex read-only worksheet tool with no output schema, the description supplies the return shape, row identity, channel-dependent behavior, drawer behavior, and pagination model. An agent has enough information to call it correctly without needing the output schema.

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

Parameters5/5

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

The description adds meaning well beyond the 71%-covered schema for key parameters: `workspace` is implicit when one workspace is in scope, `channels` defaults to Seller Central and changes the returned rows, and `drawer` + `untaggedOnly` has a specific filtering meaning. It also explains pagination via `limit`/`offset`.

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

Purpose5/5

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

The description names a specific resource and verb: it returns the product-tagging worksheet for one workspace as JSON, including drawers and per-product current tags. It clearly distinguishes this from related workflow tools by naming `import_product_tags` and by explaining the worksheet/template role.

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

Usage Guidelines5/5

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

It explicitly says to use this before building `import_product_tags` rows to match a seller's tagging file to exact SKUs/ASINs. It also gives concrete usage variants: `drawer` plus `untaggedOnly=true` for products not yet tagged in a drawer, and `channels` for 3P vs 1P vs both.

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

get_vat_worksheetA
Read-only
Inspect

One VAT region's worksheet — the same rows as the dashboard table: a row per (account, ASIN, SKU) sold product with its CURRENT category (null = none). missingOnly=true applies the dashboard's own definition of missing (on a region Amazon prices, a product with a measured treatment is not missing). Use it to match a seller's tax-class file to exact SKUs/ASINs before building import_vat_categories rows. Server-side pagination: limit/offset, total returned.

NameRequiredDescriptionDefault
limitNo
offsetNo
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
regionYesVAT region: 'EU' or 'UK' (a category only matters there).
accountsNoRestrict to a subset of your own seller account IDs (from list_accounts). Omit to include all your accounts. A brand/account name is accepted and resolved to its id when it matches one of your accounts unambiguously; a label that carries the id ("Brand (A1B2C3D4E5F6G)") resolves to that id.
missingOnlyNotrue = only products Nova has no VAT for.

TDQS

A4.4/5.0
Behavior4/5

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

With readOnlyHint already declaring safety, the description adds useful behavioral detail: null category meaning, the dashboard's specific definition of missingOnly, and server-side pagination with limit/offset and total returned. It does not cover auth or rate limits, but those are not central here.

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

Conciseness5/5

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

The description is front-loaded with the resource and row shape, then explains missingOnly, gives the intended use, and ends with pagination. Every sentence carries useful information with no filler.

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

Completeness4/5

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

For a six-parameter read-only worksheet tool with no output schema, the description explains the returned row shape, the special missingOnly semantics, the intended downstream use, and pagination. Remaining gaps like account-filter behavior and reason are adequately covered by the schema.

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

Parameters4/5

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

Schema coverage is 67%, so the schema handles region, accounts, and reason reasonably well. The description adds real meaning for missingOnly by explaining the dashboard's precise missing-definition, and it clarifies limit/offset pagination and total returned.

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

Purpose5/5

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

The description states precisely what the tool returns: one VAT region's worksheet with a row per (account, ASIN, SKU) sold product and its current category. It distinguishes itself from downstream import_vat_categories by framing the worksheet as the input used before building import rows.

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

Usage Guidelines4/5

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

It gives a clear use case—matching a seller's tax-class file to exact SKUs/ASINs before constructing import_vat_categories rows. It does not explicitly name when not to use it or list alternative tools, but the context is concrete.

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

import_cogsAInspect

Import COGS (cost of goods) rows for ONE seller account — TWO-STEP, never skip the preview: call WITHOUT commit first; the server validates and returns per-row warnings, a SKU-grain diff and a confirmationToken. SHOW the diff and warnings to the user and only after their explicit approval call again with the SAME account/mode/region/rows plus commit:true and the token. Mode 'merge' (default, safe for partial files) touches ONLY the keys you send: a 'fixed' row replaces the same period of its (asin, sku, region) and other periods survive; 'fifo' rows REPLACE that SKU's whole batch ladder — send the complete ladder (read it first with get_cogs_worksheet). Mode 'replace' wipes and restates every (account, region) present in rows — destructive with a partial payload, only for a full-region statement. Up to 2000 rows per call; for bigger files send several merge-mode calls. A Vendor Central (1P) account takes the vendor's own product cost, period-based only: 'fifo' rows are refused for it. Requires the OAuth connection (not a workspace API token) and the OWNER role.

NameRequiredDescriptionDefault
modeNo'merge' (default): only the sent keys change. 'replace': wipe + restate each (account, region) present in rows.
rowsYes
commitNoOmit/false = preview (validate + diff, no write). true = write; requires the confirmationToken from the preview.
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
regionNoDefault COGS region for rows that do not carry their own.
accountYesThe seller account (seller_partner_id, or an unambiguous account name) the rows belong to. One account per call.
confirmationTokenNoThe token the preview returned — proves the user saw exactly this payload.

TDQS

A4.8/5.0
Behavior5/5

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

The only annotation is readOnlyHint=false, so the description carries the rest and does it well: it discloses the destructive blast radius of 'replace' ('wipes and restates every (account, region) present in rows'), that merge touches ONLY sent keys, that fifo replaces the whole batch ladder, the preview-returns-token mechanism, plus auth prerequisites (OAuth connection, not a workspace API token) and the OWNER role requirement.

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

Conciseness4/5

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

Front-loads the two-step rule, then mode semantics, then limits and prerequisites — a sensible ordering with no filler sentences. It is dense as a single block and repeats enum semantics that the schema also states, which costs it the top score.

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

Completeness5/5

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

No output schema exists, and the description compensates by explaining what the preview returns (per-row warnings, SKU-grain diff, confirmationToken) and what the commit call expects. Combined with auth and role requirements, an agent has everything needed to call this safely.

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

Parameters4/5

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

Schema coverage is 86%, so the schema already documents most fields; the description adds the relational semantics the schema can't express — what a 'fixed' row replaces versus what a 'fifo' row replaces, and why mode choice changes destruction scope. It largely restates the mode enum and the 2000-row cap that already live in the schema, keeping it just short of a 5.

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

Purpose5/5

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

Specific verb and resource ('Import COGS (cost of goods) rows for ONE seller account') with explicit scope (one account per call). It distinguishes itself from the read-side sibling by telling the agent to read the ladder first with get_cogs_worksheet, so the boundary is clear 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.

Usage Guidelines5/5

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

Gives an explicit workflow: call first without commit, show the diff and warnings, then re-call with commit:true and the token. It states when each mode applies ('merge' safe for partial files, 'replace' only for a full-region statement), when to split calls (>2000 rows), and the 1P exclusion for 'fifo'. No alternatives are left to inference.

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

import_external_stockAInspect

DEPRECATED (2026-10-22): use import_supply_chain (warehouseUnits and countedOn per line); this tool stays for callers that still use it. Import the EXTERNAL STOCK of ONE account — the units the seller holds OUTSIDE Amazon (own warehouse or 3PL), per product × stock region: the fourth rung of the coverage ladder, what query_inventory returns as externalStock and counts in coverageWithExternal / recommendedOrderQty. A count is CURRENT state, not a movement: one row per (product, region) with the units on hand and the count date; 0 is a real count, an absent row means unknown (never 0). TWO-STEP like import_stock_params: preview WITHOUT commit (warnings + per-region diff + confirmationToken), show the user, then commit with the token. Mode 'merge' (default) upserts only the (ASIN, region) rows you send; 'replace' restates every (account, region) present in rows — a product absent from rows loses its count there. Up to 2000 rows per call. Requires the OAuth connection and the OWNER role.

NameRequiredDescriptionDefault
modeNo'merge' (default): only the sent rows change. 'replace': restate each (account, region) present in rows.
rowsYes
commitNoOmit/false = preview (validate + diff, no write). true = write; requires the confirmationToken from the preview.
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
accountYesThe seller account (seller_partner_id, or an unambiguous account name). One account per call.
confirmationTokenNoThe token the preview returned — proves the user saw exactly this payload.

TDQS

A4.2/5.0
Behavior3/5

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

Annotations only declare readOnlyHint=false; the description carries the rest and does it well, disclosing the two-step preview/commit requirement, the OWNER role + OAuth prerequisite, the 2000-row cap, the destructive semantics of 'replace' (rows absent lose their count), and the 0-vs-absent distinction. That is substantial mutation-transparency value beyond the annotations, though it does not describe the diff/warning payload in detail.

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

Conciseness4/5

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

Front-loads the deprecation notice and the routing instruction, then the semantics. It is dense and somewhat long for a single description, but nearly every clause (coverage ladder position, 0-vs-absent, merge/replace, row cap, role) carries operational weight.

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

Completeness5/5

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

For a mutation tool with no output schema, the description supplies everything an agent needs to call it correctly: prerequisites, two-step flow, mode semantics, row limits, and the absent-vs-zero interpretation. Nothing critical is left for the agent to infer.

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

Parameters3/5

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

Schema coverage is 83%, so the schema already documents most parameters (mode, asOf, region, quantity, commit, confirmationToken, reason, account). The description reinforces mode semantics and the preview/commit token flow, and clarifies that '0 is a real count, absent means unknown', but this largely duplicates the schema text rather than adding new syntax or constraint detail. Baseline 3 is appropriate given the high coverage.

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

Purpose5/5

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

States a specific verb (import) and resource (external stock of ONE account, units held outside Amazon per product × region) and positions it precisely within the product's data model (externalStock, coverageWithExternal). It explicitly distinguishes itself from import_supply_chain as the deprecated predecessor, so an agent can pick the right tool without opening the schema.

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

Usage Guidelines5/5

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

Explicitly says the tool is DEPRECATED and to prefer import_supply_chain for new callers, then gives the remaining use case. It also prescribes the mandatory workflow (preview without commit, show user, then commit with token) and spells out when 'merge' vs 'replace' applies.

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

import_fbm_costsAInspect

Import PER-PRODUCT FBM cost overrides for ONE account: the exceptions to the rate book (a product that ships at its own cost to a zone). A row's zone is a delivery country ('DE') or 'ROW'; the override wins over the seller's zone rate for that destination. A row's rule says what its cost multiplies ('per_unit', 'per_parcel'); without one it follows the zone rate's rule. TWO-STEP like import_cogs: preview WITHOUT commit (warnings + SKU-grain diff + confirmationToken), show the user, then commit with the token. Mode 'merge' (default) upserts only the (asin, sku, zone, period) keys you send; 'replace' wipes and restates every (account, zone) present in rows, destructive with a partial payload. Up to 2000 rows per call. Requires the OAuth connection and the OWNER role.

NameRequiredDescriptionDefault
modeNo'merge' (default): only the sent keys change. 'replace': wipe + restate each (account, zone) present in rows.
rowsYes
zoneNoDefault zone for rows that do not carry their own: a delivery country ('DE', 'GB') or 'ROW'.
commitNoOmit/false = preview (validate + diff, no write). true = write; requires the confirmationToken from the preview.
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
accountYesThe seller account (seller_partner_id, or an unambiguous account name). One account per call.
confirmationTokenNoThe token the preview returned — proves the user saw exactly this payload.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations provide only readOnlyHint=false, so the description carries nearly the full burden and does so: it discloses the destructive scope of 'replace' (wipes and restates every (account, zone) present), the confirmationToken requirement, the 2000-row cap, and the OAuth + OWNER role prerequisite. These are the exact traits an agent needs before invoking a mutation.

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

Conciseness4/5

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

Front-loaded with the core identity, then workflow, mode semantics, limits and prerequisites in a tight sequence. A couple of clauses restate schema-level details (e.g. the rule multipliers), costing a bit of density but nothing is truly wasted.

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

Completeness4/5

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

With no output schema, the description usefully sketches the preview return (warnings, SKU-grain diff, confirmationToken). It says less about what a successful commit returns, but for a 7-param destructive import the coverage is close to sufficient.

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

Parameters4/5

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

Schema coverage is already 86%, yet the description still adds real meaning: it explains that zone is a delivery country or 'ROW', that rule controls what cost multiplies ('per_unit'/'per_parcel'/inherit), and spells out the exact upsert key set (asin, sku, zone, period) for merge mode. Some of the rule/period explanation duplicates the schema text.

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

Purpose5/5

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

Opens with a specific verb+resource+scope: 'Import PER-PRODUCT FBM cost overrides for ONE account', and immediately frames the data as 'the exceptions to the rate book', which distinguishes it from the sibling import_fbm_zone_rates without the agent opening either schema.

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

Usage Guidelines4/5

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

Clearly states the two-step workflow (preview without commit, then commit with token) and explains exactly when 'merge' vs 'replace' applies, warning that replace is destructive with a partial payload. It doesn't explicitly name import_fbm_zone_rates as the alternative for base zone rates, leaving that routing to inference.

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

import_fbm_zone_ratesAInspect

Import the seller's FBM RATE BOOK for ONE account — the rates the P&L applies to merchant-fulfilled orders: 'shipping' per container ('EU_REGION', 'NA_REGION', 'FE_REGION': one rate for every country of it without a rate of its own), per delivery country ('DE', 'FR'…) or 'ROW' (every other country), and the handling costs 'packing' (per parcel) and 'picking' (per unit) on a container or on 'ALL'. This is the FIRST thing to set up: nothing is priced until a zone rate exists. TWO-STEP, never skip the preview: call WITHOUT commit; the server validates and returns per-line warnings, a diff (one line per zone|kind) and a confirmationToken; show them to the user and only after explicit approval call again with the SAME account/mode/rows plus commit:true and the token. Mode 'merge' (default) adds or updates only the (zone, kind, period) lines you send; 'replace' restates the WHOLE rate book — every line absent from rows is deleted. Requires the OAuth connection and the OWNER role.

NameRequiredDescriptionDefault
modeNo'merge' (default): only the sent lines change. 'replace': the rows are the entire rate book.
rowsYes
commitNoOmit/false = preview (validate + diff, no write). true = write; requires the confirmationToken from the preview.
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
accountYesThe seller account (seller_partner_id, or an unambiguous account name). One account per call.
confirmationTokenNoThe token the preview returned — proves the user saw exactly this payload.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only mark readOnlyHint=false; the description goes far beyond by disclosing the preview/validation/diff/confirmationToken flow, that 'replace' deletes every absent line, and the OAuth + OWNER role requirement. These are exactly the mutation and destructive-behavior details an agent needs before calling.

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

Conciseness4/5

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

Front-loads the purpose, then the two-step mandate, then mode semantics, then prerequisites — a logical order with no filler sentences. It is a single dense paragraph with heavy parenthetical nesting, which slightly hurts scanability.

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

Completeness5/5

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

For a mutation tool with no output schema, the description supplies what's needed: it describes the preview's return (per-line warnings, a diff, a token), the confirm flow, the merge/replace consequences, and auth requirements. Nothing essential to calling it correctly is missing.

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

Parameters4/5

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

Schema coverage is already 83%, so the schema carries most parameter meaning; the description adds value by explaining zone containers ('one rate for every country of it without a rate of its own'), the 'ALL' zone for packing/picking, and that the commit call must repeat the SAME account/mode/rows plus the token. It largely restates zone/kind semantics already in the schema, so not a full 5.

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

Purpose4/5

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

States a specific verb (Import) and resource (FBM rate book) with scope 'ONE account', and enumerates what the rates cover (shipping per container/country/ROW, packing per parcel, picking per unit). It is unmistakably clear what the tool does, though it never names a sibling (e.g. import_fbm_costs) to distinguish itself from.

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

Usage Guidelines5/5

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

Explicitly says this is the FIRST thing to set up and 'nothing is priced until a zone rate exists', mandates the two-step preview-then-commit flow, and explains when to pick 'merge' vs 'replace'. The conditions that select each behavior are spelled out, not implied.

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

import_product_tagsAInspect

Tag products in ONE workspace — TWO-STEP like import_cogs: call WITHOUT commit; the server checks every product against the catalog, routes each drawer (existing local drawer, organization-shared drawer — assignments only, unknown tags skipped —, or a NEW local drawer created for you) and returns per-row warnings, a per-drawer diff, the BEFORE → AFTER of every (SKU, drawer) statement and a confirmationToken; SHOW them to the user, then commit with the SAME mode/rows plus commit:true and the token. mode is REQUIRED and says how a tags[drawer] cell is read: 'set' = the EXACT tags of this SKU in that drawer — tags not named are dropped, [] or null removes the SKU from the drawer; use it for a spreadsheet column or to move between exclusive tags (Summer → Winter). 'add' = these tags are ADDED to what the SKU already carries, nothing is ever removed; use it when the seller says 'add', 'also', 'tag these as'. Nothing outside the named cells changes (no drawer is deleted, unnamed products are untouched). VENDOR CENTRAL (1P): a 1P product is tagged under its ASIN — name it with the row get_tags_worksheet(channels=['VENDOR']) prints (sku = the ASIN) and channel 'VENDOR'; the tag then follows the product's 1P rows even after Amazon's vendor code changes. A row tags ONE product: an ASIN sold on both channels needs a 3P row (its SKU) and a 1P row (channel 'VENDOR') to be tagged on both. Tags then work as tags filters on the query tools and as the groupBy "tag" grain of query_metrics (list_tags gives their ids). One workspace in scope = implicit; several = pass workspace. Up to 2000 rows per call. Requires the OAuth connection.

NameRequiredDescriptionDefault
modeYesREQUIRED — say how a cell is read. 'set': the exact tag set of the SKU in that drawer (tags not named are dropped; a spreadsheet column, or a move between exclusive tags). 'add': added to the SKU's existing tags, never removes ('add', 'also', 'tag these as').
rowsYes
commitNoOmit/false = preview (validate + diff, no write). true = write; requires the confirmationToken from the preview.
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
workspaceNoWorkspace id or name. Required only when several workspaces are in scope.
confirmationTokenNoThe token the preview returned — proves the user saw exactly this payload.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only say readOnlyHint=false, so the description carries the burden and does it: it discloses that a no-commit call validates against the catalog, returns per-row warnings, a per-drawer diff, BEFORE → AFTER statements and a confirmationToken, that unknown tags in the org-shared drawer are skipped, that nothing outside the named cells changes, that creating drawers/tags needs the owner role, the 2000-row cap, and the OAuth requirement.

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

Conciseness4/5

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

It is a single dense block, but it is front-loaded with the two-step contract and the safety guarantee ('nothing outside the named cells changes'). Some sentences restate the `mode` schema description nearly verbatim, which costs a little against the otherwise tight prose.

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

Completeness5/5

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

No output schema exists, and the description compensates by enumerating exactly what the preview returns (warnings, per-drawer diff, BEFORE → AFTER per SKU/drawer, token). For a 6-parameter bulk mutation tool, an agent has everything needed to call it safely.

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

Parameters5/5

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

Schema coverage is already 83%, yet the description still adds cross-parameter meaning the schema cannot: how `tags[drawer]` cells are read under each `mode`, that null/[] removes in 'set' but is a no-op in 'add', that a single string is comma-split, that `channel`/`sku` resolve 1P vs 3P, and that the commit call must reuse the same mode/rows plus the token.

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

Purpose5/5

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

States a specific verb and resource ('Tag products in ONE workspace') and immediately frames it as a two-step import modeled on import_cogs, which distinguishes it from get_tags_worksheet, list_tags, and the other import_* siblings.

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

Usage Guidelines5/5

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

Gives explicit when-to-use routing: 'set' for a spreadsheet column or an exclusive-tag move (Summer → Winter), 'add' when the seller says 'add', 'also', 'tag these as'. It also spells out the preview-then-commit sequence, when to pass `workspace` (several in scope only), and how 1P rows are named.

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

import_stock_paramsAInspect

DEPRECATED (2026-10-22): use import_supply_chain, the Supply chain table as one line per product and warehouse, which changes only the lines it names; this tool stays for callers that still use it. Import the REORDER PARAMETERS of ONE account — per product × stock region (or 'ALL'): production lead time, transit lead time to Amazon, lead time from the factory to the warehouse (leadTimeToWarehouseDays), target days of cover at Amazon and at the external location, case pack. A product needs all five to RESOLVE (its own row → its 'ALL' row → the account defaults) before query_inventory recommends anything; a blank field resolves to the next rank, so set the account-wide values with set_stock_defaults and import here only the exceptions. A seller shipping straight from the factory to FBA has an external target of 0 and a to-warehouse lead time of 0, not blank. TWO-STEP, never skip the preview: call WITHOUT commit; the server validates (ASINs against the account's stocked products, regions, ranges) and returns per-row warnings, an ASIN-grain diff per (account, region) and a confirmationToken; show them to the user and only after explicit approval call again with the SAME account/mode/rows plus commit:true and the token. Mode 'merge' (default) touches only the (ASIN, region) rows you send, FIELD by field — a field you omit keeps its current value, null clears it; 'replace' restates every (account, region) present in rows whole — a product absent from rows loses its row there, an omitted field is blank. A row with nothing on it is refused (an import never clears a row). Up to 2000 rows per call. Requires the OAuth connection and the OWNER role.

NameRequiredDescriptionDefault
modeNo'merge' (default): only the sent rows change. 'replace': restate each (account, region) present in rows.
rowsYes
commitNoOmit/false = preview (validate + diff, no write). true = write; requires the confirmationToken from the preview.
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
accountYesThe seller account (seller_partner_id, or an unambiguous account name). One account per call.
confirmationTokenNoThe token the preview returned — proves the user saw exactly this payload.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations carry only readOnlyHint=false, so the description carries the behavioral burden and does: server-side validation scope (ASINs against stocked products, regions, ranges), returned per-row warnings and ASIN-grain diff, confirmationToken requirement, the 2000-row cap, refusal of empty rows, and the OAuth + OWNER role prerequisite. Merge/replace semantics are spelled out field by field, including that omitted keeps vs blanks and that null clears.

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

Conciseness4/5

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

Front-loaded with the deprecation and successor, then the core operation; every clause is dense with operative content. It loses a point for restating material the schema already documents at length — merge/replace behavior appears in both the prose and the mode/field descriptions, and 'up to 2000 rows' duplicates maxItems.

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

Completeness5/5

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

For a two-step, role-gated, 2000-row batch mutation with no output schema, the description supplies everything needed to call it correctly: prerequisites, preview/commit flow, token handling, validation feedback shape, row and field semantics, and the fallback resolution model. Nothing material is left to inference.

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

Parameters5/5

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

Schema coverage is already 83%, but the description adds meaning the schema cannot: the three-rank resolution hierarchy (own row → 'ALL' row → account defaults) that explains why a blank field is legitimate, and the merge-vs-replace consequence per field. It also documents the ALL pseudo-region and the deprecation path, which no parameter doc covers.

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

Purpose5/5

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

Opens with the deprecation and names the successor (import_supply_chain), then states a precise verb+resource: import the reorder parameters of one account, per product × stock region. An agent can tell this apart from set_stock_defaults and import_supply_chain 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.

Usage Guidelines5/5

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

Gives explicit routing: set account-wide values with set_stock_defaults and import only exceptions here; use import_supply_chain for the new table. Adds hard procedural rules — never skip the preview, call again with commit:true plus the token only after user approval — plus the factory-to-FBA edge case where external target and to-warehouse lead time are 0, not blank.

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

import_supplier_ordersAInspect

DEPRECATED (2026-10-22): use import_supply_chain (orderUnits, expectedOn, reference and status per line, one line per order); this tool stays for callers that still use it. Import the SUPPLIER ORDERS of ONE account — the seller's purchase orders on ITS supplier (not Amazon Vendor POs), per product × stock region: the fifth rung of the ladder, what query_inventory returns as onOrderUnits / nextExpectedAt and counts in coverageTotal / recommendedOrderQty. Only OPEN lines count; 'received' and 'cancelled' are history. TWO-STEP like import_stock_params: preview WITHOUT commit (warnings + per-region diff + confirmationToken), show the user, then commit with the token. Mode 'merge' (default): a line WITH a reference updates the line of the same (product, region, reference) — re-send it with status 'received' when the goods land —, the lines WITHOUT a reference restate the OPEN unreferenced book of their (product, region) — re-sending them is safe, received / cancelled lines untouched; 'replace' restates the OPEN order book of every (account, region) present in rows (open lines absent from rows are deleted, history untouched) and accepts status 'open' only. Up to 2000 rows per call. Requires the OAuth connection and the OWNER role.

NameRequiredDescriptionDefault
modeNo'merge' (default): a referenced line updates its namesake; the unreferenced lines of a (product, region) replace its open unreferenced ones. 'replace': restate the OPEN book of each (account, region) present in rows.
rowsYes
commitNoOmit/false = preview (validate + diff, no write). true = write; requires the confirmationToken from the preview.
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
accountYesThe seller account (seller_partner_id, or an unambiguous account name). One account per call.
confirmationTokenNoThe token the preview returned — proves the user saw exactly this payload.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=false, so the description carries most of the burden and does it well: it discloses destructive semantics of 'replace' (open lines absent from rows are deleted), that history is untouched, the 2000-row cap, and the OWNER role / OAuth requirement. It does not cover failure modes or how partial validation errors are returned, which keeps it short of a 5.

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

Conciseness4/5

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

Front-loaded with the deprecation notice, then the ladder position, then the operational rules — the ordering is sensible. It is dense and repeats some merge/replace semantics already in the schema, so it is longer than strictly necessary, but no sentence is purely filler.

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

Completeness5/5

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

No output schema exists, yet the description explains what the preview returns (warnings, per-region diff, confirmationToken) and what the commit consumes. Combined with the permissions note and row cap, an agent has what it needs to sequence the call correctly.

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

Parameters4/5

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

Schema coverage is 83%, so the schema already documents mode, status, reference and expectedAt, and the description largely restates them. It still adds meaning the schema does not: the 'fifth rung of the ladder' framing, which downstream fields the open lines feed, and the guarantee that re-sending unreferenced lines never doubles them.

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

Purpose5/5

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

States a specific verb and resource, then pins down the exact scope: the seller's own purchase orders on its supplier, per product × stock region, explicitly not Amazon Vendor POs. It also names its successor (import_supply_chain) and the query tool that surfaces the result (query_inventory as onOrderUnits / nextExpectedAt), so an agent can place it among siblings immediately.

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

Usage Guidelines5/5

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

Explicitly says this tool is deprecated in favor of import_supply_chain and for whom it remains. It spells out the mandatory two-step flow (preview, show user, commit with confirmationToken) and which mode to use, including the re-send-with-status-'received' case, 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.

import_supply_chainAInspect

Import the PRODUCT table of the Supply chain page of ONE account — the same lines as the page's file (2026-10-22): one line per product × warehouse, carrying at most one supplier order (N open orders = N lines, the count and the six numbers repeated): the count at the warehouse / 3PL with its date, an order (units, expected date, PO reference, status), the case pack, the target stock at Amazon and at the warehouse, the transit to Amazon and to the warehouse, the production lead time. The payload changes the lines it names and NOTHING else: a field you omit keeps what is stored, null clears it (a count becomes unknown, an override is removed and the warehouse's number shows again), an order closes with status 'received' / 'cancelled' on its reference; the six numbers are the product's (its 'ALL' line), the same in every warehouse. The count's location and note are not here. On a line straight from the factory (get_supply_chain_products: warehouse.straightFromFactory) there is no warehouse: the count, the transit to the warehouse and the target there are not applied (a null there clears nothing) and the preview returns a notice for the row; put the whole trip, factory to sellable at Amazon, in leadTimeTransitDays. TWO-STEP, never skip the preview: call WITHOUT commit; the server validates (ASINs against the catalog, regions or warehouse names, ranges, dates) and returns per-row warnings, a per-warehouse diff (added lines with their values, changed lines before → after, removed, the warehouse's totals once written) and a confirmationToken; show them to the user and only after explicit approval call again with the SAME account/rows plus commit:true and the token. Up to 2000 rows per call. Requires the OAuth connection and the OWNER role.

NameRequiredDescriptionDefault
rowsYes
commitNoOmit/false = preview (validate + diff, no write). true = write; requires the confirmationToken from the preview.
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
accountYesThe seller account (seller_partner_id, or an unambiguous account name). One account per call.
confirmationTokenNoThe token the preview returned — proves the user saw exactly this payload.

TDQS

A4.7/5.0
Behavior5/5

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

With only readOnlyHint=false in annotations, the description carries the behavioral burden and does so thoroughly: it explains merge semantics (omitted keeps, null clears), order closure via status, straight-from-factory special handling, preview validation/diff output, confirmation-token requirements, row limits, and OWNER/OAuth prerequisites.

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

Conciseness4/5

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

The purpose and critical two-step safety flow are front-loaded, and nearly every sentence adds operational value for a complex import. However, the description is a very dense single block, making it harder to scan than it could be.

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

Completeness5/5

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

There is no output schema, but the description explains what the preview returns (warnings, per-warehouse diff, totals, confirmationToken), the write behavior, the row cap, and the authorization requirements. Given the tool's complexity, this is complete enough for correct invocation.

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

Parameters5/5

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

Schema coverage is already 80%, but the description adds significant cross-parameter meaning: the row identity model, how N orders map to N lines, how the six product-level numbers interact with warehouse lines, and how null versus omitted behaves for counts and lead-time fields.

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

Purpose5/5

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

The description states a specific verb and resource: import the PRODUCT table of the Supply chain page for one account. It further defines the row model (one line per product × warehouse, at most one supplier order) and notes what is not included, making the tool distinguishable from sibling import tools.

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

Usage Guidelines4/5

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

It gives clear usage conditions: call without commit first, validate/diff, get explicit approval, then call again with the same payload plus commit:true and the token. It also states limits and prerequisites. It references get_supply_chain_products for straight-from-factory detection but does not explicitly name alternatives for other supply-chain import scenarios.

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

import_vat_categoriesAInspect

Import per-product VAT categories for ONE seller account — TWO-STEP like import_cogs: call WITHOUT commit first; the server validates (an unknown code, or a code of another region, rejects its row — warned, never written) and returns per-row warnings, a SKU-grain diff and a confirmationToken; SHOW them to the user and only after explicit approval call again with the SAME account/mode/region/rows plus commit:true and the token. Mode 'merge' (default, safe for partial files) touches ONLY the (asin, sku, region) keys you send — a category sets it, a null category CLEARS it. Mode 'replace' wipes and restates every (account, region) present in rows — destructive with a partial payload. Categories only matter on regions where Amazon does not price the tax (see get_setup domain=vat). Up to 2000 rows per call. Requires the OAuth connection and the OWNER role.

NameRequiredDescriptionDefault
modeNo'merge' (default): only the sent keys change (null = clear). 'replace': wipe + restate each (account, region) present in rows.
rowsYes
commitNoOmit/false = preview (validate + diff, no write). true = write; requires the confirmationToken from the preview.
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
regionNoDefault VAT region ('EU' / 'UK') for rows that do not carry their own.
accountYesThe seller account (seller_partner_id, or an unambiguous account name). One account per call.
confirmationTokenNoThe token the preview returned — proves the user saw exactly this payload.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only carry readOnlyHint=false, so the description bears the weight and delivers: validation that rejects unknown/wrong-region codes as warnings-never-writes, per-row warnings and SKU-grain diff returned, destructive replace semantics with partial payloads, 2000-row cap, and OAuth + OWNER role prerequisites. This is rich behavioral context beyond structured fields.

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

Conciseness4/5

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

Dense but front-loaded: the two-step protocol and the merge/replace distinction lead, with limits and prerequisites trailing. Every clause carries operational weight, though a single long paragraph could be broken for scannability.

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

Completeness5/5

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

For a destructive, two-step mutation with no output schema, the description covers the preview/diff/warnings return, token handling, safety of merge vs replace, row limits, and auth/role requirements — everything an agent needs to call it correctly and safely.

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

Parameters4/5

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

Schema coverage is high (86%), so the baseline is 3, but the description adds real meaning: merge touches only sent (asin, sku, region) keys, a null category CLEARS, replace wipes and restates each (account, region) present, and the commit/token coupling. These go beyond the field-level schema text.

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

Purpose5/5

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

States a specific verb and resource ('Import per-product VAT categories') plus scope ('ONE seller account'), and situates it against siblings by referencing import_cogs as the pattern and get_setup domain=vat for context. An agent can distinguish it from set_vat_default_category and the other import_* tools without opening the schema.

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

Usage Guidelines5/5

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

Explicitly prescribes the two-step flow (preview without commit, then commit:true with token after user approval), names the merge vs replace choice and when each is safe, and notes categories only matter where Amazon does not price the tax (pointing to get_setup domain=vat). This is when/when-not/alternatives guidance at full strength.

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

list_accountsA
Read-only
Inspect

List the seller's Amazon accounts you can query (id, name, region, channel, the marketplaces each sells on with their country code and domain, and the workspace(s) each belongs to). channel is the Amazon programme the account sells through: 'SELLER' = Seller Central (3P, the seller sells to Amazon's customers), 'VENDOR' = Vendor Central (1P, Amazon buys the products from the vendor and resells them). query_metrics, find_movers and explain_movement read Seller Central unless you pass channels=['VENDOR'], or channels=['SELLER','VENDOR'] for All channels; never add 3P and 1P figures yourself. Accounts can span several workspaces (e.g. an agency's separate clients) — use the workspaces field to tell them apart, and the accounts filter of the other tools to focus on one account or client.

NameRequiredDescriptionDefault
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.

TDQS

A4.6/5.0
Behavior4/5

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

readOnlyHint already covers safety, so the description focuses on richer context: the default is Seller Central data unless a channel is passed, and the agent must never sum 3P and 1P figures itself. It also discloses that accounts can span multiple workspaces (agency/clients), which an agent could not infer from annotations or schema. Slightly indirect because much of the behavior described belongs to the calling tools rather than this one.

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

Conciseness4/5

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

Front-loaded with the return-field inventory, then the channel definitions, then the cross-tool rule; each block earns its place. It is dense and long for a list tool, and the 3P/1P summation warning could be shortened, but nothing is redundant.

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

Completeness5/5

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

No output schema exists, and the description compensates by listing every returned field including nested marketplace country/domain and workspace membership. For a discovery tool that gates the channel arguments of several sibling tools, it supplies everything needed to call it and use the result correctly.

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

Parameters4/5

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

Only one optional parameter (`reason`), and the schema documents it fully at 100% coverage, so the baseline for a near-zero-parameter tool applies. The description wisely spends its space on return values and channel semantics instead of repeating the `reason` instructions.

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

Purpose5/5

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

States a specific verb and resource ('List the seller's Amazon accounts you can query') and enumerates exactly what comes back (id, name, region, channel, marketplaces, workspaces). This is unmistakably distinct from the query_* and list_metrics siblings in the same namespace.

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

Usage Guidelines5/5

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

Tells the agent how to read the `channel` field and explicitly names the downstream tools it governs (query_metrics, find_movers, explain_movement) plus the exact override syntax channels=['VENDOR'] / ['SELLER','VENDOR']. It also routes workspace-level disambiguation to the `workspaces` field and the `accounts` filter of other tools.

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

list_cost_inputsA
Read-only
Inspect

List the seller's CONFIGURED per-SKU input values — the raw values the seller entered (source of truth, not the aggregated metric). type selects which: 'cogs' (cost of goods, default), 'fbm' (merchant-fulfilment cost — the seller's rate book at level 'zone': shipping per delivery country or 'ROW', packing per parcel and picking per unit; then per-product rows at level 'sku'), or 'vat' (VAT product category). Use it to audit setup: spot placeholder / negative / implausible costs, cost entered per lot vs per unit (COGS quantity), wrong or missing VAT categories, or SKUs missing an input. Filter by skus to inspect specific products. To FIX missing or wrong COGS, use import_cogs (two-step, with user approval).

NameRequiredDescriptionDefault
skusNoRestrict to these SKUs.
typeNoWhich input to audit. Defaults to 'cogs'.
limitNo
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
accountsNoRestrict to a subset of your own seller account IDs (from list_accounts). Omit to include all your accounts. A brand/account name is accepted and resolved to its id when it matches one of your accounts unambiguously; a label that carries the id ("Brand (A1B2C3D4E5F6G)") resolves to that id.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true; the description adds meaningful context beyond that — that these are raw seller-entered values rather than derived metrics, and that remediation happens via a separate two-step, approval-gated import_cogs. It doesn't discuss pagination or the `limit` behavior, which keeps it below a 5.

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

Conciseness3/5

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

Front-loaded with the core purpose and the key contrast, which is good, but the single dense parenthetical for 'fbm' is hard to parse and the sentence is heavily subordinated. It's information-dense but not well-structured for scanning.

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

Completeness4/5

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

Covers the raw-vs-aggregated distinction, the three input kinds, audit use cases, filtering, and the remediation path — sufficient for a read-only listing tool with no output schema. Minor gap: nothing about what the returned rows look like or how `limit` truncates results.

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

Parameters4/5

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

The description adds real semantic meaning to `type` (what 'cogs', 'fbm', 'vat' actually return, including the fbm zone vs sku level distinction) beyond the schema's terse 'Which input to audit'. It also explains the purpose of `skus` filtering. `limit`, `reason`, and `accounts` are left to the schema, which covers them adequately at 80% coverage.

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

Purpose5/5

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

States a specific verb and resource ('List the seller's CONFIGURED per-SKU input values') and explicitly contrasts with the aggregated metric ('source of truth, not the aggregated metric'). It goes further to enumerate the three input kinds selected by `type`, so an agent can distinguish it from get_cogs_setup, get_vat_setup, etc.

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

Usage Guidelines5/5

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

Gives a concrete purpose ('Use it to audit setup') with specific failure modes to look for (placeholder/negative/implausible costs, per-lot vs per-unit, wrong VAT categories, missing SKUs), and names the alternative for remediation ('To FIX missing or wrong COGS, use import_cogs (two-step, with user approval)'). This is explicit when-to-use plus alternative routing.

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

list_eventsA
Read-only
Inspect

The seller's EVENTS — the dated notes Nova draws on the charts to explain a movement: a price change, a content change (title, bullets, images, A+), a PPC change, a product launch, anything else the seller did. Read them when explaining a movement (what changed around that date?) and before create_event (is it already logged?). Filters: a date window, accounts, marketplaces, ASINs (child or parent, no need to know which), types, a text search. Newest first, 20 per page by default.

NameRequiredDescriptionDefault
toNoLatest event date, inclusive (YYYY-MM-DD).
fromNoEarliest event date, inclusive (YYYY-MM-DD).
asinsNoEvents about any of these ASINs, child or parent.
limitNoPage size (default 20).
typesNoEvent types to keep. Omit for every type.
offsetNo
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
searchNoWords to find in the description or the type.
accountsNoRestrict to a subset of your own seller account IDs (from list_accounts). Omit to include all your accounts. A brand/account name is accepted and resolved to its id when it matches one of your accounts unambiguously; a label that carries the id ("Brand (A1B2C3D4E5F6G)") resolves to that id.
marketplacesNoCountry codes (ES, FR), domains (amazon.es) or marketplace ids. Omit for every marketplace.

TDQS

A4.6/5.0
Behavior4/5

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

The readOnlyHint annotation already establishes the safety profile, and the description adds useful behavior beyond that: results are newest first, default page size is 20, and the filters are described. It stops short of describing the exact response shape, but with no output schema and annotations covering safety, this is still strong context.

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

Conciseness4/5

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

The definition is front-loaded with purpose, then usage, then filters and pagination, and every sentence contributes. The opening sentence is long and slightly winding, but overall it is efficient and informative.

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

Completeness5/5

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

For a read-only listing tool with ten optional filters, high schema coverage, and readOnlyHint annotations, the description covers purpose, usage, filtering, ordering, and pagination. An agent has enough information to select and call it correctly without additional context.

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

Parameters4/5

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

Schema coverage is already high at 90%, so the schema carries most parameter detail. The description still adds meaningful semantics, notably that ASINs can be child or parent with no need to know which, and that text search covers description or type.

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

Purpose5/5

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

The description states a specific verb and resource ('seller's EVENTS — the dated notes Nova draws on the charts') and immediately clarifies what counts as an event with concrete examples. It also distinguishes this listing tool from the sibling create_event by explaining that it is used to read existing events and check whether something is already logged.

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

Usage Guidelines5/5

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

It gives explicit when-to-use guidance: read events when explaining a movement to see what changed around that date, and check this list before calling create_event to avoid duplicate logging. The alternatives and the condition that selects them are named directly.

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

list_metricsA
Read-only
Inspect

List the metrics Nova can report (key, label, unit type, whether higher is better). Call this first to discover valid metric keys for the other tools. When your accounts include a Vendor Central (1P) account, each metric also carries channels: the Amazon programmes it exists on, SELLER = Seller Central (3P), VENDOR = Vendor Central (1P); the Vendor Central metrics are listed too, each with its basis: 'sell-out' = Amazon's measures of what it shipped, 'sell-in' = the vendor's P&L (its top line Amazon's net received when the answer's vendorTopLineNetReceived is 1, what the vendor invoiced Amazon when it is 0), 'purchase-orders' = Amazon's purchase orders and receipts, 'stock' = the stock at Amazon.

NameRequiredDescriptionDefault
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true, so the description carries most of the burden and does add real context: it explains the conditional `channels` field for 1P accounts and decodes each `basis` value (sell-out/sell-in/purchase-orders/stock). It does not cover output shape beyond field names or note any size/rate limits, keeping it below 5.

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

Conciseness4/5

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

Front-loaded with the core purpose and the 'call this first' directive, then structured into a clearly scoped elaboration. The Vendor Central paragraph is dense and long relative to the tool's simplicity, but every clause conveys semantic meaning rather than filler.

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

Completeness5/5

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

There is no output schema, so the description must explain what comes back — and it does, enumerating the four core fields plus the conditional `channels` and `basis` semantics. Nothing an agent needs to interpret the result and pick a metric key is missing.

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

Parameters3/5

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

There is a single parameter and schema description coverage is 100% — the `reason` field is fully documented in the schema, including the English-only and recording rationale. The description adds nothing about it, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('List the metrics Nova can report') and immediately enumerates the returned fields (key, label, unit type, higher-is-better), which distinguishes it from siblings like query_metrics and describe_metric. An agent knows exactly what this returns without opening any schema.

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

Usage Guidelines4/5

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

Gives an explicit sequencing directive: 'Call this first to discover valid metric keys for the other tools.' That is a clear usage context. It stops short of naming alternatives (e.g., describe_metric for per-metric detail) or stating when-not to use it, so it falls short of a 5.

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

list_negative_targetsA
Read-only
Inspect

The seller's NEGATIVE keywords and negative product targets — the traffic they deliberately blocked. Answers: is this query already negated, which campaigns block a brand, what did we exclude at the ad-group level. This is a LIST of rules, not metrics: a negation has no spend, no clicks and no period, so there is nothing here to sum or compare — for the spend a query wasted, use query_search_terms. The classic workflow is the pair: query_search_terms with metricFilters spend > X AND sales < 1 gives the negative CANDIDATES, then this tool tells you which of them are already negated. level is where the rule lives (campaign or ad_group), kind is what it blocks (keyword or product_target); a keyword negation carries keywordText + matchType, a product target carries expressionType + expressionValue (an ASIN or a brand id). Requires the ads entity snapshot to be built for the account. 🧭 SPONSORED PRODUCTS ONLY: no Sponsored Brands / Sponsored Display negative list is ingested yet, so adProducts accepts only sponsored_products (any other value is refused with a message saying so, never answered with the SP list under another name) and every row carries adProduct: 'sponsored_products'.

NameRequiredDescriptionDefault
qNoCase-insensitive substring over the negated keyword text AND the product-target expression value.
kindsNoWhat is negated: keyword (a customer query) or product_target (an ASIN/brand).
limitNo
levelsNoWhere the negation lives: campaign or ad_group.
offsetNoRow offset for pagination (default 0).
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
sortByNo
statesNoAmazon states, e.g. ENABLED.
accountsNoRestrict to a subset of your own seller account IDs (from list_accounts). Omit to include all your accounts. A brand/account name is accepted and resolved to its id when it matches one of your accounts unambiguously; a label that carries the id ("Brand (A1B2C3D4E5F6G)") resolves to that id.
channelsNoONE Amazon programme per call. 'SELLER' = Seller Central (3P) advertising: the seller's own Amazon Ads campaigns. 'VENDOR' = Vendor Central (1P) advertising: the campaigns of the vendor's own Amazon Ads profile. Omit = SELLER whenever the accounts of the call include a Seller Central account, else VENDOR. Pass ['VENDOR'] only when the user asks about Vendor Central / 1P advertising. Both at once is refused: 3P and 1P spend and sales are never added into one total.
sortOrderNoasc (default).
adGroupIdsNoRestrict to these ad groups.
adProductsNoWhich ad products' negatives to list. Only sponsored_products is served today; other values are refused by name.
campaignIdsNoRestrict to these campaigns.
marketplacesNoMarketplace IDs.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, it discloses that negations carry no spend/clicks/period (so no aggregation is meaningful), that the ads entity snapshot must be built first, and that only Sponsored Products is served with other adProducts values refused by name. These are exactly the non-obvious behaviors 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.

Conciseness4/5

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

Front-loads what the tool is, then the workflow, then the level/kind row anatomy, then the SP-only constraint. Dense and useful throughout, though the SP-only restriction is stated twice (description and adProducts schema), which costs a little redundancy.

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

Completeness5/5

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

For a 15-parameter, no-output-schema tool, the description covers the row shape (adProduct, level, kind, keywordText, matchType, expressionType, expressionValue), the prerequisite snapshot, and the ad-product limitation. An agent has everything needed to call it and interpret the result.

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

Parameters4/5

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

Schema coverage is already 87%, and the description still adds meaning: `level` is where the rule lives (campaign vs ad_group), `kind` is what it blocks, and it explains which fields a row carries for each kind (keywordText/matchType vs expressionType/expressionValue). It does not add much on q, states, or sort semantics, but that is minor given the strong schema.

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

Purpose5/5

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

States a precise verb and resource: lists the seller's negative keywords and negative product targets, explicitly framing them as blocked traffic. It also distinguishes the tool from query_search_terms and from any metrics tool, so an agent can identify it without opening the schema.

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

Usage Guidelines5/5

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

Gives explicit use cases (is this query already negated, which campaigns block a brand, ad-group-level exclusions) and a full workflow pairing query_search_terms as the candidate source with this tool as the negation check. It also names the alternative for spend data, so the boundaries are unambiguous.

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

list_tagsA
Read-only
Inspect

List "Your Filters" — the seller's own product classifications (custom drawers) and the tags inside each one, with the ids the other tools take: the tag ID a tags filter needs (query_metrics, find_movers, query_advertising, query_sqp, query_listing_health, query_bsr, query_inventory) and the drawer ID query_metrics groups by (groupBy "tag" + drawer — one row per tag of the drawer: sales, profit… per brand, per category). A drawer groups tags of one kind (e.g. "Brand" → "Private Label", "Wholesale"); type is "manual" when the seller assigned the SKUs by hand, or "predefined" when Nova computes membership from live data (Brand from Amazon's catalogue, FBA/FBM, hero, lifecycle, price tier). Call this to turn a name the user says ("my Private Label products") into the id to pass in tags — the filters take IDs, never names.

NameRequiredDescriptionDefault
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.

TDQS

A4.4/5.0
Behavior4/5

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

With readOnlyHint already declaring a safe read operation, the description adds substantial context: drawers group tags of one kind, `type` distinguishes manual seller assignments from predefined computed membership, and the returned IDs map to specific downstream filters. It does not discuss pagination or empty-drawer behavior, but the core data semantics are well disclosed.

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

Conciseness4/5

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

The description is front-loaded with the purpose and is dense with useful detail, but the long parenthetical lists of sibling tools and examples make it heavier than ideal. Every sentence is relevant, though the structure could be easier to scan.

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

Completeness5/5

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

There is no output schema, so the description must explain what comes back, and it does: drawers, tags within each, IDs, and the meaning of `type`. For a read-only lookup tool with one fully described parameter, this is complete enough for an agent to call it correctly.

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

Parameters3/5

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

There is only one parameter, `reason`, and the schema describes it fully at 100% coverage. The description does not add anything about that parameter, so the baseline score applies because the schema already carries the meaning.

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

Purpose5/5

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

The description states a specific verb and resource: it lists "Your Filters" drawers and the tags inside each, along with the IDs other tools require. It clearly distinguishes itself from sibling query tools by explaining that this is the lookup layer that converts names into filter IDs.

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

Usage Guidelines5/5

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

It gives explicit when-to-use guidance: call this to turn a name the user says into the ID to pass in `tags`, because the filters take IDs, never names. It also names the downstream tools that consume the tag ID and explains the drawer-ID grouping used by query_metrics.

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

query_advertisingA
Read-only
Inspect

Amazon advertising console — Sponsored Products + Sponsored Brands + Sponsored Brands Video + Sponsored Display — at the AD PRODUCT / PORTFOLIO / CAMPAIGN / AD GROUP / KEYWORD grain, the same pipeline as the app's PPC page. Answers: which keywords or campaigns waste spend (high spend, low sales, high acos), where to cut or raise bids, which keyword drives sales on a given ASIN/SKU, which placement (top of search vs product pages) the money goes to, where the money goes across ad products. groupBy takes the ad product (adProduct), an ad-structure grain (portfolio, campaign, adGroup, targetingType, targetingDetail, keyword), the placement grain, a product grain (childAsin, sku), or a TIME grain (day/week/month/quarter/year) for a series in ONE call. adProduct, portfolio and placement need the stacked-cut ads fact: where it is not enabled yet the call is refused with a message naming ADS_FACT_ENABLED, so try them and read the answer rather than assuming. Keyword rows carry BOTH bids: bid is the target's current setting (falling back to the ad group default) and reportedBid is the bid Amazon reported on the last day of the window. Metric keys are a SEPARATE universe from list_metrics — use ONLY: spend, sales, sales14d, impressions, clicks, orders, units, units14d, acos, roas, cpc, ctr, cvr, marginBeforeAds, breakEvenAcos, profitAfterAds, spendWithoutSales, newToBrandOrders, newToBrandSales, newToBrandUnits, videoCompleteViews, viewableImpressions, brandedSearches, topOfSearchImpressionShare. 🏷️ THE BRAND KEYS (2026-09-17) are what only the Sponsored Brands / Brands Video / Display reports publish: newToBrandOrders / newToBrandSales / newToBrandUnits (14-day, click-attributed), videoCompleteViews (video rows only), viewableImpressions, brandedSearches; and topOfSearchImpressionShare, the share of top-of-search impressions the TARGET won (0-100, impression-weighted when rows are grouped): Sponsored Brands / Brands Video at any grain, and Sponsored Products at a TARGET grain only (groupBy keyword / targetingType / targetingDetail), from September 2026 (earlier days are null). ⚠️ It is NOT the console's 'IS | IR' (search-term impression share and rank): those ride on the KEYWORD rows as attributes, attrs.searchTermImpressionShare (0-100) and attrs.searchTermImpressionRank (1 = first), Amazon's numbers per account × marketplace × keyword TEXT over a rolling 30 days ending on attrs.searchTermImpressionAsOf (the latest daily snapshot, from 2026-09-18), independent of the period and NOT additive: never sum or average them; Sponsored Products keywords only, null on product targets and on every other ad product. Sponsored Products publishes none of the other six: with adProducts limited to sponsored_products (the default) they come back null on every row with an unservedMetrics note, never a 0 — pass the other ad products to read them; topOfSearchImpressionShare gets the same note when Sponsored Products is asked at a grain that is not a target grain. 💰 THE PROFIT KEYS answer 'is this advertising actually making money': marginBeforeAds is the P&L's Margin before Ads of the advertised products (exact per ASIN and marketplace, ad-sales-weighted elsewhere), breakEvenAcos is the same number read against ACOS (spending above it loses money), profitAfterAds is (margin x ad sales) - ad spend, and spendWithoutSales is the spend on TARGETS with zero attributed sales over the whole period (not per day). Asking for any of them joins the P&L and resolves the attributed target_asin cut, so spend/sales on those rows become the attributed estimate rather than the exact advertised reading (it re-sums within 0.01%); omit them for the exact reading. They cannot be combined with the placement grain or a search-term filter (neither carries an ASIN or a target) and the call is refused with a message saying so. They are Sponsored Products / Sponsored Display keys: with sponsored_brands or sponsored_brands_video in adProducts they come back null on every row with an unservedMetrics note (per-ASIN Sponsored Brands is an allocation — query_metrics serves it), never a refusal; likewise the margin keys at a target grain with sponsored_display (no SD target → ASIN attribution). Sponsored Brands has no advertised-product report either, so childAsin / sku / parentAsin / tags with it are refused by name. ⚠️ Never sum or compare these with query_metrics' ad metrics (adSpend & co cover SP+SD+SB allocated to products, over the full history) — totals legitimately differ. ⚠️ Placement rows cannot be combined with a keyword or product dimension (Amazon reports placement per campaign only); such a combination is refused rather than silently emptied. Returns rows with value, comparison value and variance, plus the reporting currency. 🧭 AD PRODUCTS: the console serves Sponsored Products, Sponsored Brands, Sponsored Brands Video and Sponsored Display as DISJOINT blocks of rows — adProducts picks which (default ['sponsored_products'] until the fact serves the others; pass several to read them in ONE call, or groupBy='adProduct' to split the money by product). Each block is read from its own cut of the fact at its OWN attribution window: SP orders/sales/units are 7-day on a Seller Central account and 14-day on a Vendor Central account (each console's own window), SB and SBV 14-day, SD 14-day CLICK-attributed (view-attributed SD conversions are never included) — so never sum or compare sales, orders, ACOS or ROAS across products; spend is the ONE additive column across all four, sponsored_brands + sponsored_brands_video (one report, split per row) the ONE additive pair, and sales14d / units14d the like-for-like 14-day reading. Sponsored Display has no search-term and no placement report (such a call is refused by name). Entity rows carry attrs.adProduct; it is null on a VALUE row (an ASIN, a placement, a targeting type, a search term) that folds two products. ⏳ HISTORY & ROUTING: this console route is built on Amazon's per-product advertising reports, so EACH AD PRODUCT HAS ITS OWN HISTORY FLOOR — the response's historyStartsAtByProduct is the first day held per product for the queried accounts (Sponsored Products ~95 days of report retention, Sponsored Brands / Brands Video 60 days, Sponsored Display 65–95 days; all backfilled ~60 days before the account's Ads connection), and historyStartsAt is the earliest floor among the products you queried. Nothing before a product's floor is served for it (null, never zero spend). For ad TOTALS by account, product or period, and for ANY year-over-year or long-history comparison that needs no ad-product / portfolio / campaign / ad group / keyword / search-term / placement breakdown, use query_metrics instead (adSpend, sponsoredSales, organicSales, sponsoredAcos, sponsoredRoas, sponsoredTacos, impressions, clicks, costPerClick, clickThroughRate): it carries the whole ads history Nova holds for each account (from ~60 days before its Ads connection, complete from there; adsHistory gives the first day when a period starts earlier), Sponsored Products + Display + Brands allocated to products. routingNotice, when present, says which route to prefer and where this one's history starts — relay its history part to the user whenever a requested period precedes a queried product's floor. 💱 CURRENCY: monetary values are served in the caller's Nova display currency when it is one of the organization's configured currencies (its primary or up to four secondary currencies), else in the organization's primary. In the response, currency is the code, currencyBasis says why (user_preference | organization | pinned) and currencyNotice, when present, MUST be relayed to the user. Quote the code; never assume a symbol from the marketplace. Pass currency to pin any configured code — e.g. to reproduce a figure the seller read on a dashboard set to another currency.

NameRequiredDescriptionDefault
toYesPeriod end, INCLUSIVE (YYYY-MM-DD): a calendar month is from=YYYY-MM-01 to=its LAST day. to=the 1st of the next month adds one extra day to every total (and one extra bucket with a time grain).
fromYesPeriod start, INCLUSIVE (YYYY-MM-DD).
skusNoAttributed product SKUs.
tagsNo"Your Filters" tag IDS from list_tags — a tag NAME is rejected.
limitNoRows per call of an entity grouping, 1 to 1000 (default 50). A time grain is never cut: its series comes whole, in date order, 1000 buckets at most.
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
sortByNoADS metric key to rank rows by (e.g. "spend"). Refused with a time grain: a series comes in date order.
groupByNoAd product (adProduct), ad-structure grain (portfolio/campaign/adGroup/targetingType/targetingDetail/keyword), placement, product grain (childAsin/sku), or time grain. Omit for a single total row.
metricsYesADS metric keys (spend, sales, acos, roas, marginBeforeAds, breakEvenAcos, profitAfterAds, spendWithoutSales, newToBrandSales, viewableImpressions, topOfSearchImpressionShare, …) — NOT product keys from list_metrics.
accountsNoRestrict to a subset of your own seller account IDs (from list_accounts). Omit to include all your accounts. A brand/account name is accepted and resolved to its id when it matches one of your accounts unambiguously; a label that carries the id ("Brand (A1B2C3D4E5F6G)") resolves to that id.
channelsNoONE Amazon programme per call. 'SELLER' = Seller Central (3P) advertising: the seller's own Amazon Ads campaigns. 'VENDOR' = Vendor Central (1P) advertising: the campaigns of the vendor's own Amazon Ads profile. Omit = SELLER whenever the accounts of the call include a Seller Central account, else VENDOR. Pass ['VENDOR'] only when the user asks about Vendor Central / 1P advertising. Both at once is refused: 3P and 1P spend and sales are never added into one total. On a Vendor Central read the margin keys (marginBeforeAds, breakEvenAcos, profitAfterAds) come back null with an `unservedMetrics` note: Amazon attributes 1P ad sales at its retail price, while the vendor's margin is earned on what Amazon pays it.
currencyNoPin the reporting currency: one of the organization's configured codes — its primary or any of its secondary currencies (e.g. "USD"). Omit to follow the caller's Nova display currency, the dashboard's rule. Any other code is refused.
sortFieldNoWhat to rank on: 'value' (default), or 'variance' / 'variancePercentage' (need a comparison period).
sortOrderNodesc (default) = biggest first.
adGroupIdsNo
adProductsNoWhich ad products to read, as disjoint blocks: sponsored_products, sponsored_brands, sponsored_brands_video, sponsored_display. Default ['sponsored_products'] until the fact serves the others. Each has its own attribution window and history floor — see the AD PRODUCTS note.
childAsinsNoAttributed child ASINs.
keywordIdsNo
placementsNoNormalized placement buckets. Only answerable on the placement cut (no keyword/product dimension alongside).
campaignIdsNo
parentAsinsNoFamily keys — resolved to child ASINs server-side.
comparisonToNoBaseline period end (inclusive).
marketplacesNoMarketplace IDs.
portfolioIdsNoPortfolio ids as returned by groupBy="portfolio". "0" is the campaigns-in-no-portfolio bucket.
metricFiltersNoServer-side threshold filters (ANDed) on ADS metrics — e.g. spend > 100 AND sales < 1 for wasted spend. Needs an ads entity grouping.
comparisonFromNoBaseline period start (inclusive) — enables variance.
targetingTypesNoe.g. keyword, auto, product, category.
targetingDetailsNoMatch types (exact/phrase/broad) or auto groups (close-match/loose-match/complements/substitutes).
excludeUnfinishedNoExclude the current, still-incomplete period so a partial day/week/month is not read as a drop.

TDQS

A4.9/5.0
Behavior5/5

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

Far exceeds what readOnlyHint=true conveys: it discloses refusal behavior (calls refused by name with a message naming ADS_FACT_ENABLED), null-vs-zero semantics with `unservedMetrics` notes, per-product attribution windows and history floors (`historyStartsAtByProduct`), that the profit keys trigger a P&L join and shift spend/sales to an attributed estimate, and that `currencyNotice` MUST be relayed. It also flags the non-additivity trap (never sum sales/orders/ACOS across products; spend is the one additive column).

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

Conciseness4/5

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

Front-loaded with purpose and questions, then sectioned with markers (💰 PROFIT KEYS, 🧭 AD PRODUCTS, ⏳ HISTORY, 💱 CURRENCY), so it is navigable despite its length. It is nonetheless very long for a tool description and repeats the null-vs-zero / unservedMetrics rule several times, which costs context budget even if each caveat is individually load-bearing.

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

Completeness5/5

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

For a 29-parameter, no-output-schema tool this is close to complete: it covers return shape ('rows with value, comparison value and variance, plus the reporting `currency`'), refusal cases, multi-product additivity limits, and history floor reporting. Nothing an agent would need in order to call it correctly appears missing.

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

Parameters5/5

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

Schema coverage is already 90%, so the baseline is 3; the description still adds real meaning — the metric key universe is declared a SEPARATE universe from list_metrics with an explicit allowed list, `adProducts` default behavior is explained, `groupBy` grains are grouped by category, and the bid vs reportedBid distinction on keyword rows is spelled out. It also explains consequences of parameter combinations (profit keys force the attributed estimate) that no schema field could convey.

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

Purpose5/5

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

Opens with a specific verb and resource ('Amazon advertising console — Sponsored Products + ... at the AD PRODUCT / PORTFOLIO / CAMPAIGN / AD GROUP / KEYWORD grain') and immediately enumerates the business questions it answers, so the agent knows exactly what it retrieves. It also explicitly distinguishes itself from query_metrics and list_metrics, which removes sibling ambiguity.

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

Usage Guidelines5/5

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

Explicitly routes between tools: 'For ad TOTALS by account, product or period, and for ANY year-over-year or long-history comparison ... use query_metrics instead', and names per-ASIN Sponsored Brands as belonging to query_metrics. It also states precise when-nots — profit keys cannot combine with the placement grain or a search-term filter, placement rows cannot combine with a keyword or product dimension, Sponsored Display has no search-term or placement report — plus a fallback instruction to 'try them and read the answer rather than assuming' for ADS_FACT_ENABLED.

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

query_bsrA
Read-only
Inspect

Best Seller Rank (BSR) for the seller's products — the CORRECT dedicated source that keeps the per-marketplace (category, rank) pair intact (a plain average would sever it). Use THIS for any BSR question; query_metrics does NOT serve BSR. granularity='latest' (default) returns the last observed rank in the window plus period-average main/sub category ranks (with an optional change vs a baseline window); a time grain (day/week/month/quarter/year) returns a rank time series. Lower rank = better. Products: pass the list matching groupBy (skus / childAsins / parentAsins) — ALL of them in ONE call, rows come back per product; never loop one call per ASIN. Without that list the tool reports the best sellers of the catalogue (limit, default 50, by sales of the last 90 days) and says so in scope; parentAsins with groupBy childAsin reports those parents' children. An empty result never means 'no BSR data': it is a filter that matches nothing, and the error says which.

NameRequiredDescriptionDefault
toYesDate in ISO format (YYYY-MM-DD).
fromYesDate in ISO format (YYYY-MM-DD).
skusNo
tagsNo"Your Filters" tag IDS from list_tags (manual custom tags or predefined segmentations, Brand included) — a tag NAME is rejected.
limitNoWithout a product list only: how many best sellers to report (1–200, default 50). A product list is reported in full.
offsetNoWithout a product list only: best sellers to skip (pagination, default 0).
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
groupByYesWhat to report BSR for.
accountsNoRestrict to a subset of your own seller account IDs (from list_accounts). Omit to include all your accounts. A brand/account name is accepted and resolved to its id when it matches one of your accounts unambiguously; a label that carries the id ("Brand (A1B2C3D4E5F6G)") resolves to that id.
baselineToNoBaseline window end.
childAsinsNo
granularityNo'latest' (default) = last observed rank + period averages; a time grain = a rank series.
parentAsinsNo
baselineFromNoBaseline window start (latest mode) — enables the rank change vs baseline.
marketplacesNoMarketplace IDs.

TDQS

A4.4/5.0
Behavior3/5

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

Annotations declare readOnlyHint=true, so safety is already covered, but the description adds genuine behavioral context: rank direction (lower = better), the `scope` field on catalogue-wide results, the parentAsins+groupBy childAsin interaction, and the important caveat that an empty result means 'no filter match' rather than 'no BSR data'. It does not cover pagination behavior or the shape of series rows, which is the main residual gap.

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

Conciseness4/5

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

Front-loaded with the core claim and the sibling exclusion, and nearly every clause carries operational value. Slightly overstuffed: the design-rationale aside '(a plain average would sever it)' and the emphasis casing ('CORRECT', 'ONE call', 'ALL') are rhetorical rather than informative.

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

Completeness5/5

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

With 15 parameters and no output schema, the description carries the return-value burden well: it explains what 'latest' returns (last observed rank plus period-average main/sub category ranks, optional baseline delta), that rows come back per product, that catalogue mode exposes a `scope` field, and how errors surface on empty filters. Nothing critical is missing for correct invocation.

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

Parameters4/5

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

Schema coverage is already 80%, yet the description still adds non-obvious semantics the schema cannot express: the product list must match groupBy (skus/childAsins/parentAsins) and be passed in ONE call, and parentAsins combined with groupBy childAsin returns the parents' children. It also restates limit's default (50) and the baseline pairing. tags/accounts/marketplaces add nothing beyond the schema.

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

Purpose5/5

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

States a specific verb+resource (BSR for the seller's products) and immediately differentiates from the nearest sibling: 'query_metrics does NOT serve BSR.' Also pins the scope (per-marketplace category/rank pair) rather than a blended average.

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

Usage Guidelines5/5

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

Explicit routing instructions — use THIS for any BSR question, query_metrics is not an alternative — plus concrete mode selection: granularity='latest' for a point-in-time read, a time grain for a series, and product-list vs catalogue-bestsellers depending on whether skus/childAsins/parentAsins are supplied. It even warns against the wrong invocation pattern (never loop one call per ASIN).

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

query_dspA
Read-only
Inspect

AMAZON DSP: the seller's Amazon DSP (Demand-Side Platform) advertising, Amazon's PROGRAMMATIC display and video ads bought in the DSP console: banners and video on Amazon's own sites and devices (its stores, Fire TV, Twitch...) and on third-party sites and apps, bought by audience rather than by keyword and billed per line item. It is NOT Sponsored ads: Sponsored Products / Brands / Display are the search-and-browse PPC that query_advertising serves. Separate budgets, separate consoles, separate attribution: a DSP conversion is counted post-click AND post-view over 14 days (a shopper who saw the ad and bought later counts), where PPC conversions are click-attributed. So NEVER add DSP spend to PPC spend, never add DSP sales to PPC sales, never compute one ACOS or ROAS across the two, and never compare a DSP ROAS with a PPC ROAS. In the app, the Advertising filter has three channels read side by side, PPC, Creator Connections and DSP; the P&L line 'Amazon DSP' (dspCost, under Advertising Cost) is this spend allocated to products, which query_metrics serves. Use query_dsp for anything about the DSP: what it costs, what it drives, which advertiser / order / line item / product / inventory / device / creative / audience / country, whether a line item is running; use query_advertising for Sponsored ads, query_metrics for advertising totals in the P&L. WHO IS READ: the DSP advertisers LINKED to the accounts of this call (Nova links each DSP advertiser to one of the seller's accounts, Seller Central or Vendor Central); accounts narrows them. History: Amazon's DSP reports reach back about 95 days, so an advertiser's figures start about 95 days before its connection to Nova; an earlier period comes back empty, never as zero spend. When no DSP advertiser is linked to the accounts, the answer says so (dspAdvertisers: 0, a notice, no rows): it is not an error, the seller does not run Amazon DSP through Nova. level (REQUIRED) picks the row: 'advertiser' (one per linked DSP advertiser), 'order' (a DSP campaign, with its budget, flight dates, pacing and Amazon's reach to date, household reach and frequency in attrs, as of the latest closed month), 'lineItem' (the grain Amazon bills, with its current status, type, budget and flight dates), 'product' (per ASIN, conversions only: Amazon reports no cost per ASIN), 'supplyFamily' and 'supplySource' (where the ads ran), 'device' (the screen), 'creative' (the ad asset), 'audience' (the segments reached: NOT additive, segments overlap), 'country' (where the ads served; the row with id '' is Unattributed). Each level is one of Amazon's DSP reports with its own metric universe, and the answer's levelNote says in one sentence what its rows are and what may be added across them: relay it whenever it qualifies the figures. Start at 'advertiser' or 'lineItem' for totals (no time grain here: a trend is several periods, one call each); the partitions (supply, device, creative, country) re-add to the line items; 'audience' is read beside them, never summed. Rows come biggest first on the first metric of the call unless sortBy says otherwise, and a row stays while it spent or sold over the period (sold, at 'product'), whatever metrics asks: the page's own population. METRICS are a SEPARATE universe from list_metrics and from query_advertising (same spellings, different meanings): spend (the total cost: supply cost plus every fee), supplyCost, fees, audienceFee, consoleFee, agencyFee, thirdPartyFees, impressions, viewableImpressions, viewabilityRate, clicks, ctr, ecpm, detailPageViews, dpvr, ecpdpv, addToCart, addToCartViews, addToCartClicks, atcr, purchases, unitsSold, sales (the PROMOTED products' conversions), totalPurchases, totalUnitsSold, totalSales (the promoted products plus the brand halo), purchaseRate, ecpp, newToBrandPurchases, newToBrandUnitsSold, newToBrandSales, newToBrandShare, totalNewToBrandPurchases, totalNewToBrandUnitsSold, totalNewToBrandShare, roas (promoted sales over spend), totalRoas (total sales over spend). Each level serves the subset its report carries: a key outside it is refused with the keys the level serves (no spend, impressions or ROAS at 'product'; no sales, units or halo at 'audience'; newToBrandSales and the four fee lines read on the 'advertiser', 'order' and 'lineItem' levels, the other reports carry fewer of them). Omit metrics for the level's core: spend, impressions, clicks, purchases, sales, totalSales, roas (the conversions at 'product'; no sales at 'audience'). FILTERS, on every level: dspAdvertiserIds, dspOrderIds, dspLineItemIds (the ids the upper levels return, strings), lineItemStatuses (the CURRENT status of the line items the rows belong to: RUNNING, PAUSED_BY_USER, ENDED, the DSP page's Status chip, Running / Paused / Ended), marketplaces. The level's own: asins and promoted ('product'), supplyFamilies and supplySources ('supplyFamily', 'supplySource'), deviceTypes ('device'), creativeIds and creativeTypes ('creative'), segmentIds, segmentClassCodes and targetingMethods ('audience'), countries ('country', '' allowed for the unattributed row). A filter of another level is refused by name. ANSWER: data rows with key (the level's type and id), attrs (the row's name and the level's attributes), metrics (value, and compared_value / variance with a comparison period); summary (total, mean and count over the whole selection before limit; the count only on 'audience'); level, levelNote, dspAdvertisers (the linked advertisers in scope), period and the reporting currency. 💱 CURRENCY: monetary values are served in the caller's Nova display currency when it is one of the organization's configured currencies (its primary or up to four secondary currencies), else in the organization's primary. In the response, currency is the code, currencyBasis says why (user_preference | organization | pinned) and currencyNotice, when present, MUST be relayed to the user. Quote the code; never assume a symbol from the marketplace. Pass currency to pin any configured code — e.g. to reproduce a figure the seller read on a dashboard set to another currency.

NameRequiredDescriptionDefault
toYesPeriod end, INCLUSIVE (YYYY-MM-DD): a calendar month is from=YYYY-MM-01 to=its LAST day. to=the 1st of the next month adds one extra day to every total (and one extra bucket with a time grain).
fromYesPeriod start, INCLUSIVE (YYYY-MM-DD).
asinsNoLevel 'product' only: the ASINs.
levelYesThe row of the answer, one of Amazon's DSP reports: advertiser | order | lineItem | product | supplyFamily | supplySource | device | creative | audience | country. Each has its own metric universe and its own filters (see the description).
limitNoRows per call, 1 to 1000 (default 50); `summary` covers the whole selection.
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
sortByNoDSP metric key of the level to rank rows by (e.g. "spend"), biggest first by default. Omitted: the first metric of the call (spend when `metrics` is omitted; the purchases at 'product'), biggest first, so `limit` keeps the biggest rows.
metricsNoDSP metric keys (spend, impressions, clicks, purchases, sales, totalSales, roas, newToBrandPurchases, ...): NOT list_metrics keys, NOT query_advertising keys. Omit for the level's core. A key the level's report does not carry is refused with the keys it serves.
accountsNoRestrict to a subset of your own seller account IDs (from list_accounts). Omit to include all your accounts. A brand/account name is accepted and resolved to its id when it matches one of your accounts unambiguously; a label that carries the id ("Brand (A1B2C3D4E5F6G)") resolves to that id.
currencyNoPin the reporting currency: one of the organization's configured codes — its primary or any of its secondary currencies (e.g. "USD"). Omit to follow the caller's Nova display currency, the dashboard's rule. Any other code is refused.
promotedNoLevel 'product' only: true = the rows where a line item promoted the product, false = its brand-halo rows only. Omit for both.
countriesNoLevel 'country' only: countries by name, as Amazon spells them (France, United States, Germany...); '' selects the unattributed row.
sortFieldNoWhat to rank on: 'value' (default), or 'variance' / 'variancePercentage' (need a comparison period).
sortOrderNodesc (default) = biggest first.
segmentIdsNoLevel 'audience' only: audience segment ids (Amazon's segmentId, as strings).
creativeIdsNoLevel 'creative' only: DSP creative ids (strings), as the level returns them.
deviceTypesNoLevel 'device' only: device types by name, as Amazon spells them (Phone, PC, Tablet, ConnectedDevice, SetTopBox, Unknown, Unallocated).
dspOrderIdsNoDSP order ids (strings), as level 'order' returns them.
comparisonToNoBaseline period end (inclusive).
marketplacesNoMarketplace IDs.
creativeTypesNoLevel 'creative' only: creative types by name, as Amazon spells them (Responsive eCommerce, image, video..., Unallocated).
supplySourcesNoLevels 'supplyFamily' / 'supplySource' only: supply sources by name, as Amazon spells them (AMAZON.FR, Magnite DV+...).
comparisonFromNoBaseline period start (inclusive) — enables variance.
dspLineItemIdsNoDSP line item ids (strings), as level 'lineItem' returns them.
supplyFamiliesNoLevels 'supplyFamily' / 'supplySource' only: supply families by name (Amazon, Amazon Publisher Services, Third-party exchanges, Unallocated).
dspAdvertiserIdsNoDSP advertiser ids (Amazon's 18-digit ids, as strings), as level 'advertiser' returns them.
lineItemStatusesNoThe CURRENT status of the line items the rows belong to (the status on the latest day Amazon reported each one, whatever the period): the DSP page's Status chip, Running / Paused / Ended. Omit for every line item.
targetingMethodsNoLevel 'audience' only: how the line item met the segment, behavioral (targeted) or untargeted (reached anyway).
segmentClassCodesNoLevel 'audience' only: segment class codes, as Amazon spells them (BEHAVIOR, INVENTORY...).

TDQS

A4.9/5.0
Behavior5/5

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

With only readOnlyHint provided, the description carries the burden well: it discloses the ~95-day DSP history, empty-before-connection behavior, non-error no-advertiser response, level-specific metric universes, filter refusal behavior, and currency handling. There is no contradiction with annotations.

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

Conciseness4/5

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

The description is front-loaded with the critical DSP-vs-PPC distinction and follows a mostly useful structure. It is very dense and long, but much of the length is justified by the 29 parameters, metric enumeration, and absence of an output schema; some currency/answer detail could be tightened.

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

Completeness5/5

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

No output schema exists, so the description must explain the return shape; it does so by covering `data`, `attrs`, `metrics`, `summary`, `levelNote`, `dspAdvertisers`, `period`, `currency`, `currencyBasis`, and notices. It also covers edge cases such as empty history, unattributed country rows, and non-additive audience segments.

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

Parameters5/5

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

Although schema coverage is 100%, the description adds substantive meaning beyond it: `level` is framed as selecting one of Amazon's DSP reports, `metrics` form a separate universe from list_metrics and query_advertising, filters are level-specific, and `currency` pinning behavior is explained. This meaningfully reduces misuse risk for a 29-parameter tool.

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

Purpose5/5

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

The description states a specific resource, Amazon DSP advertising, and explicitly distinguishes it from Sponsored ads and query_advertising. It gives concrete examples of what the tool answers, such as cost, reach, line items, audiences, and countries.

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

Usage Guidelines5/5

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

It explicitly routes the agent: use query_dsp for DSP, query_advertising for Sponsored ads, and query_metrics for P&L advertising totals. It also explains when no DSP advertiser is linked, which levels to start with, and why audience rows must not be summed.

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

query_inbound_shipmentsA
Read-only
Inspect

FBA INBOUND SHIPMENTS — the app's Inventory › Inbound shipments panel, the same service the page calls (POST /v2/shipments): every shipment of the last 18 months at its CURRENT state, one record per shipment with its SKU lines (quantity shipped and received per SKU). Answers: what is on its way to Amazon, what Amazon has received so far, which closed shipments came up short (the reconciliation list), which SKU or ASIN has units in transit. category is the panel's own split: planned (WORKING / READY_TO_SHIP — units still with the seller, NOT inbound yet), in_progress (SHIPPED / IN_TRANSIT / DELIVERED / CHECKED_IN / RECEIVING with units still to receive), closed_incomplete (CLOSED and received < shipped), closed_complete (CLOSED and received >= shipped — Amazon sometimes receives more than declared). With sku or asin the category is judged on THAT product's lines, not on the whole shipment. ⚠️ Three things Amazon does not give, so neither does this tool: NO DATES (the inbound API exposes no shipped-at / received-at; fetchedAt is when Nova last read the shipment, nightly at 01:30 UTC, never a business date — within a category rows come in lifecycle order, and by missing units for closed_incomplete); marketplaceId is the marketplace Nova asked Amazon for, not where the shipment lives (the API ignores it) — read stockLocation / fcCountry, derived from the destination FC code; NO SHIPMENT COST anywhere (the inbound fees are query_metrics' fee keys, per SKU and day). isFromAwd flags an AWD → FBA replenishment leaving Amazon's own warehouse, not the seller's. Not a metrics tool: no period, no aggregation — read the counts off the records, or ask query_inventory for totalFbaIncoming / inboundUnits per SKU. SUMMARY (summary=true, 2026-10-22): the counters behind the Inventory page's « N shipments » pill, per product × stock location (POST /v2/shipments/summary), for the skus and / or asins given (a SKU on its own lines, an ASIN over all its SKUs), in stockLocation or in every location: openCount (shipments on their way: they left the seller and units are still to receive), awdCount (of them, the AWD → FBA replenishments), plannedCount (WORKING / READY_TO_SHIP, nothing left yet), incompleteCount (CLOSED with fewer units received than shipped), inboundUnits (the product's units still expected on the open ones) and missingUnits (its units never received on the closed ones); a product × location with none of these has no entry. At most 400 product × location pairs a call. On the list, dateFrom / dateTo bound fetchedAt and sortBy / sortOrder rank the shipments by one of the panel's columns.

NameRequiredDescriptionDefault
skuNoOnly shipments carrying this SKU; the category is judged on its lines.
asinNoOnly shipments carrying this ASIN; the category is judged on its lines.
skusNoWith summary=true: the SKUs to count, each on its own lines.
asinsNoWith summary=true: the ASINs to count, over all their SKUs.
limitNo
dateToNoKeep the shipments Nova last read (fetchedAt) on or before this day, the whole day (YYYY-MM-DD, UTC).
offsetNoRow offset for pagination (default 0).
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
sortByNoRank the shipments by this column of the panel instead of each category's own order (lifecycle; missing units first for closed_incomplete).
summaryNotrue = the per product × stock location counters of the page's shipment pill (SUMMARY above) instead of the shipments: needs `skus` and / or `asins`; `stockLocation` keeps one location (a stock region such as 'EU_FBA' is read as its location), omit it for every location.
accountsNoRestrict to a subset of your own seller account IDs (from list_accounts). Omit to include all your accounts. A brand/account name is accepted and resolved to its id when it matches one of your accounts unambiguously; a label that carries the id ("Brand (A1B2C3D4E5F6G)") resolves to that id.
categoryNoThe panel's bucket: planned | in_progress (on the way) | closed_incomplete | closed_complete. Omit for every tracked shipment.
dateFromNoKeep the shipments Nova last read (fetchedAt) on or after this day (YYYY-MM-DD, UTC). fetchedAt is never a business date.
statusesNoAmazon statuses to keep (WORKING, READY_TO_SHIP, SHIPPED, IN_TRANSIT, DELIVERED, CHECKED_IN, RECEIVING, CLOSED). Prefer `category`.
sortOrderNoWith sortBy: desc (default) = highest first; asc = lowest first.
searchTextNoFree text over the shipment id, its name and the destination FC code.
shipmentIdNoOne FBA shipment id (FBA…).
stockLocationNoDestination stock pool, from the FC code: USA, Canada, Mexico, Brazil, UK, Pan-EU, India, Japan, Australia, UAE, Singapore, Egypt. With summary=true, omit it to count every location.

TDQS

A4.7/5.0
Behavior5/5

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

With only readOnlyHint=true in annotations, the description carries the burden and delivers: it discloses that no dates exist (fetchedAt is a nightly read at 01:30 UTC, never a business date), that marketplaceId is ignored by the API and destination must be read from stockLocation/fcCountry, that no shipment cost is exposed, and what isFromAwd flags. It also states the 400 product×location pair cap for summary calls.

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

Conciseness4/5

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

Front-loaded with the resource and scope, then caveats, then the summary mode — a sensible order. It is dense and re-explains fetchedAt in prose that the schema also covers, plus heavy ALL-CAPS and emoji usage, but nearly every sentence carries a distinct caveat rather than filler.

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

Completeness4/5

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

For an 18-parameter tool with no output schema, it explains the record shape (one per shipment with SKU lines including shipped/received quantities) and details the summary counters, which compensates for the missing output schema. Remaining gaps are minor, such as the exact response envelope and pagination behavior beyond offset/limit.

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

Parameters4/5

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

Schema coverage is already 94%, so much is documented, but the description adds real meaning the schema lacks: the WORKING/READY_TO_SHIP versus SHIPPED/IN_TRANSIT mapping behind each category, and the nuance that with sku/asin the category is judged on that product's lines only. This is value beyond the schema's own wording, though some caveats (fetchedAt, stockLocation) are repeated from schema descriptions.

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

Purpose5/5

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

Opens with a specific verb+resource+scope: 'FBA INBOUND SHIPMENTS — the app's Inventory › Inbound shipments panel... every shipment of the last 18 months at its CURRENT state, one record per shipment with its SKU lines.' It also explicitly distinguishes itself from siblings: 'Not a metrics tool... ask query_inventory for totalFbaIncoming / inboundUnits per SKU.' An agent can identify this tool versus query_metrics and query_inventory 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.

Usage Guidelines5/5

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

States when to use it ('what is on its way to Amazon, what Amazon has received so far, which closed shipments came up short') and when not to (metrics/aggregation belong elsewhere). It also documents a second mode (summary=true) and its trigger conditions, plus the alternative of query_inventory for totals.

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

query_inventoryA
Read-only
Inspect

Current FBA inventory / stock health per SKU, per ASIN or per stock region — the dedicated source (same as the app's stock page), so quantities and days-of-inventory match the dashboard. Answers: what's about to run out (oosRiskFlag / low daysOfInventory), dead stock (withoutSales=true), reorder priorities (low projectedDaysOfInventory), how much stock is on hand, and whether a merchant-fulfilled (FBM) backup exists. Each row has totalFbaAvailable, totalFbaIncoming (= shipped + receiving), totalFbaInventory (= available + fcTransfer + reserved), afnReservedQuantity, fcTransferQuantity (units moving between Amazon FCs), totalFbaSellable (= available + fcTransfer, Amazon's On-hand and the daysOfInventory base, as Amazon's On-hand days of supply), salesVelocity (units/day, 30d), daysOfInventory, projectedDaysOfInventory (= sellable + reserved + inbound + the AWD stock and the units inbound to AWD when the product has AWD data, ÷ velocity: the Inventory page's « Days of supply · after inbound », Amazon's Total days of supply basis), oosRiskFlag (under 35 of those days), totalUnits30d, plus AMAZON'S INVENTORY STATES (the Manage FBA Inventory report's own columns): totalFbaInboundWorking (shipment plans created, nothing shipped: units still at the seller), totalFbaInboundShipped, totalFbaInboundReceiving, totalFbaUnsellable (Amazon's Unfulfillable: damaged, defective, expired — never sells), totalFbaResearching (misplaced units Amazon is confirming, 60 days at most), totalFbaSupply (Amazon's Total inventory supply for FBA = available + fcTransfer + reserved + unsellable + researching, the page's Total at Amazon), inboundUnits (the inbound the includeWorking switch shapes) and unitCog (the COGS per unit in the answer's currency, the organization's primary currency unless you pass currency: the SKU's own, or on an ASIN row the average weighted by sellable units over the SKUs that have one; null = none) with unitCogSkus / unitCogSkusWithCog / unitCogUnitsWithCog (the SKUs behind the row, those priced, the sellable units they hold: read unitCog as partial when they differ), plus the FBM block: fbmAvailable (the quantity the seller declares on the SKU's FBM listing, active or not; null = no FBM listing; fbmIsPlaceholder flags ≥10k sentinels such as 99999), fbmListingStatus ('Active'; or, with includeInactiveFbm=true only, 'Inactive' when Amazon has suppressed every FBM listing of the row while units stay declared: fbmAvailable shows them, fbmListedQuantity counts them 0, so name the listing inactive before reading its units as stock for sale; null = no FBM listing. By default an inactive listing is not a listing of the read: its fbm* figures are null on the row and an FBM-only inactive SKU is not listed, as on the Inventory page unless the seller switches « Include inactive » on), fbmAvailablePoolGlobal (the SKU's quantity once across regions — a seller declares ONE quantity that every marketplace repeats), fbmListedQuantity (the FBM listed quantity, rule B 2026-10-23: the PRODUCT's declared quantity once per ASIN, read at the seller's home marketplace (the one where it keeps the most active FBM listings) since 2026-10-24: the largest over the product's SKUs there, 0 when the product is listed there with no active listing, and only for a product not listed there the largest over its other SKUs and regions; carried on one row and 0 on the product's other rows, so it is the one to total across SKUs and regions: a seller lists one product under several SKUs with the same figure on each, and summing them counted its warehouse once per SKU; an ASIN row's fbmAvailable is the largest of its SKUs in that region, never their sum), fbmListedStockValue (it × the latest COGS of its SKU), fbmSalesVelocity, fbmStockValue (in currency, like unitCog), fulfillmentChannel ('MFN' = an FBM-only SKU), plus the SUBSCRIBE & SAVE block from the daily offer snapshot: snsOffers / snsIneligibleOffers (the SKU's S&S offers in the region, and every one of them that is not ELIGIBLE, SUSPENDED included: an INELIGIBLE offer's subscriptions are cancelled, while a SUSPENDED offer is one Amazon has suspended from Subscribe & Save, and its existing subscriptions still count in Amazon's figures, so in snsActiveSubscriptions and the forecasts too; what Amazon does with their deliveries is not established, so state the suspension, never a consequence; query_subscribe_and_save section offers tells the two apart), snsActiveSubscriptions, snsForecastUnits30d / 60d / 90d (Amazon's projected subscriber deliveries — the demand a restock has to serve, to read next to daysOfInventory), snsDeliveries30dAtRisk (Amazon's at-risk count never includes a suspended offer), snsSnapshotDate; null = no S&S offer on that SKU (≠ 0 = an offer without subscribers). The rest of the block, from the offers themselves (null = no offer, or not built yet): snsEligibility, the row's state over its offers, the one rule of every Subscribe & Save surface (SUSPENDED when a suspended offer carries subscribers; else ELIGIBLE when an offer is ELIGIBLE or REPLENISHMENT_ONLY_ORDERING; else SUSPENDED when an offer is suspended at all; else INELIGIBLE when every offer is; at the ASIN grain over EVERY offer of the ASIN in the region, a SKU row over its own), snsSuspendedOffers and snsSuspendedOffersWithSubscribers (the suspended offers behind the row, and those of them that carry subscribers: an ELIGIBLE row with '1 suspended offer, no subscribers' is the difference), snsDeliveries30dPausedNonBuyable, snsDeliveries30dPausedPricing and snsDeliveries30dLowInventoryRisk (snsDeliveries30dAtRisk by Amazon's condition, in units: PAUSED because the offer is not buyable or for pricing, AT RISK still scheduled but threatened by low inventory; the three add up to snsDeliveries30dAtRisk), snsSellerFundedBaseDiscountMinPct / MaxPct and snsSellerFundedTieredDiscountMinPct / MaxPct (the discount the seller funds on the offers, in %, Amazon's base and tiered discounts: the lowest and the highest over the offers, equal when they agree, null when Amazon reported none); and in metadata, with includeReorder=true, snsPresent (any active subscription on the accounts and stock regions of the read, product filters aside; absent = not known) and snsUnstocked (the subscriptions on products with no stock row, and how many products). By default every figure is FBA-only and FBM-only SKUs are not listed; pass includeFbm=true to count the FBM stock in daysOfInventory / oosRiskFlag / the velocity and to list FBM-only SKUs — the 'days before a TOTAL stockout, FBM backup included' view. ⚠️ The non-*Pool quantities are per-SKU and MUST NOT be summed across SKUs (a shared FNSKU pool would double-count); use the *Pool columns when totalling. The answer carries currency, the code unitCog and fbmStockValue are in; page with limit and offset (pagination.total counts the rows). Tip: sortBy="daysOfInventory", sortOrder="asc" to surface what runs out first; sortBy="fulfillmentChannel", sortOrder="desc" lists the FBM-only SKUs first, then FBA SKUs that also carry an FBM listing (needs includeFbm=true for FBM-only SKUs to be listed at all). REPLENISHMENT (includeReorder=true): each row gains the reorder block — externalStock (units the seller holds outside Amazon, own warehouse / 3PL, per stock region; null = never entered), onOrderUnits / nextExpectedAt (open supplier orders), the resolved lead times and targets (leadTimeProductionDays, leadTimeToWarehouseDays, leadTimeTransitDays, targetDaysAmazon, targetDaysExternal, the inputs get_setup domain=stock reports), coverageWithExternal and coverageTotal (days of cover once the external stock, then the open orders, are shipped in), and recommendedOrderQty = max(0, salesVelocity × (lead times + targets) − everything already in the pipeline), rounded up to casePackQty, and priced as freight by recommendedOrderWeightKg / recommendedOrderVolumeCbm (kg and m³, from the package Amazon measured for the ASIN — packageWeightKg / packageVolumeCbm per unit; null when never measured, never 0); recoStatus says why it is null ('params_missing': the seller has not entered lead times / targets — nothing is assumed; 'no_velocity'; 'narf_echo'). needsReorder=true keeps the products to order now; paramsMissing=true the ones with no parameters. Attributes of the (region, ASIN): identical on every SKU of an ASIN, never sum them across SKUs. STOCK LOCATIONS (groupBy='stockRegion'): the Inventory page's "Stock locations" tiles instead of rows: one tile per stock region (territory) in data, and totals, the All locations tile. Each tile carries the units at Amazon by Amazon's states, deduplicated so that they add up across territories (a stock shared by several SKUs counts once, a NARF echo zero): unitsSellable (available + FC transfer, the units at Amazon the tile shows), unitsAvailable, unitsIncoming (shipped + receiving), unitsInboundWorking (shipment plans created, nothing shipped), unitsUnsellable, unitsResearching, unitsSupply (Amazon's total inventory supply, the page's Total at Amazon) and unitsFbm (the FBM listed quantity: what the seller declares on its FBM listings, counted once per product, read at the seller's home marketplace (the largest over the product's SKUs there; a product not listed there takes the largest over its other SKUs), in the territory of that row; declared, not counted by Amazon, so never in the totals nor in the shares); contribution (the territory's share of the sellable units, in %; the FBM listed quantity never enters it, whatever includeFbm); productCount (the products holding stock there); atRiskCount (the products flagged oosRiskFlag there, short even once the inbound lands: not additive across territories, All locations counts each product once); stockValue (Stock value = the sellable units × the latest COGS per unit, 0 without a COGS) and fbmStockValue (the FBM listed quantity × the latest COGS of its SKU), both in the answer's currency; and valuation, the stock at cost state by state that the tile's Stock value opens on (2026-10-22): { units, value } for sellable (= stockValue), reserved, inbound (shipped + receiving), unfulfillable, researching, awdOnhand, awdInbound, warehouse (the warehouse / 3PL counts at the product's COGS per unit; null without includeReorder) and fbm, each at the latest COGS per unit in currency, with unpricedUnits, the units no COGS prices, which no value counts. With includeReorder=true every tile adds unitsExternal (At warehouse / 3PL), unitsOnOrder (On order), needsReorderCount (the products to order now) and recommendedOrderUnits (Units to order). Every switch and filter of the rows applies, so the tiles describe the rows the same call lists; sortBy, sortOrder, limit and offset do not apply to tiles. stockRegions keeps the tiles of those territories, while totals stays All locations: the page's summary never narrows on a territory. VENDOR CENTRAL (1P): this tool reads Seller Central stock only; a call whose accounts all sell through Vendor Central is refused, since the stock at Amazon is then Amazon's: read it with query_metrics, channels=['VENDOR'], and the metrics whose basis is 'stock' in list_metrics.

NameRequiredDescriptionDefault
qNoText search, the page's search box: the SKU, the ASIN or the product name contains it (case-insensitive).
skusNo
tagsNo"Your Filters" tag IDS from list_tags (manual custom tags or predefined segmentations, Brand included) — a tag NAME is rejected.
asinsNo
limitNo
offsetNoRow offset for pagination (default 0): read past the first `limit` rows.
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
sortByNoField to rank by.
groupByNo'sku' (default) = a row per stock region × SKU; 'asin' = a row per stock region × ASIN, its SKUs folded; 'stockRegion' = the page's Stock locations tiles, one per stock region plus `totals` (All locations), units deduplicated so they add up across territories (see STOCK LOCATIONS).
accountsNoRestrict to a subset of your own seller account IDs (from list_accounts). Omit to include all your accounts. A brand/account name is accepted and resolved to its id when it matches one of your accounts unambiguously; a label that carries the id ("Brand (A1B2C3D4E5F6G)") resolves to that id.
currencyNoThe currency of the amounts of the answer: one of the organization's configured codes, its primary or any of its secondary currencies (e.g. "USD"). Omit for the organization's PRIMARY currency, never your display currency. Any other code is refused. The answer's `currency` names the currency served.
sortOrderNodesc (default) = highest first; asc = lowest first.
includeFbmNotrue = count the merchant-fulfilled (FBM) stock in daysOfInventory / oosRiskFlag / salesVelocity and list FBM-only SKUs; default false = FBA-only figures (the fbm* columns are returned either way).
oosRiskFlagNotrue = only items flagged at out-of-stock risk: under 35 days of supply after inbound (AWD included when the product has AWD data), the page's « Still short after inbound ».
marketplacesNoThe marketplaces of the read: country codes (US, DE), domains (amazon.de) or marketplace ids, as list_accounts gives them for each account. Keeps the stock that SERVES them, the page's rule: a row held in the marketplace's region, or selling there by an active offer while the product holds no stock of its own in that region (a UK row selling to Germany by EFN); the figures stay the region's, never split by country. Omit for every marketplace.
needsReorderNotrue = only products with recommendedOrderQty > 0 (products without parameters have no recommendation and never match).
stockRegionsNoStock region codes, as the rows spell them ('USA', 'EU_FBA', 'UK', 'Canada'…; 'US', 'EU', 'GB' are accepted).
withoutSalesNotrue = only stock that is NOT selling (dead stock).
paramsMissingNotrue = only products whose five reorder parameters do not all resolve (nothing typed, and a territory the fleet has no default for).
includeReorderNotrue = add the replenishment block (external stock, open supplier orders, resolved lead times / targets, coverage past Amazon, recommendedOrderQty). Switched on automatically by needsReorder / paramsMissing / a reorder sort.
includeWorkingNotrue = count Amazon's Working inbound units (shipment plans created but not shipped, still at the seller) in inboundUnits, projectedDaysOfInventory, oosRiskFlag and the reorder supply, as Amazon's own Total days of supply does; default false = inbound is shipped + receiving only (totalFbaInboundWorking is returned either way).
coverageTotalMaxNoKeep rows whose coverageTotal (days of supply once the warehouse / 3PL stock and the open orders are shipped in) is at most this. Switches includeReorder on; a row with neither a count nor an order has no coverageTotal and never matches.
daysOfInventoryMaxNoKeep rows with days-of-inventory <= this (e.g. <=14 = running out soon).
daysOfInventoryMinNoKeep rows with days-of-inventory >= this.
includeInactiveFbmNotrue = list the FBM listings Amazon has set to Inactive while units stay declared (with includeFbm): an FBM-only inactive SKU becomes a row, fbmListingStatus reads 'Inactive' and fbmAvailable shows the declared units, which fbmListedQuantity counts 0. Default false = the Inventory page's default: an inactive listing is not a listing of the read, its fbm* figures are null on the row and an FBM-only inactive SKU is not listed.
daysUntilReorderMaxNoKeep rows whose daysUntilReorder (the days left before the order must be placed; negative = already late) is at most this: 14 = to order within two weeks, 0 with needsReorder=true = the page's Late chip. Switches includeReorder on; a product without a recommendation never matches.

TDQS

A4.4/5.0
Behavior5/5

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

Far beyond the readOnlyHint annotation, it discloses defaults (FBA-only figures, FBM-only SKUs hidden, inactive listings excluded), automatic switch-on of includeReorder, per-SKU non-additivity for non-*Pool columns, currency resolution rules, the Vendor Central refusal, and what groupBy='stockRegion' returns. These are exactly the behaviors an agent would otherwise get wrong.

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

Conciseness2/5

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

The opening sentence is well front-loaded, but the body is a several-thousand-word run-on of nested parentheticals that an agent cannot scan or retrieve from reliably. Valuable content is buried (the ⚠️ sum warning, the includeFbm behavior, the tiles caveat) inside dense field enumerations that belong in a reference doc, not a tool description.

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

Completeness5/5

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

With 26 optional parameters, no output schema, and three grouping modes, this tool needs heavy contextual support, and the description covers defaults, conventions, edge cases, and cross-tool routing. Nothing an agent needs in order to call it correctly appears to be missing.

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

Parameters4/5

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

Schema coverage is already 88%, so the baseline is 3; the description earns more by explaining interactions the schema cannot — that needsReorder/paramsMissing/reorder sorts auto-enable includeReorder, that includeWorking changes inboundUnits and projections, that sortBy/limit/offset do not apply to stockRegion tiles, and that stockRegions narrows tiles but not totals. Much of the field-by-field prose duplicates what the schema already says.

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

Purpose5/5

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

The first clause states a specific resource and scope ("Current FBA inventory / stock health per SKU, per ASIN or per stock region") and names itself as the authoritative source matching the app's stock page. An agent can tell instantly that this is the inventory-read tool and not a worksheet importer or a general metrics query.

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

Usage Guidelines4/5

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

It gives concrete routing: use this for FBA stock health, use query_metrics with channels=['VENDOR'] for 1P accounts (which are refused here), and query_subscribe_and_save to distinguish S&S offer states. It also supplies actionable sort recipes (daysOfInventory asc, fulfillmentChannel desc). It does not distinguish itself from siblings like get_stock_worksheet or query_inbound_shipments, so a 4 rather than 5.

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

query_listing_healthA
Read-only
Inspect

Current listing-health STATE per SKU — the same source as the app's Listing Health page, so statuses, suppression flags, and severity match the dashboard. Point-in-time entity state (NOT a metrics/date-range query — no from/to). Each row has: status, is_buyable, the per-issue flags (is_removed, is_suppressed, is_search_suppressed, is_attribute_suppressed, image_not_applied, is_compliance_risk, is_quality_issue, is_incomplete — a listing Amazon reports buyable is never is_suppressed: Amazon lists LISTING_SUPPRESSED on buyable, selling listings, so that notice counts as is_quality_issue instead; an action Amazon marks exempt never lights a flag), a severity_label + health_summary + the driving issue (top_issue_code/message/enforcement), the worst-wins alert_band (0 cash-loss · 1 degraded · 2 watch · 3 none), trailing-90d sales/units, the buy-box competition block (buy-box owner/price, hijack entrant, price undercut, contested), and a content block with the PUBLISHED catalog content (brand, manufacturer, productType, browse node id+name, variationTheme, bulletPoints, productDescription, mainImageUrl full-size — NOT the small imageUrl render — imageCount, contentLanguage) plus the seller's SUBMITTED backendKeywords. Content gotchas: catalog fields are NULL until the catalog capture covers the ASIN (gate: contentFetchedAt=null); keywordsScanned=false means the Listings scope has not reached this SKU yet — backendKeywords NULL then means 'not looked at', never 'none written'. Answers: which listings are removed / suppressed / not buyable right now, what to fix first, who is losing the buy box, and content audits (missing bullets/description/backend keywords, image count, wrong content language). Filter by problems (per-issue checks), bands, or statuses; sort='severity' surfaces the worst listings first. CHANNELS: omit channels to read the Seller Central (3P) listings whenever the accounts of the call include a Seller Central account, else the Vendor Central (1P) ones (a vendor-only scope, or a Vendor Central account named alone in accounts); pass channels=['VENDOR'] for the Vendor Central (1P) listings, or ['SELLER','VENDOR'] for both in one list (next to a Seller Central account, a Vendor Central account is read only when VENDOR is asked for; a channel none of the accounts of the call sells on returns an empty list, not an error). Each row carries channel ('SELLER' = Seller Central, 'VENDOR' = Vendor Central). A Vendor Central row is one listing: its vendorProductIdentifier (the identifier Amazon shows in Vendor Central) in one marketplace under one vendorCode; the same ASIN under two vendor codes is two rows. Its sku is the product SKU of the ASIN, as in the app's Copilot and Cockpit (the vendor's product code, or the ASIN when there is none), shared by the listings of that ASIN; skus filters on it. Vendor Central does not report five of the checks: not buyable, buy box lost, hijacker, price undercut and Incomplete never flag a Vendor Central row (Amazon is the seller: no offers block, offers is null, isFbm is null, status is Active or Inactive only).

NameRequiredDescriptionDefault
skusNo
sortNo'sales' (default) = biggest sellers first; 'severity' = worst alert band first.
tagsNo"Your Filters" tag IDS from list_tags (manual custom tags or predefined segmentations). A tag NAME is rejected — resolve it with list_tags first.
asinsNo
bandsNoAlert bands to keep: 0 cash-loss · 1 degraded · 2 watch · 3 none.
limitNoMax rows (1–1000, default 50).
offsetNoRow offset for pagination (default 0).
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
accountsNoRestrict to a subset of your own seller account IDs (from list_accounts). Omit to include all your accounts. A brand/account name is accepted and resolved to its id when it matches one of your accounts unambiguously; a label that carries the id ("Brand (A1B2C3D4E5F6G)") resolves to that id.
channelsNoSelling channels to read: 'SELLER' = Seller Central (3P) listings, 'VENDOR' = Vendor Central (1P) listings, both = one list. Omit = SELLER whenever the accounts of the call include a Seller Central account, else VENDOR.
problemsNoKeep only listings failing ANY of these per-issue checks (OR union).
statusesNoMerchant-listing statuses to include. Omit = all statuses (the app defaults to ['Active']).
parentAsinsNoFamily keys — coalesce(parent_asin, asin), the cockpit parent-ASIN grain.
marketplacesNoRestrict to these marketplace IDs.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only carry readOnlyHint=true, so the description carries the rest — and it does: channel defaulting rules, empty-list-not-error behavior, Vendor Central rows lacking five checks, and the non-obvious flag semantics (a buyable listing is never is_suppressed; Amazon's LISTING_SUPPRESSED notice counts as is_quality_issue). It also discloses the catalog-recapture gate (contentFetchedAt=null) and the keywordsScanned=false trap where NULL means 'not looked at', not 'none written'.

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

Conciseness3/5

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

Purpose is front-loaded before the field inventory, which is good, but the body is a single ~450-word block with nested parentheticals and some duplication of the `channels` and `bands` schema descriptions. The field-by-field row inventory is largely a substitute for the missing output schema, so it earns its place, but the packaging is denser than necessary.

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

Completeness5/5

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

With 14 parameters, no output schema, and only one annotation, this description does the heavy lifting: it enumerates the returned row shape (status, issue flags, alert_band, buy-box block, content block), explains the channel-dependent shape differences, and warns about NULL semantics. An agent has enough to call it correctly and interpret results without additional context.

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

Parameters4/5

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

Schema coverage is 86%, so baseline is 3, and the description goes beyond it on the parameters that matter most: the omit-vs-pass semantics of `channels` (including the vendor-only scope case), what `skus` filters against for Vendor Central rows, and the effect of sort='severity'. A few parameters (tags, limit/offset, reason, marketplaces) are only covered by their schema text.

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

Purpose5/5

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

Opens with a specific verb+resource and scope: 'Current listing-health STATE per SKU', anchored to the app's Listing Health page so the agent knows exactly which entity is returned. It immediately draws the boundary against the sibling family of metrics tools by declaring 'Point-in-time entity state (NOT a metrics/date-range query — no from/to)'.

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

Usage Guidelines4/5

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

Explicitly enumerates the questions it answers (which listings are removed/suppressed/not buyable, what to fix first, who is losing the buy box, content audits), and states the negative case (not a date-range metrics query). It does not name the sibling tool (e.g. query_metrics) the agent should use instead for time-series questions, so routing relies on inference.

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

query_metricsA
Read-only
Inspect

Query the seller's metrics over a period, optionally grouped and compared to a baseline period. groupBy takes EITHER an entity grain (sku, childAsin, parentAsin, marketplace, sellerAccount), OR "tag" with drawer — one row per tag of one of the seller's own "Your Filters" drawers (list_tags): THE way to read sales, profit or any metric per BRAND, CATEGORY or supplier when the seller tagged the catalog —, OR a TIME grain (day, week, month, quarter, year). tags restricts any read to the SKUs carrying the given tags (ids from list_tags). Use a TIME grain to get a whole time series in ONE call — e.g. groupBy="month" from Jul to Jun returns all 12 monthly rows at once; never call this once per month. Entities batch the same way: for MANY SKUs/ASINs, pass the whole list (skus/childAsins/parentAsins) with an entity groupBy and read all the rows from ONE call — never loop one call per SKU or ASIN. Rank rows with sortBy+sortOrder (e.g. the top SKUs by netSales) and keep only rows meeting a threshold with metricFilters (e.g. SKUs with netProfit < 0) — both run server-side, so never fetch everything and filter yourself. Returns rows with value, comparison value and variance, plus the reporting currency. 📣 ADVERTISING TOTALS & HISTORY: this tool ALSO serves advertising at the account, product and period level — adSpend, sponsoredSales, organicSales, sponsoredAcos, sponsoredRoas, sponsoredTacos, impressions, clicks, costPerClick, clickThroughRate (Sponsored Products + Display + Brands, allocated to products) — over the WHOLE ads history Nova holds for each account: from about 60 days before its Ads connection, complete from there (NOT a rolling 60-day window; adsHistory + adsHistoryNotice give the first day per account when a requested period starts earlier). Use THIS tool for ad totals, trends and year-over-year comparisons that need no ad-product / campaign / ad group / keyword / search-term / placement breakdown; query_advertising is the advertising CONSOLE for those breakdowns — Sponsored Products + Brands + Brands Video + Display as disjoint blocks, each at its own attribution window (SP 7-day on Seller Central and 14-day on Vendor Central, SB 14-day, SD 14-day click-attributed) and its own history floor (~60 days before the Ads connection at best). ⚠️ CAVEATS: the response may carry cogsNotice (units sold with no COGS — profit and margins overstated; cogsCoverage always comes with a COGS-based metric), marketplaceNotice (the totals add up several marketplaces, e.g. US + CA + MX on a North America account, while Amazon screens show one), adsHistoryNotice (part of the period predates the account's ads data) and subscribeAndSaveNotice (Subscribe & Save figures of a period not final yet, or partly without S&S data). Each notice, when present, MUST be relayed to the user before the figures it qualifies. 🔁 SUBSCRIBE & SAVE (Seller Central only): shippedSubscriptionUnits (S&S Units), totalSubscriptionsRevenue (S&S Sales), lostSubscriptionsRevenue (S&S Sales Lost to Stockouts) and missedSubscriptionUnits (S&S Units Missed to Stockouts: Nova's estimate, in units, of the subscription deliveries Amazon missed for lack of stock, from Amazon's report; a floor when a day cannot be priced) are flows summed over the days, final 7 days after the day. subscribeAndSaveDiscount (S&S Discount Funded) is the discount the seller funded on subscriber orders, read from the order lines rather than from Amazon's S&S report, on the SKU of each order line, so neither the report's delay, its S&S data coverage nor the per-ASIN rule below applies to it. It moves with the order lines like productPromotions (Customer promotions), of which it is a part, served with its sign (never add the two): its last days rise as subscriber orders ship, and an order line can still be revised for weeks. On a line that also carried a coupon it is an estimate, usually low. Read it next to S&S Sales and never subtract it from S&S Sales, which is neither gross nor net of it. activeSubscriptions is a LEVEL, known 4 days after the day: the subscriptions active at the END of the period (each account and marketplace on its last day with S&S data in the period, added up across them), never added up over days nor averaged; in a time series each bucket is the level at its own end. salesPenetration (S&S Sales divided by product sales, both summed over the days that have S&S data only) and subscriptionsStockoutRate (S&S Sales Lost to Stockouts divided by S&S Sales plus that loss, both summed over the period, a day Amazon has not served counting on neither side) are ratios of sums, final 7 days after the day: never average daily or per-product values, ask for the period and the grouping you need. A period that ends within a figure's delay is PARTIAL: its figure is served flagged as partial, with the day it becomes final (its last day plus the delay); a period with no final day yet has no value: its figure is null (never the 0 or the partial amount Amazon has published so far), and a ranking or a threshold on it is refused. A period that holds days Nova has no S&S data for (before the account's S&S history, a day missing or held out, a feed that stopped) is INCOMPLETE, with no day to become final. When either period of a comparison is partial or incomplete, the S&S figure keeps its value but its change (variance, variance_percentage) is null. Never present a partial or incomplete figure as complete, nor compare it with another period: a partial or incomplete sum is too low, never a drop. Amazon reports S&S per ASIN, and Nova puts each ASIN's S&S figures on ONE of its SKUs (the first in alphabetical order): a sku or tag row, or a skus or tags filter, therefore holds the whole ASIN's figures or none of them, so read S&S per childAsin or coarser. The answer says which periods are partial or incomplete, and why, in subscribeAndSaveNotice (relay it) and subscribeAndSaveCoverage (per period state and finalBy for the delay and complete; per account and marketplace its days without data). The state of the programme and of each product today is query_subscribe_and_save. 🧾 COST CATEGORIES: every cost has one of four categories (variable, product, oneOff, account; costCategory in list_metrics / describe_metric, and the totals orderCosts "Variable costs", productCosts, oneOffCosts, accountCosts). To compare products on their recurring economics, pass costCategories rather than subtracting lines yourself: the response then carries costCategories (what was counted) and costCategoriesNote, which you MUST relay, since the figures are no longer the P&L the app shows by default. 💱 CURRENCY: monetary values are served in the caller's Nova display currency when it is one of the organization's configured currencies (its primary or up to four secondary currencies), else in the organization's primary. In the response, currency is the code, currencyBasis says why (user_preference | organization | pinned) and currencyNotice, when present, MUST be relayed to the user. Quote the code; never assume a symbol from the marketplace. Pass currency to pin any configured code — e.g. to reproduce a figure the seller read on a dashboard set to another currency. 🏷️ 3P / 1P: an Amazon account sells through ONE programme: Seller Central (3P, channel SELLER: the seller sells its products to Amazon's customers) or Vendor Central (1P, channel VENDOR: Amazon BUYS the products from the vendor and resells them itself). On a Vendor Central read, the basis of units, sales and netSales is the answer's vendorTopLineNetReceived (said in its channelNote): when it is 1, units and sales of a Vendor Central row are Amazon's net received (what Amazon received from the vendor, net of what it returned, at its cost, on the day of the receipt: the Net received of the Vendor Central console) and netSales the net received less the quick-pay and early-payment discounts; what the vendor invoiced reads in vendorInvoiced; when it is 0, units and sales are what the vendor invoiced Amazon (its books, at the invoice date) and netSales the invoiced amount less Amazon's claims; Amazon's shelf (what it shipped to its customers, at its retail price, the latest days provisional, on ordered units) is read with vendorShippedUnits, vendorShippedRevenue and vendorShippedCogs. A vendor's profit is netProfit, the P&L's Net Profit: the P&L's top line (Amazon's net received when the answer's vendorTopLineNetReceived is 1, what the vendor invoiced Amazon when it is 0) less what Amazon takes off (its claims on the invoices, the discounts, the co-op, the chargebacks, the returns to vendor), the product cost and the ad spend. vendorShelfProfit is the result on what Amazon shipped, at the ship date: Amazon's shelf, the figure to compare products on, never added to the P&L. channel in list_accounts says which programme each account sells through. A call reads Seller Central, unless you pass channels=['VENDOR'] (do so only when the user asks about Vendor Central / 1P), the accounts of the call are all Vendor Central accounts, or you pass channels=['SELLER','VENDOR'] for All channels (when the user asks for the total across both programmes): Nova then reads both together as the app's All channels reading does, adding the seller's sales and the vendor's P&L top line. NEVER add 3P and 1P figures yourself: ask for All channels, or make one call per channel and present the two side by side, labelled 3P and 1P. When your scope holds a Vendor Central account the response says which channel it read ('SELLER', 'VENDOR' or 'ALL'), and channelNote what it read and what it left out; a metric the channel does not report (sessions, buy box, promotions on Vendor Central) comes back null with an unservedMetrics note, never 0. 🧮 BASIS: basis picks which P&L the figures are. Omitted or "order" (what this tool always served): the order-based P&L, every amount at the day the order was purchased, the last days brought up to the live orders. "cash": the cash-based P&L, every amount at the day Amazon POSTED it, RELEASED postings only (a DEFERRED posting is a reserve, not cash) — the reading that ties to the settlement reports; no live overlay, Seller Central accounts only, and refused (never answered on the other basis) where the cash P&L is not enabled. Pick "cash" when the user speaks of settlements, payouts, disbursements, what Amazon paid, or reconciling with the bank; keep the order basis for sales performance. A cash answer carries basis: "cash" and a basisNote to relay once. What separates the two readings of a month is query_pnl_bridge.

NameRequiredDescriptionDefault
toYesPeriod end, INCLUSIVE (YYYY-MM-DD): a calendar month is from=YYYY-MM-01 to=its LAST day. to=the 1st of the next month adds one extra day to every total (and one extra bucket with a time grain).
fromYesPeriod start, INCLUSIVE (YYYY-MM-DD).
skusNo
tagsNo"Your Filters" tag IDS from list_tags (manual custom tags or predefined segmentations) — a tag NAME is rejected. Tags of one drawer OR together, tags of different drawers AND together (the dashboard rule).
basisNoWhich P&L the figures are. Omit, or "order", for the order-based P&L this tool always served: every amount at the day the order was purchased, the last days brought up to the live orders. "cash" for the cash-based P&L: every amount at the day Amazon POSTED it, RELEASED postings only (a DEFERRED posting is a reserve, not cash), the reading that ties to the settlement reports — no live overlay, Seller Central accounts only, refused where the cash P&L is not enabled (never answered on the other basis).
limitNoRows per call of an entity grouping, 1 to 100 (default 50); beside `timeGrain`, the entities, each with its whole series. A time-grain groupBy is never cut: its series comes whole, in date order, 1000 buckets at most.
drawerNoThe drawer whose tags make the rows when groupBy is "tag": a drawer `id` from list_tags (one of the seller's own classifications — Brand, Category, Supplier…), never a tag id or a name. A SKU carrying no tag of the drawer is in no row; a SKU carrying two of its tags counts in both. `summary.total` stays the total of the WHOLE scope (every SKU of the accounts, tagged or not — the dashboard's Total row), so it is NOT the sum of the rows: the gap is what the SKUs without a tag of the drawer weigh. `drawer` alone implies groupBy "tag".
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
sortByNoMetric key to rank rows by (e.g. "netSales") — how you get "top/bottom N by X". Refused with a time-grain groupBy: a series comes in date order. Beside `timeGrain`, it ranks the entities.
groupByNoEntity grain (sku…), "tag" (the tags of ONE drawer — pass `drawer`; rows carry `tagId` / `tagName`), OR time grain (day/week/month/quarter/year). Use a time grain for a full time series in ONE call. Omit for a single total row. A metric not defined at the row grain (sessions, conversionRate or pageViews per sku — Amazon reports traffic per ASIN) comes back null on every row with an `unservedMetrics` note, never a 0; group by childAsin to read it.
metricsYesMetric keys from list_metrics (sales, units, netProfit, refundedUnits, commissionFee, totalAmazonFees, adSpend, sponsoredSales…). Natural names are accepted when they mean exactly one metric — tacos, acos, netMargin, avgPrice, pageViews, unitsSold, unitSessionPercentage… — and resolved to the key; the response lists what was resolved under `metricAliases`. Names that could mean several metrics (refunds, margin, revenue) are refused with the candidates spelled out. Inventory/stock quantities (totalFbaAvailable, daysOfInventory…) are NOT metrics — use query_inventory for stock.
accountsNoRestrict to a subset of your own seller account IDs (from list_accounts). Omit to include all your accounts. A brand/account name is accepted and resolved to its id when it matches one of your accounts unambiguously; a label that carries the id ("Brand (A1B2C3D4E5F6G)") resolves to that id.
channelsNoThe Amazon programme the call reads. 'SELLER' = Seller Central (3P): the seller's own sales to Amazon's customers. 'VENDOR' = Vendor Central (1P): Amazon buys the products from the vendor and resells them. Omit = SELLER whenever the accounts of the call include a Seller Central account, else VENDOR. Pass ['VENDOR'] only when the user asks for Vendor Central / 1P figures. Pass ['SELLER','VENDOR'] for All channels, when the user asks for the total across both programmes: Nova reads them together as the app's All channels reading does, adding the seller's sales and the vendor's top line (Amazon's net received when the answer's vendorTopLineNetReceived is 1, what the vendor invoiced Amazon when it is 0), while a metric one programme measures stays that programme's figure.
currencyNoPin the reporting currency: one of the organization's configured codes — its primary or any of its secondary currencies (e.g. "USD"). Omit to follow the caller's Nova display currency, the dashboard's rule. Any other code is refused.
segmentByNoBreak EACH grouped row into its top sub-rows at this finer grain, ranked, in ONE call (each row gets a `segments` array). Must be strictly finer than groupBy in the hierarchy sellerAccount>marketplace>parentAsin>childAsin>sku — or any product grain when groupBy is a TIME grain (top products per bucket) or "tag" (top products per tag). E.g. groupBy="marketplace" + segmentBy="sku" = top SKUs per marketplace; groupBy="day" + segmentBy="childAsin" = top ASINs per day. For a chronological series per entity, use `timeGrain` instead.
sortFieldNoWhat to rank on: 'value' (default), or 'variance' / 'variancePercentage' (need a comparison period).
sortOrderNodesc (default) = biggest first, asc = smallest first.
timeGrainNoEntity×time-series mode: set a calendar grain ALONGSIDE a product groupBy (childAsin, sku, parentAsin or tag) to get each entity's chronological, gap-filled `series` of buckets over the whole period in ONE call — e.g. groupBy="childAsin" + timeGrain="day" = every ASIN × every day; NEVER loop one call per ASIN or per day. Requires `limit` (the entity page bounds the series); incompatible with comparison periods, metricFilters and segmentBy. Without any groupBy it is read as groupBy=<grain>: a plain series of totals.
childAsinsNo
parentAsinsNo
comparisonToNoBaseline period end (inclusive).
marketplacesNoMarketplace IDs.
segmentLimitNoMax sub-rows per group (default 10).
metricFiltersNoServer-side threshold filters (ANDed), in the SAME (displayed) terms as the returned values — e.g. netProfit < 0, or cogs > 1000 (a cost above 1000). Requires a PRODUCT grain in groupBy (sku, childAsin, parentAsin, marketplace, sellerAccount or tag): NOT available ungrouped, nor with a time grain (day/week/month/quarter/year).
comparisonFromNoBaseline period start (inclusive) — enables variance.
costCategoriesNoThe cost categories the figures COUNT. Omit for every cost (the default, the P&L as the app shows it). "variable" = triggered by a unit sold or returned: cost of goods, FBM cost, referral and closing fees, FBA fulfillment, refund costs. "product" = keeping the product in stock and replenished: storage, long-term storage, inbound transportation and placement, prep. "oneOff" = a decision or a correction on the product: removals, disposals, deals and coupons, Vine, inventory reimbursements and clawbacks. "account" = billed to the account whatever the products: subscription, paid services, EPR. A category left out reads 0 on its own lines and is out of every total (totalAmazonFees, grossProfit, netProfit, the margins); sales, units and advertising never move. PROFIT WITHOUT ONE-OFFS = netProfit with costCategories ["variable","product","account"]; the profit on unavoidable costs alone = ["variable"]. One-offs are often a net CREDIT (reimbursements), so a profit without them can be lower than net profit.
excludeUnfinishedNoExclude the current, still-incomplete period so a partial day/week/month is not read as a drop.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=true, yet the description discloses far more: notice fields that must be relayed (cogsNotice, marketplaceNotice, adsHistoryNotice, subscribeAndSaveNotice), partial/incomplete period semantics with null variances, vendor-vs-seller basis switching and unservedMetrics returning null rather than 0, and currency resolution rules. This is behavioral context no annotation conveys.

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

Conciseness3/5

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

It is front-loaded — the core grain/grouping guidance comes first — and most sentences carry information. But the description is enormous for a tool call, with long emoji-sectioned passages on Subscribe & Save and 3P/1P that largely restate what the schema's basis and channels descriptions already say, making it hard to scan.

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

Completeness5/5

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

For a 27-parameter tool with no output schema, the description covers the return shape (rows with value, comparison value, variance, currency, coverage/notice fields), the caveats that qualify figures, and the refusal modes. Nothing material an agent needs to call this correctly is missing.

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

Parameters5/5

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

Schema coverage is already 89%, so the baseline is 3, but the description adds real meaning beyond it: how groupBy interacts with drawer/tag, why a time grain returns the whole series in one call, when metricFilters/sortBy are refused, and the semantics of costCategories subsets for profit analysis. It explains the intent of parameters, not just their shape.

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

Purpose5/5

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

The opening sentence names a specific verb and resource plus scope: 'Query the seller's metrics over a period, optionally grouped and compared to a baseline period.' It then explicitly separates itself from siblings — query_advertising for breakdowns, query_subscribe_and_save for programme state, query_pnl_bridge for the order-vs-cash gap.

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

Usage Guidelines5/5

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

Usage is unusually prescriptive: use a TIME grain for a whole series in one call, batch entity lists rather than looping, defer to query_advertising when a campaign/keyword/placement breakdown is needed, choose basis='cash' only when the user speaks of settlements/payouts, and pass channels=['VENDOR'] only for 1P questions. Both when-to-use and when-not-to-use are spelled out with named alternatives.

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

query_pnl_bridgeA
Read-only
Inspect

P&L BRIDGE: the order-based and the cash-based P&L of the same months side by side, and what separates them — for a finance team tying the commercial month (the orders) to the settlement month (the cash). view="month" (default): one row per calendar month over the accounts (and marketplaces) in scope with, for each P&L line (product sales, other sales, sales deductions, VAT, net sales, cost of goods, Amazon fees, FBM cost, PPC spend, DSP cost, net profit), the order reading (order), the cash reading (cash) and bridge = cash − order; sales splits the month's sales by TIMING on both sides (order sales whose principal was posted the same month / later / earlier / not yet; cash sales from lines purchased the same month / earlier months / later months / lines the order report does not know, of which sold to Amazon and without items) and gives the FX gap and the valuation gap of the same lines; fees does the same for the purchase-date fees (estimated at the order vs actually released). view="settlement": one row per settlement whose RELEASED postings fall in the months asked, most recent first, with the purchase months it pays (byPurchaseMonth, by marketplace and origin) and its own currency; settlementId narrows to one settlement and implies this view. Seller Central accounts only. 📐 HOW TO READ: amounts are as the marts store them — sales positive, costs and fees NEGATIVE (net profit = the sum of the lines); a positive bridge on a cost line means the cash reading spent less. Order basis = the day the order was purchased (what query_metrics serves by default); cash basis = the day Amazon POSTED the money, RELEASED postings only (what query_metrics serves with basis="cash"); a settlement = the RELEASED postings grouped under one settlement_id, the payout itself (the Transfer) excluded, so the sum of a settlement ties to the settlement report to the cent. Neither side has a live overlay: the current month is incomplete on both. Monetary values are in the organization's PRIMARY currency (currency in the response, the currency the marts are built in), never the caller's display preference; cashSalesLocal is in the settlement's own currency. total null = the bridge is not built in this environment; a null figure = not carried by the deployed bridge (unknown, never zero). Months are YYYY-MM.

NameRequiredDescriptionDefault
toYesLast month, INCLUSIVE (YYYY-MM). With view="settlement": the settlements whose released postings fall, at least in part, in from..to.
fromYesFirst month, INCLUSIVE (YYYY-MM).
viewNo"month" (default): by calendar month, the two P&L and the bridge. "settlement": by settlement, most recent first, the purchase months each one pays.
limitNoview="settlement": settlements served, 1 to 200 (default 50); `truncated` in the answer says when more fall in the window.
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
accountsNoRestrict to a subset of your own seller account IDs (from list_accounts). Omit to include all your accounts. A brand/account name is accepted and resolved to its id when it matches one of your accounts unambiguously; a label that carries the id ("Brand (A1B2C3D4E5F6G)") resolves to that id.
marketplacesNoMarketplaces to add up: country codes (US, DE), domains (amazon.de) or marketplace ids, as list_accounts gives them for each account. Omit for every marketplace of the accounts.
settlementIdNoONE settlement, by its settlement_id (the id of the settlement report) — implies view="settlement".

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses crucial behavioral details: sign conventions (sales positive, costs/fees negative), the absence of live overlays (current month incomplete on both sides), primary-currency behavior, null semantics (null = not carried, never zero), and that the settlement payout (Transfer) is excluded so totals tie to the settlement report to the cent.

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

Conciseness4/5

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

The description is front-loaded with the core purpose and is dense with useful detail, but it is extremely long and could be more scannable. Every section is relevant to the complex domain, so the length is largely justified, though some formatting could improve readability.

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

Completeness5/5

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

Given the absence of an output schema and the complexity of the tool, the description is remarkably complete: it explains both views, the fields returned (sales, fees, bridge, byPurchaseMonth), how to interpret values, currency behavior, and null handling. An agent has everything needed to call and interpret the tool correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description nonetheless adds meaningful interpretation of the view parameter by spelling out what each view returns and that settlementId implies view="settlement". It does not add much beyond the schema for the other parameters, so it sits just above baseline.

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

Purpose5/5

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

The description states a specific verb and resource: it bridges the order-based and cash-based P&L of the same months. It distinguishes itself from siblings by explicitly naming query_metrics and explaining how its order/cash bases correspond to that tool's defaults and basis="cash" option.

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

Usage Guidelines5/5

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

It provides explicit when-to-use context ('for a finance team tying the commercial month to the settlement month'), gives clear guidance on choosing view="month" versus view="settlement", and notes that settlementId implies the settlement view. It also constrains scope to Seller Central accounts only.

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

query_reviewsA
Read-only
Inspect

Amazon REVIEWS and RATINGS of the seller's products, per ASIN and marketplace (Amazon Data Kiosk): the reviews received over a period, the critical ones (3 stars or less), the star rating and the ratings count Amazon displays, and a review rate. The same route as the app's Reviews columns and modal, on the Seller Central (3P) accounts of the call. Metric keys are their OWN universe, not list_metrics keys: reviews, critical_reviews, critical_review_share, review_units, review_rate, rating, ratings, rating_week_end, rating_marketplace (describe_metric defines each). ⚠️ READ BEFORE ANSWERING. (1) The COUNTS (reviews, critical_reviews, critical_review_share, review_units, review_rate) exist only on the marketplaces where Amazon serves them: US, CA, MX, BR. Everywhere else, Europe included, they are null (n/a), never 0. (2) A review belongs to the ASIN: every new rating from ANY buyer of the ASIN, written or not (the product page lists the written ones only), not only this seller's buyers. So there is no SKU grain (a SKU or tag filter reads its ASIN's reviews), and two seller accounts carrying one ASIN carry the same reviews: never add up the rows of groupBy sellerAccount yourself, summary.total counts each ASIN once. (3) Amazon serves a day of reviews about 3 days late, and its last served day is still filling: the answer's reviews_served_from and reviews_served_to are the first and last days served, reviews_complete_to the last complete one. Compare periods, or compute a pace or a rate, over complete days only. In a series a bucket without a review reads null: no review on a served day, not known on the others. (4) rating and ratings are the state the product page displays (ratings is Amazon's count for the ASIN worldwide since its launch, not the period's), read at the period end, never a period total. A row covering several marketplaces reads its top-selling one (rating_marketplace), never a blend; never add ratings up across rows. Amazon keeps no rating history: Nova's is its own reads, which started on 2026-10-01 (per week, the first document closes on 2026-09-26); a bucket before the first read is empty, never 0. (5) review_rate = the ASIN's reviews (all buyers) per 100 units sold by THIS account (review_units): meaningful only where the seller is the ASIN's only seller (its own brand), meaningless on a reseller's shared ASINs (it can exceed 100). (6) NO comparison mode: call once per period. (7) groupBy is EITHER an entity grain (parentAsin, marketplaceParentAsin, childAsin, marketplace, sellerAccount) OR a time grain (day, week, month), never both: for one product's series, filter on it and group by the grain. Per day, week or month: the flows (reviews, critical_reviews, critical_review_share). Per day (as read each day) or week (Amazon's week documents), never month, and in a call of their own: rating, ratings, rating_week_end. Never per time bucket: review_units, review_rate, rating_marketplace. A series comes whole and in date order, one row per bucket: no sortBy, limit or offset, and 1000 buckets at most (over a long period, group by week or month). 🔒 HISTORY: every plan reads the whole history, except a read of review_units or review_rate by an organization on its free trial (no subscription yet, an abandoned checkout included, or no active subscription while its 14-day trial still runs): nothing before its floor is served then, its reviews included, and the answer carries dataFloor, that ISO day, when Nova can state the floor that applied. A paying plan, and a plan cancelled after its trial ended, read the whole history. Vendor Central (1P) accounts have no reviews here: Amazon serves vendors no rating and no review count.

NameRequiredDescriptionDefault
limitNoRows per page of an entity grouping, 1 to 1000 (default 50). Not with a time grain: a series comes whole.
offsetNoRow offset for paging an entity grouping (default 0). Not with a time grain.
periodYesREQUIRED. The flows are summed over it; rating and ratings are the state at its end. No comparison period: call once per period.
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
sortByNoA metric of `metrics` to rank the rows of an entity grouping by (e.g. "reviews"); rating_week_end and rating_marketplace sort alphabetically. Not with a time grain: a series comes in date order.
filtersNoRestrict the read. Omit for every product of the accounts.
groupByNoEITHER an entity grain: parentAsin (a variation family, in every marketplace where it exists), marketplaceParentAsin (a family on ONE marketplace, keyed '<marketplaceId>:<parentAsin>': the app's parent rows), childAsin, marketplace or sellerAccount; OR a time grain: day, week or month (one row per bucket, the whole series). Omit, or null, for one total row.
metricsYesReviews metric keys: reviews, critical_reviews, critical_review_share, review_units, review_rate, rating, ratings, rating_week_end, rating_marketplace. Their own universe: NOT list_metrics, ads or SQP keys. A natural name that means exactly one of them (e.g. "review rate") is resolved and echoed under `metricAliases`.
accountsNoRestrict to a subset of your own seller account IDs (from list_accounts). Omit to include all your accounts. A brand/account name is accepted and resolved to its id when it matches one of your accounts unambiguously; a label that carries the id ("Brand (A1B2C3D4E5F6G)") resolves to that id.
sortOrderNodesc (default) = biggest first, asc = smallest first. Not with a time grain.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare readOnlyHint, and the description adds dense operational context well beyond that: Amazon serves a day of reviews ~3 days late with the last day still filling, counts are null (never 0) outside US/CA/MX/BR, ratings have no history before 2026-10-01, and reading review_units/review_rate on a free-trial org is floor-limited with a dataFloor field returned. It also discloses critical correctness traps (rows are ASIN-level, never sum across seller accounts or add `ratings` up) that no annotation or schema conveys.

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

Conciseness4/5

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

Front-loaded with the purpose, then organized into numbered, scannable caveats with bold markers, and nearly every sentence carries a distinct pitfall. It is nevertheless very long and repeats points the schema already makes verbatim ('No comparison period: call once per period', the metric-key universe), which costs it a point.

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

Completeness5/5

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

For a 10-parameter tool with no output schema, the description still names the return-shape fields an agent must interpret (reviews_served_from/reviews_served_to/reviews_complete_to, dataFloor, metricAliases, summary.total, rating_marketplace) and covers filtering, grain, pagination and account/permission constraints. There is nothing material left for an agent to guess before calling it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, and the description earns more by adding cross-parameter rules the schema does not express: metric-by-grain compatibility (review_units, review_rate, rating_marketplace are never per time bucket), the entity-vs-time groupBy exclusivity, and the 1000-bucket cap with no sortBy/limit/offset on a series. It does not clarify `reason`, `accounts`, or filter ID formats beyond what the schema already says, so it is short of a 5.

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

Purpose5/5

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

The first sentence names the specific verb/domain (Amazon reviews and ratings of the seller's products), the grains (per ASIN and marketplace), the source (Amazon Data Kiosk), and enumerates the metric families returned. It explicitly distinguishes its metric key universe from list_metrics keys, so an agent can tell it apart from query_metrics, query_bsr or query_sqp 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.

Usage Guidelines4/5

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

Strong when/when-not guidance: 'NO comparison mode: call once per period', 'Vendor Central (1P) accounts have no reviews here', groupBy is either an entity grain or a time grain 'never both', and rating/ratings must be read in a call of their own. It never explicitly routes the agent to a named sibling (e.g. use query_metrics for sales, query_bsr for rank), so the alternative-condition step is implied rather than stated.

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

query_search_termsA
Read-only
Inspect

The actual customer SEARCH QUERIES behind Sponsored Products and Sponsored Brands spend — the search-term report, same pipeline as the app (Sponsored Display has no search-term report: asking for it is refused by name). Answers: what customers really type before clicking an ad, negative-keyword candidates (queries with spend and zero sales), auto-campaign discoveries worth promoting to exact match. groupBy="searchTerm" is the main drill-down; the ad product (adProduct), ad-structure grains (portfolio/campaign/adGroup/targetingType/targetingDetail/keyword) and TIME grains also work (adProduct and portfolio need the stacked-cut ads fact and are otherwise refused with a message naming ADS_FACT_ENABLED). Metric universe = the ads keys MINUS impressions/ctr (biased at this grain, rejected) and MINUS the seven brand keys (newToBrand*, videoCompleteViews, viewableImpressions, brandedSearches, topOfSearchImpressionShare — the search-term reports carry none of them) and MINUS the four profit keys (this grain carries no ASIN, so there is no product margin to price a query at — use query_advertising for those): spend, sales, sales14d, clicks, orders, units, units14d, acos, roas, cpc, cvr. NO product (ASIN/SKU) dimension or filter exists here — the search-term report carries no ASIN attribution; for per-product ads use query_advertising. Rows with search term '*' are PDP placements with no typed query. ⚠️ groupBy="searchTerm" serves CLICKED QUERIES ONLY: a query with 0 clicks over the requested period is not served, and rows, summary.count and summary.total all follow that rule (Amazon also emits 0-click / 0-spend rows carrying attribution-window sales; they used to top every ACOS-ascending sort at a fake 0.0%). It is a PERIOD rule, not a daily one — a query clicked on one day keeps the sales its other days attribute. ACOS is null, never 0, when nothing was spent. 🚫 Each searchTerm row carries attrs.negatedLevel ('campaign' | 'ad_group' | null): a keyword negative on that EXACT text already blocking the traffic THIS row is made of — a campaign the row spent in, or an ad group it spent in. A negative in a SIBLING ad group is NOT reported: the query is still costing money where you are looking. Expect it to be null almost everywhere and do not read that as "nothing is blocked" — a negative that works stops the query being served, so it leaves this report entirely; what lights up is a query negated DURING the period. For "have I ever blocked this anywhere", use list_negative_targets with q = the term. ⚠️ Never cross-sum with query_metrics' ad metrics. 🧭 AD PRODUCTS: the console serves Sponsored Products, Sponsored Brands, Sponsored Brands Video and Sponsored Display as DISJOINT blocks of rows — adProducts picks which (default ['sponsored_products'] until the fact serves the others; pass several to read them in ONE call, or groupBy='adProduct' to split the money by product). Each block is read from its own cut of the fact at its OWN attribution window: SP orders/sales/units are 7-day on a Seller Central account and 14-day on a Vendor Central account (each console's own window), SB and SBV 14-day, SD 14-day CLICK-attributed (view-attributed SD conversions are never included) — so never sum or compare sales, orders, ACOS or ROAS across products; spend is the ONE additive column across all four, sponsored_brands + sponsored_brands_video (one report, split per row) the ONE additive pair, and sales14d / units14d the like-for-like 14-day reading. Sponsored Display has no search-term and no placement report (such a call is refused by name). Entity rows carry attrs.adProduct; it is null on a VALUE row (an ASIN, a placement, a targeting type, a search term) that folds two products. 💱 CURRENCY: monetary values are served in the caller's Nova display currency when it is one of the organization's configured currencies (its primary or up to four secondary currencies), else in the organization's primary. In the response, currency is the code, currencyBasis says why (user_preference | organization | pinned) and currencyNotice, when present, MUST be relayed to the user. Quote the code; never assume a symbol from the marketplace. Pass currency to pin any configured code — e.g. to reproduce a figure the seller read on a dashboard set to another currency.

NameRequiredDescriptionDefault
toYesPeriod end, INCLUSIVE (YYYY-MM-DD): a calendar month is from=YYYY-MM-01 to=its LAST day. to=the 1st of the next month adds one extra day to every total (and one extra bucket with a time grain).
fromYesPeriod start, INCLUSIVE (YYYY-MM-DD).
limitNoRows per call of an entity grouping, 1 to 1000 (default 50). A time grain is never cut: its series comes whole, in date order, 1000 buckets at most.
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
sortByNoMetric key of THIS universe to rank rows by (e.g. "spend"). Refused with a time grain: a series comes in date order.
groupByNosearchTerm (the main drill-down), the ad product (adProduct), an ad-structure grain (portfolio/campaign/adGroup/targetingType/targetingDetail/keyword), or a time grain. Omit for a single total row.
metricsYesADS metric keys minus impressions/ctr and minus the profit keys — NOT product keys from list_metrics.
accountsNoRestrict to a subset of your own seller account IDs (from list_accounts). Omit to include all your accounts. A brand/account name is accepted and resolved to its id when it matches one of your accounts unambiguously; a label that carries the id ("Brand (A1B2C3D4E5F6G)") resolves to that id.
channelsNoONE Amazon programme per call. 'SELLER' = Seller Central (3P) advertising: the seller's own Amazon Ads campaigns. 'VENDOR' = Vendor Central (1P) advertising: the campaigns of the vendor's own Amazon Ads profile. Omit = SELLER whenever the accounts of the call include a Seller Central account, else VENDOR. Pass ['VENDOR'] only when the user asks about Vendor Central / 1P advertising. Both at once is refused: 3P and 1P spend and sales are never added into one total.
currencyNoPin the reporting currency: one of the organization's configured codes — its primary or any of its secondary currencies (e.g. "USD"). Omit to follow the caller's Nova display currency, the dashboard's rule. Any other code is refused.
sortFieldNoWhat to rank on: 'value' (default), or 'variance' / 'variancePercentage' (need a comparison period).
sortOrderNodesc (default) = biggest first.
adGroupIdsNo
adProductsNoWhich ad products to read, as disjoint blocks: sponsored_products, sponsored_brands, sponsored_brands_video, sponsored_display. Default ['sponsored_products'] until the fact serves the others. Each has its own attribution window and history floor — see the AD PRODUCTS note.
keywordIdsNo
campaignIdsNo
searchTermsNoExact customer queries to keep (identity filter).
comparisonToNoBaseline period end (inclusive).
marketplacesNoMarketplace IDs.
portfolioIdsNoPortfolio ids — needs the stacked-cut ads fact (ADS_FACT_ENABLED).
metricFiltersNoServer-side threshold filters (ANDed) — e.g. spend > 20 AND sales < 1 for negative-keyword candidates. Needs an entity grouping.
comparisonFromNoBaseline period start (inclusive) — enables variance.
targetingTypesNoe.g. keyword, auto, product, category.
targetingDetailsNo
excludeUnfinishedNoExclude the current, still-incomplete period so a partial day/week/month is not read as a drop.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint; the description carries the rest of the burden and does so densely — clicked-queries-only serving for groupBy='searchTerm', non-additivity of sales/orders/ACOS across ad products with the single additive column named, per-product attribution windows, null-vs-0 ACOS semantics, and currency resolution/relay rules. Far beyond what annotations or schema state.

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

Conciseness3/5

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

The lead sentence is well front-loaded, but the body is a wall of prose with emoji-tagged asides that drifts toward reference documentation — Sponsored Display's lack of a search-term report is stated twice, and the AD PRODUCTS paragraph is long enough to be skimmed past. For a 25-parameter tool the density is defensible, but it is not tight.

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

Completeness5/5

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

No output schema exists, and the description compensates: it explains the response's `currency`/`currencyBasis`/`currencyNotice` fields, `attrs.negatedLevel` and its null caveat, summary.count/total semantics under the click rule, and the '*' PDP placeholder. An agent has enough to call and interpret results correctly.

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

Parameters5/5

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

Schema coverage is already 84%, but the description adds real meaning the schema lacks: the exact metric universe (which ads keys are rejected and why), what each groupBy actually resolves to at this grain, the adProducts default and its disjoint-block behavior, and currency pinning semantics. This is additive, not restated.

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

Purpose5/5

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

Opens with a specific verb+resource: "The actual customer SEARCH QUERIES behind Sponsored Products and Sponsored Brands spend — the search-term report." It immediately names the questions it answers (negative-keyword candidates, auto-campaign discoveries) and explicitly disclaims Sponsored Display, so an agent can separate it from query_advertising and query_metrics.

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

Usage Guidelines5/5

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

Explicit routing throughout: use query_advertising for per-product ASIN metrics, query_metrics is never cross-summed, list_negative_targets with `q` for "have I ever blocked this", groupBy='adProduct' to split the money. It also spells out refusal conditions (Sponsored Display search-term calls, portfolio/adProduct without ADS_FACT_ENABLED) so the agent knows what will fail before calling.

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

query_sqpA
Read-only
Inspect

Amazon SEARCH QUERY PERFORMANCE (Brand Analytics), curated — what shoppers TYPE on Amazon, the whole market's funnel on each query, and your slice of it. ORGANIC demand: this is not ads, and not query_search_terms (that one is what people typed before clicking YOUR ad; this is every seller's behaviour on the query). Answers: which keywords grow or shrink my market, where I lose share, which high-volume queries I am absent from, whether competitors take my brand, do I convert better than the market, am I priced above it. Two vocabularies: market_* = all sellers on that query, your_* = this product. ⏱ FIXED CALENDAR PERIODS: grain is REQUIRED ('week' | 'month'); omit from/to and you get the LATEST COMPLETE period, which is what you almost always want. The response echoes the period actually served: period.from/to are period STARTS (the mart key — read alone they look like one day), and period.covers is the SAME period in calendar DAYS (an SQP week is SUNDAY→Saturday, not an ISO Monday week; a month 1st→last). Weekly runs ~10 days behind, monthly ~7 WEEKS behind, so when crossing with query_metrics / query_advertising / query_search_terms you MUST pass EXACTLY period.covers.from and period.covers.to as their from/to — never 'this month', never period.from/to, and never a weekly series from those tools (their weeks start on Monday and will not line up with SQP weeks). 🔒 HISTORY DEPTH: on a trial plan the response carries dataFloor, an ISO day — NOTHING before it was served, whatever the seller's real history holds, so absence below that day means 'withheld by the plan', never 'no demand'. The field is ABSENT when nothing was withheld. Say so instead of concluding a keyword is new or a market collapsed. 📊 COMPARISON IS A METRIC, not a mode: use search_volume_yoy_pct (month) or search_volume_wow_pct (week) — they are like-for-like, computed only over keywords present in BOTH periods; comparing period totals reads +34% where the truth is -3%. Read comparable_keywords / comparable_share to see how solid it is; the metric is null below the reliability floor. ⚠️ DO NOT SUM market_* VALUES ACROSS ROWS YOURSELF: a query's volume is repeated on every parent ASIN that ranks on it, so adding rows double counts (measured x2.4). The summary block is already de-duplicated — use it. ⚠️ FILTER queryTypes OR YOUR ANSWER IS NOISE: too_broad and long_tail are category demand and dominate any total, so 'my biggest gap' unfiltered returns head terms like 'makeup'. Use ['core','presence','suggested','competitor'] for actionable work, ['core'] for your tight market, ['own_brand'] for brand defence. 🔗 CROSSING WITH PPC: group by keyword and each row carries variants, the spellings that query merges — filter query_advertising/query_search_terms with ALL of them, because 35% of served queries have several spellings and they carry 60% of the volume, so matching one string silently misses real campaigns. The reverse works too: pass your PPC targets into keywords here and they resolve through the same clustering. Metric keys are their OWN universe — not list_metrics keys, not ads keys. 💱 CURRENCY: monetary values are ALWAYS served in the organization's primary currency — the secondary currencies are not supported on this route; currency in the response is the code and currencyNotice, when present, MUST be relayed to the user.

NameRequiredDescriptionDefault
qNoFree-text search over the query wording.
toNoWindow on period STARTS: every complete week/month whose start date is <= to is served (a week starting on `to` is fully included). Omit BOTH from/to to get the latest complete period.
fromNoWindow on period STARTS: every complete week/month whose start date is >= from is served. Omit BOTH from/to to get the latest complete period.
skusNoSKUs — resolved up to their families.
tagsNo"Your Filters" tag IDS from list_tags — a tag NAME is rejected.
grainYesREQUIRED. 'month' for year-over-year, month-over-month and trend work; 'week' for anything recent (10-day lag vs ~7 weeks).
limitNoRows per call of an entity grouping, 1 to 1000 (default 50). groupBy 'period' is never cut: the series comes whole, in date order.
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
sortByNoSQP metric key to rank rows by (e.g. "search_volume"). Refused with groupBy 'period': the series comes in date order.
groupByNo'keyword' is the main drill-down (and the only grain that returns `variants`); 'parentAsin', 'queryType', 'marketplace', or 'period' for a time series — one row per published week/month of the requested grain, keyed {type:'period', granularity, from, to} (from/to are the SQP period bounds, NOT your from/to). Omit for one total row.
metricsYesSQP metric keys (search_volume, your_impression_share, market_purchases, search_volume_yoy_pct, …) — NOT product or ads keys. Like-for-like variances carry their horizon in the name: _yoy_ and _mom_ at grain month, _wow_ at grain week.
accountsNoRestrict to a subset of your own seller account IDs (from list_accounts). Omit to include all your accounts. A brand/account name is accepted and resolved to its id when it matches one of your accounts unambiguously; a label that carries the id ("Brand (A1B2C3D4E5F6G)") resolves to that id.
keywordsNoExact customer queries — matched through the clustering, so any spelling of the query works (pass your PPC targets here directly).
sortOrderNodesc (default) = biggest first.
childAsinsNoChild ASINs — resolved UP to their families (a child has no market of its own).
queryTypesNoHow the query relates to the product. READ THE TOOL DESCRIPTION: leaving this open returns category head terms. The cockpit's SQP columns use ['core','presence','suggested','ads_only','low_ctr'] — pass exactly that to match what the seller sees in Nova.
parentAsinsNoFamily keys — the grain SQP is reported at.
marketplacesNoMarketplace IDs.
metricFiltersNoServer-side thresholds (ANDed) — e.g. your_impression_share < 5 AND search_volume > 1000 for the gaps that matter. Needs an entity grouping.

TDQS

A4.8/5.0
Behavior5/5

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

With only readOnlyHint declared, the description carries the burden and does so well: history is truncated by plan and signalled by `dataFloor` (absent when nothing withheld), weekly data lags ~10 days and monthly ~7 weeks, cross-row summing double counts ~2.4x so the pre-deduplicated `summary` must be used, YoY/WoW metrics are like-for-like only over keywords present in both periods and null below a reliability floor, and monetary values are forced to the org primary currency with an optional `currencyNotice` that must be relayed.

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

Conciseness4/5

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

Purpose is front-loaded in the first sentence and the rest is chunked under scannable markers (period, history depth, comparison, dedup, queryTypes, PPC crossing, currency). It is long — roughly 400 words with several schema restatements — but nearly every block encodes a distinct failure mode the agent would otherwise hit, so little is truly wasted.

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

Completeness5/5

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

For a 19-parameter, no-output-schema analytics tool this is thorough: it describes the response envelope fields an agent must interpret (`period.from/to` as period starts, `period.covers` in calendar days, `summary`, `dataFloor`, `comparable_keywords`/`comparable_share`, `currency`, `currencyNotice`) and the SQP-vs-ISO week mismatch that breaks joins. Nothing essential for correct invocation or correct interpretation appears missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description still adds genuine meaning beyond it by tying parameters to analytical intent — `grain` selects week vs month and their different lag profiles, omitting `from`/`to` yields the latest complete period, `keywords` accepts PPC targets because they resolve through the same clustering, and leaving `queryTypes` open returns head terms like 'makeup'. Some of this is restated from the schema (grain REQUIRED, from/to semantics), which caps it short of 5.

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

Purpose5/5

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

The opening states a specific resource (Amazon Search Query Performance / Brand Analytics) and a specific scope — organic query-level demand across the whole market plus the seller's slice. It explicitly distinguishes itself from the nearest sibling ("not query_search_terms … that one is what people typed before clicking YOUR ad"), so an agent can route without opening either schema.

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

Usage Guidelines5/5

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

It states concrete when-to-use conditions rather than implying them: 'use ["core","presence","suggested","competitor"] for actionable work, ["core"] for your tight market, ["own_brand"] for brand defence', and it names the alternatives (query_metrics, query_advertising, query_search_terms) plus the exact condition for crossing with them. It also tells the agent what NOT to do ('never this month', 'never period.from/to') and why.

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

query_subscribe_and_saveA
Read-only
Inspect

SUBSCRIBE & SAVE: the programme's health, its offers and each product's state, from Amazon's own Replenishment figures (daily snapshots). Four sections. health (per account × marketplace, as of the latest snapshot): lastMonth (units, revenue, active subscriptions, revenue lost to stockouts, revenue penetration, coupons), retention (subscriptions retained after 30 / 90 days), subscribers (average revenue and reorders of a subscriber vs a non-subscriber, revenue from subscriptions with several deliveries / one delivery still active / one delivery then cancelled), fundingTiers (revenue share and sign-up conversion of the seller-funded discount tiers 0 / 5 / 10 / 5+ %), lifetimeValue (by customer segment, one-time purchases vs subscriptions) — every block carries ITS window: the base figures are last month, the others trailing 12 months (24 for lifetime value), and Amazon gives them per account only, never per ASIN. The health's amounts are in each marketplace's own currency (the row's currency), or in the currency you pass, one of the organization's configured codes: each block is then converted at the average daily rate over its own window, convertedFrom naming the marketplace's currency, and an amount whose window has no rate reads null, never unconverted. Pass the currency query_metrics answers in to read the amounts as the cockpit's Subscribe & Save program card shows them. offers (per ASIN × SKU × marketplace): eligibility (ELIGIBLE | INELIGIBLE | SUSPENDED — INELIGIBLE cancels the subscriptions; SUSPENDED: Amazon has suspended the offer from Subscribe & Save, and its existing subscriptions still count in Amazon's figures; what Amazon does with their deliveries is not established, so state the suspension, never a consequence), subscriptions, inventory and stockRisk, price, the funded discounts (seller and Amazon, base and tiered, in %), autoEnrollment, forecastDeliveries at 15/30/60/90 days (units), deliveries30d by condition with atRisk (Amazon's at-risk count never includes a suspended offer), forecastRevenue at 30/60/90 days. changes: the eligibility transitions of the last sinceDays days: kind = loss when the offer leaves ELIGIBLE (a suspension included, which is not a cancellation), recovery when it returns to ELIGIBLE, other between two states that are not ELIGIBLE. Each change also carries marketplaceCode (the code the seller says, US or DE; marketplace keeps the id) and subscriptionsCancelled, true when the offer turns INELIGIBLE, SUSPENDED → INELIGIBLE included (a kind other). The statuses: ELIGIBLE serves the current subscriptions and takes new ones; SUSPENDED: no new subscriptions; INELIGIBLE: no new subscriptions, and Amazon cancels the existing ones. The daily check is section changes with sinceDays 1, keeping the rows where subscriptionsCancelled is true or eligibility is SUSPENDED with previousSubscriptions > 0; the answer's snapshots gives each account's latest offer snapshot (null: no offer snapshot in this scope), and its notice, when present, names the accounts whose snapshot of the day (UTC) has not landed yet: an empty list for them means not read yet, never no change, so relay it. summary (one row per product as of the latest snapshot of each account and marketplace: the cockpit's S&S Health column): per ASIN, or per ASIN × SKU with groupBy='sku'; one row over all the product's marketplaces, or one per marketplace with byMarketplace=true (marketplace then names it). A row adds up the accounts of the call that carry the product: pass accounts to read one. Each row carries subscriptions (its active subscriptions; null when Amazon reported none of its offers' counts), forecastDeliveries30d (the units Amazon plans to deliver to subscribers over the next 30 days), deliveries30d by Amazon's condition: pausedNonBuyable and pausedPricing (PAUSED: those deliveries are stopped, the offer not buyable or for a pricing issue), lowInventoryRisk (AT RISK: still scheduled, threatened by low inventory) and noIssues; suspendedOffers and suspendedSubscriptions (SUSPENDED as in offers: their subscriptions count in subscriptions and in the forecast, and Amazon's at-risk count never includes them), and suspendedOffersWithSubscribers, the suspended offers that carry subscriptions; ineligibleOffers (the INELIGIBLE ones only, their subscriptions cancelled); eligibility, Amazon's status over the product's offers, the one rule of every Subscribe & Save surface: SUSPENDED when a suspended offer carries subscriptions (SUSPENDED as in offers: state the suspension, never a consequence), else ELIGIBLE when one offer is ELIGIBLE or REPLENISHMENT_ONLY_ORDERING, else SUSPENDED when one offer is, else INELIGIBLE when every offer is, else null; a suspended offer without subscribers on an otherwise eligible product leaves it ELIGIBLE (mention it, e.g. '1 suspended offer, no subscribers', never as the product's state); sellerFundedBaseDiscountPct { min, max }, the base discount the seller funds on the product's offers in % (min and max equal on a single offer; null when Amazon reported none); offers, marketplaces and snapshotDate; and health, the worst of Amazon's warnings: paused_non_buyable, then paused_pricing, at_risk_low_inventory, suspended (a suspended offer with subscribers), else no_issues. The products Amazon warns about come first, then the most subscribed, so limit cuts quiet products first. Counts and units only, no amount. For the S&S sales, units, active subscriptions, stockout loss (in sales and in units) and the discount the seller funded OVER A PERIOD and by product, use query_metrics (activeSubscriptions, shippedSubscriptionUnits, totalSubscriptionsRevenue, salesPenetration, lostSubscriptionsRevenue, subscriptionsStockoutRate, missedSubscriptionUnits, subscribeAndSaveDiscount), whose answer says when the S&S figures of a period are partial or incomplete; for the projected units next to days of inventory, query_inventory.

NameRequiredDescriptionDefault
skusNooffers / changes / summary: only these SKUs.
asinsNooffers / changes / summary: only these ASINs.
limitNooffers / changes / summary: row cap (default 200).
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
groupByNosummary only: one row per ASIN (default) or per ASIN × SKU ('sku').
sectionYeshealth = account-level programme health; offers = the offers as of today; changes = eligibility transitions; summary = one row per product as of today (the cockpit's S&S Health).
accountsNoRestrict to a subset of your own seller account IDs (from list_accounts). Omit to include all your accounts. A brand/account name is accepted and resolved to its id when it matches one of your accounts unambiguously; a label that carries the id ("Brand (A1B2C3D4E5F6G)") resolves to that id.
currencyNohealth only: the amounts in this currency, one of the organization's configured codes (its primary or a secondary currency, e.g. "USD"), each block converted at the average daily rate over its own window; any other code is refused. Omit for each marketplace's own currency.
sinceDaysNochanges: days back from today (default 30).
marketplacesNoRestrict to these marketplace IDs.
byMarketplaceNosummary only: one row per marketplace of each product (true) instead of one row over all its marketplaces (default).

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare readOnlyHint, so the description carries most of the burden and does so: currency conversion at the block's own window rate, nulls for windows without a rate, `convertedFrom` semantics, null meaning 'no offer snapshot in scope', the `notice` field meaning 'not read yet, never no change', ordering/limit behaviour, and repeated caution that a suspension must be stated without inferring consequences. These are exactly the non-obvious traits 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.

Conciseness2/5

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

The four sections are labelled, but the body is a single dense block of 700+ words with parenthetical asides nested several levels deep, making it hard to scan in a tool-selection context. Much of the content is genuinely useful, but the packaging costs readability and repetition (the SUSPENDED/at-risk caveat is restated three times).

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

Completeness5/5

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

Eleven parameters, no output schema, and the description compensates by documenting the shape of each section's return fields (health blocks, offers columns, changes kinds, summary row fields including eligibility derivation rules). For a read-only, no-output-schema tool of this complexity, nothing essential about correct invocation is left unstated.

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

Parameters4/5

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

Schema coverage is already 100%, so the bar is added meaning beyond the schema; the description supplies it for `currency` (must be an organization-configured code, per-block window conversion, refusal of other codes), `sinceDays`, `limit` (products Amazon warns about first, quiet products cut first), and `accounts`. It adds little for `skus`/`asins`/`marketplaces`/`reason` beyond what the schema states, so it stops short of a 5.

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

Purpose5/5

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

Opens with a specific verb+resource (Subscribe & Save programme health, offers, per-product state) sourced from Amazon Replenishment daily snapshots, and enumerates the four sections explicitly. It is clearly distinguished from the sibling tools query_metrics and query_inventory, which are named for the cases this tool does not cover.

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

Usage Guidelines5/5

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

Explicitly routes the agent: use query_metrics for period-based S&S sales/units/stockout loss/discounts and query_inventory for projected units next to days of inventory. It also gives a concrete recipe for the daily check ('section changes with sinceDays 1, keeping rows where subscriptionsCancelled is true or eligibility is SUSPENDED with previousSubscriptions > 0') and a rule for when to pass `accounts`.

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

set_stock_defaultsAInspect

Set ONE account's numbers of the TOP table of the Supply chain page — the warehouse & 3PL setup: per warehouse (its stock region, or its name as get_setup domain=supply_chain lists it) the transit to Amazon, the target stock at Amazon, the target stock at the warehouse and the transit from the factory; per account (region 'ALL') the production lead time; and the factory lines (goods straight from a country to a territory). These are ranks 3 and 4 of the ladder, above the fleet default (rank 5, Nova's number, the page's gold figure) and below the product's own lines (import_supply_chain): a value set here reaches every product without its own number. Fields you omit keep their current value, null clears one; when a line's numbers end up blank its row is deleted. Give ONE region at the top level (the form of before 2026-10-22), or rows (several regions or warehouses at once) and / or factoryLines. TWO-STEP: call WITHOUT commit to preview current → new per parameter, show the user, then commit with the confirmationToken. Requires the OAuth connection and the OWNER role.

NameRequiredDescriptionDefault
rowsNoSeveral lines of the top table at once: one per region or warehouse, with the fields to change.
commitNoOmit/false = preview (no write). true = write; requires the confirmationToken from the preview.
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
regionNoA stock region as get_setup domain=stock lists them ('USA', 'EU_FBA', 'UK', 'Canada'…; 'US', 'EU', 'GB' are accepted) or 'ALL' (every region without its own row).
accountYesThe seller account (seller_partner_id, or an unambiguous account name).
factoryLinesNoThe factory lines of the top table: one per (country, territory), with the fields to change.
targetDaysAmazonNoDays of cover to hold at Amazon (FBA + AWD). Omit = unchanged, null = clear.
confirmationTokenNoThe token the preview returned.
targetDaysExternalNoDays of cover to hold at the external location; 0 for sellers shipping straight to FBA. Omit = unchanged, null = clear.
leadTimeTransitDaysNoDays in transit to the external location or to Amazon. Omit = unchanged, null = clear.
leadTimeProductionDaysNoDays from the purchase order to the goods leaving the factory. Omit = unchanged, null = clear.
leadTimeToWarehouseDaysNoDays from the factory to the warehouse / 3PL; 0 when the goods ship straight to Amazon. Omit = unchanged, null = clear.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the lone readOnlyHint=false annotation, the description discloses the merge semantics ('omit = unchanged, null clears'), a destructive side effect ('when a line's numbers end up blank its row is deleted'), the preview/commit protocol with confirmationToken, and the auth/role requirement. These are exactly the behavioral traits an agent cannot infer from the annotation.

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

Conciseness4/5

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

The purpose and scope are front-loaded and every clause carries operational meaning, but it is a single dense, em-dash-laden block with decorative asides ('Nova's number, the page's gold figure') that slow parsing. Justified in length by the tool's complexity, slightly improvable in structure.

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

Completeness5/5

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

For a 12-parameter mutation tool with no output schema, the description covers the input-shape alternatives, merge/clear/delete semantics, the confirmation flow, and auth requirements. An agent has everything needed to call it correctly and safely without further documentation.

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

Parameters4/5

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

With 100% schema description coverage the baseline is 3, and the description earns an extra point by explaining the conceptual model behind the params: region 'ALL' vs per-warehouse rows, what each numeric field controls in the ladder, and how factoryLines differ (never 'ALL'). It stops short of adding format details beyond the schema, but the added meaning is real.

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

Purpose5/5

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

The description opens with a specific verb and resource — 'Set ONE account's numbers of the TOP table of the Supply chain page' — and immediately scopes it to the warehouse/3PL setup. It explicitly positions the tool against siblings by naming import_supply_chain (product-level lines) and get_setup (to enumerate domain/warehouse values), so an agent can distinguish it 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.

Usage Guidelines5/5

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

It states the precedence rule ('a value set here reaches every product without its own number'), the alternative that overrides it (import_supply_chain), the two alternative input shapes (single region vs rows/factoryLines), the mandatory two-step preview-then-commit flow, and the prerequisites (OAuth connection, OWNER role). That is close to a complete when/when-not/alternatives guide.

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

set_vat_default_categoryAInspect

Set (or clear) ONE account's DEFAULT VAT category — the category every product without its own falls back to. 'A_NOVA_ZERO' is the zero-rated switch (VAT handled outside Nova, or VAT-free sales); a real code (e.g. 'A_GEN_STANDARD') applies one category to the whole catalog. TWO-STEP: call WITHOUT commit to preview current → new, show the user, then commit with the confirmationToken. category null clears the default. Requires the OAuth connection and the OWNER role.

NameRequiredDescriptionDefault
commitNoOmit/false = preview (no write). true = write; requires the confirmationToken from the preview.
reasonNoOne sentence, ALWAYS IN ENGLISH (regardless of the conversation language), on WHY you are making this call — the user question or your analytical goal. Recorded so the seller can see how their data is used.
accountYesThe seller account (seller_partner_id, or an unambiguous account name).
categoryYesA code from get_setup domain=vat `categories`, or null to clear the default.
confirmationTokenNoThe token the preview returned.

TDQS

A4.6/5.0
Behavior5/5

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

With only readOnlyHint=false available, the description carries real weight: it discloses the mandatory two-step preview-then-commit flow with a confirmationToken, that omitting commit performs no write, that category null clears state, and the auth/role requirements. That is exactly the mutation-risk context annotations don't provide.

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

Conciseness4/5

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

Front-loaded with the core action and the two-step flow; every sentence carries operational information. The heavy capitalization and em-dash density make it slightly harder to scan than an ideal definition, but nothing is filler.

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

Completeness5/5

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

Covers everything needed to call it correctly: fallback semantics, value choice, preview/commit sequence, clearing behavior, and auth prerequisites. With no output schema, the preview description ('current → new') adequately signals what comes back.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds genuine semantics beyond the schema: it explains what 'A_NOVA_ZERO' actually means versus a concrete code and what null does to the default. It does not elaborate on reason or confirmationToken beyond the schema, keeping it below 5.

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

Purpose5/5

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

States a specific verb and resource with explicit scope: set (or clear) ONE account's DEFAULT VAT category, defined as the fallback for products without their own. That definition distinguishes it from bulk-import siblings like import_vat_categories and from per-product settings.

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

Usage Guidelines4/5

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

Gives concrete when-to-use guidance for the key decision: 'A_NOVA_ZERO' for zero-rated/VAT-outside-Nova sales vs a real code to apply one category catalog-wide, plus null to clear. Preconditions (OAuth connection, OWNER role) are stated. It does not explicitly route to a sibling alternative (e.g. import_vat_categories for bulk), so not a 5.

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.

  1. 18 tool updates
    • Removedget_cogs_setup
    • Changedget_cogs_worksheet1 field changed
      • changedInput schema / properties / region / description
        Previous value: -"COGS region code (from get_cogs_setup): 'US', 'UK', the Pan-EU pool 'EU', an EU country ('DE', 'FR', …), …"New value: +"COGS region code (from get_setup domain=cogs): 'US', 'UK', the Pan-EU pool 'EU', an EU country ('DE', 'FR', …), …"
    • Removedget_fbm_setup
    • Removedget_inventory_overview
    • Addedget_setup
    • Removedget_stock_setup
    • Changedget_stock_worksheet1 field changed
      • changedInput schema / properties / region / description
        Previous value: -"A stock region as get_stock_setup lists them ('USA', 'EU_FBA', 'UK', 'Canada'…; 'US', 'EU', 'GB' are accepted) or 'ALL' (every region without its own row)."New value: +"A stock region as get_setup domain=stock lists them ('USA', 'EU_FBA', 'UK', 'Canada'…; 'US', 'EU', 'GB' are accepted) or 'ALL' (every region without its own row)."
    • Changedget_supply_chain_products1 field changed
      • changedInput schema / properties / warehouse / description
        Previous value: -"One warehouse: its name as get_supply_chain_setup lists it (\"UNIS, Buena Park\", or \"UNIS\"), or a stock region ('USA', 'EU_FBA', 'UK', 'Canada'…; 'US', 'EU', 'GB' are accepted) for the warehouse serving it. Omit for every warehouse."New value: +"One warehouse: its name as get_setup domain=supply_chain lists it (\"UNIS, Buena Park\", or \"UNIS\"), or a stock region ('USA', 'EU_FBA', 'UK', 'Canada'…; 'US', 'EU', 'GB' are accepted) for the warehouse serving it. Omit for every warehouse."
    • Removedget_supply_chain_setup
    • Removedget_vat_setup
    • Changedimport_external_stock1 field changed
      • changedInput schema / properties / rows / items / properties / region / description
        Previous value: -"A stock region as get_stock_setup lists them ('USA', 'EU_FBA', 'UK', 'Canada'…; 'US', 'EU', 'GB' are accepted). Never 'ALL': the units sit in one place."New value: +"A stock region as get_setup domain=stock lists them ('USA', 'EU_FBA', 'UK', 'Canada'…; 'US', 'EU', 'GB' are accepted). Never 'ALL': the units sit in one place."
    • Changedimport_stock_params1 field changed
      • changedInput schema / properties / rows / items / properties / region / description
        Previous value: -"A stock region as get_stock_setup lists them ('USA', 'EU_FBA', 'UK', 'Canada'…; 'US', 'EU', 'GB' are accepted) or 'ALL' (every region without its own row)."New value: +"A stock region as get_setup domain=stock lists them ('USA', 'EU_FBA', 'UK', 'Canada'…; 'US', 'EU', 'GB' are accepted) or 'ALL' (every region without its own row)."
    • Changedimport_supplier_orders1 field changed
      • changedInput schema / properties / rows / items / properties / region / description
        Previous value: -"A stock region as get_stock_setup lists them ('USA', 'EU_FBA', 'UK', 'Canada'…; 'US', 'EU', 'GB' are accepted). Never 'ALL': the units sit in one place."New value: +"A stock region as get_setup domain=stock lists them ('USA', 'EU_FBA', 'UK', 'Canada'…; 'US', 'EU', 'GB' are accepted). Never 'ALL': the units sit in one place."
    • Changedimport_supply_chain2 fields changed
      • changedInput schema / properties / rows / items / properties / region / description
        Previous value: -"The warehouse's stock region as get_supply_chain_setup lists them ('USA', 'EU_FBA', 'UK', 'Canada'…; 'US', 'EU', 'GB' are accepted), or 'ALL' for the six numbers alone. Give either region or warehouse."New value: +"The warehouse's stock region as get_setup domain=supply_chain lists them ('USA', 'EU_FBA', 'UK', 'Canada'…; 'US', 'EU', 'GB' are accepted), or 'ALL' for the six numbers alone. Give either region or warehouse."
      • changedInput schema / properties / rows / items / properties / warehouse / description
        Previous value: -"The warehouse as get_supply_chain_setup names it (\"UNIS, Buena Park\", or \"UNIS\"): resolved to its region."New value: +"The warehouse as get_setup domain=supply_chain names it (\"UNIS, Buena Park\", or \"UNIS\"): resolved to its region."
    • Changedimport_vat_categories1 field changed
      • changedInput schema / properties / rows / items / properties / category / description
        Previous value: -"A code from get_vat_setup `categories` (e.g. 'A_GEN_STANDARD', 'A_BOOK_ADULT', 'A_NOVA_ZERO'). null or omitted = CLEAR the category of this row (merge) / no category (replace)."New value: +"A code from get_setup domain=vat `categories` (e.g. 'A_GEN_STANDARD', 'A_BOOK_ADULT', 'A_NOVA_ZERO'). null or omitted = CLEAR the category of this row (merge) / no category (replace)."
    • Changedquery_inventory2 fields changed
      • changedInput schema / properties / groupBy / description
        Previous value: -"Report per SKU (default) or per stock region."New value: +"'sku' (default) = a row per stock region × SKU; 'asin' = a row per stock region × ASIN, its SKUs folded; 'stockRegion' = the page's Stock locations tiles, one per stock region plus `totals` (All locations), units deduplicated so they add up across territories (see STOCK LOCATIONS)."
      • changedInput schema / properties / groupBy / enum
        Previous value: -[
        -  "sku",
        -  "stockRegion"
        -]New value: +[
        +  "sku",
        +  "asin",
        +  "stockRegion"
        +]
    • Changedset_stock_defaults3 fields changed
      • changedInput schema / properties / factoryLines / items / properties / region / description
        Previous value: -"A stock region as get_stock_setup lists them ('USA', 'EU_FBA', 'UK', 'Canada'…; 'US', 'EU', 'GB' are accepted). Never 'ALL': the units sit in one place."New value: +"A stock region as get_setup domain=stock lists them ('USA', 'EU_FBA', 'UK', 'Canada'…; 'US', 'EU', 'GB' are accepted). Never 'ALL': the units sit in one place."
      • changedInput schema / properties / region / description
        Previous value: -"A stock region as get_stock_setup lists them ('USA', 'EU_FBA', 'UK', 'Canada'…; 'US', 'EU', 'GB' are accepted) or 'ALL' (every region without its own row)."New value: +"A stock region as get_setup domain=stock lists them ('USA', 'EU_FBA', 'UK', 'Canada'…; 'US', 'EU', 'GB' are accepted) or 'ALL' (every region without its own row)."
      • changedInput schema / properties / rows / items / properties / warehouse / description
        Previous value: -"The warehouse as get_supply_chain_setup names it: its region takes the numbers."New value: +"The warehouse as get_setup domain=supply_chain names it: its region takes the numbers."
    • Changedset_vat_default_category1 field changed
      • changedInput schema / properties / category / description
        Previous value: -"A code from get_vat_setup `categories`, or null to clear the default."New value: +"A code from get_setup domain=vat `categories`, or null to clear the default."
  2. 45 tool updates
    • First observedcreate_events
    • First observeddescribe_metric
    • First observedexplain_movement
    • First observedfind_movers
    • First observedget_cogs_setup
    • First observedget_cogs_worksheet
    • First observedget_fbm_setup
    • First observedget_fbm_worksheet
    • First observedget_inventory_overview
    • First observedget_stock_setup
    • First observedget_stock_worksheet
    • First observedget_supply_chain_products
    • First observedget_supply_chain_setup
    • First observedget_tags_worksheet
    • First observedget_vat_setup
    • First observedget_vat_worksheet
    • First observedimport_cogs
    • First observedimport_external_stock
    • First observedimport_fbm_costs
    • First observedimport_fbm_zone_rates
    • First observedimport_product_tags
    • First observedimport_stock_params
    • First observedimport_supplier_orders
    • First observedimport_supply_chain
    • First observedimport_vat_categories
    • First observedlist_accounts
    • First observedlist_cost_inputs
    • First observedlist_events
    • First observedlist_metrics
    • First observedlist_negative_targets
    • First observedlist_tags
    • First observedquery_advertising
    • First observedquery_bsr
    • First observedquery_dsp
    • First observedquery_inbound_shipments
    • First observedquery_inventory
    • First observedquery_listing_health
    • First observedquery_metrics
    • First observedquery_pnl_bridge
    • First observedquery_reviews
    • First observedquery_search_terms
    • First observedquery_sqp
    • First observedquery_subscribe_and_save
    • First observedset_stock_defaults
    • First observedset_vat_default_category

Publisher details

Operator
Nova Data Analytics SAS · Publisher source
Operator website
https://novadata.io
Vendor relationship
Independent
Restrictions
Paid plan from $49/month per Amazon account, with a 14-day free trial and no card required. Requires a Nova account with at least one Amazon Seller Central, Vendor Central or Ads account connected. Sign-in is OAuth with your Nova account; no custom OAuth app is needed. Listing content edits are limited to the Seller Central account owner and must be enabled for the workspace. · Publisher source

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Self-hosted analytics for a single Amazon seller account, pulling Seller Central and Advertising data into Postgres and serving it to Claude via a bearer-token-guarded HTTP endpoint.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Connects Amazon Seller Central and Amazon Advertising to any MCP client, with a settlement-accurate P&L underneath: every fee, refund and reimbursement as Amazon actually posted it, so contribution margin and breakeven are per product, per marketplace, per day. 107 tools spanning P&L, full Sponsored Products/Brands/Display management, Search Query Performance and Brand Analytics, inventory and for
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables sellers to interact with Amazon Selling Partner API and Advertising API data—orders, inventory, pricing, ads, reports, and more—through MCP clients like Claude and Cursor.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.