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.
Title
Confirm fulfillment
Read-only hint
No
Destructive hint
Yes
Idempotent hint
No
Open-world hint
No
Widget
None
Callable from a widget
No
Parameters
Name
Type
Required
Description
mode
string | null
No
Optional. 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)
Name
Type
Always present
Description
fulfillmentContext
object | null
No
fulfillmentContext.mode
"PICKUP" | "DELIVERY_BY_MERCHANT"
If fulfillmentContext is set
addressOnFile
string | null
No
awaitingMode
boolean | null
No
cancelled
boolean | null
No
agentGuidance
string | null
No
errorCode
string | null
No
message
string | null
No
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).
Title
Discover stores
Read-only hint
Yes
Destructive hint
No
Idempotent hint
Yes
Open-world hint
Yes
Widget
ui://views/ext-apps/discoverStores.html
Callable from a widget
No
Parameters
Name
Type
Required
Description
query
string | null
No
Optional free-text store-name match. Match against store name and description. Independent of structured filters.
limit
integer | null
No
Max stores to return. 1–50. Defaults to the backend's choice (50). (1 to 50)
Output fields (structuredContent)
Name
Type
Always present
Description
stores
object[] | null
No
stores[].storeId
string
If stores is set
stores[].name
string | null
If stores is set
stores[].catalogSetId
string | null
If stores is set
stores[].distanceMiles
number
If stores is set
stores[].rating
number | null
If stores is set
stores[].priceLevel
integer
If stores is set
stores[].description
string | null
If stores is set
stores[].isAcceptingOrders
boolean
If stores is set
stores[].deliveryAllowed
boolean
If stores is set
stores[].pickupAllowed
boolean
If stores is set
stores[].imageUrl
string | null
If stores is set
fulfillmentContext
object | null
No
fulfillmentContext.mode
"PICKUP" | "DELIVERY_BY_MERCHANT"
If fulfillmentContext is set
hasMore
boolean | null
No
totalCount
integer | null
No
agentGuidance
string | null
No
errorCode
string | null
No
message
string | null
No
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.
Title
Browse menu
Read-only hint
Yes
Destructive hint
No
Idempotent hint
Yes
Open-world hint
No
Widget
ui://views/ext-apps/browseMenu.html
Callable from a widget
No
Parameters
Name
Type
Required
Description
catalogSetId
string
Yes
Round-trip from a prior discoverStores result. CatalogSets are immutable, so prior ids are safe to reuse across calls. (non-empty)
storeId
string | null
No
Optional. Echoed back in the response for the agent's own bookkeeping. Does not affect the catalog returned (catalog is keyed by catalogSetId).
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'.
Title
Search menu
Read-only hint
Yes
Destructive hint
No
Idempotent hint
Yes
Open-world hint
No
Widget
None
Callable from a widget
No
Parameters
Name
Type
Required
Description
catalogSetId
string
Yes
Round-trip from a prior discoverStores/browseMenu result. Immutable, safe to reuse. (non-empty)
query
string
Yes
Free-text item name or keyword. Matched against item name (primary) and description (secondary). Case- and punctuation-insensitive. (non-empty)
limit
integer | null
No
Max hits to return. 1–10. Defaults to 5. (1 to 10)
Output fields (structuredContent)
Name
Type
Always present
Description
hits
object[] | null
No
hits[].itemId
string
If hits is set
hits[].name
string | null
If hits is set
hits[].sectionName
string | null
If hits is set
hits[].matchedVia
string
If hits is set
hits[].parentItemId
string | null
If hits is set
hits[].parentItemName
string | null
If hits is set
hits[].price
number | null
If hits is set
hits[].hasModifierGroups
boolean
If hits is set
totalCandidates
integer | null
No
catalogSetId
string | null
No
bindingWarning
object | null
No
bindingWarning.expected
object
If bindingWarning is set
bindingWarning.expected.catalogSetId
string | null
If bindingWarning is set
(format: uuid)
bindingWarning.expected.storeId
string | null
If bindingWarning is set
(format: uuid)
bindingWarning.supplied
object
If bindingWarning is set
bindingWarning.supplied.catalogSetId
string | null
If bindingWarning is set
(format: uuid)
bindingWarning.supplied.storeId
string | null
If bindingWarning is set
(format: uuid)
bindingWarning.message
string
If bindingWarning is set
agentGuidance
string | null
No
errorCode
string | null
No
message
string | null
No
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.
Title
Get item options
Read-only hint
Yes
Destructive hint
No
Idempotent hint
Yes
Open-world hint
No
Widget
None
Callable from a widget
No
Parameters
Name
Type
Required
Description
catalogSetId
string
Yes
Round-trip from a prior discoverStores/browseMenu result. Immutable, safe to reuse. (non-empty)
itemId
string
Yes
Round-trip from browseMenu. Do not synthesize. Throws ITEM_NOT_FOUND if not in catalog. (non-empty)
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.
Title
Add to cart
Read-only hint
No
Destructive hint
No
Idempotent hint
No
Open-world hint
No
Widget
None
Callable from a widget
Yes
Parameters
Name
Type
Required
Description
itemId
string
Yes
The 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)
quantity
integer
No
Number of this item to add. 1–99. (1 to 99; default: 1)
catalogSetId
string | null
No
Required on the first addToCart in a session. Subsequent calls inherit from the existing cart. Round-trip from discoverStores/browseMenu. (non-empty)
storeId
string | null
No
Required on the first addToCart in a session. Subsequent calls inherit. Round-trip from discoverStores. (non-empty)
modifierGroups
object[] | null
No
Required 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[].modifierGroupId
string | null
If modifierGroups is set
Round-trip from getItemOptions.modifierGroups[].modifierGroupId. (non-empty)
modifierGroups[].optionItemIds
string[] | null
If modifierGroups is set
One 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)
Name
Type
Always present
Description
cart
object | null
No
cart.lineItems
object[]
If cart is set
cart.lineItems[].lineItemId
string
If cart is set
cart.lineItems[].itemId
string
If cart is set
cart.lineItems[].itemName
string | null
If cart is set
cart.lineItems[].quantity
integer
If cart is set
cart.lineItems[].unitPrice
number | null
If cart is set
cart.lineItems[].modifierSummary
string | null
If cart is set
cart.lineItems[].lineTotal
number | null
If cart is set
cart.subtotal
number | null
If cart is set
cart.storeId
string | null
If cart is set
cart.catalogSetId
string | null
If cart is set
lineItemCount
integer | null
No
addedItemId
string | null
No
errorCode
string | null
No
message
string | null
No
agentGuidance
string | null
No
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).
Title
View cart
Read-only hint
Yes
Destructive hint
No
Idempotent hint
Yes
Open-world hint
No
Widget
ui://views/ext-apps/viewCart.html
Callable from a widget
Yes
Parameters
None.
Output fields (structuredContent)
Name
Type
Always present
Description
cart
object | null
No
cart.lineItems
object[]
If cart is set
cart.lineItems[].lineItemId
string
If cart is set
cart.lineItems[].itemId
string
If cart is set
cart.lineItems[].itemName
string | null
If cart is set
cart.lineItems[].quantity
integer
If cart is set
cart.lineItems[].unitPrice
number | null
If cart is set
cart.lineItems[].modifierSummary
string | null
If cart is set
cart.lineItems[].lineTotal
number | null
If cart is set
cart.subtotal
number | null
If cart is set
cart.storeId
string | null
If cart is set
cart.catalogSetId
string | null
If cart is set
fulfillmentContext
object | null
No
fulfillmentContext.mode
"PICKUP" | "DELIVERY_BY_MERCHANT"
If fulfillmentContext is set
lineItemCount
integer | null
No
totalQuantity
integer | null
No
errorCode
string | null
No
message
string | null
No
agentGuidance
string | null
No
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.
Title
Update cart item
Read-only hint
No
Destructive hint
No
Idempotent hint
Yes
Open-world hint
No
Widget
None
Callable from a widget
No
Parameters
Name
Type
Required
Description
lineItemId
string
Yes
The literal cart.lineItems[].lineItemId field from a prior viewCart/addToCart result. Never the display name; never the itemId. (non-empty)
quantity
integer
Yes
Absolute new quantity (not a delta). 0 removes the line. 1–99 sets quantity. (0 to 99)
Output fields (structuredContent)
Name
Type
Always present
Description
cart
object | null
No
cart.lineItems
object[]
If cart is set
cart.lineItems[].lineItemId
string
If cart is set
cart.lineItems[].itemId
string
If cart is set
cart.lineItems[].itemName
string | null
If cart is set
cart.lineItems[].quantity
integer
If cart is set
cart.lineItems[].unitPrice
number | null
If cart is set
cart.lineItems[].modifierSummary
string | null
If cart is set
cart.lineItems[].lineTotal
number | null
If cart is set
cart.subtotal
number | null
If cart is set
cart.storeId
string | null
If cart is set
cart.catalogSetId
string | null
If cart is set
lineItemCount
integer | null
No
lineItemId
string | null
No
quantity
integer | null
No
errorCode
string | null
No
message
string | null
No
agentGuidance
string | null
No
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.
Title
Remove from cart
Read-only hint
No
Destructive hint
No
Idempotent hint
Yes
Open-world hint
No
Widget
None
Callable from a widget
Yes
Parameters
Name
Type
Required
Description
lineItemId
string
Yes
The literal cart.lineItems[].lineItemId field from a prior viewCart/addToCart result. Never the display name; never the itemId. (non-empty)
Output fields (structuredContent)
Name
Type
Always present
Description
cart
object | null
No
cart.lineItems
object[]
If cart is set
cart.lineItems[].lineItemId
string
If cart is set
cart.lineItems[].itemId
string
If cart is set
cart.lineItems[].itemName
string | null
If cart is set
cart.lineItems[].quantity
integer
If cart is set
cart.lineItems[].unitPrice
number | null
If cart is set
cart.lineItems[].modifierSummary
string | null
If cart is set
cart.lineItems[].lineTotal
number | null
If cart is set
cart.subtotal
number | null
If cart is set
cart.storeId
string | null
If cart is set
cart.catalogSetId
string | null
If cart is set
lineItemCount
integer | null
No
removedLineItemId
string | null
No
errorCode
string | null
No
message
string | null
No
agentGuidance
string | null
No
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.
Title
Clear cart
Read-only hint
No
Destructive hint
Yes
Idempotent hint
Yes
Open-world hint
No
Widget
None
Callable from a widget
No
Parameters
None.
Output fields (structuredContent)
Name
Type
Always present
Description
cart
object | null
No
cart.lineItems
object[]
If cart is set
cart.lineItems[].lineItemId
string
If cart is set
cart.lineItems[].itemId
string
If cart is set
cart.lineItems[].itemName
string | null
If cart is set
cart.lineItems[].quantity
integer
If cart is set
cart.lineItems[].unitPrice
number | null
If cart is set
cart.lineItems[].modifierSummary
string | null
If cart is set
cart.lineItems[].lineTotal
number | null
If cart is set
cart.subtotal
number | null
If cart is set
cart.storeId
string | null
If cart is set
cart.catalogSetId
string | null
If cart is set
lineItemCount
integer | null
No
errorCode
string | null
No
message
string | null
No
agentGuidance
string | null
No
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.
Title
Review order
Read-only hint
No
Destructive hint
No
Idempotent hint
Yes
Open-world hint
No
Widget
ui://views/ext-apps/reviewOrder.html
Callable from a widget
Yes
Parameters
Name
Type
Required
Description
deliveryInstructions
string | null
No
Free-text courier instructions (max 500 chars). Honored only in delivery mode; ignored for pickup. (at most 500 characters)
tip
number | null
No
Tip 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)
Name
Type
Always present
Description
amounts
object | null
No
amounts.subTotal
number | null
No
amounts.total
number | null
No
amounts.fees
number | null
No
amounts.feesDetails
object[] | null
No
amounts.feesDetails[].amount
number
If amounts.feesDetails is set
amounts.feesDetails[].description
string | null
If amounts.feesDetails is set
amounts.taxes
number | null
No
amounts.taxesDetails
object[] | null
No
amounts.taxesDetails[].amount
number
If amounts.taxesDetails is set
amounts.taxesDetails[].description
string | null
If amounts.taxesDetails is set
amounts.tip
number | null
No
amounts.tipDetails
object[] | null
No
amounts.tipDetails[].amount
number
If amounts.tipDetails is set
amounts.tipDetails[].description
string | null
If amounts.tipDetails is set
amounts.adjustments
number | null
No
amounts.adjustmentsDetails
object[] | null
No
amounts.adjustmentsDetails[].amount
number
If amounts.adjustmentsDetails is set
amounts.adjustmentsDetails[].description
string | null
If amounts.adjustmentsDetails is set
amounts.promotions
number | null
No
amounts.promotionsDetails
object[] | null
No
amounts.promotionsDetails[].amount
number
If amounts.promotionsDetails is set
amounts.promotionsDetails[].description
string | null
If amounts.promotionsDetails is set
errors
object[] | null
No
errors[].code
string | null
No
errors[].message
string | null
No
errors[].pointer
string | null
No
cart
object | null
No
cart.lineItems
object[]
If cart is set
cart.lineItems[].lineItemId
string
If cart is set
cart.lineItems[].itemId
string
If cart is set
cart.lineItems[].itemName
string | null
If cart is set
cart.lineItems[].quantity
integer
If cart is set
cart.lineItems[].unitPrice
number | null
If cart is set
cart.lineItems[].modifierSummary
string | null
If cart is set
cart.lineItems[].lineTotal
number | null
If cart is set
cart.subtotal
number | null
If cart is set
cart.storeId
string | null
If cart is set
cart.catalogSetId
string | null
If cart is set
fulfillmentContext
object | null
No
fulfillmentContext.mode
"PICKUP" | "DELIVERY_BY_MERCHANT"
If fulfillmentContext is set
fulfillmentContext.storeName
string | null
If fulfillmentContext is set
addressOnFile
string | null
No
paymentOnFile
string | null
No
storeOptions
object | null
No
storeOptions.acceptsDeliveryTips
boolean
If storeOptions is set
storeOptions.acceptsPickupTips
boolean
If storeOptions is set
deliveryInstructions
string | null
No
agentGuidance
string | null
No
errorCode
string | null
No
message
string | null
No
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.
Title
Confirm payment
Read-only hint
No
Destructive hint
No
Idempotent hint
Yes
Open-world hint
No
Widget
None
Callable from a widget
No
Parameters
Name
Type
Required
Description
confirm
boolean | null
No
Fallback 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)
Name
Type
Always present
Description
confirmed
boolean | null
No
paymentOnFile
string | null
No
reason
string | null
No
agentGuidance
string | null
No
errorCode
string | null
No
message
string | null
No
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.
Title
Place order
Read-only hint
No
Destructive hint
Yes
Idempotent hint
No
Open-world hint
Yes
Widget
None
Callable from a widget
No
Parameters
Name
Type
Required
Description
idempotencyKey
string
Yes
A 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.
deliveryInstructions
string | null
No
Free-text courier instructions (max 500 chars). Honored only in delivery mode. (at most 500 characters)
Output fields (structuredContent)
Name
Type
Always present
Description
order
object | null
No
addressOnFile
string | null
No
paymentOnFile
string | null
No
errorCode
string | null
No
message
string | null
No
agentGuidance
string | null
No
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.
URI
gett://addresses
Name
addresses
MIME type
application/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.
URI
gett://store/{storeId}/policies
Name
storePolicies
MIME type
application/json
discoverStores view
Pick a restaurant. Shows nearby stores for the current fulfillment context.
URI
ui://views/ext-apps/discoverStores.html
Name
discoverStores
MIME type
text/html;profile=mcp-app
browseMenu view
Browse a store's menu and add items to the cart.
URI
ui://views/ext-apps/browseMenu.html
Name
browseMenu
MIME type
text/html;profile=mcp-app
viewCart view
View cart contents; continue to order review or edit/remove items.
URI
ui://views/ext-apps/viewCart.html
Name
viewCart
MIME type
text/html;profile=mcp-app
reviewOrder view
Confirm cart + amounts before placing the order.
URI
ui://views/ext-apps/reviewOrder.html
Name
reviewOrder
MIME type
text/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.
Argument
Required
Description
cuisine
No
near
No
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.
Argument
Required
Description
cuisine
No
reviewMyCart
Inspect the current session cart and walk through order review (totals, fees, taxes), payment confirmation, and placement.
Takes no arguments.
Error codes
Code
What the agent is told to do
address_coordinates_missing
Backend data issue — surface to the user. Do not retry.
cart_stale
The 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_found
Call discoverStores to obtain a valid catalogSetId, then retry.
empty_cart
Add items via addToCart before reviewOrder/placeOrder.
fulfillment_not_set
Call confirmFulfillment first — it reads the user's saved address and asks pickup vs delivery.
internal_error
The 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_found
Call browseMenu to refresh the catalog, then retry with a current itemId.
marketfront_error
Inspect 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_field
Re-call the tool with the field listed in the message text — usually catalogSetId/storeId from a prior discoverStores result.
missing_required_modifiers
Call 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_address
User has no saved address. Direct them to gett.co to add one; this MCP does not support address management.
no_saved_payment
User has no saved payment method. Direct them to gett.co to add a card; this MCP does not support payment management.
no_session
The 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_reviewed
Call reviewOrder before confirmPayment — totals are computed at review time.
order_total_different
The 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_confirmed
Call confirmPayment before placeOrder — the user must confirm 'place this order' against the saved payment-on-file first.
profile_incomplete
User'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_expired
The access token has expired. Refresh it, or re-run the OAuth authorization flow, then retry.
store_binding_mismatch
The 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_error
Unexpected failure — surface to the user with the message text.