A WebMCP-enabled storefront playground demonstrating AI-composed e-commerce layouts. Provides tools for agents to interact with an AMS (AI Merchant System) space that dynamically composes itself around shopper requests.
18 tools with strong naming conventions (verb_noun pattern: send_message, get_products, add_to_cart). Descriptions are detailed and contextual (avg ~180 chars), explaining WHEN and WHY to use each tool. Input schemas present for all tools with proper JSON Schema structure. However, several critical gaps: (1) output schemas are NOT documented, no structured response definitions visible in code; (2) error handling lacks recovery guidance, tools mention timeouts and polling but don't specify error codes or retry strategies; (3) some parameters lack type constraints (e.g., 'signal' in send_signal is free-form string with no enum); (4) destructive operations (clear_session, begin_checkout) lack confirmation patterns. Composition is strong, tools chain well (get_products → add_to_cart → get_cart) and match chat data model (accept product IDs, selections as key-value pairs). Security: no visible credential exposure, but no audit logging or permission gates documented.
Add a product to the cart with specified selections. Settles before it returns and reports what landed: the line it added, the cart quantity, and the new subtotal and total. Quote those rather than composing your own sentence. Never hold a variant ID; address a product plus {axis: value} selections and bind late against live state. Without selections the page picks an available variant, which may not be the size the visitor meant.
Begin the checkout process. Takes the visitor off the page. Only call when they have said they want to buy.
Destroy the layout, the conversation, and the accumulated context. Almost never what you want — the accumulated context is the value. Only call it if the person explicitly asks to start over.
Read the entire cart state. Ground truth for what is in the cart.
Instant and cheap. Return the raw layout tree with products as bare ids. Useful for structure. The only way to tell what was actually featured: a look card carries its own product list, while a bare get_products survey returns the grids and rails alongside it.
Output schemas not documented. No structured response definitions visible for any tool. LLMs cannot plan downstream calls or extract fields without knowing what each tool returns.
send_signal parameter 'signal' is free-form string with no enum constraint. Invites hallucinated signal types. Should enumerate valid signals or document the complete set.
Destructive operations (clear_session, begin_checkout) lack confirmation or dry-run patterns. Agents can trigger irreversible actions without safeguards.
Error handling guidance is incomplete. Tools mention 15-second timeouts and polling behavior but do not specify error codes, retry strategies, or recovery paths for LLMs.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
Instant and cheap. Read the conversation history. Ground truth for which beats have been spoken.
Instant and cheap. Survey the canvas and return a compact record per product (id, title, price, availability, image), or when called with productIds return the full record for those (description, option axes, every variant with exact option values). Ground truth for anything about to be said out loud — never describe a product, price, or availability not read from this tool.
Instant and cheap. Orient and check if a composing turn is still running. Returns isRunning boolean and latestResponse. When an agent-backed tool returns status 'running' at the 15-second timeout, poll this every 2-3 seconds until isRunning is false, then read latestResponse.
Read standing preferences and constraints the visitor has stated about themselves — a size, a fit, a colour, a budget. Returns empty until the brand has absorbed the turn. The brand answers in its own key names, not the ones sent.
List the example shopping intents this page offers, each written the way a shopper actually talks — an occasion, a place, a season, a person. Useful for seeing the shape of request this storefront is built for. You are not limited to these: start_shopping takes any intent.
Instant. Dispatch the same interaction a click would. Prefer the typed tools; reach for send_signal only for a signal type they do not cover.
Remove a product from the cart. Without selections removes every line of that product.
Send a message to the site's AI to compose or refine the storefront layout. Agent-backed tool that returns the AI's response text. Gives up waiting at 15 seconds; when it returns with status 'running', poll get_status until isRunning is false to read the committed reply.
Instant. Dispatch the same interactions a click would. Prefer the typed tools; reach for this only for a signal type they do not cover.
State a standing preference or constraint the visitor has stated about themselves. Does not store one — the brand decides what it recognises and answers in its own key names. Returns empty until the brand has absorbed the turn.
Hand a request to the site's AI to compose and show a collection. Agent-backed tool that returns the AI's response text. Gives up waiting at 15 seconds; when it returns with status 'running', poll get_status until isRunning is false to read the committed reply.
Open the Steve Madden storefront with a shopping intent and let its AI compose a store for it. Pass either an id from list_intents or your own free-text intent — describe the shopper's situation (occasion, place, season, budget, who it is for, what they already own) rather than keywords. This navigates to the storefront, which tears down this page's tools and registers the storefront's own (send_message, get_products, add_to_cart and the rest). The intent is submitted automatically on arrival, so the first layout composes without any further call — it takes 10-20 seconds. After navigating, re-run discovery on the new page, read the AI's reply with get_messages, then refine with send_message. Call this once to enter; every follow-up is a send_message, because an intent on the URL is ignored inside a live session.
Update a cart item to an absolute quantity. Takes an absolute quantity, not a delta.
No audit logging or permission gates documented. Tools that modify state (add_to_cart, clear_session) lack visibility into who called them and with what authority.