{"ok":true,"site":{"host":"agentperf-demo.vercel.app","url":"https://agentperf-demo.vercel.app/catalog","type":"live","desc":"A 72-product store that publishes its own WebMCP tools — the heavy-page target in the AgentPerf benchmark, where DOM driving costs 13.8x the tokens.","tools":[{"name":"get_page_state","kind":"answer","impl":"imperative","description":"Read a live snapshot of this page's application state, as compact JSON. Call this before acting so you work from what the page actually shows, not from a guess. Long values are pruned to stay small; a trailing '… +N more' marker means an array was elided.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/catalog","pages":["/catalog","/","/demo/"]},{"name":"search_products","kind":"act","impl":"imperative","description":"Filter the catalogue and show the result on the page. Each call states the whole filter: arguments you leave out are cleared, not kept from the last call. query matches name, brand, category, tags and description and every term must match, so 'wireless keyboard' means both; category narrows to one department; minRating and maxPrice bound the numbers; inStockOnly drops sold-out products; sortBy orders the result (price ascending, rating descending, name A-Z, default price). Returns up to 20 rows plus the total match count — narrow the filters if there are more.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"query":{"type":"string"},"category":{"type":"string","enum":["keyboards","mice","monitors","headsets","webcams","docks"]},"minRating":{"type":"number","minimum":0,"maximum":5},"inStockOnly":{"type":"boolean"},"maxPrice":{"type":"number","exclusiveMinimum":0},"sortBy":{"type":"string","enum":["price","rating","name"]}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/catalog","pages":["/catalog"]},{"name":"get_product","kind":"act","impl":"imperative","description":"Full record for one product by id — price, rating, review count, stock, tags and description. Opens that card's detail panel on the page so the person sees what you looked at. Product ids come from search_products or get_page_state.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"productId":{"type":"string"}},"required":["productId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/catalog","pages":["/catalog"]},{"name":"add_to_cart","kind":"act","impl":"imperative","description":"Add a product to the cart, or increase the quantity if it is already there. Refused for unknown ids and for sold-out products. Returns the new quantity and cart total.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"productId":{"type":"string"},"quantity":{"default":1,"type":"integer","minimum":1,"maximum":99}},"required":["productId","quantity"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/catalog","pages":["/catalog"]},{"name":"remove_from_cart","kind":"act","impl":"imperative","description":"Take a product out of the cart entirely, whatever its quantity. Only products already in the cart can be removed.","annotations":{"readOnlyHint":false,"destructiveHint":true},"inputSchema":{"type":"object","properties":{"productId":{"type":"string"}},"required":["productId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/catalog","pages":["/catalog"]},{"name":"place_order","kind":"transact","impl":"imperative","description":"Check out everything in the cart under this name and email, and show the confirmation on the page. Returns the order number (NW-XXXXX). Refused when the cart is empty or the email is not a valid address. Placing an order cannot be undone from this page.","annotations":{"readOnlyHint":false,"destructiveHint":true,"consequentialHint":true},"inputSchema":{"type":"object","properties":{"name":{"type":"string","minLength":1},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["name","email"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/catalog","pages":["/catalog"]},{"name":"get_benchmark_results","kind":"answer","impl":"imperative","description":"Full measured results of the DOM-driving vs WebMCP-tools benchmark behind this page's claims, with caveats.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"search_services","kind":"act","impl":"imperative","description":"Filter the service list by a text query (matches names and tags like 'cut', 'color', 'beard'). The page updates so the person sees what you searched. Returns the matches.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"query":{"type":"string","minLength":1}},"required":["query"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/demo/","pages":["/demo/"]},{"name":"list_open_slots","kind":"act","impl":"imperative","description":"List the free slots for one service over the next three days. Slot ids from here are what book_slot accepts. The page navigates to that service so the person follows along.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"serviceId":{"type":"string"}},"required":["serviceId"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/demo/","pages":["/demo/"]},{"name":"book_slot","kind":"transact","impl":"imperative","description":"Book one open slot for one service. Requires the person's name and email. Returns a confirmation code. Refused when the slot is taken, unknown, or belongs to another service.","annotations":{"readOnlyHint":false,"consequentialHint":true},"inputSchema":{"type":"object","properties":{"serviceId":{"type":"string"},"slotId":{"type":"string"},"name":{"type":"string","minLength":1},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["serviceId","slotId","name","email"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/demo/","pages":["/demo/"]},{"name":"cancel_booking","kind":"transact","impl":"imperative","description":"Cancel an existing booking by its confirmation code and free the slot again. Only bookings made on this page can be cancelled.","annotations":{"readOnlyHint":false,"destructiveHint":true,"consequentialHint":true},"inputSchema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/demo/","pages":["/demo/"]}],"category":"Commerce","apiSurface":"spec","toolCount":11}}