{"ok":true,"site":{"host":"playingcardssimulator.vercel.app","url":"https://playingcardssimulator.vercel.app/","type":"live","desc":"Offline card game simulator with agent-driven bots over WebMCP","tools":[{"name":"list_presets","kind":"answer","impl":"imperative","description":"List every catalog preset with its id, display name, and one-line summary. Call only before inventing a custom game — skip when the user already named a catalog preset (e.g. blackjack).","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"create_game","kind":"act","impl":"imperative","description":"Create a new card-game session and reset the table (navigates this tab to /game/<newId>). Call on any already-connected Playing cards simulator source from webmcp_list_sources — home `/` or `/game/...`; deep links are hints that the site is open, not a required URL. Do not webmcp_open_page when a same-origin source exists. Catalog: pass preset (e.g. blackjack, war). Custom: omit preset; pass name and an XState-compatible machine JSON (see skills://card-table/reference.md). The machine owns phases, human controls, bots, and rewards. Session tools (get_game_state, narrate, highlight, await_user_action, coach) are always listed — they error until a session exists. Tutorial: prefer coach, or highlight + narrate + await_user_action (await/coach return state — do not get_game_state after).","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Display name. Required for custom games; optional when preset is set."},"preset":{"type":"string","enum":["texas-holdem","blackjack","war","go-fish","crazy-eights","euchre","gin-rummy","bullshit"],"description":"Optional built-in catalog preset. Omit to invent a custom game."},"botCount":{"type":"number","description":"Number of bot opponents (1-5)"},"jokers":{"type":"boolean","description":"Include 2 jokers in the deck"},"mode":{"type":"string","enum":["tutorial","practice"],"description":"tutorial: teach with coach (or highlight + narrate + await_user_action); never move the human. practice: human clicks machine controls; agent only explains. Machines own bots and settlement."},"turnDirection":{"type":"string","enum":["clockwise","counterclockwise"]},"chips":{"type":"boolean","description":"Enable chip ledger (default true for holdem)"},"startingStack":{"type":"number"},"enabledZones":{"type":"object","properties":{"stock":{"type":"boolean"},"hand":{"type":"boolean"},"play":{"type":"boolean"},"discard":{"type":"boolean"},"capture":{"type":"boolean"}}},"playLayout":{"type":"string","enum":["spread","stack"],"description":"How to present shared play cards. Use stack for one face-down pile, such as Bullshit."},"machine":{"type":"object","description":"XState machine JSON (required for custom games). States, meta.controls, named actions/guards — see skills://card-table/reference.md"},"instructions":{"type":"string","description":"Student-facing how-to for the How to play sidebar. Replace anytime with set_instructions."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"get_game_state","kind":"answer","impl":"imperative","description":"Read compact agent state: seats, chips, pots, legalActions, in-play cards, stockCount, last 3 narration lines. Prefer state returned by create_game / await_user_action / coach. Call only when that payload was lost or you need a refresh without waiting.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"set_instructions","kind":"act","impl":"imperative","description":"Replace the student-facing How to Play sidebar text. Write the game's rules, goal, and what the human should do on their current turn. Call again whenever the game phase or available decisions change.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"text":{"type":"string"}},"required":["text"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"highlight","kind":"act","impl":"imperative","description":"Visually highlight a UI element with a glowing border so the student knows where to look or click. Prefer coach when also awaiting a click. Call with no arguments (or target null) to clear.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Which element to highlight. Use a zone id ('stock', 'hand', 'play', 'discard', 'capture', 'actions', 'pot') or a player id ('human', 'bot_1', …) to highlight that player's entire seat. For zone targets, pair with playerId to scope to a specific seat (e.g. target 'hand' + playerId 'human'). Omit or pass null to clear."},"playerId":{"type":"string","description":"Optional player scope for zone targets — e.g. highlight bot_1's hand rather than the human's. Defaults to human for hand/capture."},"label":{"type":"string","description":"Optional short label shown near the highlighted element (e.g. 'Click here', 'Your hand')."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"narrate","kind":"act","impl":"imperative","description":"Append one short teaching line to the student log. Machine already logs event lines (bet placed, dealt, win) — only add what it did not say (totals, why Hit/Stand). Returns the appended entry only.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"text":{"type":"string"}},"required":["text"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"await_user_action","kind":"act","impl":"imperative","description":"Block until the human clicks a control, then return the click plus compact state. Tutorial-only. Prefer coach when you also need narrate/highlight. Pass expectActionId for a recommended action (matched:false if they clicked something else). Do not call get_game_state after a successful await. Resolves with { timedOut: true } after timeoutMs.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"expectActionId":{"type":"string","description":"Action id to wait for (e.g. 'hit'). Omit to accept the next action of any kind."},"timeoutMs":{"type":"number","description":"Optional max wait in milliseconds. On expiry resolves with { timedOut: true } instead of erroring."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"coach","kind":"act","impl":"imperative","description":"Tutorial one-shot: optional narrate + highlight, then await a human click. Returns the click result plus compact state — do not call get_game_state after. Prefer over separate narrate/highlight/await when teaching one step. With expectActionId, the click cue glows on that action button (defaults target to actions).","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"text":{"type":"string","description":"Optional teaching line (skip if the machine already narrated the event)."},"target":{"type":"string","description":"Which element to highlight. Use a zone id ('stock', 'hand', 'play', 'discard', 'capture', 'actions', 'pot') or a player id ('human', 'bot_1', …) to highlight that player's entire seat. For zone targets, pair with playerId to scope to a specific seat (e.g. target 'hand' + playerId 'human'). Omit or pass null to clear."},"playerId":{"type":"string","description":"Optional player scope for zone targets — e.g. highlight bot_1's hand rather than the human's. Defaults to human for hand/capture."},"label":{"type":"string","description":"Optional short label shown near the highlighted element (e.g. 'Click here', 'Your hand')."},"expectActionId":{"type":"string","description":"Action id to wait for (e.g. 'stand'). Omit to accept any click."},"timeoutMs":{"type":"number","description":"Optional max wait in milliseconds. On expiry resolves with { timedOut: true }."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]}],"category":"Media & Personal","favicon":"/favicons/playingcardssimulator.vercel.app.ico","apiSurface":"spec","toolCount":8}}