Pyrogenesis Fair Player MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PYROGENESIS_EXE | No | Path to the 0 A.D. game executable when the game is installed in a non-default location. By default the installed game is auto-discovered. | |
| PYROGENESIS_ENET_DLL | No | Path to enet.dll when it is located in a non-default location. By default enet.dll is auto-discovered. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
Control one ordinary 0 A.D. 0.28.0 player. Start a local game or join a LAN host, poll player_status until ready, then observe_player. Observations contain only your own entities and economy, including structured unit properties (capabilities, cargo, current target, combat, special roles, garrison and packing state), building properties and your live scoreboard. Use describe_options for native names, descriptions, costs and rules of your own templates/options. Use order_units for queued target/position/build tasks, abandon_targets to clear orders, set_rally_point/clear_rally_point for future trained units' default tasks (read properties.rally_point), and set_unit_stance for chase/flee preferences. Use train_units and research_technology with the advertised options of completed owned buildings; cancel_production removes a current queue item. Use set_unit_packing, cancel_unit_packing, unload_garrison and leave_turret for siege and transport control. Use observe_map_region for LOS-filtered terrain and visible objects, including last-seen static snapshots under fog. Choose movable owned IDs for move_units or stop_units. Use analyze_terrain_region for compact row-major height, slope and approximate footprint-flatness arrays; these are sampled suitability hints, never native placement validation. Coordinates are world x/z; exploration by moving into black terrain is a normal action. There is no raw packet, opponent state, arbitrary command or scripting tool. The official engine supplies deterministic simulation through a Python ENet relay.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| start_local_gameA | Launch a local test match. Network mode runs host + Python ENet relay + a controlled player. With networked=false, run one engine against a sandbox AI. Startup is asynchronous; poll player_status until ready; use its actual player ID assigned by the host. One controlled game may run at a time. |
| join_lan_gameA | Join an unpassworded 0.28.0 LAN room through Python ENet. Host must start the match. nickname is the visible in-room player name; give each model a distinct nickname. player_name remains a compatible alias. Omit both for "MCP Player". If both are supplied they must be identical; conflicting aliases fail before joining. Names must contain 1..32 Unicode characters, include a non-whitespace character and contain no control, surrogate or formatting characters. XMPP lobby discovery/authentication is outside this direct LAN connector. |
| player_statusA | Get readiness, connection state, controlled player ID and authoritative match outcome. |
| observe_playerA | Observe your own units, resources and population in the active player's normal view. Owned entities include versioned properties: capabilities, carried resources/trade goods, a sanitized current target, attacks/bonuses/healing, special roles, garrison and packing. Includes your authoritative outcome (active, won, defeated, or unknown) and whether all player slots have reached a terminal state. Also includes your scoreboard: phase, gatherers, idle units, territory, population, resources, research, construction and busy building queues. Building profiles include production, loyalty, placement rules, auras, garrison and arrows. Hidden opponents are never returned. |
| describe_optionsA | Read native names, descriptions, costs and rules advertised by an owned entity. kind=self describes its current template; other kinds describe advertised research, training or construction options. Omit ids for the first bounded page, or select up to 16 advertised IDs. Research pairs keep separate IDs, effects and pair links even when names match. Descriptions use the game's current language. No arbitrary template lookup. |
| observe_map_regionA | Sample a world x/z rectangle through the controlled player's exploration and LOS. Cell size 4..256, at most 4096 center samples and 2000 objects. Unknown terrain is null. Visible objects include other players, Gaia resources, trees, buildings and treasures. Fog contains only previously observed static snapshots with last_seen game milliseconds; explored terrain never sampled while visible remains null. Mobile units are visible-only. Unit/building properties are public profiles; cargo, orders and garrison occupants are omitted. Sample visibility applies at the center, not every point in its cell. No texture/passability data. |
| analyze_terrain_regionB | Analyze visible or previously observed terrain as compact row-major numeric arrays. Returns height, slope and approximate building-footprint elevation statistics. Only player-view terrain is used; unknown samples remain null. A favorable score does not guarantee a legal building location: placement rules, obstructions and native checks are still authoritative. |
| move_unitsA | Order currently owned movable units to world coordinates. Revalidates ownership in game. Accepted means the official command queue received the order; it does not guarantee arrival. |
| stop_unitsC | Stop your currently owned movable units with an ordinary network command. |
| order_unitsA | Issue 1..100 tasks in order; queued=false replaces prior tasks, true appends. Target tasks: attack (damage, no capture), capture, gather, repair (also foundations), garrison, occupy_turret, heal, guard, collect_treasure, return_resource and trade. Support and trade targets must be your own; treasure must be visible Gaia. Position tasks patrol and attack_move use world x/z. Build tasks use an allowed structure template plus world x/z and optional angle in radians. Every task is validated before any command is posted. Native placement, costs, diplomacy and pathing still apply. Accepted means submitted; observe later to verify the outcome. No formations are created. |
| set_rally_pointA | Set 1..100 rally tasks on 1..200 completed owned entities with a rally point. Positions: move, attack_move, patrol with x/z. Targets: gather, repair (including foundations), garrison, occupy_turret, attack (damage), capture, trade, collect_treasure. Support/trade targets must be owned; other targets must be currently visible. queued=false replaces, true appends (total at most 100). No existing unit is redirected. Units use the current rally queue at birth, not at training enqueue time; incompatible unit capabilities, target loss, capacity and native AI may change the outcome. Some holders also use rally points when unloading. Read properties.rally_point and observe newborn units to verify. No raw commands or formations. |
| clear_rally_pointB | Clear owned rally queues. Already born/unloaded units keep their current tasks. |
| abandon_targetsB | Remove guard bindings, stop your units and clear their current and queued tasks. This preserves stance and native autonomous reactions; it does not disable UnitAI. |
| set_unit_stanceA | Set violent, aggressive, defensive, passive, standground or skittish. violent chases beyond unit vision; aggressive chases within vision; defensive stays near its position; standground never pursues; passive flees when attacked; skittish flees on sight. |
| set_unit_packingA | Fold siege units for transport (packed=true) or deploy them (false). All selected units must support packing, be stable and differ from the desired state. This submits the native pack/unpack order; observe packing.state to confirm completion. |
| cancel_unit_packingA | Cancel an active folding or deployment transition of each selected owned siege unit. |
| unload_garrisonA | Unload your occupants from your building, ship or mobile garrison holder. Omit entity_ids to select all of your currently observed occupants; allied occupants are excluded. Native ejection/pathing restrictions still apply. Observe to confirm. |
| leave_turretA | Order your ejectable occupants to leave turret positions using the native command. Garrison occupants use unload_garrison instead. The game revalidates actual turret occupancy and ejection permissions; fixed non-ejectable turret occupants are refused. |
| delete_own_unitsB | Permanently kill selected currently owned Unit objects using the normal delete command. The engine may refuse protected entities. This is destructive; observe later to verify. |
| delete_own_buildingsB | Permanently demolish selected currently owned Structure objects, including foundations. Normal engine restrictions and foundation refunds apply. Observe later to verify. |
| train_unitsA | Queue 1..100 units advertised by your completed building's training properties. Revalidates ownership and available training options in game. Native technology, resource, population and entity limits apply; observe the queue and spawned units. |
| research_technologyB | Queue one technology advertised by your completed building's research properties. Checks your current technology requirements before submission. For phase changes, build prerequisites first, then observe current_research and the resulting phase. |
| cancel_productionA | Cancel a current training/research queue item in your completed building. Use the production.queue item's id from observe_player. Normal engine refunds apply; a training batch is removed as a whole. Observe again if the queue changed meanwhile. |
| close_gameA | Close only the engine processes and ENet relay created by this MCP 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 24 tools
Most tools target clearly distinct actions or entity types (move/order, train/research/cancel, observe/analyze, unload/leave_turret). A few pairs are close enough to cause hesitation, notably set_unit_packing vs cancel_unit_packing, stop_units vs abandon_targets, and move_units vs order_units, though descriptions mostly disambiguate them.
The surface is uniformly snake_case and overwhelmingly verb_noun (train_units, set_rally_point, delete_own_units). The only real outlier is the noun-only player_status, plus some verbose modifier forms like join_lan_game and cancel_unit_packing, but the pattern remains readable and predictable.
24 tools is on the heavy side for an MCP surface and sits at the upper boundary of the recommended range. The granular RTS control domain justifies many of them, but some could plausibly be consolidated (delete_own_units/buildings, clear_rally_point vs set_rally_point), making the set feel slightly over-fragmented.
The surface covers match lifecycle (start/join/status/close), observation, production, movement/orders, rally points, stance/packing, garrison/turret handling, and deletion. Minor gaps remain around multiplayer interaction such as diplomacy/alliance and chat, and no explicit pause/resign operation, but core gameplay control is well covered.