Ask AI
Qué hace este MCP
Answers questions about connected e-commerce data from Shopify, Klaviyo, GA4, Triple Whale, and other sources, covering sales, marketing, customers, inventory, attribution, and business performance.
Herramientas
Esquema de entrada
{'type': 'object', 'required': ['question'], 'properties': {'store': {'type': 'string', 'description': "For multi-store accounts: which store's TW instance to ask (matches the instance's store assignment). Omit for single-instance accounts."}, 'question': {'type': 'string', 'description': "The question, in natural language, as you would ask Triple Whale's UI assistant. Include the time window explicitly (e.g. 'in the last 30 days')."}}}
Esquema de entrada
{'type': 'object', 'required': ['interventionId', 'verdict'], 'properties': {'force': {'type': 'boolean', 'description': "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': {'type': 'string', 'description': "Optional note about what was observed, e.g. 'US clicks recovered but DE flatlined — partial win'."}, 'verdict': {'enum': ['lift_confirmed', 'lift_inconclusive', 'regressed', 'partial', 'abandoned'], 'type': 'string', 'description': 'Your verdict. The system also computes per-metric outcomes — your verdict is the overall judgment.'}, 'interventionId': {'type': 'string', 'description': 'The intervention to close.'}}}
Esquema de entrada
{'type': 'object', 'required': ['report'], 'properties': {'limit': {'type': 'integer', 'description': 'For top_products: number of products (default: 10)'}, 'report': {'enum': ['stats', 'top_products'], 'type': 'string', 'description': 'Report type'}, 'endDate': {'type': 'string', 'description': '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': {'type': 'string', 'description': 'Start date (YYYY-MM-DD). Defaults to a 30-day window ending yesterday.'}}}
Esquema de entrada
{'type': 'object', 'required': ['report'], 'properties': {'limit': {'type': 'integer', 'description': 'For by_country, top_products, and by_campaign: number of results (default: 20; by_campaign default 50)'}, 'medium': {'type': 'string', 'description': "For by_campaign: filter to a UTM medium, e.g. 'email' to isolate the email program. Omit to include all tagged campaigns."}, 'report': {'enum': ['summary', 'trend', 'by_channel', 'by_source', 'by_device', 'by_country', 'ecommerce', 'top_products', 'top_pages', 'by_campaign'], 'type': 'string', 'description': "Report type. Use 'by_source' for AI / ChatGPT / Perplexity / Claude / referrer-level traffic questions and 'what changed in my traffic sources'. Use 'top_pages' for most-visited pages or landing page conversion questions. Use 'by_campaign' (with medium:'email') to rank email/UTM campaigns by revenue."}, 'sortBy': {'enum': ['revenue', 'units', 'sessions', 'orders'], 'type': 'string', 'description': 'For top_products: revenue or units. For by_campaign: revenue (default), sessions, or orders.'}, 'compare': {'type': 'boolean', 'description': 'For by_source: attach the prior-window comparison (per-source deltas, newSources, disappearedSources, spam-referrer flag). Defaults to true; pass false to skip.'}, 'endDate': {'type': 'string', 'description': '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': {'type': 'string', 'description': 'Start date (YYYY-MM-DD). Overrides periodType. Defaults to a 30-day window ending yesterday.'}, 'periodType': {'enum': ['last7days', 'last30days', 'last90days', 'last365days'], 'type': 'string', 'description': 'Shorthand time window (default: last30days). Expanded to startDate/endDate automatically. Ignored if startDate is provided explicitly.'}, 'propertyId': {'type': 'string', 'description': "Filter to a specific GA4 property. Works on ALL reports. Use the exact propertyId from the summary response (e.g. 'properties/375762433'). Omit to get aggregated data across all properties. Always use this when the user asks about a specific store's traffic."}}}
Esquema de entrada
{'type': 'object', 'properties': {'lookbackWeeks': {'type': 'integer', 'description': 'How many prior weeks to use as baseline (default 4).'}}}
Esquema de entrada
{'type': 'object', 'properties': {'sinceDays': {'type': 'integer', 'description': "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."}}}
Esquema de entrada
{'type': 'object', 'properties': {'store': {'type': 'string', 'description': 'Filter to a specific store domain. Omit to query all connected stores.'}, 'campaignId': {'type': 'string', 'description': 'Klaviyo internal campaign ID (exact match). Use this when you already know it; otherwise use campaignName.'}, 'windowDays': {'type': 'integer', 'description': "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': {'type': 'string', 'description': 'Fuzzy match on campaign name (case-insensitive substring). Returns the most recent match; surfaces a disambiguation block if multiple found.'}}}
Esquema de entrada
{'type': 'object', 'required': ['report', 'productTitle'], 'properties': {'limit': {'type': 'integer', 'description': 'Number of co-products to return (default: 10, max: 25).'}, 'report': {'enum': ['basket', 'lifetime'], 'type': 'string', 'description': 'basket = same-order co-purchase; lifetime = same-customer across orders.'}, 'endDate': {'type': 'string', 'description': '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': {'type': 'string', 'description': "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': {'type': 'string', 'description': 'Anchor product title (case-insensitive substring match). Required.'}, 'minCoOccurrences': {'type': 'integer', 'description': '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.'}}}
Esquema de entrada
{'type': 'object', 'required': ['report'], 'properties': {'limit': {'type': 'integer', 'description': 'Number of results (default: 50)'}, 'report': {'enum': ['list', 'products'], 'type': 'string', 'description': 'Report type'}, 'endDate': {'type': 'string', 'description': 'For products: include sales data to this date (YYYY-MM-DD)'}, 'startDate': {'type': 'string', 'description': 'For products: include sales data from this date (YYYY-MM-DD)'}, 'collectionId': {'type': 'string', 'description': 'For products: Shopify collection ID'}, 'collectionTitle': {'type': 'string', 'description': 'For products: search by collection title (partial match)'}}}
Esquema de entrada
{'type': 'object', 'properties': {'endDate': {'type': 'string', 'description': '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': {'type': 'string', 'description': 'Start date (YYYY-MM-DD). Defaults to a 30-day window ending yesterday.'}}}
Esquema de entrada
{'type': 'object', 'required': ['connector', 'report'], 'properties': {'days': {'type': 'integer', 'description': 'For recharge upcoming_charges: FORWARD forecast window (default 30). For youtube top_videos and swish demand_trends: BACKWARD lookback window (default 7 / 30 respectively). Opposite directions between recharge and the lookback connectors — see get_help(connector).'}, 'view': {'type': 'string', 'description': 'For triple-whale journey/pps: breakdown view (by_type/by_source/by_country/by_device/funnel for journey; by_source/by_answer/response_rate/recent for pps).'}, 'limit': {'type': 'integer', 'description': "Number of results. Applies to: klaviyo, sendy, gorgias (tickets), recharge (cancellation_reasons), google-search-console, youtube, ringcentral (calls), reviewsio, triple-whale (attributions), smile (top_members), swish (top_products), woocommerce, google-ads (search_terms — terms per account, default 200, max 1000; campaigns with segment:'day' — campaigns expanded, default 10, max 20)."}, 'model': {'enum': ['Triple Attribution', 'Linear Paid', 'Linear All', 'Last Click', 'First Click'], 'type': 'string', 'description': "For triple-whale channel_by_model: which attribution model to read. Defaults to 'Triple Attribution'."}, 'query': {'type': 'string', 'description': 'For youtube search_transcripts: search query (required).'}, 'store': {'type': 'string', 'description': "For google-search-console: Shopify store key (e.g. 'acme-store-us') to auto-resolve the assigned property."}, 'metric': {'type': 'string', 'description': 'For klaviyo top_campaigns/top_flows: ranking metric (revenue, openRate, clickRate).'}, 'report': {'type': 'string', 'description': 'Report type — valid values depend on `connector`. See the tool description for the per-connector list, or get_help(connector) for full detail.'}, 'search': {'type': 'string', 'description': 'For gorgias tickets: case-insensitive keyword search across ticket subject and message body.'}, 'sortBy': {'type': 'string', 'description': "For google-search-console top_queries/top_pages: 'clicks' or 'impressions'. For smile top_members: 'pointsBalance', 'totalEarned', or 'totalSpent'."}, 'source': {'type': 'string', 'description': 'For triple-whale journey: filter to one acquisition source (google-ads, facebook-ads, organic, klaviyo, Direct). NOT the `connector` selector above.'}, 'status': {'type': 'string', 'description': "For klaviyo (campaigns/flows/top_flows — top_flows includes paused and archived flows unless you pass status:'live') / gorgias (tickets) / woocommerce (orders) / google-ads (campaign_settings — e.g. 'ENABLED' to drop long-paused campaigns): filter by status."}, '_offset': {'type': 'integer', 'description': 'For gorgias tickets: pagination offset (default: 0).'}, 'channel': {'type': 'string', 'description': 'For gorgias tickets: filter by channel. For triple-whale attributions/by_channel/product_attribution: filter by marketing channel.'}, 'endDate': {'type': 'string', 'description': 'End date (YYYY-MM-DD). Meaning/default varies slightly per connector — see get_help(connector).'}, 'groupBy': {'enum': ['channel', 'campaign'], 'type': 'string', 'description': 'For triple-whale channel_by_model: aggregation level.'}, 'orderBy': {'enum': ['publishedAt', 'viewCount', 'likeCount'], 'type': 'string', 'description': 'For youtube videos: sort field.'}, 'segment': {'enum': ['day'], 'type': 'string', 'description': "For google-ads campaigns: 'day' nests a per-day series inside each campaign, so a per-campaign daily view is ONE call instead of one per day. Tightens the campaign cap (see `limit`, default 10, max 20) since campaigns x days multiplies quickly."}, 'siteUrl': {'type': 'string', 'description': "For google-search-console: exact siteUrl from a connectedSites entry, e.g. 'sc-domain:example-store.com'."}, 'videoId': {'type': 'string', 'description': 'For youtube video_details: YouTube video ID (required).'}, 'category': {'enum': ['revenue', 'ads', 'customers', 'pixel', 'email'], 'type': 'string', 'description': 'For triple-whale summary: filter to a specific metric category.'}, 'interval': {'enum': ['day', 'week', 'month'], 'type': 'string', 'description': 'For klaviyo signup_trends: time interval.'}, 'maxScore': {'type': 'integer', 'description': 'For reviewsio unanswered: only show reviews with this rating or lower.'}, 'surveyId': {'type': 'string', 'description': 'For reviewsio survey_responses: filter to specific survey.'}, 'connector': {'enum': ['triple-whale', 'klaviyo', 'sendy', 'gorgias', 'recharge', 'google-search-console', 'clarity', 'youtube', 'reviewsio', 'google-ads', 'xero', 'ringcentral', 'smile', 'swish', 'woocommerce', 'meta-ads', 'tiktok-ads', 'shipstation'], 'type': 'string', 'description': 'Which third-party connector to query. Only connectors this shop has connected are valid — tools/list narrows this enum per shop; call get_data_sources if unsure.'}, 'dimension': {'enum': ['browser', 'device', 'os', 'country', 'source'], 'type': 'string', 'description': 'For clarity by_dimension: dimension to break down by (required).'}, 'direction': {'enum': ['all', 'improved', 'declined'], 'type': 'string', 'description': 'For google-search-console keyword_movers/page_ranking_changes: filter by ranking direction.'}, 'eventType': {'type': 'string', 'description': 'For triple-whale journey: filter to one event type (added_to_cart, signed_up, conversion, subscription, post_purchase_survey_submitted).'}, 'startDate': {'type': 'string', 'description': 'Start date (YYYY-MM-DD). Meaning/default varies slightly per connector — see get_help(connector).'}, 'brandTerms': {'type': 'string', 'description': 'For google-search-console branded_split: comma-separated brand terms (auto-detected if omitted).'}, 'campaignId': {'type': 'string', 'description': "For google-ads: restrict to one campaign. On campaign_settings it fetches just that campaign and expands its negative keyword text (one campaign is a bounded payload); on search_terms it filters the terms server-side, so the top-N and the spend-coverage figure are that campaign's rather than the whole account's."}, 'customerId': {'type': 'string', 'description': "For google-ads: customer ID to filter by (multi-account). Call with report='summary' first to see connected accounts."}, 'periodType': {'enum': ['last7days', 'last30days', 'last90days', 'last365days'], 'type': 'string', 'description': 'For triple-whale: shorthand ROLLING time window, anchored to today (default last30days). For a specific calendar range instead (e.g. a past month), omit this and pass startDate/endDate — summary then fetches that exact range live from Triple Whale rather than reading the rolling-window cache.'}, 'granularity': {'type': 'string', 'description': "For triple-whale by_channel: 'total' (default), 'daily', or 'by_store'. For smile points_activity: 'day', 'week', or 'month'."}, 'minImpressions': {'type': 'integer', 'description': 'For google-search-console cannibalization: minimum impressions (default 10).'}, 'expandNegatives': {'type': 'boolean', 'description': "For google-ads campaign_settings: include negative keyword TEXT as well as counts. Off by default because one campaign's negatives can fill the whole response; implied when campaignId is set."}, 'attributionModel': {'enum': ['fullLastClick', 'fullFirstClick', 'lastPlatformClick', 'linear', 'linearAll'], 'type': 'string', 'description': 'For triple-whale attributions/by_channel/product_attribution: which per-order attribution model to use.'}, 'newCustomersOnly': {'type': 'boolean', 'description': 'For triple-whale channel_by_model: restrict to new-customer orders only.'}}}
Esquema de entrada
{'type': 'object', 'required': ['report'], 'properties': {'limit': {'type': 'integer', 'description': 'For top_customers and lapsed_high_value: number of results (default: 20)'}, 'months': {'type': 'integer', 'description': 'For cohorts and retention_curve: number of months to look back for acquisition (default: 6 for cohorts, 12 for retention_curve)'}, 'report': {'enum': ['new_vs_returning', 'repeat_metrics', 'cohorts', 'retention_curve', 'by_category', 'cohorts_by_first_purchase', 'top_customers', 'lapsed_high_value'], 'type': 'string', 'description': 'Report type'}, 'sortBy': {'enum': ['totalSpent', 'orders'], 'type': 'string', 'description': 'For top_customers: sort by totalSpent or orders (default: totalSpent)'}, 'endDate': {'type': 'string', 'description': 'End date (YYYY-MM-DD)'}, 'minSpent': {'type': 'number', 'description': 'For lapsed_high_value: minimum lifetime spend in major units, e.g. 500 for £500 (default: 500)'}, 'startDate': {'type': 'string', 'description': 'Start date (YYYY-MM-DD)'}, 'daysInactive': {'type': 'integer', 'description': 'For lapsed_high_value: days since last order to count as lapsed (default: 90)'}, 'maxDaysInactive': {'type': 'integer', 'description': '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.'}}}
Esquema de entrada
{'type': 'object', 'required': ['report'], 'properties': {'tag': {'type': 'string', 'description': 'For customer_history: find customer by tag'}, 'rank': {'type': 'integer', 'description': 'For customer_history: look up customer by rank in top customers list (e.g. 1 = top spender)'}, 'tags': {'type': 'array', 'items': {'type': 'string'}, 'description': 'For tag_segments: tags to count explicitly and cross-tabulate (matched case-insensitively; always included even below minTagVolume).'}, 'limit': {'type': 'integer', 'description': 'Number of results (default: 10)'}, 'report': {'enum': ['segments', 'top', 'by_country', 'customer_history', 'tag_segments'], 'type': 'string', 'description': 'Report type'}, 'sortBy': {'type': 'string', 'description': 'For top: totalSpent or orders (default: totalSpent)'}, 'customerId': {'type': 'string', 'description': "For customer_history: Shopify customer ID (from the 'top' report's customerId field)"}, 'minTagVolume': {'type': 'integer', 'description': 'For tag_segments: also surface any other (non-requested) tag with at least this many customers in scope (default 200).'}, 'purchaserFilter': {'enum': ['non_purchasers', 'buyers', 'all'], 'type': 'string', 'description': 'For tag_segments: which cohort to segment (default non_purchasers = ordersCount 0).'}}}
Esquema de entrada
{'type': 'object', 'required': ['domain'], 'properties': {'limit': {'type': 'integer', 'description': 'For domain:"operational", report:"daily": number of days to return (default: 30).'}, 'domain': {'enum': ['funnel', 'revenue', 'operational'], 'type': 'string', 'description': 'Which daily-metrics domain to query. See the tool description for the report list and defaults per domain.'}, 'report': {'type': 'string', 'description': '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.'}, 'endDate': {'type': 'string', 'description': 'End date (YYYY-MM-DD). Defaults to yesterday (last fully-closed day) when omitted.'}, 'startDate': {'type': 'string', 'description': '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.'}}}
Esquema de entrada
{'type': 'object', 'properties': {}}
Esquema de entrada
{'type': 'object', 'required': ['report'], 'properties': {'code': {'type': 'string', 'description': 'For code_details: required. For by_product: optional filter by specific discount code.'}, 'limit': {'type': 'integer', 'description': 'For top_codes/by_product: number of results (default: 10/20)'}, 'report': {'enum': ['summary', 'top_codes', 'code_details', 'by_product'], 'type': 'string', 'description': 'Report type'}, 'sortBy': {'enum': ['revenue', 'usage', 'discount'], 'type': 'string', 'description': 'For top_codes: sort field'}, 'endDate': {'type': 'string', 'description': 'End date (YYYY-MM-DD)'}, 'startDate': {'type': 'string', 'description': 'Start date (YYYY-MM-DD)'}}}
Esquema de entrada
{'type': 'object', 'properties': {'top': {'type': 'integer', 'description': 'Target number of focus items (default 5, max 10). Affects the instruction sent to the model when refresh is needed.'}, 'refresh': {'type': 'boolean', 'description': "Re-plan from current data ('plan my week'). Supersedes the current plan and returns a fresh synthesis bundle. Default: false (returns the current plan)."}}}
Esquema de entrada
{'type': 'object', 'properties': {'store': {'type': 'string', 'description': "Sub-store key (e.g. 'acme-store-us'). Omit to forecast every store in the workspace (each in its own currency)."}, 'metric': {'enum': ['revenue', 'orders'], 'type': 'string', 'description': "Metric to forecast. Defaults to 'revenue'."}, 'horizon': {'type': 'integer', 'description': 'Number of future FULL months to project after the current one (1-3). Defaults to 1.'}}}
Esquema de entrada
{'type': 'object', 'properties': {'propertyId': {'type': 'string', 'description': "Filter to a specific GA4 property (e.g. 'properties/375762433'). Omit to use the configured property."}}}
Esquema de entrada
{'type': 'object', 'required': ['steps'], 'properties': {'steps': {'type': 'array', 'items': {'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'Display name for the step'}, 'event': {'type': 'string', 'description': "GA4 event name to filter on (e.g. 'add_to_cart'). Use get_ga4_dimensions to discover custom events."}, 'filterExpression': {'type': 'object', 'description': 'Advanced: a full GA4 FunnelFilterExpression instead of a simple event.'}}}, 'description': 'Ordered funnel steps. Each: { name, event } for a simple event filter, or { name, filterExpression } for a full GA4 FunnelFilterExpression.'}, 'endDate': {'type': 'string', 'description': 'End date (YYYY-MM-DD). Defaults to yesterday (GA4 data is T-1).'}, 'startDate': {'type': 'string', 'description': 'Start date (YYYY-MM-DD). Defaults to a 30-day window ending yesterday.'}, 'propertyId': {'type': 'string', 'description': "Filter to a specific GA4 property (e.g. 'properties/375762433'). Omit to use the configured property."}, 'breakdownDimension': {'type': 'string', 'description': "Optional dimension to segment the funnel by (e.g. 'deviceCategory', 'country')."}, 'nextActionDimension': {'type': 'string', 'description': "Optional dimension to analyse what users do after each step (e.g. 'eventName', 'pagePath')."}}}
Esquema de entrada
{'type': 'object', 'properties': {'topic': {'type': 'string', 'description': "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."}}}
Esquema de entrada
{'type': 'object', 'properties': {'tags': {'type': 'array', 'items': {'type': 'string'}, 'description': "Filter to insights that contain ANY of these tags (OR semantics). E.g. ['seo'] or ['paid']."}, 'report': {'enum': ['checklist', 'thread'], 'type': 'string', 'description': "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': {'description': "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."}, 'refresh': {'type': 'boolean', 'description': 'Set to true to generate fresh insights even if existing ones are present. Default: false — returns existing checklist.'}, 'category': {'enum': ['revenue', 'marketing', 'operations', 'customers', 'seo'], 'type': 'string', 'description': 'Filter to a single category.'}, 'threadId': {'type': 'string', 'description': 'Filter to a single thread (works on checklist and thread reports). Used to view a story end-to-end without category/tag filtering.'}, 'insightId': {'type': 'string', 'description': "For report: 'thread' — resolve the threadId from this insight and return the full thread (alternative to passing threadId directly)."}, 'includeCompleted': {'type': 'boolean', 'description': 'Default true. Set to false to return only active (open) insights.'}}}
Esquema de entrada
{'type': 'object', 'properties': {'type': {'type': 'string', 'description': 'Filter by category (technical_seo, paid_optimization, etc.).'}, 'limit': {'type': 'integer', 'description': 'Max results (default 30).'}, 'since': {'type': 'string', 'description': 'Only interventions appliedAt >= this date (YYYY-MM-DD).'}, 'store': {'type': 'string', 'description': 'Filter by store key.'}, 'report': {'enum': ['status', 'list', 'outcomes'], 'type': 'string', 'description': "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': {'enum': ['applied', 'under_review', 'closed', 'abandoned'], 'type': 'string', 'description': 'Filter by lifecycle status.'}, 'verdict': {'enum': ['lift_confirmed', 'lift_inconclusive', 'regressed', 'partial', 'abandoned'], 'type': 'string', 'description': 'Filter by closing verdict (only for closed interventions).'}, 'insightId': {'type': 'string', 'description': 'Only interventions that link back to this insight (via linkedInsightIds) — i.e. the fixes prompted by a specific finding.'}, 'dueForCheckIn': {'type': 'boolean', 'description': "If true, only return interventions whose next checkDate has passed and status is still 'applied'/'under_review'."}}}
Esquema de entrada
{'type': 'object', 'required': ['report'], 'properties': {'limit': {'type': 'integer', 'description': 'Number of products (default: 20)'}, 'report': {'enum': ['summary', 'low_stock', 'out_of_stock', 'by_location'], 'type': 'string', 'description': 'Report type'}, 'threshold': {'type': 'integer', 'description': 'For low_stock: stock level threshold (default: 10)'}}}
Esquema de entrada
{'type': 'object', 'properties': {'endDate': {'type': 'string', 'description': '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': {'type': 'string', 'description': 'Start date (YYYY-MM-DD). Defaults to a 30-day window ending yesterday.'}}}
Esquema de entrada
{'type': 'object', 'required': ['report'], 'properties': {'report': {'enum': ['markets', 'performance'], 'type': 'string', 'description': 'Report type: markets (configured markets and countries) or performance (revenue by market)'}, 'endDate': {'type': 'string', 'description': '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': {'type': 'string', 'description': 'Start date (YYYY-MM-DD). Defaults to a 30-day window ending yesterday.'}}}
Esquema de entrada
{'type': 'object', 'required': ['startDate', 'endDate'], 'properties': {'endDate': {'type': 'string', 'description': 'End date of current period (YYYY-MM-DD)'}, 'startDate': {'type': 'string', 'description': 'Start date of current period (YYYY-MM-DD)'}, 'comparison': {'enum': ['wow', 'mom', 'yoy', 'previous'], 'type': 'string', 'description': 'Comparison type: wow (week-over-week), mom (month-over-month), yoy (year-over-year), previous (equivalent previous period)'}, 'compareLabel': {'type': 'string', 'description': "Label for custom comparison period (e.g., 'Last Year Black Friday Sale')"}, 'compareEndDate': {'type': 'string', 'description': 'For custom comparison: end date of comparison period (YYYY-MM-DD)'}, 'compareStartDate': {'type': 'string', 'description': 'For custom comparison: start date of comparison period (YYYY-MM-DD)'}}}
Esquema de entrada
{'type': 'object', 'required': ['startDate', 'endDate'], 'properties': {'endDate': {'type': 'string', 'description': 'End date of current period (YYYY-MM-DD)'}, 'startDate': {'type': 'string', 'description': 'Start date of current period (YYYY-MM-DD)'}, 'comparisons': {'type': 'array', 'items': {'enum': ['wow', 'mom', 'yoy', 'previous'], 'type': 'string'}, 'description': "List of comparison types to include (default: ['wow', 'yoy'])"}, 'customComparisons': {'type': 'array', 'items': {'type': 'object', 'properties': {'label': {'type': 'string'}, 'endDate': {'type': 'string'}, 'startDate': {'type': 'string'}}}, 'description': "Custom comparison periods (e.g., last year's sale period)"}}}
Esquema de entrada
{'type': 'object', 'properties': {'orderId': {'type': 'string', 'description': "Shopify numeric order ID e.g. '5559266041988'"}, 'orderIds': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Array of Shopify numeric order IDs for batch lookup (max 50)'}, 'orderName': {'type': 'string', 'description': "Order name e.g. '#1001' or '1001'"}}}
Esquema de entrada
{'type': 'object', 'required': ['report'], 'properties': {'tag': {'type': 'string', 'description': 'For by_tag: focus a single order tag (case-insensitive). Omit to scan every tag and surface the ones dropping.'}, 'limit': {'type': 'integer', 'description': 'For by_country: number of countries (default: 10). For by_tag: max tags returned (default: 20).'}, 'report': {'enum': ['by_status', 'by_country', 'by_product', 'by_tag'], 'type': 'string', 'description': 'Report type'}, 'sortBy': {'enum': ['revenue', 'customers', 'units'], 'type': 'string', 'description': 'For by_product: sort field (default: revenue)'}, 'compare': {'enum': ['wow', 'mom', 'yoy', 'previous'], 'type': 'string', 'description': 'For by_country: attach a `comparison` block with rising/falling countries vs the WoW/MoM/YoY/previous-period window.'}, 'endDate': {'type': 'string', 'description': 'End date (YYYY-MM-DD)'}, 'lagDays': {'type': 'integer', 'description': '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': {'type': 'string', 'description': 'Start date (YYYY-MM-DD)'}, 'lookbackWeeks': {'type': 'integer', 'description': 'For by_tag: number of prior weekly windows to use as the baseline (default 4, range 2-12).'}}}
Esquema de entrada
{'type': 'object', 'required': ['report'], 'properties': {'limit': {'type': 'integer', 'description': 'Number of results (default: 20)'}, 'report': {'enum': ['summary', 'top_products', 'product_detail'], 'type': 'string', 'description': 'Report type'}, 'sortBy': {'enum': ['views', 'purchases', 'revenue'], 'type': 'string', 'description': 'For top_products: sort field (default: revenue)'}, 'endDate': {'type': 'string', 'description': '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': {'type': 'string', 'description': 'For product_detail: Shopify product ID'}, 'startDate': {'type': 'string', 'description': 'Start date (YYYY-MM-DD). Defaults to a 30-day window ending yesterday.'}}}
Esquema de entrada
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'description': 'Number of products (default: 20)'}, 'store': {'type': 'string', 'description': 'Filter to a specific store domain. Omit to query all connected stores.'}}}
Esquema de entrada
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'description': 'Max products to analyse, ordered by recent revenue (default: 50, max: 100).'}, 'store': {'type': 'string', 'description': 'Filter to a specific store domain. Omit to query all connected stores.'}, 'endDate': {'type': 'string', 'description': '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': {'type': 'string', 'description': 'Start of sales window (YYYY-MM-DD). Defaults to 30 days ago.'}, 'minAttentionScore': {'type': 'integer', 'description': 'Filter to products with attentionScore >= this value (default: 0 = all). Set to 30 to see only products with a flagged signal.'}}}
Esquema de entrada
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'description': 'Number of products to return (default: 10, max 100).'}, '_offset': {'type': 'integer', 'description': "Pagination offset. If a response's _pagination.hasMore is true, call again with _offset to page through the full set."}, 'endDate': {'type': 'string', 'description': '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': {'type': 'string', 'description': 'Start date (YYYY-MM-DD). Defaults to a 30-day window ending yesterday.'}}}
Esquema de entrada
{'type': 'object', 'required': ['report'], 'properties': {'url': {'type': 'string', 'description': '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': {'type': 'integer', 'description': 'Number of results (by_url: top queries to return; unconverting_pages / top_pages_with_sales: max URLs returned). Default 20.'}, 'report': {'enum': ['by_url', 'unconverting_pages', 'top_pages_with_sales'], 'type': 'string', 'description': 'Report type'}, 'endDate': {'type': 'string', 'description': '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': {'type': 'integer', 'description': "For unconverting_pages: maximum units sold for the matched product in the same window (default 2). 0 means 'pages with zero sales only'."}, 'minClicks': {'type': 'integer', 'description': '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': {'type': 'string', 'description': 'Start date (YYYY-MM-DD). Defaults to a 30-day window ending yesterday.'}}}
Esquema de entrada
{'type': 'object', 'required': ['report'], 'properties': {'limit': {'type': 'integer', 'description': 'For top_products and by_reason: number of results (default: 10)'}, 'report': {'enum': ['summary', 'top_products', 'by_reason'], 'type': 'string', 'description': 'Report type'}, 'sortBy': {'enum': ['amount', 'rate'], 'type': 'string', 'description': 'For top_products: sort field (default: amount)'}, 'compare': {'enum': ['wow', 'mom', 'yoy', 'previous'], 'type': 'string', 'description': 'For summary: attach a `comparison` block showing the same metrics for the WoW/MoM/YoY/previous-period window with percentage changes.'}, 'endDate': {'type': 'string', 'description': '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': {'type': 'string', 'description': 'Start date (YYYY-MM-DD). Defaults to a 30-day window ending yesterday.'}}}
Esquema de entrada
{'type': 'object', 'properties': {'store': {'type': 'string', 'description': 'Filter to a specific store domain.'}, 'endDate': {'type': 'string', 'description': 'End date (YYYY-MM-DD). Defaults to yesterday.'}, 'startDate': {'type': 'string', 'description': 'Start date (YYYY-MM-DD). Defaults to a 30-day window.'}, 'comparison': {'enum': ['previous', 'wow', 'mom', 'yoy'], 'type': 'string', 'description': 'Comparison window. Default: previous (equivalent prior period).'}}}
Esquema de entrada
{'type': 'object', 'required': ['report'], 'properties': {'sku': {'type': 'string', 'description': 'For search: filter to specific product SKU'}, 'limit': {'type': 'integer', 'description': 'Number of results'}, 'report': {'enum': ['summary', 'trends', 'top_rated', 'lowest_rated', 'recent', 'by_product', 'search', 'timing', 'sales_impact', 'themes'], 'type': 'string', 'description': 'Report type'}, 'endDate': {'type': 'string', 'description': 'End date (YYYY-MM-DD)'}, 'keyword': {'type': 'string', 'description': 'For search: keyword to find in review content'}, 'maxScore': {'type': 'integer', 'description': 'For recent/search: maximum star rating (1-5)'}, 'minScore': {'type': 'integer', 'description': 'For recent/search: minimum star rating (1-5)'}, 'provider': {'enum': ['yotpo', 'reviewsio', 'judge-me'], 'type': 'string', 'description': 'Review provider (auto-detected if omitted)'}, 'productId': {'type': 'string', 'description': 'For by_product/themes: Shopify product ID (numeric or GID) to scope to one product'}, 'startDate': {'type': 'string', 'description': 'Start date (YYYY-MM-DD)'}, 'minReviews': {'type': 'integer', 'description': 'For top_rated/lowest_rated: minimum review count (default: 3)'}, 'productTitle': {'type': 'string', 'description': 'For by_product/themes: product title (partial match, case-insensitive)'}}}
Esquema de entrada
{'type': 'object', 'properties': {'endDate': {'type': 'string', 'description': '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': {'type': 'string', 'description': 'Start date (YYYY-MM-DD). Defaults to a 30-day window ending yesterday.'}}}
Esquema de entrada
{'type': 'object', 'properties': {'store': {'type': 'string', 'description': 'Optional. Filter to a specific store. Omit to get notes for all stores the caller has access to.'}}}
Esquema de entrada
{'type': 'object', 'properties': {'store': {'type': 'string', 'description': 'Optional. Specific store (short or full domain). Omit for all stores in the workspace.'}}}
Esquema de entrada
{'type': 'object', 'properties': {'endDate': {'type': 'string', 'description': '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': {'type': 'string', 'description': 'Start date in ISO format (YYYY-MM-DD). Defaults to a 30-day window ending yesterday.'}}}
Esquema de entrada
{'type': 'object', 'properties': {}}
Esquema de entrada
{'type': 'object', 'properties': {'store': {'type': 'string', 'description': 'Only targets scoped to this sub-store key.'}, 'metric': {'type': 'string', 'description': 'Only targets for this metric.'}, 'period': {'enum': ['month', 'quarter', 'year'], 'type': 'string', 'description': 'Only targets for this period type.'}}}
Esquema de entrada
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'description': 'Max events to return (default 50, max 200).'}, 'store': {'type': 'string', 'description': 'Optional. Filter to a specific store (short or full domain). Omit for all stores the caller can see.'}, 'endDate': {'type': 'string', 'description': 'Window end (YYYY-MM-DD). Defaults to today.'}, 'startDate': {'type': 'string', 'description': 'Window start (YYYY-MM-DD). Defaults to 90 days before endDate.'}}}
Esquema de entrada
{'type': 'object', 'properties': {'level': {'enum': ['product', 'variant', 'category'], 'type': 'string', 'description': 'Grouping level: product (default), variant (by size/colour/SKU), or category (revenue/COGS/gross-profit/margin by product type)'}, 'limit': {'type': 'integer', 'description': 'Number of results (default: 10)'}, 'metric': {'type': 'string', 'description': 'Sort by: revenue or quantity (default: revenue)'}, 'compare': {'enum': ['wow', 'mom', 'yoy', 'previous'], 'type': 'string', 'description': 'Attach a `comparison` block with the top rising/falling/new products vs the WoW/MoM/YoY/previous-period window.'}, 'endDate': {'type': 'string', 'description': 'End date (YYYY-MM-DD)'}, 'startDate': {'type': 'string', 'description': 'Start date (YYYY-MM-DD)'}, 'productTitle': {'type': 'string', 'description': 'For variant level: filter to variants of a specific product (partial match)'}}}
Esquema de entrada
{'type': 'object', 'required': ['angle', 'report'], 'properties': {'days': {'type': 'integer', 'description': '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': {'enum': ['inventory', 'product'], 'type': 'string', 'description': 'Which velocity angle to query. See the tool description for the report list and defaults per angle.'}, 'limit': {'type': 'integer', 'description': 'For by_product: number of products (default: 20).'}, 'filter': {'enum': ['all', 'atRisk', 'overstocked', 'outOfStock'], 'type': 'string', 'description': 'For by_product: filter.'}, 'report': {'type': 'string', 'description': 'Report type — valid values depend on `angle` (see tool description): inventory has summary/by_product/restock; product has summary/by_product/trend/stagnant.'}, 'sortBy': {'enum': ['velocity', 'daysOfStock', 'risk'], 'type': 'string', 'description': 'For by_product: sort field.'}, 'maxOrders': {'type': 'integer', 'description': 'For angle:"product", report:"stagnant": max orders to count as stagnant (default: 0 = zero sales only, use 1-2 for near-zero).'}, 'productId': {'type': 'string', 'description': 'For angle:"product", report:"trend": Shopify product ID (required).'}, 'variantId': {'type': 'string', 'description': 'For angle:"product", report:"trend": Shopify variant ID (optional).'}, 'leadTimeDays': {'type': 'integer', 'description': 'For angle:"inventory", report:"restock": lead time in days (default: 14).'}, 'safetyStockDays': {'type': 'integer', 'description': 'For angle:"inventory", report:"restock": safety buffer days (default: 7).'}}}
Esquema de entrada
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'The wakeup UUID returned by save_wakeup.'}}}
Esquema de entrada
{'type': 'object', 'properties': {'store': {'type': 'string', 'description': 'Store domain (short or full). Omit to return wakeups for all stores in the workspace.'}, 'status': {'enum': ['pending', 'triggered', 'all'], 'type': 'string', 'description': "Filter by status. Default: 'all' — returns both pending and recently triggered (last 14 days)."}}}
Esquema de entrada
{'type': 'object', 'properties': {'weeks': {'type': 'integer', 'description': 'Number of weeks (default: 12)'}}}
Esquema de entrada
{'type': 'object', 'required': ['metric'], 'properties': {'store': {'type': 'string', 'description': "Filter by sub-store key (e.g. 'acme-store-us'). Omit to sum across all stores in the workspace."}, 'metric': {'type': 'string', 'description': "Metric key (e.g. 'revenue', 'orders', 'aov', 'cvr', 'sessions', 'tickets_total'). Must be one that has been captured as a calendar-month snapshot."}, 'source': {'type': 'string', 'description': "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)."}, 'compareYear': {'type': 'integer', 'description': 'Year to compare against. Defaults to currentYear - 1.'}, 'currentYear': {'type': 'integer', 'description': 'Year to use as the current side of the comparison. Defaults to the current calendar year (UTC).'}}}
Esquema de entrada
{'type': 'object', 'properties': {'list': {'type': 'boolean', 'description': "If true, returns the metric registry (canonical keys, units, descriptions). Use this when you don't know which metrics are available."}, 'limit': {'type': 'integer', 'description': 'Max snapshots to return (default 100, max 500)'}, 'store': {'type': 'string', 'description': "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': {'type': 'string', 'description': 'Canonical metric key. Omit to return snapshots across all metrics (filtered by other params).'}, 'source': {'type': 'string', 'description': "Filter by source ('shopify', 'ga4', 'tw', etc.)"}, 'endDate': {'type': 'string', 'description': 'Only include snapshots whose periodStart is <= this date (YYYY-MM-DD)'}, 'segment': {'type': 'string', 'description': 'Filter to a specific segment'}, 'insightId': {'type': 'string', 'description': 'Only snapshots linked to this insight'}, 'startDate': {'type': 'string', 'description': 'Only include snapshots whose periodEnd is >= this date (YYYY-MM-DD)'}, 'confidence': {'description': "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': {'enum': ['rolling', 'calendar', 'custom'], 'type': 'string', 'description': "Filter by period anchoring. 'calendar' = discrete buckets only; 'rolling' = trailing windows only. Mixing the two in a single time series silently distorts trends."}, 'periodLength': {'enum': ['day', 'week', 'month', 'quarter', 'year'], 'type': 'string', 'description': 'Filter by bucket size — combine with periodKind to e.g. fetch only calendar-month rows.'}}}
Esquema de entrada
{'type': 'object', 'properties': {'tags': {'type': 'array', 'items': {'type': 'string'}, 'description': "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': {'type': 'integer', 'description': 'Number of results (default: 20, max: 50)'}, 'offset': {'type': 'integer', 'description': 'Pagination offset'}, 'sortBy': {'enum': ['processedAt', 'totalPrice'], 'type': 'string', 'description': 'Sort field (default: processedAt)'}, 'status': {'enum': ['paid', 'pending', 'refunded', 'partially_refunded'], 'type': 'string', 'description': 'Filter by financial status'}, 'endDate': {'type': 'string', 'description': 'End date (YYYY-MM-DD). Defaults to yesterday.'}, 'maxTotal': {'type': 'number', 'description': 'Maximum order total in dollars'}, 'minTotal': {'type': 'number', 'description': 'Minimum order total in dollars'}, 'tagMatch': {'enum': ['any', 'all'], 'type': 'string', 'description': "How to match multiple tags: 'any' (default, order has at least one) or 'all' (order has every listed tag)."}, 'sortOrder': {'enum': ['asc', 'desc'], 'type': 'string', 'description': 'Sort order (default: desc)'}, 'startDate': {'type': 'string', 'description': 'Start date (YYYY-MM-DD). Defaults to a 30-day window ending yesterday.'}, 'customerId': {'type': 'string', 'description': 'Filter to orders for a specific customer (Shopify customer ID)'}}}
Esquema de entrada
{'type': 'object', 'required': ['snapshots'], 'properties': {'snapshots': {'type': 'array', 'items': {'type': 'object', 'required': ['metric', 'value', 'periodStart', 'periodEnd'], 'properties': {'unit': {'enum': ['percent', 'currency', 'count', 'days', 'ratio', 'position'], 'type': 'string', 'description': "Optional override; defaults to the registry unit for the metric. Use 'position' for ranks where 1.0 is best (e.g. avg_position) — distinct from 'count' (a quantity) and 'ratio' (a normalised number)."}, 'notes': {'type': 'string', 'description': "Optional free-text context the registry CAN'T already capture — scope, exclusions, sampling caveats. Good: 'excludes wholesale orders', 'country-filtered to GB only', 'branded + non-branded queries combined'. Don't bother restating things the registry/legend already provides — unit, direction (lower-is-better), or what the metric measures. For trust caveats (sampling/thresholding/window flakiness) prefer setting confidence + confidenceReason; reserve notes for the rest."}, 'store': {'type': 'string', 'description': "Optional sub-store / region key, e.g. 'acme-store-uk' or 'acme-store-uk.myshopify.com'. Either form is accepted and normalized to the short form for storage, so writes and reads always align."}, 'value': {'type': 'number', 'description': "Numeric value in the metric's canonical unit. percent: 0–100, currency: major units (e.g. 1500.50 GBP), count: integer, ratio: e.g. 4.2 for 4.2x ROAS."}, 'metric': {'type': 'string', 'description': "Canonical metric key (e.g. 'cvr', 'aov', 'roas', 'repeat_purchase_rate'). Must match the registry — unknown keys are rejected with a suggestion."}, 'source': {'type': 'string', 'description': "Where the number came from: 'shopify', 'ga4', 'tw', 'klaviyo', 'search-console', etc."}, 'segment': {'type': 'string', 'description': "Optional segment dimension, e.g. 'new', 'returning', 'GB', 'mobile'."}, 'currency': {'type': 'string', 'description': "ISO currency code when unit == 'currency', e.g. 'GBP', 'USD'."}, 'insightId': {'type': 'string', 'description': 'Optional — link this snapshot to an existing insight. ADDITIVE: re-recording with a different insightId adds the link without removing any prior links. The same snapshot can serve as evidence for multiple insights.'}, 'periodEnd': {'type': 'string', 'description': 'Period end (YYYY-MM-DD or ISO timestamp)'}, 'confidence': {'enum': ['high', 'medium', 'low'], 'type': 'string', 'description': "Trust signal for this snapshot. Default: omit (treated as 'high'). Drop to 'medium' or 'low' when a known caveat applies — e.g. EU country-level GA4 data is thresholded/sampled, Triple Whale recent-window data hasn't settled, currency may be mislabelled. Survives aggregation, so 'show me high-confidence CVR snapshots only' becomes a real query."}, 'insightIds': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Optional — link this snapshot to multiple insights at once. ADDITIVE: this UNIONS with any existing links; it never removes links. To remove a link, use update_insight(insightId, unlinkSnapshotIds: [...]).'}, 'periodKind': {'enum': ['rolling', 'calendar', 'custom'], 'type': 'string', 'description': "How the period is anchored. 'rolling' = trailing window ending at periodEnd (last 30 days, last 7 days, trailing 90d). 'calendar' = a discrete calendar bucket (April 2026, ISO week 18, Q1 2026, YTD). 'custom' = arbitrary range. Pair with periodLength so 'last 30 days' (rolling+month) is distinguishable from 'April 2026' (calendar+month) — otherwise time-series comparisons will silently mix the two."}, 'periodStart': {'type': 'string', 'description': 'Period start (YYYY-MM-DD or ISO timestamp)'}, 'periodLength': {'enum': ['day', 'week', 'month', 'quarter', 'year'], 'type': 'string', 'description': "Size of the period bucket. Omit when periodKind is 'custom' (arbitrary range). Examples: 'last 30 days' = month, 'last 7 days' = week, 'Q1 2026' = quarter, 'YTD' = year (with periodKind: calendar)."}, 'sourceParams': {'type': 'object', 'description': "Optional — the exact tool/report params that produced this value, for reproducibility. E.g. {tool: 'get_connector_data', connector: 'google-search-console', siteUrl: 'https://...', report: 'summary', startDate: '2025-12-01', endDate: '2025-12-31'}. Future-you can copy these straight into a new tool call to verify the number."}, 'baselineValue': {'type': 'number', 'description': 'Optional comparison baseline — typically the prior-period value of the same metric.'}, 'confidenceReason': {'type': 'string', 'description': "Optional one-line caveat explaining a non-high confidence, e.g. 'GA4 country thresholding', 'TW <72h window unstable', 'currency may be GBP mislabel'. Use the SAME phrasing for the same caveat across snapshots so the AI can group them."}, 'baselinePeriodEnd': {'type': 'string', 'description': 'Baseline period end'}, 'baselinePeriodStart': {'type': 'string', 'description': 'Baseline period start'}}}, 'description': 'Array of metric snapshots to record'}}}
Esquema de entrada
{'type': 'object', 'required': ['category', 'userQuote', 'description'], 'properties': {'category': {'enum': ['data_mismatch', 'incorrect_calculation', 'missing_data', 'confusing_output', 'slow_response', 'other'], 'type': 'string', 'description': "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': {'enum': ['low', 'medium', 'high'], 'type': 'string', 'description': "Inferred from how strongly the user voiced the concern. 'a bit weird' = low; 'this is definitely wrong' = high."}, 'toolName': {'type': 'string', 'description': 'The tool whose response prompted the concern, if known.'}, 'userQuote': {'type': 'string', 'description': "Verbatim what the user said, trimmed. Don't paraphrase."}, 'description': {'type': 'string', 'description': '1–2 sentences framing the concern technically. Include the data point in question.'}, 'expectedValue': {'type': 'string', 'description': "If the user said what they expected (e.g. 'should be around 500'), include it."}, 'responseSnippet': {'type': 'string', 'description': 'Relevant excerpt of the tool response that the user is questioning.'}}}
Esquema de entrada
{'type': 'object', 'required': ['category', 'description', 'toolName'], 'properties': {'category': {'enum': ['precision', 'type_mismatch', 'inconsistency', 'null_unexpected', 'schema_surprise'], 'type': 'string', 'description': "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': {'enum': ['low', 'medium', 'high'], 'type': 'string', 'description': 'low = cosmetic (extra decimals), medium = misleading but data still usable, high = data is unusable / breaks downstream logic.'}, 'toolName': {'type': 'string', 'description': "The tool whose response had the issue (e.g. 'get_metrics_comparison')."}, 'description': {'type': 'string', 'description': "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': {'type': 'string', 'description': 'Optional. The relevant fragment of the response, capped to ~2KB. Include just enough to make the issue reproducible.'}}}
Esquema de entrada
{'type': 'object', 'required': ['items'], 'properties': {'items': {'type': 'array', 'items': {'type': 'object', 'required': ['title', 'rationale', 'action', 'priority'], 'properties': {'tags': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Optional — domain/workflow tags.'}, 'type': {'enum': ['tackle', 'check', 'watch'], 'type': 'string', 'description': 'tackle = act on an open finding (link insightId); check = record the verdict on an intervention due for review (link interventionId); watch = monitor a metric/anomaly (set metric). Inferred from which id is present if omitted.'}, 'store': {'type': 'string', 'description': 'Optional — sub-store this applies to.'}, 'title': {'type': 'string', 'description': "Short headline (e.g. 'Fix DE/FR CVR gap')"}, 'action': {'type': 'string', 'description': 'Concrete next step the user should take'}, 'effort': {'type': 'string', 'description': "Effort estimate — 'high'/'medium'/'low' or a short phrase like '1 day eng + copy'"}, 'metric': {'type': 'string', 'description': "Optional — canonical metric key this targets (e.g. 'cvr', 'roas'). Use for 'watch' items."}, 'priority': {'type': 'integer', 'description': 'Rank — 1 is the most important. Items will be sorted by this.'}, 'insightId': {'type': 'string', 'description': "Link the open finding this maps to (type 'tackle'). Completion is derived from the finding becoming addressed."}, 'rationale': {'type': 'string', 'description': "Why now — reference specific numbers and what's behind the ranking"}, 'expectedImpact': {'type': 'string', 'description': "Expected impact — 'high'/'medium'/'low' or a short phrase like '£3-5k/mo if confirmed'"}, 'interventionId': {'type': 'string', 'description': "Link the intervention this maps to (type 'check'). Completion is derived from the intervention closing."}}}, 'description': 'Ordered focus items, top priority first'}, 'context': {'type': 'object', 'description': 'Optional snapshot of inputs used (e.g. {openInsights: 12, lastOutcomesWinRate: 60}). Stored verbatim for auditability.'}, 'replacePrevious': {'type': 'boolean', 'description': 'Default true — supersede the previous plan. Set false to keep history visible.'}}}
Esquema de entrada
{'type': 'object', 'required': ['insights'], 'properties': {'replace': {'type': 'boolean', 'description': 'Set to true to replace all active (non-completed) insights. Default: false (appends).'}, 'insights': {'type': 'array', 'items': {'type': 'object', 'required': ['title', 'description', 'action', 'category', 'priority'], 'properties': {'tags': {'type': 'array', 'items': {'type': 'string'}, 'description': "Free-form tags for filtering, e.g. ['seo','paid','fix-applied','30-day-check']. Use lowercase kebab-case and reuse existing tags where possible — these are queryable via get_insights(tags: [...])."}, 'store': {'type': 'string', 'description': "Which store this insight applies to (e.g. 'acme-store-de'). Omit for account-wide insights."}, 'title': {'type': 'string', 'description': "Short title (e.g. 'Reduce cart abandonment rate')"}, 'action': {'type': 'string', 'description': 'Specific action to take to fix/improve this'}, 'status': {'enum': ['open', 'addressed', 'superseded', 'dismissed'], 'type': 'string', 'description': "Workflow state. Default 'open'. Almost always omit (insights start open). 'addressed' = already acted on (normally set automatically when set_intervention links this finding); 'superseded' = replaced by a newer finding; 'dismissed' = not relevant."}, 'category': {'enum': ['revenue', 'marketing', 'operations', 'customers', 'seo'], 'type': 'string', 'description': 'Category'}, 'priority': {'enum': ['high', 'medium', 'low'], 'type': 'string', 'description': 'Priority level'}, 'threadId': {'type': 'string', 'description': 'Optional — explicit thread id to attach this insight to. If omitted but parentInsightId is set, the threadId is inherited from the parent. If both are omitted, the insight stands alone.'}, 'description': {'type': 'string', 'description': 'Why this matters — reference specific data points'}, 'parentInsightId': {'type': 'string', 'description': "Optional — the insightId this is a follow-up to (e.g. the original finding when saving 'fix-applied', or the fix when saving a 30-day check). The new insight inherits the parent's threadId; if the parent doesn't have one yet, a fresh threadId is generated and back-filled onto the parent so the whole story is grouped."}}}, 'description': 'Array of business insights to save (any number)'}}}
Esquema de entrada
{'type': 'object', 'required': ['store', 'category', 'text'], 'properties': {'text': {'type': 'string', 'description': "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': {'type': 'string', 'description': "Which store this note applies to (short form 'acme-store-eu' or full 'acme-store-eu.myshopify.com')."}, 'category': {'enum': ['data_quirk', 'business_context', 'strategic_constraint', 'historical_event', 'excluded_segment'], 'type': 'string', 'description': "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': {'enum': ['info', 'warning'], 'type': 'string', 'description': 'info (default) = apply silently; warning = mention when relevant. Use warning when ignoring the note would mislead the merchant.'}}}
Esquema de entrada
{'type': 'object', 'required': ['metric', 'targetValue'], 'properties': {'note': {'type': 'string', 'description': "Optional free-text context, e.g. 'stretch goal after the BFCM push'."}, 'store': {'type': 'string', 'description': "Sub-store key (e.g. 'acme-store-us'). REQUIRED for money metrics. Omit for a workspace-wide non-money target."}, 'metric': {'type': 'string', 'description': "Canonical metric key, e.g. 'revenue', 'orders', 'aov', 'cvr', 'refund_rate'. Validated against the metric registry."}, 'period': {'enum': ['month', 'quarter', 'year'], 'type': 'string', 'description': "Calendar period the target is for. Defaults to 'month'. The target attaches to the CURRENT period of this type."}, 'targetValue': {'type': 'number', 'description': '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).'}}}
Esquema de entrada
{'type': 'object', 'properties': {'id': {'type': 'string', 'description': 'Wakeup UUID. Omit to create; provide to update an existing wakeup (e.g. to link a routineId after creating the Claude routine).'}, 'name': {'type': 'string', 'description': 'Short label (≤80 chars). Required on create.'}, 'store': {'type': 'string', 'description': 'Store domain (short or full). Required on create; ignored on update.'}, 'context': {'type': 'string', 'description': 'What to analyse when this fires and why it matters — instructions for your future self. Required on create.'}, 'routineId': {'type': 'string', 'description': 'Claude remote routine ID (trig_...) to link to this wakeup. Set this in an update call after creating the routine.'}, 'benchmarks': {'type': 'object', 'description': "Current metric snapshot for before/after comparison. Be selective — only capture what's relevant to this check."}, 'triggerDate': {'type': 'string', 'description': 'YYYY-MM-DD. Required on create.'}}}
Esquema de entrada
{'type': 'object', 'required': ['type', 'description'], 'properties': {'type': {'enum': ['technical_seo', 'paid_optimization', 'email_optimization', 'content_change', 'pricing_change', 'inventory_change', 'site_speed', 'ux_improvement', 'other'], 'type': 'string', 'description': 'Category of intervention.'}, 'notes': {'type': 'string', 'description': 'Free-text context (excluded scope, caveats, etc.).'}, 'store': {'type': 'string', 'description': "The store/region this fix applies to. Either short ('acme-store-us') or full ('acme-store-us.myshopify.com') — both normalize."}, 'watch': {'type': 'object', '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."}, 'appliedAt': {'type': 'string', 'description': "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': {'type': 'array', 'items': {'type': 'string'}, 'description': "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': {'type': 'string', 'description': "Why you think it'll work (e.g. 'US property losing clicks to UK; hreflang should restore correct routing')."}, 'description': {'type': 'string', 'description': "What was actually changed (e.g. 'Added hreflang tags to all PDPs to fix country-mismatch issue')."}, 'trackedMetrics': {'type': 'array', 'items': {'oneOf': [{'type': 'string'}, {'type': 'object', 'required': ['metric'], 'properties': {'metric': {'type': 'string'}, 'source': {'type': 'string'}, 'segment': {'type': 'string'}}}]}, 'description': "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': {'type': 'object', 'description': "Optional. Per-metric expectation, e.g. {organic_clicks: {deltaPercent: 15, direction: 'up'}}. Used at completion time to flag whether outcomes met expectations."}, 'linkedInsightIds': {'type': 'array', 'items': {'type': 'string'}, 'description': "Insights this intervention is acting on (the original finding(s) that prompted it). Captured for traceability — they're not modified."}}}
Esquema de entrada
{'type': 'object', 'required': ['itemId', 'state'], 'properties': {'state': {'enum': ['in_progress', 'planned', 'dropped'], 'type': 'string', 'description': 'in_progress = started; dropped = retired for this week (kept for the record, excluded from progress); planned = clear the manual overlay.'}, 'itemId': {'type': 'string', 'description': "The focus item's id (from get_focus items[].id)."}}}
Esquema de entrada
{'type': 'object', 'required': ['insightId'], 'properties': {'tags': {'type': 'array', 'items': {'type': 'string'}, 'description': "Replace the insight's tags with this list (e.g. ['seo','fix-applied']). Pass [] to clear all tags."}, 'notes': {'type': 'string', 'description': 'Free-text note about this finding. Stored alongside the insight for future reference.'}, 'title': {'type': 'string', 'description': 'Updated title'}, 'action': {'type': 'string', 'description': 'Updated action step'}, 'delete': {'type': 'boolean', 'description': "Remove this insight entirely — use when the user says it's not relevant or not an issue"}, 'status': {'enum': ['open', 'addressed', 'superseded', 'dismissed'], 'type': 'string', 'description': 'Workflow state. Setting status auto-syncs the legacy completed/dismissed mirror booleans.'}, 'addTags': {'type': 'array', 'items': {'type': 'string'}, 'description': "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': {'enum': ['revenue', 'marketing', 'operations', 'customers', 'seo'], 'type': 'string', 'description': 'Updated category'}, 'priority': {'enum': ['high', 'medium', 'low'], 'type': 'string', 'description': 'Updated priority'}, 'threadId': {'type': 'string', 'description': "Set or change this insight's threadId directly. Use empty string to clear."}, 'completed': {'type': 'boolean', 'description': "(Legacy) Mark as completed. Setting true without a status sets status='addressed'; false sets status='open'."}, 'dismissed': {'type': 'boolean', 'description': "(Legacy) Mark as dismissed. Setting this to true without a status sets status='dismissed'."}, 'insightId': {'type': 'string', 'description': 'The insight ID to update'}, 'removeTags': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Remove these tags from the existing set, leaving others intact.'}, 'description': {'type': 'string', 'description': 'Updated description'}, 'linkSnapshotIds': {'type': 'array', 'items': {'type': 'string'}, 'description': "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': {'type': 'string', 'description': "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': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Detach the given snapshotIds from this insight (sets their insightId to null). Use to correct a wrong link.'}}}
Esquema de entrada
{'type': 'object', 'required': ['interventionId'], 'properties': {'notes': {'type': 'string', 'description': 'Note to record. APPENDED under a date stamp by default, preserving earlier corrections.'}, 'watch': {'type': 'object', 'description': "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."}, 'notesMode': {'enum': ['append', 'replace'], 'type': 'string', 'description': "Default 'append'. Use 'replace' only when deliberately discarding the existing notes."}, 'checkDates': {'type': 'array', 'items': {'type': 'string'}, 'description': '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': {'type': 'string', 'description': 'Correct or sharpen why it was expected to work.'}, 'description': {'type': 'string', 'description': 'Correct what was changed.'}, 'addCheckDates': {'type': 'array', 'items': {'type': 'string'}, 'description': 'ISO dates to ADD, leaving the rest in place. Result is deduped and sorted.'}, 'interventionId': {'type': 'string', 'description': 'The intervention to edit. Ids are per-shop — one from another store will not resolve.'}, 'expectedMetrics': {'type': 'object', 'description': "Replace the per-metric expectations, e.g. {orders: {deltaPercent: 10, direction: 'up'}}."}, 'removeCheckDates': {'type': 'array', 'items': {'type': 'string'}, 'description': 'ISO dates to REMOVE, leaving the rest in place. Pair with addCheckDates to move one date.'}}}
Esquema de entrada
{'type': 'object', 'required': ['store'], 'properties': {'note': {'type': 'string', 'description': 'Free-text authoritative context to remember and feed into future profile regenerations.'}, 'store': {'type': 'string', 'description': 'Which store to correct (short or full domain). Required.'}, 'giftLed': {'type': 'boolean', 'description': 'True if products are typically bought as gifts for others; false for considered/self-purchase goods. Controls retail-calendar gift-event relevance.'}, 'audience': {'type': 'string', 'description': 'Who the customer is.'}, 'priceTier': {'enum': ['value', 'mid', 'premium'], 'type': 'string', 'description': 'Relative price positioning.'}, 'brandTerms': {'type': 'array', 'items': {'type': 'string'}, 'description': "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': {'type': 'string', 'description': 'How the store competes (e.g. ethical, budget, specialist).'}, 'primaryCategory': {'type': 'string', 'description': "Coarse category, e.g. 'Footwear', 'Skincare'."}}}
Cambios recientes en herramientas
Servidores MCP similares
Neonjelly
Analyzes Shopify stores, products, apps, traffic, competitors, catalog changes, market cohorts and outreach contacts across a lar…
wildberries-agent-integration
Analyzes Wildberries seller sales, inventory, regional performance, competition, SEO, replenishment, weather relationships, and u…
AMZScout Skill + MCP
Provides Amazon product, niche, brand, keyword, sales, pricing, competition, and PPC research data.
signals
Provides paid competitive intelligence on ecommerce brands, including prices, promotions, links, competitors, stock history, and …
Shopify Change Intelligence
Monitors public Shopify stores for product, price, inventory, and competitive landscape changes.
Decision Intelligence
Analyzes supplied app reviews, advertising evidence, and US retail data to identify regressions, ad changes, pricing, availabilit…
KDP Niche Research
Researches Kindle publishing niches using demand, competition, ranking, revenue, pricing, and review metrics.
Eevy
Supports Shopify conversion-rate optimization through analytics, experimentation, content authoring, and lift measurement.