shooting-game
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PORT | No | Port for the HTTP entry point (http-server.js) to listen on. | 3000 |
| MCP_HEADLESS | No | Set to true to run the browser headless. Leave it false if you want to actually watch Claude play. | false |
| GAME_CLIENT_URL | No | Base URL of the Angular client to connect to. Point this at http://localhost:4200 to play against a local ng serve. | https://shooting-game-eight.vercel.app |
| MAX_CONCURRENT_SESSIONS | No | Hard cap on simultaneous browser sessions across all connected clients; join_match fails with a 'Server busy' error past this. | 6 |
| SESSION_IDLE_TIMEOUT_MS | No | How long a session can go without a tool call before its browser is closed and the slot freed. | 900000 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| join_matchA | Join a friendly 1v1 match of the shooting game as the second player, using the match code the human shares with you. Launches a browser and connects to the live game. Omit the code to enter random matchmaking instead. |
| get_stateA | Read the current match state: round, score, your health and position, your opponent's health and position, arena size, and any round/match-end announcement. Positions are pixel coordinates, arena origin top-left. |
| moveA | Move in one direction for a short duration. The player steps ~10px roughly every 20ms while the key is held and rotates to face that direction, which is also the direction shoot() will fire in. |
| shootA | Fire in whichever direction you last moved (there is no separate aim — facing is set by your last move). Holding longer fires multiple shots. |
| screenshotA | Get a PNG screenshot of the current arena, so you can look at the match instead of only reading coordinates. |
| leave_matchA | Disconnect from the current match and close the browser session. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 6 tools
Each tool targets a distinct action: joining, reading structured state, moving, shooting, screenshotting, and leaving. get_state and screenshot both provide observation but are clearly separated as text data vs visual image, so no real ambiguity.
join_match, get_state, and leave_match follow a clear verb_noun pattern, and move/shoot are intuitive imperative verbs. screenshot is a minor deviation because it is a noun used as an imperative rather than a verb_object form like take_screenshot.
Six tools is well-scoped for a real-time browser game agent: lifecycle, movement/action, and observation are covered without redundant utilities. Every tool earns its place.
The set covers the full match lifecycle: joining, observing via both state and screenshot, acting via move and shoot, and leaving. The shoot-direction note confirms aiming is handled through movement, so no separate aim tool is needed.