Ask AI
Server Details
Ask questions across Shopify, Klaviyo, GA4 and 20+ e-commerce sources in plain English.
- Status
- Healthy
- Uptime
- 99.9% over 37 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 60 tools
Each tool has a clearly stated distinct purpose with detailed descriptions that explicitly disambiguate overlapping areas (e.g., get_orders vs query_orders vs get_order; get_marketing_performance vs get_metrics_comparison). With 60 tools there is some residual ambiguity risk — e.g., get_top_products vs get_product_analytics vs get_product_health all touch product sales — but the descriptions successfully carve out distinct use cases.
Tool names follow a consistent verb_noun snake_case convention throughout (get_*, save_*, set_*, update_*, record_*, report_*, complete_*, query_*). The action prefix accurately reflects the tool's behavior (get=read, save=persist, set/update=modify, record=snapshot, report=issue, complete=finalize), making the naming both predictable and semantically meaningful.
At 60 tools, this exceeds the 50+ threshold defined as 'extreme mismatch' in the calibration. While the server covers a broad e-commerce analytics domain, many tools could be consolidated — for instance, get_daily_metrics and get_velocity already bundle multiple reports behind a single tool, yet the surface still balloons to 60, which is excessive and increases selection burden without proportional value.
The tool surface is remarkably complete for an e-commerce intelligence platform: it covers revenue, traffic, marketing, email, SEO, UX, support, reviews, subscriptions, loyalty, inventory, products, customers, orders, refunds, forecasts, targets, and write-back workflows (insights, interventions, focus plans, wakeups, store notes). It also includes lifecycle operations (create→update→complete interventions, save→update insights) and both read and write paths with no obvious dead ends.
Available Tools
60 toolscomplete_interventionAInspect
TRIGGER: Call WITHOUT asking once an applied intervention's check date has passed. Find candidates with get_interventions(dueForCheckIn: true). Attaches the latest RECORDED post-fix snapshot for each tracked metric (a snapshot whose periodStart is on/after the fix's appliedAt) as the 'post' side, computes deltas vs baseline, and flags whether each metric met its expected delta. It does NOT capture live from source — so if you haven't recorded post-fix snapshots yet (via record_metric_snapshot), record them first. If NO tracked metric has a post snapshot, a measured verdict (lift_confirmed/regressed/lift_inconclusive/partial) is REFUSED rather than closing with zero measurement — record snapshots then retry, or pass force:true to close on external evidence, or verdict:'abandoned' if you never measured. Sets the intervention's verdict and status='closed'.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Close even when no post-fix snapshot exists for any tracked metric (verdict then rests on your external evidence, with no computed delta). Default false — without it, a measured verdict is refused so you don't get a closed intervention with zero measurement attached. | |
| notes | No | Optional note about what was observed, e.g. 'US clicks recovered but DE flatlined — partial win'. | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| verdict | Yes | Your verdict. The system also computes per-metric outcomes — your verdict is the overall judgment. | |
| interventionId | Yes | The intervention to close. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so: it discloses that it does NOT capture live from source, that a measured verdict is REFUSED when no tracked metric has a post snapshot, and what force:true or verdict:'abandoned' do instead. It also states the side effect (status='closed'). This is unusually rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: trigger first, then behavior, then failure modes and remedies. The refusal/retry path repeats itself somewhat ('record snapshots then retry' appears twice conceptually), costing a little crispness, but nearly every clause carries decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description covers trigger, prerequisites, refusal behavior, overrides, and the resulting state change. An agent has everything needed to invoke it correctly or route to the prerequisite tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3 and the schema already documents force, notes, verdict and interventionId. The description still adds selection meaning by explaining when force is required and contrasting measured verdicts against 'abandoned', which helps an agent choose values rather than just read types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (complete/close) plus resource (an applied intervention) and enumerates exactly what it computes: attaches the latest recorded post-fix snapshot, computes deltas vs baseline, flags expected-delta outcomes, and sets verdict plus status='closed'. It is clearly distinguishable from the read-only get_interventions sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with an explicit TRIGGER ('call WITHOUT asking once an applied intervention's check date has passed') and routes the agent to get_interventions(dueForCheckIn: true) for candidate discovery. It also names the prerequisites (record_metric_snapshot) and the escape hatches (force:true, verdict:'abandoned'), covering when-not and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_abandoned_checkoutsAInspect
Get cart abandonment analytics. Reports: stats (trackedAbandonmentRecords, abandonedCheckouts, recoveredCheckouts, recoveryRate %, abandonedValue, lostRevenue, abandonedAgeDistribution — how long ago the still-unrecovered carts were abandoned: 0-24h, 24-48h, 2-7d, 7-30d, 30d+), top_products (most frequently abandoned products with count, quantity, and total value). IMPORTANT UNIVERSE: figures cover only Shopify's abandoned-checkout records; completed purchases never enter this dataset, so do NOT derive an abandonment rate from these counts or compare them to order totals. Shopify API limitations — the following are never available and will always be null/unknown: abandonedStep (contact/shipping/payment), landingPage, referrer, deviceType, browserFamily. These fields do not exist in Shopify's GraphQL abandonedCheckouts API.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | For top_products: number of products (default: 10) | |
| report | Yes | Report type | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| endDate | No | End date (YYYY-MM-DD). Defaults to yesterday (last fully-closed day — today is excluded by default to avoid partial-day totals; pass an explicit endDate to include today). | |
| startDate | No | Start date (YYYY-MM-DD). Defaults to a 30-day window ending yesterday. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral disclosure and does so excellently: it warns that completed purchases never enter the dataset, instructs not to derive abandonment rates or compare to order totals, and enumerates five fields that will always be null with an explanation of why. This is exactly the kind of context an agent needs to avoid misinterpretation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loads the purpose, then the report contents, then the critical universe limitation and null fields. It's a bit long due to the exhaustive metric list and null-field enumeration, but every sentence serves a purpose and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex analytics tool with no annotations and no output schema, the description covers the purpose, data contents, caveats, and explicit limitations. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters. The description adds no parameter-level detail beyond what the schema provides; the baseline of 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns cart abandonment analytics and enumerates the two report types (stats, top_products) with the specific metrics each contains. It distinguishes itself from siblings like get_top_products or get_orders by explicitly scoping to abandoned-checkout records, though it doesn't name competing tools directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the data universe (only abandoned checkouts) and lists what's never available, but does not say when to use this tool versus e.g. get_top_products or get_orders, nor does it state prerequisites. Usage is implied through the report enum but not guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_anomaliesAInspect
Anomaly detection across revenue, conversion rate, and refund rate for each of your stores (works for a single store too). Compares the most recent 7-day window against the prior 4 weeks and flags moves outside +/- 1.5 standard deviations or 25% — whichever is stricter. Returns ranked anomalies with store, metric, current vs baseline, severity, and a one-line explanation. High-severity anomalies carry EITHER drivers+driverSummary (the tag/source/country slice that drove the move) OR driversNote (attribution ran, the move is broad-based — sitewide cause, not one channel), plus an investigate block: the exact next tool call WITH the anomaly's own window. USE investigate VERBATIM — the target tool's default 30-day window will NOT show a one-week move. Use as a session opener: 'anything weird happening?'.
| Name | Required | Description | Default |
|---|---|---|---|
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| lookbackWeeks | No | How many prior weeks to use as baseline (default 4). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so well: it discloses the detection method and thresholds, the ranked output fields, the mutually exclusive drivers/driverSummary vs driversNote semantics (with the interpretation that driversNote means a sitewide, non-channel cause), and the required follow-up call pattern. This is far beyond what a bare 'detect anomalies' line would convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose before method and edge-case warnings, and the dense driver/investigate paragraph is high-value rather than filler. It is long, but nearly every clause (thresholds, driversNote semantics, verbatim-window warning) prevents a real invocation mistake.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description compensates fully: it enumerates returned fields, explains the two attribution shapes, and describes the investigate handoff including why the target's default window fails. An agent has everything needed to call it and act on results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are self-documented, so the baseline is 3. The description only alludes to the baseline window ('prior 4 weeks'), which mirrors the lookbackWeeks default, and says nothing about _offset pagination beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Anomaly detection across revenue, conversion rate, and refund rate') with explicit scope ('for each of your stores, works for a single store too'). The methodology sentence (7-day vs prior 4 weeks, +/- 1.5 SD or 25%) and return contents make it unmistakable versus siblings like get_weekly_trends or get_daily_metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly positions the tool as a session opener ('anything weird happening?') and warns that the target tool's default 30-day window will not surface a one-week move, instructing the agent to use `investigate` verbatim. It does not, however, name a competing tool to use instead when the agent wants trend confirmation rather than anomaly scanning.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_briefingAInspect
START HERE at the beginning of a session — call it FIRST and SILENTLY (don't announce the call, narrate your plan, or reference your instructions; just open with what it surfaces). One call that orients you before answering: the stores and their currencies, any data sources broken RIGHT NOW (numbers are unreliable until reconnected), open fix-work (interventions due for a verdict / in flight / recently closed), the current focus-plan headline, what each store IS (category / price tier / gift-led — so you frame things correctly), the top recent anomalies (with a driverSummary naming what drove a drop, a driversNote when the move is broad-based, and an investigate next-call to run VERBATIM — it carries the anomaly's own window), and a 'what changed' digest over the last N days (anomalies, fixes closed, fixes now due, new store notes). Lead your first response with anything in brokenConnections, whatChanged, and _tip_actions. Cheap to call and debounced internally; safe to call first on any 'how are things?' / 'what should I look at?' / session-opening question.
| Name | Required | Description | Default |
|---|---|---|---|
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| sinceDays | No | Window for the 'what changed' digest (default 7, max 90). A true 'since your last visit' view is coming; for now this is a rolling window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the burden and does well: it discloses cost ('cheap'), internal debouncing, safety ('safe to call first'), and the subtle expected output shape including a VERBATIM next-call instruction for 'investigate'. It doesn't detail pagination (left to schema) or rate limits, but the behavioral profile is otherwise rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the imperative 'START HERE... call it FIRST' then enumerates the returned content compactly, closing with when-to-use triggers. Dense but every clause earns its place for a session-opening composite tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-required-param, no-output-schema orientation tool, the description is complete: it explains what is returned, how to lead the first response (brokenConnections, whatChanged, _tip_actions), and the silent/verbatim invocation behavior. Nothing an agent needs to call it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters ('_offset', 'sinceDays') are documented in the schema, so baseline is 3. The description adds useful context by explaining sinceDays defaults to 7 / max 90 and that it feeds the 'what changed' digest, and notes the rolling-window caveat, but this overlaps what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('one call that orients you') and enumerates exactly what it surfaces: stores/currencies, brokenConnections, open fix-work, focus-plan headline, store identities, top anomalies, and a what-changed digest. It distinguishes itself from siblings like get_anomalies or get_interventions by being the composite orientation call, and even names sub-fields like 'driverSummary' and 'investigate' that no sibling would return together.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('START HERE at the beginning of a session — call it FIRST') and even specifies behavioral constraints ('SILENTLY', don't announce or narrate), plus the trigger questions ('how are things?' / 'what should I look at?'). This is a model of routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_campaign_impactAInspect
Did THAT campaign actually work? Cross-source synthesis tool that measures the real impact of a specific Klaviyo campaign by comparing the post-send window against a DAY-OF-WEEK-ALIGNED baseline (same N days one week earlier). Returns: the campaign metadata, Klaviyo's own attribution claim, the actual Shopify orders/revenue/new-customers in the post-send window, the baseline counterfactual, the lift (window - baseline), and an attributionAnalysis reconciling Klaviyo's claim against measured lift. Use this for 'did the SUMMER20 campaign work?' / 'how did the May newsletter perform?' / 'is my abandoned-cart flow actually driving revenue?'. PREFER this over manually calling get_connector_data(connector:'klaviyo') + get_store_summary and trying to compute lift yourself — the day-of-week-aligned baseline is the right counterfactual and the attribution reconciliation explains the gap between Klaviyo's claim and reality. Pass either campaignId (exact Klaviyo internal ID) or campaignName (fuzzy match; returns the most recent match plus a disambiguation block if multiple found). Default windowDays is 7 — increase for high-consideration purchases with longer journeys.
| Name | Required | Description | Default |
|---|---|---|---|
| store | No | Filter to a specific store domain. Omit to query all connected stores. | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| campaignId | No | Klaviyo internal campaign ID (exact match). Use this when you already know it; otherwise use campaignName. | |
| windowDays | No | Post-send measurement window in days (default 7). Klaviyo's attribution uses 5 days for campaigns; 7 captures the bulk of impact for most consumer goods. Increase for high-AOV considered purchases (machines, furniture) where buying journeys extend over weeks. | |
| campaignName | No | Fuzzy match on campaign name (case-insensitive substring). Returns the most recent match; surfaces a disambiguation block if multiple found. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and delivers: it enumerates the exact return contents (campaign metadata, Klaviyo attribution claim, Shopify orders/revenue/new-customers, baseline counterfactual, lift, attributionAnalysis), discloses the baseline methodology and its rationale, and explains the disambiguation behavior when campaignName matches multiple records.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and methodology, then examples, then the PREFER statement, then parameter guidance — logical ordering. It is dense and long, but most sentences earn their place; the opening rhetorical question is a minor stylistic indulgence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex no-annotation, no-output-schema synthesis tool, the description covers purpose, methodology, return shape, behavioral edge cases (disambiguation), alternative routing, and parameter tuning — everything an agent needs to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, but the description adds genuine value beyond it: it explains the campaignId vs campaignName trade-off (exact vs fuzzy, returns most recent match plus disambiguation block), and justifies the 7-day default with the contrast against Klaviyo's 5-day attribution window and the high-AOV extension case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('measures the real impact of a specific Klaviyo campaign') and explicitly names the methodology (day-of-week-aligned baseline, post-send window vs same N days one week earlier). Clearly distinguished from siblings like get_marketing_performance and get_store_summary by its cross-source synthesis framing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete example queries ('did the SUMMER20 campaign work?', 'is my abandoned-cart flow driving revenue?') and an explicit PREFER-over instruction naming the alternative workflow (get_connector_data + get_store_summary) and why not to use it. Also gives tuning guidance for windowDays.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cart_affinityAInspect
Co-purchase / market-basket analysis. Given an anchor product (productTitle), returns other products frequently bought with it, ranked by lift. Reports: basket (same-order co-purchase — best for bundles, 'frequently bought together' widgets, post-checkout upsells), lifetime (same-customer across all their orders — best for email flows and longer-horizon recommendations; also returns avgDaysToCoBuy for sequencing). Each pair has support, confidence, lift (>3 strong, 1.5–3 moderate, <1.5 weak), and a verdict. Co-occurrences below minCoOccurrences are suppressed because lift is unstable on small samples.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of co-products to return (default: 10, max: 25). | |
| report | Yes | basket = same-order co-purchase; lifetime = same-customer across orders. | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| endDate | No | End date (YYYY-MM-DD). Defaults to yesterday (last fully-closed day — today is excluded by default to avoid partial-day totals; pass an explicit endDate to include today). | |
| startDate | No | Start date (YYYY-MM-DD). Defaults to a 30-day window ending yesterday. For lifetime: bounds anchor acquisition; candidate purchases are looked up across the customer's full history. | |
| productTitle | Yes | Anchor product title (case-insensitive substring match). Required. | |
| minCoOccurrences | No | Suppress pairs with fewer than this many co-occurrences (default: 3). Raise to 5–10 for high-volume stores; lower to 2 for low-volume stores or specific anchor products. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses ranking by lift, lift interpretation bands, the per-pair metrics returned, and the suppression rule for low co-occurrence counts with the rationale (lift instability on small samples). It omits auth/permission or rate-limit context, but the behavioral disclosures are substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and then the two report modes; dense but every clause carries information an agent needs. Slightly long but no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description enumerates the returned fields (support, confidence, lift, verdict, avgDaysToCoBuy) and their interpretation, filling the gap. Combined with 100% schema coverage for inputs, it is complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by explaining how to read lift values (>3 strong, <1.5 weak) and why minCoOccurrences matters, which enriches the agent's interpretation of those parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific analysis (co-purchase/market-basket), the required input (productTitle anchor), and the output (other products ranked by lift). It clearly separates the two report modes so an agent can distinguish basket vs lifetime without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance per report mode: basket for bundles, 'frequently bought together' widgets, and post-checkout upsells; lifetime for email flows and longer-horizon recommendations. It does not name a sibling alternative or state exclusions, but the contextual routing is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_collectionsAInspect
Get product collections and their contents, including SEO metadata. Reports: list (all collections with product counts plus seoTitle/seoDescription), products (products in a specific collection with pricing, inventory, SEO, and optional sales data). seoTitle/seoDescription correspond to Shopify's global.title_tag and global.description_tag metafields. Use for 'how many products in the sandals collection?', 'what products are in collection X?', 'which collection products sell best?', or to inspect collection/product SEO tags.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of results (default: 50) | |
| report | Yes | Report type | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| endDate | No | For products: include sales data to this date (YYYY-MM-DD) | |
| startDate | No | For products: include sales data from this date (YYYY-MM-DD) | |
| collectionId | No | For products: Shopify collection ID | |
| collectionTitle | No | For products: search by collection title (partial match) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the return contents of both reports (product counts, pricing, inventory, SEO, optional sales data) and clarifies the SEO field mapping to Shopify metafields. It does not state the read-only/safety profile, auth needs, or rate behavior, leaving those gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then the report breakdown, then the SEO mapping, then usage examples. Dense but every sentence carries information; nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A 7-parameter, dual-report tool with no output schema is well covered: both report modes, SEO semantics, and usage triggers are documented. Minor gaps remain around pagination behavior (only in schema) and permissions, so not quite exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning by explaining what each report enum value returns and by clarifying that seoTitle/seoDescription map to Shopify's global.title_tag/global.description_tag. It also implies which parameters apply to the products report (sales data dates, collectionId/collectionTitle), adding cross-parameter context beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (product collections and their contents), then enumerates the two report modes so the agent knows exactly what the tool returns. It is distinguishable from catalog-oriented siblings like get_product_catalog and get_top_products because it centers on collections and their membership.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete triggering queries ('how many products in the sandals collection?', 'what products are in collection X?') and ties each to the relevant report type, which effectively tells the agent when to pick list vs products. It stops short of naming an explicit alternative sibling or a when-not-to-use case, so it is clear context rather than full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_complete_dashboardAInspect
Get a unified dashboard with key metrics from ALL connected data sources in one call. Returns a lean snapshot of revenue, traffic, marketing, email, organic search, UX, support, reviews, subscriptions, and loyalty — only for sources that are connected. Use this for 'Give me an overview' or 'How is the business doing?' then drill into specifics with individual tools. Note: in multi-store mode, the store param filters Shopify data (revenue, orders, products, customers) to that store. Non-Shopify sources (GA4, Klaviyo, Search Console, Gorgias, etc.) are account-level and always return aggregated data regardless of store param. In multi-store workspaces, get_store_comparison gives side-by-side Shopify metrics across all stores (that tool is only present for multi-store keys).
| Name | Required | Description | Default |
|---|---|---|---|
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| endDate | No | End date (YYYY-MM-DD). Defaults to yesterday (last fully-closed day — today is excluded by default to avoid partial-day totals; pass an explicit endDate to include today). | |
| startDate | No | Start date (YYYY-MM-DD). Defaults to a 30-day window ending yesterday. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does most of it: it discloses that only connected sources appear, and that in multi-store mode the store param filters only Shopify data while GA4/Klaviyo/Search Console/Gorgias stay account-level and always aggregated. It does not cover auth requirements, rate limits, or the concrete return shape beyond 'lean snapshot'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the capability, then the drill-down guidance, then the multi-store caveats. Dense and mostly waste-free, though the final multi-store/store-comparison sentences are long enough that some tightening is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no annotations, so the description must supply context, and it does: scope, trigger scenarios, cross-source aggregation behavior, and store-filtering limits. What is missing is return-shape detail (what fields a snapshot contains, pagination interaction with _offset).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so startDate/endDate/_offset semantics are already documented, making 3 the baseline. The description adds useful behavioral detail about the store param's partial filtering, but that parameter does not appear in the input schema, so the added semantics do not map cleanly onto any documented parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get a unified dashboard') and enumerates the metric domains covered (revenue, traffic, marketing, email, organic search, UX, support, reviews, subscriptions, loyalty), which clearly separates it from the many single-domain siblings like get_marketing_performance or get_product_analytics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the trigger phrases ('Give me an overview', 'How is the business doing?') and routes the agent onward ('then drill into specifics with individual tools'). It also names the alternative for a related need, get_store_comparison, and notes the condition under which that tool exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_customer_insightsAInspect
Get customer behavior and retention insights. All reports are per-store in multi-store mode — use the store param to target a specific store. Reports: new_vs_returning (revenue/orders/AOV split by first-time vs repeat buyers), repeat_metrics (repeat purchase rate, avg days between purchases, BOTH avgLifetimeValue and medianLifetimeValue, lifetimeValueSkewRatio + distribution note — LEAD WITH MEDIAN when describing 'the typical customer', use mean only when distribution is symmetric; if lifetimeValueDistributionNote is present the mean is misleading), cohorts (monthly acquisition cohorts — counts and aggregate repeat rate), retention_curve (per-cohort cumulative retention % AND LTV at month 1/3/6/12 — the canonical e-commerce LTV view; cohorts that haven't matured to a milestone show null for that milestone, not a fake-low value), by_category (repeat rate by Shopify product_type — requires product_type to be set, returns 'Uncategorized' if not), cohorts_by_first_purchase (cohorts by first product category), top_customers (ranked by LTV or order count), lapsed_high_value (high-spending customers who haven't ordered recently — per-store, ideal for targeted win-back campaigns; rows carry a Shopify-admin adminUrl (this dataset holds no names/emails by design) and customer tags, trade-frequency accounts are flagged likelyWholesale so they're excluded from consumer win-backs, and customers inactive beyond maxDaysInactive (default 365d) are treated as churned and excluded).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | For top_customers and lapsed_high_value: number of results (default: 20) | |
| months | No | For cohorts and retention_curve: number of months to look back for acquisition (default: 6 for cohorts, 12 for retention_curve) | |
| report | Yes | Report type | |
| sortBy | No | For top_customers: sort by totalSpent or orders (default: totalSpent) | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| endDate | No | End date (YYYY-MM-DD) | |
| minSpent | No | For lapsed_high_value: minimum lifetime spend in major units, e.g. 500 for £500 (default: 500) | |
| startDate | No | Start date (YYYY-MM-DD) | |
| daysInactive | No | For lapsed_high_value: days since last order to count as lapsed (default: 90) | |
| maxDaysInactive | No | For lapsed_high_value: upper bound on inactivity — customers whose last order is older than this are treated as churned, not lapsed, and excluded (default: 365). Raise to see the long tail. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and does so richly: per-store scoping in multi-store mode, null (not fake-low) for unmatured cohort milestones, churned customers excluded beyond maxDaysInactive, likelyWholesale flagging, exclusion of names/emails by design, and the warning that the mean is misleading when lifetimeValueDistributionNote is present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the report catalogue is delivered as one enormous run-on sentence that is hard to parse. The content is dense and largely earns its place, but the structure undermines quick scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter tool with no output schema, the description does a good job describing what each report returns (AOV splits, repeat rate, retention % and LTV at 1/3/6/12 months, adminUrl and tags on lapsed rows). The missing piece is the unexplained store parameter referenced in prose but absent from the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter including defaults, so the baseline is 3. The description mostly restates schema-level facts (store scoping, defaults) and notably references a 'store param' that does not appear in the input schema, which limits the added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get customer behavior and retention insights') and then enumerates all eight report values with the metric each returns, letting an agent distinguish it from get_customers, get_insights, and get_metrics_comparison without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides strong per-report usage context ('LEAD WITH MEDIAN when describing the typical customer', 'raise to see the long tail', win-back targeting exclusions). It does not explicitly say when to prefer this tool over sibling tools like get_customers, so it falls short of a full when/alternatives statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_customersAInspect
Get customer analytics by dimension. Reports: segments (one-time/returning/VIP/at-risk), top (by spend or orders — includes customerId for each customer), by_country (geographic distribution — country is derived from order shipping address, not customer records; Shopify does not expose customer country without protected data access approval), customer_history (full order history with line items for a specific customer — use customerId from the 'top' report, or rank e.g. rank=1 for top customer, or tag to find by customer tag), tag_segments (size behavioural sub-segments by Shopify tag, signup year, marketing consent, and tag-overlap crosstab — BEST FOR: 'how many non-purchasers carry tag X?', 'break the newsletter list down by signup year', building differentiated nurture tracks. Defaults to the non-purchaser cohort; pass tags for the specific tags to count + cross-tabulate, purchaserFilter to change cohort). NOTE: For 'how many customers bought product X?' use get_orders(report: 'by_product') instead — it returns unique customer counts per product. This tool does NOT support product-level filtering.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | For customer_history: find customer by tag | |
| rank | No | For customer_history: look up customer by rank in top customers list (e.g. 1 = top spender) | |
| tags | No | For tag_segments: tags to count explicitly and cross-tabulate (matched case-insensitively; always included even below minTagVolume). | |
| limit | No | Number of results (default: 10) | |
| report | Yes | Report type | |
| sortBy | No | For top: totalSpent or orders (default: totalSpent) | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| customerId | No | For customer_history: Shopify customer ID (from the 'top' report's customerId field) | |
| minTagVolume | No | For tag_segments: also surface any other (non-requested) tag with at least this many customers in scope (default 200). | |
| purchaserFilter | No | For tag_segments: which cohort to segment (default non_purchasers = ordersCount 0). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and largely succeeds: it discloses the country-derivation limitation (shipping address, not customer records, and Shopify access constraints), tag_segments defaults (non-purchaser cohort, minTagVolume 200), and the cross-report data flow needed to call customer_history. It does not mention pagination behavior or response shape, which is a minor omission for a read-only analytics tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then structured report-by-report with parenthetical detail. It is long and dense, and the tag_segments entry is notably verbose, but the length is largely justified by five distinct report modes and ten parameters. Some trimming of repeated cohort/default phrasing would tighten it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no annotations, so the description must carry behavior, and it does: report selection, defaults, limitations, alternatives, and data-flow prerequisites are all present. Residual gaps are pagination (only in schema) and result-format expectations, both modest for an analytics reader.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real value the flat schema cannot: it maps each parameter to its report (rank, tag, customerId, sortBy, tags, purchaserFilter, minTagVolume) and explains cross-report provenance (use customerId from the 'top' report; rank=1 for top customer; tags cross-tabulates). This report-to-parameter routing is beyond what the schema conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get customer analytics by dimension') and then enumerates all five report modes with their distinct outputs (segments, top, by_country, customer_history, tag_segments). It explicitly rules out a nearby capability ('This tool does NOT support product-level filtering'), so an agent can differentiate it from siblings like get_orders and get_customer_insights.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance per report, including 'BEST FOR' phrasing for tag_segments, default behaviors, and a named alternative: use get_orders(report: 'by_product') for 'how many customers bought product X?'. That is a textbook when/when-not/alternative disclosure.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_daily_metricsAInspect
Get daily/period numbers from one of three domains — pass domain to pick which, report to pick the report within it. report:"daily" exists in ALL THREE domains and means a DIFFERENT payload in each — always pass both domain and report together, never assume "daily" behaves the same across domains.
• domain:"funnel" — the daily series WITH sessions/CVR/funnel steps. Reports: daily (default — { period, data, charts, presentation }, each day has revenue, sessions, visitors, cvr, aov, orders, addToCart, reachedCheckout; DEFAULT TO RENDERING THE RELEVANT CHART), traffic_breakdown (Shopify ShopifyQL traffic dimensions for the period — bySource, byDevice, topLandingPages, topReferrers; requires Shopify Plus/Advanced and traffic sync to have run). No default window — pass startDate/endDate explicitly (falls back to a 30-day window if omitted, but don't rely on that). • domain:"revenue" — REVENUE-centric (the only domain with by_channel/by_country/pnl_summary). Reports: daily (default — time-series of revenue + orders with chart specs and event context), by_channel (net sales + order count split by sales channel — requires Shopify Plus/Advanced), by_country (net sales by billing country — requires Shopify Plus/Advanced), pnl_summary (full P&L: gross/net sales, discounts, returns, shipping, taxes, payment processing fees, orders, items — requires Shopify Plus/Advanced; fee coverage can be partial, the response states it). All money values formatted currency strings. Defaults to a 30-day window ending yesterday. • domain:"operational" — the OPERATIONAL daily view (new vs returning customers, fulfillment rate, refunds, discount usage) from a pre-computed DailyStat rollup (updated by the scheduler, not a live query). Reports: daily (each day's revenue, orders, avgOrderValue, itemsSold, newCustomers, returningCustomers, discountUsageRate, fulfillmentRate, refunds), summary (period totals, daily averages, rates). Defaults to a 30-day window ending yesterday (report:"daily") or its own real aggregated window (report:"summary").
Use "funnel" for sessions/CVR/traffic questions, "revenue" for channel/country/P&L breakdowns, "operational" for dashboard KPI tracking.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | For domain:"operational", report:"daily": number of days to return (default: 30). | |
| domain | Yes | Which daily-metrics domain to query. See the tool description for the report list and defaults per domain. | |
| report | No | Report type — valid values depend on `domain` (see tool description). Defaults to "daily" in every domain if omitted, but "daily" means a different payload per domain. | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| endDate | No | End date (YYYY-MM-DD). Defaults to yesterday (last fully-closed day) when omitted. | |
| startDate | No | Start date (YYYY-MM-DD). Default window (if omitted) varies by domain — see tool description; domain:"funnel" has no real default, always pass this explicitly. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses that the operational domain reads a pre-computed DailyStat rollup ('updated by the scheduler, not a live query'), that P&L fee coverage can be partial and the response states it, and that money values are formatted currency strings. It stops short of describing auth requirements or rate limits, so it is strong rather than exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded: the cross-domain warning about 'daily' comes before the per-domain bullets, so an agent gets the critical constraint first. The three bullets are logically structured, but the repeated 'requires Shopify Plus/Advanced' and default-window restatements across bullets add avoidable redundancy for a description this long.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description compensates by enumerating the returned fields per report (revenue, sessions, cvr, aov, newCustomers, fulfillmentRate, etc.) and output shape ({ period, data, charts, presentation }). For a 6-parameter, three-domain dispatcher, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description supplies meaning the schema explicitly defers to it: the valid `report` values per domain (the schema's `report` field has no enum and says 'see tool description'), which report is the default in each domain, and the fact that funnel has no real default window. That is real added semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (get daily/period numbers) and immediately qualifies it with the three-domain dispatch model, going as far as warning that the same `report:"daily"` value yields a DIFFERENT payload per domain. This is precisely the kind of disambiguation an agent needs to separate it from siblings like get_store_summary or get_weekly_trends.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules ('Use "funnel" for sessions/CVR/traffic questions, "revenue" for channel/country/P&L breakdowns, "operational" for dashboard KPI tracking'), plus per-report prerequisites (Shopify Plus/Advanced, traffic sync) and default-window behavior per domain. It also warns when not to assume — never assume 'daily' behaves the same across domains.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_sourcesAInspect
CALL THIS FIRST to see which data sources are connected and have data. Returns connection status and record counts for: Shopify (always connected), Triple Whale, Klaviyo, Gorgias, Recharge, Google Search Console, Google Analytics, Microsoft Clarity, and YouTube. Use this to understand what data is available before making other queries. If a source shows 'not_connected', those tools will return empty results.
| Name | Required | Description | Default |
|---|---|---|---|
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full behavioral burden and does so well: it discloses what is returned (connection status and record counts), that Shopify is always connected, and that non-connected sources yield empty results. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the imperative 'CALL THIS FIRST', then details what is returned, then gives the usage rationale. Every sentence earns its place with no redundancy, and the structure flows logically.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's role as a discovery/capabilities endpoint, the description is complete: it lists all expected sources, explains the meaning of 'not_connected', and states the impact on subsequent queries. No output schema exists, but the description sufficiently conveys return content.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (_offset) with 100% schema description coverage that fully explains pagination behavior, including the trigger condition (_pagination.hasMore). The description appropriately omits parameter details since the schema is self-sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource (get data sources) and enumerates the exact sources returned (Shopify, Triple Whale, Klaviyo, etc.). Distinguishes itself from all 50+ siblings by being the only sources/capabilities-listing tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states 'CALL THIS FIRST' and 'Use this to understand what data is available before making other queries', providing a clear when-to-use directive. It also gives the consequence of ignoring it: tools for non-connected sources return empty results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_discountsAInspect
Get discount code analytics. Reports: summary (usage rate, AOV impact), top_codes (best performing codes by revenue/usage), code_details (specific code performance — requires 'code' param), by_product (which discount codes were applied to which products — optionally filter by 'code').
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | For code_details: required. For by_product: optional filter by specific discount code. | |
| limit | No | For top_codes/by_product: number of results (default: 10/20) | |
| report | Yes | Report type | |
| sortBy | No | For top_codes: sort field | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| endDate | No | End date (YYYY-MM-DD) | |
| startDate | No | Start date (YYYY-MM-DD) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it discloses little: no statement of read-only vs mutating, no auth/permission requirements, no rate limits or cost notes. Pagination behavior exists only in the schema's _offset field, not in the description. The report-content summaries describe outputs rather than behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tightly-packed paragraph with the core purpose front-loaded and the four report modes as a scannable list. No filler sentences, though the dense em-dash nesting trades some readability for compactness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 7 parameters, no output schema, and no annotations, the description sensibly fills the output gap by summarizing what each report returns. It stops short of stating whether startDate/endDate apply to all four reports or only some, which is the main residual ambiguity for a multi-mode analytics tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (code, limit, report, sortBy, startDate, endDate, _offset) is already documented in structured form, making 3 the baseline. The description adds marginal routing value by tying 'code' and 'limit' to specific report types, but nothing the schema does not already convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get discount code analytics') and then enumerates the four report modes, so an agent knows exactly what surface the tool covers. This enumeration also distinguishes it from adjacent analytics siblings like get_campaign_impact or get_marketing_performance, which do not expose per-code breakdowns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives useful intra-tool routing ('code_details requires code param', 'by_product optionally filter by code'), which tells the agent how to drive each report. However, with ~55 siblings including several overlapping analytics tools, there is no explicit when-to-use-this-vs-alternative guidance or exclusion criteria, so cross-tool selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_focusAInspect
Return the merchant's current weekly plan — the committed 'what to work on now' list. Use as a session opener. The plan stays current until the merchant re-plans (say 'plan my week' / refresh: true) — it does NOT auto-expire, so re-asks return the same plan with each item's LIVE state (a 'tackle' item shows done once its finding is addressed; a 'check' item once its intervention closes). If no plan exists or refresh is requested, returns a synthesis bundle — open findings, interventions due for check-in, the outcomes summary, metric trends, AND the previous plan's unfinished items to carry forward — plus an _instruction to call save_focus blending tackle/check/watch items.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Target number of focus items (default 5, max 10). Affects the instruction sent to the model when refresh is needed. | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| refresh | No | Re-plan from current data ('plan my week'). Supersedes the current plan and returns a fresh synthesis bundle. Default: false (returns the current plan). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so richly: the plan does NOT auto-expire, re-asks return the same plan with LIVE item state, and it explains what 'done' means per item type ('tackle' vs 'check'). It also discloses the fallback synthesis bundle contents and the embedded _instruction directing a save_focus call — far beyond a name restatement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and session-opener guidance are front-loaded, and each sentence adds substance about lifecycle or fallback. It is dense and somewhat sprawling with nested parentheticals, which slightly hurts scannability, but there is little wasted content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must explain returns — and it does: the current plan with LIVE item states, or a synthesis bundle enumerating open findings, due interventions, outcomes summary, trends, and carried-forward items. Combined with the lifecycle and refresh semantics, an agent has everything needed to call and interpret this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents top, _offset, and refresh. The description reinforces refresh with the 'plan my week' idiom and packetizes its effect, adding marginal meaning. Baseline 3 is appropriate since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — returning the merchant's current weekly plan, framed as the committed 'what to work on now' list. It clearly differentiates itself from the write-side siblings (save_focus, update_focus_item) by describing both the read of the existing plan and the synthesis fallback. An agent can identify this as the read-oriented session opener without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames usage ('Use as a session opener') and gives the trigger for the alternative path ('refresh: true' / 'plan my week'). It implies when the fallback synthesis fires (no plan exists or refresh requested). No explicit when-not guidance, but the conditions are clear enough to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_forecastAInspect
Forecast a metric — answers 'what should I expect?' / 'are we on track this month?' / 'project next month'. Returns a per-store stores array (each in its OWN currency — never summed across currencies). Each store has: currentMonth (month-to-date actual + projected month-end with low/high band, built from the live daily run-rate), horizon (future full months with expected/low/high), method, confidence, explicit assumptions, historyMonths, and a ready-to-render charts[0] line spec (seriesField='series' splits actual vs forecast). HONESTY: every forecast carries a method (month_to_date_pace / linear_trend / naive_last_month / yoy_seasonal), a confidence level, and an interval — LEAD with the range and the confidence, never present the point estimate as a promise. Current-month projection works immediately from orders; forward months need calendar-month snapshot history and degrade gracefully (low confidence / declines to project when too thin). v1 metrics: revenue, orders.
| Name | Required | Description | Default |
|---|---|---|---|
| store | No | Sub-store key (e.g. 'acme-store-us'). Omit to forecast every store in the workspace (each in its own currency). | |
| metric | No | Metric to forecast. Defaults to 'revenue'. | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| horizon | No | Number of future FULL months to project after the current one (1-3). Defaults to 1. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so richly: it names the four methods, mandates leading with range and confidence over the point estimate, describes graceful degradation to low confidence when history is thin, and warns that per-store values are never summed across currencies. This is substantial behavioral disclosure beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and driver questions, then organized into return-shape and honesty sections. Effective structure, though it is dense and long; a few clauses (e.g. the full output field enumeration) could be trimmed given the schema already exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a forecast tool with no output schema, it describes the return shape well (stores array, currentMonth, horizon, method, confidence, assumptions, charts) and sets expectations about honesty and degradation. Minor gaps remain on exact band semantics and pagination behavior, but the core is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented in the schema. The description reinforces defaults (metric defaults to revenue, horizon defaults to 1) and reinforces the per-currency store behavior, but adds little syntax or format beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the verb (forecast) and resource (a metric) and immediately frames the questions it answers ('what should I expect?', 'are we on track this month?', 'project next month'). This distinguishes it from descriptive siblings like get_daily_metrics and get_yoy_monthly, which report history rather than project forward.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when to reach for it via the quoted user questions and notes that current-month projection works immediately while forward months need snapshot history. It does not explicitly name which sibling to use for historical data instead, so it stops short of explicit alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_helpAInspect
Fetch the full guidance behind the server instructions, on demand. The eager instructions summarise each area in one or two lines and point here for detail — call this only when you actually need the depth (you usually won't). Topics: routing (the canonical source-of-truth map — which tool owns each metric), signals (how to read _freshness / _confidence / _anomalies / _benchmark / _dataDepth / _recentDayCaveat / _alerts / _storeNotes), conventions (money / dates / timezone / abbreviations), claims (handling numbers the user quotes), analysis (median-vs-mean, hypotheses-not-causation, partial-day, pushback discipline), multistore (per-store vs account-level data, and the propertyId/customerId/siteUrl requirement), writeback (interventions / insights / snapshots / wakeups), triple_whale (Total Impact). You can ALSO pass a METRIC NAME (ltv, order_counts, aov, cvr, cac, repeat_rate, roas, mer, nps, csat, refund_rate — synonyms accepted) for its definition + canonical tool + gotcha, or a TOOL NAME (e.g. "get_analytics", "query_orders") for that tool's worked examples. Omit topic to list the topics, metrics, and tools that have examples.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | A guide topic (routing, signals, conventions, claims, analysis, multistore, writeback, triple_whale), a metric name (ltv, order_counts, aov, cvr, cac, repeat_rate, roas, mer, nps, csat, refund_rate), OR a tool name for its worked examples. Omit to list what's available. | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does well: it reveals this is a lazy-loaded detail source, that the eager instructions already summarise each area, and what happens with no argument. It stops short of describing the response format/pagination behavior that _offset implies, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, with the topic catalogue following as supporting detail. The topic enumeration is long but each item is load-bearing for a help tool; only the sheer density keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and a simple two-parameter surface, the description fully explains what the agent gets for each input class and how to discover available content. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so baseline is 3, but the description goes beyond the schema by listing accepted synonyms, the full metric/tool roster, and the omit-topic listing behavior. It adds real semantic value on top of an already-documented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Fetch the full guidance') plus resource ('behind the server instructions'), scoped as on-demand. It draws a clear boundary against every get_* data sibling by positioning itself as the meta/documentation tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call it ('only when you actually need the depth (you usually won't)') and enumerates exactly which inputs map to which content (topics, metric names, tool names). It also discloses the fallback behavior (omit topic to list what's available), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_insightsAInspect
Get the business improvement checklist (the FINDINGS to act on). If insights exist, returns the current checklist with status. If no insights exist (or refresh is requested), returns a data bundle with all key metrics from connected sources — use this data to generate actionable business recommendations (typically 3–8, as many as the data supports), then call save_insights to store them. You can also call save_insights with a single insight at any time during conversation. Use report: 'thread' (with threadId or insightId) to retrieve a linked sequence of related findings as one story. NOTE: 'did the fix work' / win-rate / outcomes are NOT here — insights are observations. Once a fix ships, set_intervention flips the finding to 'addressed' and the outcome lives on the intervention; call get_interventions(report: 'outcomes') for that. Filter by category, tags, or threadId to narrow the list. Each returned item includes threadId, parentInsightId, and a threadCount so you can spot follow-up chains without an extra call.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Filter to insights that contain ANY of these tags (OR semantics). E.g. ['seo'] or ['paid']. | |
| report | No | Default: 'checklist'. 'thread' retrieves a linked sequence of related findings as one story — requires threadId or insightId. (For fix outcomes / win-rate, use get_interventions(report: 'outcomes').) | |
| status | No | Filter by status. Pass a single value (e.g. 'open') or an array (e.g. ['open','addressed']) for OR semantics. Allowed values: open, addressed, superseded, dismissed. | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| refresh | No | Set to true to generate fresh insights even if existing ones are present. Default: false — returns existing checklist. | |
| category | No | Filter to a single category. | |
| threadId | No | Filter to a single thread (works on checklist and thread reports). Used to view a story end-to-end without category/tag filtering. | |
| insightId | No | For report: 'thread' — resolve the threadId from this insight and return the full thread (alternative to passing threadId directly). | |
| includeCompleted | No | Default true. Set to false to return only active (open) insights. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and discharges it: it discloses the conditional dual-mode return (existing checklist vs. a metrics data bundle that mandates downstream generation), the follow-up chain metadata (threadId, parentInsightId, threadCount), and the refresh semantics. It also proactively rules out outcome/win-rate data, preventing a likely misuse.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then layered with usage, exclusions, and return metadata. It is longer than most definitions, but nearly every sentence carries actionable routing or return-shape information, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter, no-annotation, no-output-schema tool, this cooperates well with the siblings, explains what gets returned in both branches, and pins down the follow-up chain fields an agent needs to traverse threads without an extra call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all nine parameters, including the report enum, threadId/insightId relationship, and refresh. The description only restates the high-level usage of report/threadId and filtering, adding little beyond what the schema fields already convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('the business improvement checklist (the FINDINGS to act on)') and immediately distinguishes it from other insight-adjacent tools by defining insights as observations, not outcomes. An agent can read this and know exactly what get_insights returns versus get_interventions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use save_insights after generating recommendations, use set_intervention to flip a finding to 'addressed' once a fix ships, and use get_interventions(report: 'outcomes') for win-rate/outcome questions. It also states the refresh trigger and when to use report: 'thread'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_interventionsAInspect
List interventions (the actions/fixes that were shipped) and report their measured outcomes. This is the SINGLE source of truth for 'did it work' — insights (findings) never carry a verdict. Use report: 'status' for a one-call picture of 'what fix-work is open' (due for check-in / in flight / recently closed + win rate — best for 'where did we get to?' / session start); report: 'list' (default) for the full rows; report: 'outcomes' for 'fixes that worked vs didn't' (buckets closed interventions by verdict + win rate). Filter by insightId to answer 'how did the fix(es) for this finding turn out?'. Each intervention includes baseline + post snapshots and computed deltas (when closed).
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by category (technical_seo, paid_optimization, etc.). | |
| limit | No | Max results (default 30). | |
| since | No | Only interventions appliedAt >= this date (YYYY-MM-DD). | |
| store | No | Filter by store key. | |
| report | No | Default 'list'. 'status' = consolidated open-work view (dueForCheckIn + inFlight + recentlyClosed + winRate) in one call, ideal for orienting at the start of a session. 'outcomes' buckets closed interventions by verdict (lift_confirmed vs regressed vs lift_inconclusive vs partial), reports a win rate, and lists those still under review. | |
| status | No | Filter by lifecycle status. | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| verdict | No | Filter by closing verdict (only for closed interventions). | |
| insightId | No | Only interventions that link back to this insight (via linkedInsightIds) — i.e. the fixes prompted by a specific finding. | |
| dueForCheckIn | No | If true, only return interventions whose next checkDate has passed and status is still 'applied'/'under_review'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does a lot: it discloses what each report returns (open-work composition, verdict buckets, win rate, interventions under review) and that rows carry baseline + post snapshots with computed deltas when closed. It stops short of stating read-only safety, permissions, or rate limits, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is dense but front-loaded with the core statement and the single-source-of-truth claim, then organized by report mode. A couple of parenthetical asides are heavy, but nearly every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a 10-parameter, no-required, no-output-schema tool with no annotations, the description supplies enough to call it correctly (mode selection, insightId linkage, returned content). It does not spell out the full row shape or pagination, but those are minor given the parameter-level guidance already provided.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description genuinely adds meaning beyond the schema: it interprets the report enum in plain language and gives the intent of insightId ('fixes prompted by a specific finding'). The remaining filters are left to the schema, which already documents them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('List interventions... and report their measured outcomes') and explicitly positions itself against the sibling insights tools ('This is the SINGLE source of truth for did it work — insights never carry a verdict'). An agent can distinguish it from get_insights/save_insights without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance per mode: report:'status' for 'where did we get to?' / session start, 'list' for full rows, 'outcomes' for worked vs didn't, and insightId to answer 'how did the fix(es) for this finding turn out?'. Scenarios are mapped to parameters concretely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_inventoryAInspect
Get inventory analytics. Reports: summary (activeProducts count, totalVariants, outOfStock variant count, lowStock variant count with >0 and ≤10 units, totalUnits, active locations count), low_stock (products needing reorder — threshold defaults to 10 units), out_of_stock (zero-inventory variants), by_location (per-warehouse breakdown with location name, total SKUs tracked, units on hand).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of products (default: 20) | |
| report | Yes | Report type | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| threshold | No | For low_stock: stock level threshold (default: 10) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses the output content of each report and the threshold default, which is genuine value, but it never confirms read-only/no-side-effect behavior, permissions, or pagination semantics beyond what the schema already implies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first clause, then the report details follow in a structured enumeration. It is dense but every clause maps to an actual report or parameter, with little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no annotations and no output schema, the description does substantial work by describing what each report returns. An agent has enough to call it correctly; only cross-tool routing guidance is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3), and the description adds real meaning: it explains what each enum value means and defines low_stock's threshold. It enriches the terse 'Report type' schema entry rather than merely restating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Get inventory analytics') and then enumerates all four report types with the exact metrics each returns. An agent can tell precisely what this tool does and how it differs from adjacent analytics tools like get_product_analytics or get_velocity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies usage by defining each report (summary, low_stock, out_of_stock, by_location) so the agent can pick the right report param, but it never states when to choose this tool over siblings or any prerequisites/exclusions. Usage is implied rather than guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_marketing_performanceAInspect
Get marketing performance dashboard — INCLUDING the canonical checkout funnel. ALSO USE THIS for 'checkout funnel' / 'where do customers drop off' / 'how is my funnel performing' questions; do NOT manually stitch a funnel from get_analytics + get_store_summary. Returns: funnel (sessions, addToCartRate, checkoutRate, purchaseRate, cvr — sessions sourced from Shopify TrafficStat when available, GA4 fallback otherwise, pixel as last resort), _pixelFunnel (Triple Whale pixel-tracked equivalents with step-by-step ratios for drop-off SHAPE analysis), channels (revenue/sessions/cvr per channel like Google, Facebook, Email, Direct), ROAS and MER from Triple Whale, and dailyTrends per channel. IMPORTANT SOURCE HIERARCHY for funnel.cvr: (1) Shopify TrafficStat sessions + Shopify orders (Plus/Advanced — canonical), (2) GA4 sessions + Shopify orders (fallback when TrafficStat empty — slightly inflated due to GA4 pixel undercount), (3) Triple Whale pixel as last resort with explicit _warning. Inspect funnel.source and funnel._sourceNote before quoting CVR. _pixelFunnel is for FUNNEL SHAPE analysis only — compare addToCartRate vs checkoutRate vs purchaseRate to find drop-off points. Pixel absolute counts undercount real activity; never report _pixelFunnel.cvr as the store's conversion rate. Channels uses Triple Whale attribution when connected. Use for marketing ROI, channel comparison, and funnel-shape diagnosis — but for the actual CVR figure use get_metrics_comparison.
Notes
For the canonical conversion rate use get_metrics_comparison (TrafficStat/GA4 sessions ÷ real Shopify orders). The
_pixelFunnelblock here is for drop-off SHAPE only — pixel undercounts, so never quote_pixelFunnel.cvras the store's CVR.
| Name | Required | Description | Default |
|---|---|---|---|
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| endDate | No | End date (YYYY-MM-DD). Defaults to yesterday (last fully-closed day — today is excluded by default to avoid partial-day totals; pass an explicit endDate to include today). | |
| startDate | No | Start date (YYYY-MM-DD). Defaults to a 30-day window ending yesterday. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses the three-tier source hierarchy, which tier is canonical vs. slightly inflated vs. last resort, that a `_warning` is emitted on the pixel fallback, that channels use Triple Whale attribution when connected, and that pixel counts undercount. It also flags the important trap of not quoting `_pixelFunnel.cvr` as the store CVR.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and dense but nearly every sentence carries routing or source-hierarchy information. The one cost is redundancy: the 'canonical CVR comes from get_metrics_comparison / never quote _pixelFunnel.cvr' rule is stated at least three times (body, 'Use for' clause, Notes), which dilutes the signal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no annotations, so the description must explain the return shape itself, and it does: it enumerates the `funnel`, `_pixelFunnel`, `channels`, ROAS/MER, and `dailyTrends` blocks with their sub-fields. Nothing an agent needs to interpret or safely quote results is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the three date/pagination params are fully documented in the schema. The description adds no parameter-level syntax, formats, or default semantics beyond what the schema already states. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Get marketing performance dashboard') and immediately scopes it with 'INCLUDING the canonical checkout funnel.' It explicitly distinguishes itself from siblings by naming get_analytics, get_store_summary, and get_metrics_comparison, so an agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger phrases ('checkout funnel', 'where do customers drop off') and an explicit prohibition against manual stitching, plus a routing rule for the CVR figure ('for the actual CVR figure use get_metrics_comparison'). This is when-to-use, when-not-to-use, and named alternatives in one pass.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_marketsAInspect
Get Shopify Markets data — geographic market definitions and per-market revenue performance. Reports: markets (list of configured markets with their assigned countries and currencies), performance (revenue, orders, AOV, and revenue share broken down by market for a date range). Use this to understand which geographic markets are configured and how revenue is distributed across them. Note: market data requires the market sync to have run at least once; orders are attributed to markets using Shopify's market field (Plus merchants) or a country-code fallback (all merchants).
| Name | Required | Description | Default |
|---|---|---|---|
| report | Yes | Report type: markets (configured markets and countries) or performance (revenue by market) | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| endDate | No | End date (YYYY-MM-DD). Defaults to yesterday (last fully-closed day — today is excluded by default to avoid partial-day totals; pass an explicit endDate to include today). | |
| startDate | No | Start date (YYYY-MM-DD). Defaults to a 30-day window ending yesterday. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses a prerequisite (market sync must have run at least once) and the order-attribution logic (Shopify market field for Plus, country-code fallback otherwise), which are non-obvious caveats. It leaves out rate limits or output-shape details, but the disclosed caveats are valuable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and report contents are front-loaded before the usage and caveat notes, with a logical flow. It is a single dense paragraph; the caveat sentence is longer than strictly needed but still earms its place by flagging a real prerequisite.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description adequately covers what each report returns plus the sync prerequisite. Pagination is handled by the schema's _offset description, so nothing critical is missing for correct invocation, though attribution caveats could be elaborated slightly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description enriches the 'report' enum beyond the schema by specifying that performance includes revenue, orders, AOV, and revenue share, not just 'revenue by market'. It confirms date-range semantics that the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get Shopify Markets data') and enumerates exactly the two reports it returns: market definitions (countries/currencies) and per-market revenue performance. An agent can immediately tell this is the geographic-market tool, distinct from the marketing/campaign-oriented siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: 'Use this to understand which geographic markets are configured and how revenue is distributed across them.' This tells the agent when the tool applies, though it names no alternatives or when-not conditions relative to the many sibling reporting tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_metrics_comparisonAInspect
BEST FOR COMPARISONS AND THE CANONICAL CONVERSION RATE: Get core e-commerce metrics (Revenue, Sessions, CVR, AOV, Revenue per Session) with period-over-period comparisons. CVR here uses Shopify TrafficStat sessions (Plus/Advanced) — or GA4 sessions as fallback — divided by REAL Shopify orders. This is the right source for 'what's my conversion rate?' / 'how's my CVR trending?' questions. Do NOT use Triple Whale pixel CVR (from get_connector_data(connector:'triple-whale') or get_marketing_performance._pixelFunnel) as a stand-in: pixel undercounts purchases and sessions and produces misleading absolute numbers. Supports WoW (week-over-week), MoM (month-over-month), YoY (year-over-year), and custom period comparisons. Returns { period, metrics, comparison, charts, presentation }. charts is an array of grouped-bar specs (one per headline metric, current vs comparison) ready to drop into any plotting library. DEFAULT TO RENDERING THE RELEVANT CHART when the user is comparing periods or asks 'how is X vs Y' — bar charts are the natural fit. Use comparison.changes for the % delta caption. Use raw numbers from metrics only when the user asks for a single specific value.
Notes
This is the canonical CVR source. Do not substitute Triple Whale pixel CVR (get_connector_data(connector:'triple-whale') /
_pixelFunnel).
| Name | Required | Description | Default |
|---|---|---|---|
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| endDate | Yes | End date of current period (YYYY-MM-DD) | |
| startDate | Yes | Start date of current period (YYYY-MM-DD) | |
| comparison | No | Comparison type: wow (week-over-week), mom (month-over-month), yoy (year-over-year), previous (equivalent previous period) | |
| compareLabel | No | Label for custom comparison period (e.g., 'Last Year Black Friday Sale') | |
| compareEndDate | No | For custom comparison: end date of comparison period (YYYY-MM-DD) | |
| compareStartDate | No | For custom comparison: start date of comparison period (YYYY-MM-DD) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it names the underlying data source, warns that pixel CVR undercounts, and describes the return shape including charts and presentation. It does not state read-only/no-side-effects behavior or rate limits, but for a metrics-reading tool this is a minor omission rather than a serious gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loaded around its primary purpose and usage caveats, and every major section adds decision-relevant information. The Notes section repeats the Triple Whale warning already stated in the body, which is mild redundancy but not enough to undermine an otherwise well-structured description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates thoroughly by describing the return object keys, the charts array format, and how to use comparison.changes. It also covers the canonical metric definitions and period comparison modes, leaving little ambiguity for an agent to call and use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all seven parameters, including dates, comparison enum, and custom comparison labels. The description reinforces comparison types (WoW, MoM, YoY, custom) but mostly restates what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Get core e-commerce metrics') and identifies the canonical CVR source, which clearly distinguishes it from sibling tools like get_marketing_performance and get_connector_data. It also names the metrics returned, so an agent can tell at a glance what the tool produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use this tool ('BEST FOR COMPARISONS AND THE CANONICAL CONVERSION RATE') and when not to use an alternative ('Do NOT use Triple Whale pixel CVR... as a stand-in'). It also names the specific alternative tools and explains why they would be misleading, which is unusually strong routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_metrics_multi_compareAInspect
Get metrics with MULTIPLE comparisons at once. Perfect for questions like 'Show me revenue WoW and YoY' or 'Compare this week to last week and same week last year'. Returns { period, metrics, comparisons, charts, presentation }. charts is an array of grouped-bar specs (one per headline metric) with 3+ bars each (current + each comparison period). DEFAULT TO RENDERING THE RELEVANT CHART for multi-period questions — bars side-by-side communicate the deltas instantly. Pull each comparison's % change from its changes object for captions.
| Name | Required | Description | Default |
|---|---|---|---|
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| endDate | Yes | End date of current period (YYYY-MM-DD) | |
| startDate | Yes | Start date of current period (YYYY-MM-DD) | |
| comparisons | No | List of comparison types to include (default: ['wow', 'yoy']) | |
| customComparisons | No | Custom comparison periods (e.g., last year's sale period) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses the return object keys, chart array shape (grouped-bar specs, 3+ bars), and default rendering behavior, plus where % change captions live. It does not cover permissions, rate limits, or pagination behavior beyond the schema's _offset field, but adds substantial operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, and the sentences on return shape and chart defaults earn their place because there is no output schema. It is somewhat dense but not repetitive, and every section adds usable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter metrics tool with no output schema or annotations, the description supplies the missing return-shape and chart-rendering guidance. It does not discuss pagination or failure modes, but the core context needed to call and render the tool is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all five parameters are already documented in the schema. The description mentions comparisons conceptually and references the `changes` object, but adds no syntax, defaults, or format details beyond what the schema provides. Baseline 3 applies when the schema carries parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get metrics') and scopes it to multiple simultaneous comparisons, with examples that clarify the domain. The 'MULTIPLE' emphasis helps an agent distinguish it from the sibling get_metrics_comparison.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete example questions that select this tool over a generic metrics call, and its 'MULTIPLE comparisons at once' framing distinguishes it from get_metrics_comparison. It does not state when not to use it or explicitly route to the sibling, so guidance is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_orderBInspect
Look up a specific order with full line item details (product, variant, SKU, quantity, price, vendor). Use orderName for user-facing IDs like '#1001', or orderId for Shopify numeric IDs. Also supports orderIds (array) to look up multiple orders at once — useful for cross-referencing with Triple Whale attribution data.
| Name | Required | Description | Default |
|---|---|---|---|
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| orderId | No | Shopify numeric order ID e.g. '5559266041988' | |
| orderIds | No | Array of Shopify numeric order IDs for batch lookup (max 50) | |
| orderName | No | Order name e.g. '#1001' or '1001' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. It does not disclose whether the operation is read-only (implied by 'look up'), what happens if multiple identifiers are provided simultaneously, pagination behavior despite having an _offset parameter, or any rate limits. The description provides only superficial behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences that are front-loaded with the core purpose and then detail the identifier options. There is no fluff, though the mention of Triple Whale attribution data could be seen as tangentially relevant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description is adequate for a read-only lookup tool but incomplete. It omits crucial details like whether the tool mutates data, how pagination works (despite _offset), and what happens if no identifier is provided. For a tool with 4 parameters and no structured safety guidance, more context is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents each parameter. The description adds some meaning by explaining that orderName is for user-facing IDs and orderId for Shopify numeric IDs, and that orderIds supports batch lookup, but this is largely redundant with the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb (look up) and resource (a specific order), and details the fields returned (line items with product, variant, SKU, quantity, price, vendor). It does not explicitly distinguish itself from the sibling get_orders tool, which likely lists all orders, leaving a gap in sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use each identifier (orderName vs orderId vs orderIds) and mentions a use case for batch lookup (cross-referencing with Triple Whale data). However, it does not state when to use get_order versus get_orders, nor does it provide exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ordersAInspect
Get order analytics by dimension. Reports: by_status (order counts/revenue by financial status), by_country (geographic sales breakdown — supports compare for WoW/MoM/YoY trend, returns top rising/falling countries), by_product (BEST FOR: 'how many customers bought product X?', 'which products have the most unique buyers?', product-level customer counts. Returns uniqueCustomers, orderCount, unitsSold, and revenue per product. Use this whenever the question involves customers AND products together), by_tag (order volume per Shopify order tag with SUDDEN-DROP DETECTION — compares the last 7 days vs the prior weeks and flags tags whose order count fell significantly. BEST FOR: 'did orders with tag X drop?', 'has any marketplace/dropship channel stopped?'. Pass tag to focus one tag, or omit to scan all tags; returns a drops list plus per-tag current/baseline/change).
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | For by_tag: focus a single order tag (case-insensitive). Omit to scan every tag and surface the ones dropping. | |
| limit | No | For by_country: number of countries (default: 10). For by_tag: max tags returned (default: 20). | |
| report | Yes | Report type | |
| sortBy | No | For by_product: sort field (default: revenue) | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| compare | No | For by_country: attach a `comparison` block with rising/falling countries vs the WoW/MoM/YoY/previous-period window. | |
| endDate | No | End date (YYYY-MM-DD) | |
| lagDays | No | For by_tag: end the windows this many days back so the current week is complete days (default 1). Raise it if a marketplace app applies its order tag with a delay. | |
| startDate | No | Start date (YYYY-MM-DD) | |
| lookbackWeeks | No | For by_tag: number of prior weekly windows to use as the baseline (default 4, range 2-12). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. It does disclose valuable behavior for by_tag (sudden-drop detection, weekly comparison windows, drop output) and by_country comparison blocks, which is strong. But it says nothing about auth, rate limits, data freshness, or behavior for by_status/by_product beyond field names.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense but reads as one long run-on sentence with nested parentheticals, mixing purpose, per-mode guidance, and example questions. It is front-loaded with the core purpose, which helps, but the density and length hurt scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, four-mode analytics tool with no output schema and no annotations, the description covers the modes well but omits return-shape expectations (beyond field names), pagination behavior despite _offset, date-range defaults, and safety/auth context. It is adequate but leaves meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 10 parameters including tag, limit, compare, lagDays, and lookbackWeeks. The description reinforces a few mode-specific uses (tag focus, compare attach) but adds little syntax or constraint detail beyond the schema. Baseline 3 applies when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns order analytics broken down by a chosen dimension and enumerates each report mode with specific metrics. It distinguishes its report scope from siblings conceptually, though it does not name a specific sibling tool to contrast with like query_orders vs get_order.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit 'BEST FOR' guidance for by_product and by_tag, including example natural-language questions and when to prefer each mode. It does not, however, state when to use this tool over sibling tools such as query_orders or get_top_products.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_product_analyticsAInspect
Get Shopify product sales analytics — units sold and revenue per product from ShopifyQL. Requires Shopify Plus or Advanced. NOTE: Views, add-to-cart, and purchase funnel counts are no longer available from ShopifyQL (Shopify removed these fields) — use get_marketing_performance for funnel analysis or get_analytics(ecommerce) for GA4-based product funnel data. Reports: summary (total units/revenue), top_products (ranked by revenue or units sold), product_detail (daily units/revenue for a specific product).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of results (default: 20) | |
| report | Yes | Report type | |
| sortBy | No | For top_products: sort field (default: revenue) | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| endDate | No | End date (YYYY-MM-DD). Defaults to yesterday (last fully-closed day — today is excluded by default to avoid partial-day totals; pass an explicit endDate to include today). | |
| productId | No | For product_detail: Shopify product ID | |
| startDate | No | Start date (YYYY-MM-DD). Defaults to a 30-day window ending yesterday. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does real work: it discloses a plan-tier requirement and a consequential upstream schema change that removes funnel fields, which an agent cannot infer from the schema. It leaves a few minor traits unstated (error behavior on non-Plus stores, result-size/rate behavior), but the critical operational caveats are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core capability, then the prerequisite, then the deprecation note and alternatives, then the report catalog. Dense and every sentence carries information, though the mid-description NOTE and the trailing report list make it a long single block rather than crisply segmented.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description partially compensates by enumerating the three report types and what each returns, plus the alternatives for funnel data. Date defaults and pagination are already covered in the schema. What remains thin is the actual shape of returned records and how report selection interacts with productId/sortBy.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: it defines what each report enum value returns (summary = total units/revenue, top_products = ranked, product_detail = daily figures for one product). It also loosely describes sortBy sorting ('by revenue or units sold'), though the schema enum uses 'purchases' rather than 'units sold', a minor wording drift.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get Shopify product sales analytics — units sold and revenue per product') and even names the underlying source (ShopifyQL). It distinguishes itself from siblings by name, routing funnel questions to get_marketing_performance and get_analytics(ecommerce), so an agent can differentiate it from get_top_products and get_product_health without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the prerequisite (requires Shopify Plus or Advanced), states what this tool can no longer answer (views, add-to-cart, purchase funnel counts), and names the two alternative tools plus the condition that selects them. This is the when-to-use / when-not-to-use / alternatives pattern in full.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_product_catalogAInspect
Get product catalog with inventory levels, pricing, cost, margins, status, and SEO metadata. Returns: title, vendor, productType, price, cost, margin, marginPercent, totalInventory, seoTitle (Shopify global.title_tag), seoDescription (Shopify global.description_tag), productUrl (full storefront URL — use this directly instead of guessing). Use for questions about products, pricing, profitability, cost price, stock levels, or SEO/meta tags.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of products (default: 20) | |
| store | No | Filter to a specific store domain. Omit to query all connected stores. | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses the return fields and even flags a useful quirk (productUrl is a full storefront URL to use directly), but it does not state whether this is a read-only operation, rate limits, whether it spans all connected stores by default, or pagination behavior despite the schema mentioning _pagination.hasMore.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then lists return fields, then usage scenarios. It is one dense sentence plus a return-value list plus a usage sentence. It is slightly over-packed in the return field enumeration, but there is no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with a 3-parameter schema and no output schema, the description is adequate but incomplete. It covers return fields and usage well, but without annotations it should have disclosed read-only nature, whether the operation mutates anything, and pagination behavior. The mention of _pagination.hasMore in the schema is a hint, but the description does not connect it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add syntax or constraints beyond what the schema provides for limit, store, or _offset. It does mention a default of 20 for limit and 'omit to query all connected stores' for store, but these are already in the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Get) and resource (product catalog) and enumerates the exact data dimensions returned: inventory levels, pricing, cost, margins, status, SEO metadata. This is specific enough to distinguish it from get_products_by_channel, get_product_analytics, and get_top_products, though the distinction from get_inventory is somewhat blurred by the overlapping inventory dimension.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly lists the questions the tool answers: 'products, pricing, profitability, cost price, stock levels, or SEO/meta tags.' This gives the agent clear trigger conditions for selecting this tool over siblings without guessing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_product_healthAInspect
CROSS-SOURCE PRODUCT HEALTH SCAN — one call that returns per-product reviews + refunds + sales velocity + inventory + a composite 'needs attention' score (0-100). Use this for 'which products need fixing?' / 'what should I look at?' / 'are there any product issues?' / 'which products are performing badly?'. Saves the LLM from stitching get_top_products + get_refunds + get_reviews + get_inventory manually — synthesis is consistent and the composite score is grounded in the same heuristic each time. Returns each product's underlying signals (refund rate, review rating, review count, stock level, units sold, days since last sale) plus a flags array explaining WHY the score is what it is. Sort is by attentionScore descending so the most concerning products come first. Filter with minAttentionScore (default 0, set to 30 to see only flagged products). Default analyses the top 50 products by sales over the last 30 days.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max products to analyse, ordered by recent revenue (default: 50, max: 100). | |
| store | No | Filter to a specific store domain. Omit to query all connected stores. | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| endDate | No | End of sales window (YYYY-MM-DD). Defaults to yesterday (last fully-closed day — today is excluded by default to avoid partial-day totals; pass an explicit endDate to include today). | |
| startDate | No | Start of sales window (YYYY-MM-DD). Defaults to 30 days ago. | |
| minAttentionScore | No | Filter to products with attentionScore >= this value (default: 0 = all). Set to 30 to see only products with a flagged signal. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden and does so well: it discloses the composite score range (0-100), the sort order (attentionScore descending), the default filter behavior (minAttentionScore default 0), the default analysis scope (top 50 by sales over 30 days), and the presence of a `flags` array explaining the score. This is unusually rich behavioral disclosure for a no-annotation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core capability in all-caps, followed by use-case quotes, then mechanism, then return shape, then parameters. Some redundancy ('which products need fixing?' / 'are there any product issues?' / 'which products are performing badly?') but each adds a slightly different nuance. Slightly dense but well organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter, no-output-schema synthesis tool with no annotations, the description covers purpose, when-to-use, return shape (signals + flags), sorting, filtering defaults, and scope defaults. An agent has everything needed to invoke it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the schema documents limit, store, _offset, endDate, startDate, and minAttentionScore. The description still adds value by explaining the semantics behind minAttentionScore (set to 30 to see only flagged products) and the default window (top 50 by sales over last 30 days), which reinforces rather than merely repeats the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('CROSS-SOURCE PRODUCT HEALTH SCAN' returning per-product reviews + refunds + sales velocity + inventory + composite score) and explicitly distinguishes itself from siblings like get_top_products, get_refunds, get_reviews, get_inventory by naming them as what it replaces. An agent can immediately tell this is a synthesis tool vs. the individual-data siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use trigger phrases ('which products need fixing?', 'what should I look at?') and names the alternative path (stitching the sibling tools manually) that this replaces. The rationale (consistent synthesis, same heuristic) makes the value proposition concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_products_by_channelAInspect
Get products with marketing channel attribution showing which channels drive sales for each product. Attribution uses Triple Whale last-click data joined to Shopify order line items — requires Triple Whale to be connected. When Triple Whale is not connected, all orders appear under 'unattributed'. Use for questions like 'Which channels drive sales of product X?' or 'What products does Facebook sell?'
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of products to return (default: 10, max 100). | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| endDate | No | End date (YYYY-MM-DD). Defaults to yesterday (last fully-closed day — today is excluded by default to avoid partial-day totals; pass an explicit endDate to include today). | |
| startDate | No | Start date (YYYY-MM-DD). Defaults to a 30-day window ending yesterday. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the attribution methodology (Triple Whale last-click joined to Shopify order line items), the connection prerequisite, and the degraded mode when unconnected ('unattributed'). It omits rate limits or the shape of the returned rows, which is the only real gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose, then qualification, then usage examples. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must convey what comes back; it does this at a conceptual level (per-product channel attribution). Pagination is handled by the schema's _offset, and the main remaining gap is the absence of any statement about the return shape or ordering.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (limit, _offset, startDate, endDate) are already fully documented with defaults and semantics. The description adds nothing beyond the schema about parameters, making the baseline 3 correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (get products) plus the distinguishing dimension (marketing channel attribution), and functionally separates itself from siblings like get_top_products and get_product_analytics. The example questions make the intended output unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use context via example questions and states a hard prerequisite (Triple Whale must be connected). It does not explicitly name or exclude sibling tools, so an agent must still infer the boundary against get_top_products, keeping this just below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_query_to_urlAInspect
Join Google Search Console queries with Shopify product sales — answers questions that pure SEO or pure sales tools can't. Reports: by_url (given a product URL, return its top driving organic queries plus the matching product's sales/orders/refunds and an implied click-to-purchase rate), unconverting_pages (URLs that received >= minClicks organic clicks but the matching product sold <= maxSales units in the same window — flags 'SEO-visible-but-not-converting' listings), top_pages_with_sales (top organic pages joined with their product sales, ranked by clicks × orderCount so high-throughput pages surface). For unconverting_pages and top_pages_with_sales, only product URLs (matching /products/{handle}) are joined to sales — collection pages and blog posts are not.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | For by_url: the exact URL as it appears in Search Console (https:// included, with or without trailing slash to match how GSC indexed it). | |
| limit | No | Number of results (by_url: top queries to return; unconverting_pages / top_pages_with_sales: max URLs returned). Default 20. | |
| report | Yes | Report type | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| endDate | No | End date (YYYY-MM-DD). Defaults to yesterday (last fully-closed day — today is excluded by default to avoid partial-day totals; pass an explicit endDate to include today). | |
| maxSales | No | For unconverting_pages: maximum units sold for the matched product in the same window (default 2). 0 means 'pages with zero sales only'. | |
| minClicks | No | For unconverting_pages: minimum organic clicks for a URL to be considered (default 50). Lower for low-traffic stores; raise to focus on bigger problems. | |
| startDate | No | Start date (YYYY-MM-DD). Defaults to a 30-day window ending yesterday. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does so usefully: it discloses the join scope (only /products/{handle} URLs are matched for two reports; collection and blog pages are excluded) and the ranking formula (clicks × orderCount). It does not mention auth requirements or rate limits, but the core semantics of what is computed and what is silently dropped are clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the join purpose, then a compact enumeration of the three report modes with their returned shape. Dense but every clause carries information; the only mild bloat is the repeated qualification about product-only joins, which could be folded tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, no-output-schema tool, the description does the necessary work of sketching what each report returns (driving queries plus sales/orders/refunds, implied click-to-purchase rate, ranked page lists). It leaves the exact field names of the responses unspecified, which is the remaining gap given there is no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameter descriptions already document defaults and formats, setting a baseline of 3. The prose goes further by explaining which parameters matter to which report (url only for by_url, minClicks/maxSales only for unconverting_pages) and by expanding the bare 'Report type' enum into three meaningful modes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource combination ('Join Google Search Console queries with Shopify product sales') and immediately names the reports it produces. The self-positioning line ('answers questions that pure SEO or pure sales tools can't') separates it from the other analytics siblings an agent might otherwise pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete context for each report: by_url when you have a product URL, unconverting_pages to flag SEO-visible-but-not-converting listings, top_pages_with_sales to find high-throughput pages. It stops short of naming a specific alternative tool to use instead or stating exclusions beyond the join limitation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_refundsAInspect
Get refund/return analytics. Reports: summary (total refunds, refund rate, % of revenue — supports compare for WoW/MoM/YoY trend), top_products (most refunded products by amount or rate), by_reason (classifies refund notes into buckets: size_fit_too_small, size_fit_too_large, quality_defect, wrong_item, shipping_late_or_lost, color_style_mismatch, comfort, changed_mind, duplicate, out_of_stock — with top affected products and sample verbatim notes per bucket. The out_of_stock bucket is a fulfilment/overselling signal, not a customer preference. Best for diagnosing high refund rates).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | For top_products and by_reason: number of results (default: 10) | |
| report | Yes | Report type | |
| sortBy | No | For top_products: sort field (default: amount) | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| compare | No | For summary: attach a `comparison` block showing the same metrics for the WoW/MoM/YoY/previous-period window with percentage changes. | |
| endDate | No | End date (YYYY-MM-DD). Defaults to yesterday (last fully-closed day — today is excluded by default to avoid partial-day totals; pass an explicit endDate to include today). | |
| startDate | No | Start date (YYYY-MM-DD). Defaults to a 30-day window ending yesterday. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well by detailing what each report returns, including bucket semantics and the out_of_stock signal. It does not explicitly state read-only behavior or mention auth/rate limits, though 'Get' strongly implies a safe read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then structured by report type. It is dense but the length is largely justified by the complexity of the three reports and the bucket list, though it could be more scannable with bullets.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only analytics tool with no annotations and no output schema, the description is quite complete: it covers report types, metrics, comparison support, and bucket meanings. It omits explicit read-only/side-effect statements and pagination details, which are either implied or left to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful semantics beyond the schema. It explains report-specific behavior for summary, top_products, and by_reason, and clarifies compare and sortBy usage. It does not cover _offset or the date defaults, which are only in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: 'Get refund/return analytics.' It clearly enumerates the three report types and their contents. However, it does not explicitly differentiate itself from sibling tools like get_top_products or get_product_analytics, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear usage context with 'Best for diagnosing high refund rates' and explains when to use each report type. It does not name alternatives or state when not to use the tool, so it lacks the explicit exclusions required for a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_revenue_driversAInspect
Diagnostic tool for 'why did revenue change?' questions. Bundles headline metric deltas, product mix shifts, and pre-generated ranked hypotheses into one call — so you don't have to stitch signals together yourself and risk asserting causation. Each hypothesis includes: what signal supports it, what else would be true if it's correct, and which tool to call next to confirm or rule it out. Use when the merchant asks why revenue went up or down, what's driving performance, or what changed.
| Name | Required | Description | Default |
|---|---|---|---|
| store | No | Filter to a specific store domain. | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| endDate | No | End date (YYYY-MM-DD). Defaults to yesterday. | |
| startDate | No | Start date (YYYY-MM-DD). Defaults to a 30-day window. | |
| comparison | No | Comparison window. Default: previous (equivalent prior period). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it discloses that output is pre-generated ranked hypotheses, each containing a supporting signal, a falsifiability check ('what else would be true'), and a next-tool recommendation, plus an explicit caution against asserting causation. It doesn't cover auth, rate limits, or pagination, but the causal-safety framing is meaningful context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the core purpose and followed by return-structure detail and trigger conditions. Every sentence carries distinct information; nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and no annotations, the description does the heavy lifting by explaining what the return contains (ranked hypotheses with supporting signals and next steps). Combined with fully-documented params, an agent has enough to call it correctly, though the absence of any safety/auth profile leaves a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters (store, dates, comparison enum, pagination offset). The description adds no syntax or format detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific diagnostic purpose ('why did revenue change?') and enumerates exactly what it bundles: headline metric deltas, product mix shifts, and ranked hypotheses. It clearly differentiates itself from siblings like get_metrics_comparison or get_anomalies by positioning as the consolidated causal-diagnosis tool rather than a raw signal source.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger conditions — 'Use when the merchant asks why revenue went up or down, what's driving performance, or what changed.' This clearly frames the when-to-use context. It stops short of naming a specific alternative tool or stating when-not to use it, which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_spend_reconciliationAInspect
Reconcile ad-spend numbers between Triple Whale's pixel attribution and the ad-platform APIs (Google Ads, Meta, TikTok). Same channel, different numbers — pixel typically captures 10-30% of true spend due to ad blockers, consent banners, and iOS ATT. Returns per-channel platform-API spend, TW pixel spend, ratio, severity (match / moderate / severe / critical), trueRoas (TW revenue / platform spend), pixelRoas (from TW), and a recommendation per channel. Use whenever quoting ROAS — pixel ROAS in isolation is reliably wrong on paid channels with bad pixel coverage.
| Name | Required | Description | Default |
|---|---|---|---|
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| endDate | No | End date (YYYY-MM-DD). Defaults to yesterday (last fully-closed day — today is excluded by default to avoid partial-day totals; pass an explicit endDate to include today). | |
| startDate | No | Start date (YYYY-MM-DD). Defaults to a 30-day window ending yesterday. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and mostly succeeds: it explains the root cause of the discrepancy (ad blockers, consent banners, iOS ATT, 10-30% pixel capture), enumerates returned fields, and defines a severity taxonomy. It stops short of stating read-only/side-effect guarantees or rate/limit behavior, and there is no output schema to lean on.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then mechanism, then return shape, then usage trigger — a logical order. It is somewhat dense with parenthetical enumerations, but every clause conveys actionable information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, three-param tool with no annotations and no output schema, the description compensates well by describing return fields and the domain reasoning behind the metric. The remaining gap is the absence of an explicit read-only/effect statement and pagination note beyond what the _offset schema already provides.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and all three parameters (_offset, startDate, endDate) are fully documented in the schema, including defaulting behavior. The description adds no parameter-level detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (reconcile) and a precise resource (ad-spend numbers between Triple Whale pixel attribution and ad-platform APIs), naming the exact channels covered. No sibling tool in the list does this, so the differentiation is implicit but unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear triggering condition: 'Use whenever quoting ROAS — pixel ROAS in isolation is reliably wrong on paid channels with bad pixel coverage.' This tells the agent when to reach for it, but names no explicit when-not case or alternative sibling tool for comparison.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_store_notesAInspect
Return all merchant-attached LLM context notes for a store (or all stores if omitted). Notes are authoritative caveats the merchant has added — e.g. 'one B2B customer skews retention', 'Q2 budget freeze, don't suggest more ad spend', 'pre-2026-03 data is partial'. The same notes are auto-injected into every store-scoped tool response as _storeNotes, so calling this directly is only needed when you want a full picture before answering a session-opening question.
| Name | Required | Description | Default |
|---|---|---|---|
| store | No | Optional. Filter to a specific store. Omit to get notes for all stores the caller has access to. | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it discloses that notes are authoritative overrides the merchant authored, that they are injected into every store-scoped response, and that direct calls are largely redundant. It stops short of stating access/permission scope or the return shape beyond the _storeNotes equivalence, so not quite a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, and the three quoted note examples earn their space by showing the agent what kind of content to expect. Slightly longer than strictly necessary for a two-parameter read, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must cover returns; it does so by explaining that the payload matches the _storeNotes already seen in other responses, and pagination is handled by the schema's _offset description. Access scope and error behavior are unstated, which keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are documented in the schema, including the omit-to-get-all semantics and the _offset pagination contract. The description restates the 'or all stores if omitted' behavior but adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return all merchant-attached LLM context notes for a store') plus the scope variant when the store argument is omitted. The examples of what notes contain make the resource concrete and distinguish it from data-bearing siblings like get_store_profile.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when this call is unnecessary ('the same notes are auto-injected into every store-scoped tool response as _storeNotes') and the narrow condition that justifies calling it directly ('a session-opening question'). That is a genuine when-to-use/when-not-to-use rule, not an inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_store_profileAInspect
Return what the system understands about a store's IDENTITY — primaryCategory, priceTier, audience, positioning, giftLed (is it typically bought as a gift for others?), the revenue-weighted category mix, and price range. System-generated from the catalog + sales (refreshed ~monthly), with any merchant corrections applied on top. Use as a session opener to orient yourself before answering, or when the user asks 'what do you know about my store?'. Treat _merchantCorrected fields as authoritative. If the profile is wrong, call update_store_profile. Omit store to get every store in the workspace.
| Name | Required | Description | Default |
|---|---|---|---|
| store | No | Optional. Specific store (short or full domain). Omit for all stores in the workspace. | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden well: it discloses provenance (system-generated from catalog + sales), freshness (~monthly refresh), that merchant corrections are applied on top, and that `_merchantCorrected` fields are authoritative. It stops short of stating permissions, behavior when no data exists, or response size limits, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the return contract, then provenance, then usage, then the alternative — a sensible order with no filler sentences. The field enumeration and parenthetical for giftLed are dense but each clause earns its place; it could be tightened marginally but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, so the description must convey the return shape itself — and it does, enumerating the profile fields and flagging `_merchantCorrected` as authoritative. With only two fully documented, optional parameters and usage guidance included, an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both `store` and `_offset` are already documented in the schema; the description's 'Omit store to get every store in the workspace' largely restates that. It adds no syntax, format, or edge-case detail for the parameters beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return what the system understands about a store's IDENTITY') and enumerates the exact content returned: primaryCategory, priceTier, audience, positioning, giftLed, revenue-weighted category mix, and price range. That content signature makes it distinguishable from siblings like get_store_summary or get_store_notes without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit triggers ('use as a session opener to orient yourself before answering', 'when the user asks what do you know about my store?') and names the corrective alternative: 'If the profile is wrong, call update_store_profile.' Both when-to-use and the escalation path are spelled out rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_store_summaryAInspect
Get overall store metrics from Shopify order data ONLY: revenue, orders, average order value, items sold, discounts, unique customers — all for the specified period. Includes percentage changes vs prior period. Also returns all-time totals (orders, products, customers). Use this for high-level store performance questions. For an overview spanning ALL connected sources (traffic, email, support, reviews, etc.) use get_complete_dashboard instead.
| Name | Required | Description | Default |
|---|---|---|---|
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| endDate | No | End date in ISO format (YYYY-MM-DD). Defaults to yesterday (last fully-closed day — today is excluded by default to avoid partial-day totals; pass an explicit endDate to include today). | |
| startDate | No | Start date in ISO format (YYYY-MM-DD). Defaults to a 30-day window ending yesterday. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the disclosure burden and does meaningful work: it reveals the returned measure set, that comparisons are percentage changes vs the prior period, and that all-time totals are included alongside period metrics. It does not cover permissions, rate limits, or the caveat that today is excluded by default (that only lives in the schema), so a small gap remains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Effectively three sentences: what it returns, when to use it, and the sibling alternative. It is front-loaded and each sentence earns its place, though the first sentence is a dense em-dash list that could be trimmed slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must (and largely does) enumerate the return contents, including the comparison deltas and all-time totals. Combined with the sibling routing, an agent has enough to call it correctly; only minor operational details (timezone, permissions) are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so startDate, endDate, and _offset are already fully documented, including the 'yesterday by default' nuance. The description only refers to 'the specified period' and adds no date syntax or pagination guidance beyond the schema — baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource (store metrics from Shopify order data) and enumerates exactly what is returned: revenue, orders, AOV, items sold, discounts, unique customers, plus percent changes and all-time totals. It also explicitly scopes the data source ('Shopify order data ONLY'), which is the key way an agent distinguishes it from the many other get_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the intended use case ('Use this for high-level store performance questions') and names a concrete alternative with the condition that selects it: full cross-source overview → get_complete_dashboard. Both the when-to-use and the alternative are explicit rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sync_healthAInspect
Report the health of every connected data source for each of your stores (works for a single store too). For each provider/instance: last successful sync timestamp, record count, freshness flag (stale if > 36h), and key-field nullability rates (e.g. % of customers without firstOrderAt populated). Use this to diagnose 'why is metric X showing 0?' or to confirm data is current before reporting numbers.
| Name | Required | Description | Default |
|---|---|---|---|
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It discloses the freshness threshold ('stale if > 36h'), the scope (all stores or a single store), and the per-provider breakdown. It doesn't state whether this is read-only (obvious from 'Report') or discuss caching/rate limits. Without annotations, a small gap remains, but the domain-specific threshold detail is above average.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: scope, payload contents, and use cases. Front-loaded with the core action, zero restatement of the tool name, no filler. The parenthetical threshold and example are both earning their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only reporting tool with no output schema and one pagination parameter, the description covers scope, per-item fields, thresholds, and intended diagnostic uses. An agent has everything needed to decide when to call it and what to expect back, without needing return-value documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds context that the tool 'works for a single store too,' implying the store-scoping parameter isn't listed in the schema and the tool uses server-side context instead. That reconciles the single _offset parameter with the multi-store reporting description, adding value beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Report the health of every connected data source for each of your stores'), and it enumerates exactly what is returned per provider/instance: last sync timestamp, record count, freshness flag, and nullability rates. This is clearly distinct from siblings like get_data_sources (which likely just lists sources) and get_anomalies, so an agent can pick it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit use cases: 'Use this to diagnose why is metric X showing 0?' and 'to confirm data is current before reporting numbers.' Those are concrete when-to-use triggers tied to a real diagnostic workflow, which is stronger than most siblings that only name a resource.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_targetsAInspect
List the merchant's active targets with LIVE actual-vs-target pacing, recomputed from ground truth on every call (never stored). Each target returns a pacing block: status (ahead / on_track / at_risk / behind / too_early / not_paceable), actualToDate, projected month-end with its interval, progressPercent, gapToTarget, currentDailyPace vs requiredDailyRunRate, and days elapsed/remaining. Live month-pacing is available for monthly revenue/orders targets scoped to a store; other targets return the goal and defer to get_yoy_monthly / query_metric_snapshots. HONESTY: the status band is derived from the forecast's low/high interval — 'behind' means behind the optimistic end — and below 25% of the period elapsed it returns 'too_early' rather than a noisy verdict. Filter with metric / period / store.
| Name | Required | Description | Default |
|---|---|---|---|
| store | No | Only targets scoped to this sub-store key. | |
| metric | No | Only targets for this metric. | |
| period | No | Only targets for this period type. | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and does so unusually well: it discloses that values are recomputed from ground truth on every call and never stored, that the status band derives from the forecast interval's optimistic end, and that sub-25%-elapsed periods return 'too_early' instead of a noisy verdict. Each pacing field is enumerated, which is behavioral detail an agent cannot infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose before the field inventory and the honesty caveats. It is long and the pacing-field enumeration is dense, but each sentence adds real information; nothing reads as filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must describe returns — and it does, naming the pacing block and its constituent fields plus the six-value status enum. Combined with the honesty notes and the fallback routing, an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented in the schema and the baseline is 3. The description adds only a light gloss (store means sub-store key, filters narrow by metric/period/store) and says nothing about _offset beyond what the schema states, so it does not meaningfully exceed structured data.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) plus resource (active targets) and scope (merchant's), then immediately narrows what subset actually has live pacing. It explicitly names the siblings it defers to (get_yoy_monthly / query_metric_snapshots), so an agent can distinguish it from the other ~57 get_* tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear about when live pacing applies (monthly revenue/orders targets scoped to a store) and where to go otherwise, plus how to filter. What's missing is a top-level trigger statement telling the agent when to reach for this tool versus get_forecast or get_daily_metrics, but the routing for its edge cases is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_timelineAInspect
Merged, date-ordered timeline of everything that happened to the business: interventions (changes the merchant applied, and when their verdict landed) plus store-context notes (campaign launches, migrations, budget freezes, data quirks the merchant recorded). Use this to line dated events up against a metric movement — 'revenue dipped on the 12th, what changed around then?' — instead of calling get_interventions and get_store_notes separately and stitching them yourself. Returns events sorted most-recent-first, each with a date, kind, store, and detail. Includes expired/closed items within the window so historical context isn't lost.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max events to return (default 50, max 200). | |
| store | No | Optional. Filter to a specific store (short or full domain). Omit for all stores the caller can see. | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| endDate | No | Window end (YYYY-MM-DD). Defaults to today. | |
| startDate | No | Window start (YYYY-MM-DD). Defaults to 90 days before endDate. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and delivers the highest-value traits: sort order (most-recent-first), the per-event shape (date, kind, store, detail), and that expired/closed items are retained within the window. It omits permission/auth scoping and rate-limit behavior, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core definition and the alternative-routing rationale before the return-format note, with no filler. The parenthetical event-type list is dense but each item earns its place; slightly long overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by specifying the return ordering and per-event fields. Combined with the full-coverage input schema, an agent has everything needed to call and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents limit, store, _offset, and the date window. The description only reinforces the windowing concept ('within the window'), adding no syntax or format detail beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('merged, date-ordered timeline of everything that happened to the business') and enumerates exactly what it merges: interventions and store-context notes. It explicitly names the sibling tools it replaces (get_interventions, get_store_notes), 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit use case ('line dated events up against a metric movement') with a worked example, and states the alternative it supersedes and why. When-to-use is unambiguous and directly contrasted with the two siblings it consolidates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_top_productsAInspect
Get top selling products ranked by revenue or quantity. Set level to 'variant' to break down by variant (size, colour, etc.) — includes SKU, discount, and profit margin when cost data is available. Set level to 'category' for a revenue / COGS / gross-profit / margin-% rollup by product TYPE (e.g. 'Sewing Machines vs Fabric') — the structured answer to category-P&L / margin-by-category questions (margin is computed only over cost-configured units, with a costCoveragePercent per category). Optionally filter variants by productTitle. Supports compare for WoW/MoM/YoY trend — returns top 5 rising/falling/new products with the comparison.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | Grouping level: product (default), variant (by size/colour/SKU), or category (revenue/COGS/gross-profit/margin by product type) | |
| limit | No | Number of results (default: 10) | |
| metric | No | Sort by: revenue or quantity (default: revenue) | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| compare | No | Attach a `comparison` block with the top rising/falling/new products vs the WoW/MoM/YoY/previous-period window. | |
| endDate | No | End date (YYYY-MM-DD) | |
| startDate | No | Start date (YYYY-MM-DD) | |
| productTitle | No | For variant level: filter to variants of a specific product (partial match) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantial work: it discloses that margin/SKU/discount appear only 'when cost data is available', that margin is computed only over cost-configured units with a costCoveragePercent, and that compare returns the top 5 rising/falling/new products. It omits anything about permissions, defaults for date range, or pagination/latency behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose in the first sentence and then layers level-specific detail in order of the enum. It is long and clause-heavy with em-dash asides, but each clause carries information rather than filler, so the density is justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, no-annotation, no-output-schema tool this is close to complete: it explains each level's return shape, the cost-data caveat, and compare semantics. The remaining gap is that it never states the implicit date-range default or that startDate/endDate scope the ranking, which an agent must infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema — the variant breakdown fields, the category cost-coverage caveat, and the semantic content of the `comparison` block that the schema only labels generically. It does not, however, explain level defaults or the format expectations beyond the schema's own text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get top selling products ranked by revenue or quantity') and then crisply distinguishes the three behaviors keyed off the `level` enum, including what each returns (SKU/discount/margin at variant, revenue/COGS/GP/margin-% rollup at category). An agent can immediately tell this apart from get_product_analytics or get_products_by_channel.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance for each level: 'variant' to break down by variant, 'category' for category-P&L / margin-by-category questions, and compare for WoW/MoM/YoY trend. It does not name a competing sibling to defer to (e.g. get_product_analytics) or state when NOT to use this tool, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_velocityAInspect
Get sales-velocity analytics from one of two angles — pass angle to pick which, report to pick the report within it.
• angle:"inventory" — the INVENTORY-management angle: how fast stock is moving and what to reorder. Reports: summary (sell-through rate, turnover, health status), by_product (products sorted by sales velocity), restock (reorder quantity recommendations from velocity, lead time, and safety stock — pass leadTimeDays/safetyStockDays; the reason to pick this angle). Use when the question is "what should I reorder and how much?". • angle:"product" — the PRODUCT angle: how individual products are selling over time. Reports: summary (totalUnitsSold, revenue, productsTracked, inventoryHealth counts), by_product (per-product velocity, stock, reorder urgency), trend (daily time series for one product — requires productId), stagnant (active products with zero or near-zero sales — dead stock/zombie listings; pass maxOrders to widen from zero-sales to near-zero). Use for a single product's trend or stagnant/dead-stock questions.
Both angles share report:"summary"/"by_product" (different content per angle) and the sortBy/filter params on by_product. days defaults to 30 in both angles (note: angle:"product", report:"summary" ignores days entirely — it's always a fixed trailing-30-day aggregate).
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Days for velocity calculation (default: 30 in both angles). Ignored by angle:"product", report:"summary" — that report is always a fixed trailing-30-day aggregate. | |
| angle | Yes | Which velocity angle to query. See the tool description for the report list and defaults per angle. | |
| limit | No | For by_product: number of products (default: 20). | |
| filter | No | For by_product: filter. | |
| report | Yes | Report type — valid values depend on `angle` (see tool description): inventory has summary/by_product/restock; product has summary/by_product/trend/stagnant. | |
| sortBy | No | For by_product: sort field. | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| maxOrders | No | For angle:"product", report:"stagnant": max orders to count as stagnant (default: 0 = zero sales only, use 1-2 for near-zero). | |
| productId | No | For angle:"product", report:"trend": Shopify product ID (required). | |
| variantId | No | For angle:"product", report:"trend": Shopify variant ID (optional). | |
| leadTimeDays | No | For angle:"inventory", report:"restock": lead time in days (default: 14). | |
| safetyStockDays | No | For angle:"inventory", report:"restock": safety buffer days (default: 7). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it does disclose a key behavioral quirk: angle:'product', report:'summary' ignores `days` and is always a fixed trailing-30-day aggregate. It also discloses which params apply to which report. It stops short of describing output shape or pagination behavior in prose, but the schema covers offset paging.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the two-angle model and organized as a bulleted list matching the two enum values, which is scannable. It is fairly long, but every sentence carries routing or param-scoping information; slight density could be trimmed but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter tool with two modes and no output schema, the description maps angle→reports→params comprehensively, including defaults and the one report that ignores `days`. An agent can select the correct angle/report combination and supply required params without opening the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, so baseline is 3. The description adds genuine meaning beyond the schema by grouping parameters per report (leadTimeDays/safetyStockDays only for restock, productId required for trend, maxOrders for stagnant) and stating the days default and its exception. This functional mapping exceeds what the schema alone conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (sales-velocity analytics), then enumerates the two angles and their report sets. This distinguishes it from siblings like get_inventory, get_top_products, and get_product_analytics by routing explicitly to the velocity use-case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use per angle with natural-language question frames: 'what should I reorder and how much?' vs 'a single product's trend or stagnant/dead-stock questions.' It also names the report that is 'the reason to pick this angle,' giving a clear decision path between the two modes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_wakeupAInspect
Retrieve a single wakeup by ID. Use this inside a Claude routine prompt: the routine fires, calls get_wakeup({ id: 'abc-123' }), gets the full context and benchmarks, then runs the analysis. Also auto-marks the wakeup as triggered if the trigger date has passed.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The wakeup UUID returned by save_wakeup. | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does disclose a critical side effect: it auto-marks the wakeup as triggered if the trigger date has passed, meaning this 'get' is not purely read-only. It doesn't cover idempotency (what happens on a second call) or permission needs, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences: purpose first, then the routine workflow, then the side effect. Efficient and well-ordered; the inline call example is slightly verbose but earns its place as a usage cue.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description covers purpose, intended workflow, and the auto-trigger side effect, plus hints at return content ('full context and benchmarks'). Satisfies what an agent needs to call it correctly, with minor gaps around return shape and repeat-call behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both id and _offset are already documented in the schema; baseline is 3. The inline example get_wakeup({ id: 'abc-123' }) reinforces usage but adds no semantic detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve a single wakeup by ID'), which clearly distinguishes it from the plural list sibling get_wakeups. It does not name that sibling explicitly, but 'single ... by ID' is unambiguous about scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete scenario: invoke inside a Claude routine prompt, call get_wakeup, get context/benchmarks, then run the analysis. This is clear context for one intended workflow, though it doesn't contrast against get_wakeups or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_wakeupsAInspect
Retrieve scheduled wakeups for a store. Call at the start of sessions where the merchant might have pending wakeups due — especially if today's date is at or past a previously scheduled triggerDate. Returns both pending (not yet fired) and recently triggered (fired in the last 14 days, waiting for analysis). When triggered wakeups are present, LEAD with them: 'I have a scheduled check that fired today — [name]. Here's what I was tracking...' then run the analysis comparing current data against the saved benchmarks.
| Name | Required | Description | Default |
|---|---|---|---|
| store | No | Store domain (short or full). Omit to return wakeups for all stores in the workspace. | |
| status | No | Filter by status. Default: 'all' — returns both pending and recently triggered (last 14 days). | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the return composition (pending + triggered within 14 days), the freshness window ('last 14 days, waiting for analysis'), and even prescribes agent behavior (LEAD with fired wakeups, run comparison against saved benchmarks). It doesn't state auth requirements or rate limits, which are the remaining gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first two sentences are tight and front-loaded, but roughly half the text is a prescriptive script ('LEAD with them: "I have a scheduled check..."') that is verbose and arguably belongs in agent behavior guidance rather than a tool definition, diluting the core purpose statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a read-only list tool: purpose, timing trigger, return composition, status semantics, and pagination are all covered. No output schema exists, yet the description explains the return shape in prose, which compensates. Only minor missing context (who can call it, rate limits) keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters including the enum default and pagination semantics. The description adds no parameter-level syntax or edge cases beyond what the schema provides. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Retrieve) and resource (scheduled wakeups) with clear scope ('for a store'). Distinguishes itself from the singular sibling get_wakeup and from broader list tools like get_timeline by being explicitly about scheduled wakeups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when-to-use trigger: 'Call at the start of sessions where the merchant might have pending wakeups due — especially if today's date is at or past a previously scheduled triggerDate.' No explicit when-not-to-use or named alternative (e.g., get_wakeup vs get_wakeups) is stated, but the timing guidance is actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_weekly_trendsAInspect
Get weekly revenue, orders, and items sold as a time series. Data is aggregated live from the Shopify Order table. Returns { rows, charts, presentation }. rows is the table — each row: weekOf, revenue (formatted), orders, itemsSold. charts is an array of three ready-to-render chart specs (revenue, orders, items — separate charts because units differ) in long/tidy format with metadata. DEFAULT TO RENDERING THE CHART when the user asks about trends, weekly patterns, seasonality, or uses 'show me' / 'how is' / 'pattern' phrasing. Fall back to numbers from rows only when the user asks for a single specific week.
| Name | Required | Description | Default |
|---|---|---|---|
| weeks | No | Number of weeks (default: 12) | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden; it discloses the data source ('aggregated live from the Shopify Order table'), the presence of a presentation layer, and that the charts come pre-built and in long/tidy format. It stops short of stating freshness/latency guarantees or any permission requirements, but for a read-only time-series tool the behavioral picture is largely covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Reasonably tight and front-loaded: purpose first, then return shape, then the rendering-vs-numbers rule. The chart-explanation sentence ('separate charts because units differ') is slightly verbose but does preempt a design question an agent might otherwise ask.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must explain returns, and it does well (rows/charts/presentation, row fields, chart count and format). The only thin spot is that the default week count and pagination mechanics live solely in the schema, but since the schema covers them at 100% the overall picture is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (both `weeks` and `_offset` are documented in the schema, including the default of 12 and the _pagination.hasMore workflow). The description adds no parameter meaning beyond that, so the baseline 3 applies – it neither compensates for nor undermines the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('weekly revenue, orders, and items sold as a time series'), with the weekly granularity distinguishing it from siblings like get_daily_metrics, get_yoy_monthly, and get_timeline. An agent can tell what it produces without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('user asks about trends, weekly patterns, seasonality, or uses show me / how is / pattern phrasing'), an explicit default ('DEFAULT TO RENDERING THE CHART'), and an explicit when-not alternative ('Fall back to numbers from rows only when the user asks for a single specific week'). This is close to ideal routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_yoy_monthlyAInspect
Month-by-month year-over-year comparison for a single metric. SINGLE-CALL ANSWER for 'how is revenue this year vs last year by month?' / 'show me 2026 vs 2025 monthly trends'. Returns { metric, currentYear, compareYear, rows, totals, charts, presentation, seeAlso }. rows is one entry per month with current/compare/change. charts[0] is a ready-to-render grouped-bar spec (seriesField='year') — drop straight into a chart library. totals gives the year-to-date sum + YoY %. Reads pre-aggregated calendar-month snapshots so it's clean and quick. DEFAULT TO RENDERING THE CHART for any 'X this year vs last year by month' question.
| Name | Required | Description | Default |
|---|---|---|---|
| store | No | Filter by sub-store key (e.g. 'acme-store-us'). Omit to sum across all stores in the workspace. | |
| metric | Yes | Metric key (e.g. 'revenue', 'orders', 'aov', 'cvr', 'sessions', 'tickets_total'). Must be one that has been captured as a calendar-month snapshot. | |
| source | No | Filter by source ('shopify', 'tw', 'ga4', 'google-ads', 'search-console', 'gorgias', 'shipstation'). Omit to sum across sources — usually only useful for metrics that appear in multiple sources (e.g. 'revenue' in both shopify and tw). | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| compareYear | No | Year to compare against. Defaults to currentYear - 1. | |
| currentYear | No | Year to use as the current side of the comparison. Defaults to the current calendar year (UTC). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does add real behavioral context: it reads pre-aggregated calendar-month snapshots ('clean and quick') and discloses the response shape. It does not address permissions or limits, but for a read-only analytical tool the provenance and performance notes are meaningful disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first sentence and each subsequent sentence adds distinct value (use cases, return fields, chart handoff, data source, rendering default). It is dense and slightly long, but no sentence is pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must explain returns, and it does so well (rows, charts, totals, seeAlso). Combined with clear usage guidance and full schema coverage, an agent has enough to call it correctly, though a note on pagination beyond the schema's _offset would round it out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters are already documented in the schema. The description adds no syntax or format detail beyond that (metric snapshot requirement, year defaults, and store/source filters are all in the schema), so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Month-by-month year-over-year comparison for a single metric') and scopes it to one metric, which implicitly separates it from multi-metric siblings like get_metrics_multi_compare. However, it never explicitly names a sibling or states when to prefer this over get_weekly_trends or get_metrics_comparison, so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Strong when-to-use guidance is given via concrete question phrasings ('how is revenue this year vs last year by month?') and an explicit default action ('DEFAULT TO RENDERING THE CHART'). It lacks any when-not guidance or named alternatives, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_metric_snapshotsAInspect
Query recorded metric snapshots as a time series. Use to answer 'show me all CVR snapshots for UK over the last 6 months', 'how has ROAS evolved by month?', etc. Returns canonical snapshot data (matches the dashboard and monthly digest exactly) plus a charts array of ready-to-render line chart specs (one per metric; multi-series when the query spans multiple stores or segments). DEFAULT TO RENDERING THE CHART when the LLM is asked to show a metric over time — these are the SAME numbers the merchant sees on /dashboard/metrics. Call with no args (or just list: true) to get the full registry of canonical metric keys.
| Name | Required | Description | Default |
|---|---|---|---|
| list | No | If true, returns the metric registry (canonical keys, units, descriptions). Use this when you don't know which metrics are available. | |
| limit | No | Max snapshots to return (default 100, max 500) | |
| store | No | Filter to a specific store/region key. Accepts short form ('acme-store') or full domain ('acme-store.myshopify.com') — both normalize to the short form used in storage. | |
| metric | No | Canonical metric key. Omit to return snapshots across all metrics (filtered by other params). | |
| source | No | Filter by source ('shopify', 'ga4', 'tw', etc.) | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| endDate | No | Only include snapshots whose periodStart is <= this date (YYYY-MM-DD) | |
| segment | No | Filter to a specific segment | |
| insightId | No | Only snapshots linked to this insight | |
| startDate | No | Only include snapshots whose periodEnd is >= this date (YYYY-MM-DD) | |
| confidence | No | Filter by confidence. Pass 'high' / 'medium' / 'low' to match exactly, or 'minHigh' / 'minMedium' to require AT LEAST that level (treats null as 'high'). Useful for benchmarks where you only want trustworthy values. | |
| periodKind | No | Filter by period anchoring. 'calendar' = discrete buckets only; 'rolling' = trailing windows only. Mixing the two in a single time series silently distorts trends. | |
| periodLength | No | Filter by bucket size — combine with periodKind to e.g. fetch only calendar-month rows. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses that the numbers match the dashboard and monthly digest exactly, that the output contains a charts array with multi-series semantics, and the list-mode special behavior. It does not mention rate limits, auth requirements, or pagination beyond the schema's own _offset description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then examples, then return-value and default-action guidance. All sentences earn their place; the 'SAME numbers the merchant sees' emphasis is somewhat redundant with the earlier 'matches the dashboard and monthly digest exactly' claim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-param tool with no annotations and no output schema, the description covers purpose, usage triggers, default charting behavior, list mode, and return shape (snapshots + charts array). The schema covers the remaining parameter details, leaving nothing an agent needs missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 13 parameters including the subtle periodKind/periodLength interaction and confidence modes. The description adds only the list/no-args mode and doesn't expand any parameter semantics beyond what the schema covers. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Query) and resource (metric snapshots as a time series), and distinguishes itself from siblings like get_daily_metrics, get_weekly_trends and get_metrics_comparison by scoping to canonical snapshot data plus ready-to-render charts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger examples ('show me all CVR snapshots for UK over the last 6 months', 'how has ROAS evolved by month?') and an explicit default action ('DEFAULT TO RENDERING THE CHART'). It also states when to call with no args / list:true for the registry.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_ordersAInspect
List individual orders matching filters: date range, financial status, customerId, min/max order total, order tags — sortable by date or total. Returns one row per order with name, status, fulfillment, orderTotal (formatted), items count, country, tags, and date. Use for 'show me recent orders', 'orders over $500', 'this customer's pending orders', 'orders tagged wholesale'. DISAMBIGUATION: for AGGREGATE order analytics (counts/revenue by status, country, or product) use get_orders; to look up ONE known order by its #name or ID with line items, use get_order.
Notes
Returns at most 50 orders per call. For larger sets, page with
_offset(the response sets_pagination.hasMore).statusfilters Shopify financial status; omit it to include all statuses.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Filter to orders carrying these Shopify order tags. Matching is case-insensitive. By default an order matches if it has ANY of the tags (see tagMatch). E.g. ['wholesale'] or ['gift','vip']. | |
| limit | No | Number of results (default: 20, max: 50) | |
| offset | No | Pagination offset | |
| sortBy | No | Sort field (default: processedAt) | |
| status | No | Filter by financial status | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| endDate | No | End date (YYYY-MM-DD). Defaults to yesterday. | |
| maxTotal | No | Maximum order total in dollars | |
| minTotal | No | Minimum order total in dollars | |
| tagMatch | No | How to match multiple tags: 'any' (default, order has at least one) or 'all' (order has every listed tag). | |
| sortOrder | No | Sort order (default: desc) | |
| startDate | No | Start date (YYYY-MM-DD). Defaults to a 30-day window ending yesterday. | |
| customerId | No | Filter to orders for a specific customer (Shopify customer ID) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the 50-row cap, the _offset/_pagination.hasMore paging contract, the response row shape, and that omitting status includes all financial statuses. It stops short of stating permissions/auth requirements or confirming read-only behavior, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose, trigger examples, and disambiguation are front-loaded in the first two sentences, with operational caveats isolated in a short Notes block. Every sentence carries either routing or behavioral information; nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter, no-required-args query tool with no output schema, the description covers defaults, caps, paging, and a summary of returned fields, which is exactly what an agent needs to invoke it correctly. The absence of an output schema is compensated by the explicit return-field listing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds real meaning: it explains the operational difference between offset and _offset for paging, ties _offset to the _pagination.hasMore flag, and states that status maps to Shopify financial status. These clarifications 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.
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 ('List individual orders matching filters') and enumerates the filter dimensions plus the sortable fields. It explicitly names the two confusing siblings, get_orders (aggregate) and get_order (single known order), so an agent can distinguish this tool without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete trigger phrases ('show me recent orders', 'orders over $500', 'this customer's pending orders', 'orders tagged wholesale') and an explicit DISAMBIGUATION block routing aggregate analytics to get_orders and single-order lookup to get_order. When-to-use and when-not-to-use are both stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_metric_snapshotAInspect
Record one or more structured metric snapshots for time-series analysis. Use this whenever you cite a metric in an insight, weekly digest, or benchmark — instead of (or in addition to) burying it in prose. Each snapshot is queryable later via query_metric_snapshots, e.g. 'show CVR for UK over the last 6 months'. Always pass canonical metric keys from the registry (call query_metric_snapshots with no args to list them, or see the error hint when you pass an unknown key). Provide both a current value and, ideally, a baseline value so trajectories can be plotted. When a snapshot was produced by a specific tool call, include sourceParams (the tool name + the exact args you used) so the value can be reproduced later without guesswork. IDEMPOTENCY: re-recording the same logical measurement does NOT append a duplicate. The identity tuple is (metric, periodStart, periodEnd, store, segment, source, periodKind, periodLength) — periodKind and periodLength are part of the identity so 'April 2026 calendar+month' and 'rolling+month' don't collide. The existing row is updated: latest value wins, and metadata fields (sourceParams, baseline, confidence, confidenceReason, notes) merge — newer non-empty replaces, missing preserves the prior. INSIGHT LINKAGE is many-to-many and PURELY ADDITIVE here — both insightId (single) and insightIds (array) UNION with any existing links and never remove. The same snapshot can serve as evidence for parent + child + 30-day-check simultaneously. To remove a link, use update_insight(insightId, unlinkSnapshotIds: [...]).
| Name | Required | Description | Default |
|---|---|---|---|
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| snapshots | Yes | Array of metric snapshots to record |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so: it discloses the idempotency identity tuple, the update-vs-append semantics ('latest value wins', metadata merge rules), and the purely additive many-to-many insight linkage with the removal path. These are non-obvious traits an agent could not infer from the name or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is long, but it is front-loaded (purpose first, then idempotency, then linkage) and uses labeled sections (IDEMPOTENCY, INSIGHT LINKAGE) rather than prose sprawl. Some material on insight linkage duplicates what the schema's insightId/insightIds descriptions already say, which is the only real waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description closes every gap an agent needs: what is written, what happens on re-write, how links accumulate and how to remove them, and where canonical keys come from. Nothing required to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real value beyond the schema: it tells the agent to pass canonical registry keys, how to discover them (call query_metric_snapshots with no args or read the error hint), how periodKind+periodLength combine so 'last 30 days' and 'April 2026' don't collide, and why sourceParams matters for reproducibility.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('record one or more structured metric snapshots') plus the domain purpose (time-series analysis). It explicitly distinguishes itself from the sibling query_metric_snapshots and from update_insight, so an agent can route without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('use this whenever you cite a metric in an insight, weekly digest, or benchmark'), names the alternative behavior it replaces (burying the number in prose), and points to the counter-tool for unlinking via update_insight(unlinkSnapshotIds). When-to-use and when-to-use-something-else are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_concernAInspect
USER-TRIGGERED issue reporting — call when the user expresses doubt about a specific data point or value ('this number is wrong', 'doesn't match my Shopify admin', 'why is this zero?', 'something's off here'). Capture their concern as a structured report BEFORE speculating about causes. After saving, briefly acknowledge ('I've logged that for the team to review') and then offer to help debug if relevant.
| Name | Required | Description | Default |
|---|---|---|---|
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| category | Yes | data_mismatch = user says it doesn't match another source (Shopify admin, GA, etc.). incorrect_calculation = the math looks wrong to them. missing_data = expected data isn't there. confusing_output = the response format is unclear. slow_response = took too long. | |
| severity | No | Inferred from how strongly the user voiced the concern. 'a bit weird' = low; 'this is definitely wrong' = high. | |
| toolName | No | The tool whose response prompted the concern, if known. | |
| userQuote | Yes | Verbatim what the user said, trimmed. Don't paraphrase. | |
| description | Yes | 1–2 sentences framing the concern technically. Include the data point in question. | |
| expectedValue | No | If the user said what they expected (e.g. 'should be around 500'), include it. | |
| responseSnippet | No | Relevant excerpt of the tool response that the user is questioning. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the disclosure burden and does well: it reveals the tool persists a report for a team to review ('I've logged that for the team to review') and prescribes the post-call conversational behavior (acknowledge, then offer to debug). It does not state permissions, whether the report is user-visible, or what the call returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the trigger condition and the core action, then post-call behavior. Every sentence is doing work, though the parenthetical example lists plus the quoted acknowledgement make it slightly denser than needed for a single-purpose capture tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, 3-required mutation-style tool with no annotations and no output schema, the description supplies the missing behavioral contract: when to fire, that a persistent artifact is created, and what the agent should say afterward. The remaining gap is that it never tells the agent what the tool returns or whether the report is retrievable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with enums and per-parameter guidance already documenting category, severity inference, userQuote verbatim handling, and expectedValue. The description's example phrases loosely echo the category enum but add no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Capture their concern as a structured report') and scopes it as USER-TRIGGERED, which is a meaningful distinction in a toolset full of get_* retrieval tools. It does not, however, distinguish itself from the very similar sibling report_data_issue, which an agent choosing between the two would need.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete trigger phrases ('this number is wrong', 'doesn't match my Shopify admin', 'why is this zero?') and an explicit ordering instruction: capture BEFORE speculating about causes. That is unusually actionable. It stops short of naming when NOT to use it or pointing to the sibling report_data_issue as the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_data_issueAInspect
AUTONOMOUS bug reporting — call WITHOUT asking when you spot a STRUCTURAL or FORMAT issue in another tool's response. ONLY for issues you can identify mechanically (precision, types, schema). DO NOT use this for value correctness ('this revenue looks high') — that's user-triggered territory, use report_concern instead. Examples that DO qualify: a numeric field with 15 decimal places, _currency says EUR but values look like USD, response field is null where the description implies a value, the shape doesn't match the tool description. The platform dedupes by (toolName, category, description), so reporting the same issue across many tool calls is fine — counter increments, no spam. After reporting, continue answering the user's original question normally; do not mention the report.
| Name | Required | Description | Default |
|---|---|---|---|
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| category | Yes | precision = too many decimals or wrong rounding. type_mismatch = field type doesn't match the tool's description. inconsistency = internal contradictions in one response (e.g. _currency vs values). null_unexpected = null in a field that should always have a value. schema_surprise = response shape doesn't match the tool description. | |
| severity | No | low = cosmetic (extra decimals), medium = misleading but data still usable, high = data is unusable / breaks downstream logic. | |
| toolName | Yes | The tool whose response had the issue (e.g. 'get_metrics_comparison'). | |
| description | Yes | 1–2 sentences. What's wrong, where, and why it's wrong. Be specific: 'Field cvr returned 4.612345678 (10+ decimals); expected 1–2 decimal precision per the tool description.' | |
| responseSnippet | No | Optional. The relevant fragment of the response, capped to ~2KB. Include just enough to make the issue reproducible. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full burden and does it well: it discloses the dedupe key (toolName, category, description) so the agent knows repeat reports are harmless, and specifies post-call behavior (continue the original task, don't mention the report). That is exactly the behavioral context an agent needs for a write-like side-effecting tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long but front-loaded: the trigger condition, the exclusion, the examples, and the dedupe/after-call behavior each appear once and in priority order. Slightly verbose, but every sentence contributes a distinct rule.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-param tool with no output schema, the description fully covers invocation intent, routing, and side effects. It does not touch severity or responseSnippet, but those are adequately handled by the schema, so no gap an agent would trip on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including the category and severity enums is already documented in the schema. The description's concrete examples ('15 decimal places', '_currency says EUR but values look like USD') reinforce the category semantics somewhat, but add little beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (autonomous bug reporting into a data-issue channel) and immediately differentiates from the sibling report_concern by name. An agent can distinguish it from report_concern and the many get_* siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to call WITHOUT asking (mechanical/structural issues), when not to (value-correctness, routed to report_concern), and lists qualifying examples. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_focusAInspect
Persist the week's committed plan generated from the get_focus data bundle. The plan blends THREE streams: 'tackle' (new open findings to act on, link insightId), 'check' (interventions due for their verdict, link interventionId), and 'watch' (a metric/anomaly to keep an eye on, set metric). Each item needs title, rationale (why now, citing data), action, expectedImpact, effort, priority. Item completion is DERIVED — a 'tackle' is done when its finding becomes addressed, a 'check' when its intervention closes — so always link insightId/interventionId when the item maps to one. Carry forward any unfinished items from the previous plan (get_focus returns them with their live state). The plan stays current until the merchant re-plans ('plan my week') — calling save_focus supersedes the previous plan by default.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | Ordered focus items, top priority first | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| context | No | Optional snapshot of inputs used (e.g. {openInsights: 12, lastOutcomesWinRate: 60}). Stored verbatim for auditability. | |
| replacePrevious | No | Default true — supersede the previous plan. Set false to keep history visible. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses that the call supersedes the previous plan by default, that item completion is DERIVED rather than set, and that the plan persists until the merchant re-plans. This is exactly the mutation/destructive context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded, leading with the core purpose and effect before enumerating the three streams. Some content duplicates the schema's own descriptions (e.g. the tackle/check/watch definitions), which is minor redundancy rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nested-object mutation tool with no output schema, the description covers the essentials an agent needs: item structure, linking rules, derived completion, and replace semantics. Return-value behavior is not covered, but no output schema exists to compensate for it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning on top: it explains the three item streams (tackle/check/watch), why insightId/interventionId must be linked (derived completion), and the carry-forward semantics behind replacePrevious.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource: persist the week's committed plan generated from the get_focus data bundle. This clearly distinguishes it from siblings like save_insights, save_target, and update_focus_item, and names the source tool that feeds it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides strong context on when to call it (after get_focus, carrying forward unfinished items with their live state) and the effect of the default replacePrevious=true vs. false. It stops short of an explicit 'when not to use' or naming update_focus_item as the alternative for editing an existing plan.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_insightsAInspect
TRIGGER: Whenever you surface a problem or opportunity from the data, OFFER to save it as an insight and confirm before writing — don't auto-save. Make the offer concrete and inline: 'Want me to save this as an insight to track?'. Findings vary in significance; the user decides what belongs on the checklist. Insights are OBSERVATIONS (findings to act on) — when a fix is actually SHIPPED, that's a separate thing: call set_intervention (it auto-flips the linked insight to 'addressed' and owns the before/after verdict). Don't model 'fix applied' or '30-day check' as insights. Call this AFTER generating recommendations from get_insights data, OR mid-conversation when the user confirms. Can save any number of insights. To replace the existing checklist (instead of appending), set replace: true. To update a single existing insight, use update_insight with the insight's id instead. parentInsightId/threadId group related FINDINGS as one story (finding → re-finding → superseded). RESPONSE: returns insights: [{insightId, title, category, priority, status, threadId, parentInsightId}] in the same order as the input — use those insightIds directly in subsequent record_metric_snapshot / set_intervention(linkedInsightIds) / update_insight calls (no round-trip through get_insights needed).
| Name | Required | Description | Default |
|---|---|---|---|
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| replace | No | Set to true to replace all active (non-completed) insights. Default: false (appends). | |
| insights | Yes | Array of business insights to save (any number) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses the confirm-before-write requirement ('OFFER... confirm before writing — don't auto-save'), append vs replace semantics via replace:true, thread/parent grouping behavior, that any number can be saved, and that the response returns insightIds in input order usable downstream. This is behavior beyond what the schema states.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long but front-loaded: the TRIGGER and the core observation-vs-intervention distinction come first, then edge cases (replace, update, grouping), then the RESPONSE contract. Every sentence earns its place by routing behavior an agent would otherwise get wrong.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no annotations, so the description must supply workflow context — and it does: trigger, confirmation etiquette, replacement semantics, single-update delegation, insight-vs-intervention separation, grouping model, and the returned payload shape. Nothing material for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, but the description adds cross-parameter meaning: replace:true replaces the existing checklist instead of appending, and parentInsightId/threadId group related findings as one story (finding → re-finding → superseded). It also explains why returned insightIds remove a round-trip through get_insights.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (save insights) and distinguishes the concept sharply: 'Insights are OBSERVATIONS (findings to act on)' vs set_intervention for shipped fixes. It explicitly names siblings (set_intervention, update_insight, get_insights, record_metric_snapshot), so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger ('whenever you surface a problem or opportunity'), timing ('AFTER generating recommendations from get_insights data, OR mid-conversation when the user confirms'), an exclusion (don't model 'fix applied' or '30-day check' as insights), and directs single updates to update_insight and full replacement to replace:true.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_store_noteAInspect
Save a new store-context note from something the USER told you that future sessions should know. Only call this when the user reveals business context the data alone wouldn't show (e.g. 'one B2B customer is a reseller', 'Q2 budget is fixed', 'we exclude wholesale orders from retail KPIs', 'migrated platforms in March'). Confirm to the user once saved: 'I've noted that for future sessions'. Notes you save are flagged as AI-suggested so the merchant can review/delete from the dashboard. Do NOT save speculation, transient session state, or things already obvious from the data. Skip if uncertain — the user can add notes manually.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Concise framing for future LLM sessions. Include the WHY when relevant. 1–3 sentences. Use the user's verbatim wording where helpful, but you can paraphrase to be unambiguous. | |
| store | Yes | Which store this note applies to (short form 'acme-store-eu' or full 'acme-store-eu.myshopify.com'). | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| category | Yes | data_quirk = metrics are misleading; business_context = how to interpret the store's profile; strategic_constraint = don't recommend X; historical_event = pre-date data partial; excluded_segment = filter out Z from analysis. | |
| severity | No | info (default) = apply silently; warning = mention when relevant. Use warning when ignoring the note would mislead the merchant. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses that notes persist into future sessions, are flagged as AI-suggested, are reviewable/deletable from the dashboard, and prescribes a user confirmation message. It omits any auth/permission or rate-limit behavior, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and call condition, followed by filtering rules and the post-save message. Dense but every sentence carries instructional weight; the confirmation wording could arguably be trimmed but is operationally useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description covers the lifecycle an agent needs: when to save, what gets stored, how it's flagged, and how to report back to the user. Return-value detail is unnecessary here, leaving only minor gaps around error/permission behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description's examples map onto the enum values (e.g. 'one B2B customer is a reseller' → business_context, 'we exclude wholesale orders' → excluded_segment), teaching the practical use of categories beyond the schema's terse definitions. It adds no guidance on severity or _offset, so not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Save a new store-context note') and bounds the scope to 'something the USER told you that future sessions should know', which distinguishes it from siblings like save_insight and save_focus. An agent can tell immediately what this tool persists and why.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit invocation condition ('Only call this when the user reveals business context the data alone wouldn't show') plus explicit exclusions ('Do NOT save speculation, transient session state, or things already obvious from the data. Skip if uncertain'). Four concrete examples clarify the trigger and effectively route against the read/other-save siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_targetAInspect
Store a merchant's GOAL for a metric over a calendar period ('we need £80k this month'). TRIGGER: whenever the user states a target/goal/budget for a metric. This saves the merchant's own target in our DB (NOT a write-back to any connected tool). Pacing (are we on track?) is computed later on read by get_targets — never stored. Money metrics (revenue, aov, ltv, …) MUST be scoped to one store via store because the workspace can run multiple currencies; pass targetValue in MAJOR units (80000 for £80k). Non-money metrics (orders, cvr, refund_rate, …) may be workspace-wide (omit store). Setting a target for a slot that already has one supersedes the old target (history is kept). After saving, tell the user in one line what you logged.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Optional free-text context, e.g. 'stretch goal after the BFCM push'. | |
| store | No | Sub-store key (e.g. 'acme-store-us'). REQUIRED for money metrics. Omit for a workspace-wide non-money target. | |
| metric | Yes | Canonical metric key, e.g. 'revenue', 'orders', 'aov', 'cvr', 'refund_rate'. Validated against the metric registry. | |
| period | No | Calendar period the target is for. Defaults to 'month'. The target attaches to the CURRENT period of this type. | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| targetValue | Yes | The goal value in MAJOR currency units for money metrics (80000 = £80k), or the raw value for counts/percentages (1200 orders, 2.5 for 2.5% cvr). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses that data is stored in our own DB (not a connected-tool write-back), that pacing is intentionally not persisted, that an existing slot's target is superseded with history retained, and that it should confirm in one line afterward. These are rich, non-obvious behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose then constraint/trigger detail in dense, mostly non-redundant sentences. It is on the longer side, but nearly every clause (currency rule, storage location, supersede behavior, confirmation step) earns its place; minor tightening is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description covers what is stored, what is not stored, currency/store constraints, unit semantics, and the post-save expectation. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: money metrics MUST be scoped via `store` (currency reason), targetValue is in MAJOR units (80000 = £80k), and period attaches to the CURRENT period of that type. It only omits the odd `_offset` parameter, which the schema itself covers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Store a merchant's GOAL for a metric over a calendar period') with a concrete example. It explicitly distinguishes itself from the read-side sibling get_targets by noting pacing is never stored here. An agent can tell exactly what this does versus get_targets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit TRIGGER ('whenever the user states a target/goal/budget for a metric') and clarifies the read counterpart ('pacing ... computed later on read by get_targets'). It also notes this is not a write-back to a connected tool, ruling out a plausible misinterpretation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_wakeupAInspect
Create or update a scheduled wakeup. Create mode (no id): schedule a future analysis with context and a metric snapshot. Call when the merchant asks to check back later, OR proactively before a retail event or trend worth monitoring. At save time pull the relevant metrics and write context as instructions for your future self. Returns { id } — save that id to link the Claude routine. Update mode (with id): patch an existing wakeup — use this to link a Claude routine ID after creating it: save_wakeup({ id: 'abc', routineId: 'trig_...' }). The two systems work together: your wakeup holds the benchmarks and context; the Claude routine fires the session; the routine prompt includes the wakeup id so it calls get_wakeup(id) to retrieve everything it needs.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Wakeup UUID. Omit to create; provide to update an existing wakeup (e.g. to link a routineId after creating the Claude routine). | |
| name | No | Short label (≤80 chars). Required on create. | |
| store | No | Store domain (short or full). Required on create; ignored on update. | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| context | No | What to analyse when this fires and why it matters — instructions for your future self. Required on create. | |
| routineId | No | Claude remote routine ID (trig_...) to link to this wakeup. Set this in an update call after creating the routine. | |
| benchmarks | No | Current metric snapshot for before/after comparison. Be selective — only capture what's relevant to this check. | |
| triggerDate | No | YYYY-MM-DD. Required on create. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it does substantial work: it explains that create returns `{ id }`, that update patches an existing wakeup, that `store` is ignored on update, and how the wakeup interoperates with a Claude routine firing `get_wakeup(id)`. It stops short of stating permission requirements, reversibility, or rate limits, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the create/update mode split and bolded mode labels make it scannable. It is somewhat long and the closing sentences about the two systems overlap with the update-mode explanation, but every sentence carries useful routing or behavioral information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, nested-object tool with no output schema, the description covers mode selection, required-on-create fields, return shape (`{ id }`), and the routine linkage workflow. An agent has enough to call it correctly; only edge cases like error handling or required upstream state are unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3), and the description adds real meaning on top: it clarifies that the presence/absence of `id` selects create vs. update mode and explains the `routineId` linkage workflow that the schema only hints at.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create or update a scheduled wakeup') and immediately splits the two modes so an agent can distinguish create vs. update behavior. It also implicitly distinguishes the tool from read siblings like get_wakeup/get_wakeups by framing it as the scheduling/mutation action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names when to call it ('when the merchant asks to check back later, OR proactively before a retail event or trend worth monitoring') and when to use update mode ('to link a Claude routine ID after creating it'), even giving a concrete example call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_interventionAInspect
TRIGGER: Call WITHOUT asking whenever the user applies or ships a fix. 'Fix' covers any shipped change — SEO/copy/ads/UX/ops, AND code/schema/connector changes. Distinct from save_insights (which captures observations) — this is for tracking actions: 'I changed X, hypothesised Y, will measure at dates [a,b,c]'. Auto-captures the most recent matching snapshots as baseline (for each {store, metric} in trackedMetrics), so you don't have to manually record baselines first. Use complete_intervention later to capture the post-fix snapshots and compute deltas. INPUT-MINIMAL EXAMPLE: set_intervention({store: 'acme-store-us', type: 'technical_seo', description: 'Applied hreflang fix to product pages', trackedMetrics: ['organic_clicks', 'organic_ctr'], checkDates: ['2026-06-07','2026-07-07','2026-08-07']}). For code/connector fixes use type: 'connector_fix' or similar. Pass linkedInsightIds when this intervention closes the loop on existing insights. After saving, tell the user in one line what you logged.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Category of intervention. | |
| notes | No | Free-text context (excluded scope, caveats, etc.). | |
| store | No | The store/region this fix applies to. Either short ('acme-store-us') or full ('acme-store-us.myshopify.com') — both normalize. | |
| watch | No | Optional threshold watch evaluated on every get_briefing, so a breach SURFACES rather than being recomputed by hand each time. Shape: {metric:'orders'|'revenue', windowDays: 1-90, op:'lt'|'lte'|'gt'|'gte', threshold: number, note?: string}, e.g. {metric:'orders', windowDays:3, op:'lt', threshold:55}. Windows cover COMPLETE days only; an unsupported metric is rejected here rather than silently never firing. | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| appliedAt | No | ISO date (YYYY-MM-DD) the fix was ACTUALLY applied, for logging it retroactively (default: now). The baseline auto-lookup only considers snapshots within 60 days BEFORE this date — pass the real date so a retroactive log can still find an older-but-correct baseline instead of one anchored to today. Also anchors the auto-assigned checkDates horizon when checkDates isn't given. Must not be in the future. | |
| checkDates | No | ISO dates (YYYY-MM-DD) for planned check-ins, e.g. ['2026-06-07','2026-07-07','2026-08-07']. Stored for the dashboard / reminders; not enforced by the system. | |
| hypothesis | No | Why you think it'll work (e.g. 'US property losing clicks to UK; hreflang should restore correct routing'). | |
| description | Yes | What was actually changed (e.g. 'Added hreflang tags to all PDPs to fix country-mismatch issue'). | |
| trackedMetrics | No | Metrics to track for before/after comparison. Each entry is either a canonical metric key string (e.g. 'organic_clicks') OR an object {metric, segment?, source?} for dimensional pinning. Use the object form when a (metric, store) pair has snapshots across multiple segments or sources — otherwise the auto-baseline lookup is ambiguous and the call rejects with a list of candidates. Examples: ['cvr','aov'] (works when each metric has only one snapshot per store), [{metric:'organic_clicks',segment:'non_branded',source:'search-console'},{metric:'cvr',source:'ga4'}] (explicit dimensions per metric). | |
| expectedMetrics | No | Optional. Per-metric expectation, e.g. {organic_clicks: {deltaPercent: 15, direction: 'up'}}. Used at completion time to flag whether outcomes met expectations. | |
| linkedInsightIds | No | Insights this intervention is acting on (the original finding(s) that prompted it). Captured for traceability — they're not modified. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description clearly states side effects: it auto-captures baseline snapshots per {store, metric} in trackedMetrics, logs the intervention, and instructs the agent to tell the user one line after saving. It also notes the 60-day baseline window and the rejection behavior when auto-baseline lookup is ambiguous, which goes beyond the annotations (which are absent). Minus one because it doesn't explicitly state the destructive/read-only profile, but with no annotations at all, the description carries a reasonable burden and covers most observable behaviors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed but front-loaded, with the most important trigger and distinction at the start, and a concrete example near the beginning. It's long, but most sentences carry operational value: the example, baseline behavior, and per-parameter notes all earn their place. A small deduction for some redundancy (e.g., 'Distinct from save_insights...' appears before and the auto-baseline detail is repeated in appliedAt).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter, mutation-like tool with nested objects and no output schema or annotations, the description covers the call trigger, the post-call behavior, baseline semantics, parameter edge cases, and the relationship to sibling tools. There is no output schema, but the description still explains the outcome well enough ('After saving, tell the user in one line what you logged').
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 100% schema description coverage, the tool description actively adds meaning to several parameters: trackedMetrics gets an object/string distinction with an ambiguity rejection note, appliedAt gets a 60-day baseline context and retroactive logging guidance, watch gets a threshold-watch behavior explanation, and checkDates gets a 'not enforced' clarification. These go well beyond the schema and materially help an agent construct correct calls.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('set') and resource ('intervention'), defines the trigger explicitly ('Call WITHOUT asking whenever the user applies or ships a fix'), and clarifies what counts as a fix with examples. It also contrasts with the sibling tool save_insights and references complete_intervention, making its purpose distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit trigger condition, explicitly distinguishes from save_insights, explains when to use complete_intervention later, and includes an input-minimal example. It also covers enough edge conditions (code/connector fixes, linkedInsightIds, after-saving behavior) to be practically actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_focus_itemAInspect
Set the manual state of a single item in the current focus plan: 'in_progress' (started), 'dropped' (decided not to do it this week), or 'planned' (clear the overlay). NOTE: you can NOT set an item to 'done' here — completion is DERIVED from the linked finding becoming addressed or the intervention closing. To complete a 'tackle' item, ship the fix and call set_intervention (which addresses the finding); to complete a 'check' item, call complete_intervention. Get itemIds from get_focus.
| Name | Required | Description | Default |
|---|---|---|---|
| state | Yes | in_progress = started; dropped = retired for this week (kept for the record, excluded from progress); planned = clear the manual overlay. | |
| itemId | Yes | The focus item's id (from get_focus items[].id). | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that completion is DERIVED rather than set, that 'dropped' is kept for the record but excluded from progress, and that 'planned' clears the overlay. It does not cover permissions/auth or error behavior for invalid itemIds, leaving a small gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and states before the NOTE. Dense but each clause earns its place; the state definitions are slightly redundant with the enum descriptions in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description covers the action, allowed states, itemId provenance, and the critical derived-completion semantics plus cross-tool routing. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3), and the description adds beyond it by specifying the source of itemId ('Get itemIds from get_focus') and restating the state semantics. Marginal but genuine added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (set) and resource (manual state of a single item in the focus plan), then enumerates the three allowed states with their meanings. It also disambiguates from siblings by explicitly stating that 'done' is not settable here, so an agent can distinguish it from set_intervention/complete_intervention.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when-not-to-use ('you can NOT set an item to done here') and routes to the correct alternatives by item type ('tackle' -> set_intervention, 'check' -> complete_intervention). It also tells the agent where to obtain itemIds (get_focus).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_insightAInspect
Update an insight (a FINDING) — set its status, or edit its content. Allowed status: open / addressed / superseded / dismissed. Note: you normally don't set 'addressed' by hand — that happens automatically when set_intervention links this finding to a shipped fix. An insight carries NO fix verdict; 'did it work' lives on the linked intervention (see get_interventions). Use this to dismiss/supersede a finding, edit its text/tags, or attach evidence snapshots.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Replace the insight's tags with this list (e.g. ['seo','fix-applied']). Pass [] to clear all tags. | |
| notes | No | Free-text note about this finding. Stored alongside the insight for future reference. | |
| title | No | Updated title | |
| action | No | Updated action step | |
| delete | No | Remove this insight entirely — use when the user says it's not relevant or not an issue | |
| status | No | Workflow state. Setting status auto-syncs the legacy completed/dismissed mirror booleans. | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| addTags | No | Append these tags to the existing set without removing others. Useful for adding workflow tags like 'fix-applied' or '30-day-check' without overwriting. | |
| category | No | Updated category | |
| priority | No | Updated priority | |
| threadId | No | Set or change this insight's threadId directly. Use empty string to clear. | |
| completed | No | (Legacy) Mark as completed. Setting true without a status sets status='addressed'; false sets status='open'. | |
| dismissed | No | (Legacy) Mark as dismissed. Setting this to true without a status sets status='dismissed'. | |
| insightId | Yes | The insight ID to update | |
| removeTags | No | Remove these tags from the existing set, leaving others intact. | |
| description | No | Updated description | |
| linkSnapshotIds | No | Attach existing metric snapshots (record_metric_snapshot rows) to this insight as supporting evidence for the finding. Pass the snapshotIds (returned from query_metric_snapshots). The snapshots appear in get_insights(report: 'thread') timelines. Use this when snapshots were recorded without insightId — typical when you only learn the insight ID after saving. | |
| parentInsightId | No | Link this insight to a predecessor. The threadId is auto-managed: if the parent has one, it's inherited; otherwise a fresh threadId is generated and applied to both. Pass an empty string to detach the parent (and clear threadId if no other thread members reference it). | |
| unlinkSnapshotIds | No | Detach the given snapshotIds from this insight (sets their insightId to null). Use to correct a wrong link. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses the auto-sync of status to legacy booleans implicitly via the schema, the cross-tool coupling with set_intervention, and the conceptual boundary that fix verdicts live on the intervention, not the insight. It omits any warning that 'delete' is irreversible and says nothing about permissions or audit behavior, which is a gap for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then semantics, then cross-tool caveat. Every sentence is substantive, though the final sentence is a slightly list-like summary that partially repeats the opening framing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 19-parameter mutation tool with no annotations and no output schema, the description supplies the important conceptual model (insight vs intervention, status ownership, evidence linking) that the schema alone would not convey. It leaves destructive-delete irreversibility and legacy-field interactions to the schema, which mostly covers them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 19 parameters in detail; the baseline of 3 applies. The description adds conceptual meaning to the 'status' values and the relationship between 'addressed' and set_intervention, but does not clarify the many legacy or tagging parameters beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Update an insight (a FINDING)') with an explicit scope statement covering the two modes: set status or edit content. It clearly differentiates itself from get_insights, save_insights, and set_intervention, the latter of which it names directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names concrete use cases ('dismiss/supersede a finding, edit its text/tags, or attach evidence snapshots') and explicitly steers the agent away from manually setting 'addressed' because set_intervention does it automatically. The negative guidance ('you normally don't set addressed by hand') is exactly the kind of routing an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_interventionAInspect
TRIGGER: Call WITHOUT asking when an existing intervention's details need correcting — a check date that should move, a note to add, a hypothesis to sharpen, or a threshold watch to attach. Interventions could previously only be created and closed, so a wrong check date stayed wrong and surfaced as due on the wrong day; closing and re-creating is NOT a workaround, because it discards the captured baseline snapshots and the applied date. NOTES APPEND by default with a date stamp, since corrections accumulate — pass notesMode:'replace' only to deliberately overwrite. Verdict and status are not editable here: closing goes through complete_intervention so post-fix snapshots and deltas are captured with it. EXAMPLE: update_intervention({interventionId: '63f81dc3-...', removeCheckDates: ['2026-09-22'], addCheckDates: ['2026-09-25'], notes: 'Moved the check to the 25th — the 22nd fell before the campaign had 14 days of runtime.'}).
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Note to record. APPENDED under a date stamp by default, preserving earlier corrections. | |
| watch | No | Attach (or with null, clear) a threshold watch evaluated on every get_briefing, so a breach SURFACES instead of being recomputed by hand. Shape: {metric:'orders'|'revenue', windowDays: 1-90, op:'lt'|'lte'|'gt'|'gte', threshold: number, note?: string}. Example: {metric:'orders', windowDays:3, op:'lt', threshold:55}. Windows cover COMPLETE days only (today is excluded), and a window the order sync does not fully cover reports as indeterminate rather than breached. | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| notesMode | No | Default 'append'. Use 'replace' only when deliberately discarding the existing notes. | |
| checkDates | No | REPLACE the whole check-date set with these ISO dates (YYYY-MM-DD). To move a single date, prefer addCheckDates/removeCheckDates so the others cannot be dropped by accident. Cannot be combined with add/remove. | |
| hypothesis | No | Correct or sharpen why it was expected to work. | |
| description | No | Correct what was changed. | |
| addCheckDates | No | ISO dates to ADD, leaving the rest in place. Result is deduped and sorted. | |
| interventionId | Yes | The intervention to edit. Ids are per-shop — one from another store will not resolve. | |
| expectedMetrics | No | Replace the per-metric expectations, e.g. {orders: {deltaPercent: 10, direction: 'up'}}. | |
| removeCheckDates | No | ISO dates to REMOVE, leaving the rest in place. Pair with addCheckDates to move one date. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden and does it well. It discloses that notes append by default with a date stamp, that notesMode:'replace' deliberately overwrites, that verdict/status are not editable here, and that close/re-create discards baseline snapshots and the applied date. These are meaningful behavioral traits beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place: trigger condition, historical context, default behavior, exclusions, and a full example. It is front-loaded with the TRIGGER instruction and avoids filler while covering high-complexity semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter mutation tool with no annotations and no output schema, the description is remarkably complete. It explains when to invoke, what can and cannot be edited, how notes accumulate, why re-creating is harmful, and gives a concrete example. Nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all parameters. The description adds value by giving a complete invocation example, clarifying default notes behavior, and reinforcing the relationship between addCheckDates/removeCheckDates vs checkDates. It does not introduce new meaning for every parameter but adds enough context to exceed the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('update an existing intervention's details') and lists concrete correction cases: moving check dates, adding notes, sharpening a hypothesis, attaching a threshold watch. It also distinguishes itself from complete_intervention, making it clear what this tool is for and what it is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to call it ('when an existing intervention's details need correcting') and when not to ('Verdict and status are not editable here: closing goes through complete_intervention'). It also warns that closing and re-creating is NOT a workaround due to data loss, giving an agent concrete decision guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_store_profileAInspect
Correct a store's profile when the USER tells you it's wrong (e.g. 'we're actually a premium brand', 'people DO buy our products as gifts at Christmas', 'we're skincare not cosmetics'). Corrections are authoritative: they override the system's guess immediately AND survive the monthly auto-regeneration. ONLY call this from something the user stated about their own store — never from your own inference. giftLed especially matters: it controls whether retail gift-holidays are treated as relevant for this store. Confirm to the user once saved.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Free-text authoritative context to remember and feed into future profile regenerations. | |
| store | Yes | Which store to correct (short or full domain). Required. | |
| _offset | No | Pagination offset. If a response includes _pagination.hasMore=true, use _offset to fetch the next page. | |
| giftLed | No | True if products are typically bought as gifts for others; false for considered/self-purchase goods. Controls retail-calendar gift-event relevance. | |
| audience | No | Who the customer is. | |
| priceTier | No | Relative price positioning. | |
| brandTerms | No | Canonical brand terms (e.g. ['wills vegan','willsveganstore']) used to classify branded vs non-branded queries in get_connector_data(connector:'google-search-console', report:'branded_split'). Pin these when the auto-detected branded% looks wrong or differs between calls — pinned terms make the split deterministic across every caller. Accepts an array or a comma-separated string. | |
| positioning | No | How the store competes (e.g. ethical, budget, specialist). | |
| primaryCategory | No | Coarse category, e.g. 'Footwear', 'Skincare'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that corrections are authoritative, override the system guess immediately, and survive monthly auto-regeneration — persistence semantics that are not derivable from the schema. It also flags that giftLed has downstream effects on gift-holiday relevance and instructs confirmation to the user. It stops short of covering permissions/authorization or partial-failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the trigger condition and the hard constraint, then supporting detail. Every clause carries weight, including the parenthetical examples, which disambiguate the kind of correction intended. Slightly dense with example quotes but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter mutation tool with no annotations and no output schema, the description supplies the trigger, the authority/persistence model, the standout field, and the post-save confirmation behavior. The remaining parameters are fully covered by the schema, so nothing an agent needs to call it correctly is missing; only return-value detail is absent, and that is minor here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all nine parameters and a baseline of 3 applies. The description adds real meaning beyond the schema for giftLed, explaining why it matters (retail gift-holiday relevance) and emphasizing it as the high-stakes field, which is exactly the extra semantic layer the schema does not provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Correct a store's profile') and immediately bounds the scope to user-stated corrections, which cleanly separates it from read siblings like get_store_profile and set_intervention. The quoted user utterances make the intended trigger concrete rather than abstract.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call ('when the USER tells you it's wrong') and when not to ('ONLY call this from something the user stated about their own store — never from your own inference'). The negative constraint is the exact failure mode an agent would otherwise fall into, and it is stated unambiguously.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
- Changed
set_intervention1 field changed- added
Input schema / properties / watchAdded value: +{ + "description": "Optional threshold watch evaluated on every get_briefing, so a breach SURFACES rather than being recomputed by hand each time. Shape: {metric:'orders'|'revenue', windowDays: 1-90, op:'lt'|'lte'|'gt'|'gte', threshold: number, note?: string}, e.g. {metric:'orders', windowDays:3, op:'lt', threshold:55}. Windows cover COMPLETE days only; an unsupported metric is rejected here rather than silently never firing.", + "type": "object" +}
- Added
update_intervention
60 tool updates
- Added
complete_intervention - Added
get_abandoned_checkouts - Added
get_anomalies - Added
get_briefing - Added
get_campaign_impact - Added
get_cart_affinity - Added
get_collections - Added
get_complete_dashboard - Added
get_customer_insights - Added
get_customers - Added
get_daily_metrics - Added
get_data_sources - Added
get_discounts - Added
get_focus - Added
get_forecast - Added
get_help - Added
get_insights - Added
get_interventions - Added
get_inventory - Added
get_marketing_performance - Added
get_markets - Added
get_metrics_comparison - Added
get_metrics_multi_compare - Added
get_order - Added
get_orders - Added
get_product_analytics - Added
get_product_catalog - Added
get_product_health - Added
get_products_by_channel - Added
get_query_to_url - Added
get_refunds - Added
get_revenue_drivers - Added
get_spend_reconciliation - Added
get_store_notes - Added
get_store_profile - Added
get_store_summary - Removed
get_subscription_status - Added
get_sync_health - Added
get_targets - Added
get_timeline - Added
get_top_products - Added
get_velocity - Added
get_wakeup - Added
get_wakeups - Added
get_weekly_trends - Added
get_yoy_monthly - Added
query_metric_snapshots - Added
query_orders - Added
record_metric_snapshot - Added
report_concern - Added
report_data_issue - Added
save_focus - Added
save_insights - Added
save_store_note - Added
save_target - Added
save_wakeup - Added
set_intervention - Added
update_focus_item - Added
update_insight - Added
update_store_profile
60 tool updates
- Removed
complete_intervention - Removed
get_abandoned_checkouts - Removed
get_anomalies - Removed
get_briefing - Removed
get_campaign_impact - Removed
get_cart_affinity - Removed
get_collections - Removed
get_complete_dashboard - Removed
get_customer_insights - Removed
get_customers - Removed
get_daily_metrics - Removed
get_data_sources - Removed
get_discounts - Removed
get_focus - Removed
get_forecast - Removed
get_help - Removed
get_insights - Removed
get_interventions - Removed
get_inventory - Removed
get_marketing_performance - Removed
get_markets - Removed
get_metrics_comparison - Removed
get_metrics_multi_compare - Removed
get_order - Removed
get_orders - Removed
get_product_analytics - Removed
get_product_catalog - Removed
get_product_health - Removed
get_products_by_channel - Removed
get_query_to_url - Removed
get_refunds - Removed
get_revenue_drivers - Removed
get_spend_reconciliation - Removed
get_store_notes - Removed
get_store_profile - Removed
get_store_summary - Added
get_subscription_status - Removed
get_sync_health - Removed
get_targets - Removed
get_timeline - Removed
get_top_products - Removed
get_velocity - Removed
get_wakeup - Removed
get_wakeups - Removed
get_weekly_trends - Removed
get_yoy_monthly - Removed
query_metric_snapshots - Removed
query_orders - Removed
record_metric_snapshot - Removed
report_concern - Removed
report_data_issue - Removed
save_focus - Removed
save_insights - Removed
save_store_note - Removed
save_target - Removed
save_wakeup - Removed
set_intervention - Removed
update_focus_item - Removed
update_insight - Removed
update_store_profile
60 tool updates
- Added
complete_intervention - Added
get_abandoned_checkouts - Added
get_anomalies - Added
get_briefing - Added
get_campaign_impact - Added
get_cart_affinity - Added
get_collections - Added
get_complete_dashboard - Added
get_customer_insights - Added
get_customers - Added
get_daily_metrics - Added
get_data_sources - Added
get_discounts - Added
get_focus - Added
get_forecast - Added
get_help - Added
get_insights - Added
get_interventions - Added
get_inventory - Added
get_marketing_performance - Added
get_markets - Added
get_metrics_comparison - Added
get_metrics_multi_compare - Added
get_order - Added
get_orders - Added
get_product_analytics - Added
get_product_catalog - Added
get_product_health - Added
get_products_by_channel - Added
get_query_to_url - Added
get_refunds - Added
get_revenue_drivers - Added
get_spend_reconciliation - Added
get_store_notes - Added
get_store_profile - Added
get_store_summary - Removed
get_subscription_status - Added
get_sync_health - Added
get_targets - Added
get_timeline - Added
get_top_products - Added
get_velocity - Added
get_wakeup - Added
get_wakeups - Added
get_weekly_trends - Added
get_yoy_monthly - Added
query_metric_snapshots - Added
query_orders - Added
record_metric_snapshot - Added
report_concern - Added
report_data_issue - Added
save_focus - Added
save_insights - Added
save_store_note - Added
save_target - Added
save_wakeup - Added
set_intervention - Added
update_focus_item - Added
update_insight - Added
update_store_profile
1 tool update
- First observed
get_subscription_status
Related MCP Connectors
Ask data questions in natural language. Get SQL, insights, and charts from your databases.
- AdCrunchOAuthdev.adcrunch
Ask AI about your ads — query Meta, TikTok, and Google Ads performance in natural language.
Ask business questions in plain English. Get instant answers from your database, no SQL needed.
- mcp-serverOAuthco.flyweel
Access Google & Meta Ads data via AI. Analyse campaign performance in seconds.
Related MCP Servers
AlicenseNot gradedqualityDmaintenanceConnects e-commerce and marketing data sources like Shopify, GA4, Google Ads, and Meta Ads to AI assistants, enabling natural language queries about store performance, ad campaigns, and customer behavior.7 npm2MIT- FlicenseNot gradedqualityCmaintenanceHosted MCP server connecting Shopify, Klaviyo, GA4, Meta Ads, Google Ads, Xero, Gorgias and 20+ e-commerce data sources so AI assistants can answer merchant questions that span every source at once.-
- FlicenseNot gradedqualityDmaintenanceEnables e-commerce shop owners to query their business data using natural language through local AI models. Provides secure, privacy-focused access to sales reports, inventory management, customer analytics, and order data without sending sensitive information to external services.-
- AlicenseAqualityDmaintenanceProvides AI assistants with real-time access to Shopify store analytics, sales data, and inventory through ShopifyQL and the Admin GraphQL API. It enables users to query store performance, customer metrics, and marketing insights using natural language.13MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.