What shipped in the Playground — new probes, models, runtimes, and the fixes that come with them.
92 releases
Playground release 0.23.7
Fixed
A checkout can complete after the store asks the buyer to review it. When a store answers complete_checkout with an error the buyer must review (for example a price that changed, with severity requires_buyer_review) or a declined payment, the next attempt now carries a new idempotency key, so the store treats it as a new request instead of returning its earlier answer. A retry of a request that got no answer still reuses its key, so a store that receives it twice can deduplicate it and never charges twice.
Playground release 0.23.4
Fixed
MCP servers that use sessions now work. When a server returns an Mcp-Session-Id from initialize, Playground sends it on every later request in the session, as the MCP Streamable HTTP transport (2025-03-26) requires. It also sends notifications/initialized after initialize, gives every request its own JSON-RPC id, and starts a new session when the server ends one (404). Before, servers that require the session id refused every call after initialize, so the Agent found no tools.
Local addresses keep http:// on the Agent page and Inspector. Endpoints on *.localhost, .local, .internal and .test hosts, private IP addresses and bare host names are no longer upgraded to https, matching how the server already treats them.
When a store sends a product description in more than one format, the Inspector now shows the plain-text version, then Markdown, then the HTML with its tags removed. HTML is never shown as raw tags.
On 2026-08-25 stores reached over REST, a checkout update is now sent as PUT with the whole checkout, using the spec's fields for line items, buyer, discount codes and delivery or pickup choices; anything the agent does not change is kept as the store last returned it. The Agent also reads UCP amounts as minor units, so 1290 BRL shows as R$12.90.
Every REST request now carries Request-Id, requests with a body carry Content-Digest, and the MCP-only meta field stays out of REST bodies. When a store declares payment handlers, the Agent sends each instrument with the handler's id and a type that handler lists, and hands the buyer to the store's page for handlers that complete there.
Optional fields written as “this type or null”, common in Python-built stores, now keep their type, so the Agent no longer sends a search query as an object. Empty objects in the Agent's arguments are sent as {} rather than an empty list, and catalog filters stay a single object on stores that follow the spec.
On stores running UCP 2026-08-25 over REST, the Agent now completes a checkout with the spec payment object and only the payment handlers the store declares; those stores previously rejected it with $.payment is required. Search terms and product ids made only of digits, such as article numbers with a leading zero, are now sent as text.
Buyer context in Settings now takes your position: a place, coordinates and a time zone. The Agent is told where the buyer is and the local time there, so a run against a cinema, restaurant or hotel starts in the right place. It is not added to store requests and is not shown on shared sessions. This release also fixes runs that stopped before the first turn when a tool's input schema left a field open-ended, and sessions on stores that aren't retail-shaped are no longer marked failed when their tools succeeded.
Place and coordinatesLocal time by time zoneTyped by you, never detected
When the model provider stops part-way through an answer, the Agent retries that step once instead of showing the half-finished reply, and says so if it happens again. Session History now opens a session from anywhere on its row.
Agents can shop through a store's own page tools (WebMCP)
Many stores now offer agents a second way in: tools registered by the store's own web page through WebMCP, beside the store's UCP endpoint. The Agent can run a shopping task through those page tools, in a browser on our side, and the Inspector lists them beside the store's UCP tools so you can see what each route offers.
Pick the route from the new Connection choice on the Agent's endpoint card: UCP over MCP, UCP over REST, or the store page (WebMCP). Nothing changes for UCP: existing Targets, Sessions and Collections work as before. WebMCP is not a UCP transport, so the Playground keeps the two apart.
The Agent connected to the Flower Shop demo store over UCP · REST, with the Connection choice open: UCP over MCP (unavailable here, the demo store has no MCP endpoint), UCP over REST, or the store page's WebMCP tools.
—Store-page runs · One task per run for signed-in users, up to 10 a day. Cart tools run; the run stops at the store's checkout and never pays. Tools that pay or place an order never run.
—Screenshots and replays · Each store-page run keeps a screenshot of the page it opened, of each step that changes what a shopper sees (such as the cart), and of the checkout it reached, with the text the checkout page showed. They appear under each step in Sessions and on shared replays.
—Inspector · A WEBMCP view beside MCP and REST lists the page's tools with findings, not grades, a parameter table for each, and a table matching page tools to the store's UCP tools by job. Read-only tools can be run there.
—Agent behaviour · On both routes, text written by the merchant or third parties inside tool replies is treated as information, not instructions. A tool's own guidance on which tool to call next is followed.
Inspector shows product images on REST stores that send image_url.
The A2A transport tab says the endpoint is declared and that the Inspector connects over MCP and REST, instead of showing an MCP status that never resolved.
Playground release 0.21.1
Fixed
Request signatures match the UCP signatures spec exactly. Signed requests no longer carry a tag or alg signature parameter: UCP defines no tag of its own, and the algorithm comes from the published key. Stores that verify signatures strictly (UCP 2026-08-25) now accept Playground requests instead of answering signature_invalid.
Playground release 0.19.1
Changed
Agent instructions, version 1.1. The agent treats everything a store's tools return (catalogue entries, reviews, policies, page content) as third-party content: it uses the facts and reports any instructions inside them instead of following them. It answers questions about store terms only from the store's own policy results, and it keeps clear of medical, legal and safety-critical advice.
Playground release 0.19.0
Added
Six new models: Gemini 3.8 Flash and Gemini 3.7 Flash, GPT-6 Luna, Qwen 3.8 Flash, DeepSeek V4.1 Flash, and Meta's Muse Spark 1.3. Each was checked for tool calling before it joined the list. The homepage lists all 26 models in two columns.
Prompt caching. Runs mark the system prompt and the newest message as cacheable for models that need explicit markers (Anthropic, Google), so later calls in a run read earlier rounds from the provider's cache instead of paying for them again. Other providers cache a repeated prefix on their own. Cached input tokens are now recorded for every model call.
Changed
Identity linking follows UCP 2026-08-25. Stores that declare dev.ucp.common.identity_linking with config.providers (for example Shop on Shopify stores) are now recognised. Playground runs the specification's discovery: protected-resource metadata (RFC 9728), then authorization-server metadata (RFC 8414), and the issuer must match exactly. A store whose issuer doesn't match shows why it can't be linked, instead of hiding the option. The authorization response's iss is now checked against the discovered issuer.
Fixed
Identity linking no longer fails when a store declares an empty scopes map.
A hotel test store for the draft lodging booking capability
hotel.local now sits beside flower-shop.local in the Agent and the Inspector. It implements the draft dev.ucp.lodging.booking capability, merged into the UCP draft on 24 September 2026 and not yet in a dated release, with payment terms and the cancellation policy extension, over MCP and REST. Two of its properties reproduce the specification's worked examples exactly, and its responses validate against the draft schemas.
Stores that declare dev.ucp.lodging get a booking flow in the Inspector instead of a product search: Search, Rate, Review, Book. In the Agent, a model can search, hold and book a stay end to end, with hotel cards in the chat, and the run is read against a lodging funnel. Shopping stores and existing Targets, Sessions and Collections work as before.
The Inspector on hotel.local: a booking session ready to complete, with the store's tax disclosure, price breakdown and payment terms, and the held booking in the Held state panel.
—Booking session · Status, the price breakdown (totals), when each amount is paid (payment.terms: due today, later, or at the property), the cancellation policy with its refundability, and the store's messages keyed by code and path.
—Disclosures · Shown in full, and acknowledged before booking. Errors name what the store still needs, such as the booker.
—Agent · Hotel cards for search results and for the booking itself. A lodging run reads Search Stays, Hold Room, Book, Booked, and ends as Room Held or Booked in session history, shared replays and comparisons. The sessions API returns vertical (lodging or shopping).
—Any agent · The same store is at /lodging-merchant for agents outside the Playground, with its profile at /lodging-merchant/.well-known/ucp. Discovery is outside the lodging capability, so the store adds its own search_properties tool and labels it as not part of UCP.
—Held state · One row per held item with a single status (Held, Ready, Booked, Expired) and the merchant's message codes; expired items are grouped. A completed booking shows as Booked, and Release on a live booking session cancels it at the store. Totals in currencies without minor units, such as JPY, now display correctly.
Shared sessions are now a fixed copy taken when you share them, published with a content hash. The shared page, the embed and the session JSON all serve that copy. To publish later turns of a session you continued, unshare it and share it again.
A continued session always resumes from the conversation saved on the server.
Changed
The session JSON now says whether the session's store requests ran in the cloud or on a local runner.
A session reaches checkout only when the store's response shows it: a checkout URL, or a checkout status or order returned by the store.
Playground release 0.16.5
Security
Requests the Playground makes to a store now check every redirect before following it, not just the first address, and never forward credentials to a different origin.
Session history pages no longer send internal instructions to the browser.
Playground release 0.16.4
Fixed
The buyer context you set (country, currency, language) is now sent with cart requests as well as catalog searches, so a cart is priced in the same market as the search that found the product. Previously some stores could report an in-stock item as sold out when the cart was created.
Playground release 0.16.3
Changed
Connecting to a store that doesn't support UCP now shows a clear notice in the Agent and the Inspector, with a link to check the domain on UCP Checker, instead of an error.
Playground release 0.16.1
Fixed
Product cards on shared replays now show for searches that include higher-priced items.
Playground release 0.16.0
Changed
Shop All Stores now covers every verified UCP store, on every platform. Cross-store shopping draws on UCP Checker's Agentic Resource Discovery (ARD) index instead of a small set of Shopify stores, so Wix, WooCommerce and other platforms are included.
The agent shops the chosen store directly. After picking a store, the agent uses that store's own UCP tools, and it stays with that store across follow-up messages.
Added
Shared sessions as JSON. A shared session is available at /s/{id}.json.
Fixed
Product images on shared replays no longer break.
Error codes on shared replays and bug reports are shown correctly.
When the Agent can't find a store's manifest it now shows the reason, such as no local runner online for the Local runtime, a host outside the runner's allowed targets, or a domain that can't be reached, instead of reporting that the store has no MCP endpoint. Stores that connected before connect the same way.
A broken page shows a way out instead of a blank screen
When a page fails to render, a file from an earlier release is gone, or the server answers with an error, the Playground now shows what happened with options to reload, start fresh on the same page, or send a bug report with the error attached. Errors inside a single button leave the page as it is, and sessions already running are not interrupted by a network blip.
Report an error to the Playground team from where it happens
Errors in the Inspector, the REST checkout panel and Agent Sessions now carry a link to send a bug report. The report opens with the store, the tool, the transport and the error already attached, and lists exactly what will be sent before you send it.
Personal data is removed from the error before it is stored, and the full response is never sent. Signed-in reports get a reply at the account email; guests can add one. A store's error is sometimes the Playground's fault, and this is the fastest way to tell us.
Inspector and Agent SessionsDetails shown before sendingReply to your email
The agent profile at /.well-known/ucp-agent, which every Inspector call and Agent Session presents to a business, still declared UCP 2026-04-08. A business that runs only 2026-08-25 refused those requests with version_unsupported. The profile now declares 2026-08-25. Businesses that also advertise 2026-04-08 in supported_versions accepted the old profile and see no change.
A rejection sent as HTTP 200 with ucp.status: "error" in the body is now reported as a failed call in the Inspector and in Agent Sessions, carrying the business's error message, where it previously counted as a success. Existing Sessions, Collections and saved Targets keep working unchanged.
Before
"version": "2026-04-08"
Refused with version_unsupported by businesses that run only 2026-08-25; a 200 error body read as success.
After
"version": "2026-08-25"
Accepted. A 200 carrying ucp.status: "error" is reported as a failure with its message.
Session detail now carries the negotiation readout and the buyer_context the Session started with, and discover returns the same negotiation readout for any domain. Both are described in the OpenAPI contract. Sessions recorded before 0.12.0 return null for both fields; nothing else in the responses changed.
What the merchant holds for you, what you negotiated, and where you are shopping from
Three additions to the Inspector and the Agent. A Held state panel mirrors whatever a merchant has issued an id for on your behalf — a cart, a checkout, a hold on an offer, a reservation — grouped per merchant, with the merchant's own totals, expiry and next step. A Negotiation readout shows, on connect, which declared capabilities both sides can use and why each one is active, passed through as a vendor extension, or excluded. A Buyer context setting sends the spec's context signals (country, currency, language, region, postal code) on every catalog search, editable inline from the search box.
Nothing about the handshake changed: discovery, initialise and capability negotiation are untouched, and existing Sessions, Collections and saved Targets keep working. Held state is a mirror of merchant responses; it never computes a total and never contacts a merchant on its own. Guests do not get a ledger.
The Inspector on a demo travel store: the buyer context pill above the search box, and a held offer with its expiry in the Held state panel.
—Held state · One row per merchant and kind. Stage follows the merchant: cart, checkout, escalated, completed, or stale when a call fails or a hold expires. The merchant's warnings ride along as a note.
—Negotiation · Five steps — discover, select version, intersect, resolve extensions, activate — and a reason on every capability row, including a version the platform does not run.
—Buyer context · Saved per account or workspace, sent as catalog.context where the merchant's tool accepts it, and available to the API as buyer_context. Whether it changes prices is the merchant's call; the readout shows what came back.
—Sessions · Each Session keeps the negotiation and buyer context it started with, and the held state it produced. Replays and comparisons show what the run connected with, not what the merchant declares today. Shared Sessions carry the negotiation and the locale only.
UCP 2026-04-08 wire shapeInspector · Agent · APIMerchant response is truth
Shop All Stores buys from the store, not through the index
A Shop All Stores Session now runs in two stages. It searches the multi-store index, checks a candidate's observed state and policies, and picks a store — then connects to that store and carries on in the same Session with the merchant's own tools, including its cart and checkout. The index resolves; it never carries the transaction.
For a Session already under test that means the funnel is unchanged and reaches the same rungs: the Agent still ends at a cart or a checkout URL, against the store it chose. If the store it picks cannot be reached, it keeps the index tools and can choose another rather than failing the Session. Specific Store Sessions are untouched.
Before
index → merchant
The Session's cart was created by the store index on your behalf.
After
Playground → merchant
The Session connects to the store and transacts with it directly.
Playground release 0.11.2
Fixed
The default model used for automatic session and store classification had been retired by the upstream model provider; switched to a current model. Explicit CLASSIFICATION_MODEL configuration still takes precedence.
The August 25 protocol release renames the profile's signing-key field to keys, a JWK Set per RFC 7517, and adds eight capabilities — moving the payment extensions out of the shopping vertical into dev.ucp.common.payment.*. The Inspector reads both spellings of the key field, and the new capability names appear in a target's readout instead of being dropped from it.
A target that has already migrated to keys is no longer marked down for a missing key, and targets still on v2026-04-08 are unaffected — both fields pass and no capability was retired. The Playground's own agent profile publishes both, so a business verifying our signed requests resolves a key on either version.
Every surface — Inspector, Agent, session history and replays, Conformance, the docs, and the homepage — now shares one visual language: a single menu component, consistent rail panels with an ⓘ link to their docs page, one verdict and badge vocabulary, and the same type and color tokens everywhere. Nothing moved and nothing was retired; existing sessions, targets, and Collections work unchanged.
A replayed session with the Backend toggle on: the meta card, funnel, and the new Wire log.
—Wire log · The replay's Backend view is now a level-tagged event log — request, response, error, and reasoning rows with timings, a header counted from the rows it labels, and Copy JSON.
—Rail, rebuilt · The Agent rail's panels (Endpoint, Runtime, Funnel Progress, Session Stats, Model) share one card and menu treatment, and each links to its docs page.
—Docs, rebuilt · The docs tree moved onto the design system — reorganized sections, app-matched type, code, and callout styling — and every page was rewritten against the shipped product: funnel variants and all thirteen outcomes documented accurately, an API reference covering every endpoint with examples, and no stale flows.
A Chrome side panel that runs a session on the tab you are already looking at — your storefront on the left, every tool call, argument, response and timing the agent actually received on the right. It detects any store that publishes a /.well-known/ucp manifest and connects automatically.
It authenticates with a personal access token from Settings → API tokens and drives the same orchestrator as the Agent page, so sessions it runs land in your session history like any other. Setup and the privacy scope are covered in Browser Extension.
chrome side panelv0.2.0detects /.well-known/ucppersonal access token
Product search works against Shopify's new Cart MCP stores
Manual product search returned Missing required arguments: catalog for stores on Shopify's newer MCP endpoint, which expects the search query nested under a catalog object. Search now sends the correct shape for those stores while keeping the previous format for older ones — nothing to configure.
Cross-store concierge search is scoped by category
The multi-store shopping concierge now scopes its search to the relevant product category, so a query like "running shoes" surfaces category-appropriate stores instead of unrelated ones, and uses each store's readiness score and latency to decide where to look first. Queries that span categories — footwear and activewear — are handled in one pass instead of two.
The Agent lineup adds Claude Opus 5, Claude Sonnet 5, Gemini 3.6 Flash, DeepSeek V4 Flash, Kimi K3, and Qwen 3.7 Max. The last two bring two new providers into the harness.
20 models8 providers6 added0 retired
—Prior-generation models stay · Nothing was retired — earlier Claude and Gemini models remain available as lower-cost options, and a Collection pinned to one keeps producing comparable results.
—Benchmarks fill in as sessions accumulate · New models appear in the picker immediately; their leaderboard metrics populate from real sessions rather than launching with synthetic numbers.
Playground release 0.10.29
Changed
Grok 4.5 added; Grok 4.3 retired — Grok 4.5, xAI's latest flagship, now runs as its own model in the lineup and accumulates its own benchmark history. Grok 4.3 is retired: no longer selectable for new sessions, but its leaderboard page and history remain. Grok 4.5-specific metrics are still being gathered, so its performance figures will populate as sessions accumulate.
Playground release 0.10.27
Added
Transport migration visibility — Agent sessions now record when a store answers over a transport its platform has marked as deprecated (such as Shopify's legacy MCP endpoint, which retires after August 31, 2026), and store audits now also check whether the store's UCP MCP endpoint is ready. Session replays and audit records show where each store stands in the migration.
Playground release 0.10.26
Fixed
Agent identity in tool calls is now always the platform's own — Merchant tool schemas can declare meta.ucp-agent.profile as an input, and models sometimes fill it with an invented URL. Since the agent profile is how a verifying server resolves the platform's signing keys, a model-invented value made signature verification fail with key_not_found on servers that enforce signed requests. The platform identity is now injected at the transport layer on every tool call and always overrides model-supplied values, so signed sessions verify correctly against stores that check them.
Playground release 0.10.25
Fixed
MCP request signatures now cover Idempotency-Key — Per the UCP signatures specification, the Idempotency-Key header must be a signature-covered component on state-changing HTTP methods — and every MCP request is an HTTP POST. The platform's REST requests already complied (0.10.22), but MCP requests signed without the header, so servers that verify signatures strictly rejected MCP sessions with 401 AuthenticationFailed. Every MCP request now carries an Idempotency-Key inside the signature's covered components, reusing the per-operation key for payment-critical tools so retries deduplicate.
Playground release 0.10.24
Changed
Shopify sessions now prefer the UCP endpoint — Sessions against Shopify stores now connect to the UCP-conforming /api/ucp/mcp endpoint (Cart MCP and Storefront Catalog MCP) whenever the store's manifest advertises it, including the full MCP handshake with agent-profile discovery. This unlocks the endpoint's complete tool suite — catalog search and lookup plus the full checkout lifecycle (create_checkout through complete_checkout) that the legacy storefront endpoint never offered. The legacy /api/mcp endpoint remains a fallback until Shopify retires it after August 31, 2026, and stores whose manifests only advertise the legacy endpoint are connected exactly as declared.
Playground release 0.10.23
Fixed
Agent profile is now publicly cacheable — The platform's agent profile at /.well-known/ucp-agent (and the demo store's /.well-known/ucp manifest) was served with session cookies and a no-cache, private Cache-Control. UCP businesses that perform agent-profile discovery validate how the profile document is served and can reject a non-cacheable one, which blocked checkout flows against those stores before the first tool call. Both documents are now stateless and served with Cache-Control: public, max-age=3600, stale-while-revalidate=7200.
Support for Shopify's UCP endpoint (/api/ucp/mcp) — Shopify is migrating storefronts from the legacy /api/mcp MCP server to the UCP-conforming /api/ucp/mcp (Cart MCP and Storefront Catalog MCP), with the legacy endpoint retiring after August 31, 2026. The new endpoint performs UCP agent-profile discovery on every request — including tools/list — and reads the agent profile from the tool arguments' meta rather than the MCP _meta field. The platform now supplies its profile where the new endpoint expects it, on both tool listing and tool calls, while requests to standard MCP servers are unchanged.
Playground release 0.10.22
Fixed
Idempotency-Key is now a signature-covered component on state-changing requests — Per UCP 2026-04-08 (signatures), the Idempotency-Key header on POST/PUT/PATCH/DELETE requests must be one of the signature's covered components, so it cannot be added, altered, or stripped in transit. The platform sent the header but left it out of Signature-Input, so a server enforcing the spec's coverage rule rejected every state-changing call with HTTP 400 and checkout flows failed at the payment step. The key is now included in the covered components whenever the header is sent, and DELETE requests — previously sent unsigned — now carry and sign the key as well.
Idempotency keys are stable across retries of the same operation — The agent previously minted a fresh key on every attempt, which defeats the header's purpose: a retry of the same logical operation should reuse the same key so the server can deduplicate instead of double-executing (for a checkout completion, double-charging). For payment-critical operations — completing or cancelling a checkout or cart — the key is now derived deterministically from the target store and the specific resource being acted on, so retries carry the same key on both MCP and REST transports.
Playground release 0.10.21
Fixed
Embedded checkout now opens for stores with vendor-namespaced payment handlers — Launching the embedded checkout overlay previously required the store's manifest to declare the legacy dev.ucp.delegate_payment handler; stores declaring their own reverse-DNS vendor handlers (per the UCP v2026-04-08 namespace rules) were blocked client-side with embedded_context_ineligible. Per the spec, embedded checkout is a transport concern rather than a payment-handler concern, so eligibility now follows the transport-level signals: an embedded transport declared in the store's manifest services and a checkout URL originating from that store. Any store declaring the embedded transport now works, regardless of which payment handlers it declares.
Playground release 0.10.19
Changed
Model lineup refreshed to current frontier versions — The Anthropic, OpenAI, and Google fast slots now run their latest releases: Claude Opus 4.6 → 4.8, Claude Sonnet → 4.6, GPT-5.2 → 5.5, and Gemini 3 Flash → 3.5 Flash. Existing sessions and leaderboard history under these slots are unaffected.
Added
DeepSeek V4 Pro and Llama 4 Maverick — Added DeepSeek's V4-generation flagship and Meta's current open-weight flagship, replacing the 2024-era Llama 3.3 70B. Both are newly added, so leaderboard metrics for them are still being gathered.
Playground release 0.10.18
Removed
Retired two unavailable models — QwQ 32B and Grok 3 Mini have been removed from the lineup. The upstream router no longer serves QwQ 32B, and Grok 3 Mini is superseded by the Grok 4 line the Playground already runs. Their per-model leaderboard pages retire with them.
Playground release 0.10.17
Added
Inspect the wire-level request and response for every tool call — Each tool call in the session timeline (and in session replay) now expands to show exactly what crossed the wire: the transport (MCP or REST), the method and URL, the request the platform sent, and the raw response the merchant returned. For REST calls the platform translates a tool's friendly arguments into the spec's request shape, so the request shown is the translated one; for MCP calls the full JSON-RPC envelope is shown. When a merchant's endpoint returns something unexpected, you can read the exact request/response pair inline instead of reaching for a separate HTTP client.
Fixed
Agent no longer errors on structured tool results — When a store returned a tool result whose data content block carried a structured (object or array) payload instead of a string, the tool call failed with an internal error. Structured data payloads are now serialized correctly, so those calls complete.
Failed tool calls now explain themselves — A failed REST call could surface a bare null, and a connection failure during a REST-primary call was mislabelled as an MCP fallback (implying an MCP step that never ran). Failed REST and MCP calls now report the merchant's HTTP status and response body, and the wording distinguishes a plain request error from an actual MCP→REST fallback.
Playground release 0.10.16
Fixed
Signed requests now cover the full set of spec-required components — Per UCP 2026-04-08 (signatures), a request signature must cover the @authority and @path derived components by name (not the combined @target-uri), the @query when the request carries one, and content-type when it has a body — alongside @method, content-digest, and ucp-agent. The platform previously signed a narrower set, so a merchant verifier that enforces the spec's covered-component table to the letter could rebuild a different signature base and reject an otherwise-valid request. Outbound signatures now build the covered set per request — and cover the idempotency-key on state-changing requests that carry one — so strict verifiers reconstruct an identical base and accept them.
Playground release 0.10.15
Changed
Order webhook verification hardened — Inbound order webhooks now fail closed on ownership: a verified delivery for an order the platform has no record of placing (or one carrying no order id) is rejected rather than accepted-and-flagged, so the signer must always own the referenced order. Retried deliveries are also deduped on the Webhook-Id header — an event already accepted under a given id is acknowledged with a 2xx without being recorded or processed twice.
Playground release 0.10.14
Fixed
Agent now reads structured tool results — Per the UCP MCP binding, a store returns its response payload in the MCP structuredContent field and may also mirror a serialized copy into content[] for clients that don't read it. The agent previously read only the content[] text, so against a spec-compliant store that returns its catalog in structuredContent and leaves only a short label in content[], the agent received the label instead of the products — searches looked empty even when the store had returned results. The agent now reads structuredContent first and falls back to content[], so results from spec-conformant stores come through correctly.
Playground release 0.10.13
Added
Identity-linking re-authorization — When a protected tool call returns an identity-linking challenge, the playground now surfaces it and drives re-authorization with the right scopes. identity_required prompts to link an account; insufficient_scope lists the required permissions and re-authorizes for the full scope set named in the challenge (never just previously-granted scopes, and it won't loop if those scopes are already granted); invalid_token prompts to reconnect. After re-authorizing, the operation that triggered the challenge is re-run automatically.
Playground release 0.10.12
Added
Verified order webhooks — The platform now accepts business→platform order webhooks at /webhooks/ucp/orders and verifies them per the UCP spec: each delivery's RFC 9421 signature is checked against the sending business's published key (resolved from the UCP-Agent profile and matched by kid), the body digest is confirmed, and the signer is authorized against the order's owning business — webhooks signed by a business that doesn't own the referenced order are rejected. Unsigned or invalid deliveries are refused; verified deliveries are acknowledged and recorded for inspection. The webhook URL is advertised as config.webhook_url on the order capability in the platform profile.
Playground release 0.10.11
Fixed
Agent profile now conforms to the UCP profile schema — The platform profile at /.well-known/ucp-agent previously used a non-standard envelope and nested its signing_keys inside it. Per UCP 2026-04-08, a profile document's root is a ucp member with a siblingsigning_keys array, and verifiers resolve keys via profile.signing_keys matched by kid. Because the keys sat at the wrong path, merchants that verify signatures couldn't locate them and rejected agent checkouts with a "missing signing keys" error. The profile now emits the correct shape — a ucp member (version, the required services and payment_handlers registries, and a capabilities registry where each entry carries its version, spec, and schema URLs) plus a root-level signing_keys array, validated against the official UCP profile JSON Schema — so both signature verification and capability negotiation resolve correctly.
Playground release 0.10.10
Added
Public agent profile — The platform now publishes its UCP agent profile at /.well-known/ucp-agent. This is the document meta.ucp-agent.profile points to, so merchants can identify and verify the Playground: it declares the platform's name and contact, the UCP capabilities it supports (for capability intersection with the store), and the signing_keys JWK set used to verify signed requests.
Changed
Model lineup: Grok 4.3 — The xAI frontier slot now runs Grok 4.3, replacing the retired Grok 4. Existing Grok sessions and the model leaderboard are unaffected.
Fixed
Search filters no longer crash the agent — Some models pass a search's filters as a single object (or include a stray non-object entry) instead of the expected list of filter objects. The agent now normalises both shapes instead of erroring out, so those searches run through cleanly.
Playground release 0.10.9
Added
Verifiable agent identity (signed requests) — The Playground now signs its outbound requests to merchants using HTTP Message Signatures (RFC 9421, ECDSA P-256 / ES256) and publishes its public key as a signing_keys JWK set in its agent profile at /.well-known/ucp-agent. Merchants that gate or authorize agents can now cryptographically verify that a request genuinely originates from the Playground — matching the signature to the published key by kid — instead of trusting the UCP-Agent header string alone. Per UCP 2026-04-08 (signatures), platforms SHOULD sign requests; each signature covers the request method, target URI, body digest (Content-Digest, RFC 9530) and the advertised agent identity. Signing is config-driven — where no key is set, the platform advertises its identity header as before and makes no cryptographic claim.
Changed
Agent identity on the MCP transport — MCP (JSON-RPC) requests now also carry the transport-level UCP-Agent header alongside the existing _meta.ucp-agent.profile, so the same identity is advertised — and signable — consistently across both REST and MCP.
Playground release 0.10.8
Added
Vertical-aware agent sessions — The agent now resolves a prompt variant from the merchant's declared UCP service. Spec-compliant shopping merchants — including travel-as-shopping endpoints — get the full shopping workflow, while servers that declare no recognised spec service fall back to a conservative, exploratory prompt. Detection is driven by the manifest, never inferred from tool names. Funnels and outcomes are now variant-aware, so non-retail sessions are no longer scored against a shopping funnel.
Flight cards — Flight search results from travel merchants now render as flight cards in the session timeline — airline and logo, route with departure and arrival times, direct/stops, fare brand, and price — instead of generic product cards.
Changed
Confirmed bookings count as completed — A travel booking that returns a confirmed order or booking reference is now classified as purchase_completed at 100% completion, rather than stopping at checkout_reached. The confirmation is recognised whether it sits at the top level of the response or nested inside a checkout object.
Leaner search context — Flight and offer search results are now trimmed to the top options before being passed to the model, reducing token usage on travel sessions without dropping the offers the agent needs to book.
Playground release 0.10.7
Added
Identity linking for split-host authorization servers — Merchants whose dev.ucp.common.identity_linking capability declares an explicit config.authorization_server (which may live on a different host than the storefront/MCP domain) now surface the Link Identity flow correctly: the issuer is derived from the declared authorization server and OAuth endpoints are discovered there via RFC 8414. Previously the issuer was assumed to be the business domain, so discovery missed servers hosted on a separate API host.
Pre-registered (static) OAuth clients — Support for connecting to identity-linking merchants that don't offer Dynamic Client Registration, via server-side client credentials configured per MCP endpoint (the spec's static-client model). The client secret is injected server-side and never sent to the browser.
Changed
Token-endpoint client authentication — The authorization-code exchange now supports both client_secret_basic (HTTP Basic) and client_secret_post, selected from the server's declared method, and always uses PKCE S256 for identity-linking connects.
Playground release 0.10.6
Added
Usage tiers & session limits — Usage is now tiered: signed-in users and teams get progressively higher session allowances than anonymous visitors, and the playground sidebar shows a live token meter for the current run.
Changed
Per-run token ceiling — Each agent run has a safety ceiling on cumulative tokens to cut off runaway tool loops. It applies per message-run, so long multi-turn conversations are unaffected.
Agent endpoint safeguards — Added per-IP limits and input safeguards against automated misuse of the shared agent endpoint, keeping capacity available for real store testing.
Playground release 0.10.5
Added
purchase_completed outcome — Agent sessions where the merchant returns a checkout with the spec-canonical terminal status (completed per UCP 2026-04-08 shopping/checkout.json) and an attached order object are now classified as purchase_completed, not the older checkout_reached. Triggered by both the explicit create → update → complete sequence and fast-path wallet flows that complete in a single create_checkout call. The steps timeline now includes a purchase milestone after checkout. Stats (model leaderboard, collection-run summaries) treat purchase_completed as a superset of checkout_reached so historical checkout-rate comparisons stay consistent.
Fixed
Identity linking on the 2026-04-08 manifest shape — Agent Benchmark and Playground now recognise dev.ucp.common.identity_linking capabilities that use only config.scopes (no supported_mechanisms). A single mechanism is synthesized whose issuer is the business domain, and the existing OIDC-discovery step fills in OAuth endpoints from RFC 8414 discovery (https://{business_domain}/.well-known/oauth-authorization-server).
Playground release 0.10.4
Changed
UCP 2026-04-08 backport alignment (umbrella discussion #441) — Two schema fixes shipped under PR #440:
UCP-Agent on create_cart (PR #362) — confirmed the REST create_cart request already carries the required header (the one cart op that previously omitted it); added a test to lock it in.
Profile schema repairs (PR #429) — verified manifest handling already matches the corrected schema: optional service-level endpoint, anyOf profile discriminator, and RFC 9421 message signatures (signing_keys) instead of the dropped RFC 7515 signature field.
Identity-linking OAuth2 groundwork (PR #431, backporting PR #354) — Backend groundwork only: reading the 2026-04-08 config.scopes map per schema, parsing RFC 6750 WWW-Authenticate challenges (identity_required / invalid_token / insufficient_scope), and surfacing 401/403 challenges to the client.
Playground release 0.10.3
Fixed
Multi-item checkout on stateless stores — Models can now bundle all items into a single checkout when the store returns requires_escalation and the user wants to add more products.
Improved MCP tool call reliability on Shopify stores
Playground release 0.10.2
Added
Spec URL binding validation — Manifest analysis now validates that capability spec URL origins match namespace authorities per the UCP spec (e.g. dev.ucp.* must reference ucp.dev, with each namespace's spec URL resolving to its reverse-DNS authority). Violations are reported in audit results and scored.
Capability intersection — The platform now computes the intersection between platform-supported capabilities and the merchant manifest. Unsupported dev.ucp.* capabilities are excluded; vendor extensions pass through. The platform profile at /.well-known/ucp-agent declares proper UCP capability names.
MCP error classification — JSON-RPC errors are now classified into UCP spec categories: auth (-32000), negotiation (-32001), signature, method not found (-32601), invalid params (-32602), and internal (-32603), replacing a generic error prefix.
Continue URL as general fallback — Escalation detection (requires_escalation + continue_url) now works on any tool response, not just checkout tools, per the UCP spec. Embedded auto-escalation (without requires_escalation) remains checkout-scoped.
Fixed
OAuth token forwarding — Endpoint key normalization now treats http:// and https:// URLs as the same session lookup key. Previously, tokens stored during the OAuth callback could silently fail to attach to MCP calls when the transport layer normalized the scheme.
UCP-Agent header on every MCP request — The platform profile (meta.ucp-agent.profile) is now injected on every MCP call per the spec, not only when the model's tool args already contained a meta object.
No redirects on MCP requests — The platform no longer follows redirects on profile/endpoint fetches, per the UCP spec requirement that platforms MUST NOT follow them.
Agent page identity status — The connected state now shows immediately when an OAuth token exists, matching the Playground page. Previously it required both a token and a resolved identity profile, leaving the UI showing neither the Link Identity button nor the connected state.
Playground release 0.10.1
Fixed
REST search filtering — The POST body now keeps the query key as-is for v2026-04-08 stores (it was renamed to search, causing some WooCommerce UCP stores to ignore the filter and return all products).
Catalog lookup format — Changed from {"id": "..."} to {"ids": ["..."]} per the v2026-04-08 spec.
Cart quantity +/- and remove — Now works on REST-only stores by creating a new checkout session via POST (was using unsupported PUT/PATCH).
Limit parameter — Maps limit to per_page in the POST body for WooCommerce compatibility.
Agent identity in checkout — Injects meta.source: ucpplayground in checkout requests so stores can attribute sessions.
Health check alignment — Updated to match the v2026-04-08 spec: signing_keys checked at top level, replaced the auth-section check with service-entry field validation (version + transport required), removed the non-spec ucp.auth check.
The Inspector and Agent now run against stores that expose only REST endpoints — no MCP required. Tested against WooCommerce UCP v2026-04-08 stores, which opens the harness to platforms that adopted the spec's REST transport first.
The Inspector connected to a REST-only store, with health check and capability map (current UI).
—Tool mapping · MCP tool names map to the spec's REST paths — /catalog/search, /catalog/lookup, /checkout-sessions — so a session reads the same whichever transport served it.
—Synthetic tools for the Agent · REST-only stores get tool definitions generated from their manifest capabilities, and the model's tool calls route through REST directly.
—v2026-04-08 response shapes · Product cards parse price_range.min.amount, media[].url, split descriptions, and variant IDs; variable products fall back to a product-page link when variant IDs are absent.
Playground release 0.9.9
Added
Standardized navigation — Consistent header nav across all pages with grouped links (Playground, Agent, Sessions, Collections), help button, and bordered logo icon.
Info panel redesign — Moved the Show/Hide Info button out of the header. The panel now has an edge tab to reopen when closed, and defaults to closed on mobile.
Settings sidebar — All settings pages now show the same sidebar: Profile, API Tokens, Appearance, Usage.
Fixed
Consistent page widths — All content pages now use the same max-width.
Navigation gaps — Added missing nav links to Collections detail, Settings, and Teams pages. Fixed the Leaderboard showing "History" instead of "Sessions". Removed a duplicate "Send Feedback" from the dropdown.
Playground release 0.9.8
Added
Feedback submission system — A "Send Feedback" link in the footer lets both guests and signed-in users report bugs, request features, or ask questions. Submissions are stored with type, message, optional email, page URL, user agent, and linked session ID, with honeypot spam prevention and per-IP rate limiting for guests.
Magento UCP support — The generic adapter now handles Magento UCP middleware stores with {plain: "..."} descriptions, variant-level media[] images, and search_catalog/get_product tool names.
Token consumption charts — Leaderboard and model pages now display token usage charts.
Fixed
Shopify MCP v2026-04-08 format changes — Product descriptions now come back as {html: "..."} objects, images moved to media[] arrays, and price_range.min is now a {amount, currency} object instead of a string. Both the Playground search panel and the Agent page cards now handle all three formats.
Checkout link always visible — The "Continue to Checkout" / "Open in Store" link is now always shown alongside the embedded checkout button, so users can complete checkout even when the embedded overlay fails.
Bare-root UCP manifest support — Manifests without a ucp wrapper key (e.g. the v2026-01-11 format) are now normalized automatically, fixing "Missing ucp key" health-check failures for some stores.
Domain input URL stripping — Pasting a full URL (e.g. https://example.com/.well-known/ucp) into the domain field now strips to just the domain, preventing double-path errors.
Playground release 0.9.7
Added
UCP v2026-04-08 spec alignment — Bumped all version references from v2026-01-23 to v2026-04-08 across store-audit config, the ECP protocol, factory defaults, and demo discovery manifests.
Agent platform profile — A new /.well-known/ucp-agent endpoint serves a JSON profile document identifying UCP Playground as a trusted agent platform, as required by UCP v2026-04-08 authorization signals (spec #203).
Auto-inject meta.ucp-agent.profile — The orchestrator now automatically injects meta.ucp-agent.profile on every MCP tool call, identifying the platform to merchants (the same pattern as the existing meta.idempotency-key auto-injection). Merchants can use this to authorize agent platforms.
New tool step patterns — Added catalog.search, catalog.lookup, catalog_search, catalog_lookup, and convert_cart to step detection for stores adopting the new UCP spec naming conventions.
OAuth force-reset — A "Reset" button on the identity-linking panel clears all cached OAuth state (tokens, identity profiles, client registrations) across all endpoint keys. Fixes reconnection issues when a merchant reinstalls their UCP plugin and the endpoint URL changes.
Playground release 0.9.6
Added
UCP Identity Linking — Merchants declaring dev.ucp.common.identity_linking with a dynamic client registration endpoint now get a one-click "Connect Account" button. The full flow: dynamic client registration (RFC 7591) → OAuth2 + PKCE popup → buyer profile resolution → identity badge with name, email, and granted scopes.
Buyer identity in Agent sessions — When a buyer is identity-linked, their name and email are injected into the agent's system prompt so the AI auto-fills checkout fields. Works in both Playground and Agent pages.
Token refresh — OAuth access tokens can now be refreshed using stored refresh tokens without re-authenticating.
Identity linking on Agent page — The Agent page now supports OAuth identity linking with a "Link Identity" button in the sidebar, an identity badge in the chat header, and shared session support (link in Playground, use in Agent).
Playground release 0.9.5
Added
DeepSeek R1 (Reasoning) model — A new reasoning model that exposes chain-of-thought before responding.
Reasoning visibility — Reasoning blocks display as collapsible amber sections in the Chat view (session replay and live chat). Automatically enabled for reasoning-capable models.
Playground release 0.9.4
Added
B2B procurement support — New step patterns, outcomes, and agent prompts for create_rfq, get_quote, and submit_po tools.
Travel/booking support — Step detection and agent prompts for search_hotels, get_hotel_details, create_booking_session, and complete_booking tools.
Fixed
Custom merchant sessions misclassified — Sessions using non-standard tool names (e.g. create_checkout_session, complete_booking) were classified as search_only or failed despite completing full flows.
Playground release 0.9.3
Added
Help Center — A full documentation site at /help with 23 articles across 7 sections: Getting Started, Playground, Agent, Leaderboard, Store Audits, For Merchants, and Troubleshooting.
Fixed
Failed tool calls misclassified as step completions — Step detection, milestone emission (cart_created, checkout_attempt), and cart-data extraction now run only when a tool call succeeds (the MCP isError flag is falsy). Previously a failed update_cart or create_checkout would still mark the cart step complete and emit a cart_created milestone, inflating conversion metrics. Sessions where every cart tool errored are now correctly classified as search_only or failed.
Playground release 0.9.2
Fixed
Malformed idempotency-key UUIDs sanitized — Some models occasionally emit a non-conformant meta.idempotency-key, causing merchants to reject complete_checkout with a -32602 validation error and triggering expensive retry loops. Malformed keys are now detected and replaced with a valid UUID.
Payment object shape coercion — When a model passes checkout.payment as an empty array instead of an object, the platform now coerces it to the expected shape, avoiding the -32602 validation errors that previously blocked cart creation on some checkout schemas.
Playground release 0.9.1
Added
Model-agnostic tool-arg guardrails — The platform now strips invalid placeholder values that some models inject into optional tool parameters (such as fabricated pagination cursors or single-character values in nested filter sub-fields) before forwarding a call. Designed as scaffolding — as models improve their tool-calling discipline, these rules can be relaxed or removed per model.
Fixed
Spurious "Malformed cursor" retry loops — Some models always include the optional after pagination cursor in catalog searches, filling it with invalid values that the store rejects. Stripping these server-side resolves the resulting retry loops.
Playground release 0.9.0
Added
Expanded model lineup — Six new models added to the Agent benchmark, bringing the total to 11 models across 6 providers:
Claude Opus 4.6 (Anthropic) — Anthropic's strongest model for coding and long-running agentic tasks
GPT-5.2 (OpenAI) — OpenAI's most advanced model with 400K context and strong agentic tool use
Gemini 3.1 Pro (Google) — Google's frontier reasoning model with a 1M-token context window
Grok 4 (xAI) — xAI's frontier model
Gemini 3 Flash (Google) — Google's fast-tier model with strong tool-use capabilities
DeepSeek V3.2 (DeepSeek) — A frontier-competitive open-weight model at a fraction of the cost
Agent REST fallback — The agent tries MCP first per tool and falls back to REST on failure, so a store whose MCP transport fails one operation can still complete others over REST. Triggered by method-not-found (-32601) and HTTP 4xx/5xx from MCP; internal tool errors (-32603) are not treated as fallback-eligible.
Changed
Gemini model lineup updated: Gemini 2.5 Pro and Gemini 2.5 Flash retained for historical comparison alongside the new Gemini 3.1 Pro.
Playground release 0.8.1
Added
Embedded transport as a first-class transport — Merchants declaring transport: "embedded" in their UCP manifest now get full playground support. The sidebar shows the embedded endpoint and ECP version, and the transport pill selector includes EMBEDDED alongside REST and MCP.
Embedded eligibility check — A shared rule determines whether a continue_url should trigger the embedded overlay, checking transport availability, URL format, strict origin match (to prevent a lookalike domain matching the merchant's), and checkout context. The backend applies the same logic.
REST-to-embedded checkout handoff — When a REST checkout session returns a continue_url and the merchant declares embedded transport with dev.ucp.delegate_payment, the REST panel offers "Open Embedded Checkout", which launches the ECP overlay using the dedicated iframe-ready checkout URL when available (falling back to continue_url).
Shared continue-url banner — A single component replaces the previously duplicated continue-url banners across the playground, showing the embedded button or a new-tab link based on transport availability.
Backend embedded auto-escalation — When a tool returns a continue_url without requires_escalation but the merchant declares embedded transport, the platform validates the origin and auto-escalates. Subdomain matching is allowed (e.g. checkout.merchant.com matches merchant.com).
Embedded smart transport routing — Embedded transport prefers REST for product browsing when available, falling back to MCP only when no REST endpoint exists, to avoid failures on merchants whose MCP server supports tools/list but not tools/call.
ECP fallback links — Error and timeout states in the embedded checkout card now show an "Open in new tab" fallback link alongside Retry, using the original continue_url.
Changed
ECP_VERSION updated from 2026-01-11 to 2026-01-23. Fallback only — the manifest ec_version always takes priority.
Fixed
Embedded transport sidebar/content mismatch — Selecting the EMBEDDED pill could show the embedded endpoint in the sidebar but "No MCP Endpoint Available" in the main content area. The content area now keys off whether an interface is available rather than checking the MCP transport directly.
Playground release 0.8.0
Added
Embedded Commerce Protocol (ECP) support — Solves the payment-credential wall (where an agent reaches ready_for_complete but can't produce a wallet token like Google Pay) by embedding the merchant's own checkout UI when secure payment credentials are required.
Protocol handshake: secure JSON-RPC 2.0 communication over window.postMessage and MessagePort, with a window→port upgrade and a state-change/completion lifecycle.
Bottom-sheet UI: a checkout overlay with spring animation, backdrop blur, drag handle, and auto-close after completion. An inline timeline card tracks protocol milestones in real time.
Payment simulation: a simulated wallet button generates mock tokens for testing; cancel sends an abort.
Debug tools: a collapsible protocol event log, a historical replay mode (static card, no live iframe), and a dedicated dev harness.
Robust error handling: timeouts at each handshake stage, a hard error on nonce mismatch, and a "Checkout not responding" state with iframe reload.
Multi-model guard: comparison view renders a static badge ("Run in single-model mode to complete checkout") and never loads an iframe.
Demo merchant: a mock implementation of the merchant-side protocol for testing.
Backend escalation detection — The orchestrator identifies requires_escalation flags in checkout tool responses (flat and nested JSON, with a regex fallback for markdown-wrapped JSON) and passes escalation data to the frontend, recording it for replay.
Playground release 0.7.0
Added
Multi-model comparison mode — After connecting to a store, authenticated users can click "Compare Models" to enter a split-column view where 2–5 LLMs run the same prompt simultaneously against the same MCP endpoint. Each model gets its own independent timeline showing tool calls, product cards, and responses in real time. A summary bar appears when all models finish, showing per-model outcome, duration, and token usage. Useful for evaluating how different models handle the same shopping task.
Playground release 0.6.2
Added
Schema quality scoring in Agent sidebar — After connecting to an MCP server, a "Schema Quality" section shows a per-tool score (0–100, graded A–F) and human-readable issue descriptions. Catches common schema problems that break agent sessions — arrays without items definitions, missing parameter descriptions, no required fields, and unstructured object parameters. Auto-expands when issues are found, collapses when schemas are clean.
Playground release 0.6.1
Fixed
Upstream provider errors shown as playground bugs — When the upstream model provider returned an error (e.g. an HTTP 401), users saw the raw message in small red text below the chat input with no indication it was an upstream issue. Errors now appear inline in the chat timeline as an amber warning card with a clear message that it isn't a problem with the playground.
Transient upstream errors not retried — Certain transient auth failures from the upstream provider failed immediately with no recovery. They are now retried once with a short delay, matching the existing 429/5xx retry behavior.
Playground release 0.6.0
Added
Embeddable phone-frame replay widget — Shared sessions can now be embedded on any website via <iframe>. The /s/{ulid}/embed route renders a compact, mobile-shaped replay player with auto-play on scroll, tap-to-play overlay, speed controls, and a Chat/Backend view toggle. Bloggers and developers can grab the embed code from the share button inside the embed itself.
Chat/Backend toggle — A segmented pill switch on session detail, shared, and embed pages flips between the chat timeline and a dark terminal event-stream view. The backend view shows model calls, tool invocations, tool responses (with syntax-highlighted JSON), and status transitions — all synced to the chat replay.
Backend event viewer — Renders event-stream data in a dark terminal aesthetic with color-coded indicators: amber for tool calls, green for successful responses, red for errors, and dashed borders for synthesized events like product extraction.
Share and embed buttons on public pages — Shared session pages now have both "Copy Link" and "Embed" buttons. The embed widget itself includes a share popover with "Copy Link", "Copy Embed", and a "Made @ UCP Playground" attribution link.
Playground release 0.5.7
Added
Transport toggle in Playground sidebar — When a merchant exposes multiple transports (MCP, REST, Embedded), a pill selector appears in the endpoint status card to switch between them. Auto-detection (MCP preferred, REST fallback) remains the default; the toggle only appears when 2+ transports have endpoints.
Playground release 0.5.6
Fixed
Unified cart tools with a complete flag misclassified as cart_created — MCP servers that consolidate checkout into a single update_cart tool with a complete: true parameter (instead of a separate complete_checkout tool) had successful checkouts recorded as cart_created. Step detection now inspects tool arguments for the complete flag.
Playground release 0.5.5
Added
Contact modal — Logged-in users can now send feedback, bug reports, or questions directly from the user dropdown menu across all pages.
Playground release 0.5.4
Fixed
MCP tools with properties: [] rejected by some models — Third-party MCP servers defining "properties": [] (an empty array) instead of "properties": {} (an empty object) caused some models to reject the tool schema with a 400 error. Empty list-style arrays are now converted to empty objects during schema sanitization.
Parameterless tools fail on null arguments — Some models send null or "" as tool-call arguments for tools with no parameters, causing a JSON decode failure. Null and empty-string arguments are now normalized to {} before parsing.
Info queries misclassified as failed — Tools like list_discount_codes, list_shipping_options, get_policies, and get_policy were not mapped to the info step pattern, so successful informational queries returned outcome=failed. These generic tool names are now recognized alongside the Shopify-specific ones.
Session pages missing info and route step chips — Session detail, shared, and history pages only displayed the four shopping-funnel steps (search, details, cart, checkout). Step chips now dynamically include "Info Query" when a session has info steps, and "Select Store" for router-mode sessions.
Cart data extraction fails for third-party MCP servers — Servers returning flat cart responses with top-level line_items and prices in cents had cart value multiplied by 100. A flat-format detection branch now treats amounts as cents when line_items is present at the top level, and extracts currency and item count.
Playground release 0.5.3
Added
How It Works page — A new content page explaining UCP Playground's four main features: manual Explore mode, AI Shop, Leaderboard, and account features. Accessible at /how-it-works and linked from the site footer.
Playground release 0.5.2
Fixed
FAQ/policy queries incorrectly marked as failed — Tool calls like search_shop_policies_and_faqs were not mapped to any funnel step, so successful info queries were recorded with outcome=failed and completion_rate=0. Added an info step pattern and info_provided outcome so these sessions are tracked correctly without inflating failure metrics.
Upstream API failures have no retry logic — A single transient HTTP error (429, 500–503, or connection timeout) from the upstream model provider caused an immediate failure. Added one-retry logic with a configurable delay for transient failures; permanent errors (400, 401, 403, 404) still fail immediately.
Technical error messages shown to users — Raw error strings were displayed in the chat UI. Error messages are now mapped to plain-language equivalents (e.g. "The AI service is taking too long to respond. Please try again.").
Agent creates orphaned checkout sessions — Some models called create_checkout for each item instead of using update_checkout with action: "add_item", creating multiple separate carts. Updated the system prompt with explicit cart-management rules, the correct id parameter name, and guidance to search immediately rather than ask clarifying questions, plus a rule against fabricating URLs not present in tool responses.
Playground release 0.5.1
Fixed
Schema validation for MCP tools — MCP servers returning a bare "type": "array" or "type": "object" without items/properties caused some models to reject the tool schema with a 400 error. Tool schemas are now recursively sanitized before being sent upstream, adding missing items and properties as needed.
Playground release 0.5.0
Added
Leaderboard — Model performance comparison: search/cart/checkout rates, average tokens, and average duration per model, ranked by checkout rate.
Playground release 0.4.1
Fixed
Agent outcome tracking — Sessions that reached checkout were incorrectly downgraded to "failed" when the user sent follow-up messages (e.g. "can I pay here?"). Outcome and completion rate are now calculated from accumulated steps across the entire session, not just the latest message.
REST merchant step detection — Sessions against non-Shopify merchants (REST APIs with tools like list_products, create_checkout, complete_checkout) were not recognized as progressing through the shopping funnel. All steps are now tracked correctly regardless of merchant type.
REST merchant cart data extraction — Cart value, currency, and item count were not captured for REST merchants that return prices in cents. Both Shopify (dollars) and REST (cents) response formats are now handled.
Agent system prompt — Removed hardcoded Shopify tool references from the default prompt so it works correctly with any merchant's tool schema.
Router mode checkout detection — Sessions using the UCP router (add-to-cart tool) were never marked as checkout_reached because checkout-URL detection only looked for checkout_url/checkoutUrl strings, but the router returns Checkout Link in markdown.
Router mode cart data extraction — Cart value, currency, and item count were not captured from the router's markdown-formatted tool results. Both JSON and markdown response formats are now handled.
Ghost product cards in chat UI — Non-product tool results (e.g. add-to-cart returning "Cart Updated") were rendered as product cards with broken image placeholders. Product card extraction now requires a Product ID in the markdown section.
Playground release 0.4.0
Added
REST API support in Playground — Browse and buy from REST-based merchants alongside MCP:
Automatic REST endpoint detection from UCP manifest services
Product catalog grid with search, variant selection, and quantity controls
Full checkout flow: cart → shipping → order confirmation
Discount code support with real-time price recalculation
Shipping rate selection with simulated delivery dates
REST debug log panel for inspecting API requests and responses
REST Proxy — A server-side proxy for secure cross-origin REST calls.
Changed
Playground and Agent pages made mobile-friendly with responsive layouts
Navigation buttons use icons with labels hidden on tablet/mobile breakpoints
Info sidebar sections default to collapsed
Agent connect form restructured to match Playground
Empty states standardized across Playground and Agent
Model selector hidden in the Agent sidebar once a chat session starts
Playground release 0.3.0
Added
User Accounts — Sign in with Google, GitHub, or magic-link email:
Google & GitHub OAuth (popup-based flow)
Passwordless magic-link email login with signed, expiring URLs
The same email across providers links to a single account
Agent Benchmark — AI models shop autonomously from search to checkout:
Multi-model support (GPT-4o, Claude, Gemini, etc.)
Autonomous multi-turn MCP tool calling with configurable turn limits
Step tracking: search, product details, add to cart, checkout
Token usage, duration, and outcome recording per session
Leaderboard — Compare model performance across real stores:
Checkout rate, cart rate, and search rate per model
Average token usage and duration stats
Changed
Privacy Policy and Terms of Service updated for user accounts and multi-provider auth
Playground release 0.2.0
Added
Store Audit Engine — Automated UCP implementation quality assessment:
MCP Tool Call Logging — Tool calls are logged with content analysis.
OAuth2 Authorization Code Flow — Config-driven multi-provider OAuth with PKCE and session-bound tokens, plus a mock OAuth provider for local development.
Flower Shop REST API — A full RESTful checkout flow (/ucp-merchant/*) with products, checkout sessions, orders, and shipping simulation, and a UCP v2026-01-23 manifest at /.well-known/ucp.