T/FTalk Fast

How it works

A game that only exists because of WebMCP

TALK FAST is an asymmetric co-op game in the spirit of Keep Talking and Nobody Explodes — except the second player is your AI agent, and the channel between the two players is the WebMCP tool surface. The human operator sees the console and presses every control. The agent reader is asked not to look at the screen: everything it is supposed to know arrives through document.modelContext tools this page registers. That blindness is a designed role boundary, not a technical security boundary — an agent with page access could still peek, and the replay transcript is how you tell whether it did.

Why this is a strong fit for WebMCP

  • The tools are the game design. The reader tools deliberately return procedures, charts and codebooks but never the visual answer. An agent scraping the DOM or screenshotting would be cheating; an agent using the tools is playing. The page cannot prevent the former — it makes the latter the obvious, well-typed path.
  • Tools appear and disappear with the mission. Each act registers its own scoped tools with an AbortSignaland unregisters them when the act ends — a real, non-trivial use of the spec's lifecycle rather than a static tool list.
  • Humans keep the consequential actions.Every press is the operator's. The reader has exactly one physical action (arming the second key), and the only destructive tool (reader_open_sealed_override) is marked consequentialHint and requires explicit confirmation.
  • It runs where judges are. Open it in a WebMCP-enabled in-app browser or Chrome with #enable-webmcp-testing: the same page, no extension, no backend agent — the browser's agent is player two.

What people and agents can do together that they couldn't before

Most agent demos make the agent do the task for you. TALK FAST makes a task that neither party can do alone: the operator has eyes and hands but no knowledge; the agent has knowledge but no eyes and no hands. Winning requires a fast, precise, two-way conversation — the human learns to describe, the agent learns to instruct. Every run also produces a signed, replayable record of that conversation. Game actions and scores are replay-validated by the server. Agent identity, native-mode status, and the client-captured interaction record remain self-reported, so this is an Operations Log rather than a benchmark or cheat-proof ranking.

The tool surface

toolkindpurpose
talkfast_briefingread-onlyRules, protocol, manual index and the current tool list — the agent's first call.
talkfast_statusread-onlyClock, strikes, score, non-visual act state, operator channel. Never contains visual answers.
manual_read_pageread-onlyOne page of the current act's manual (procedures, charts, codebooks).
manual_searchread-onlyFull-text search across the manual pages of the current act.
manual_lookup_glyphread-only · actResolve an operator's description of an unnamed mark into the manual's glyph id.
chart_query_cellread-only · actQuery the sector chart while the operator flies blind through Dead Reckoning.
reader_wait_for_operatorread-only · cancellableBlocks until the operator types in the on-screen channel; honours the spec's AbortSignal.
reader_saywritePut one decisive line on the operator's teleprompter.
reader_arm_keywrite · actThe reader's single physical action: arm the second key in Two-Key Turn.
reader_open_sealed_overrideconsequentialReveal the act's solution once per run at a real cost. Requires confirm=true.
talkfast_start_runconsequentialStart a campaign / daily / single run from the lobby.
reader_sign_logbookconsequentialAdd the finished run to the public Operations Log with a self-reported model name.
talkfast_operations_logread-onlyRecent operations with replay-validated scores and explicit provenance caveats.
set_operator_callsigndeclarative formHTML form annotated with toolname / tooldescription / toolparamdescription.
operator_describe_screendeclarative formThe operator channel input, exposed declaratively as well.

Implementation notes

  • src/lib/webmcp.ts wraps document.modelContext.registerTool(tool, { signal }), mirrors every tool into a local registry (so the in-page simulator and browsers without WebMCP run identical code), instruments each execution for the scorecard, and listens for toolchange, toolactivated and toolcanceled.
  • The in-page console dispatches through the browser's own getTools() / executeTool() when available, so what you test is what the agent gets — including cancellation via AbortSignal.
  • Acts are pure reducers (src/game/acts/*) with a seeded RNG, so a daily seed gives everyone the same puzzle and every run is reproducible.
  • A run opens a server session (/api/sessions); on submission /api/runs replays the logged inputs with the same pure engine (src/game/engine.ts) and stores the score it computes — never the client's. Runs live in PostgreSQL (Drizzle ORM) with a client-captured interaction record; /api/leaderboard remains as a backward-compatible URL for the chronological Operations Log.
  • Two declarative tools use the HTML form annotations (toolname, tooldescription, toolparamdescription) alongside the imperative API.

Try it

  1. Chrome 149+: enable chrome://flags/#enable-webmcp-testing, relaunch. Or open in a WebMCP-enabled in-app browser.
  2. Go to the operator station; the Reader link dot turns green.
  3. Copy the reader prompt to your agent, choose a run, and describe what you see.