Eco MCP battery: node-local privileged surface for warded agents to inspect on-disk server state #42
Labels
No labels
burndown-2026-06
burndown-2026-08
headless
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
c#
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
role/advocate
role/director
role/exec
role/frontend
role/gamedev
role/human
role/platform
role/qa
role/science
role/sysadmin
state
ambient
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-gaming/eco-app#42
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?
Goal
Let warded directors and engineers inspect the state of the local Eco game server on disk. Rather than bind-mount the live
EcoServer/tree into every warded container (heavy, and leaks Discord/Chronicler/API tokens sitting inConfigs/), expose the state over a network MCP surface the agents fetch. This is the inside-out counterpart to eco-app's existing outside-in MCP.Two views, this is the second
/infoendpoint, redacts player names, serves anyone. Live runtime, network-visible.Configs/,Storage/saves +Backup/(×40), the Chronicler SQLite history, per-subsystemLogs/, unredacted admin data, mod install state, and the loopback-only admin endpoints. Privileged, at-rest + admin, warded-agents-only.Home
Fold into
coilyco-gaming/eco-appas a second, privileged MCP surface (distinct deployment from the public one). Decided.Where it runs - node-local k3s pattern
The Eco server is a native systemd service (
eco-server.service) at/home/kai/Steam/steamapps/common/EcoServer/, NOT in k3s. But k3s runs on the same host, so a pod pinned to kai-server:hostPath-mountsEcoServer/{Configs,Storage,Logs,Mods}read-only, and127.0.0.1:3001/:3002admin endpoints over thehostAliasesloopback pin.MCP is exposed over the tailnet sidecar (reuse eco-app's deploy idiom), ACL'd to the ward/kai-server tailnet, not the public ingress. This is a node-agent MCP: the same DaemonSet-or-node-pinned + hostPath shape as node-exporter / promtail / CSI node plugins.
Tool inventory (provisional)
The disk-backed groups are the primary inside-out scope and remain required. RCON is an additive live-query group. It does not replace save, backup, config, event-history, log, or mod inspection.
Save + world (
Storage/):eco_save_status(Game.eco/Game.db size + age since last autosave),eco_backup_list(Backup/ count, cadence, newest/oldest),eco_world_meta(size, seed, cluster centers, world-days).Config (
Configs/, redacted, enum-not-path):eco_config_get(named .eco/.diff.json),eco_config_diff(diff vs *.original.json - what's tuned off default),eco_mod_configs(MightyMooseCore, DiscordLink, StrangeWorlds, NidToolbox - secrets stripped).Chronicler / events (SQLite, read RO):
eco_events_recent(joins, laws, elections, deaths),eco_player_activity(from EcoReplay.db / Chronicler, redaction-gated).Logs (
Logs/<subsystem>/):eco_log_tail,eco_log_grep(named subsystem enum: MightyMooseCore, NidToolbox, web, Kestrel, migrations).Live runtime (loopback
:3001admin/exporter):eco_live_status(players, world time, next meteor, uptime - unredacted),eco_service_health(systemd active-state + last restart).RCON query (loopback
:3002, authenticated, enum-only):eco_rcon_queryruns only the approved fixed v1 enum below. The caller supplies one enum value and no command text or arguments. The server owns the literal mapping, bounds and redacts output, serializes connections, fails closed on unknown or changed commands, and records the enum plus outcome without credentials or returned player data. Protocol context: Eco RCON.Approved v1 enum:
online_players->manage playersmeteor_status->meteor statusworld_time->time nowclimate_status->climate statussea_level->sim sealevelpopulation_changes->sim showpopulationchangesactive_elections->civics electionsgovernment->civics showgovernmentcivics_tick->civics showtickcurrencies->money currenciesweather_status->weather statusinitial_spawn_positions->initialspawn listMods (
Mods/):eco_mods_installed(modules + versions, drift vs push-mods manifest).Security boundary
public(names hashed),operator(names shown, secrets stripped),raw(operator + secrets - default DENY). Proposed default:operatorfor the trusted warded callers;rawoff by default. Secrets (Discord bot token,/eco/server-api-token, any token in Configs) never returned aboveraw.../../.ssh.Proposed defaults for the open questions
operator(names shown, secrets always stripped). Open to holding atpublic./infoclient as a thin add-on, not a reimplementation.Build phases
eco_save_status+eco_backup_list+eco_config_getagainst a local checkout of the state dirs - prove tools + redaction on real files.coilyco-bridge/deploy/services/, hostPath RO mounts, node pin, loopback pin, tailnet sidecar, ward ACL.Context
/home/kai/Steam/steamapps/common/EcoServer/(the eco-server-setup skill's/home/ubuntu/games/eco/paths are stale legacy).Storage/Game.db(256MB world SQLite),Game.ecosave,EcoReplay.db,Backup/×40,Configs/*.eco+*.diff.json+*.original.json,Logs/{MightyMooseCore,NidToolbox,web,Microsoft.AspNetCore.*,migrations}/.0.0.0.0:3001(Kestrel/ASP.NET, 200 on/and/api) +:3002.coilysiren/eco-mcp-app).Filed from a spec drafting session on kai-server.
Two refinements (director session, 2026-07-05):
1. REST is out of scope — MCP-only. The surface stays a network MCP; no parallel REST API. (It still consumes the loopback admin REST endpoints, but only re-exposes them as MCP tools.)
2. Access model: add an
/adminmount + the Authelia OAuth overlay for the claude.ai-hosted-connector path, complementing the tailnet-agent path this spec already has. Two callers, one surface:tailnet ACL, warded-agents-onlymodel.Ergonomics: the auth is not eco-app code — it is an ingress-layer overlay (deploy repo). eco-app only adds the
/adminStarlette mount, feature-flagged (ECO_ADMIN_ENABLED) so only the privileged node-local deployment exposes it.eco-mcp.coilysiren.mealready serves eco-app's MCP through Traefik + external-dns + LE, so there is no ingress to invent, only a gate to add in front of one path.Threat model unchanged: the overlay authenticates who, it does not relax this spec's redaction levels — secrets stay default-DENY even for an authenticated caller. On-disk data access (hostPath RO, node-pin) is orthogonal to the auth gate and stays as specified.
The remaining design boundary is now locked and the issue is buildable.
/adminonly in a separate node-pinned deployment withECO_ADMIN_ENABLED=1. The ordinary public eco-app Deployment keeps the feature disabled.Storage,Configs,Logs, andModsroots read-only. Tool inputs remain fixed enums, never caller-provided paths.operator. Secret fields stay stripped.rawremains disabled in deployment, regardless of caller identity.The issue no longer needs a product or exposure decision first. Removing
consultand retaininginteractivefor implementation plus live verification.Kai selected read-only RCON on 2026-07-25.
The #42 capability inventory now includes one enum-only
eco_rcon_querytool. The security boundary is:Ordinary implementation and tests can proceed headlessly. HITL remains for approval of the initial exact command enum, operator-side credential and loopback wiring, and the first live redaction smoke.
Kai approved the 12-command read-only RCON core on 2026-07-25.
The issue body now records the exact external enum and internal command mapping. RCON remains additive. The privileged MCP still includes all disk-backed groups:
The six privacy-heavy RCON candidates remain deferred. No free-form RCON arguments or mutating commands entered scope.
Implementation contract
Goal - Ship the repository-owned portion of the privileged inside-out Eco MCP: complete the read-only disk capability groups, add the approved 12-command enum-only RCON query, and author the precedent-matched node-local deployment declaration.
Done-condition - Eco-app focused and full repository gates pass, deploy rendering and repository gates pass, both commits land through their resolved workflows, and #42 records the exact remaining operator-only rollout and live-smoke evidence.
Non-goals - No live deployment, restart, secret read or mutation, raw redaction enablement, free-form RCON, mutating RCON, arbitrary filesystem path access, save-file editing, direct workload execution, or production iteration. The six privacy-heavy RCON candidates remain deferred.
Repository work is complete.
coilyco-bridge/deploy:feat/eco-admin-mcp-42. The branch remains off deploy main because main would trigger live CD.interactivelabel.#42 stays open until Ops returns that live evidence.
coilyco-ops referenced this issue from coilyco-gaming/.github2026-08-01 17:15:36 +00:00
I've been back and forth on this a TON - and concluded that this belongs in eco-app b/c its a live service functionality.
eco-mods is public mods, c#, shipped to mod.io
eco-ops is ... generally things that shouldn't be public. and scripted ops surfaces, CLI scripted.
like -maybe- eco-ops might host this, but eco-app already have the server infra.