Gett Developer Portal
  • Welcome
  • Distribution Partners
  • Brand Partners
  • Commerce Partners
  • Ecosystem Partners
  • Errors
  • API Reference
Documentation
  • Get Started
  • Marketfront SDK
  • API Reference
Resources
  • Payments
Company
  • Gett
  • Terms of Service
  • Privacy Policy

Copyright 2026 Gett. All rights reserved.

Marketfront SDK
Marketfront API
Marketfront AI
    QuickstartTools referenceOrdering MCP at /mcpCode Mode
Shared Guides
powered by Zuplo
Marketfront AI

Ordering MCP Tools Reference

Preview

This reference describes the Ordering MCP at /mcp2, which is in preview. The quickstart explains how to get your server addresses.

This page lists every tool, resource and prompt the Ordering MCP at /mcp2/{partnerStem} advertises. Descriptions, parameters, output fields and hints are generated from the server's own tools/list, resources/list and prompts/list responses, so they match what your agent receives.

How to read each tool:

  • Description is the instruction the model reads, verbatim.
  • Hints are the tool's MCP annotations. They tell a host how much caution a call needs; they do not restrict anything by themselves.
  • Widget is the MCP Apps view the tool renders on hosts that support the extension. Callable from a widget says whether that view may call the tool itself.
  • Parameters and output fields are shown as the server's schemas declare them, constraints included. A nested field inside an optional one is required only when that field is set, and the table says so. Output fields describe structuredContent; every result also carries a text summary for hosts that do not read structured content.
  • A failed call returns isError: true, with structuredContent.errorCode and structuredContent.agentGuidance. The codes are listed under Error codes.

Fulfillment

confirmFulfillment

First step in placing an order. Call this with no mode first — do not ask the user pickup vs delivery in chat before calling. - Clients that can hold a round trip (protocol 2026-07-28): the user is prompted inline by a form that shows the saved address, and the call completes with a committed fulfillmentContext. Do NOT also ask pickup vs delivery in chat — the form already asked. - Clients that cannot: the response is { awaitingMode: true, addressOnFile, agentGuidance }. Follow agentGuidance — quote the literal address in chat (e.g. "I see your address is 123 Main St, Springfield, CA. Would you like delivery or pickup?") then re-call with mode: 'delivery' | 'pickup'. Never abbreviate, never skip the address. The picked store is bound to the cart at addToCart time, so for pickup just call discoverStores → addToCart next. Each call treats the session as a fresh start and clears any existing cart. To switch fulfillment mode mid-order, re-call confirmFulfillment then re-add items. Limitations: User must have a saved address on file. Custom addresses are not supported here — direct the user to gett.co to manage addresses. PICKUP mode does not call Marketfront's setFulfillmentContext (delivery-shaped only); store binds to the cart at addToCart.

TitleConfirm fulfillment
Read-only hintNo
Destructive hintYes
Idempotent hintNo
Open-world hintNo
WidgetNone
Callable from a widgetNo

Parameters

NameTypeRequiredDescription
modestring | nullNoOptional. Accepts 'delivery'/'pickup' or the canonical Marketfront enum (DELIVERY_BY_MERCHANT/PICKUP). Omit on clients that can hold a round trip — the user is prompted inline. Required on clients that cannot.
Output fields (structuredContent)
NameTypeAlways presentDescription
fulfillmentContextobject | nullNo
fulfillmentContext.mode"PICKUP" | "DELIVERY_BY_MERCHANT"If fulfillmentContext is set
addressOnFilestring | nullNo
awaitingModeboolean | nullNo
cancelledboolean | nullNo
agentGuidancestring | nullNo
errorCodestring | nullNo
messagestring | nullNo

Discovery

discoverStores

Find stores available to the user based on their current fulfillment context (delivery address or pickup location). Requires confirmFulfillment to have run first — mode and address are inseparable. Limitations: limit is capped at 50. Filters beyond query/limit (cuisine, dietary flags, price level, accepting-orders-only) are not supported yet. Store availability changes outside this process; treat results as a snapshot, not cached truth (openWorldHint: true).

TitleDiscover stores
Read-only hintYes
Destructive hintNo
Idempotent hintYes
Open-world hintYes
Widgetui://views/ext-apps/discoverStores.html
Callable from a widgetNo

Parameters

NameTypeRequiredDescription
querystring | nullNoOptional free-text store-name match. Match against store name and description. Independent of structured filters.
limitinteger | nullNoMax stores to return. 1–50. Defaults to the backend's choice (50). (1 to 50)
Output fields (structuredContent)
NameTypeAlways presentDescription
storesobject[] | nullNo
stores[].storeIdstringIf stores is set
stores[].namestring | nullIf stores is set
stores[].catalogSetIdstring | nullIf stores is set
stores[].distanceMilesnumberIf stores is set
stores[].ratingnumber | nullIf stores is set
stores[].priceLevelintegerIf stores is set
stores[].descriptionstring | nullIf stores is set
stores[].isAcceptingOrdersbooleanIf stores is set
stores[].deliveryAllowedbooleanIf stores is set
stores[].pickupAllowedbooleanIf stores is set
stores[].imageUrlstring | nullIf stores is set
fulfillmentContextobject | nullNo
fulfillmentContext.mode"PICKUP" | "DELIVERY_BY_MERCHANT"If fulfillmentContext is set
hasMoreboolean | nullNo
totalCountinteger | nullNo
agentGuidancestring | nullNo
errorCodestring | nullNo
messagestring | nullNo

browseMenu

Fetch the full CatalogSet for a store (normalized sections/items/modifier groups). Pass catalogSetId obtained from a prior discoverStores result — CatalogSets are immutable, so any prior id is safe to reuse. Limitations: Returns the entire catalog, which can exceed 100 KB for large stores. For 'do you have X?' queries prefer searchMenu; filtered/paginated browse is not yet supported.

TitleBrowse menu
Read-only hintYes
Destructive hintNo
Idempotent hintYes
Open-world hintNo
Widgetui://views/ext-apps/browseMenu.html
Callable from a widgetNo

Parameters

NameTypeRequiredDescription
catalogSetIdstringYesRound-trip from a prior discoverStores result. CatalogSets are immutable, so prior ids are safe to reuse across calls. (non-empty)
storeIdstring | nullNoOptional. Echoed back in the response for the agent's own bookkeeping. Does not affect the catalog returned (catalog is keyed by catalogSetId).
Output fields (structuredContent)
NameTypeAlways presentDescription
catalogSetobject | nullNo
catalogSet.catalogSetIdstringNo(format: uuid)
catalogSet.catalogsmap of object | nullIf catalogSet is set
catalogSet.catalogs.{key}.allowedFulfillmentModes("PICKUP" | "DELIVERY_BY_MERCHANT")[] | nullNo
catalogSet.catalogs.{key}.availabilityobject[] | nullNo
catalogSet.catalogs.{key}.availability[].dayOfWeek"Sunday" | "Monday" | "Tuesday" | "Wednesday" | "Thursday" | "Friday" | "Saturday"If catalogSet.catalogs.{key}.availability is set
catalogSet.catalogs.{key}.availability[].endstringIf catalogSet.catalogs.{key}.availability is set(pattern: ^-?(\d+\.)?\d{2}:\d{2}:\d{2}(\.\d{1,7})?$)
catalogSet.catalogs.{key}.availability[].startstringIf catalogSet.catalogs.{key}.availability is set(pattern: ^-?(\d+\.)?\d{2}:\d{2}:\d{2}(\.\d{1,7})?$)
catalogSet.catalogs.{key}.catalogIdstringNo(format: uuid)
catalogSet.catalogs.{key}.namestring | nullNo
catalogSet.catalogs.{key}.sectionIdsstring[] | nullIf catalogSet.catalogs is set
catalogSet.itemsmap of object | nullIf catalogSet is set
catalogSet.items.{key}.ageRestrictions("ALCOHOL" | "TOBACCO")[] | nullNo
catalogSet.items.{key}.allergens("MILK" | "EGGS" | "FISH" | "CRUSTACEAN_SHELLFISH" | "TREE_NUTS" | "PEANUTS" | "WHEAT" | "SOYBEANS" | "SESAME")[] | nullNo
catalogSet.items.{key}.basePricenumberNo
catalogSet.items.{key}.compareAtnumber | nullNo
catalogSet.items.{key}.descriptionstring | nullNo
catalogSet.items.{key}.imageUrlstring | nullNo
catalogSet.items.{key}.itemIdstringNo(format: uuid)
catalogSet.items.{key}.modifierGroupIdsstring[] | nullNo
catalogSet.items.{key}.namestring | nullIf catalogSet.items is set
catalogSet.items.{key}.startingAtnumber | nullNo
catalogSet.modifierGroupsmap of object | nullIf catalogSet is set
catalogSet.modifierGroups.{key}.defaultItemsobject[] | nullNo
catalogSet.modifierGroups.{key}.defaultItems[].itemIdstringNo(format: uuid)
catalogSet.modifierGroups.{key}.defaultItems[].quantityintegerNo
catalogSet.modifierGroups.{key}.enableDuplicateItemsbooleanNo
catalogSet.modifierGroups.{key}.itemIdsstring[] | nullIf catalogSet.modifierGroups is set
catalogSet.modifierGroups.{key}.maximumAllowedintegerNo
catalogSet.modifierGroups.{key}.minimumAllowedintegerNo
catalogSet.modifierGroups.{key}.modifierGroupIdstringNo(format: uuid)
catalogSet.modifierGroups.{key}.namestring | nullIf catalogSet.modifierGroups is set
catalogSet.modifierGroups.{key}.tieredPricingobject[] | nullNo
catalogSet.modifierGroups.{key}.tieredPricing[].offsetintegerNo
catalogSet.modifierGroups.{key}.tieredPricing[].pricenumberNo
catalogSet.sectionsmap of object | nullIf catalogSet is set
catalogSet.sections.{key}.itemIdsstring[] | nullNo
catalogSet.sections.{key}.namestring | nullNo
catalogSet.sections.{key}.sectionIdstringNo(format: uuid)
catalogSet.sections.{key}.sectionIdsstring[] | nullNo
catalogSetIdstring | nullNo
storeIdstring | nullNo
fulfillmentContextobject | nullNo
fulfillmentContext.mode"PICKUP" | "DELIVERY_BY_MERCHANT"If fulfillmentContext is set
bindingWarningobject | nullNo
bindingWarning.expectedobjectIf bindingWarning is set
bindingWarning.expected.catalogSetIdstring | nullIf bindingWarning is set(format: uuid)
bindingWarning.expected.storeIdstring | nullIf bindingWarning is set(format: uuid)
bindingWarning.suppliedobjectIf bindingWarning is set
bindingWarning.supplied.catalogSetIdstring | nullIf bindingWarning is set(format: uuid)
bindingWarning.supplied.storeIdstring | nullIf bindingWarning is set(format: uuid)
bindingWarning.messagestringIf bindingWarning is set
agentGuidancestring | nullNo
errorCodestring | nullNo
messagestring | nullNo

searchMenu

Fuzzy-match items in a CatalogSet by name and description, returning the top-k hits. Each hit carries matchedVia: "name" | "description" | "modifier" — use this to discriminate top-level items from modifier-option items. Modifier-option hits also carry parentItemId and parentItemName, so the agent can phrase answers like *'Yes — Latte has oat milk as a modifier option.'* Use this for 'do you have X?' lookups instead of browseMenu — typical payload is ≤ 1 KB vs. ≥ 50 KB for the full menu. Pass catalogSetId from a prior discoverStores or browseMenu result. Limitations: In-process scan over the cached CatalogSet (no dedicated server-side search endpoint today). limit capped at 10. Returns 0 hits if query matches nothing — check totalCandidates to disambiguate 'no items' from 'no matches'.

TitleSearch menu
Read-only hintYes
Destructive hintNo
Idempotent hintYes
Open-world hintNo
WidgetNone
Callable from a widgetNo

Parameters

NameTypeRequiredDescription
catalogSetIdstringYesRound-trip from a prior discoverStores/browseMenu result. Immutable, safe to reuse. (non-empty)
querystringYesFree-text item name or keyword. Matched against item name (primary) and description (secondary). Case- and punctuation-insensitive. (non-empty)
limitinteger | nullNoMax hits to return. 1–10. Defaults to 5. (1 to 10)
Output fields (structuredContent)
NameTypeAlways presentDescription
hitsobject[] | nullNo
hits[].itemIdstringIf hits is set
hits[].namestring | nullIf hits is set
hits[].sectionNamestring | nullIf hits is set
hits[].matchedViastringIf hits is set
hits[].parentItemIdstring | nullIf hits is set
hits[].parentItemNamestring | nullIf hits is set
hits[].pricenumber | nullIf hits is set
hits[].hasModifierGroupsbooleanIf hits is set
totalCandidatesinteger | nullNo
catalogSetIdstring | nullNo
bindingWarningobject | nullNo
bindingWarning.expectedobjectIf bindingWarning is set
bindingWarning.expected.catalogSetIdstring | nullIf bindingWarning is set(format: uuid)
bindingWarning.expected.storeIdstring | nullIf bindingWarning is set(format: uuid)
bindingWarning.suppliedobjectIf bindingWarning is set
bindingWarning.supplied.catalogSetIdstring | nullIf bindingWarning is set(format: uuid)
bindingWarning.supplied.storeIdstring | nullIf bindingWarning is set(format: uuid)
bindingWarning.messagestringIf bindingWarning is set
agentGuidancestring | nullNo
errorCodestring | nullNo
messagestring | nullNo

getItemOptions

Project a single item plus its modifier-group graph (each group's allowed option items) out of a CatalogSet. Use this to configure items that have required modifiers before adding them to the cart. Pass the catalogSetId from a prior discoverStores/browseMenu result. Nested chains: Walks option-of-option modifier chains up to 3 levels deep so the agent can quote prices at every depth. If the cap is hit, the response includes truncatedAt: 3 and agentGuidance — call getItemOptions again on the leaf option you want to configure beyond that depth. Limitations: Derived from getCatalogSet today; a dedicated backend endpoint is planned. Throws ITEM_NOT_FOUND if itemId is not in the catalog.

TitleGet item options
Read-only hintYes
Destructive hintNo
Idempotent hintYes
Open-world hintNo
WidgetNone
Callable from a widgetNo

Parameters

NameTypeRequiredDescription
catalogSetIdstringYesRound-trip from a prior discoverStores/browseMenu result. Immutable, safe to reuse. (non-empty)
itemIdstringYesRound-trip from browseMenu. Do not synthesize. Throws ITEM_NOT_FOUND if not in catalog. (non-empty)
Output fields (structuredContent)
NameTypeAlways presentDescription
itemobject | nullNo
item.ageRestrictions("ALCOHOL" | "TOBACCO")[] | nullNo
item.allergens("MILK" | "EGGS" | "FISH" | "CRUSTACEAN_SHELLFISH" | "TREE_NUTS" | "PEANUTS" | "WHEAT" | "SOYBEANS" | "SESAME")[] | nullNo
item.basePricenumberNo
item.compareAtnumber | nullNo
item.descriptionstring | nullNo
item.imageUrlstring | nullNo
item.itemIdstringNo(format: uuid)
item.modifierGroupIdsstring[] | nullNo
item.namestring | nullIf item is set
item.startingAtnumber | nullNo
modifierGroupsobject[] | nullNo
catalogSetIdstring | nullNo
truncatedAtinteger | nullNo
agentGuidancestring | nullNo
errorCodestring | nullNo
messagestring | nullNo

Cart

addToCart

Add a single item (with optional modifier selections) to the session cart. All ids must round-trip from a prior tool result — never the user-visible name, slug, or anything you derived from it. itemId/catalogSetId/storeId/modifier ids come from browseMenu/searchMenu/getItemOptions/discoverStores responses. If you don't have an itemId, call searchMenu (cheap) or browseMenu (full catalog) first. Required modifier groups (minimumAllowed > 0) must be supplied. If any are missing, the tool returns isError: true with errorCode: "missing_required_modifiers" and structuredContent.missingGroups: [{ modifierGroupId, name, minimumAllowed }] — re-call getItemOptions for the modifier graph, prompt the user, and retry. Limitations: quantity 1–99 per add. First add in a session must include catalogSetId + storeId (subsequent adds inherit from the cart). One store per cart — switching stores requires clearCart first. Does not yet accept an idempotency key.

TitleAdd to cart
Read-only hintNo
Destructive hintNo
Idempotent hintNo
Open-world hintNo
WidgetNone
Callable from a widgetYes

Parameters

NameTypeRequiredDescription
itemIdstringYesThe literal itemId field from browseMenu/searchMenu/getItemOptions. Never the item's display name, never a slug or anything derived from the name. If you don't have one, call searchMenu first. (non-empty)
quantityintegerNoNumber of this item to add. 1–99. (1 to 99; default: 1)
catalogSetIdstring | nullNoRequired on the first addToCart in a session. Subsequent calls inherit from the existing cart. Round-trip from discoverStores/browseMenu. (non-empty)
storeIdstring | nullNoRequired on the first addToCart in a session. Subsequent calls inherit. Round-trip from discoverStores. (non-empty)
modifierGroupsobject[] | nullNoRequired if the item has any modifier groups with minimumAllowed > 0. Call getItemOptions first to enumerate the required groups; the error path lists missing groups if you forget.
modifierGroups[].modifierGroupIdstring | nullIf modifierGroups is setRound-trip from getItemOptions.modifierGroups[].modifierGroupId. (non-empty)
modifierGroups[].optionItemIdsstring[] | nullIf modifierGroups is setOne or more option itemIds from the modifier group's allowed options (getItemOptions.modifierGroups[].options[].itemId). Order is irrelevant. (at least 1 item)
Output fields (structuredContent)
NameTypeAlways presentDescription
cartobject | nullNo
cart.lineItemsobject[]If cart is set
cart.lineItems[].lineItemIdstringIf cart is set
cart.lineItems[].itemIdstringIf cart is set
cart.lineItems[].itemNamestring | nullIf cart is set
cart.lineItems[].quantityintegerIf cart is set
cart.lineItems[].unitPricenumber | nullIf cart is set
cart.lineItems[].modifierSummarystring | nullIf cart is set
cart.lineItems[].lineTotalnumber | nullIf cart is set
cart.subtotalnumber | nullIf cart is set
cart.storeIdstring | nullIf cart is set
cart.catalogSetIdstring | nullIf cart is set
lineItemCountinteger | nullNo
addedItemIdstring | nullNo
errorCodestring | nullNo
messagestring | nullNo
agentGuidancestring | nullNo

viewCart

Return the session cart contents for cheap mid-shopping inspection. Reads from session-cached state; does not re-validate against the provider (that happens in reviewOrder). Use this while the user is actively adding/removing items — once they're ready to finalize, move on to reviewOrder. Limitations: Returns the lean cart projection (line-item names, quantities, prices, modifier summary, subtotal) — the authoritative provider-shape cart lives in session state. If the cached catalogSet fetch fails, the projection falls back to ids-only (no names/prices).

TitleView cart
Read-only hintYes
Destructive hintNo
Idempotent hintYes
Open-world hintNo
Widgetui://views/ext-apps/viewCart.html
Callable from a widgetYes

Parameters

None.

Output fields (structuredContent)
NameTypeAlways presentDescription
cartobject | nullNo
cart.lineItemsobject[]If cart is set
cart.lineItems[].lineItemIdstringIf cart is set
cart.lineItems[].itemIdstringIf cart is set
cart.lineItems[].itemNamestring | nullIf cart is set
cart.lineItems[].quantityintegerIf cart is set
cart.lineItems[].unitPricenumber | nullIf cart is set
cart.lineItems[].modifierSummarystring | nullIf cart is set
cart.lineItems[].lineTotalnumber | nullIf cart is set
cart.subtotalnumber | nullIf cart is set
cart.storeIdstring | nullIf cart is set
cart.catalogSetIdstring | nullIf cart is set
fulfillmentContextobject | nullNo
fulfillmentContext.mode"PICKUP" | "DELIVERY_BY_MERCHANT"If fulfillmentContext is set
lineItemCountinteger | nullNo
totalQuantityinteger | nullNo
errorCodestring | nullNo
messagestring | nullNo
agentGuidancestring | nullNo

updateCartItem

Set a line item's quantity. Passing quantity=0 removes the line (the backend treats 0 as a remove). Pass the literal lineItemId field from a prior tool result — never the display name, never the itemId. Limitations: Cart must be non-empty. quantity is absolute (set, not delta) — retrying after a 502 may over-set. Idempotency keys are planned.

TitleUpdate cart item
Read-only hintNo
Destructive hintNo
Idempotent hintYes
Open-world hintNo
WidgetNone
Callable from a widgetNo

Parameters

NameTypeRequiredDescription
lineItemIdstringYesThe literal cart.lineItems[].lineItemId field from a prior viewCart/addToCart result. Never the display name; never the itemId. (non-empty)
quantityintegerYesAbsolute new quantity (not a delta). 0 removes the line. 1–99 sets quantity. (0 to 99)
Output fields (structuredContent)
NameTypeAlways presentDescription
cartobject | nullNo
cart.lineItemsobject[]If cart is set
cart.lineItems[].lineItemIdstringIf cart is set
cart.lineItems[].itemIdstringIf cart is set
cart.lineItems[].itemNamestring | nullIf cart is set
cart.lineItems[].quantityintegerIf cart is set
cart.lineItems[].unitPricenumber | nullIf cart is set
cart.lineItems[].modifierSummarystring | nullIf cart is set
cart.lineItems[].lineTotalnumber | nullIf cart is set
cart.subtotalnumber | nullIf cart is set
cart.storeIdstring | nullIf cart is set
cart.catalogSetIdstring | nullIf cart is set
lineItemCountinteger | nullNo
lineItemIdstring | nullNo
quantityinteger | nullNo
errorCodestring | nullNo
messagestring | nullNo
agentGuidancestring | nullNo

removeFromCart

Remove a line item from the session cart by lineItemId (round-tripped from viewCart). Pass the literal lineItemId field from a prior tool result — never the item's display name, never the itemId. The provider returns the updated cart; session state is overwritten with that result. Limitations: Cart must be non-empty (returns EMPTY_CART otherwise). Does not yet accept an idempotency key.

TitleRemove from cart
Read-only hintNo
Destructive hintNo
Idempotent hintYes
Open-world hintNo
WidgetNone
Callable from a widgetYes

Parameters

NameTypeRequiredDescription
lineItemIdstringYesThe literal cart.lineItems[].lineItemId field from a prior viewCart/addToCart result. Never the display name; never the itemId. (non-empty)
Output fields (structuredContent)
NameTypeAlways presentDescription
cartobject | nullNo
cart.lineItemsobject[]If cart is set
cart.lineItems[].lineItemIdstringIf cart is set
cart.lineItems[].itemIdstringIf cart is set
cart.lineItems[].itemNamestring | nullIf cart is set
cart.lineItems[].quantityintegerIf cart is set
cart.lineItems[].unitPricenumber | nullIf cart is set
cart.lineItems[].modifierSummarystring | nullIf cart is set
cart.lineItems[].lineTotalnumber | nullIf cart is set
cart.subtotalnumber | nullIf cart is set
cart.storeIdstring | nullIf cart is set
cart.catalogSetIdstring | nullIf cart is set
lineItemCountinteger | nullNo
removedLineItemIdstring | nullNo
errorCodestring | nullNo
messagestring | nullNo
agentGuidancestring | nullNo

clearCart

Drop all items from the session cart. Local-only — no Marketfront round-trip — because the cart endpoints are stateless on the backend (the cart only persists in our session blob). Use when the user wants to start over or switch stores. Limitations: Destructive on session state — current cart is unrecoverable. Also clears any checkoutMarker (review/payment confirmation), so the user must restart the checkout flow.

TitleClear cart
Read-only hintNo
Destructive hintYes
Idempotent hintYes
Open-world hintNo
WidgetNone
Callable from a widgetNo

Parameters

None.

Output fields (structuredContent)
NameTypeAlways presentDescription
cartobject | nullNo
cart.lineItemsobject[]If cart is set
cart.lineItems[].lineItemIdstringIf cart is set
cart.lineItems[].itemIdstringIf cart is set
cart.lineItems[].itemNamestring | nullIf cart is set
cart.lineItems[].quantityintegerIf cart is set
cart.lineItems[].unitPricenumber | nullIf cart is set
cart.lineItems[].modifierSummarystring | nullIf cart is set
cart.lineItems[].lineTotalnumber | nullIf cart is set
cart.subtotalnumber | nullIf cart is set
cart.storeIdstring | nullIf cart is set
cart.catalogSetIdstring | nullIf cart is set
lineItemCountinteger | nullNo
errorCodestring | nullNo
messagestring | nullNo
agentGuidancestring | nullNo

Checkout

reviewOrder

Compute authoritative subtotals, fees, taxes, and surface validation errors. Hits the commerce partner via Marketfront. Always call before confirmPayment. The agent should call viewCart for cheap mid-shopping inspection — reviewOrder is the *finalize* step. Limitations: Cart must be non-empty (returns EMPTY_CART). deliveryInstructions is honored only in DELIVERY_BY_MERCHANT mode (the widget hides the field on pickup). tip is honored only when the store accepts tips for the chosen fulfillment mode; the response carries storeOptions.acceptsPickupTips/acceptsDeliveryTips so the widget can gate the tip input. Validation errors do not block this call — they are returned in errors[] for the agent to surface and re-collect from the user.

TitleReview order
Read-only hintNo
Destructive hintNo
Idempotent hintYes
Open-world hintNo
Widgetui://views/ext-apps/reviewOrder.html
Callable from a widgetYes

Parameters

NameTypeRequiredDescription
deliveryInstructionsstring | nullNoFree-text courier instructions (max 500 chars). Honored only in delivery mode; ignored for pickup. (at most 500 characters)
tipnumber | nullNoTip amount in the store's currency (USD on US stores). Ignored when the store rejects tips for this fulfillment mode (see storeOptions on the response). (at least 0)
Output fields (structuredContent)
NameTypeAlways presentDescription
amountsobject | nullNo
amounts.subTotalnumber | nullNo
amounts.totalnumber | nullNo
amounts.feesnumber | nullNo
amounts.feesDetailsobject[] | nullNo
amounts.feesDetails[].amountnumberIf amounts.feesDetails is set
amounts.feesDetails[].descriptionstring | nullIf amounts.feesDetails is set
amounts.taxesnumber | nullNo
amounts.taxesDetailsobject[] | nullNo
amounts.taxesDetails[].amountnumberIf amounts.taxesDetails is set
amounts.taxesDetails[].descriptionstring | nullIf amounts.taxesDetails is set
amounts.tipnumber | nullNo
amounts.tipDetailsobject[] | nullNo
amounts.tipDetails[].amountnumberIf amounts.tipDetails is set
amounts.tipDetails[].descriptionstring | nullIf amounts.tipDetails is set
amounts.adjustmentsnumber | nullNo
amounts.adjustmentsDetailsobject[] | nullNo
amounts.adjustmentsDetails[].amountnumberIf amounts.adjustmentsDetails is set
amounts.adjustmentsDetails[].descriptionstring | nullIf amounts.adjustmentsDetails is set
amounts.promotionsnumber | nullNo
amounts.promotionsDetailsobject[] | nullNo
amounts.promotionsDetails[].amountnumberIf amounts.promotionsDetails is set
amounts.promotionsDetails[].descriptionstring | nullIf amounts.promotionsDetails is set
errorsobject[] | nullNo
errors[].codestring | nullNo
errors[].messagestring | nullNo
errors[].pointerstring | nullNo
cartobject | nullNo
cart.lineItemsobject[]If cart is set
cart.lineItems[].lineItemIdstringIf cart is set
cart.lineItems[].itemIdstringIf cart is set
cart.lineItems[].itemNamestring | nullIf cart is set
cart.lineItems[].quantityintegerIf cart is set
cart.lineItems[].unitPricenumber | nullIf cart is set
cart.lineItems[].modifierSummarystring | nullIf cart is set
cart.lineItems[].lineTotalnumber | nullIf cart is set
cart.subtotalnumber | nullIf cart is set
cart.storeIdstring | nullIf cart is set
cart.catalogSetIdstring | nullIf cart is set
fulfillmentContextobject | nullNo
fulfillmentContext.mode"PICKUP" | "DELIVERY_BY_MERCHANT"If fulfillmentContext is set
fulfillmentContext.storeNamestring | nullIf fulfillmentContext is set
addressOnFilestring | nullNo
paymentOnFilestring | nullNo
storeOptionsobject | nullNo
storeOptions.acceptsDeliveryTipsbooleanIf storeOptions is set
storeOptions.acceptsPickupTipsbooleanIf storeOptions is set
deliveryInstructionsstring | nullNo
agentGuidancestring | nullNo
errorCodestring | nullNo
messagestring | nullNo

confirmPayment

Required after reviewOrder and before placeOrder. Call this with no confirm first — do not ask 'Do you want to place this order?' in chat before calling. - Clients that can hold a round trip (protocol 2026-07-28): the user is prompted inline by a form showing the payment-on-file, the reviewed total and the placement question, and the call completes with { confirmed: true, paymentOnFile } once they accept. Do NOT duplicate the placement question in chat — the form already asked. On this path a confirm argument is ignored: the user answers, not you. - Clients that cannot: the call returns missing_required_field. Surface the order total and payment-on-file in chat, get the user's affirmative answer, then re-call with confirm: true. If the user declines, the response is { confirmed: false, reason: 'declined' } and the order is not placed — do not retry; tell the user nothing was charged. A successful confirmation unlocks placeOrder. Limitations: Requires reviewOrder to have run first (totals are computed at review time, and the prompt quotes them). Requires a saved payment method on the user's profile — no inline payment entry; direct the user to gett.co. Any cart edit after this invalidates the confirmation and the review together.

TitleConfirm payment
Read-only hintNo
Destructive hintNo
Idempotent hintYes
Open-world hintNo
WidgetNone
Callable from a widgetNo

Parameters

NameTypeRequiredDescription
confirmboolean | nullNoFallback for clients that cannot hold a round trip. Pass true only after surfacing the order total and payment-on-file to the user and getting their affirmative consent. Ignored on clients that can be prompted — there the user is asked inline.
Output fields (structuredContent)
NameTypeAlways presentDescription
confirmedboolean | nullNo
paymentOnFilestring | nullNo
reasonstring | nullNo
agentGuidancestring | nullNo
errorCodestring | nullNo
messagestring | nullNo

placeOrder

Place the current cart as an order. Destructive. Only callable after confirmPayment returns confirmed: true — confirmPayment owns the user-facing 'place this order?' prompt. Retry the same checkout, not a new one. This server derives the idempotency key from the reviewed order itself, so calling placeOrder again after a timeout sends the same key and the same request, and returns the original order once the store has recorded it. If the order was placed and only the reply was lost, calling placeOrder again within 12 hours of the first submission returns that order without placing another, until the cart, fulfillment or review changes. After 12 hours it answers as for an empty cart: ask the user to check their orders on gett.co rather than placing again. idempotencyKey is still required for compatibility — pass a uuid — but you do not need to reuse the same value on a retry. A retry re-sends the original submission, so deliveryInstructions passed on a retry are ignored — call reviewOrder again to change them. Called without deliveryInstructions, it sends the ones the latest reviewOrder was given. If a call fails and says nothing was charged, follow its agentGuidance. If a retry fails without saying that, the outcome is unknown: point the user to their orders on gett.co rather than reviewing and placing again. Limitations: DESTRUCTIVE — charges the saved payment-on-file. Requires a non-empty cart, a confirmPayment.confirmed=true marker, and, for a first submission, a saved payment method on the user's profile; a retry re-sends the card that submission named. A successful placement clears the cart and the review, so a new order starts again from addToCart. Placing the same basket a second time on purpose requires a fresh reviewOrder and confirmPayment.

TitlePlace order
Read-only hintNo
Destructive hintYes
Idempotent hintNo
Open-world hintYes
WidgetNone
Callable from a widgetNo

Parameters

NameTypeRequiredDescription
idempotencyKeystringYesA uuid. Required for compatibility, but not what reaches the payment processor — this server derives the effective idempotency key from the reviewed order, so a retry carries the same key whatever value you send.
deliveryInstructionsstring | nullNoFree-text courier instructions (max 500 chars). Honored only in delivery mode. (at most 500 characters)
Output fields (structuredContent)
NameTypeAlways presentDescription
orderobject | nullNo
addressOnFilestring | nullNo
paymentOnFilestring | nullNo
errorCodestring | nullNo
messagestring | nullNo
agentGuidancestring | nullNo

Resources

Resources are read with resources/read. The data resources let an agent answer a question without a tool call. The widget views are the HTML documents that hosts supporting MCP Apps render for the tools that name them.

Saved addresses

Read-only summary of the signed-in user's saved addresses. The MCP server does not support address management — direct the user to gett.co to add/remove. Useful for the agent to know what 'address-on-file' resolves to before calling confirmFulfillment.

URIgett://addresses
Nameaddresses
MIME typeapplication/json

Store policies

Per-store availability + tipping + fulfillment policies. Use to answer 'is this place open?' / 'do they accept pickup tips?' without burning a tool call. storeId is round-tripped from a prior discoverStores result.

URIgett://store/{storeId}/policies
NamestorePolicies
MIME typeapplication/json

discoverStores view

Pick a restaurant. Shows nearby stores for the current fulfillment context.

URIui://views/ext-apps/discoverStores.html
NamediscoverStores
MIME typetext/html;profile=mcp-app

browseMenu view

Browse a store's menu and add items to the cart.

URIui://views/ext-apps/browseMenu.html
NamebrowseMenu
MIME typetext/html;profile=mcp-app

viewCart view

View cart contents; continue to order review or edit/remove items.

URIui://views/ext-apps/viewCart.html
NameviewCart
MIME typetext/html;profile=mcp-app

reviewOrder view

Confirm cart + amounts before placing the order.

URIui://views/ext-apps/reviewOrder.html
NamereviewOrder
MIME typetext/html;profile=mcp-app

Prompts

Prompts are starting points a host can offer the person, for example as slash commands.

orderFood

Walk through the full Gett food-ordering flow: confirm fulfillment → discovery → menu → cart → review → confirm payment → place. An optional cuisine narrows the discovery step. Stores are always found near the saved address, so an optional location is a hint, not a filter.

ArgumentRequiredDescription
cuisineNo
nearNo

findRestaurants

Discover nearby stores for the user's saved address. Stops short of menu/cart so the user can browse first. Optional cuisine filter narrows results.

ArgumentRequiredDescription
cuisineNo

reviewMyCart

Inspect the current session cart and walk through order review (totals, fees, taxes), payment confirmation, and placement.

Takes no arguments.

Error codes

CodeWhat the agent is told to do
address_coordinates_missingBackend data issue — surface to the user. Do not retry.
cart_staleThe store's menu changed since the cart was built, so the cart is no longer valid and has been cleared server-side. Do not retry the same call. Start over: call discoverStores → browseMenu → addToCart to rebuild the cart against the current menu.
catalog_not_foundCall discoverStores to obtain a valid catalogSetId, then retry.
empty_cartAdd items via addToCart before reviewOrder/placeOrder.
fulfillment_not_setCall confirmFulfillment first — it reads the user's saved address and asks pickup vs delivery.
internal_errorThe tool returned an invalid response shape — server-side bug. Apologise to the user; do not retry mechanically (the same call will fail the same way).
item_not_foundCall browseMenu to refresh the catalog, then retry with a current itemId.
marketfront_errorInspect structuredContent.problemDetail; on 5xx retry once, on 4xx fix the indicated field, on 401/403 surface the failure as a server-side or partner authorization problem and do not retry — this server mints its own Marketfront credential per request, so re-authorizing the user cannot change the outcome.
missing_required_fieldRe-call the tool with the field listed in the message text — usually catalogSetId/storeId from a prior discoverStores result.
missing_required_modifiersCall getItemOptions({catalogSetId, itemId}) to fetch the modifier graph, prompt the user for selections in each required group, then retry addToCart with modifierGroups populated.
no_saved_addressUser has no saved address. Direct them to gett.co to add one; this MCP does not support address management.
no_saved_paymentUser has no saved payment method. Direct them to gett.co to add a card; this MCP does not support payment management.
no_sessionThe request carried no usable identity. Re-run the OAuth authorization flow for this server's URL to obtain a fresh access token, then retry.
order_not_reviewedCall reviewOrder before confirmPayment — totals are computed at review time.
order_total_differentThe store's authoritative total no longer matches the one the user confirmed. Tell the user the total changed, then call reviewOrder again to get the new total and confirmPayment to re-confirm — only then re-attempt placeOrder. structuredContent carries the new total when available.
payment_not_confirmedCall confirmPayment before placeOrder — the user must confirm 'place this order' against the saved payment-on-file first.
profile_incompleteUser's gett.co profile is missing one or more required fields (the error message lists which, and structuredContent.missingFields carries the slugs). structuredContent.level is the user's current session-completeness level (0=anonymous, 1=identified, 2=identified+contact); structuredContent.levelMissing lists the session-level gaps. Order-readiness still requires all 6 profile fields per missingFields. Surface the literal structuredContent.resolutionUrl to the user verbatim — do not paraphrase or shorten. Once they have completed the profile, retry the same call.
session_expiredThe access token has expired. Refresh it, or re-run the OAuth authorization flow, then retry.
store_binding_mismatchThe supplied catalogSetId/storeId does not match the cart's bound store. Reuse the cart-bound ids in structuredContent.expected, or call clearCart() then re-bind via discoverStores → addToCart to switch stores.
unknown_errorUnexpected failure — surface to the user with the message text.
QuickstartOrdering MCP at /mcp
On this page
  • Fulfillment
    • confirmFulfillment
  • Discovery
    • discoverStores
    • browseMenu
    • searchMenu
    • getItemOptions
  • Cart
    • addToCart
    • viewCart
    • updateCartItem
    • removeFromCart
    • clearCart
  • Checkout
    • reviewOrder
    • confirmPayment
    • placeOrder
  • Resources
    • Saved addresses
    • Store policies
    • discoverStores view
    • browseMenu view
    • viewCart view
    • reviewOrder view
  • Prompts
    • orderFood
    • findRestaurants
    • reviewMyCart
  • Error codes