Skip to main content
Glama

Update product

well_update_product
Destructive

Change a product of the current workspace: its name, SKU, description, supply type, status, availability, price and currency, the product it nests under, its vendor, or the dates and scope of a dated price row.

Use this tool when the user asks to rename a product, change its price, archive it, mark it out of stock, or move it under another product, in any language ("Passe Audit SEO à 1 400 €", "Change SEO audit to 1,400 €"). A new price for a product is always this tool: it never adds an invoice line or drafts an invoice, and it asks for no customer. When the user gives the product_id, call this tool with it directly: the call itself refuses a product that does not exist or that a connected tool synced in, so reading the product first changes nothing. Otherwise find the product_id with well_list_products.

REQUIRED: product_id. OPTIONAL (only the fields the user wants changed): hidden, name, sku, description, supply_type, status, availability, stock_tracked, unit_price (a decimal string; it needs a currency), currency, parent_product_id, vendor_company_id, scope_company_id, scope_project_id, product_type_project_id, valid_from, valid_to (YYYY-MM-DD), category_ids (the ordered complete set of existing workspace tag UUIDs; [] clears all tags). Pass null to clear an optional field. Select tags by their UUID; do not infer or create tags from labels or product text.

availability here is a manual correction: Well keeps it with who set it and when, and shows it instead of the availability the stock decides. Pass availability: null to remove the correction so the stock decides again. stock_tracked: false makes the product ignore its stock (a service, a product made to order); its own availability then stands.

A product a connected tool synced in (synced: true) cannot be changed in Well: the next sync would overwrite the change. The call then fails; tell the user to change it in that tool.

hidden: true hides the product from Well's lists and figures and keeps it; hidden: false shows it again. It works on a synced product too, since no sync writes it. When the person asks to delete a synced product, well_delete_product refuses and offers this hide: ask the person, then call this tool with only product_id and hidden: true.

For a price request whose unit_price is missing, call this tool with requested_field: "unit_price" and omit unit_price. This request marker opens a follow-up for that field only. It is not sent to the API or stored on the product. Omit requested_field for every other update.

Returns { success: true, product } on success, or { success: false, error } on failure.

Input Schema

NameRequiredDescriptionDefault
skuNo
nameNo
hiddenNotrue hides the row from Well's lists and figures and keeps it, with every value a connected tool wrote; false shows it again. Omit to leave it as it is.
statusNo
currencyNo
valid_toNo
product_idYesThe product to change, from well_list_products.
unit_priceNo
valid_fromNo
descriptionNo
supply_typeNo
availabilityNoA manual availability correction, kept with who set it and when and shown instead of the value the stock decides. null removes the correction.
category_idsNoThe complete ordered set of existing workspace tag UUIDs. Pass [] to clear every tag.
workspace_idNoTarget workspace. Omit when the token authorizes one workspace. Required when it authorizes several — a write lands in exactly one workspace and this call would not say which.
stock_trackedNo
conversation_idNoThe conversation id returned by the previous Well result, in its meta under well/conversation_id, in its structuredContent, or in its JSON text block. Pass it back on every call in the same conversation, including a call a card makes, so the chosen workspace and the earlier answers still apply. It decides the conversation on its own: nothing the host states about the session replaces it. Omit it only on the first call of a conversation.
idempotency_keyNoOptional client-supplied key. A retried write with the same key returns the original result instead of re-applying the operation.
requested_fieldNoSet only when asking the person for this missing field.
workspace_scopeNoRestrict this call to the family: the token's primary workspace plus the company workspaces under it that you are a member of. Unrelated authorized workspaces drop out of the read; row reads merge across the family, while a per-workspace figure still reports exactly one workspace.
scope_company_idNo
scope_project_idNo
parent_product_idNo
vendor_company_idNo
product_type_project_idNo

Output Schema

NameRequiredDescriptionDefault
codeNo
errorNo
productNo
successYes
previousNo
reply_linesNo
conversation_idNoThe conversation this result belongs to. Pass it back as the conversation_id argument on every later Well call in the same conversation.
near_candidatesNo
newly_connectedNoTools that connected to this workspace since the last result and that no session was told about yet, oldest first. Present only when at least one tool is new. The connected-line rule says when to tell an entry; when it does, one line per entry, in the person's language: "<name> is connected.". Never fold several entries into one sentence. Each entry comes back once, on one result only: never repeat its line later.
conversation_id_noteNoPresent only when the server opened a fresh lane, stating that no choice recorded earlier was read.
conversation_id_sourceNoWhere the conversation id came from: the host's own request meta, the caller's argument, or a fresh lane the server opened.
near_candidates_truncatedNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed37 schema fields changed
    • removedInput schema / properties / valid_from / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / valid_from / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedInput schema / properties / valid_to / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / valid_to / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • addedOutput schema / properties / code
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / near_candidates
      Added value: +{
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "company_id": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "company_id",
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / near_candidates_truncated
      Added value: +{
      +  "type": "boolean"
      +}
    • removedOutput schema / properties / previous / properties / unit_price / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / previous / properties / unit_price / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / product / properties / availability_correction / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "at": {
      -        "type": "string"
      -      },
      -      "by_person_id": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "value": {
      -        "enum": [
      -          "in_stock",
      -          "out_of_stock",
      -          "preorder",
      -          "discontinued"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "value",
      -      "by_person_id",
      -      "at"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "at": {
      +        "type": "string"
      +      },
      +      "by_person_id": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "value": {
      +        "enum": [
      +          "in_stock",
      +          "out_of_stock",
      +          "preorder",
      +          "discontinued"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "value",
      +      "by_person_id",
      +      "at"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / product / properties / description / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / product / properties / description / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / product / properties / master_product_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / product / properties / master_product_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / product / properties / parent_product_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / product / properties / parent_product_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / product / properties / product_type_project_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / product / properties / product_type_project_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / product / properties / scope_company_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / product / properties / scope_company_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / product / properties / scope_project_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / product / properties / scope_project_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / product / properties / sku / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / product / properties / sku / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / product / properties / stock_quantity / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / product / properties / stock_quantity / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / product / properties / unit_price / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / product / properties / unit_price / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / product / properties / updated_at / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / product / properties / updated_at / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / product / properties / valid_from / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / product / properties / valid_from / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / product / properties / valid_to / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / product / properties / valid_to / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / product / properties / vendor_company_id / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / product / properties / vendor_company_id / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • addedOutput schema / properties / reply_lines
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  2. Changed3 schema fields changed
    • addedInput schema / properties / requested_field
      Added value: +{
      +  "const": "unit_price",
      +  "description": "Set only when asking the person for this missing field.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / product / properties / billing_interval
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "daily",
      +        "weekly",
      +        "monthly",
      +        "bimonthly",
      +        "quarterly",
      +        "yearly",
      +        "one_time"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / product / required
      Previous value: -[
      -  "product_id",
      -  "name",
      -  "sku",
      -  "description",
      -  "supply_type",
      -  "status",
      -  "availability",
      -  "availability_correction",
      -  "stock_tracked",
      -  "stock_quantity",
      -  "unit_price",
      -  "currency",
      -  "parent_product_id",
      -  "vendor_company_id",
      -  "scope_company_id",
      -  "scope_project_id",
      -  "product_type_project_id",
      -  "master_product_id",
      -  "valid_from",
      -  "valid_to",
      -  "category_ids",
      -  "synced",
      -  "hidden",
      -  "created_at",
      -  "updated_at"
      -]New value: +[
      +  "product_id",
      +  "name",
      +  "sku",
      +  "description",
      +  "supply_type",
      +  "status",
      +  "availability",
      +  "availability_correction",
      +  "stock_tracked",
      +  "stock_quantity",
      +  "unit_price",
      +  "currency",
      +  "billing_interval",
      +  "parent_product_id",
      +  "vendor_company_id",
      +  "scope_company_id",
      +  "scope_project_id",
      +  "product_type_project_id",
      +  "master_product_id",
      +  "valid_from",
      +  "valid_to",
      +  "category_ids",
      +  "synced",
      +  "hidden",
      +  "created_at",
      +  "updated_at"
      +]
  3. Changed1 schema field changed
    • addedOutput schema / properties / previous
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "unit_price": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    }
      +  },
      +  "required": [
      +    "unit_price"
      +  ],
      +  "type": "object"
      +}
  4. Changed4 schema fields changed
    • addedInput schema / properties / category_ids
      Added value: +{
      +  "description": "The complete ordered set of existing workspace tag UUIDs. Pass [] to clear every tag.",
      +  "items": {
      +    "format": "uuid",
      +    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +    "type": "string"
      +  },
      +  "maxItems": 100,
      +  "type": "array"
      +}
    • addedOutput schema / properties / product / properties / category_ids
      Added value: +{
      +  "items": {
      +    "format": "uuid",
      +    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      +    "type": "string"
      +  },
      +  "maxItems": 100,
      +  "type": "array"
      +}
    • addedOutput schema / properties / product / properties / master_product_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / product / required
      Previous value: -[
      -  "product_id",
      -  "name",
      -  "sku",
      -  "description",
      -  "supply_type",
      -  "status",
      -  "availability",
      -  "availability_correction",
      -  "stock_tracked",
      -  "stock_quantity",
      -  "unit_price",
      -  "currency",
      -  "parent_product_id",
      -  "vendor_company_id",
      -  "scope_company_id",
      -  "scope_project_id",
      -  "product_type_project_id",
      -  "valid_from",
      -  "valid_to",
      -  "synced",
      -  "hidden",
      -  "created_at",
      -  "updated_at"
      -]New value: +[
      +  "product_id",
      +  "name",
      +  "sku",
      +  "description",
      +  "supply_type",
      +  "status",
      +  "availability",
      +  "availability_correction",
      +  "stock_tracked",
      +  "stock_quantity",
      +  "unit_price",
      +  "currency",
      +  "parent_product_id",
      +  "vendor_company_id",
      +  "scope_company_id",
      +  "scope_project_id",
      +  "product_type_project_id",
      +  "master_product_id",
      +  "valid_from",
      +  "valid_to",
      +  "category_ids",
      +  "synced",
      +  "hidden",
      +  "created_at",
      +  "updated_at"
      +]
  5. Changed3 schema fields changed
    • addedInput schema / properties / hidden
      Added value: +{
      +  "description": "true hides the row from Well's lists and figures and keeps it, with every value a connected tool wrote; false shows it again. Omit to leave it as it is.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / product / properties / hidden
      Added value: +{
      +  "type": "boolean"
      +}
    • changedOutput schema / properties / product / required
      Previous value: -[
      -  "product_id",
      -  "name",
      -  "sku",
      -  "description",
      -  "supply_type",
      -  "status",
      -  "availability",
      -  "availability_correction",
      -  "stock_tracked",
      -  "stock_quantity",
      -  "unit_price",
      -  "currency",
      -  "parent_product_id",
      -  "vendor_company_id",
      -  "scope_company_id",
      -  "scope_project_id",
      -  "product_type_project_id",
      -  "valid_from",
      -  "valid_to",
      -  "synced",
      -  "created_at",
      -  "updated_at"
      -]New value: +[
      +  "product_id",
      +  "name",
      +  "sku",
      +  "description",
      +  "supply_type",
      +  "status",
      +  "availability",
      +  "availability_correction",
      +  "stock_tracked",
      +  "stock_quantity",
      +  "unit_price",
      +  "currency",
      +  "parent_product_id",
      +  "vendor_company_id",
      +  "scope_company_id",
      +  "scope_project_id",
      +  "product_type_project_id",
      +  "valid_from",
      +  "valid_to",
      +  "synced",
      +  "hidden",
      +  "created_at",
      +  "updated_at"
      +]
  6. Changed9 schema fields changed
    • addedInput schema / properties / availability / anyOf
      Added value: +[
      +  {
      +    "enum": [
      +      "in_stock",
      +      "out_of_stock",
      +      "preorder",
      +      "discontinued"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / availability / description
      Added value: +"A manual availability correction, kept with who set it and when and shown instead of the value the stock decides. null removes the correction."
    • removedInput schema / properties / availability / enum
      Removed value: -[
      -  "in_stock",
      -  "out_of_stock",
      -  "preorder",
      -  "discontinued"
      -]
    • removedInput schema / properties / availability / type
      Removed value: -"string"
    • addedInput schema / properties / stock_tracked
      Added value: +{
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / product / properties / availability_correction
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "at": {
      +          "type": "string"
      +        },
      +        "by_person_id": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "value": {
      +          "enum": [
      +            "in_stock",
      +            "out_of_stock",
      +            "preorder",
      +            "discontinued"
      +          ],
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "value",
      +        "by_person_id",
      +        "at"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / product / properties / stock_quantity
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / product / properties / stock_tracked
      Added value: +{
      +  "type": "boolean"
      +}
    • changedOutput schema / properties / product / required
      Previous value: -[
      -  "product_id",
      -  "name",
      -  "sku",
      -  "description",
      -  "supply_type",
      -  "status",
      -  "availability",
      -  "unit_price",
      -  "currency",
      -  "parent_product_id",
      -  "vendor_company_id",
      -  "scope_company_id",
      -  "scope_project_id",
      -  "product_type_project_id",
      -  "valid_from",
      -  "valid_to",
      -  "synced",
      -  "created_at",
      -  "updated_at"
      -]New value: +[
      +  "product_id",
      +  "name",
      +  "sku",
      +  "description",
      +  "supply_type",
      +  "status",
      +  "availability",
      +  "availability_correction",
      +  "stock_tracked",
      +  "stock_quantity",
      +  "unit_price",
      +  "currency",
      +  "parent_product_id",
      +  "vendor_company_id",
      +  "scope_company_id",
      +  "scope_project_id",
      +  "product_type_project_id",
      +  "valid_from",
      +  "valid_to",
      +  "synced",
      +  "created_at",
      +  "updated_at"
      +]
  7. Added

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well past destructiveHint=true: it discloses that synced products fail the call and must be edited in the source tool, that hidden works even on synced rows because no sync writes it, that pass-null clears optional fields, that category_ids is a complete replacement set, and that availability is a manual override retained with who/when. Return shape and failure shape are also stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with what changes, then when to use, then REQUIRED/OPTIONAL, then edge-case rules — a sensible order with no filler sentences. It is somewhat long and re-explains hidden (once in the field list, once as its own paragraph), which costs a point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 24-parameter destructive mutation it covers the required id, the optional fields that matter, clearing semantics, synced-row refusal, the hide-as-delete fallback, the follow-up marker, and the success/error return. An output schema exists, so return-value depth is already handled.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 38%, so the description must carry the load, and it does: unit_price is a decimal string requiring a currency, valid_from/valid_to are YYYY-MM-DD, category_ids takes existing tag UUIDs (never inferred from labels), availability:null removes the correction, stock_tracked:false makes the product ignore stock, and requested_field is a non-persisted marker.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource and enumerates the mutable surface (name, SKU, price/currency, parent, vendor, dated price row scope). It is unmistakably distinct from well_create_product, well_delete_product, well_get_product and well_list_products, which it names directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit triggers with multilingual user phrasing, states that a new price is always this tool and never an invoice line, and routes to well_list_products for the product_id while explaining that a pre-read is useless because the call itself validates. It also handles the synced-product case and the hide-instead-of-delete path via well_delete_product.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources