Scavenge the /admin MCP into the core surface and decommission it (closes out #42) #244
Labels
No labels
burndown-2026-06
headless
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
c#
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-gaming/eco-app#244
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The privileged
/adminMCP has never run.ECO_ADMIN_ENABLEDandECO_STATE_DIRappear nowhere in the deploy repo,POST /adminreturns 405 in prod, and it has gone un-missed since #42 was filed on 2026-07-03. Retire it: take the parts that earn their place, put them where they belong, delete the rest.Why it wasn't missed
Not because the capabilities were worthless — because a third of them were already answered by the public surface.
admin_live_statusreads the same/inforouteget_server_statusreads.admin_events_recentreads the same Chronicler store/replay/api/v1/eventsserves. Ten of the twelve read-only RCON queries have a public analogue:climate_status→get_climate,government→get_government,currencies→get_currency,active_elections/civics_tick→get_civics,online_players/meteor_status/world_time→get_server_status,population_changes→get_region.The surface was designed inside-out before the outside-in surface had grown to 22 tools. It then got overtaken.
Triage of all 14 tools
Scavenge into core
/mcp(2)admin_mods_installedget_mods. A mod inventory carries no player names and no secrets. Lands with #243's tree and source reader.admin_world_metaget_worldrather than keeping it standalone.Delete — already answered by the public surface (5)
admin_live_status,admin_service_health,admin_events_recent,admin_player_activity,admin_rcon_query.RCON is the only one with unique reach — it is authoritative when the exporter mod is down, which is exactly when the public tools go quiet. It is not worth an
ECO_RCON_PASSWORDin the public app to keep that. If liveness verification is ever needed during an outage, that is an operator script, not an MCP tool.Hand to
node-stats-kai-serverinstead (4)admin_save_status,admin_backup_list,admin_log_tail,admin_log_grep.These are host questions wearing an Eco costume: file sizes, file ages, log tails.
node-stats-mcpalready hasstat_path,read_text_head, and a readable-root allowlist, is already registered in mcporter, and is already the tool an agent reaches for when asking about kai-server. Adding theEcoServer/Storage,EcoServer/Backup, andEcoServer/Logsroots to its allowlist delivers all four with zero eco-app code. (Confirmed the allowlist is the live gate:stat_pathon the EcoServer tree today returnspath is outside the readable-root allowlist.)That is a repo boundary worth respecting anyway — eco-app is the game-data app; host introspection belongs to the host-introspection MCP.
Delete, and do not relocate (3)
admin_config_get,admin_config_diff,admin_mod_configs.These read
Configs/, which holds the Discord bot token and the server API token. They are the entire reasonredaction.pyand the three-level disclosure model exist. They do not belong on a public MCP, and they do not belong in node-stats either. Nothing has needed them in five weeks.Decommission checklist
src/eco_mcp_app/admin/— 1,414 lines acrossserver.py,state.py,rcon.py,redaction.py,runtime.py,__init__.py.tests/mcp/test_admin.py— 651 lines. Total removal ~2,065 lines plusdocs/admin-mcp.md(111).http_app.py: theNormalizeAdminPathmiddleware,ADMIN_ENABLED_ENV, theadmin_enabledbranch, the/adminMount, and the admin session-manager arm oflifespan.Trap for whoever does this:
ECO_ADMIN_TOKENand_resolve_admin_key()inhttp_app.pyare not part of this surface. That is the Eco server's HTTP API key, used by the public/preview/items.json,/preview/food.json,/preview/item.json,/preview/price-history.json, and/preview/recipes.jsonfetches, and it is set in the deploy. It stays. OnlyECO_ADMIN_ENABLED,ECO_STATE_DIR,ECO_ADMIN_BASE_URL,ECO_RCON_*, andECO_ADMIN_ALLOW_RAWare dead. A careless grep forADMINbreaks five live endpoints.What this does to #243
#243 recommended putting the mods tree and AutoGen source reader on
/admin, because/adminwas the authenticated boundary. With/admingone they go on core/mcp, and the concern I raised there needs a different answer:/mcpis public and unauthenticated, andMods/AutoGenis SLG's generated game source.Three ways to land it, in my order of preference:
page_auth.py, which already exists for the hidden/users/<hex>surface, so no second MCP is needed.Mods/UserCode— our own mods, ours to serve — and let AutoGen be metadata-only.Worth deciding before #243 is implemented, not after.
Acceptance
tools/liston/mcpgainsget_mods;get_worldgains the generator metadata.stat_pathcall that used to be refused./adminroute, noECO_ADMIN_ENABLEDbranch, noadmin/package.ECO_ADMIN_TOKENstill work after the deletion — explicit regression check, not an assumption.Refs: #42, #243,
docs/admin-mcp.md,coilyco-flight-deck/node-stats-mcp.