Ordering MCP Quickstart
Preview
The Ordering MCP at /mcp2 is in preview and available on request. Your Gett contact provisions your server
addresses. The earlier server at /mcp keeps running and is documented in Ordering MCP at /mcp.
Put Gett ordering inside Claude, ChatGPT or your own agent. Each person signs in with their own Gett account, so there is no API key or token for you to handle, and every order is attributed to your partner account.
What you'll need
- Your server addresses. One URL for Live and one for Sandbox, provisioned by your Gett contact. Not a Gett partner yet? Contact our partnerships team.
- An MCP client. Claude, ChatGPT, MCP Inspector for testing, or your own client built on an MCP SDK.
- A Google account to sign in with while you test.
Your server URL
Code
The last segment, the partner stem, selects one environment of your partner account:
| Example URL | Environment | What it reaches |
|---|---|---|
https://api.gett.co/mcp2/acme-live | Live | Live stores. Orders are real and payment methods are charged. |
https://api.gett.co/mcp2/acme-sandbox | Sandbox | Sandbox stores only. Test cards decide the outcome and nothing is charged. |
- The URL is the only switch. No header or parameter changes the environment, and a Sandbox URL cannot reach Live stores, or the reverse.
- Every order placed through a URL is attributed to your partner account.
- Each URL is a separate sign-in. An access token issued for your Sandbox URL is refused by your Live URL.
- Stems are exact. A stem is 3 to 64 lowercase letters, digits and hyphens, and does not start or end with a
hyphen. A URL that names no active server, such as a mistyped stem or one not yet provisioned, returns
404.
How sign-in works
Your client discovers everything it needs from the server, so there is nothing to configure:
- A request without a token gets
401, with aWWW-Authenticateheader naming the URL's protected-resource metadata athttps://api.gett.co/.well-known/oauth-protected-resource/mcp2/{partnerStem}. - That document points to the authorization server metadata at
https://api.gett.co/.well-known/oauth-authorization-server/mcp2/{partnerStem}. - The client identifies itself with a client ID metadata document, or registers dynamically if it does not have one. Clients are public: no client secret is involved.
- The person continues with Google on gett.co. Their name and email come from their Google account; if it does not provide them, sign-in stops and asks the person to add them there first. gett.co then asks for anything else ordering needs that the account is missing (a phone number, an address or a payment method), and the person approves the connection.
- The client exchanges the authorization code, with PKCE (
S256), for an access token with theorderingscope and a refresh token. Refresh tokens rotate: each use returns a new one.
The account a person orders with belongs to your partner. It is separate from their gett.co account and from accounts under other Gett partners, so saved addresses and payment methods do not carry over between them.
Connect a client
Claude
- In Claude, open Customize → Connectors, select +, then Add custom connector.
- Enter a name and your server URL. Leave the OAuth fields under Advanced settings empty.
- Select Add, then Connect, and sign in.
On Team and Enterprise plans, an Owner adds the connector under Organization settings → Connectors and each member connects it. Claude connects from Anthropic's servers rather than from your machine. See Anthropic's custom connector guide.
ChatGPT
- Turn on Developer mode. Where the switch is, and whether you can use it, depends on your plan and workspace; a workspace admin may need to allow it.
- Create an app with your server URL and OAuth authentication.
- Complete sign-in. ChatGPT lists the tools it found.
When Gett changes a tool, refresh the app's metadata in ChatGPT to pick up the change. See OpenAI's developer mode guide and connecting an MCP server.
MCP Inspector
Start the web UI, then connect with the Streamable HTTP transport and your server URL:
Code
Or list the tools from a terminal:
Code
The command opens your browser to sign in and waits for the redirect on http://127.0.0.1:6276/oauth/callback.
Your own client
Use an MCP SDK with OAuth support; it performs the discovery and sign-in described above. With the C# SDK:
Code
A client that hosts a client ID metadata document sets ClientMetadataDocumentUri instead of
DynamicClientRegistration. The TypeScript SDK does the same
through an authProvider on its Streamable HTTP transport.
How requests work
The server speaks Streamable HTTP at MCP revision 2026-07-28:
- Stateless. Every message is a
POSTto your URL, and there is noMcp-Session-Id. Clients on2026-07-28skip theinitializehandshake; older clients may still send it.GETandDELETEreturn405. - Routable headers. Clients on
2026-07-28sendMcp-MethodandMcp-Name, which must match the request body. - Older clients still connect. A client on
2025-11-25gets the same tools, but cannot show inline prompts, as described below. - State follows the person, not the connection. The cart and the chosen fulfillment mode are stored for the signed-in person, so they survive reconnects.
Place an order
| Step | Tools | What happens |
|---|---|---|
| 1 | viewCart | Changes nothing. Shows whether the person already has a cart, which survives reconnects. |
| 2 | confirmFulfillment | Starts a new order: shows the saved address, settles pickup or delivery, and clears the cart. |
| 3 | discoverStores | Finds stores near the saved address for that mode. |
| 4 | browseMenu, searchMenu, getItemOptions | Explores a menu. An item with required options needs them chosen, and getItemOptions lists them. |
| 5 | addToCart, viewCart, updateCartItem, removeFromCart, clearCart | Builds the cart. The first item binds the cart to its store. |
| 6 | reviewOrder | Prices the order with the store: subtotal, fees, taxes and tip. |
| 7 | confirmPayment | Records the person's approval of the total and the saved payment method, asked for as described below. |
| 8 | placeOrder | Places the order and charges the saved payment method. |
Begin with viewCart, because confirmFulfillment clears the cart every time it commits, even to the same mode. If
viewCart answers fulfillment_not_set, there is no cart yet. If the cart has items, show them to the person and ask
whether to start over. To keep working on that cart, skip confirmFulfillment and discoverStores: the cart's store
and the pickup or delivery choice still stand.
Questions for the person
confirmFulfillment and confirmPayment need an answer from the person. How the answer arrives depends on the client:
- Clients on
2026-07-28show an inline prompt. The server asks for input, and the client retries the call with the answer attached. This pattern is called Multi Round-Trip Requests. - Older clients cannot show one.
confirmFulfillmentreturns the saved address withawaitingMode: true; the agent asks in chat and calls again withmode: "delivery"ormode: "pickup".confirmPaymentneedsconfirm: true, passed only after the agent has shown the total and payment method and the person has agreed. Without it, the call returnsmissing_required_field.
On a client that can show the prompt, confirm: true does not skip it.
Placing safely
placeOrderrequires anidempotencyKey. Gett also derives the key it places the order with from the reviewed order, so retrying the same reviewed order cannot place it twice, even with a new key.- If an order was placed but the reply never arrived, call
placeOrderagain within 12 hours of the first attempt. It returns that order and places nothing new, until the cart, the pickup or delivery choice, or the review changes. After 12 hours it answersempty_cart: have the person check their orders on gett.co rather than ordering again. - While the outcome of a submitted order is unknown, the cart cannot be edited. Call
placeOrderagain to learn the outcome, even if the person has since removed their saved card. If that call fails, the outcome is still unknown: have the person check their orders on gett.co. If no order was placed,clearCartstarts over, and it works even while the profile is incomplete. - A failure that says nothing was charged is settled: follow its
agentGuidance. Aftercart_stale, the guidance says whether the cart was cleared or left as it is; check it withviewCartbefore adding items again. - If the store's total has changed since review,
placeOrderreturnsorder_total_different. Review and confirm again. - A delivery goes to the address
confirmFulfillmentset, even if the person's default address changes afterwards. If that delivery address is changed or removed afterconfirmFulfillment,reviewOrderanswersfulfillment_not_setandplaceOrderanswersorder_not_reviewed: callconfirmFulfillmentagain, which clears the cart. If it answersno_saved_address, the person must save an address first. - Changing the cart after review clears the review and the approval, so both happen again.
- A successful order empties the cart. The fulfillment mode is kept for the next order.
Widgets
On hosts that support MCP Apps, discoverStores, browseMenu,
viewCart and reviewOrder show interactive views. A view can add or remove items and re-price the order. Placement is
handed back to the agent, and always goes through confirmPayment.
Test in Sandbox
Use your Sandbox URL. It reaches only Sandbox stores, and placing an order there contacts no payment processor.
- When you sign in, save an address near the Sandbox test location,
1 Sandbox Plaza, New York, NY 10001. Stores are found near the saved address, so this is what makes the test store appear. - Save one of the test payment cards as the payment method. The card decides whether the order is approved or declined, and with which error.
- Order from the test store as usual.
Errors and limits
| Response | Meaning | What to do |
|---|---|---|
404 | The URL names no active server. | Check the stem. |
401 with WWW-Authenticate | No token, an expired token, or a token issued for a different URL. | Your client signs in again for this URL. |
403 with insufficient_scope | The access token does not carry the ordering scope. | Your client signs in again, asking for ordering. |
405 | The request was a GET or DELETE. | Send POST. |
429 with Retry-After | A rate limit was reached. | Wait the number of seconds in Retry-After, then retry. |
Rate limits apply:
- per network address, on every request, with tighter limits on the sign-in pages and on client registration;
- per access token, across all tools, and on
2026-07-28clients also per tool; - on the token endpoint, per authorization code or refresh token.
A tool that fails still returns a result, with isError: true, a structuredContent.errorCode, and agentGuidance
telling the agent how to recover. Every code is listed in the error code reference.
Compared with the Ordering MCP at /mcp
/mcp2/{partnerStem} | /mcp | |
|---|---|---|
| Credential | The person's own sign-in, over OAuth | A Marketfront session token created with your API key |
| Partner and environment | Chosen by the URL | Carried by the token |
| Protocol | 2026-07-28, stateless; 2025-11-25 clients supported | 2025-11-25, stateless |
| Inline prompts | Multi Round-Trip Requests, on 2026-07-28 clients | Form elicitation, on clients that advertise it |
| Tools | The same thirteen | The same thirteen |
What's next
- Tools reference: every tool's description, parameters and output fields, generated from the server.
- Marketfront API Getting Started: the Sandbox test store and test cards in detail.