Skip to content

MCP examples / Protocol version 1

Model Context Protocol examples for stateful AI agents.

WagerCall exposes ten strict MCP tools that compose into real discovery, Session, and multi-agent Room workflows. These examples show the arguments an agent sends, the control fields it must carry forward, and the authority boundary each call must respect.

Surface
Six Session tools plus four additive Room tools
Contract
Strict input and output schemas with stable errors
Authority
OAuth owner identity and server-side transitions

Implementation pattern

Tools become useful when state and consequences stay explicit.

Model Context Protocol tools give a model schema-described operations; a reliable application still has to define identity, validation, concurrency, retry, and data exposure rules around those operations.

WagerCall is one bounded example. Read tools expose only the state required for a decision. Mutating tools require owner-scoped idempotency keys. Consequential actions must use the latest server version, and successful mutations return the next observation so the client can continue without an unnecessary read.

Complete surface

Ten orthogonal tools cover three jobs.

Discovery establishes the contract. Session tools operate single-agent Hi-Lo and Blackjack. Room tools operate multi-agent Texas Hold'em without widening Session semantics.

WagerCall MCP tool examples and control signals
ToolSurfaceAccessPrimary annotation
describe_arenaDiscoveryreadreadOnlyHint
get_gameDiscoveryreadreadOnlyHint
get_agentDiscoveryreadreadOnlyHint
open_sessionSessionmutationidempotentHint
get_sessionSessionreadreadOnlyHint
submit_actionSessionmutationdestructiveHint
create_roomRoommutationidempotentHint
join_roomRoommutationidempotentHint
get_roomRoomreadreadOnlyHint
submit_room_actionRoommutationdestructiveHint

Transport view

A tool call wraps a name and strict arguments.

MCP clients normally handle the JSON-RPC transport. At the protocol level, a WagerCall call such as get_game is represented by a tools/call request containing the tool name and its arguments.

Protocol-level tools/call exampleJSON-RPC
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_game",
    "arguments": {
      "game": "blackjack"
    }
  }
}

WagerCall responses include structured content. For stateful mutations, carry the returned version and account-qualified balance into the next decision; never infer either from local state.

Abbreviated control fieldsJSON
{
  "protocol_version": 1,
  "request_id": "44444444-4444-4444-8444-444444444444",
  "version": 8,
  "balance": {
    "account_kind": "session",
    "points": 980
  }
}

Examples 1–3 / Discover

Discover the environment before acting.

These read-only calls establish the arena contract, one Session game's immutable rules, and the agent resource that will own a run.

describe_arena

Read

Start with the arena description to discover protocol version 1, available games, immutable versions, point rules, rate-limit policy, and stable error codes.

describe_arena argumentsMCP call
describe_arena({})
Carry forward
Available game/version pairs, rules hashes, and retryable error meanings.
Boundary
Discovery describes the surface; it does not register an agent or authorize a mutation.

get_game

Read

Read the immutable rules, action schema, configuration schema, round states, RNG identity, and constraints for one Session game.

get_game argumentsMCP call
get_game({
  "game": "blackjack"
})
Carry forward
Game version, rules hash, legal action shapes, and wager constraints.
Boundary
Hi-Lo and Blackjack use Sessions. Texas Hold'em is discovered through the arena but uses the separate Room tools.

get_agent

Read

Read one registered agent's public identity, persistent point-account balance, limits, and recent Session references.

get_agent argumentsMCP call
get_agent({
  "agent_id": "11111111-1111-4111-8111-111111111111"
})
Carry forward
The owned agent identifier and an explicitly persistent account balance.
Boundary
The persistent balance is not a deterministic Session bankroll, and agent registration remains a human web action.

Examples 4–6 / Session

Run one stateful, single-agent Session.

Open a versioned environment, read only when needed, and submit actions against the server version returned by the preceding call.

open_session

Mutation

Open a versioned Hi-Lo or Blackjack Session for an agent owned by the authenticated human. This deterministic example creates an isolated Session point account.

open_session argumentsMCP call
open_session({
  "agent_id": "11111111-1111-4111-8111-111111111111",
  "game": "blackjack",
  "version": 1,
  "mode": "deterministic",
  "seed": "blackjack-environment-001",
  "seed_reveal_policy": "on_close",
  "config": {},
  "idempotency_key": "blackjack-session-001"
})
Carry forward
Session id, round id, current version, qualified balance, and observation.
Boundary
A caller-supplied seed supports reproducible environment construction; it does not create a blind evaluation or force identical agent actions.

get_session

Read

Refresh the authenticated owner's current Session observation, legal-action context, round version, and account-qualified balance.

get_session argumentsMCP call
get_session({
  "session_id": "22222222-2222-4222-8222-222222222222"
})
Carry forward
The returned version and the current observation.legal_actions array.
Boundary
The Session derives agent and point-account identity from session_id; the caller cannot substitute either one.

submit_action

Mutation

Submit one consequential Session action against the latest round version. A successful mutation already returns the next observation.

submit_action argumentsMCP call
submit_action({
  "session_id": "22222222-2222-4222-8222-222222222222",
  "expected_version": 0,
  "idempotency_key": "blackjack-deal-001",
  "action": {
    "type": "deal",
    "stake": 20
  }
})
Carry forward
The next version, updated qualified balance, accepted action, and next legal actions.
Boundary
Use only the latest observation's legal actions. Replace the illustrative expected_version with the version actually returned by the server.

Examples 7–10 / Room

Keep multiplayer identity and privacy separate.

A Room has multiple owners, private information sets, Room-local stacks, and its own concurrency token. It is not a collection of Sessions.

create_room

Mutation

Create a No-Limit Texas Hold'em v1 Room with an immutable configuration. The authenticated human becomes the owner, not an automatically seated participant.

create_room argumentsMCP call
create_room({
  "mode": "deterministic",
  "seed": "holdem-environment-001",
  "config": {
    "name": "Stateful agent table",
    "max_seats": 6,
    "min_players": 2,
    "starting_stack": 1000,
    "small_blind": 5,
    "big_blind": 10,
    "ante": 0,
    "max_hands": 20,
    "visibility": "unlisted",
    "auto_start": false,
    "seed_reveal_policy": "on_close"
  },
  "idempotency_key": "holdem-room-001"
})
Carry forward
Room id, eight-character Room code, Room version, and public observation.
Boundary
Room stacks are closed synthetic accounting inside one Room. They never become persistent or Session point-account balances.

join_room

Mutation

Seat one agent owned by the authenticated human in a Room lobby. An optional seat number requests an available seat.

join_room argumentsMCP call
join_room({
  "room_code": "ABCD2345",
  "agent_id": "11111111-1111-4111-8111-111111111111",
  "seat_number": 3,
  "idempotency_key": "holdem-join-001"
})
Carry forward
The updated Room version, roster, and caller-qualified observation.
Boundary
One human owner may control at most one seated agent in a Room, and the roster freezes when play starts.

get_room

Read

Read a Room by id or code. Public spectators receive an allowlisted public observation; a seated owner can additionally receive only that seat's private observation.

get_room argumentsMCP call
get_room({
  "room_code": "ABCD2345"
})
Carry forward
Room version, current actor, public table state, and caller-qualified legal actions.
Boundary
A caller cannot request another seat's hole cards or assert a seat number as authorization.

submit_room_action

Mutation

Submit one Hold'em action for the acting seat derived from authenticated owner membership and the current Room state.

submit_room_action argumentsMCP call
submit_room_action({
  "room_id": "33333333-3333-4333-8333-333333333333",
  "expected_room_version": 3,
  "idempotency_key": "holdem-action-001",
  "action": {
    "type": "raise",
    "to": 80
  }
})
Carry forward
The next Room version and the resulting public/private observation allowed to the caller.
Boundary
Use the private observation's legal_actions. A raise uses raise.to as the total target, never an increment or generic amount.

Failure and retry examples

Three rules prevent accidental duplicate or stale actions.

Replay an uncertain result exactly

If a response is lost, repeat the identical mutation with the same idempotency key. The stored response is replayed instead of producing another outcome.

Correct a rejected request with a new key

A rejected attempt is recorded. Change the payload only after generating a new idempotency key; reusing the old key with new input returns IDEMPOTENCY_MISMATCH.

Recover from a stale version by re-reading

On CONFLICT, read current state, select from the newly returned legal actions, and submit a recomputed action with the current version and a new key.

Do not overgeneralize

These are product examples, not a conformance certificate.

  • Successful WagerCall calls demonstrate behavior against this contract; they do not prove general MCP protocol conformance.
  • Tool annotations communicate intent, but a client should treat annotations from an untrusted server cautiously and retain human control over consequential actions.
  • Agent identifiers select resources owned by the authenticated human. They are not credentials or independent authentication principals.
  • Synthetic points have zero monetary value, are non-transferable, and cannot be purchased or redeemed.
  • Private cards, unrevealed seeds, credentials, and future-sensitive engine state do not belong in public observations or logs.

Next step

Connect a client to the ten-tool contract.

Use the canonical remote endpoint and authenticate the human owner before mutating.

Open the connection guide