Skip to main content
Glama

update_product

Destructive

Update an existing product's prices, variants, stock, tax, files and other settings. This is where a page's pricing lives: use it, not update_checkout_page, to change what a page sells. Only the fields you supply change; prices[] and variants[] replace the full list, so read current values with get_product first. The change applies to every page that sells the product at once: customers see it right away. There is no undo, because the previous values are not kept.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
skuNoSKU of the product.
priceNoPatch the product's single price - top-level fields you omit keep their value, but `recurring` and `paymentPlan` are replaced whole: omitted sub-fields are not kept (interval defaults to month, intervalCount to 1, and trialPeriodDays, billingCycleAnchorConfig and startDate are dropped), so read the current config with `get_product` and re-send it in full when touching either. Valid only while the product has at most one price; products with multiple prices must be updated through `prices[]`. Ignored when `prices` is also sent. `billingType` and `payWhatYouWant` are fixed once a price exists. Cannot be null.
stockNoAvailable stock of the product.
titleNoProduct title.
pricesNoReplaces the full price list. Read the current prices with `get_product` first and include `id` on every price you want to keep; entries without an id are created and existing prices missing from the list are removed. At least one entry must be enabled. `billingType` and `payWhatYouWant` cannot change on an existing price. Takes precedence over `price` when both are sent.
fileIdsNo
taxCodeNoIf Stripe Tax is enabled, determines the tax code used when calculating tax. Defaults to your Stripe Tax settings.
imageIdsNoReplaces the product images with these image file IDs (upload with `upload_file`). Send `[]` to remove all images; null is not accepted.
variantsNoReplaces the full variant list; nothing is merged from the stored variants. Read the current variants with `get_product` first and include `id` on every variant and option you want to keep; entries without an id are created and existing ones missing from the list are removed. Send `[]` to remove all variants. Three fields do not round-trip from `get_product`: re-send each option image as `imageId: option.image.fileId` or it is dropped; option `discountedFromPrice` is not returned at all, so re-supply it or it is lost; and an option returned with `type: "pay_what_you_want"` must be sent back as `type: "one_time"` with `payWhatYouWant: true`. To link a discount to specific options, give those options a `key` and reference it in `discounts[].variantOptionIds[].key` in the same request.
discountsNoBulk discounts for the product. Use `checkout_quantity` when the discount should apply to the total checkout quantity. Use `variant_option_quantity` when the discount should apply only to specific variant options. In that mode, you must do all of the following in the same request: 1. Include `productData.variants`. 2. Give each target variant option a temporary `key` in `variants[].options[].key`. 3. Reference those exact keys in `discounts[].variantOptionIds[].key`. - `variants[].options`: [{ name: "Red", key: "red" }, { name: "Blue", key: "blue" }] - `discounts`: [{ quantityCondition: "variant_option_quantity", variantOptionIds: [{ key: "red" }, { key: "blue" }], minQuantity: 3, percentOff: 10 }] [Learn more](https://checkoutpage.com/docs/articles/bulk-discounts)
productIdYesThe ID of the product to update. Find it on a page response as `data.product.id` (see `get_checkout_page`).
descriptionNoDescription of the product. Accepts HTML or plain text.
pricePickerNoPrice picker settings: the heading and description above the options, Show more / less, and tab labels, defaults and order.
taxBehaviorNoIf Stripe Tax is enabled, determines the behaviour of Stripe Tax. Defaults to your Stripe Tax settings.
limitPaymentsNoDuplicate-payment prevention settings for this product. Applies to one-time payments only.
defaultPriceIdNoID of the price pre-selected at checkout. Must reference an existing price `id` (after this update is applied). Cannot be cleared; set a different price instead.
fixedTaxRateIdsNoTax Rate IDs applied to this product (at most one). Send `[]` to clear; null is not accepted. Call `list_tax_rates` to find an existing rate.
variantsRequiredNoUse when no variants are marked as required but you still need the customer to select at least one variant option. Ignored when any variant is individually required. Defaults to `false`.
hasUnlimitedStockNoWhether or not the stock of the product is unlimited. If set to `true`, the `stock` field is ignored.
limitSubscriptionsNoConfiguration to limit the number of active subscriptions for this product. Used to cap subscriptions to a specific number.
generateLicenseKeysNoIf true, on purchase a license key for the product is generated
enableFileAccessForInactiveSubscriptionsNoAllow customers with inactive subscriptions to keep accessing file downloads.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
dataYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, and the description adds genuinely new context: only supplied fields change, prices[]/variants[] are wholesale replacements, the change is immediate across every page selling the product, and there is no undo. The only gap is it doesn't flag that productId must resolve to an existing product, but the safety profile is well covered.

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

Conciseness5/5

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

Five short sentences, zero filler, front-loaded with purpose then routing then mutation semantics. Every sentence carries decision-relevant information.

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?

Output schema and annotations already cover returns and safety, so the description only needs behavioral framing — which it supplies via patch/replace rules, cross-page propagation, immediacy, and irreversibility. Nothing needed to call this correctly is missing.

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

Parameters4/5

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

Schema coverage is 95%, so the schema already documents nearly every parameter; per the rubric the baseline is 3. The description adds cross-field semantics not obvious from the schema — patch vs replace behavior and the recommendation to read current values first — which earns the bump to 4.

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?

States a specific verb+resource ('Update an existing product') and enumerates the field groups affected (prices, variants, stock, tax, files). It explicitly distinguishes itself from the sibling update_checkout_page by claiming pricing ownership ('this is where a page's pricing lives').

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?

Directly routes the agent: use this, not update_checkout_page, to change what a page sells, and points to get_product for reading current values before a replacement-style update. Names both the alternative and the prerequisite read.

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