Inspiration
Most game agents play in a separate simulation or need broad control of the page. We wanted the opposite: keep a warm family-game experience while giving a browser agent the same constrained actions as a human player. The agent should understand the position, act legally, preserve hidden information, and then quietly wait for the person to play.
What it does
Tablée is a mobile-first PWA with 21 tabletop and puzzle games. A player can ask Codex or ChatGPT to play an entire match. The agent reads the public board and its positionId, chooses a legal action, plays it, then calls wait_for_position_change. That pending read wakes as soon as the human moves, so play continues without another prompt.
How we built it
The shared tablee-webmcp.js bridge uses document.modelContext.registerTool. A route catalogue attaches one bounded adapter per game. Every mutation includes expectedPositionId; mutations are serialized and legality is checked again at execution time. Closed JSON schemas and stable error codes make the tools predictable.
For hidden-information games, the bridge first builds a seat-filtered public projection and only then calculates the position identifier. Secret words, mines, puzzle solutions, codes, other hands, hidden fleets, and draw order never enter tool responses. Multiplayer guests only accept authoritative state from the host.
Challenges
The hardest part was defining truthful public state across very different games. A 2048 action is one direction; Checkers may require a full capture path; Yams spans several phases. We also had to prevent stale concurrent actions and make continuous human-agent play efficient.
Accomplishments
- One lifecycle-safe WebMCP bridge across 21 games
- Efficient long-poll waiting for human moves
- Hidden-information boundaries covered by automated tests
- Stale-position and concurrent-mutation protection
- Multiplayer host authority and per-seat projections
- Graceful fallback when WebMCP is unavailable
What we learned
The best agent interface is not a mirror of the DOM. It is a small domain API with stable vocabulary, bounded schemas, and an explicit concurrency model. For shared play, wait is as important as act.
Challenge scope
Tablée existed before the challenge. The public repository contains an explicit non-WebMCP baseline commit followed by the challenge-period WebMCP extension. Only that extension is submitted for judging.
What's next
A visible agent-connected indicator, cooperative modes, accessibility narration, server-verified multiplayer acknowledgements, and explainable replay traces.
Built With
- artificial
- html5
- javascript
- node.js
- progressive
- web
Log in or sign up for Devpost to join the conversation.