WebMCP Demo Store
Reference WebMCP store: the same 150-product catalog exposed to AI agents via MCP tool calls instead of DOM scraping - benchmark-verified 79% fewer action bytes, 42% fewer input tokens, 8/8 tasks correct.
Documentation
WebMCP Demo Store — one-file server, two modes, one benchmark
Same store, same tools, two delivery modes:
- WebMCP mode — the page exposes its catalog through MCP tool calls (MCP-over-HTTP
/mcp, plus Chrome-nativedocument.modelContext), so an agent reads only what the task needs. - Plain mode — the same store as an ordinary website; the agent parses full HTML pages, as every agent must today.
Benchmark (150-product catalog, identical tasks): 79% less action bytes, 42% fewer input tokens, 8/8 tasks correct in both modes. DOM mode wins on small catalogs then collapses; WebMCP wins with age. Crossover report: report.html → WebMCP_Comparison_Report.pdf.
Run it
python3 server.py # plain mode → http://localhost:9501
MCP=1 PORT=9502 python3 server.py # WebMCP mode → http://localhost:9502 + /mcp
stdlib-only (http.server, json, uuid, threading) — no pip install, no dependencies.
Live demos
- plain: https://demonomcp.converso.work
- WebMCP: https://demowithmcp.converso.work (
.well-known/mcpdiscovery,/mcpendpoint) - launch package (deck, whitepaper, reports): https://demowithmcp.converso.work/launch.html
Chrome-native WebMCP test (13 Oct 2026)
Chrome 154 + --enable-features=WebMCP exposes document.modelContext on HTTPS origins (about:blank excluded).
- Registered the 5-tool store contract via the IMPERATIVE API (
registerTool): search_products, add_to_cart, get_cart, checkout (server-backed; all fetches in-page). - Standard client flow verified:
getTools()discovery →executeTool()calls → orders 1017/1018 placed, T2/T4/T8 picks correct (HP Pavilion 14, Razer DeathAdder, OnePlus 12R). - 154 build quirks found & worked around:
executeTool(tool, args)requires args as a JSON string (object form throws "Failed to parse input arguments"); return values are JSON strings too — JSON.parse both sides.- Tools can't be re-registered under the same name (InvalidStateError) — reload the page to reset.
- Flag/feature name:
--enable-features=WebMCPworks headless; docs'chrome://flags/#enable-webmcp-testingis the manual path. Note: API isdocument.modelContext(moved from navigator since July 2026 build).
- Takeaway: the demo's tool contract is compatible with Chrome's native WebMCP, not just our JSON-RPC shim. When Chrome ships the client agent (Gemini-in-Chrome), the store is already agent-ready.
Repo layout
| path | what |
|---|---|
server.py | the whole thing: store + cart + orders + MCP transport (MCP=1) + static/report serving |
catalog.json / catalog_10.json | 150-product / 10-product demo catalogs |
compare.py, compare_llm.py, browser_llm.py | benchmark harnesses (DOM-mode agent, LLM-token accounting, browser-native flow) |
make_report.py | regenerates the HTML/PDF reports from results.json / agg_150_vs_30.json |
whitepaper.html, report*.html, *.pdf, chart_*.png | strategy + evidence artifacts (launch deck included) |
weekly_recap.py | counters + live-URL digest (used by the ops cron) |
License
MIT.