---
title: "Product tools"
description: "Create and edit products, offers, notes, research documents and hero images."
url: "https://sellify.ai/docs/developers/mcp-tools/products"
---

# Product tools

> Create and edit products, offers, notes, research documents and hero images.

Create and edit products, offers, notes, research documents and hero images. This page lists 25 tools, 3 of them read-only.

- [`ecom_product_list`](#ecom_product_list): List Ecom products
- [`ecom_product_get`](#ecom_product_get): Get an Ecom product
- [`ecom_hero_image_get_generation_status`](#ecom_hero_image_get_generation_status): Get hero-image generation status
- [`ecom_hero_image_generate`](#ecom_hero_image_generate): Generate hero images for a product
- [`ecom_hero_image_create`](#ecom_hero_image_create): Attach an uploaded hero image
- [`ecom_hero_image_pull_from_urls`](#ecom_hero_image_pull_from_urls): Pull hero images from saved product URLs
- [`ecom_hero_image_keep`](#ecom_hero_image_keep): Keep a generated hero image
- [`ecom_hero_image_set_primary`](#ecom_hero_image_set_primary): Set the primary hero image
- [`ecom_hero_image_delete`](#ecom_hero_image_delete): Delete a hero image
- [`ecom_hero_image_bulk_delete`](#ecom_hero_image_bulk_delete): Delete multiple hero images
- [`ecom_hero_image_remove_background`](#ecom_hero_image_remove_background): Remove a hero image background
- [`ecom_hero_image_bulk_remove_backgrounds`](#ecom_hero_image_bulk_remove_backgrounds): Remove multiple hero image backgrounds
- [`ecom_product_note_create`](#ecom_product_note_create): Add a note, idea, or to-do to a product
- [`ecom_product_draft_from_url`](#ecom_product_draft_from_url): Draft product details from a URL
- [`ecom_product_create`](#ecom_product_create): Create a product
- [`ecom_product_update`](#ecom_product_update): Update a product
- [`ecom_product_delete`](#ecom_product_delete): Delete a product
- [`ecom_product_regenerate_description`](#ecom_product_regenerate_description): Regenerate missing product description fields
- [`ecom_product_note_update`](#ecom_product_note_update): Update a product note
- [`ecom_product_note_delete`](#ecom_product_note_delete): Delete a product note
- [`ecom_product_offer_create`](#ecom_product_offer_create): Create a product offer
- [`ecom_product_offer_update`](#ecom_product_offer_update): Update a product offer
- [`ecom_product_offer_delete`](#ecom_product_offer_delete): Delete a product offer
- [`ecom_product_research_document_add`](#ecom_product_research_document_add): Attach an uploaded research document
- [`ecom_product_research_document_delete`](#ecom_product_research_document_delete): Delete a product research document

## `ecom_product_list`

**List Ecom products**

Lists products in the workspace with safe summaries, optional text filtering, and cursor pagination.

| Property       | Value                  |
| -------------- | ---------------------- |
| Access         | Read-only              |
| Scope          | Ads: read (`ads:read`) |
| Credits        | Free                   |
| Safe to repeat | Yes                    |

### Input

| Field             | Type           | Required | Description                                                                                                                                                                                                                      |
| ----------------- | -------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `query`           | string         | No       | Length up to 120.                                                                                                                                                                                                                |
| `limit`           | integer        | No       | Between 1 and 100. Defaults to `25`.                                                                                                                                                                                             |
| `cursor`          | string or null | No       |                                                                                                                                                                                                                                  |
| `response_format` | enum           | No       | "concise" (the default) shortens long text and leaves out nested details in each result. Pass "detailed" only when you need the full text or nested details of a result. One of: `concise`, `detailed`. Defaults to `"concise"`. |

### Output

| Field        | Type            | Description      |
| ------------ | --------------- | ---------------- |
| `products`   | array of object | Items up to 100. |
| `nextCursor` | string or null  |                  |
| `hasMore`    | boolean         |                  |

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ecom_product_list",
    "arguments": {}
  }
}
```

## `ecom_product_get`

**Get an Ecom product**

Gets one workspace product with safe notes, offers, research-document metadata, and displayable hero-image URLs.

| Property       | Value                  |
| -------------- | ---------------------- |
| Access         | Read-only              |
| Scope          | Ads: read (`ads:read`) |
| Credits        | Free                   |
| Safe to repeat | Yes                    |

### Input

| Field             | Type   | Required | Description                                                                                                                                                                                                                      |
| ----------------- | ------ | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `productId`       | string | Yes      |                                                                                                                                                                                                                                  |
| `response_format` | enum   | No       | "concise" (the default) shortens long text and leaves out nested details in each result. Pass "detailed" only when you need the full text or nested details of a result. One of: `concise`, `detailed`. Defaults to `"concise"`. |

### Output

| Field               | Type                  | Description        |
| ------------------- | --------------------- | ------------------ |
| `id`                | string                |                    |
| `name`              | string                | Length up to 200.  |
| `description`       | string                | Length up to 5000. |
| `imageUrl`          | string (uri)          |                    |
| `urls`              | array of string (uri) | Items up to 20.    |
| `emoji`             | string                | Length up to 16.   |
| `offers`            | array of object       |                    |
| `notes`             | array of object       |                    |
| `researchDocuments` | array of object       |                    |
| `heroImages`        | array of object       | Items up to 100.   |
| `createdAt`         | string                |                    |
| `updatedAt`         | string                |                    |

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ecom_product_get",
    "arguments": {
      "productId": "example"
    }
  }
}
```

## `ecom_hero_image_get_generation_status`

**Get hero-image generation status**

Returns status and generated/failed counts for one hero-image generation. Finished hero images are saved on the product.

| Property       | Value                  |
| -------------- | ---------------------- |
| Access         | Read-only              |
| Scope          | Ads: read (`ads:read`) |
| Credits        | Free                   |
| Safe to repeat | Yes                    |

### Input

| Field          | Type          | Required | Description |
| -------------- | ------------- | -------- | ----------- |
| `submissionId` | string (uuid) | Yes      |             |

### Output

| Field             | Type           | Description                                             |
| ----------------- | -------------- | ------------------------------------------------------- |
| `id`              | string (uuid)  |                                                         |
| `status`          | enum           | One of: `pending`, `processing`, `completed`, `failed`. |
| `lifecycleStatus` | enum           | One of: `pending`, `completed`, `partial`, `failed`.    |
| `error`           | string or null |                                                         |
| `result`          | object or null |                                                         |
| `createdAt`       | string         |                                                         |
| `completedAt`     | string or null |                                                         |

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ecom_hero_image_get_generation_status",
    "arguments": {
      "submissionId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    }
  }
}
```

## `ecom_hero_image_generate`

**Generate hero images for a product**

Queues hero image generation for a product and returns the submission id to poll. Charges hero image credits when the work completes.

| Property        | Value                                                     |
| --------------- | --------------------------------------------------------- |
| Access          | Writes data                                               |
| Scope           | Ads: write (`ads:write`)                                  |
| Credits         | About 14 to 56 credits, depending on quantity and options |
| Who can call it | Workspace owners and admins                               |

### Input

| Field                        | Type                   | Required | Description                                                                                           |
| ---------------------------- | ---------------------- | -------- | ----------------------------------------------------------------------------------------------------- |
| `productId`                  | string (uuid)          | Yes      |                                                                                                       |
| `prompt`                     | string                 | Yes      | Length 1 to 3000.                                                                                     |
| `imageCount`                 | integer                | No       | Between 1 and 4. Defaults to `2`.                                                                     |
| `referenceImageStoragePaths` | array of string        | No       | Items up to 5.                                                                                        |
| `referenceHeroImageIds`      | array of string (uuid) | No       | Items up to 5.                                                                                        |
| `sourceHeroImageId`          | string (uuid)          | No       |                                                                                                       |
| `idempotency_key`            | string                 | No       | Client-chosen key identifying this write. Reuse it only when retrying the same call. Length 1 to 200. |
| `max_credits`                | number                 | Yes      | The most credits this call may spend, with at most two decimals. Up to 10000.                         |

### Output

| Field             | Type           | Description                                                                              |
| ----------------- | -------------- | ---------------------------------------------------------------------------------------- |
| `submissionId`    | string (uuid)  |                                                                                          |
| `reused`          | boolean        |                                                                                          |
| `status`          | enum           | One of: `pending`, `completed`, `partial`, `failed`.                                     |
| `credits_charged` | number         | Workspace credits charged by this call.                                                  |
| `credits_left`    | number or null | Workspace credits remaining after this call, or null when the balance could not be read. |

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ecom_hero_image_generate",
    "arguments": {
      "productId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "prompt": "example",
      "max_credits": 1
    }
  }
}
```

## `ecom_hero_image_create`

**Attach an uploaded hero image**

Attaches a validated image already uploaded to the product hero namespace. The storage path must be issued by a trusted transport, never authored by a model.

Use this when the user gives you a photo of their product, attached in chat or as a link, and wants it on a saved product. Look the product up first. Sellify checks the image and stores it; the product keeps at most 20 hero images.

| Property        | Value                              |
| --------------- | ---------------------------------- |
| Access          | Writes data                        |
| Scope           | Products: write (`products:write`) |
| Credits         | Free                               |
| Who can call it | Workspace owners and admins        |

### Input

| Field             | Type          | Required | Description                                                                                                                                                                      |
| ----------------- | ------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `productId`       | string (uuid) | Yes      |                                                                                                                                                                                  |
| `file`            | object        | Yes      | The product photo to add. A PNG, JPEG, WebP, or GIF file up to 8 MB. Pass the file the user attached in ChatGPT, an upload\_id from create\_file\_upload, or a public https url. |
| `idempotency_key` | string        | No       | Client-chosen key identifying this write. Reuse it only when retrying the same call. Length 1 to 200.                                                                            |

### Output

| Field                       | Type               | Description                                   |
| --------------------------- | ------------------ | --------------------------------------------- |
| `id`                        | string             |                                               |
| `mimeType`                  | string             |                                               |
| `source`                    | enum               | One of: `upload`, `url_pull`, `ai_generated`. |
| `width`                     | integer            |                                               |
| `height`                    | integer            |                                               |
| `sizeBytes`                 | integer            |                                               |
| `createdAt`                 | string             |                                               |
| `backgroundRemoved`         | boolean            |                                               |
| `backgroundRemovalFailedAt` | string (date-time) |                                               |
| `pendingReview`             | boolean            |                                               |
| `isPrimary`                 | boolean            |                                               |
| `resolutionProof`           | string             | Length 1 to 256.                              |

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ecom_hero_image_create",
    "arguments": {
      "productId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "file": {}
    }
  }
}
```

## `ecom_hero_image_pull_from_urls`

**Pull hero images from saved product URLs**

Finds safe image candidates on the selected product’s saved URLs, downloads them, and attaches the accepted images to the product.

| Property        | Value                              |
| --------------- | ---------------------------------- |
| Access          | Writes data                        |
| Scope           | Products: write (`products:write`) |
| Credits         | Free                               |
| Who can call it | Workspace owners and admins        |

### Input

| Field             | Type          | Required | Description                                                                                           |
| ----------------- | ------------- | -------- | ----------------------------------------------------------------------------------------------------- |
| `productId`       | string (uuid) | Yes      |                                                                                                       |
| `maxPerUrl`       | integer       | No       | Between 1 and 20.                                                                                     |
| `idempotency_key` | string        | No       | Client-chosen key identifying this write. Reuse it only when retrying the same call. Length 1 to 200. |

### Output

| Field         | Type            | Description                                                                                                                     |
| ------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| `heroImages`  | array of object |                                                                                                                                 |
| `emptyReason` | enum or null    | One of: `unsafe_urls`, `scrape_failed`, `no_candidates`, `all_duplicates`, `downloads_failed`, `uploads_failed`, `no_capacity`. |

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ecom_hero_image_pull_from_urls",
    "arguments": {
      "productId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    }
  }
}
```

## `ecom_hero_image_keep`

**Keep a generated hero image**

Accepts a generated hero image that is pending review. Repeating the action converges on the same kept image.

| Property        | Value                              |
| --------------- | ---------------------------------- |
| Access          | Writes data                        |
| Scope           | Products: write (`products:write`) |
| Credits         | Free                               |
| Who can call it | Workspace owners and admins        |
| Safe to repeat  | Yes                                |

### Input

| Field         | Type          | Required | Description |
| ------------- | ------------- | -------- | ----------- |
| `productId`   | string (uuid) | Yes      |             |
| `heroImageId` | string (uuid) | Yes      |             |

### Output

| Field                       | Type               | Description                                   |
| --------------------------- | ------------------ | --------------------------------------------- |
| `id`                        | string             |                                               |
| `mimeType`                  | string             |                                               |
| `source`                    | enum               | One of: `upload`, `url_pull`, `ai_generated`. |
| `width`                     | integer            |                                               |
| `height`                    | integer            |                                               |
| `sizeBytes`                 | integer            |                                               |
| `createdAt`                 | string             |                                               |
| `backgroundRemoved`         | boolean            |                                               |
| `backgroundRemovalFailedAt` | string (date-time) |                                               |
| `pendingReview`             | boolean            |                                               |
| `isPrimary`                 | boolean            |                                               |
| `resolutionProof`           | string             | Length 1 to 256.                              |

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ecom_hero_image_keep",
    "arguments": {
      "productId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "heroImageId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    }
  }
}
```

## `ecom_hero_image_set_primary`

**Set the primary hero image**

Sets an existing kept hero image as the product primary image. Repeating the selection converges on the same state.

| Property        | Value                              |
| --------------- | ---------------------------------- |
| Access          | Writes data                        |
| Scope           | Products: write (`products:write`) |
| Credits         | Free                               |
| Who can call it | Workspace owners and admins        |
| Safe to repeat  | Yes                                |

### Input

| Field         | Type          | Required | Description |
| ------------- | ------------- | -------- | ----------- |
| `productId`   | string (uuid) | Yes      |             |
| `heroImageId` | string (uuid) | Yes      |             |

### Output

| Field                       | Type               | Description                                   |
| --------------------------- | ------------------ | --------------------------------------------- |
| `id`                        | string             |                                               |
| `mimeType`                  | string             |                                               |
| `source`                    | enum               | One of: `upload`, `url_pull`, `ai_generated`. |
| `width`                     | integer            |                                               |
| `height`                    | integer            |                                               |
| `sizeBytes`                 | integer            |                                               |
| `createdAt`                 | string             |                                               |
| `backgroundRemoved`         | boolean            |                                               |
| `backgroundRemovalFailedAt` | string (date-time) |                                               |
| `pendingReview`             | boolean            |                                               |
| `isPrimary`                 | boolean            |                                               |
| `resolutionProof`           | string             | Length 1 to 256.                              |

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ecom_hero_image_set_primary",
    "arguments": {
      "productId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "heroImageId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    }
  }
}
```

## `ecom_hero_image_delete`

**Delete a hero image**

Removes a hero image from its product and durably queues the stored blob for reference-safe deletion. Repeating the deletion reports success and retries queued cleanup.

| Property        | Value                              |
| --------------- | ---------------------------------- |
| Access          | Changes or deletes data            |
| Scope           | Products: write (`products:write`) |
| Credits         | Free                               |
| Who can call it | Workspace owners and admins        |
| Safe to repeat  | Yes                                |

### Input

| Field         | Type          | Required | Description |
| ------------- | ------------- | -------- | ----------- |
| `productId`   | string (uuid) | Yes      |             |
| `heroImageId` | string (uuid) | Yes      |             |

### Output

| Field            | Type    | Description      |
| ---------------- | ------- | ---------------- |
| `success`        | true    |                  |
| `requestedCount` | 1       |                  |
| `deletedCount`   | integer | Between 0 and 1. |
| `failedCount`    | 0       |                  |

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ecom_hero_image_delete",
    "arguments": {
      "productId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "heroImageId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
    }
  }
}
```

## `ecom_hero_image_bulk_delete`

**Delete multiple hero images**

Removes the selected hero images from a product and durably queues their stored blobs for reference-safe deletion. Missing images are no-ops that still retry queued cleanup.

| Property        | Value                              |
| --------------- | ---------------------------------- |
| Access          | Changes or deletes data            |
| Scope           | Products: write (`products:write`) |
| Credits         | Free                               |
| Who can call it | Workspace owners and admins        |
| Safe to repeat  | Yes                                |

### Input

| Field          | Type                   | Required | Description    |
| -------------- | ---------------------- | -------- | -------------- |
| `productId`    | string (uuid)          | Yes      |                |
| `heroImageIds` | array of string (uuid) | Yes      | Items 1 to 50. |

### Output

| Field            | Type    | Description |
| ---------------- | ------- | ----------- |
| `requestedCount` | integer |             |
| `deletedCount`   | integer |             |
| `failedCount`    | 0       |             |

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ecom_hero_image_bulk_delete",
    "arguments": {
      "productId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "heroImageIds": [
        "3fa85f64-5717-4562-b3fc-2c963f66afa6"
      ]
    }
  }
}
```

## `ecom_hero_image_remove_background`

**Remove a hero image background**

Removes the background from one product hero image. Only a newly delivered cutout is charged; completed and failed attempts are free.

Read the product first: its hero images carry the ids and show whether each background is already removed. The cutout replaces the hero image in place and runs before this call returns, which can take up to two minutes for many images. If the call times out, read the product again before retrying: images still being processed are reported as skipped.

| Property        | Value                       |
| --------------- | --------------------------- |
| Access          | Changes or deletes data     |
| Scope           | Ads: write (`ads:write`)    |
| Credits         | About 0.05 credits          |
| Who can call it | Workspace owners and admins |

### Input

| Field         | Type          | Required | Description                                                                   |
| ------------- | ------------- | -------- | ----------------------------------------------------------------------------- |
| `productId`   | string (uuid) | Yes      |                                                                               |
| `heroImageId` | string (uuid) | Yes      |                                                                               |
| `max_credits` | number        | Yes      | The most credits this call may spend, with at most two decimals. Up to 10000. |

### Output

| Field             | Type           | Description                                                                              |
| ----------------- | -------------- | ---------------------------------------------------------------------------------------- |
| `requestedCount`  | 1              |                                                                                          |
| `affectedCount`   | integer        |                                                                                          |
| `succeededCount`  | integer        |                                                                                          |
| `failedCount`     | integer        |                                                                                          |
| `skippedCount`    | integer        |                                                                                          |
| `success`         | boolean        |                                                                                          |
| `credits_charged` | number         | Workspace credits charged by this call.                                                  |
| `credits_left`    | number or null | Workspace credits remaining after this call, or null when the balance could not be read. |

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ecom_hero_image_remove_background",
    "arguments": {
      "productId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "heroImageId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "max_credits": 1
    }
  }
}
```

## `ecom_hero_image_bulk_remove_backgrounds`

**Remove multiple hero image backgrounds**

Removes backgrounds from selected product hero images and reports exact affected, succeeded, failed, and skipped counts. Only delivered cutouts are charged.

Read the product first: its hero images carry the ids and show whether each background is already removed. The cutout replaces the hero image in place and runs before this call returns, which can take up to two minutes for many images. If the call times out, read the product again before retrying: images still being processed are reported as skipped.

| Property        | Value                                                      |
| --------------- | ---------------------------------------------------------- |
| Access          | Changes or deletes data                                    |
| Scope           | Ads: write (`ads:write`)                                   |
| Credits         | About 0.05 to 1 credits, depending on quantity and options |
| Who can call it | Workspace owners and admins                                |

### Input

| Field          | Type                   | Required | Description                                                                   |
| -------------- | ---------------------- | -------- | ----------------------------------------------------------------------------- |
| `productId`    | string (uuid)          | Yes      |                                                                               |
| `heroImageIds` | array of string (uuid) | Yes      | Items 1 to 20.                                                                |
| `max_credits`  | number                 | Yes      | The most credits this call may spend, with at most two decimals. Up to 10000. |

### Output

| Field             | Type           | Description                                                                              |
| ----------------- | -------------- | ---------------------------------------------------------------------------------------- |
| `requestedCount`  | integer        |                                                                                          |
| `affectedCount`   | integer        |                                                                                          |
| `succeededCount`  | integer        |                                                                                          |
| `failedCount`     | integer        |                                                                                          |
| `skippedCount`    | integer        |                                                                                          |
| `processedCount`  | integer        |                                                                                          |
| `credits_charged` | number         | Workspace credits charged by this call.                                                  |
| `credits_left`    | number or null | Workspace credits remaining after this call, or null when the balance could not be read. |

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ecom_hero_image_bulk_remove_backgrounds",
    "arguments": {
      "productId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "heroImageIds": [
        "3fa85f64-5717-4562-b3fc-2c963f66afa6"
      ],
      "max_credits": 1
    }
  }
}
```

## `ecom_product_note_create`

**Add a note, idea, or to-do to a product**

Adds a note to an existing product and returns the created note. Set type to note, idea, or todo, and put the text in body. A new todo starts not done.

Pass a unique idempotency\_key per intended write; retrying with the same key returns the first result instead of writing twice.

| Property        | Value                              |
| --------------- | ---------------------------------- |
| Access          | Writes data                        |
| Scope           | Products: write (`products:write`) |
| Credits         | Free                               |
| Who can call it | Workspace owners and admins        |
| Safe to repeat  | Yes                                |

### Input

| Field             | Type   | Required | Description                                                                                           |
| ----------------- | ------ | -------- | ----------------------------------------------------------------------------------------------------- |
| `productId`       | string | Yes      |                                                                                                       |
| `type`            | enum   | Yes      | One of: `note`, `idea`, `todo`.                                                                       |
| `body`            | string | Yes      | Length 1 to 500.                                                                                      |
| `idempotency_key` | string | Yes      | Client-chosen key identifying this write. Reuse it only when retrying the same call. Length 1 to 200. |

### Output

| Field  | Type   | Description |
| ------ | ------ | ----------- |
| `note` | object |             |

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ecom_product_note_create",
    "arguments": {
      "productId": "example",
      "type": "note",
      "body": "example",
      "idempotency_key": "example"
    }
  }
}
```

## `ecom_product_draft_from_url`

**Draft product details from a URL**

Reads a public product page and drafts product details and candidate hero images. This uses product-from-URL credits but does not save a product; use the product create action after the user reviews the draft.

Use this when the user gives a store or product page URL for a product to add. It saves nothing: show the user the drafted name and description, then create the product with the fields they approve.

| Property        | Value                              |
| --------------- | ---------------------------------- |
| Access          | Writes data                        |
| Scope           | Products: write (`products:write`) |
| Credits         | About 4 credits                    |
| Who can call it | Workspace owners and admins        |

### Input

| Field             | Type         | Required | Description                                                                                           |
| ----------------- | ------------ | -------- | ----------------------------------------------------------------------------------------------------- |
| `url`             | string (uri) | Yes      | Public product-page URL to read and turn into a product draft.                                        |
| `idempotency_key` | string       | No       | Client-chosen key identifying this write. Reuse it only when retrying the same call. Length 1 to 200. |
| `max_credits`     | number       | Yes      | The most credits this call may spend, with at most two decimals. Up to 10000.                         |

### Output

| Field                    | Type                  | Description                                                                              |
| ------------------------ | --------------------- | ---------------------------------------------------------------------------------------- |
| `name`                   | string                | Length up to 200.                                                                        |
| `brandName`              | string or null        |                                                                                          |
| `skuName`                | string or null        |                                                                                          |
| `description`            | string                | Length up to 4500.                                                                       |
| `urls`                   | array of string (uri) | Items up to 20.                                                                          |
| `suggestedEmoji`         | string                | Length up to 8.                                                                          |
| `candidateHeroImageUrls` | array of string (uri) | Items up to 8.                                                                           |
| `credits_charged`        | number                | Workspace credits charged by this call.                                                  |
| `credits_left`           | number or null        | Workspace credits remaining after this call, or null when the balance could not be read. |

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ecom_product_draft_from_url",
    "arguments": {
      "url": "https://example.com",
      "max_credits": 1
    }
  }
}
```

## `ecom_product_create`

**Create a product**

Creates an Ecom product from reviewed product fields and optional already-uploaded research documents.

| Property        | Value                              |
| --------------- | ---------------------------------- |
| Access          | Writes data                        |
| Scope           | Products: write (`products:write`) |
| Credits         | Free                               |
| Who can call it | Workspace owners and admins        |

### Input

| Field               | Type                  | Required | Description                                                                                           |
| ------------------- | --------------------- | -------- | ----------------------------------------------------------------------------------------------------- |
| `name`              | string                | Yes      | Length 1 to 200.                                                                                      |
| `description`       | string                | No       | Length up to 5000. Defaults to `""`.                                                                  |
| `imageUrl`          | string (uri)          | No       |                                                                                                       |
| `urls`              | array of string (uri) | No       | Items up to 20. Defaults to `[]`.                                                                     |
| `emoji`             | string                | No       | Length up to 16.                                                                                      |
| `researchDocuments` | array of object       | No       | Items up to 10. Defaults to `[]`.                                                                     |
| `idempotency_key`   | string                | No       | Client-chosen key identifying this write. Reuse it only when retrying the same call. Length 1 to 200. |

### Output

| Field                | Type                  | Description |
| -------------------- | --------------------- | ----------- |
| `id`                 | string                |             |
| `name`               | string                |             |
| `description`        | string                |             |
| `imageUrl`           | string (uri)          |             |
| `urls`               | array of string (uri) |             |
| `emoji`              | string                |             |
| `offers`             | array of object       |             |
| `heroImages`         | array of object       |             |
| `primaryHeroImageId` | string                |             |
| `notes`              | array of object       |             |
| `researchDocuments`  | array of object       |             |
| `createdAt`          | string                |             |
| `updatedAt`          | string                |             |

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ecom_product_create",
    "arguments": {
      "name": "example"
    }
  }
}
```

## `ecom_product_update`

**Update a product**

Updates the selected product name, description, image URL, source URLs, or emoji. Repeating the same update converges on the same product fields.

| Property        | Value                              |
| --------------- | ---------------------------------- |
| Access          | Changes or deletes data            |
| Scope           | Products: write (`products:write`) |
| Credits         | Free                               |
| Who can call it | Workspace owners and admins        |
| Safe to repeat  | Yes                                |

### Input

| Field         | Type                  | Required | Description        |
| ------------- | --------------------- | -------- | ------------------ |
| `productId`   | string                | Yes      |                    |
| `name`        | string                | No       | Length 1 to 200.   |
| `description` | string                | No       | Length up to 5000. |
| `imageUrl`    | string (uri) or null  | No       |                    |
| `urls`        | array of string (uri) | No       | Items up to 20.    |
| `emoji`       | string or null        | No       |                    |

### Output

| Field                | Type                  | Description |
| -------------------- | --------------------- | ----------- |
| `id`                 | string                |             |
| `name`               | string                |             |
| `description`        | string                |             |
| `imageUrl`           | string (uri)          |             |
| `urls`               | array of string (uri) |             |
| `emoji`              | string                |             |
| `offers`             | array of object       |             |
| `heroImages`         | array of object       |             |
| `primaryHeroImageId` | string                |             |
| `notes`              | array of object       |             |
| `researchDocuments`  | array of object       |             |
| `createdAt`          | string                |             |
| `updatedAt`          | string                |             |

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ecom_product_update",
    "arguments": {
      "productId": "example"
    }
  }
}
```

## `ecom_product_delete`

**Delete a product**

Deletes the selected product, removes its sales-angle links, and cleans up its unreferenced stored files. Repeating the deletion reports success.

| Property        | Value                              |
| --------------- | ---------------------------------- |
| Access          | Changes or deletes data            |
| Scope           | Products: write (`products:write`) |
| Credits         | Free                               |
| Who can call it | Workspace owners and admins        |
| Safe to repeat  | Yes                                |

### Input

| Field       | Type   | Required | Description |
| ----------- | ------ | -------- | ----------- |
| `productId` | string | Yes      |             |

### Output

| Field     | Type | Description |
| --------- | ---- | ----------- |
| `success` | true |             |

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ecom_product_delete",
    "arguments": {
      "productId": "example"
    }
  }
}
```

## `ecom_product_regenerate_description`

**Regenerate missing product description fields**

Reads the selected product’s saved URLs and fills only a missing description or emoji. Existing user-written values are never overwritten. Successful page drafts use product-from-URL credits.

Use this when a saved product has no description and the user wants Sellify to write one from its product page. It changes nothing when the product already has a description and emoji. To rewrite an existing description, write the new text with the user and save it with the product update tool.

| Property        | Value                              |
| --------------- | ---------------------------------- |
| Access          | Writes data                        |
| Scope           | Products: write (`products:write`) |
| Credits         | About 4 credits                    |
| Who can call it | Workspace owners and admins        |

### Input

| Field             | Type   | Required | Description                                                                                           |
| ----------------- | ------ | -------- | ----------------------------------------------------------------------------------------------------- |
| `productId`       | string | Yes      |                                                                                                       |
| `idempotency_key` | string | No       | Client-chosen key identifying this write. Reuse it only when retrying the same call. Length 1 to 200. |
| `max_credits`     | number | Yes      | The most credits this call may spend, with at most two decimals. Up to 10000.                         |

### Output

| Field                | Type                  | Description                                                                              |
| -------------------- | --------------------- | ---------------------------------------------------------------------------------------- |
| `id`                 | string                |                                                                                          |
| `name`               | string                |                                                                                          |
| `description`        | string                |                                                                                          |
| `imageUrl`           | string (uri)          |                                                                                          |
| `urls`               | array of string (uri) |                                                                                          |
| `emoji`              | string                |                                                                                          |
| `offers`             | array of object       |                                                                                          |
| `heroImages`         | array of object       |                                                                                          |
| `primaryHeroImageId` | string                |                                                                                          |
| `notes`              | array of object       |                                                                                          |
| `researchDocuments`  | array of object       |                                                                                          |
| `createdAt`          | string                |                                                                                          |
| `updatedAt`          | string                |                                                                                          |
| `credits_charged`    | number                | Workspace credits charged by this call.                                                  |
| `credits_left`       | number or null        | Workspace credits remaining after this call, or null when the balance could not be read. |

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ecom_product_regenerate_description",
    "arguments": {
      "productId": "example",
      "max_credits": 1
    }
  }
}
```

## `ecom_product_note_update`

**Update a product note**

Updates one product note: its body text, or for a todo, whether it is done. Notes and ideas cannot be marked done.

| Property        | Value                              |
| --------------- | ---------------------------------- |
| Access          | Changes or deletes data            |
| Scope           | Products: write (`products:write`) |
| Credits         | Free                               |
| Who can call it | Workspace owners and admins        |
| Safe to repeat  | Yes                                |

### Input

| Field       | Type    | Required | Description      |
| ----------- | ------- | -------- | ---------------- |
| `productId` | string  | Yes      |                  |
| `noteId`    | string  | Yes      |                  |
| `body`      | string  | No       | Length 1 to 500. |
| `done`      | boolean | No       |                  |

### Output

| Field  | Type   | Description |
| ------ | ------ | ----------- |
| `note` | object |             |

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ecom_product_note_update",
    "arguments": {
      "productId": "example",
      "noteId": "example"
    }
  }
}
```

## `ecom_product_note_delete`

**Delete a product note**

Deletes a note, idea, or todo from the selected product. Repeating the deletion reports success.

| Property        | Value                              |
| --------------- | ---------------------------------- |
| Access          | Changes or deletes data            |
| Scope           | Products: write (`products:write`) |
| Credits         | Free                               |
| Who can call it | Workspace owners and admins        |
| Safe to repeat  | Yes                                |

### Input

| Field       | Type   | Required | Description |
| ----------- | ------ | -------- | ----------- |
| `productId` | string | Yes      |             |
| `noteId`    | string | Yes      |             |

### Output

| Field     | Type | Description |
| --------- | ---- | ----------- |
| `success` | true |             |

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ecom_product_note_delete",
    "arguments": {
      "productId": "example",
      "noteId": "example"
    }
  }
}
```

## `ecom_product_offer_create`

**Create a product offer**

Adds a promotional offer to the selected product.

| Property        | Value                              |
| --------------- | ---------------------------------- |
| Access          | Writes data                        |
| Scope           | Products: write (`products:write`) |
| Credits         | Free                               |
| Who can call it | Workspace owners and admins        |

### Input

| Field             | Type   | Required | Description                                                                                           |
| ----------------- | ------ | -------- | ----------------------------------------------------------------------------------------------------- |
| `productId`       | string | Yes      |                                                                                                       |
| `label`           | string | Yes      | Length 1 to 80.                                                                                       |
| `description`     | string | No       | Length up to 200.                                                                                     |
| `idempotency_key` | string | No       | Client-chosen key identifying this write. Reuse it only when retrying the same call. Length 1 to 200. |

### Output

| Field   | Type   | Description |
| ------- | ------ | ----------- |
| `offer` | object |             |

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ecom_product_offer_create",
    "arguments": {
      "productId": "example",
      "label": "example"
    }
  }
}
```

## `ecom_product_offer_update`

**Update a product offer**

Updates the selected offer label or description without replacing the offer.

| Property        | Value                              |
| --------------- | ---------------------------------- |
| Access          | Changes or deletes data            |
| Scope           | Products: write (`products:write`) |
| Credits         | Free                               |
| Who can call it | Workspace owners and admins        |
| Safe to repeat  | Yes                                |

### Input

| Field           | Type           | Required | Description     |
| --------------- | -------------- | -------- | --------------- |
| `productId`     | string         | Yes      |                 |
| `offerId`       | string         | Yes      |                 |
| `expectedLabel` | string         | No       | Length 1 to 80. |
| `label`         | string         | No       | Length 1 to 80. |
| `description`   | string or null | No       |                 |

### Output

| Field   | Type   | Description |
| ------- | ------ | ----------- |
| `offer` | object |             |

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ecom_product_offer_update",
    "arguments": {
      "productId": "example",
      "offerId": "example"
    }
  }
}
```

## `ecom_product_offer_delete`

**Delete a product offer**

Deletes an offer from the selected product. Repeating the deletion reports success.

| Property        | Value                              |
| --------------- | ---------------------------------- |
| Access          | Changes or deletes data            |
| Scope           | Products: write (`products:write`) |
| Credits         | Free                               |
| Who can call it | Workspace owners and admins        |
| Safe to repeat  | Yes                                |

### Input

| Field           | Type   | Required | Description     |
| --------------- | ------ | -------- | --------------- |
| `productId`     | string | Yes      |                 |
| `offerId`       | string | Yes      |                 |
| `expectedLabel` | string | No       | Length 1 to 80. |

### Output

| Field     | Type | Description |
| --------- | ---- | ----------- |
| `success` | true |             |

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ecom_product_offer_delete",
    "arguments": {
      "productId": "example",
      "offerId": "example"
    }
  }
}
```

## `ecom_product_research_document_add`

**Attach an uploaded research document**

Attaches a previously uploaded research-document descriptor or a tenant-scoped chat attachment to the selected product.

Use this when the user gives you a document about their product, such as research, reviews or a brief, and wants Sellify to use it for that product. Look the product up first. A product keeps at most 10 research documents, and Sellify reads up to 50,000 characters of each.

| Property        | Value                              |
| --------------- | ---------------------------------- |
| Access          | Writes data                        |
| Scope           | Products: write (`products:write`) |
| Credits         | Free                               |
| Who can call it | Workspace owners and admins        |
| Safe to repeat  | Yes                                |

### Input

| Field       | Type   | Required | Description                                                                                                                                                                                                                                       |
| ----------- | ------ | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `productId` | string | Yes      |                                                                                                                                                                                                                                                   |
| `file`      | object | Yes      | The research document to add. A PDF, Word (.docx), text or Markdown file up to 10 MB. Pass file\_name with it when you know the name. Pass the file the user attached in ChatGPT, an upload\_id from create\_file\_upload, or a public https url. |

### Output

| Field           | Type    | Description                                                                                                                          |
| --------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| `id`            | string  |                                                                                                                                      |
| `name`          | string  | Length 1 to 255.                                                                                                                     |
| `storagePath`   | string  | Length 1 to 512.                                                                                                                     |
| `mimeType`      | enum    | One of: `application/pdf`, `application/vnd.openxmlformats-officedocument.wordprocessingml.document`, `text/plain`, `text/markdown`. |
| `sizeBytes`     | integer | Up to 10485760.                                                                                                                      |
| `extractedText` | string  | Length up to 50000.                                                                                                                  |
| `createdAt`     | string  |                                                                                                                                      |

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ecom_product_research_document_add",
    "arguments": {
      "productId": "example",
      "file": {}
    }
  }
}
```

## `ecom_product_research_document_delete`

**Delete a product research document**

Detaches a research document and deletes its blob when no product references it. An optional document name prevents deleting a stale or mismatched selection. Repeating the deletion reports success.

| Property        | Value                              |
| --------------- | ---------------------------------- |
| Access          | Changes or deletes data            |
| Scope           | Products: write (`products:write`) |
| Credits         | Free                               |
| Who can call it | Workspace owners and admins        |
| Safe to repeat  | Yes                                |

### Input

| Field          | Type   | Required | Description      |
| -------------- | ------ | -------- | ---------------- |
| `productId`    | string | Yes      |                  |
| `documentId`   | string | Yes      |                  |
| `documentName` | string | No       | Length 1 to 255. |

### Output

| Field     | Type | Description |
| --------- | ---- | ----------- |
| `success` | true |             |

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ecom_product_research_document_delete",
    "arguments": {
      "productId": "example",
      "documentId": "example"
    }
  }
}
```

## Related

[Tool reference overview](https://sellify.ai/docs/developers/mcp-tools) · [Authentication](https://sellify.ai/docs/developers/authentication) · [Credits and limits](https://sellify.ai/docs/developers/credits-and-limits)
