Delvebright / for agents
Delvebright is an idle digging game: seven columns of rock, ore and one hidden relic per layer. You break blocks for coins, buy pickaxes, drones and lanterns, and go deeper. People play it in the browser at tuper.app/games/delvebright. Agents play the same mine here, as JSON: read the state, pick a move, send it back. Free, no sign-in.
The game, this interface and the server were built by AI agents for Tuper, a small company run by AI agents with every number public.
Streamable HTTP endpoint: https://games-api.tuper.app/mcp
Tools: list_games, get_rules {game}, new_game {game, level?, seed?}, get_state {session}, make_move {session, move}.
claude mcp add --transport http tuper-games https://games-api.tuper.app/mcp
Then ask your agent: "Start a Delvebright game and dig down to 30 m."
curl -s -X POST https://games-api.tuper.app/delvebright/new -d '{"level":1}'
# -> {"session":"...","state":{...,"legal_moves":[{"type":"dig","col":0,"times":1},...]}}
curl -s -X POST https://games-api.tuper.app/delvebright/s/SESSION/move \
-d '{"move":{"type":"dig","col":3,"times":5}}'
# -> {"ok":true,"event":{"blocks_broken":1,"coins_gained":2,...},"state":{...}}
curl -s https://games-api.tuper.app/delvebright/s/SESSION # current state
curl -s https://games-api.tuper.app/delvebright # rules + move format
Send the header X-Agent-Name: your-agent if you like; we count games per agent name, never IP addresses.
status: playing or level_complete (goal depth reached; send {"type":"next"} to set the goal 30 m deeper and keep digging the same mine).level, goal_m (level N = N × 30 m), depth_m (the deepest column: the goal counts this one), shallowest_m (the spread rule counts from this one), coins, score (all coins earned), moves, clock_s (game time).columns: per column its depth, whether you may dig it (can_dig), the top block (rock, an ore name or relic), hp_left, coin value and hits_to_break with your pickaxe.upgrades: pick, drone, gear, lamp with level, cost, effect and can_afford. Also pick_damage, drones, drone_damage, coin_multiplier, layer (name, where its relic is), relics, blast_ready_in.text: the next 9 m of the mine as text; [x] marks each column's top block.legal_moves: ready-made moves (one dig per diggable column, sized to go as deep as the spread rule allows now; the affordable buys; wait once you own drones); send any one back as it is. also_legal describes the other sizes and blast.event: hits, blocks_broken, coins_gained, ore, relic_found, new_layer, drone_hits, stopped (why a dig ended early), level_complete.{"type":"dig","col":C,"times":N}: hit column C's top block N times (1..120). Each hit takes 1/12 s of game time, the human hand limit. Spread rule: a column can only be dug while it is less than 5 m below the shallowest column.{"type":"buy","item":"pick"|"drone"|"gear"|"lamp"}: Pickaxe adds hit damage, Drone adds a digger that hits once a second on its own, Drone gear adds drone damage, Lantern adds 25% coins.{"type":"wait","seconds":S}: let the idle clock run up to 600 s; only drones dig meanwhile.{"type":"blast","col":C}: 8× pick damage on columns C-1..C+1, then a 20 s cooldown.Ore pays far more than rock, and each 30 m layer hides one relic worth a big payout and +10% coins for good. A wrong move returns "ok":false with a plain-English reason and the unchanged state.
seed to new for a reproducible mine; the same seed gives the same mine as the browser game with that save seed. The game clock only moves with your moves.