Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,533Letters: 13Defects: 1,322counted just now
teppi

Server definition

Hash
sha256:6b934caf7ca9c1c239474207f1a037c79209a17f8664844cbaa6a0a57c624d7d
What it is
What a remote MCP server returned when asked what it offers: 67 tools

The blob, as servednamed by its sha256

{ "instructions": "An Obriym CRM user can belong to MULTIPLE workspaces (isolated businesses).\nEvery tool operates exactly one workspace — the one this connection is bound to. Nothing in a tool payload can change that.\nSign-in (OAuth) connections of a user with several workspaces start LOCKED: every data tool first asks the client to show a workspace selection form when supported; otherwise it returns WORKSPACE_SELECTION_REQUIRED with the workspace list in structured content. Never choose a workspace for the user yourself.\nAfter the user selects a workspace, call select_workspace with that organization id, then retry the user's original CRM request.\nBefore creating or changing data in a session, verify the bound workspace with get_workspace_info and tell the user which workspace you are operating.\nSign-in (OAuth) connections: use list_workspaces to see the user's workspaces and select_workspace to re-bind this connection when the user asks to work in another workspace.\nAPI-token connections are permanently fixed to the workspace that issued the token — to work in another workspace, use a token created there.\nEvery write-tool result echoes the workspace it landed in — repeat it to the user when confirming an action.", "tools": [ { "description": "Add a line item to an existing order by its externalId. Recomputes the order total. Use list_orders or create_order for the order externalId, and search_products to quote a real product. The result echoes the operating workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "discount": { "default": 0, "description": "Percentage discount on this line (0-100). Default 0.", "maximum": 100, "minimum": 0, "type": "number" }, "externalId": { "description": "The order externalId returned by list_orders or create_order.", "minLength": 1, "type": "string" }, "productName": { "description": "Line item name, snapshotted onto the order. Use search_products to quote a real catalog product's name. Required.", "maxLength": 255, "minLength": 1, "type": "string" }, "quantity": { "description": "Quantity ordered (integer, at least 1).", "exclusiveMinimum": 0, "maximum": 9007199254740991, "type": "integer" }, "sku": { "description": "Product SKU snapshot (from search_products). Optional.", "maxLength": 120, "type": "string" }, "unitPrice": { "anyOf": [ { "pattern": "^\\d+(\\.\\d{1,2})?$", "type": "string" }, { "minimum": 0, "type": "number" } ], "description": "Price per unit in the order currency, as a decimal (e.g. 199.99). Snapshotted onto the line." } }, "required": [ "productName", "quantity", "unitPrice", "externalId" ], "type": "object" }, "name": "add_order_item", "outputSchema": null }, { "description": "Move a product stock by a relative delta (negative to write off, positive to add) with a reason, and record it in the stock history. This is the correct tool for a correction, a write-off or damage — it never sets an absolute number, so an order committing at the same moment is not overwritten. The reason decides the direction: write_off, damage and return_to_supplier must carry a negative delta, opening_balance a positive one, while correction and other accept either; a delta that contradicts its reason is rejected. Any other word is your own vocabulary and is accepted in either direction. The product must already track inventory; a product that does not returns a conflict rather than having tracking switched on for it. A bundle also returns a conflict: its stock is derived from its components, so adjust each component instead. Pass a stable externalId to make a retry idempotent. The new stock is pushed to every connected sales channel. The result echoes the operating workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "delta": { "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "externalId": { "maxLength": 160, "minLength": 1, "type": "string" }, "metadata": { "additionalProperties": {}, "propertyNames": { "type": "string" }, "type": "object" }, "note": { "maxLength": 1000, "minLength": 1, "type": "string" }, "productId": { "minLength": 1, "type": "string" }, "reason": { "maxLength": 120, "minLength": 1, "type": "string" } }, "required": [ "delta", "productId", "reason" ], "type": "object" }, "name": "adjust_stock", "outputSchema": null }, { "description": "Archive up to 100 products — this is how an AI client removes a product. It leaves sale and every sales channel's feed, and nothing is erased: update_product with status active or draft restores it. Hard deletion is not available over MCP. A product that a non-archived bundle is made of is NOT archived: it is listed in heldByBundle with the bundles that contain it — archive or change those bundles first. Archiving also asks Prom to take the product's listings down; notAttempted counts takedowns not reached in time. To end a live eBay listing use withdraw_ebay_listings. Returns { affected, skipped, notAttempted, heldByBundle } — skipped products were already archived. Idempotent. The result echoes the workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "productIds": { "description": "The products to archive, at most 100 ids from search_products.", "items": { "description": "A product id returned by search_products.", "minLength": 1, "type": "string" }, "maxItems": 100, "minItems": 1, "type": "array" } }, "required": [ "productIds" ], "type": "object" }, "name": "archive_products", "outputSchema": null }, { "description": "Assign a lead to a workspace member by user id, or pass assignedTo=null to unassign. Use search_leads to find the lead id and get_workspace_info to confirm the operating workspace. The result echoes the operating workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "assignedTo": { "anyOf": [ { "maxLength": 160, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "User id of the workspace member to assign the lead to. Pass null to unassign." }, "id": { "description": "The lead id returned by search_leads.", "minLength": 1, "type": "string" } }, "required": [ "assignedTo", "id" ], "type": "object" }, "name": "assign_lead", "outputSchema": null }, { "description": "Check locally which products a marketplace will refuse and why — missing price, unusable price, blank name, unmapped category — grouped by what fixes them, without calling the marketplace. The response separates `blocked` (these products do NOT go out) from `warnings` (these DO go out, but probably will not be published as the merchant expects: a price in a currency the platform does not name, no words of their own in a language the channel reads, a placeholder description, characteristics the marketplace does not recognise). Available for prom and rozetka; other platforms report their connection state through get_marketplace instead. This never publishes anything: it reports what would happen.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "platform": { "description": "The marketplace slug returned by list_marketplaces (prom, rozetka, olx, amazon, ebay, shopify, woocommerce).", "minLength": 1, "type": "string" } }, "required": [ "platform" ], "type": "object" }, "name": "check_channel_readiness", "outputSchema": null }, { "description": "Mark an activity (task, call, or meeting) as completed by its id. Use list_activities first to find the activity id. The result echoes the operating workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "id": { "description": "The activity id returned by list_activities.", "minLength": 1, "type": "string" } }, "required": [ "id" ], "type": "object" }, "name": "complete_activity", "outputSchema": null }, { "description": "Update an existing pipeline stage's name, default probability, or WIP limit. Provide the stage id (from list_pipeline_stages) and the fields to change. Stage order and terminal behavior are fixed. The result echoes the operating workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "id": { "description": "The pipeline stage id returned by list_pipeline_stages.", "minLength": 1, "type": "string" }, "patch": { "additionalProperties": false, "description": "Pipeline stage fields to update: name, default probability, WIP limit or position.", "properties": { "defaultProbability": { "description": "Default win probability for deals in this stage, 0-100.", "maximum": 100, "minimum": 0, "type": "integer" }, "name": { "description": "Display name of the pipeline stage.", "maxLength": 120, "minLength": 1, "type": "string" }, "wipLimit": { "anyOf": [ { "maximum": 999, "minimum": 1, "type": "integer" }, { "type": "null" } ], "description": "Work-in-progress limit (max deals allowed in the stage). Null or omit for no limit." } }, "required": [ "defaultProbability", "name" ], "type": "object" } }, "required": [ "id", "patch" ], "type": "object" }, "name": "configure_pipeline", "outputSchema": null }, { "description": "Convert a lead into a contact, company, and/or deal (select at least one via the input flags). Sets the lead status to converted. Use search_leads first to find the lead id. The result echoes the operating workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "id": { "description": "The lead id returned by search_leads.", "minLength": 1, "type": "string" }, "input": { "additionalProperties": false, "description": "Conversion options that decide whether to create/link contact, company and deal records.", "properties": { "companyName": { "description": "Name for the company to create. Required when createCompany is true.", "maxLength": 255, "type": "string" }, "contactFirstName": { "description": "First name for the contact to create. Required when createContact is true.", "maxLength": 120, "type": "string" }, "contactLastName": { "description": "Last name for the contact to create. Optional.", "maxLength": 120, "type": "string" }, "createCompany": { "default": false, "description": "Create (or link) a company from the lead. Default false.", "type": "boolean" }, "createContact": { "default": false, "description": "Create (or link) a contact from the lead. Default false.", "type": "boolean" }, "createDeal": { "default": false, "description": "Create an open pipeline deal from the lead. Default false.", "type": "boolean" }, "dealAmount": { "description": "Deal amount, as a decimal string. Used when createDeal is true.", "pattern": "^\\d+(\\.\\d{1,2})?$", "type": "string" }, "dealNextActionDate": { "description": "ISO 8601 next-action date for the created deal. Used when createDeal is true.", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$", "type": "string" }, "dealNextActionNote": { "description": "Next-action note for the created deal. Used when createDeal is true.", "maxLength": 500, "type": "string" }, "dealTitle": { "description": "Title for the created deal. Required when createDeal is true.", "maxLength": 255, "type": "string" } }, "type": "object" } }, "required": [ "id", "input" ], "type": "object" }, "name": "convert_lead", "outputSchema": null }, { "description": "Create an activity (task, call, meeting, email, or note). Must link to at least one lead, contact, company, or deal — use search_leads/search_contacts/search_companies/search_deals to get the entity id. The result echoes the operating workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "assignedTo": { "anyOf": [ { "maxLength": 160, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "User id of the workspace member to assign the activity to; null/omit for unassigned." }, "companyId": { "anyOf": [ { "maxLength": 160, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "Company id to link the activity to (from search_companies). Link at least one entity." }, "contactId": { "anyOf": [ { "maxLength": 160, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "Contact id to link the activity to (from search_contacts). Link at least one entity." }, "dealId": { "anyOf": [ { "maxLength": 160, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "Deal id to link the activity to (from search_deals). Link at least one entity." }, "description": { "anyOf": [ { "description": "Detailed description or notes. Optional.", "maxLength": 5000, "type": "string" }, { "type": "null" } ], "description": "Detailed description or notes. Optional." }, "dueDate": { "anyOf": [ { "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$", "type": "string" }, { "type": "null" } ], "description": "Due date/time, ISO 8601. Optional." }, "leadId": { "anyOf": [ { "maxLength": 160, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "Lead id to link the activity to (from search_leads). Link at least one entity." }, "priority": { "description": "Priority. Optional. One of: low, medium, high.", "enum": [ "low", "medium", "high" ], "type": "string" }, "recurrenceEndsAt": { "anyOf": [ { "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$", "type": "string" }, { "type": "null" } ], "description": "When recurrence stops, ISO 8601. Optional; only meaningful with recurrenceRule." }, "recurrenceRule": { "anyOf": [ { "description": "Recurrence rule: daily, weekly, or monthly. Optional (one-off if omitted).", "enum": [ "daily", "weekly", "monthly" ], "type": "string" }, { "type": "null" } ], "description": "Recurrence rule: daily, weekly, or monthly. Optional (one-off if omitted)." }, "title": { "description": "Short title of the activity. Required.", "maxLength": 255, "minLength": 1, "type": "string" }, "type": { "description": "Activity type. One of: task, call, meeting, email, note.", "enum": [ "task", "call", "meeting", "email", "note" ], "type": "string" } }, "required": [ "title", "type" ], "type": "object" }, "name": "create_activity", "outputSchema": null }, { "description": "Create a catalog brand with optional description, website and per-language description translations. The brand NAME is never translated: marketplaces match the vendor name verbatim, so send it exactly as the vendor is known. The slug is normalized to Latin. A name already used in this workspace is rejected, so call list_brands first to avoid duplicates. Translate only the brand's own description — add no facts the user did not give. The result is the created brand with its id (use it as brandId for create_product/update_product) and echoes the operating workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "description": { "anyOf": [ { "maxLength": 4000, "type": "string" }, { "type": "null" } ], "description": "Brand description in the workspace's base language (up to 4000 characters). Send null to clear it." }, "name": { "description": "The brand name exactly as marketplaces know the vendor, up to 120 characters; unique in the workspace. Never translated.", "maxLength": 120, "minLength": 1, "type": "string" }, "slug": { "anyOf": [ { "maxLength": 120, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "URL segment for the brand. Normalized to lowercase Latin letters, digits and hyphens whatever is sent; derived from the name when omitted." }, "translations": { "description": "Brand description per locale (the brand NAME is never translated). Omit to leave existing translations untouched; when sent it REPLACES the whole set, so an empty array removes them all.", "items": { "additionalProperties": false, "properties": { "description": { "maxLength": 4000, "type": "string" }, "locale": { "description": "Content locale, one of the workspace's supported languages.", "enum": [ "uk", "ru", "en", "pl", "de", "it", "fr", "es", "pt", "nl", "cs", "sk", "hu", "ro", "bg", "lt", "lv", "et", "tr" ], "example": "en", "type": "string" } }, "required": [ "description", "locale" ], "type": "object" }, "maxItems": 19, "type": "array" }, "website": { "anyOf": [ { "format": "uri", "maxLength": 255, "type": "string" }, { "type": "null" } ], "description": "The brand's website as a full https:// URL. Send null to clear it." } }, "required": [ "name" ], "type": "object" }, "name": "create_brand", "outputSchema": null }, { "description": "Create a catalog category, optionally nested under an existing one, with optional description and per-language translations. The slug is normalized to Latin whatever is sent. The parent must exist in this workspace, and a name already used under the same parent is rejected, so call list_categories first to avoid duplicates. Translate only the category's own name and description into each locale — add no facts the user did not give. The result is the created category with its id (use it as categoryId for create_product/update_product) and echoes the operating workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "description": { "anyOf": [ { "maxLength": 4000, "type": "string" }, { "type": "null" } ], "description": "Prose a storefront shows at the top of the category shelf, in the workspace's base language (up to 4000 characters). Send null to clear it." }, "googleProductCategory": { "anyOf": [ { "maxLength": 255, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "Google Product Taxonomy id or full path for this category (for Google Shopping). Separate from the name; send null to clear it." }, "name": { "description": "The category name in the workspace's base language, up to 120 characters. Must be unique among categories with the same parent.", "maxLength": 120, "minLength": 1, "type": "string" }, "parentId": { "anyOf": [ { "maxLength": 160, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "Id of the parent category from list_categories, to nest this one under it; it must exist in this workspace. Omit or send null for a top-level category." }, "slug": { "anyOf": [ { "maxLength": 120, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "URL segment for the category. Normalized to lowercase Latin letters, digits and hyphens whatever is sent (Cyrillic is transliterated); derived from the name when omitted." }, "translations": { "description": "Category name (and optional description) per locale. Omit to leave existing translations untouched; when sent it REPLACES the whole set, so an empty array removes them all.", "items": { "additionalProperties": false, "properties": { "description": { "anyOf": [ { "maxLength": 4000, "type": "string" }, { "type": "null" } ] }, "locale": { "description": "Content locale, one of the workspace's supported languages.", "enum": [ "uk", "ru", "en", "pl", "de", "it", "fr", "es", "pt", "nl", "cs", "sk", "hu", "ro", "bg", "lt", "lv", "et", "tr" ], "example": "en", "type": "string" }, "name": { "maxLength": 120, "type": "string" } }, "required": [ "locale", "name" ], "type": "object" }, "maxItems": 19, "type": "array" } }, "required": [ "name" ], "type": "object" }, "name": "create_category", "outputSchema": null }, { "description": "Create a company (B2B account). The company name must be unique in the workspace. Enforces the workspace plan limit; the result echoes the operating workspace. Use search_companies first to avoid creating a duplicate.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "industry": { "anyOf": [ { "description": "The company's industry. Optional.", "maxLength": 120, "type": "string" }, { "type": "null" } ], "description": "The company's industry. Optional." }, "name": { "description": "The company name. Required and unique within the workspace.", "maxLength": 255, "minLength": 1, "type": "string" }, "ownerId": { "anyOf": [ { "description": "User id of the workspace member who owns this company. Optional.", "type": "string" }, { "type": "null" } ], "description": "User id of the workspace member who owns this company. Optional." }, "size": { "description": "Company size band. Optional. One of: solo, small, medium, large, enterprise.", "enum": [ "solo", "small", "medium", "large", "enterprise" ], "type": "string" }, "status": { "description": "Relationship status. Optional. One of: prospect, active, inactive.", "enum": [ "prospect", "active", "inactive" ], "type": "string" }, "website": { "anyOf": [ { "description": "The company website URL. Optional.", "format": "uri", "maxLength": 255, "type": "string" }, { "type": "null" } ], "description": "The company website URL. Optional." } }, "required": [ "name" ], "type": "object" }, "name": "create_company", "outputSchema": null }, { "description": "Create a contact (person). Use search_companies for the companyId to link an employer. Enforces the workspace plan limit and validates the company/owner links; the result echoes the operating workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "companyId": { "anyOf": [ { "description": "Company id to link this contact to (from search_companies). Optional.", "type": "string" }, { "type": "null" } ], "description": "Company id to link this contact to (from search_companies). Optional." }, "email": { "anyOf": [ { "description": "The contact's email address. Optional.", "format": "email", "maxLength": 255, "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", "type": "string" }, { "type": "null" } ], "description": "The contact's email address. Optional." }, "firstName": { "description": "The contact's first name. Required.", "maxLength": 120, "minLength": 1, "type": "string" }, "jobTitle": { "anyOf": [ { "description": "The contact's job title. Optional.", "maxLength": 160, "type": "string" }, { "type": "null" } ], "description": "The contact's job title. Optional." }, "lastName": { "anyOf": [ { "description": "The contact's last name. Optional.", "maxLength": 120, "type": "string" }, { "type": "null" } ], "description": "The contact's last name. Optional." }, "ownerId": { "anyOf": [ { "description": "User id of the workspace member who owns this contact. Optional.", "type": "string" }, { "type": "null" } ], "description": "User id of the workspace member who owns this contact. Optional." }, "phone": { "anyOf": [ { "description": "The contact's phone number. Optional.", "maxLength": 50, "type": "string" }, { "type": "null" } ], "description": "The contact's phone number. Optional." }, "tags": { "default": [], "description": "Tags for segmentation. Optional.", "items": { "maxLength": 80, "type": "string" }, "type": "array" } }, "required": [ "firstName" ], "type": "object" }, "name": "create_contact", "outputSchema": null }, { "description": "Create a pipeline deal. Requires a stageId, title, and next-action note. Use list_pipeline_stages for the stageId, and search_companies/search_contacts to link a company or contact. Enforces the workspace plan limit; the result echoes the operating workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "amount": { "description": "Deal value as a decimal string, e.g. 1500.00. Optional.", "pattern": "^\\d+(\\.\\d{1,2})?$", "type": "string" }, "companyId": { "anyOf": [ { "maxLength": 160, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "Company id to link the deal to (from search_companies); null/omit for none." }, "contactId": { "anyOf": [ { "maxLength": 160, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "Contact id to link the deal to (from search_contacts); null/omit for none." }, "expectedCloseDate": { "anyOf": [ { "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$", "type": "string" }, { "type": "null" } ], "description": "Expected close date, ISO 8601. Optional." }, "lostReason": { "anyOf": [ { "description": "Reason the deal was lost. Required only when moving to a Closed-lost stage.", "maxLength": 500, "type": "string" }, { "type": "null" } ], "description": "Reason the deal was lost. Optional (required only for Closed-lost stages)." }, "nextActionDate": { "description": "Next-action date, ISO 8601. Required.", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$", "type": "string" }, "nextActionNote": { "description": "What the next action on this deal is. Required.", "maxLength": 500, "minLength": 1, "type": "string" }, "notes": { "anyOf": [ { "description": "Free-text notes on the deal. Optional.", "maxLength": 5000, "type": "string" }, { "type": "null" } ], "description": "Free-text notes on the deal. Optional." }, "ownerId": { "anyOf": [ { "maxLength": 160, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "User id of the workspace member to own the deal; null/omit for none." }, "probability": { "description": "Win probability percent, 0-100. Optional (defaults from the stage).", "maximum": 100, "minimum": 0, "type": "integer" }, "stageId": { "description": "Pipeline stage id for the deal (from list_pipeline_stages). Required.", "type": "string" }, "title": { "description": "Deal title. Required.", "maxLength": 255, "minLength": 1, "type": "string" } }, "required": [ "nextActionDate", "nextActionNote", "stageId", "title" ], "type": "object" }, "name": "create_deal", "outputSchema": null }, { "description": "Create eBay DRAFT offers for up to 25 products — real writes to the seller's eBay account, but nothing is buyer-visible until publish_ebay_drafts. Run inspect_ebay_listings first and pass only products whose nextAction is create_draft and ready is true. Each product is attempted on its own: returns created, failed (each with a reason to look up in remediation.ebayPlaybook) and notAttempted (not reached in the time budget — call again with those ids). Refused until the owner switches on AI publishing, and while draft creation is not armed on the eBay connection. Not idempotent: a product that already has a draft fails with alreadyListed. The result echoes the workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "marketplaceId": { "description": "Omit this when the eBay connection sells on exactly one marketplace — the server fills it in automatically. Pass one of the audit's armed ebayDraftSetup.marketplaceIds only when several marketplaces are armed. This is a MARKETPLACE id (e.g. EBAY_DE, EBAY_IT) — never the eBay CONNECTION/adapter id.", "enum": [ "EBAY_US", "EBAY_GB", "EBAY_DE", "EBAY_AT", "EBAY_BE", "EBAY_FR", "EBAY_IT", "EBAY_NL", "EBAY_ES", "EBAY_IE", "EBAY_PL", "EBAY_CH", "EBAY_CA", "EBAY_AU" ], "type": "string" }, "productIds": { "description": "The exact products to create eBay draft offers for, at most 25 ids fetched with search_products. This creates drafts only and never makes them live.", "items": { "description": "A product id returned by search_products.", "minLength": 1, "type": "string" }, "maxItems": 25, "minItems": 1, "type": "array" } }, "required": [ "productIds" ], "type": "object" }, "name": "create_ebay_drafts", "outputSchema": null }, { "description": "Create a lead. Idempotent by externalId (re-sending the same externalId returns the existing lead). Requires an email or phone. Enforces the workspace plan limit; the result echoes the workspace it landed in. Use update_lead to change it afterward.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "companyName": { "description": "The lead's company name, if known. Optional.", "maxLength": 255, "type": "string" }, "email": { "description": "The lead's email. Provide email or phone (at least one).", "format": "email", "maxLength": 255, "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", "type": "string" }, "externalId": { "description": "A stable unique id for this lead in your system — the idempotency key. Re-sending the same externalId returns the existing lead instead of creating a duplicate (e.g. 'mcp-<uuid>').", "maxLength": 160, "minLength": 1, "type": "string" }, "name": { "description": "The lead's full name or label. Required.", "maxLength": 255, "minLength": 1, "type": "string" }, "notes": { "description": "Free-text notes about the lead. Optional.", "maxLength": 2000, "type": "string" }, "phone": { "description": "The lead's phone number. Provide email or phone (at least one).", "maxLength": 50, "type": "string" }, "source": { "const": "website", "default": "website", "description": "Lead source; fixed to \"website\" for MCP-created leads.", "type": "string" } }, "required": [ "externalId", "name" ], "type": "object" }, "name": "create_lead", "outputSchema": null }, { "description": "Create an order with line items. Idempotent by externalId — use a stable unique id such as 'mcp-<uuid>' (re-sending returns the existing order). Enforces the workspace plan limit; the result echoes the operating workspace. Items snapshot productName/sku/unitPrice; use search_products first to quote real products.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "currency": { "default": "UAH", "description": "ISO 4217 currency code for the order (uppercase, e.g. UAH). Default UAH.", "maxLength": 3, "minLength": 3, "pattern": "^[A-Z]{3}$", "type": "string" }, "customer": { "additionalProperties": false, "description": "Optional buyer snapshot (name/email/phone, or a storefront customer externalId). Omit for an anonymous order.", "properties": { "email": { "format": "email", "maxLength": 255, "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", "type": "string" }, "externalId": { "maxLength": 160, "minLength": 1, "type": "string" }, "firstName": { "maxLength": 120, "minLength": 1, "type": "string" }, "lastName": { "maxLength": 120, "minLength": 1, "type": "string" }, "phone": { "maxLength": 50, "minLength": 1, "type": "string" }, "shippingAddress": { "additionalProperties": false, "properties": { "city": { "maxLength": 120, "minLength": 1, "type": "string" }, "country": { "maxLength": 2, "minLength": 2, "type": "string" }, "line1": { "maxLength": 255, "minLength": 1, "type": "string" }, "line2": { "maxLength": 255, "minLength": 1, "type": "string" }, "postalCode": { "maxLength": 32, "minLength": 1, "type": "string" }, "region": { "maxLength": 120, "minLength": 1, "type": "string" } }, "required": [ "city", "country", "line1" ], "type": "object" } }, "type": "object" }, "delivery": { "additionalProperties": false, "description": "How the buyer asked to receive the order: carrier, branch/courier/pickup, branch text, recipient, cash-on-delivery and a delivery note. This is the buyer's choice at checkout — it does not dispatch anything. Record what actually ships with POST /orders/{externalId}/shipments.", "properties": { "branch": { "description": "Branch or parcel locker as the buyer named it, e.g. \"відділення №5\" or \"поштомат 12345\". Free text: the CRM resolves it against the live branch list of the carrier when creating a waybill.", "maxLength": 200, "type": "string" }, "branchRef": { "description": "The carrier's own identifier for the branch or parcel locker, as returned by GET /api/v1/carriers/{carrier}/warehouses. The same value the shipment-label endpoint calls warehouseRef. Sent, this removes all guessing; omitted, the CRM falls back to matching `branch` as text.", "maxLength": 64, "type": "string" }, "building": { "description": "House number for courier delivery, structured rather than inside the address line because carriers validate it on its own (Nova Poshta accepts up to 11 characters matching digits plus an optional Cyrillic letter or block, e.g. \"12Б\" or \"12/4\").", "maxLength": 35, "type": "string" }, "carrier": { "description": "Carrier slug the buyer chose, from GET /capabilities (e.g. \"nova_poshta\", \"ukrposhta\", \"pickup\"). This is a preference, not a dispatch — the shipment endpoint still records what actually ships.", "maxLength": 120, "type": "string" }, "cityRef": { "description": "The carrier's own identifier for the destination city, as returned by GET /api/v1/carriers/{carrier}/cities. Required alongside branchRef or streetRef for a waybill to be created from the order alone.", "maxLength": 64, "type": "string" }, "cod": { "description": "True when the buyer pays on delivery (cash on delivery).", "type": "boolean" }, "comment": { "description": "Delivery note from the buyer, e.g. \"дзвонити після 18:00\". Not the order notes.", "maxLength": 1000, "type": "string" }, "flat": { "description": "Apartment or office number for courier delivery.", "maxLength": 35, "type": "string" }, "method": { "description": "How the parcel reaches the buyer: \"branch\" (carrier office/locker), \"courier\" (to the address) or \"pickup\" (buyer collects from you).", "enum": [ "branch", "courier", "pickup" ], "type": "string" }, "phone": { "description": "Recipient phone, when it differs from the buyer's own contact phone.", "maxLength": 50, "type": "string" }, "recipientName": { "description": "Who receives the parcel, when that is not the buyer (a gift, an office).", "maxLength": 200, "type": "string" }, "streetRef": { "description": "The carrier's own identifier for the street, as returned by GET /api/v1/carriers/{carrier}/streets. Courier delivery only; pair it with `building`.", "maxLength": 64, "type": "string" } }, "type": "object" }, "discountAmount": { "description": "Money taken off by the promo code, in the order currency. A sum, not a percent: a percent at order level is ambiguous (before or after line discounts, with shipping or without). Does NOT change total — send the total the buyer actually paid.", "minimum": 0, "type": "number" }, "externalId": { "description": "A stable unique id for this order in your system — the idempotency key. Re-sending the same externalId returns the existing order instead of creating a duplicate (e.g. 'mcp-<uuid>').", "maxLength": 160, "minLength": 1, "type": "string" }, "items": { "description": "Order line items (1-100). Each snapshots productName/sku/unitPrice.", "items": { "additionalProperties": false, "properties": { "discount": { "default": 0, "description": "Percentage discount on this line (0-100). Default 0.", "maximum": 100, "minimum": 0, "type": "number" }, "productName": { "description": "Line item name, snapshotted onto the order. Use search_products to quote a real catalog product's name. Required.", "maxLength": 255, "minLength": 1, "type": "string" }, "quantity": { "description": "Quantity ordered (integer, at least 1).", "exclusiveMinimum": 0, "maximum": 9007199254740991, "type": "integer" }, "sku": { "description": "Product SKU snapshot (from search_products). Optional.", "maxLength": 120, "type": "string" }, "unitPrice": { "anyOf": [ { "pattern": "^\\d+(\\.\\d{1,2})?$", "type": "string" }, { "minimum": 0, "type": "number" } ], "description": "Price per unit in the order currency, as a decimal (e.g. 199.99). Snapshotted onto the line." } }, "required": [ "productName", "quantity", "unitPrice" ], "type": "object" }, "maxItems": 100, "minItems": 1, "type": "array" }, "notes": { "description": "Internal note stored on the order. For a delivery instruction from the buyer use delivery.comment instead.", "maxLength": 5000, "type": "string" }, "promoCode": { "description": "The promo code the storefront applied to this order, recorded as-is. The CRM never validates or computes it — the cart owns that — but storing it is what makes 'did that campaign pay for itself?' answerable later.", "maxLength": 64, "type": "string" } }, "required": [ "externalId", "items" ], "type": "object" }, "name": "create_order", "outputSchema": null }, { "description": "Create a catalog product. Defaults to draft status — publish it by sending status 'active' once it is complete. Use list_categories, list_brands and list_warehouses for the ids; SKU is generated when omitted and must be unique in the workspace. Set trackInventory with an opening stock to start counting units, which is recorded as the first movement in the product stock history. A bundle (type bundle with bundleItems) holds no stock of its own: its stock, tracking and cost are derived from its components, so a stock sent for it is refused and trackInventory/costPrice are ignored. If the target warehouse is set to list new products on the marketplaces, this product joins those channels. When productGroupId names an existing product model, the product joins that model as a new article and takes the model's shared content (name, description, category, brand, characteristics, translations) instead of the values sent. Enforces the workspace plan limit; the result echoes the operating workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "ageGroup": { "anyOf": [ { "enum": [ "newborn", "infant", "toddler", "kids", "adult" ], "type": "string" }, { "type": "null" } ] }, "brandId": { "anyOf": [ { "maxLength": 160, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "bundleItems": { "default": [], "description": "Components of a bundle (type bundle only): simple, non-archived products of the bundle's warehouse, each listed once. Selling the bundle deducts these components; the bundle's stock is how many whole bundles they make. On update, sending it replaces the whole composition.", "items": { "additionalProperties": false, "properties": { "productId": { "maxLength": 160, "minLength": 1, "type": "string" }, "quantity": { "exclusiveMinimum": 0, "maximum": 9007199254740991, "type": "integer" } }, "required": [ "productId", "quantity" ], "type": "object" }, "type": "array" }, "categoryId": { "anyOf": [ { "maxLength": 160, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "color": { "anyOf": [ { "maxLength": 80, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "compareAtPrice": { "anyOf": [ { "anyOf": [ { "type": "number" }, { "minLength": 1, "type": "string" } ] }, { "type": "null" } ] }, "condition": { "anyOf": [ { "enum": [ "new", "used", "refurbished" ], "type": "string" }, { "type": "null" } ] }, "costCurrency": { "anyOf": [ { "pattern": "^[A-Z]{3}$", "type": "string" }, { "type": "null" } ] }, "costPrice": { "anyOf": [ { "anyOf": [ { "type": "number" }, { "minLength": 1, "type": "string" } ] }, { "type": "null" } ], "description": "Purchase price per unit, in costCurrency. Ignored for a bundle: its cost is the sum of its components' costs when all are known and in one currency." }, "depth": { "anyOf": [ { "anyOf": [ { "type": "number" }, { "minLength": 1, "type": "string" } ] }, { "type": "null" } ] }, "description": { "anyOf": [ { "maxLength": 2000, "type": "string" }, { "type": "null" } ] }, "dimensionUnit": { "anyOf": [ { "enum": [ "cm", "mm", "in" ], "type": "string" }, { "type": "null" } ] }, "ean": { "anyOf": [ { "pattern": "^[0-9]{8,14}$", "type": "string" }, { "type": "null" } ], "description": "GTIN/EAN-8/12/13/14 barcode. Presence-and-shape validation only, no checksum.", "example": "4006381333931" }, "gender": { "anyOf": [ { "enum": [ "male", "female", "unisex" ], "type": "string" }, { "type": "null" } ] }, "height": { "anyOf": [ { "anyOf": [ { "type": "number" }, { "minLength": 1, "type": "string" } ] }, { "type": "null" } ] }, "images": { "items": { "additionalProperties": false, "properties": { "alt": { "description": "Alternative text of the photo, up to 200 characters. Optional: when empty a storefront should use the product name.", "example": "White leather sneakers, side view", "maxLength": 200, "type": "string" }, "contentType": { "enum": [ "image/jpeg", "image/png", "image/webp" ], "type": "string" }, "name": { "maxLength": 255, "minLength": 1, "type": "string" }, "pathname": { "minLength": 1, "type": "string" }, "size": { "exclusiveMinimum": 0, "maximum": 9007199254740991, "type": "integer" }, "uploadedAt": { "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "type": "string" }, "url": { "format": "uri", "type": "string" } }, "required": [ "url" ], "type": "object" }, "maxItems": 10, "type": "array" }, "material": { "anyOf": [ { "maxLength": 120, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "mpn": { "anyOf": [ { "maxLength": 120, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "Manufacturer part number — the maker's own code for the item, not the shop SKU. eBay requires it beside the brand in many categories.", "example": "TR-1" }, "name": { "maxLength": 255, "minLength": 1, "type": "string" }, "pattern": { "anyOf": [ { "maxLength": 80, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "price": { "anyOf": [ { "anyOf": [ { "type": "number" }, { "minLength": 1, "type": "string" } ] }, { "type": "null" } ] }, "productGroupId": { "anyOf": [ { "maxLength": 120, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "size": { "anyOf": [ { "maxLength": 60, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "sizeSystem": { "anyOf": [ { "enum": [ "AU", "BR", "CN", "DE", "EU", "FR", "IT", "JP", "MEX", "UK", "US" ], "type": "string" }, { "type": "null" } ] }, "sizeType": { "anyOf": [ { "maxLength": 40, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "sku": { "anyOf": [ { "maxLength": 120, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "status": { "default": "draft", "enum": [ "draft", "active", "archived" ], "type": "string" }, "stock": { "anyOf": [ { "maximum": 9007199254740991, "minimum": 0, "type": "integer" }, { "type": "null" } ], "description": "Units on hand, for a product that tracks inventory; a change on update is recorded as a relative movement in the stock history. Refused for a bundle — its stock is derived from its components." }, "supplierId": { "anyOf": [ { "maxLength": 160, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "tags": { "default": [], "items": { "maxLength": 80, "minLength": 1, "type": "string" }, "type": "array" }, "trackInventory": { "default": false, "description": "Whether the product counts units. Ignored for a bundle: it tracks stock exactly when one of its components does.", "type": "boolean" }, "type": { "default": "simple", "description": "simple, or bundle — one sellable item made of bundleItems, holding no stock of its own. Fixed at creation: an update that changes it is refused.", "enum": [ "simple", "bundle" ], "type": "string" }, "unit": { "anyOf": [ { "maxLength": 40, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "videos": { "default": [], "description": "Video links for the product page (YouTube, Vimeo or a direct file), https only, at most 5. Links, not uploads. On update, sending the field replaces the whole list.", "example": [ { "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ" } ], "items": { "properties": { "url": { "format": "uri", "type": "string" } }, "required": [ "url" ], "type": "object" }, "maxItems": 5, "type": "array" }, "warehouseId": { "anyOf": [ { "maxLength": 160, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "weight": { "anyOf": [ { "anyOf": [ { "type": "number" }, { "minLength": 1, "type": "string" } ] }, { "type": "null" } ] }, "weightUnit": { "anyOf": [ { "enum": [ "kg", "g", "lb", "oz" ], "type": "string" }, { "type": "null" } ] }, "width": { "anyOf": [ { "anyOf": [ { "type": "number" }, { "minLength": 1, "type": "string" } ] }, { "type": "null" } ] } }, "required": [ "name" ], "type": "object" }, "name": "create_product", "outputSchema": null }, { "description": "Delete the eBay DRAFT offer of up to 25 products; a live listing is refused — end it with withdraw_ebay_listings first. The CRM product itself is untouched. Works even while draft creation is disarmed on the connection, but still needs the owner's AI publishing switch. Returns done, failed and notAttempted. The result echoes the workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "productIds": { "description": "Delete the eBay DRAFT offer for each of these products, at most 25 ids fetched with search_products. Only a product whose offer is still a draft is affected — a LIVE listing is refused; end it with withdraw_ebay_listings first if it must go.", "items": { "description": "A product id returned by search_products.", "minLength": 1, "type": "string" }, "maxItems": 25, "minItems": 1, "type": "array" } }, "required": [ "productIds" ], "type": "object" }, "name": "delete_ebay_drafts", "outputSchema": null }, { "description": "Fetch one CRM activity in the selected workspace by activity id, including type, due date, completion state, assignee and linked entity. Use list_activities first when you only know the related lead/deal/contact.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "id": { "description": "The activity id returned by list_activities.", "minLength": 1, "type": "string" } }, "required": [ "id" ], "type": "object" }, "name": "get_activity", "outputSchema": null }, { "description": "Fetch one CRM company in the selected workspace by company id, including status, industry, owner and contact links when present. Use search_companies first when you only know the company name.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "id": { "description": "The company id returned by search_companies.", "minLength": 1, "type": "string" } }, "required": [ "id" ], "type": "object" }, "name": "get_company", "outputSchema": null }, { "description": "Fetch one CRM contact in the selected workspace by contact id, including company, owner, tags and communication fields when present. Use search_contacts first when you only know a name, email or phone.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "id": { "description": "The contact id returned by search_contacts.", "minLength": 1, "type": "string" } }, "required": [ "id" ], "type": "object" }, "name": "get_contact", "outputSchema": null }, { "description": "Fetch one CRM customer summary in the selected workspace by company id, including health, lifetime value and won-deal metrics. Use list_customers first when you only know the company name.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "companyId": { "description": "The company/customer id returned by list_customers.", "minLength": 1, "type": "string" } }, "required": [ "companyId" ], "type": "object" }, "name": "get_customer", "outputSchema": null }, { "description": "Return the operational 'what needs attention today' snapshot for this workspace: active/qualified/stale lead counts, pipeline value, weighted forecast and overdue activities. Takes no arguments. Use get_report for period trend analytics instead.", "inputSchema": { "properties": {}, "type": "object" }, "name": "get_dashboard_overview", "outputSchema": null }, { "description": "Fetch one pipeline deal in the selected workspace by deal id, including stage, value, probability and linked company/contact data when present. Use search_deals first when you only know the title or related customer.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "id": { "description": "The deal id returned by search_deals.", "minLength": 1, "type": "string" } }, "required": [ "id" ], "type": "object" }, "name": "get_deal", "outputSchema": null }, { "description": "Fetch one CRM lead in the selected workspace by lead id, including status, source, assignee, tags, custom fields, score, notes and next action. Use search_leads first when you only know a name, email, phone or company.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "id": { "description": "The lead id returned by search_leads.", "minLength": 1, "type": "string" } }, "required": [ "id" ], "type": "object" }, "name": "get_lead", "outputSchema": null }, { "description": "Fetch one connected marketplace in detail: every adapter on it with its setup state, last poll, last poll error, last catalog-sync outcome and last product import, plus the channel sales, leads and product counts. Use list_marketplaces first to see which platforms are connected. Use list_channel_products for the products on the channel and check_channel_readiness for what would be refused.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "platform": { "description": "The marketplace slug returned by list_marketplaces (prom, rozetka, olx, amazon, ebay, shopify, woocommerce).", "minLength": 1, "type": "string" } }, "required": [ "platform" ], "type": "object" }, "name": "get_marketplace", "outputSchema": null }, { "description": "Fetch full order detail in the selected workspace by externalId, including line items, payments, shipments and returns. Use list_orders first when you only know the customer or date.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "externalId": { "description": "The order externalId returned by list_orders.", "minLength": 1, "type": "string" } }, "required": [ "externalId" ], "type": "object" }, "name": "get_order", "outputSchema": null }, { "description": "Fetch one catalog product in the selected workspace by product id or SKU — returned in any status (draft, active, or archived; check the status field), including price, stock, category and brand fields — a bundle's stock and cost are derived from its components. Provide exactly one known identifier; use search_products first when unsure (search covers active products only).", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "id": { "description": "The product id returned by search_products.", "minLength": 1, "type": "string" }, "sku": { "description": "The product SKU returned by search_products.", "minLength": 1, "type": "string" } }, "type": "object" }, "name": "get_product", "outputSchema": null }, { "description": "Return one aggregated analytics report over a period for this workspace, selected by the report parameter: lead_source_conversion, pipeline_velocity, team_performance, or revenue_trend. Each returns aggregated rows (no per-record data); days tunes the look-back for conversion/team reports and months the span for revenue_trend. Use get_dashboard_overview for today's operational snapshot instead.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "days": { "anyOf": [ { "const": 30, "type": "number" }, { "const": 90, "type": "number" }, { "const": 365, "type": "number" } ], "description": "Look-back window for conversion/team reports (default 90/30)." }, "months": { "description": "Number of months for the revenue-trend report (default 6).", "maximum": 24, "minimum": 1, "type": "integer" }, "report": { "description": "Which analytics report to return. lead_source_conversion: leads and conversion rate per source (uses days). pipeline_velocity: average time deals spend in each stage. team_performance: revenue and activity per member (uses days). revenue_trend: won revenue by month (uses months). product_sales: units, revenue and gross margin per brand, category and SKU, plus a trend (uses days). stock_valuation: units on hand and their value at weighted-average cost, per warehouse and per cost currency — currencies are reported separately and never added together (takes no period).", "enum": [ "lead_source_conversion", "pipeline_velocity", "team_performance", "revenue_trend", "product_sales", "stock_valuation" ], "type": "string" } }, "required": [ "report" ], "type": "object" }, "name": "get_report", "outputSchema": null }, { "description": "Show which account and workspace this connection operates: signed-in name/email (OAuth only), workspace name, plan, connection type, and granted scopes. Call this when the user asks 'which account or workspace am I connected to?'. Sign-in connections can use list_workspaces and select_workspace to see or change the bound workspace.", "inputSchema": { "properties": {}, "type": "object" }, "name": "get_workspace_info", "outputSchema": null }, { "description": "Check up to 25 products against eBay before any write, with the same live preflight the CRM's eBay channel page and the real draft and publish calls run. Per product it returns the eBay state (off, member, draft, live, ended), nextAction (create_draft, publish_draft or none), whether that step is ready and, when not, the blocking reason with details. ebayDraftSetup lists the armed eBay sites and their currencies; remediation.ebayPlaybook maps every reason to the tool that fixes it; publishingEnabled says whether the owner allows AI to publish in this workspace. Reads eBay, never writes. Use search_products first for the ids; after a fix with update_product, upsert_product_prices, upsert_product_attributes or upsert_product_translation, call it again — a reason can change or clear.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "marketplaceId": { "description": "Omit it when the eBay connection sells on one site — the server fills it in. Pass one of ebayDraftSetup.marketplaceIds only when several are armed. A MARKETPLACE id such as EBAY_IT, never the eBay connection id.", "enum": [ "EBAY_US", "EBAY_GB", "EBAY_DE", "EBAY_AT", "EBAY_BE", "EBAY_FR", "EBAY_IT", "EBAY_NL", "EBAY_ES", "EBAY_IE", "EBAY_PL", "EBAY_CH", "EBAY_CA", "EBAY_AU" ], "type": "string" }, "productIds": { "description": "The products to check, at most 25 ids from search_products.", "items": { "description": "A product id returned by search_products.", "minLength": 1, "type": "string" }, "maxItems": 25, "minItems": 1, "type": "array" } }, "required": [ "productIds" ], "type": "object" }, "name": "inspect_ebay_listings", "outputSchema": null }, { "description": "List this workspace's activities (tasks, calls, meetings, emails, notes), filtered by type/assignee/overdue/completion/linked-entity and paginated. Returns summary rows (id, type, title, priority, dueDate, completed, assignee, linked lead/contact/company/deal, isOverdue) plus pagination { page, perPage, total }. Use get_activity to fetch one activity's full detail by id.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "assignedTo": { "description": "Filter to activities assigned to this workspace member's user id.", "maxLength": 160, "minLength": 1, "type": "string" }, "companyId": { "description": "Filter to activities linked to this company id (from search_companies).", "type": "string" }, "completed": { "description": "Filter by completion: \"true\" only completed, \"false\" only open. Omit for both.", "enum": [ "true", "false" ], "type": "string" }, "contactId": { "description": "Filter to activities linked to this contact id (from search_contacts).", "type": "string" }, "dealId": { "description": "Filter to activities linked to this deal id (from search_deals).", "type": "string" }, "leadId": { "description": "Filter to activities linked to this lead id (from search_leads).", "type": "string" }, "overdue": { "description": "Set \"true\" to return only overdue activities (past due date, not completed).", "enum": [ "true", "false" ], "type": "string" }, "page": { "default": 1, "description": "1-based page number of results to return. Default 1.", "exclusiveMinimum": 0, "maximum": 9007199254740991, "type": "integer" }, "perPage": { "default": 20, "description": "Number of activities per page (1-100). Default 20.", "maximum": 100, "minimum": 1, "type": "integer" }, "q": { "description": "Free-text search over the activity title. Omit for no text filter.", "maxLength": 255, "type": "string" }, "type": { "description": "Filter by activity type. Omit for any. Allowed: task, call, meeting, email, note.", "enum": [ "task", "call", "meeting", "email", "note" ], "type": "string" } }, "type": "object" }, "name": "list_activities", "outputSchema": null }, { "description": "List this workspace catalog brands with id, name, description and website. Use a brand id here as the brandId for create_product/update_product, or as the search_products brand filter.", "inputSchema": { "properties": {}, "type": "object" }, "name": "list_brands", "outputSchema": null }, { "description": "List this workspace catalog categories as a flat array, each with id, name, slug and parentId (null for a root category). Categories are workspace-global, not per warehouse. Use a category id here as the categoryId for create_product/update_product, or as the search_products category filter.", "inputSchema": { "properties": {}, "type": "object" }, "name": "list_categories", "outputSchema": null }, { "description": "List the products that are on one marketplace, with each listing external id, what the marketplace last reported about it (`presence`, valid only when `observedAt` is set — null `observedAt` means the marketplace has never been asked about that listing, not that it is absent; Prom is reconciled every 15 minutes, other channels only when a sync or publish runs), whether the workspace paused syncing it, its price and stock. Also returns the honest totals over the whole channel and the ACTIVE products that have no listing there at all (the 'did not match by SKU' list), which is usually the answer when a push updated fewer products than expected. Use check_channel_readiness for why a product would be refused.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "platform": { "description": "The marketplace slug returned by list_marketplaces (prom, rozetka, olx, amazon, ebay, shopify, woocommerce).", "minLength": 1, "type": "string" } }, "required": [ "platform" ], "type": "object" }, "name": "list_channel_products", "outputSchema": null }, { "description": "List CRM customers (companies with a won deal or delivered order), filtered by health/lifetime-value/won-deal count, sorted and paginated. Returns summary rows (companyId, name, health, lifetimeValue, wonDeals, lastActivity, owner) plus pagination { page, perPage, total }. Use get_customer to fetch one customer's detail by company id.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "health": { "description": "Filter by customer health. Omit for any. Allowed: healthy, at_risk, churned.", "enum": [ "healthy", "at_risk", "churned" ], "type": "string" }, "ltv": { "description": "Filter by lifetime-value bucket. Omit for any. Allowed: lt10k, 10k50k, gt50k.", "enum": [ "lt10k", "10k50k", "gt50k" ], "type": "string" }, "ownerId": { "description": "Filter to customers owned by this workspace member's user id.", "maxLength": 160, "minLength": 1, "type": "string" }, "page": { "default": 1, "description": "1-based page number of results to return. Default 1.", "exclusiveMinimum": 0, "maximum": 9007199254740991, "type": "integer" }, "perPage": { "default": 25, "description": "Number of customers per page (1-100). Default 25.", "maximum": 100, "minimum": 1, "type": "integer" }, "q": { "description": "Free-text search over the customer company name. Omit for no text filter.", "maxLength": 255, "type": "string" }, "sortDir": { "default": "desc", "description": "Sort direction by lifetime value. Default desc (highest first).", "enum": [ "asc", "desc" ], "type": "string" }, "wonDealsMin": { "description": "Only customers with at least this many won deals.", "maximum": 9007199254740991, "minimum": 1, "type": "integer" } }, "type": "object" }, "name": "list_customers", "outputSchema": null }, { "description": "List this workspace's lead sources (built-in plus custom), with each source's key, label and active state. Pass includeInactive to also return archived sources. Use set_lead_sources to add or archive a source; use a source key here as the source filter for search_leads.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "includeInactive": { "description": "Set true to include archived/inactive lead sources.", "type": "boolean" } }, "type": "object" }, "name": "list_lead_sources", "outputSchema": null }, { "description": "List every marketplace connected to this workspace with its setup state, health, last activity, any current sync error, orders revenue per currency, leads, product counts on the channel and how many imported products are waiting to be reviewed. Answers 'which channels do I sell on and is anything broken'. Takes no arguments. Use get_marketplace for one channel in detail, list_channel_products for what is on it, and check_channel_readiness for what it will refuse.", "inputSchema": { "properties": {}, "type": "object" }, "name": "list_marketplaces", "outputSchema": null }, { "description": "List this workspace's orders, filtered by status/customer/created-date and paginated. Returns summary rows (externalId, status, currency, totalAmount, itemCount, timestamps) plus pagination { page, perPage, total }, newest first. Use get_order to fetch one order's full detail (line items, payments, shipments, returns) by externalId.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "customerExternalId": { "description": "Filter to one storefront customer by their externalId (the id from the source system). Omit to list all customers' orders.", "maxLength": 160, "minLength": 1, "type": "string" }, "from": { "description": "Only orders created at or after this ISO 8601 timestamp (e.g. 2026-01-31T00:00:00Z).", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$", "type": "string" }, "page": { "default": 1, "description": "1-based page number of results to return. Default 1.", "maximum": 9007199254740991, "minimum": 1, "type": "integer" }, "perPage": { "default": 20, "description": "Number of results per page (1-100). Default 20.", "maximum": 100, "minimum": 1, "type": "integer" }, "status": { "description": "Filter by order status. Omit to return every status. Allowed: pending, confirmed, processing, shipped, delivered, cancelled, refunded.", "enum": [ "pending", "confirmed", "processing", "shipped", "delivered", "cancelled", "refunded" ], "type": "string" }, "to": { "description": "Only orders created at or before this ISO 8601 timestamp (e.g. 2026-02-28T23:59:59Z).", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$", "type": "string" } }, "type": "object" }, "name": "list_orders", "outputSchema": null }, { "description": "List this workspace's pipeline stages in order, with each stage's id, name, kind, default probability, WIP limit and position. Use configure_pipeline to change a stage, and the stage id here as the stageId for create_deal / transition_deal.", "inputSchema": { "properties": {}, "type": "object" }, "name": "list_pipeline_stages", "outputSchema": null }, { "description": "List this workspace warehouses with id, name, description, phone, address (the street line), country (ISO code), city, postalCode, workingHours (free text) and pickupEnabled (whether the warehouse is offered as a self-pickup point). A product lives in at most one warehouse, and the warehouse decides the inventory-tracking default and which sales channels new products are listed on. Use a warehouse id here as the warehouseId for create_product.", "inputSchema": { "properties": {}, "type": "object" }, "name": "list_warehouses", "outputSchema": null }, { "description": "List every workspace the connected user belongs to (id, name, role) and mark which one this connection currently operates. OAuth sign-in connections only. Use select_workspace to switch.", "inputSchema": { "properties": {}, "type": "object" }, "name": "list_workspaces", "outputSchema": null }, { "description": "Make the eBay DRAFT offers of up to 25 products LIVE and buyer-visible — a real publication on the seller's account. The item and offer are refreshed from the current product first, so a price, title, photo or characteristic fixed after the draft was made is published too. Pass only products whose nextAction from inspect_ebay_listings is publish_draft. Returns done, failed (with reasons) and notAttempted. Never tell the user a listing is live unless it is counted in done. Refused until the owner switches on AI publishing. The result echoes the workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "productIds": { "description": "Make each product's eBay DRAFT offer LIVE and buyer-visible, at most 25 ids fetched with search_products. The item and offer are refreshed from current product data first, then published — this is a real, consequential publication, not a preview. Report every named per-product failure.", "items": { "description": "A product id returned by search_products.", "minLength": 1, "type": "string" }, "maxItems": 25, "minItems": 1, "type": "array" } }, "required": [ "productIds" ], "type": "object" }, "name": "publish_ebay_drafts", "outputSchema": null }, { "description": "Delete each product's eBay draft and create a fresh one from its current data, for up to 25 products. Needed only when a draft must move to another category or eBay site, or the reason is ebayDraftOfferMissing or ebayNoOfferId — ordinary edits are picked up by publish_ebay_drafts. A live listing is refused. If the delete succeeds but the new draft fails, that product is left with no draft and its failure says so. Refused until the owner switches on AI publishing. The result echoes the workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "marketplaceId": { "description": "Omit this when the eBay connection sells on exactly one marketplace — the server fills it in automatically. Pass one of the audit's armed ebayDraftSetup.marketplaceIds only when several are armed. This is a MARKETPLACE id (e.g. EBAY_DE) — never the eBay CONNECTION/adapter id.", "enum": [ "EBAY_US", "EBAY_GB", "EBAY_DE", "EBAY_AT", "EBAY_BE", "EBAY_FR", "EBAY_IT", "EBAY_NL", "EBAY_ES", "EBAY_IE", "EBAY_PL", "EBAY_CH", "EBAY_CA", "EBAY_AU" ], "type": "string" }, "productIds": { "description": "Delete each product's existing eBay draft offer and create a fresh one from its CURRENT data, at most 25 ids fetched with search_products. Use this when a draft must move to a different category or marketplace, or eBay rejected its offer and a plain retry will not fix it. A LIVE listing is refused. If the delete succeeds but the new create fails, the failure says so explicitly — that product is then on the channel with NO draft.", "items": { "description": "A product id returned by search_products.", "minLength": 1, "type": "string" }, "maxItems": 25, "minItems": 1, "type": "array" } }, "required": [ "productIds" ], "type": "object" }, "name": "recreate_ebay_drafts", "outputSchema": null }, { "description": "Remove a line item from an order. Recomputes the order total. Use get_order to find the order's externalId and the item's itemId. The result echoes the operating workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "externalId": { "description": "The order externalId returned by list_orders or create_order.", "minLength": 1, "type": "string" }, "itemId": { "description": "The order item id returned by get_order.", "minLength": 1, "type": "string" } }, "required": [ "externalId", "itemId" ], "type": "object" }, "name": "remove_order_item", "outputSchema": null }, { "description": "List and search this workspace's companies, filtered by industry/status/owner, sorted and paginated. Returns summary rows (id, name, industry, size, status, owner, contactCount) plus pagination { page, perPage, total }. Use get_company to fetch one company's full detail by id.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "industry": { "description": "Filter to companies in this industry. Omit for any industry.", "maxLength": 120, "minLength": 1, "type": "string" }, "ownerId": { "description": "Filter to companies owned by this workspace member's user id.", "maxLength": 160, "minLength": 1, "type": "string" }, "page": { "default": 1, "description": "1-based page number of results to return. Default 1.", "exclusiveMinimum": 0, "maximum": 9007199254740991, "type": "integer" }, "perPage": { "default": 25, "description": "Number of companies per page (1-100). Default 25.", "maximum": 100, "minimum": 1, "type": "integer" }, "q": { "description": "Free-text search over the company name. Omit for no text filter.", "maxLength": 255, "type": "string" }, "sortDir": { "default": "asc", "description": "Sort direction by name. Default asc.", "enum": [ "asc", "desc" ], "type": "string" }, "status": { "description": "Filter by relationship status. Omit for any. Allowed: prospect, active, inactive.", "enum": [ "prospect", "active", "inactive" ], "type": "string" } }, "type": "object" }, "name": "search_companies", "outputSchema": null }, { "description": "List and search this workspace's contacts, filtered by company/owner/tag, sorted and paginated. Returns summary rows (id, firstName, lastName, email, phone, jobTitle, company, owner, tags) plus pagination { page, perPage, total }. Use get_contact to fetch one contact's full detail by id.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "companyId": { "description": "Filter to contacts at this company id (from search_companies).", "maxLength": 160, "minLength": 1, "type": "string" }, "ownerId": { "description": "Filter to contacts owned by this workspace member's user id.", "maxLength": 160, "minLength": 1, "type": "string" }, "page": { "default": 1, "description": "1-based page number of results to return. Default 1.", "exclusiveMinimum": 0, "maximum": 9007199254740991, "type": "integer" }, "perPage": { "default": 25, "description": "Number of contacts per page (1-100). Default 25.", "maximum": 100, "minimum": 1, "type": "integer" }, "q": { "description": "Free-text search over name, email and company. Omit for no text filter.", "maxLength": 255, "type": "string" }, "sortBy": { "default": "name", "description": "Field to sort by. Default name. Allowed: name, email, createdAt.", "enum": [ "name", "email", "createdAt" ], "type": "string" }, "sortDir": { "default": "asc", "description": "Sort direction. Default asc.", "enum": [ "asc", "desc" ], "type": "string" }, "tag": { "description": "Filter to contacts carrying this tag. Omit for any tag.", "maxLength": 80, "minLength": 1, "type": "string" } }, "type": "object" }, "name": "search_contacts", "outputSchema": null }, { "description": "List and search pipeline deals, filtered by stage/owner/company/contact/stale and paginated. Returns summary rows (id, title, stage, amount, probability, owner, company, contact, next-action, isStale) plus pagination { page, perPage, total }. Use get_deal to fetch one deal's full detail by id.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "companyId": { "description": "Filter to deals linked to this company id (from search_companies).", "maxLength": 160, "minLength": 1, "type": "string" }, "contactId": { "description": "Filter to deals linked to this contact id (from search_contacts).", "maxLength": 160, "minLength": 1, "type": "string" }, "ownerId": { "description": "Filter to deals owned by this workspace member's user id.", "maxLength": 160, "minLength": 1, "type": "string" }, "page": { "default": 1, "description": "1-based page number of results to return. Default 1.", "exclusiveMinimum": 0, "maximum": 9007199254740991, "type": "integer" }, "perPage": { "default": 25, "description": "Number of deals per page (1-100). Default 25.", "maximum": 100, "minimum": 1, "type": "integer" }, "q": { "description": "Free-text search over the deal title. Omit for no text filter.", "maxLength": 255, "type": "string" }, "stageId": { "description": "Filter to deals in this pipeline stage id (from list_pipeline_stages).", "maxLength": 160, "minLength": 1, "type": "string" }, "stale": { "description": "Set \"true\" to return only stale deals (past their next-action date or long untouched).", "enum": [ "true", "false" ], "type": "string" } }, "type": "object" }, "name": "search_deals", "outputSchema": null }, { "description": "List and search this workspace's leads, filtered by text/status/source/created-date/stale and paginated. Returns summary rows (id, name, contact, company, status, source, assignee, tags, next-action, isStale, timestamps) plus pagination { page, perPage, total }, newest first. Use get_lead to fetch notes, position and score for one lead by id.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "from": { "description": "Only leads created at or after this ISO 8601 timestamp (e.g. 2026-01-31T00:00:00Z).", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$", "type": "string" }, "page": { "default": 1, "description": "1-based page number of results to return. Default 1.", "maximum": 9007199254740991, "minimum": 1, "type": "integer" }, "perPage": { "default": 20, "description": "Number of results per page (1-100). Default 20.", "maximum": 100, "minimum": 1, "type": "integer" }, "q": { "description": "Free-text search over lead name, email, phone, or company. Omit for no text filter.", "maxLength": 255, "type": "string" }, "source": { "description": "Filter by lead source key (e.g. website, referral, telegram). Use list_lead_sources to see the workspace's keys. Omit for all sources.", "maxLength": 80, "type": "string" }, "stale": { "anyOf": [ { "type": "boolean" }, { "enum": [ "true", "false" ], "type": "string" } ], "description": "Set true to return only stale leads: not unqualified/converted and either past their next-action date or untouched for more than 7 days." }, "status": { "description": "Filter by lead status. Omit to return every status. Allowed: new, contacted, qualified, unqualified, converted.", "enum": [ "new", "contacted", "qualified", "unqualified", "converted" ], "type": "string" }, "to": { "description": "Only leads created at or before this ISO 8601 timestamp (e.g. 2026-02-28T23:59:59Z).", "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$", "type": "string" } }, "type": "object" }, "name": "search_leads", "outputSchema": null }, { "description": "List and search active catalog products, filtered by category/brand/collection/model (productGroupId — the other colours and sizes of one model)/size/color/price/stock/tag/type, sorted by name, price, newest or popularity (units sold in the last 90 days), and paginated. Returns summary rows (id, name, sku, type, price, currency, unit, stock, category, brand) plus pagination { page, perPage, total }. Use get_product to fetch one product's full detail by id or SKU.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "brandId": { "default": "", "description": "Filter to one brand by its id. Empty string means any brand.", "maxLength": 40, "type": "string" }, "categoryId": { "default": "", "description": "Filter to one category by its id. Empty string means any category.", "maxLength": 40, "type": "string" }, "collection": { "default": "", "description": "Filter to the products of one collection, by its slug from GET /collections. Only a collection that is visible and in season matches — an unknown, hidden or out-of-season slug is reported as not found, exactly like GET /collections/{slug}. Empty means no collection filter.", "maxLength": 120, "type": "string" }, "color": { "default": "", "description": "Filter to products whose color equals this value, ignoring letter case (the product's own color field, not a free-form attribute). Empty means any color.", "maxLength": 80, "type": "string" }, "inStock": { "default": "", "description": "Set \"true\" to return only products with stock available. Empty means include out-of-stock.", "enum": [ "", "true" ], "type": "string" }, "maxPrice": { "description": "Only products priced at or below this amount (workspace currency).", "minimum": 0, "type": "number" }, "minPrice": { "description": "Only products priced at or above this amount (workspace currency).", "minimum": 0, "type": "number" }, "page": { "default": 1, "description": "1-based page number of results to return. Default 1.", "maximum": 9007199254740991, "minimum": 1, "type": "integer" }, "perPage": { "default": 20, "description": "Number of products per page (1-100). Default 20.", "maximum": 100, "minimum": 1, "type": "integer" }, "productGroupId": { "default": "", "description": "Filter to the variants of one model: products whose productGroupId equals this value exactly. It is the merchant's (or supplier's) own model code, so letter case is part of it. Use it to render the other colours and sizes of the product a buyer is looking at. Empty means any model.", "maxLength": 120, "type": "string" }, "q": { "default": "", "description": "Free-text search over product name and SKU. Empty for no text filter.", "maxLength": 200, "type": "string" }, "size": { "default": "", "description": "Filter to products whose size equals this value, ignoring letter case (the product's own size field). Empty means any size.", "maxLength": 60, "type": "string" }, "sort": { "default": "", "description": "Sort order. Empty sorts by name. Allowed: name_asc, name_desc, price_asc, price_desc, newest, popular — popular ranks by units sold in confirmed, processing, shipped or delivered orders over the last 90 days. Ties break by name.", "enum": [ "", "name_asc", "name_desc", "price_asc", "price_desc", "newest", "popular" ], "type": "string" }, "status": { "default": "", "description": "Filter by catalog status. Empty keeps the storefront default of active only. Use \"draft\" to find products waiting to be reviewed (marketplace imports and unknown SKUs from orders land there), or \"any\" for every status.", "enum": [ "", "draft", "active", "archived", "any" ], "type": "string" }, "stockState": { "default": "", "description": "Filter by stock state, for products that track inventory. \"low\" returns products at or under their reorder threshold; \"out\" returns products with nothing left. Empty applies no stock-state filter.", "enum": [ "", "low", "out" ], "type": "string" }, "tag": { "default": "", "description": "Filter to products carrying this tag. Empty means any tag.", "maxLength": 100, "type": "string" }, "type": { "default": "", "description": "Filter by product type. Empty for any; \"simple\" or \"bundle\".", "enum": [ "", "simple", "bundle" ], "type": "string" }, "warehouseId": { "default": "", "description": "Filter to products in one warehouse by its id, from the warehouse list. Use \"none\" for products assigned to no warehouse — they match no id, so nothing else surfaces them. Empty means any warehouse. An id absent from this workspace is reported as an error, never as an empty result.", "maxLength": 40, "type": "string" } }, "type": "object" }, "name": "search_products", "outputSchema": null }, { "description": "Re-bind this OAuth connection to the workspace selected by the user. Takes effect on the next tool call. Use the organizationId returned by list_workspaces or by WORKSPACE_SELECTION_REQUIRED; never invent or guess it.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "organizationId": { "description": "The workspace organizationId chosen by the user from list_workspaces or WORKSPACE_SELECTION_REQUIRED.", "minLength": 1, "type": "string" } }, "required": [ "organizationId" ], "type": "object" }, "name": "select_workspace", "outputSchema": null }, { "description": "Mark or unmark up to 100 products for one connected sales channel (prom, rozetka, ebay, olx, …). It changes what the CRM intends to send: on Prom and Rozetka the next feed pull adds or drops the product; on eBay it only makes the product a channel member — a listing exists only after create_ebay_drafts and publish_ebay_drafts. It never arms a sync. Adding picks up active products only. Returns { affected, skipped } — skipped were already in that state. Refused until the workspace owner switches on AI publishing. Idempotent. The result echoes the workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "listed": { "description": "true marks the products for this channel; false unmarks them. This only changes what the CRM intends to send — it never arms a sync and never creates a listing by itself. Unmarking a product on Prom drops it from the next feed pull.", "type": "boolean" }, "platform": { "description": "The connected sales channel to change membership on (e.g. prom, rozetka, ebay, olx).", "enum": [ "prom", "rozetka", "woocommerce", "shopify", "olx", "amazon", "ebay", "google_merchant" ], "type": "string" }, "productIds": { "description": "The exact products to change, at most 100 ids fetched with search_products.", "items": { "description": "A product id returned by search_products.", "minLength": 1, "type": "string" }, "maxItems": 100, "minItems": 1, "type": "array" } }, "required": [ "listed", "platform", "productIds" ], "type": "object" }, "name": "set_channel_membership", "outputSchema": null }, { "description": "Create or update a workspace lead source: set its label and active state by key (built-in or custom, lowercase_with_underscores). Idempotent — re-sending the same key updates it. Archiving the fallback 'other' source is not allowed. Use list_lead_sources to see current sources. The result echoes the operating workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "isActive": { "description": "Whether the source is selectable for new leads. Set false to archive it (the fallback 'other' source cannot be archived).", "type": "boolean" }, "key": { "description": "Stable source key, lowercase_with_underscores (built-in or custom).", "maxLength": 80, "minLength": 1, "pattern": "^[a-z0-9]+(?:_[a-z0-9]+)*$", "type": "string" }, "label": { "description": "Human-readable label shown for this source in the UI.", "maxLength": 120, "minLength": 1, "type": "string" } }, "required": [ "isActive", "key", "label" ], "type": "object" }, "name": "set_lead_sources", "outputSchema": null }, { "description": "Move a deal to a pipeline stage by its id. Closed-lost stages require a lostReason. Use search_deals for the deal id and list_pipeline_stages for the target stageId. The result echoes the operating workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "id": { "description": "The deal id returned by search_deals.", "minLength": 1, "type": "string" }, "lostReason": { "anyOf": [ { "maxLength": 500, "type": "string" }, { "type": "null" } ], "description": "Reason the deal was lost. Required when the target stage is a Closed-lost stage; otherwise omit." }, "stageId": { "description": "The target pipeline stage id to move the deal to (from list_pipeline_stages).", "maxLength": 160, "minLength": 1, "type": "string" } }, "required": [ "stageId", "id" ], "type": "object" }, "name": "transition_deal", "outputSchema": null }, { "description": "Update fields on an existing catalog brand by id: name, slug, description, website and description translations. Provide a patch with at least one field; use list_brands first to find the id and current values. Renaming a brand changes the vendor name sent to marketplaces, so rename only on the user's explicit request; the name is never translated. Translations REPLACE the whole set when sent (an empty array removes them all) and are left untouched when omitted — translate only the brand's own description, add no facts. The result is the updated brand and echoes the operating workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "id": { "description": "The brand id returned by list_brands.", "minLength": 1, "type": "string" }, "patch": { "additionalProperties": false, "description": "The brand fields to update; include at least one changed field.", "properties": { "description": { "anyOf": [ { "maxLength": 4000, "type": "string" }, { "type": "null" } ], "description": "Brand description in the workspace's base language (up to 4000 characters). Send null to clear it." }, "name": { "description": "The brand name exactly as marketplaces know the vendor, up to 120 characters; unique in the workspace. Never translated.", "maxLength": 120, "minLength": 1, "type": "string" }, "slug": { "anyOf": [ { "maxLength": 120, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "URL segment for the brand. Normalized to lowercase Latin letters, digits and hyphens whatever is sent; derived from the name when omitted." }, "translations": { "description": "Brand description per locale (the brand NAME is never translated). Omit to leave existing translations untouched; when sent it REPLACES the whole set, so an empty array removes them all.", "items": { "additionalProperties": false, "properties": { "description": { "maxLength": 4000, "type": "string" }, "locale": { "description": "Content locale, one of the workspace's supported languages.", "enum": [ "uk", "ru", "en", "pl", "de", "it", "fr", "es", "pt", "nl", "cs", "sk", "hu", "ro", "bg", "lt", "lv", "et", "tr" ], "example": "en", "type": "string" } }, "required": [ "description", "locale" ], "type": "object" }, "maxItems": 19, "type": "array" }, "website": { "anyOf": [ { "format": "uri", "maxLength": 255, "type": "string" }, { "type": "null" } ], "description": "The brand's website as a full https:// URL. Send null to clear it." } }, "type": "object" } }, "required": [ "id", "patch" ], "type": "object" }, "name": "update_brand", "outputSchema": null }, { "description": "Update fields on an existing catalog category by id: name, parent, slug, description, Google category and translations. Provide a patch with at least one field; use list_categories first to find the id and current values. The slug is normalized to Latin. The parent must exist in this workspace and cannot create a loop. Translations REPLACE the whole set when sent (an empty array removes them all) and are left untouched when omitted — translate only the category's own name and description, add no facts. The result is the updated category and echoes the operating workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "id": { "description": "The category id returned by list_categories.", "minLength": 1, "type": "string" }, "patch": { "additionalProperties": false, "description": "The category fields to update; include at least one changed field.", "properties": { "description": { "anyOf": [ { "maxLength": 4000, "type": "string" }, { "type": "null" } ], "description": "Prose a storefront shows at the top of the category shelf, in the workspace's base language (up to 4000 characters). Send null to clear it." }, "googleProductCategory": { "anyOf": [ { "maxLength": 255, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "Google Product Taxonomy id or full path for this category (for Google Shopping). Separate from the name; send null to clear it." }, "name": { "description": "The category name in the workspace's base language, up to 120 characters. Must be unique among categories with the same parent.", "maxLength": 120, "minLength": 1, "type": "string" }, "parentId": { "anyOf": [ { "maxLength": 160, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "Id of the parent category from list_categories, to nest this one under it; it must exist in this workspace. Omit or send null for a top-level category." }, "slug": { "anyOf": [ { "maxLength": 120, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "URL segment for the category. Normalized to lowercase Latin letters, digits and hyphens whatever is sent (Cyrillic is transliterated); derived from the name when omitted." }, "translations": { "description": "Category name (and optional description) per locale. Omit to leave existing translations untouched; when sent it REPLACES the whole set, so an empty array removes them all.", "items": { "additionalProperties": false, "properties": { "description": { "anyOf": [ { "maxLength": 4000, "type": "string" }, { "type": "null" } ] }, "locale": { "description": "Content locale, one of the workspace's supported languages.", "enum": [ "uk", "ru", "en", "pl", "de", "it", "fr", "es", "pt", "nl", "cs", "sk", "hu", "ro", "bg", "lt", "lv", "et", "tr" ], "example": "en", "type": "string" }, "name": { "maxLength": 120, "type": "string" } }, "required": [ "locale", "name" ], "type": "object" }, "maxItems": 19, "type": "array" } }, "type": "object" } }, "required": [ "id", "patch" ], "type": "object" }, "name": "update_category", "outputSchema": null }, { "description": "Update fields on a company by id. Provide a patch with at least one field. Use search_companies first to find the company id. The result echoes the operating workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "id": { "description": "The company id returned by search_companies.", "minLength": 1, "type": "string" }, "patch": { "additionalProperties": false, "description": "The company fields to update; include at least one changed field.", "properties": { "industry": { "anyOf": [ { "description": "The company's industry.", "maxLength": 120, "type": "string" }, { "type": "null" } ], "description": "The company's industry. Optional." }, "name": { "description": "The company name (unique within the workspace).", "maxLength": 255, "minLength": 1, "type": "string" }, "ownerId": { "anyOf": [ { "description": "User id of the workspace member who owns this company.", "type": "string" }, { "type": "null" } ], "description": "User id of the workspace member who owns this company. Optional." }, "size": { "description": "Company size band. Optional. One of: solo, small, medium, large, enterprise.", "enum": [ "solo", "small", "medium", "large", "enterprise" ], "type": "string" }, "status": { "description": "Relationship status. Optional. One of: prospect, active, inactive.", "enum": [ "prospect", "active", "inactive" ], "type": "string" }, "website": { "anyOf": [ { "description": "The company website URL.", "format": "uri", "maxLength": 255, "type": "string" }, { "type": "null" } ], "description": "The company website URL. Optional." } }, "type": "object" } }, "required": [ "id", "patch" ], "type": "object" }, "name": "update_company", "outputSchema": null }, { "description": "Update fields on a contact by id. Provide a patch with at least one field. Use search_contacts first to find the contact id. The result echoes the operating workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "id": { "description": "The contact id returned by search_contacts.", "minLength": 1, "type": "string" }, "patch": { "additionalProperties": false, "description": "The contact fields to update; include at least one changed field.", "properties": { "companyId": { "anyOf": [ { "description": "Company id to link this contact to (from search_companies).", "type": "string" }, { "type": "null" } ], "description": "Company id to link this contact to (from search_companies). Optional." }, "email": { "anyOf": [ { "description": "The contact's email address.", "format": "email", "maxLength": 255, "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", "type": "string" }, { "type": "null" } ], "description": "The contact's email address. Optional." }, "firstName": { "description": "The contact's first name.", "maxLength": 120, "minLength": 1, "type": "string" }, "jobTitle": { "anyOf": [ { "description": "The contact's job title.", "maxLength": 160, "type": "string" }, { "type": "null" } ], "description": "The contact's job title. Optional." }, "lastName": { "anyOf": [ { "description": "The contact's last name.", "maxLength": 120, "type": "string" }, { "type": "null" } ], "description": "The contact's last name. Optional." }, "ownerId": { "anyOf": [ { "description": "User id of the workspace member who owns this contact.", "type": "string" }, { "type": "null" } ], "description": "User id of the workspace member who owns this contact. Optional." }, "phone": { "anyOf": [ { "description": "The contact's phone number.", "maxLength": 50, "type": "string" }, { "type": "null" } ], "description": "The contact's phone number. Optional." }, "tags": { "description": "Tags for segmentation. Optional.", "items": { "maxLength": 80, "type": "string" }, "type": "array" } }, "type": "object" } }, "required": [ "id", "patch" ], "type": "object" }, "name": "update_contact", "outputSchema": null }, { "description": "Update fields on an existing lead by id. Provide a patch with at least one field. Use search_leads first to find the lead id. The result echoes the operating workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "id": { "description": "The lead id returned by search_leads.", "minLength": 1, "type": "string" }, "patch": { "additionalProperties": false, "description": "The lead fields to update; include at least one changed field.", "properties": { "assignedTo": { "anyOf": [ { "maxLength": 160, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "User id of the workspace member to own the lead; null to unassign." }, "companyName": { "anyOf": [ { "maxLength": 255, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "The lead's company name; null to clear." }, "email": { "anyOf": [ { "format": "email", "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$", "type": "string" }, { "type": "null" } ], "description": "The lead's email; null to clear." }, "name": { "description": "The lead's full name or label.", "maxLength": 255, "minLength": 1, "type": "string" }, "nextActionDate": { "anyOf": [ { "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$", "type": "string" }, { "type": "null" } ], "description": "ISO 8601 timestamp of the next action; null to clear." }, "nextActionNote": { "anyOf": [ { "maxLength": 500, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "What the next action is; null to clear." }, "notes": { "anyOf": [ { "maxLength": 5000, "type": "string" }, { "type": "null" } ], "description": "Free-text notes; null to clear." }, "phone": { "anyOf": [ { "maxLength": 50, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "The lead's phone number; null to clear." }, "position": { "anyOf": [ { "maxLength": 255, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "The lead's job title/position; null to clear." }, "score": { "description": "Lead quality score, 0-100.", "maximum": 100, "minimum": 0, "type": "integer" }, "source": { "description": "Lead source key (see list_lead_sources).", "maxLength": 80, "minLength": 1, "type": "string" }, "status": { "description": "Lead status: new, contacted, qualified, unqualified, or converted.", "enum": [ "new", "contacted", "qualified", "unqualified" ], "type": "string" }, "tags": { "description": "Tags for segmentation (replaces the existing set; max 30).", "items": { "maxLength": 80, "minLength": 1, "type": "string" }, "maxItems": 30, "type": "array" } }, "type": "object" } }, "required": [ "id", "patch" ], "type": "object" }, "name": "update_lead", "outputSchema": null }, { "description": "Update a line item on an order (quantity, unit price, discount, name, or SKU). Recomputes the order total. Use get_order to find the order's externalId and the item's itemId. The result echoes the operating workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "externalId": { "description": "The order externalId returned by list_orders or create_order.", "minLength": 1, "type": "string" }, "itemId": { "description": "The order item id returned by get_order.", "minLength": 1, "type": "string" }, "patch": { "additionalProperties": false, "description": "The order item fields to update; include at least one changed field.", "properties": { "discount": { "description": "Percentage discount on this line (0-100). Default 0.", "maximum": 100, "minimum": 0, "type": "number" }, "productName": { "description": "Line item name, snapshotted onto the order. Use search_products to quote a real catalog product's name. Required.", "maxLength": 255, "minLength": 1, "type": "string" }, "quantity": { "description": "Quantity ordered (integer, at least 1).", "exclusiveMinimum": 0, "maximum": 9007199254740991, "type": "integer" }, "sku": { "description": "Product SKU snapshot (from search_products). Optional.", "maxLength": 120, "type": "string" }, "unitPrice": { "anyOf": [ { "pattern": "^\\d+(\\.\\d{1,2})?$", "type": "string" }, { "minimum": 0, "type": "number" } ], "description": "Price per unit in the order currency, as a decimal (e.g. 199.99). Snapshotted onto the line." } }, "type": "object" } }, "required": [ "externalId", "itemId", "patch" ], "type": "object" }, "name": "update_order_item", "outputSchema": null }, { "description": "Move an order to a new status by externalId. Only valid transitions from the current status are allowed. Use list_orders to find the externalId and get_order to see the current status. The result echoes the operating workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "externalId": { "description": "The order externalId returned by list_orders or create_order.", "minLength": 1, "type": "string" }, "status": { "description": "The new order status. Only valid transitions from the current status are accepted. Allowed values: pending, confirmed, processing, shipped, delivered, cancelled, refunded.", "enum": [ "pending", "confirmed", "processing", "shipped", "delivered", "cancelled", "refunded" ], "type": "string" } }, "required": [ "status", "externalId" ], "type": "object" }, "name": "update_order_status", "outputSchema": null }, { "description": "Update fields on an existing catalog product by id — including status, to publish a draft or archive a product. Provide a patch with at least one field; use get_product first to see the current values. A changed stock number is applied as a relative movement and recorded in the product stock history; prefer adjust_stock when the intent is a correction with a reason. A bundle's stock is derived from its components, so a stock sent for a bundle is refused; sending bundleItems replaces its composition. A product's type (simple or bundle) cannot change after creation — create a new product instead — and a product that is a component of a bundle that is not archived cannot be archived. A change to price, stock, tracking or status is pushed to every connected sales channel. For a product that belongs to a model, a changed shared field (name, description, category, brand, unit, keywords, videos, material, pattern, gender, age group, size type, condition) is applied to the whole model and every article of it; productGroupId null detaches the product from its model, and the code of another model moves it there. The result echoes the operating workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "id": { "description": "The product id returned by search_products.", "minLength": 1, "type": "string" }, "patch": { "additionalProperties": false, "description": "The product fields to update; include at least one changed field.", "properties": { "ageGroup": { "anyOf": [ { "enum": [ "newborn", "infant", "toddler", "kids", "adult" ], "type": "string" }, { "type": "null" } ] }, "brandId": { "anyOf": [ { "maxLength": 160, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "bundleItems": { "description": "Components of a bundle (type bundle only): simple, non-archived products of the bundle's warehouse, each listed once. Selling the bundle deducts these components; the bundle's stock is how many whole bundles they make. On update, sending it replaces the whole composition.", "items": { "additionalProperties": false, "properties": { "productId": { "maxLength": 160, "minLength": 1, "type": "string" }, "quantity": { "exclusiveMinimum": 0, "maximum": 9007199254740991, "type": "integer" } }, "required": [ "productId", "quantity" ], "type": "object" }, "type": "array" }, "categoryId": { "anyOf": [ { "maxLength": 160, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "color": { "anyOf": [ { "maxLength": 80, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "compareAtPrice": { "anyOf": [ { "anyOf": [ { "type": "number" }, { "minLength": 1, "type": "string" } ] }, { "type": "null" } ] }, "condition": { "anyOf": [ { "enum": [ "new", "used", "refurbished" ], "type": "string" }, { "type": "null" } ] }, "costCurrency": { "anyOf": [ { "pattern": "^[A-Z]{3}$", "type": "string" }, { "type": "null" } ] }, "costPrice": { "anyOf": [ { "anyOf": [ { "type": "number" }, { "minLength": 1, "type": "string" } ] }, { "type": "null" } ], "description": "Purchase price per unit, in costCurrency. Ignored for a bundle: its cost is the sum of its components' costs when all are known and in one currency." }, "depth": { "anyOf": [ { "anyOf": [ { "type": "number" }, { "minLength": 1, "type": "string" } ] }, { "type": "null" } ] }, "description": { "anyOf": [ { "maxLength": 2000, "type": "string" }, { "type": "null" } ] }, "dimensionUnit": { "anyOf": [ { "enum": [ "cm", "mm", "in" ], "type": "string" }, { "type": "null" } ] }, "ean": { "anyOf": [ { "pattern": "^[0-9]{8,14}$", "type": "string" }, { "type": "null" } ], "description": "GTIN/EAN-8/12/13/14 barcode. Presence-and-shape validation only, no checksum.", "example": "4006381333931" }, "gender": { "anyOf": [ { "enum": [ "male", "female", "unisex" ], "type": "string" }, { "type": "null" } ] }, "height": { "anyOf": [ { "anyOf": [ { "type": "number" }, { "minLength": 1, "type": "string" } ] }, { "type": "null" } ] }, "images": { "items": { "additionalProperties": false, "properties": { "alt": { "description": "Alternative text of the photo, up to 200 characters. Optional: when empty a storefront should use the product name.", "example": "White leather sneakers, side view", "maxLength": 200, "type": "string" }, "contentType": { "enum": [ "image/jpeg", "image/png", "image/webp" ], "type": "string" }, "name": { "maxLength": 255, "minLength": 1, "type": "string" }, "pathname": { "minLength": 1, "type": "string" }, "size": { "exclusiveMinimum": 0, "maximum": 9007199254740991, "type": "integer" }, "uploadedAt": { "format": "date-time", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$", "type": "string" }, "url": { "format": "uri", "type": "string" } }, "required": [ "url" ], "type": "object" }, "maxItems": 10, "type": "array" }, "material": { "anyOf": [ { "maxLength": 120, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "mpn": { "anyOf": [ { "maxLength": 120, "minLength": 1, "type": "string" }, { "type": "null" } ], "description": "Manufacturer part number — the maker's own code for the item, not the shop SKU. eBay requires it beside the brand in many categories.", "example": "TR-1" }, "name": { "maxLength": 255, "minLength": 1, "type": "string" }, "pattern": { "anyOf": [ { "maxLength": 80, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "price": { "anyOf": [ { "anyOf": [ { "type": "number" }, { "minLength": 1, "type": "string" } ] }, { "type": "null" } ] }, "productGroupId": { "anyOf": [ { "maxLength": 120, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "size": { "anyOf": [ { "maxLength": 60, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "sizeSystem": { "anyOf": [ { "enum": [ "AU", "BR", "CN", "DE", "EU", "FR", "IT", "JP", "MEX", "UK", "US" ], "type": "string" }, { "type": "null" } ] }, "sizeType": { "anyOf": [ { "maxLength": 40, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "sku": { "anyOf": [ { "maxLength": 120, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "status": { "enum": [ "draft", "active", "archived" ], "type": "string" }, "stock": { "anyOf": [ { "maximum": 9007199254740991, "minimum": 0, "type": "integer" }, { "type": "null" } ], "description": "Units on hand, for a product that tracks inventory; a change on update is recorded as a relative movement in the stock history. Refused for a bundle — its stock is derived from its components." }, "supplierId": { "anyOf": [ { "maxLength": 160, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "tags": { "items": { "maxLength": 80, "minLength": 1, "type": "string" }, "type": "array" }, "trackInventory": { "description": "Whether the product counts units. Ignored for a bundle: it tracks stock exactly when one of its components does.", "type": "boolean" }, "type": { "description": "simple, or bundle — one sellable item made of bundleItems, holding no stock of its own. Fixed at creation: an update that changes it is refused.", "enum": [ "simple", "bundle" ], "type": "string" }, "unit": { "anyOf": [ { "maxLength": 40, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "videos": { "description": "Video links for the product page (YouTube, Vimeo or a direct file), https only, at most 5. Links, not uploads. On update, sending the field replaces the whole list.", "example": [ { "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ" } ], "items": { "properties": { "url": { "format": "uri", "type": "string" } }, "required": [ "url" ], "type": "object" }, "maxItems": 5, "type": "array" }, "warehouseId": { "anyOf": [ { "maxLength": 160, "minLength": 1, "type": "string" }, { "type": "null" } ] }, "weight": { "anyOf": [ { "anyOf": [ { "type": "number" }, { "minLength": 1, "type": "string" } ] }, { "type": "null" } ] }, "weightUnit": { "anyOf": [ { "enum": [ "kg", "g", "lb", "oz" ], "type": "string" }, { "type": "null" } ] }, "width": { "anyOf": [ { "anyOf": [ { "type": "number" }, { "minLength": 1, "type": "string" } ] }, { "type": "null" } ] } }, "type": "object" } }, "required": [ "id", "patch" ], "type": "object" }, "name": "update_product", "outputSchema": null }, { "description": "Add or update characteristics (name, value, unit) on ONE product without removing the ones not named. Names match case-insensitively; a new name is appended. For eBay, use the item-specific names exactly as inspect_ebay_listings reported them (details.aspects), in the eBay site's own language — 'Marca' on ebay.it, not 'Brand'. Never invent a value: ask the user. Saves through the same product-card operation as the CRM form, with a version check (on CONFLICT re-read and retry). On a product that belongs to a model: when it is the model's only article, the characteristics are the model's and change for the model; when the model has other articles, a value set here applies to this article only — a characteristic shared by every article is changed on the model card. Idempotent. The result echoes the workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "attributes": { "description": "Characteristics to add or update. Match is case-insensitive by name; every existing characteristic not named here is preserved. Use name/value/unit objects, for example {name:'Stile',value:'Casual',unit:null}.", "items": { "properties": { "name": { "maxLength": 160, "minLength": 1, "type": "string" }, "unit": { "anyOf": [ { "maxLength": 40, "type": "string" }, { "type": "null" } ], "default": null }, "value": { "maxLength": 500, "minLength": 1, "type": "string" } }, "required": [ "name", "value" ], "type": "object" }, "maxItems": 100, "minItems": 1, "type": "array" }, "id": { "description": "The product id returned by search_products or get_product.", "maxLength": 160, "minLength": 1, "type": "string" } }, "required": [ "attributes", "id" ], "type": "object" }, "name": "upsert_product_attributes", "outputSchema": null }, { "description": "Add or update the price ONE product sells at in another currency — for example EUR for an eBay site — keeping its other currencies and its own workspace-currency price. Send only an amount the user stated: never a converted or estimated price. The product's own currency is refused; change that with update_product's price. Saves through the same product-card operation as the CRM form, with a version check (on CONFLICT re-read the product and retry), and the new price reaches connected channels like a manual edit. Idempotent. The result echoes the workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "id": { "description": "The product id returned by search_products or get_product.", "maxLength": 160, "minLength": 1, "type": "string" }, "prices": { "description": "Channel prices to add or update, one row per currency (uppercase 3-letter ISO code, e.g. EUR), an amount greater than 0. Refused for the product's own workspace currency — use update_product's price field for that one. Never a converted or guessed value: send exactly the amount the user gave for that market.", "items": { "properties": { "compareAtPrice": { "anyOf": [ { "pattern": "^\\d+(\\.\\d{1,2})?$", "type": "string" }, { "type": "null" } ] }, "currency": { "maxLength": 3, "minLength": 3, "type": "string" }, "price": { "pattern": "^\\d+(\\.\\d{1,2})?$", "type": "string" } }, "required": [ "currency", "price" ], "type": "object" }, "maxItems": 10, "minItems": 1, "type": "array" } }, "required": [ "id", "prices" ], "type": "object" }, "name": "upsert_product_prices", "outputSchema": null }, { "description": "Write ONE language of ONE product's translation — title, description, keywords, colour, material or pattern in that language — keeping the other languages and every field not named. Use it when a marketplace publishes in another language (ebay.it reads Italian, Prom and Rozetka read uk and ru) or inspect_ebay_listings reports a title over 80 characters in the site's language. Translate the product's OWN text from get_product and add no fact it does not state; show the user the text before writing. For a product that belongs to a model the translation is the model's, so every article of it changes. Saves through the CRM's own Переклади tab operation with its version check (on CONFLICT re-read the product and retry). Idempotent. The result echoes the workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "color": { "description": "Colour name.", "maxLength": 80, "type": "string" }, "description": { "description": "The description in this language. An empty string clears it.", "maxLength": 20000, "type": "string" }, "id": { "description": "The product id returned by search_products or get_product.", "maxLength": 160, "minLength": 1, "type": "string" }, "keywords": { "description": "Search keywords in this language; replaces the list.", "items": { "maxLength": 120, "type": "string" }, "maxItems": 20, "type": "array" }, "locale": { "description": "The language to write, as an ISO 639-1 code — for a marketplace, the site's own language (it on ebay.it, de on ebay.de, uk or ru for Prom and Rozetka).", "enum": [ "uk", "ru", "en", "pl", "de", "it", "fr", "es", "pt", "nl", "cs", "sk", "hu", "ro", "bg", "lt", "lv", "et", "tr" ], "type": "string" }, "material": { "description": "Material.", "maxLength": 120, "type": "string" }, "name": { "description": "The product title in this language. eBay shows at most 80 characters. An empty string clears it, so the base name publishes.", "maxLength": 255, "type": "string" }, "pattern": { "description": "Pattern.", "maxLength": 80, "type": "string" } }, "required": [ "id", "locale" ], "type": "object" }, "name": "upsert_product_translation", "outputSchema": null }, { "description": "End the LIVE eBay listing of up to 25 products: they stop being buyer-visible and their offers return to drafts — nothing is deleted, and publish_ebay_drafts can put them back. Needs the owner's AI publishing switch. Returns done, failed and notAttempted. The result echoes the workspace.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "properties": { "productIds": { "description": "End each product's LIVE eBay listing, at most 25 ids fetched with search_products. The listing stops being buyer-visible and its offer returns to a draft — it is NOT deleted.", "items": { "description": "A product id returned by search_products.", "minLength": 1, "type": "string" }, "maxItems": 25, "minItems": 1, "type": "array" } }, "required": [ "productIds" ], "type": "object" }, "name": "withdraw_ebay_listings", "outputSchema": null } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:6b934caf7ca9c1c239474207f1a037c79209a17f8664844cbaa6a0a57c624d7d | sha256sum