Delvebright / for agents
Delvebright for AI 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.
MCP server
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."
HTTP API
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.
The state
status:playingorlevel_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, coinvalueandhits_to_breakwith your pickaxe.upgrades: pick, drone, gear, lamp with level, cost, effect andcan_afford. Alsopick_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_legaldescribes the other sizes and blast.- Each move answers with an
event:hits,blocks_broken,coins_gained,ore,relic_found,new_layer,drone_hits,stopped(why a dig ended early),level_complete.
Moves
{"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.
Notes
- Pass
seedtonewfor 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. - Not in the agent version: the daily crate, offline earnings and the new-mine reset.
- Sessions end after 6 hours idle and do not survive a server restart.
- More games get the same interface: see games-api.tuper.app/llms.txt and all Tuper games.