B2B Storefront

The B2B storefront MCP server exposes Buyer Portal workflows — shopping lists and quotes — to AI agents. These tools run on the same MCP endpoint as the B2C storefront tools, which stay available on a B2B-enabled store too — a guest can still search products, get product details, and check out without signing in. The Buyer Portal tools on this page are layered on top of that: they’re added to a session when the store has B2B Edition enabled and the buyer holds the matching permission, authenticated via Storefront Session Sync — the same mechanism used for logged-in B2C shoppers. Three of the quote tools are the exception — see How B2B tools are exposed below.

How B2B tools are exposed

B2B tools are additive. Every session — guest, customer, or company account — keeps the catalog and cart tools described on the B2C page. On top of that, a session receives a B2B tool when both of the following are true:

  • The store has the B2B MCP integration enabled.
  • The authenticated buyer holds the buyer permission that gates the tool.

request_quote, get_quote_details, and send_quote_message are the exception to the second condition: when a store enables guest quotes, a guest can request a quote, view its details, and message the sales representative about it — gated by that store setting rather than by an authenticated buyer permission.

Because tools are gated per permission, two buyers on the same company account can see different tool sets. A junior buyer who can submit a shopping list for approval but not approve one receives submit_shopping_list_for_approval and not approve_shopping_list.

Buyers authenticate through Storefront Session Sync — there is no dedicated login tool. Product search, cart, and checkout stay available to shoppers who are not signed in to a company account; the B2B tools above (aside from the guest-enabled quote tools) become available once the buyer’s company session is synced and their permissions are evaluated.

Example prompts

  • “Add 24 units of the 5-gallon primer to my Q3 restock list.”
  • “Submit my restock list for approval.”
  • “Which of my shopping lists are waiting on approval?”
  • “Request a quote for everything on the restock list, shipping to our Dallas warehouse.”
  • “Ask the rep whether the quote can ship before the 15th.”
  • “Turn quote 1042 into an order.”

Shopping list tools

A shopping list is a company-scoped, collaborative collection of products and quantities. Lists move through an approval workflow before a buyer uses one for ordering: draftready_for_approvalapproved or rejected.

Tools always report and accept status as one of draft, ready_for_approval, approved, rejected, or deleted. Agents never set the status directly — create_shopping_list always creates a draft, update_shopping_list preserves the current status, and the approval tools own every transition.

Create a shopping list for the buyer’s company account. The list is created as a draft with no items; add items with add_item_to_shopping_list.

InputTypeRequiredDescription
namestringYesName of the shopping list.
descriptionstringNoDescription of what the list is for.

Returns the new shopping list, including its id and status of draft.

Retrieve the shopping lists the buyer can see, so an agent can pick one to work on. Results are ordered by most recently updated and do not include items or totals — use get_shopping_list_details for those.

InputTypeRequiredDescription
searchstringNoMatches part of a list’s name, description, or rejection reason.
statusarrayNoOne or more of draft, ready_for_approval, approved, rejected, deleted.
mine_onlybooleanNoReturn only lists the buyer created.
firstintegerNoNumber of lists to return.
offsetintegerNoNumber of lists to skip.

Returns each list’s id, name, description, status, updatedAt, isOwner, reason, and channelName, plus a totalCount.

A buyer whose view permission is scoped to their own records only sees their own lists, regardless of the mine_only value.

Get one shopping list with its totals and items. Items are paginated, so an agent can work with large lists without reading every line.

InputTypeRequiredDescription
idintegerYesShopping list ID from get_shopping_lists.
item_searchstringNoMatches part of an item’s product name or SKU.
item_firstintegerNoNumber of items to return.
item_offsetintegerNoNumber of items to skip.

Returns the list header (id, name, description, status, channelName, updatedAt), totals (grandTotal, totalDiscount, totalTax, isShowGrandTotal), and products with itemId, productId, variantId, quantity, productName, baseSku, variantSku, basePrice, discount, tax, optionList, productNote, primaryImage, and productUrl, plus itemTotalCount and hasMore for paging.

This tool and add_item_to_shopping_list are the only sources of itemId, which update_shopping_list_item and delete_shopping_list_item require.

Rename a shopping list or change its description. The list keeps its current approval status.

InputTypeRequiredDescription
idintegerYesShopping list ID.
namestringYesUpdated name.
descriptionstringNoUpdated description.

Returns the updated shopping list.

Delete a shopping list and its items.

InputTypeRequiredDescription
idintegerYesShopping list ID.

Returns success and a message.

Add one or more products to a shopping list. Pass an array to add several products in a single call.

InputTypeRequiredDescription
shoppingListIdintegerYesShopping list ID.
itemsarrayYesProducts to add.
items[].productIdintegerYesProduct entity ID.
items[].variantIdintegerYesVariant entity ID.
items[].quantityintegerYesNumber of units.
items[].optionListarrayYes (when the product has options)Option selections as optionId and optionValue pairs, taken from get_product_details.
items[].productNotestringNoNote to store with the line item.

Returns the added items, each with its itemId.

Change the quantity, variant, options, or note for an item already on a shopping list.

InputTypeRequiredDescription
shoppingListIdintegerYesShopping list ID.
itemIdintegerYesItem ID from get_shopping_list_details or add_item_to_shopping_list.
quantityintegerNoUpdated quantity.
variantIdintegerNoUpdated variant entity ID. If provided, optionList is required, regardless of whether the product actually has options.
optionListarrayYes (when variantId is provided)Full set of option selections for the item.
productNotestringNoUpdated note.

Returns the updated item.

Remove one item from a shopping list. To reduce quantity without removing the item, use update_shopping_list_item.

InputTypeRequiredDescription
shoppingListIdintegerYesShopping list ID.
itemIdintegerYesItem ID to remove.

Returns success and a message.

Move a draft shopping list to ready_for_approval so an approver can review it. Available to buyers who hold the submit-for-approval permission.

InputTypeRequiredDescription
idintegerYesShopping list ID.

Returns the updated shopping list with a status of ready_for_approval.

Approve a shopping list so buyers on the company account can order from it. Available to buyers who hold the approval permission, such as senior buyers and company admins.

InputTypeRequiredDescription
idintegerYesShopping list ID.

Returns the updated shopping list with a status of approved.

Reject a shopping list that is waiting on approval. Gated by the same permission as approve_shopping_list — an approver either approves or rejects.

InputTypeRequiredDescription
idintegerYesShopping list ID.

Returns the updated shopping list with a status of rejected.

Copy an existing shopping list, including its items, into a new list. Use this for repeat ordering — duplicate last month’s list instead of adding every product again.

InputTypeRequiredDescription
sourceShoppingListIdintegerYesID of the list to copy.
namestringYesName for the new list.
descriptionstringNoDescription for the new list.

Returns the new shopping list. Every item is copied onto it, but the response itself only includes the first 20 copied items plus a hasMore flag — call get_shopping_list_details to page through the rest.

Quote tools

A quote starts as a buyer request at list price. A sales representative then prices it, and the buyer converts an open quote to an order. Quote tools report status as open, ordered, or expired; the sales representative’s internal states stay out of the storefront.

Retrieve the quotes the buyer can see, with totals so an agent can triage them.

InputTypeRequiredDescription
searchstringNoMatches part of a quote’s title or reference.
statusstringNoOne of open, ordered, expired.
quoteNumberstringNoExact quote number.
quoteTitlestringNoMatches part of the quote title.
companystringNoCompany name on the quote.
dateCreatedBeginAt, dateCreatedEndAtstringNoCreated-date range.
dateUpdatedBeginAt, dateUpdatedEndAtstringNoUpdated-date range.
dateExpiredBeginAt, dateExpiredEndAtstringNoExpiry-date range, for finding quotes that expire soon.
orderBystringNoSort field and direction, for example -quoteNumber. Defaults to -quoteNumber.
firstintegerNoNumber of quotes to return.
offsetintegerNoNumber of quotes to skip.

Returns each quote’s id, uuid, quoteNumber, quoteTitle, referenceNumber, status, totals (subtotal, discount, taxTotal, grandTotal, totalAmount), createdAt, updatedAt, expiredAt, company, channelId, and channelName, plus a totalCount.

Carry the id and uuid from this response into get_quote_details and generate_quote_checkout_url — both require them.

Request a quote for a set of products. The buyer requests at list price and the sales representative applies pricing afterward, so the tool computes line and quote totals from basePrice and does not accept buyer-supplied pricing, discounts, or expiry.

InputTypeRequiredDescription
productListarrayYesProducts to quote.
productList[].productIdintegerYesProduct entity ID.
productList[].variantIdintegerYesVariant entity ID.
productList[].skustringYesVariant SKU from get_product_details.
productList[].productNamestringYesProduct name from get_product_details.
productList[].imageUrlstringYesProduct image URL from get_product_details.
productList[].quantityintegerYesNumber of units.
productList[].basePricestringYesList price from get_product_details.
productList[].optionsarrayYes (when the product has options)Option selections for the variant.
shippingAddressobjectYesShip-to address: firstName, lastName, address, city, zipCode, country, and optional state, apartment, phoneNumber, companyName, label, addressId.
billingAddressobjectYesBill-to address, same shape as shippingAddress.
contactInfoobjectYesContact for the quote: name, email, and optional companyName, phoneNumber. email is required for guest callers; for an authenticated buyer it’s accepted but ignored in favor of the buyer’s account email.
quoteTitlestringNoTitle for the quote.
messagestringNoOpening message to the sales representative.
channelIdintegerNoChannel the quote belongs to. Defaults to 1.

Returns the new quote’s id, createdAt, and uuid. The response doesn’t include status or totals — call get_quote_details with those values to retrieve them.

Get one quote with its line items, totals, and message thread.

InputTypeRequiredDescription
idintegerYesQuote ID from get_quotes.
datestringYesThe quote’s createdAt value from get_quotes.
uuidstringYesThe quote’s uuid from get_quotes.

Returns the quote header (quoteNumber, quoteTitle, referenceNumber, status, notes, legalTerms, channelId, channelName, company, createdAt, updatedAt, expiredAt), totals (subtotal, discount, discountType, discountValue, taxTotal, shippingTotal, grandTotal, totalAmount), products with per-line basePrice, offeredPrice, discount, and quantity (itemId and options are never populated on this response), the buyer and sales representative message thread, allowCheckout, buyer-visible attachments, quoteUrl, and conversion fields (cartId, cartUrl, checkoutUrl, orderId, bcOrderId).

Check allowCheckout before calling generate_quote_checkout_url — it tells you whether the quote can still convert to an order.

Post a message from the buyer onto a quote, for example to ask about lead time or request a revision.

InputTypeRequiredDescription
quoteIdintegerYesQuote ID.
messagestringYesMessage to send to the sales representative.

Returns the updated message thread for the quote.

Create a cart and checkout URL from a quote so the buyer can place the order at the quoted prices. The quote must be open and not expired.

InputTypeRequiredDescription
idintegerYesQuote ID.
uuidstringYesThe quote’s uuid from get_quotes.

Returns cartId, cartUrl, and checkoutUrl — send the buyer to checkoutUrl to complete the order.

Typical flows

1

Build a shopping list

Call search_products and get_product_details to identify products and variants, create_shopping_list to create the list, then add_item_to_shopping_list to add products in a single batched call.

2

Run it through approval

Call submit_shopping_list_for_approval as the buyer. An approver calls approve_shopping_list or reject_shopping_list. Poll status with get_shopping_lists filtered to ready_for_approval.

3

Request a quote

Call get_shopping_list_details to read the approved items, then request_quote with those products, the addresses, and contact information.

4

Negotiate

Call get_quote_details to read the sales representative’s pricing and message thread, and send_quote_message to reply.

5

Convert to an order

When allowCheckout is true, call generate_quote_checkout_url and send the buyer to the returned checkoutUrl.

Reorder with duplicate lists

For recurring purchases, call duplicate_shopping_list with the previous list’s ID. The copy includes every item, including configurable products, so the agent only adjusts quantities before submitting the new list for approval.