Tool tree
gradeNot graded
get_profileAnswer
Read the browser-local shopping profile before starting a mission. Returns saved department, styles, optional self-described identity, measurements, sizes, fit, colours, budget, and retailer preferences.
View tool JSON
{
"name": "get_profile",
"kind": "answer",
"impl": "imperative",
"description": "Read the browser-local shopping profile before starting a mission. Returns saved department, styles, optional self-described identity, measurements, sizes, fit, colours, budget, and retailer preferences.",
"inputSchema": {
"type": "object",
"properties": {},
"additionalProperties": false
}
}setup_profileAction
Create the minimal browser-local Rove profile. Existing data is preserved unless replaceExisting is explicitly true; optional preferences may be learned incrementally later with update_profile.
View tool JSON
{
"name": "setup_profile",
"kind": "act",
"impl": "imperative",
"description": "Create the minimal browser-local Rove profile. Existing data is preserved unless replaceExisting is explicitly true; optional preferences may be learned incrementally later with update_profile.",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The person’s first name."
},
"shoppingDepartment": {
"type": "string",
"enum": [
"women",
"men",
"all"
],
"description": "Department to prioritize."
},
"styles": {
"type": "array",
"items": {
"type": "string",
"enum": [
"minimal",
"streetwear",
"smart-casual",
"classic",
"old-money",
"sporty",
"y2k",
"avant-garde",
"quiet-luxury",
"athleisure",
"preppy",
"vintage",
"monochrome",
"techwear",
"boho"
]
},
"minItems": 3,
"maxItems": 10
},
"genderIdentity": {
"type": "string",
"description": "Optional self-described gender identity. Store only when explicitly supplied by the user."
},
"racialIdentity": {
"type": "string",
"description": "Optional self-described racial or cultural identity. It is preserved but never used to infer skin tone."
},
"heightCm": {
"type": "number",
"minimum": 80,
"maximum": 250
},
"weightKg": {
"type": "number",
"minimum": 20,
"maximum": 400
},
"clothingSizes": {
"type": "object",
"properties": {
"tops": {
"type": "string"
},
"bottoms": {
"type": "string"
},
"dresses": {
"type": "string"
},
"outerwear": {
"type": "string"
}
},
"additionalProperties": false
},
"shoeSize": {
"type": "string"
},
"preferredFit": {
"type": "string"
},
"preferredColours": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 20
},
"avoidedColours": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 20
},
"usualBudgetCad": {
"type": "number",
"minimum": 0.01
},
"preferredRetailerIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 40
},
"excludedRetailerIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 40
},
"destination": {
"type": "object",
"description": "Coarse delivery locality for Shop search context, e.g. from Shop get_account. Country and region only; never store a street address or postal code.",
"properties": {
"country": {
"type": "string",
"description": "ISO 3166-1 alpha-2, e.g. CA."
},
"region": {
"type": "string",
"description": "Province or state, e.g. ON."
}
},
"required": [
"country"
],
"additionalProperties": false
},
"replaceExisting": {
"type": "boolean",
"description": "Explicitly replace an existing profile."
}
},
"required": [
"name",
"shoppingDepartment"
],
"additionalProperties": false
}
}update_profileAction
Incrementally update saved browser-local shopping preferences without replacing omitted fields. Use only preferences the user supplied or approved.
View tool JSON
{
"name": "update_profile",
"kind": "act",
"impl": "imperative",
"description": "Incrementally update saved browser-local shopping preferences without replacing omitted fields. Use only preferences the user supplied or approved.",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"shoppingDepartment": {
"type": "string",
"enum": [
"women",
"men",
"all"
],
"description": "Department to prioritize."
},
"styles": {
"type": "array",
"items": {
"type": "string",
"enum": [
"minimal",
"streetwear",
"smart-casual",
"classic",
"old-money",
"sporty",
"y2k",
"avant-garde",
"quiet-luxury",
"athleisure",
"preppy",
"vintage",
"monochrome",
"techwear",
"boho"
]
},
"minItems": 3,
"maxItems": 10
},
"genderIdentity": {
"type": "string",
"description": "Optional self-described gender identity. Store only when explicitly supplied by the user."
},
"racialIdentity": {
"type": "string",
"description": "Optional self-described racial or cultural identity. It is preserved but never used to infer skin tone."
},
"heightCm": {
"type": "number",
"minimum": 80,
"maximum": 250
},
"weightKg": {
"type": "number",
"minimum": 20,
"maximum": 400
},
"clothingSizes": {
"type": "object",
"properties": {
"tops": {
"type": "string"
},
"bottoms": {
"type": "string"
},
"dresses": {
"type": "string"
},
"outerwear": {
"type": "string"
}
},
"additionalProperties": false
},
"shoeSize": {
"type": "string"
},
"preferredFit": {
"type": "string"
},
"preferredColours": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 20
},
"avoidedColours": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 20
},
"usualBudgetCad": {
"type": "number",
"minimum": 0.01
},
"preferredRetailerIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 40
},
"excludedRetailerIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 40
},
"destination": {
"type": "object",
"description": "Coarse delivery locality for Shop search context, e.g. from Shop get_account. Country and region only; never store a street address or postal code.",
"properties": {
"country": {
"type": "string",
"description": "ISO 3166-1 alpha-2, e.g. CA."
},
"region": {
"type": "string",
"description": "Province or state, e.g. ON."
}
},
"required": [
"country"
],
"additionalProperties": false
}
},
"additionalProperties": false
}
}start_shopping_searchAction
The one entry point for a new shopping request. Pass the person’s words as rawPrompt; Rove itself reads quantities ("three clothes and a perfume, two footwears"), the basket budget ("budget of $450 CAD"), the destination and climate, then allocates the budget and plans Shop and retailer research. Add structured needs only to refine that plan. If the person shared a photo, pass it as referenceImage (or describe it in visualCues): it becomes the style guide and drives a Shop visual search for every wearable need. Without a photo the mission runs entirely from the brief. Extract every store the person names, even without the words from/at. Supply unfamiliar names as constraints.storeNames or verified official domains as storeDomains. Named stores are hard restrictions: resolve their official domain through resolve_store before research. Use Rove search_shop_catalog for built-in anonymous Shop HTTP discovery (https://shop.com/skill.md and /shop.md); no local CLI, plugin or login is required. Use per-need store restrictions for mixed-retailer requests. Follow returned next steps, inspect Shop messages, and compare exact returned options before enrichment or adding to Your Thread. Only prepare merchant carts/checkouts on request; never complete payment.
View tool JSON
{
"name": "start_shopping_search",
"kind": "act",
"impl": "imperative",
"description": "The one entry point for a new shopping request. Pass the person’s words as rawPrompt; Rove itself reads quantities (\"three clothes and a perfume, two footwears\"), the basket budget (\"budget of $450 CAD\"), the destination and climate, then allocates the budget and plans Shop and retailer research. Add structured needs only to refine that plan. If the person shared a photo, pass it as referenceImage (or describe it in visualCues): it becomes the style guide and drives a Shop visual search for every wearable need. Without a photo the mission runs entirely from the brief. Extract every store the person names, even without the words from/at. Supply unfamiliar names as constraints.storeNames or verified official domains as storeDomains. Named stores are hard restrictions: resolve their official domain through resolve_store before research. Use Rove search_shop_catalog for built-in anonymous Shop HTTP discovery (https://shop.com/skill.md and /shop.md); no local CLI, plugin or login is required. Use per-need store restrictions for mixed-retailer requests. Follow returned next steps, inspect Shop messages, and compare exact returned options before enrichment or adding to Your Thread. Only prepare merchant carts/checkouts on request; never complete payment.",
"inputSchema": {
"type": "object",
"properties": {
"rawPrompt": {
"type": "string",
"description": "The user’s original shopping request."
},
"shoppingDepartment": {
"type": "string",
"enum": [
"women",
"men",
"all"
]
},
"stylePreferences": {
"type": "array",
"items": {
"type": "string",
"enum": [
"minimal",
"streetwear",
"smart-casual",
"classic",
"old-money",
"sporty",
"y2k",
"avant-garde",
"quiet-luxury",
"athleisure",
"preppy",
"vintage",
"monochrome",
"techwear",
"boho"
]
},
"maxItems": 10
},
"context": {
"type": "object",
"properties": {
"tripType": {
"type": "string"
},
"destination": {
"type": "string"
},
"climateHints": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 8
},
"occasions": {
"type": "array",
"items": {
"type": "string",
"enum": [
"dinner",
"date-night",
"work",
"casual",
"weekend",
"party",
"formal",
"travel",
"training",
"vacation",
"beach",
"resort"
]
},
"maxItems": 12
},
"notes": {
"type": "string"
}
},
"additionalProperties": false
},
"needs": {
"type": "array",
"maxItems": 12,
"items": {
"type": "object",
"properties": {
"intent": {
"type": "string"
},
"queries": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"maxItems": 10
},
"categories": {
"type": "array",
"items": {
"type": "string",
"enum": [
"tops",
"bottoms",
"dresses",
"outerwear",
"footwear",
"accessories",
"activewear",
"swimwear",
"fragrance"
]
},
"maxItems": 9
},
"required": {
"type": "boolean"
},
"quantity": {
"type": "number",
"minimum": 1,
"maximum": 20,
"description": "How many distinct products must fulfill this need. Defaults to 1."
},
"budgetCad": {
"type": "number",
"minimum": 0.01,
"description": "Maximum combined CAD subtotal for products selected for this need."
},
"retailerIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 40,
"description": "Hard store restriction for this need only. Use an empty array for an unrestricted need."
},
"storeDomains": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 10
},
"storeNames": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 10
}
},
"required": [
"intent",
"queries"
],
"additionalProperties": false
}
},
"referenceImage": {
"type": "object",
"description": "A photo the person shared as the style guide: base64 bytes, not a URL. Large images are resized in the browser.",
"properties": {
"content_type": {
"type": "string",
"description": "image/jpeg, image/png, or image/webp."
},
"data": {
"type": "string",
"description": "Base64-encoded image bytes."
}
},
"required": [
"content_type",
"data"
],
"additionalProperties": false
},
"inspirationId": {
"type": "string",
"description": "Use an image already on the inspiration board as the style guide."
},
"visualCues": {
"type": "object",
"description": "What you see in the reference photo. Rove ranks with these and adds them to Shop’s relevance hint.",
"properties": {
"palette": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 5,
"description": "Garment colours, e.g. white, tan, denim."
},
"descriptors": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 8,
"description": "Silhouette, fabric and style, e.g. relaxed linen, cropped, crochet."
}
},
"additionalProperties": false
},
"constraints": {
"type": "object",
"properties": {
"maxPriceCad": {
"type": "number",
"minimum": 0.01
},
"overallBudgetCad": {
"type": "number",
"minimum": 0.01,
"description": "Maximum CAD subtotal for the proposed products across all required needs."
},
"categories": {
"type": "array",
"items": {
"type": "string",
"enum": [
"tops",
"bottoms",
"dresses",
"outerwear",
"footwear",
"accessories",
"activewear",
"swimwear",
"fragrance"
]
},
"maxItems": 9
},
"storeDomains": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 10,
"description": "Verified official storefront domains for named stores outside the retailer registry. Rove applies a hard Shop shops filter and validates returned sellers."
},
"storeNames": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 10,
"description": "Unresolved store names; resolve_store must verify each official domain before research."
},
"retailerIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 40
},
"excludedRetailerIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 40
}
},
"additionalProperties": false
}
},
"required": [
"rawPrompt"
],
"additionalProperties": false
}
}claim_search_targetsAction
Claim a bounded batch of queued research targets, dynamically reprioritized around required mission needs that are still unfulfilled. Shop catalogue targets (sourceType "catalog") come first: call Rove search_shop_catalog for each requestIndex; the built-in anonymous HTTP connection needs no agent installation. Inspect real results and publish with shop provenance. Zero matches are no-results; actual connection failures are failed with the returned reason. Do not infer unavailability from missing agent tools. For retailer and discovery targets, open the returned need-specific search URLs and publish listing-page candidates. Resolve each target before claiming more.
View tool JSON
{
"name": "claim_search_targets",
"kind": "act",
"impl": "imperative",
"description": "Claim a bounded batch of queued research targets, dynamically reprioritized around required mission needs that are still unfulfilled. Shop catalogue targets (sourceType \"catalog\") come first: call Rove search_shop_catalog for each requestIndex; the built-in anonymous HTTP connection needs no agent installation. Inspect real results and publish with shop provenance. Zero matches are no-results; actual connection failures are failed with the returned reason. Do not infer unavailability from missing agent tools. For retailer and discovery targets, open the returned need-specific search URLs and publish listing-page candidates. Resolve each target before claiming more.",
"inputSchema": {
"type": "object",
"properties": {
"searchId": {
"type": "string"
},
"limit": {
"type": "number",
"description": "Batch size from 1 to 4. Defaults to 3.",
"minimum": 1,
"maximum": 4
},
"workerId": {
"type": "string",
"description": "Optional stable browser worker label for traceability."
}
},
"required": [
"searchId"
],
"additionalProperties": false
}
}search_shop_catalogAnswer
Run one exact planned Shop catalogue request directly from this browser. Works anonymously without a Shop plugin, CLI, account or local setup. First read the official Shop guide at https://shop.com/skill.md. Requires a claimed catalogue target; requestIndex defaults to zero. Returns original Shop evidence and every message; inspect sellers, exact options and currency before publishing. An empty result means no matches, not a disconnected Shop. On an actual error, use the retailer fallback with the returned reason. Never substitutes or broadens filters.
View tool JSON
{
"name": "search_shop_catalog",
"kind": "answer",
"impl": "imperative",
"description": "Run one exact planned Shop catalogue request directly from this browser. Works anonymously without a Shop plugin, CLI, account or local setup. First read the official Shop guide at https://shop.com/skill.md. Requires a claimed catalogue target; requestIndex defaults to zero. Returns original Shop evidence and every message; inspect sellers, exact options and currency before publishing. An empty result means no matches, not a disconnected Shop. On an actual error, use the retailer fallback with the returned reason. Never substitutes or broadens filters.",
"inputSchema": {
"type": "object",
"properties": {
"searchId": {
"type": "string"
},
"targetId": {
"type": "string"
},
"requestIndex": {
"type": "number",
"minimum": 0
}
},
"required": [
"searchId",
"targetId"
],
"additionalProperties": false
}
}inspect_shop_productAction
Read exact options, price and stock of a Shop product already published in this mission, through anonymous browser HTTP. Pass requestedOptions using exact returned names and labels. Inspect the effective response for substitutions before enrich_product. Does not add to a cart or purchase.
View tool JSON
{
"name": "inspect_shop_product",
"kind": "act",
"impl": "imperative",
"description": "Read exact options, price and stock of a Shop product already published in this mission, through anonymous browser HTTP. Pass requestedOptions using exact returned names and labels. Inspect the effective response for substitutions before enrich_product. Does not add to a cart or purchase.",
"inputSchema": {
"type": "object",
"properties": {
"searchId": {
"type": "string"
},
"productId": {
"type": "string"
},
"requestedOptions": {
"type": "array",
"maxItems": 6,
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"label": {
"type": "string"
}
},
"required": [
"name",
"label"
],
"additionalProperties": false
}
}
},
"required": [
"searchId",
"productId"
],
"additionalProperties": false
}
}resolve_storeAction
Before claiming research, resolve an unfamiliar store named in the brief to its verified official storefront domain. Visit the official site to establish the domain; do not invent it, pass a marketplace listing, or broaden the request to other merchants. If it cannot be verified, tell the person. Rove regenerates Shop requests with a hard shops filter.
View tool JSON
{
"name": "resolve_store",
"kind": "act",
"impl": "imperative",
"description": "Before claiming research, resolve an unfamiliar store named in the brief to its verified official storefront domain. Visit the official site to establish the domain; do not invent it, pass a marketplace listing, or broaden the request to other merchants. If it cannot be verified, tell the person. Rove regenerates Shop requests with a hard shops filter.",
"inputSchema": {
"type": "object",
"properties": {
"searchId": {
"type": "string"
},
"name": {
"type": "string"
},
"domain": {
"type": "string"
}
},
"required": [
"searchId",
"name",
"domain"
],
"additionalProperties": false
}
}publish_candidatesAction
Publish multiple products observed on a claimed retailer listing, or returned by Shop search_catalog for a claimed Shop catalogue target. For Shop results, set url to the featured variant url exactly as returned, image to its first media url, and copy product/variant/seller IDs into shop and product.options into shop.options so every size and colour is recorded; Rove converts shop.price minor units to a decimal price itself, but never converts currency: a non-CAD shop.price is rejected unless priceCad is a CAD price the seller actually shows. Every candidate must include its canonical product page URL, name, and a direct HTTP(S) product image URL so recommendations are never published without imagery. Rove derives canonical identity, retailer, source, and timestamp, then enforces target-domain, mission, department, category, retailer, budget, and CAD rules.
View tool JSON
{
"name": "publish_candidates",
"kind": "act",
"impl": "imperative",
"description": "Publish multiple products observed on a claimed retailer listing, or returned by Shop search_catalog for a claimed Shop catalogue target. For Shop results, set url to the featured variant url exactly as returned, image to its first media url, and copy product/variant/seller IDs into shop and product.options into shop.options so every size and colour is recorded; Rove converts shop.price minor units to a decimal price itself, but never converts currency: a non-CAD shop.price is rejected unless priceCad is a CAD price the seller actually shows. Every candidate must include its canonical product page URL, name, and a direct HTTP(S) product image URL so recommendations are never published without imagery. Rove derives canonical identity, retailer, source, and timestamp, then enforces target-domain, mission, department, category, retailer, budget, and CAD rules.",
"inputSchema": {
"type": "object",
"properties": {
"searchId": {
"type": "string"
},
"targetId": {
"type": "string"
},
"candidates": {
"type": "array",
"minItems": 1,
"maxItems": 40,
"items": {
"type": "object",
"properties": {
"url": {
"type": "string"
},
"name": {
"type": "string"
},
"retailer": {
"type": "string",
"description": "Used only for unknown retailers found through discovery; known identity is derived from the domain."
},
"brand": {
"type": "string"
},
"nativePrice": {
"type": "number",
"minimum": 0.01
},
"nativeCurrency": {
"type": "string"
},
"priceCad": {
"type": "number",
"description": "Required for non-CAD listings and budget-constrained missions.",
"minimum": 0.01
},
"image": {
"type": "string",
"description": "Required direct HTTP(S) URL for the product image observed on the retailer page. Do not use the product page URL, a search result, or a placeholder."
},
"imageWidth": {
"type": "number",
"minimum": 1
},
"imageHeight": {
"type": "number",
"minimum": 1
},
"category": {
"type": "string",
"enum": [
"tops",
"bottoms",
"dresses",
"outerwear",
"footwear",
"accessories",
"activewear",
"swimwear",
"fragrance"
]
},
"shoppingDepartment": {
"type": "string",
"enum": [
"women",
"men",
"all"
]
},
"needIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 12,
"description": "Mission need IDs this observed product can fulfill. IDs must be present on the claimed target."
},
"sizes": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 60,
"description": "Retailer listings: every size label the product page or listing offers, exactly as shown. Shop candidates use shop.options instead."
},
"colors": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 60,
"description": "Retailer listings: every colour label offered, exactly as shown."
},
"shop": {
"type": "object",
"description": "Required for Shop catalogue targets and rejected elsewhere. Copy values unchanged from the search_catalog product and its featured variant.",
"properties": {
"productId": {
"type": "string",
"description": "Returned product id, e.g. gid://shopify/p/…."
},
"checkoutUrl": {
"type": "string",
"description": "Copy the exact featured variant checkout_url, when returned. Never construct it."
},
"variantId": {
"type": "string",
"description": "Featured variant id, e.g. gid://shopify/ProductVariant/…."
},
"sellerDomain": {
"type": "string",
"description": "variant.seller.domain (the myshopify domain Shop uses for carts)."
},
"sellerId": {
"type": "string"
},
"sellerName": {
"type": "string"
},
"sellerUrl": {
"type": "string",
"description": "variant.seller.url (the storefront)."
},
"price": {
"type": "object",
"description": "variant.price unchanged: integer minor units plus ISO currency.",
"properties": {
"amount": {
"type": "number",
"minimum": 1
},
"currency": {
"type": "string"
}
},
"required": [
"amount",
"currency"
],
"additionalProperties": false
},
"available": {
"type": "boolean",
"description": "variant.availability.available."
},
"options": {
"type": "array",
"maxItems": 12,
"description": "product.options names and value labels (with available/exists when returned), e.g. [{\"name\":\"Size\",\"values\":[{\"label\":\"S\"},{\"label\":\"M\"}]}]. Records every size and colour the person can choose.",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"values": {
"type": "array",
"maxItems": 60,
"items": {
"type": "object",
"properties": {
"label": {
"type": "string"
},
"available": {
"type": "boolean"
},
"exists": {
"type": "boolean"
}
},
"required": [
"label"
],
"additionalProperties": false
}
}
},
"required": [
"name",
"values"
],
"additionalProperties": false
}
},
"selectedOptions": {
"type": "array",
"maxItems": 6,
"description": "variant.options unchanged, e.g. [{\"name\":\"Size\",\"label\":\"M\"}].",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"label": {
"type": "string"
}
},
"required": [
"name",
"label"
],
"additionalProperties": false
}
}
},
"required": [
"productId",
"sellerDomain"
],
"additionalProperties": false
}
},
"required": [
"url",
"name",
"image"
],
"additionalProperties": false
}
}
},
"required": [
"searchId",
"targetId",
"candidates"
],
"additionalProperties": false
}
}enrich_productAction
Hydrate one candidate after detailed inspection or user interest. Use the canonical product page to add variants, availability, material, description, tags, and any price details needed before cart selection. For Shop, send shopProductId, requestedOptions (the exact requested name/label pairs), and one exact returned variant with options, availability, price and checkoutUrl when returned. Compare the effective selection: a dropped option, changed volume, or substitute body wash is a mismatch, not a valid perfume. Rove rejects mismatches. Search results may verify the featured selection without another lookup; use get_product only for unresolved facts or different options. Never infer combinations from size lists. Strip HTML from descriptions.
View tool JSON
{
"name": "enrich_product",
"kind": "act",
"impl": "imperative",
"description": "Hydrate one candidate after detailed inspection or user interest. Use the canonical product page to add variants, availability, material, description, tags, and any price details needed before cart selection. For Shop, send shopProductId, requestedOptions (the exact requested name/label pairs), and one exact returned variant with options, availability, price and checkoutUrl when returned. Compare the effective selection: a dropped option, changed volume, or substitute body wash is a mismatch, not a valid perfume. Rove rejects mismatches. Search results may verify the featured selection without another lookup; use get_product only for unresolved facts or different options. Never infer combinations from size lists. Strip HTML from descriptions.",
"inputSchema": {
"type": "object",
"properties": {
"searchId": {
"type": "string"
},
"productId": {
"type": "string"
},
"name": {
"type": "string"
},
"brand": {
"type": "string"
},
"nativePrice": {
"type": "number",
"minimum": 0.01
},
"nativeCurrency": {
"type": "string"
},
"priceCad": {
"type": "number",
"minimum": 0.01
},
"image": {
"type": "string"
},
"imageWidth": {
"type": "number",
"minimum": 1
},
"imageHeight": {
"type": "number",
"minimum": 1
},
"category": {
"type": "string",
"enum": [
"tops",
"bottoms",
"dresses",
"outerwear",
"footwear",
"accessories",
"activewear",
"swimwear",
"fragrance"
]
},
"shoppingDepartment": {
"type": "string",
"enum": [
"women",
"men",
"all"
]
},
"colors": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 24
},
"sizes": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 24
},
"styleTags": {
"type": "array",
"items": {
"type": "string",
"enum": [
"minimal",
"streetwear",
"smart-casual",
"classic",
"old-money",
"sporty",
"y2k",
"avant-garde",
"quiet-luxury",
"athleisure",
"preppy",
"vintage",
"monochrome",
"techwear",
"boho"
]
},
"maxItems": 8
},
"occasionTags": {
"type": "array",
"items": {
"type": "string",
"enum": [
"dinner",
"date-night",
"work",
"casual",
"weekend",
"party",
"formal",
"travel",
"training",
"vacation",
"beach",
"resort"
]
},
"maxItems": 8
},
"description": {
"type": "string"
},
"material": {
"type": "string"
},
"availability": {
"type": "string",
"enum": [
"in-stock",
"limited",
"out-of-stock",
"unknown"
]
},
"shopProductId": {
"type": "string",
"description": "Copy the returned Shop product ID. A different product is rejected."
},
"requestedOptions": {
"type": "array",
"maxItems": 6,
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"label": {
"type": "string"
}
},
"required": [
"name",
"label"
],
"additionalProperties": false
},
"description": "Exact options sent to Shop, including Size, Color, Width, Finish, volume or accessory size. Omit only to verify the previously published selection. Returned options must match exactly; never silently relax them."
},
"variants": {
"type": "array",
"minItems": 1,
"maxItems": 1,
"description": "Shop catalogue products only: exact variants copied unchanged from Shop.",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "gid://shopify/ProductVariant/…"
},
"options": {
"type": "array",
"maxItems": 6,
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"label": {
"type": "string"
}
},
"required": [
"name",
"label"
],
"additionalProperties": false
}
},
"available": {
"type": "boolean"
},
"priceCad": {
"type": "number",
"minimum": 0.01
},
"url": {
"type": "string",
"description": "The complete returned variant URL, unchanged."
},
"checkoutUrl": {
"type": "string",
"description": "Exact checkout_url returned for this variant; never construct one."
},
"price": {
"type": "object",
"properties": {
"amount": {
"type": "number",
"minimum": 1
},
"currency": {
"type": "string"
}
},
"required": [
"amount",
"currency"
],
"additionalProperties": false
}
},
"required": [
"id",
"options",
"available"
],
"additionalProperties": false
}
}
},
"required": [
"searchId",
"productId"
],
"additionalProperties": false
}
}complete_search_targetAction
Resolve one claimed retailer as complete, no-results, or failed. Complete requires an accepted product; no-results and failed require a reason. When the mission ends with products, Rove starts a timed recommendation review before saving the result.
View tool JSON
{
"name": "complete_search_target",
"kind": "act",
"impl": "imperative",
"description": "Resolve one claimed retailer as complete, no-results, or failed. Complete requires an accepted product; no-results and failed require a reason. When the mission ends with products, Rove starts a timed recommendation review before saving the result.",
"inputSchema": {
"type": "object",
"properties": {
"searchId": {
"type": "string"
},
"targetId": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"complete",
"no-results",
"failed"
]
},
"note": {
"type": "string"
}
},
"required": [
"searchId",
"targetId",
"status"
],
"additionalProperties": false
}
}get_search_statusAnswer
Read the persisted mission, full visible collection, fulfillment, retailer coverage, timed recommendation review, and next action. During selective replacement, collection shows which products remain preserved and which IDs are being replaced. Expired reviews are accepted and saved locally.
View tool JSON
{
"name": "get_search_status",
"kind": "answer",
"impl": "imperative",
"description": "Read the persisted mission, full visible collection, fulfillment, retailer coverage, timed recommendation review, and next action. During selective replacement, collection shows which products remain preserved and which IDs are being replaced. Expired reviews are accepted and saved locally.",
"inputSchema": {
"type": "object",
"properties": {
"searchId": {
"type": "string",
"description": "Optional expected active search ID."
}
},
"additionalProperties": false
}
}get_productsAnswer
Page through the full visible mission edit, including products preserved during selective replacement plus fresh candidates. Supports cursor or offset, up to 100 records, plus retailer, category, and sort filters; returned IDs are valid for enrichment and cart actions.
View tool JSON
{
"name": "get_products",
"kind": "answer",
"impl": "imperative",
"description": "Page through the full visible mission edit, including products preserved during selective replacement plus fresh candidates. Supports cursor or offset, up to 100 records, plus retailer, category, and sort filters; returned IDs are valid for enrichment and cart actions.",
"inputSchema": {
"type": "object",
"properties": {
"searchId": {
"type": "string"
},
"cursor": {
"type": "string"
},
"offset": {
"type": "number",
"minimum": 0
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 100
},
"retailerId": {
"type": "string"
},
"category": {
"type": "string",
"enum": [
"tops",
"bottoms",
"dresses",
"outerwear",
"footwear",
"accessories",
"activewear",
"swimwear",
"fragrance"
]
},
"sort": {
"type": "string",
"enum": [
"recommended",
"price-asc",
"price-desc",
"newest"
]
}
},
"additionalProperties": false
}
}review_recommendationsAction
Resolve the pending recommendation review after research finishes. Accept everything, replace selected product IDs, or replace the entire set. Selective replacement removes only those IDs, keeps every other accepted item visible in the current edit, and excludes every previously shown product link from fresh research.
View tool JSON
{
"name": "review_recommendations",
"kind": "act",
"impl": "imperative",
"description": "Resolve the pending recommendation review after research finishes. Accept everything, replace selected product IDs, or replace the entire set. Selective replacement removes only those IDs, keeps every other accepted item visible in the current edit, and excludes every previously shown product link from fresh research.",
"inputSchema": {
"type": "object",
"properties": {
"searchId": {
"type": "string"
},
"decision": {
"type": "string",
"enum": [
"accept-all",
"replace-selected",
"replace-all"
]
},
"rejectedProductIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 20,
"description": "Required only for replace-selected. Use exact IDs returned in recommendationReview.productIds."
}
},
"required": [
"searchId",
"decision"
],
"additionalProperties": false
}
}research_againAction
Start another research pass from an accepted mission. Omit productIds to refresh the whole set, or provide presented product IDs to replace only those items while preserving every other accepted product in the visible edit. Previously shown product families are excluded.
View tool JSON
{
"name": "research_again",
"kind": "act",
"impl": "imperative",
"description": "Start another research pass from an accepted mission. Omit productIds to refresh the whole set, or provide presented product IDs to replace only those items while preserving every other accepted product in the visible edit. Previously shown product families are excluded.",
"inputSchema": {
"type": "object",
"properties": {
"searchId": {
"type": "string"
},
"productIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 20
}
},
"required": [
"searchId"
],
"additionalProperties": false
}
}get_research_historyAnswer
Read locally saved completed mission prompts and their final accepted product collections, plus compact style cues and the count of product families excluded from future research. Replacement chains are saved as one merged root mission, not disconnected partial missions.
View tool JSON
{
"name": "get_research_history",
"kind": "answer",
"impl": "imperative",
"description": "Read locally saved completed mission prompts and their final accepted product collections, plus compact style cues and the count of product families excluded from future research. Replacement chains are saved as one merged root mission, not disconnected partial missions.",
"inputSchema": {
"type": "object",
"properties": {},
"additionalProperties": false
}
}cancel_searchSensitive Action
Stop or explicitly abandon the active retailer pass, cancel every unresolved target, and preserve products already accepted for human review.
View tool JSON
{
"name": "cancel_search",
"kind": "transact",
"impl": "imperative",
"description": "Stop or explicitly abandon the active retailer pass, cancel every unresolved target, and preserve products already accepted for human review.",
"inputSchema": {
"type": "object",
"properties": {
"searchId": {
"type": "string"
},
"reason": {
"type": "string"
},
"disposition": {
"type": "string",
"enum": [
"cancelled",
"abandoned"
]
}
},
"required": [
"searchId"
],
"additionalProperties": false
}
}get_cartAnswer
Read the exact shared cross-store cart visible to the human, including selected variants, CAD subtotal, unpriced count, and canonical retailer checkout links.
View tool JSON
{
"name": "get_cart",
"kind": "answer",
"impl": "imperative",
"description": "Read the exact shared cross-store cart visible to the human, including selected variants, CAD subtotal, unpriced count, and canonical retailer checkout links.",
"inputSchema": {
"type": "object",
"properties": {},
"additionalProperties": false
}
}add_to_cartAction
Add an enriched mission product to the shared browser-local cart. Provide a size or colour only when that product exposes the corresponding choices. Shop products require a verified exact combination; use variantId and selectedOptions for all choices including fragrance volume, belt size, width and finish. Missing or sold-out combinations are rejected. Non-Shop products retain their existing size/colour flow. Exact product-and-variant duplicates are prevented.
View tool JSON
{
"name": "add_to_cart",
"kind": "act",
"impl": "imperative",
"description": "Add an enriched mission product to the shared browser-local cart. Provide a size or colour only when that product exposes the corresponding choices. Shop products require a verified exact combination; use variantId and selectedOptions for all choices including fragrance volume, belt size, width and finish. Missing or sold-out combinations are rejected. Non-Shop products retain their existing size/colour flow. Exact product-and-variant duplicates are prevented.",
"inputSchema": {
"type": "object",
"properties": {
"productId": {
"type": "string",
"description": "Exact Rove product ID returned by a product tool."
},
"size": {
"type": "string",
"description": "Available size when the product exposes size choices; otherwise omit."
},
"variantId": {
"type": "string",
"description": "Exact verified Shop variant ID. Use with selectedOptions for merchant-specific choices."
},
"selectedOptions": {
"type": "array",
"maxItems": 6,
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"label": {
"type": "string"
}
},
"required": [
"name",
"label"
],
"additionalProperties": false
}
},
"color": {
"type": "string",
"description": "Available colour when the product exposes colour choices; otherwise omit."
}
},
"required": [
"productId"
],
"additionalProperties": false
}
}remove_from_cartAction
Remove one exact cart entry by its collision-safe item ID. Read get_cart first when the item ID is unknown. The visible human cart updates immediately.
View tool JSON
{
"name": "remove_from_cart",
"kind": "act",
"impl": "imperative",
"description": "Remove one exact cart entry by its collision-safe item ID. Read get_cart first when the item ID is unknown. The visible human cart updates immediately.",
"inputSchema": {
"type": "object",
"properties": {
"itemId": {
"type": "string",
"description": "Exact cart item ID returned by get_cart."
}
},
"required": [
"itemId"
],
"additionalProperties": false
}
}get_checkout_planAnswer
Read Your Thread grouped by seller. Shop-backed groups list exact variant IDs and quantities for one Shop cart or checkout per seller; a line without variantId carries a ready get_product request that resolves it. Create Shop carts or checkouts only when the user asks to save a cart or check out, then call attach_merchant_cart with the returned continue_url. Other stores keep their retailer links. Rove never completes a purchase.
View tool JSON
{
"name": "get_checkout_plan",
"kind": "answer",
"impl": "imperative",
"description": "Read Your Thread grouped by seller. Shop-backed groups list exact variant IDs and quantities for one Shop cart or checkout per seller; a line without variantId carries a ready get_product request that resolves it. Create Shop carts or checkouts only when the user asks to save a cart or check out, then call attach_merchant_cart with the returned continue_url. Other stores keep their retailer links. Rove never completes a purchase.",
"inputSchema": {
"type": "object",
"properties": {},
"additionalProperties": false
}
}attach_merchant_cartAction
After creating a Shop cart or checkout for one get_checkout_plan seller group, store its continue_url unchanged so the human can continue to that merchant. Include the merchant-returned total and every warning or disclosure message. This records a handoff only; it does not place an order.
View tool JSON
{
"name": "attach_merchant_cart",
"kind": "act",
"impl": "imperative",
"description": "After creating a Shop cart or checkout for one get_checkout_plan seller group, store its continue_url unchanged so the human can continue to that merchant. Include the merchant-returned total and every warning or disclosure message. This records a handoff only; it does not place an order.",
"inputSchema": {
"type": "object",
"properties": {
"groupKey": {
"type": "string",
"description": "Exact key of a Shop-backed group from get_checkout_plan."
},
"continueUrl": {
"type": "string",
"description": "The complete continue_url returned by Shop, unchanged."
},
"cartId": {
"type": "string"
},
"total": {
"type": "object",
"description": "Merchant-returned total in integer minor units.",
"properties": {
"amount": {
"type": "number",
"minimum": 0
},
"currency": {
"type": "string"
}
},
"required": [
"amount",
"currency"
],
"additionalProperties": false
},
"messages": {
"type": "array",
"items": {
"type": "string"
},
"description": "Every returned warning and disclosure, verbatim."
}
},
"required": [
"groupKey",
"continueUrl"
],
"additionalProperties": false
}
}add_inspirationAction
Add one Pinterest pin to the shared inspiration board the human sees. Use the pin’s direct HTTPS image URL and its pin URL. While working a claimed Pinterest target, pass searchId and targetId so the pin counts toward that target. Pins become visual "Shop this look" searches through find_similar.
View tool JSON
{
"name": "add_inspiration",
"kind": "act",
"impl": "imperative",
"description": "Add one Pinterest pin to the shared inspiration board the human sees. Use the pin’s direct HTTPS image URL and its pin URL. While working a claimed Pinterest target, pass searchId and targetId so the pin counts toward that target. Pins become visual \"Shop this look\" searches through find_similar.",
"inputSchema": {
"type": "object",
"properties": {
"imageUrl": {
"type": "string",
"description": "Direct HTTPS image URL of the pin."
},
"sourceUrl": {
"type": "string",
"description": "The Pinterest pin URL."
},
"note": {
"type": "string",
"description": "A short description of the look, used as a text fallback."
},
"searchId": {
"type": "string"
},
"targetId": {
"type": "string",
"description": "The claimed discovery:pinterest target."
},
"needIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 12
}
},
"required": [
"imageUrl",
"sourceUrl"
],
"additionalProperties": false
}
}get_inspirationAnswer
Read the shared inspiration board. Uploaded photos include a ready Shop `like` image entry; pins include their image URL, whose bytes you fetch for a Shop `like` search.
View tool JSON
{
"name": "get_inspiration",
"kind": "answer",
"impl": "imperative",
"description": "Read the shared inspiration board. Uploaded photos include a ready Shop `like` image entry; pins include their image URL, whose bytes you fetch for a Shop `like` search.",
"inputSchema": {
"type": "object",
"properties": {},
"additionalProperties": false
}
}find_similarAnswer
Search for pieces like one product ("More like this") or one inspiration image ("Shop this look"). During an active mission this adds a Shop similarity target; otherwise it starts a focused follow-up mission. Then claim targets as usual. Shop products search by product ID; images search by bytes.
View tool JSON
{
"name": "find_similar",
"kind": "answer",
"impl": "imperative",
"description": "Search for pieces like one product (\"More like this\") or one inspiration image (\"Shop this look\"). During an active mission this adds a Shop similarity target; otherwise it starts a focused follow-up mission. Then claim targets as usual. Shop products search by product ID; images search by bytes.",
"inputSchema": {
"type": "object",
"properties": {
"productId": {
"type": "string",
"description": "Rove product ID."
},
"inspirationId": {
"type": "string",
"description": "Inspiration board item ID."
}
},
"additionalProperties": false
}
}record_purchasesAction
Tell Rove what the user bought so it stops recommending owned items and learns favourite brands. Use source "checkout" only after Shop returns status completed with an order; Rove then marks that seller’s handoff as Ordered. Use "order-history" for items from Shop search_orders. Send only seller domain, product link, brand, and order link: never addresses, emails, payment details, or prices.
View tool JSON
{
"name": "record_purchases",
"kind": "act",
"impl": "imperative",
"description": "Tell Rove what the user bought so it stops recommending owned items and learns favourite brands. Use source \"checkout\" only after Shop returns status completed with an order; Rove then marks that seller’s handoff as Ordered. Use \"order-history\" for items from Shop search_orders. Send only seller domain, product link, brand, and order link: never addresses, emails, payment details, or prices.",
"inputSchema": {
"type": "object",
"properties": {
"source": {
"type": "string",
"enum": [
"checkout",
"order-history"
]
},
"purchases": {
"type": "array",
"minItems": 1,
"maxItems": 50,
"items": {
"type": "object",
"properties": {
"sellerDomain": {
"type": "string",
"description": "Shop seller.domain; required for checkout."
},
"productUrl": {
"type": "string"
},
"brand": {
"type": "string"
},
"orderPermalink": {
"type": "string",
"description": "Returned permalink_url, unchanged, when present."
}
},
"additionalProperties": false
}
}
},
"required": [
"source",
"purchases"
],
"additionalProperties": false
}
}cart_proposed_basketAction
After the person accepts the proposed basket (or it auto-accepts), add every piece to Your Thread in their saved sizes. Pieces that still need a stock check or a size choice come back in needsAction with exact Shop, browser, or person steps; run them, then call this again. It never checks out.
View tool JSON
{
"name": "cart_proposed_basket",
"kind": "act",
"impl": "imperative",
"description": "After the person accepts the proposed basket (or it auto-accepts), add every piece to Your Thread in their saved sizes. Pieces that still need a stock check or a size choice come back in needsAction with exact Shop, browser, or person steps; run them, then call this again. It never checks out.",
"inputSchema": {
"type": "object",
"properties": {
"searchId": {
"type": "string",
"description": "Defaults to the current mission."
}
},
"additionalProperties": false
}
}