Two-player tic-tac-toe that renders as an interactive MCP App inside your AI chat client.
12 tools with clear verb-noun naming (join_game, make_move, set_name, etc.) and consistent parameter schemas. Descriptions are present but brief (avg ~80 chars, below the 194-char baseline). All tools have input schemas with type definitions and parameter descriptions. However, output schemas are not documented, LLMs cannot predict response structure. No error handling guidance, no recovery hints, and no distinction between retryable vs fatal errors. Security model unclear: playerId is passed as a parameter rather than server-injected, risking exposure in logs. Tool composition is sound (single responsibility), but descriptions lack WHEN/WHY context that LLMs need for selection.
Accept a pending invite and start the game.
Withdraw an invite you sent.
End this player session for good; the widget stops working until the game is opened again.
Decline a pending invite.
Return the current view for the player (used for polling).
Invite another player in the lobby to a game.
Open the tic-tac-toe lobby inside the chat. The user can invite another player or play against you, the assistant.
Output schemas not documented. LLMs cannot predict response structure (PlayerView, JoinResult). Responses must include all fields needed for downstream tool calls (playerId, board state, game status).
Descriptions lack WHEN/WHY context. 'Register a display name' does not explain when to call set_name vs other tools, or what happens if called twice. Descriptions should be 50 - 200 chars and answer: What? When? Why?
No error handling guidance. Tools do not document what errors are retryable, user-fixable, or fatal. E.g., if invite fails (user offline, already in game), LLM has no recovery path.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
Leave the current game and return to the lobby.
Place your mark on a board cell (0-8, left to right, top to bottom).
Play your move in a tic-tac-toe match against the user. Only call this when the game widget asks you to, and use the playerId from the widget's message, not the one returned by join_game. Cells are 0-8, left to right, top to bottom.
Start a match against the assistant hosting the widget.
Register a display name for the current player.
playerId passed as parameter instead of server-injected. Exposes player identity in logs and traces. Should use server-side session context or bearer token.
No confirmation step for irreversible operations (close_session). Agents can accidentally end sessions without recovery path.