- Python 81.7%
- HTML 11.6%
- CSS 5.8%
- Makefile 0.8%
closes #60 Adds ServiceAccount + Role + RoleBinding scoped tight to the ts-state Secret. ExternalSecret pulls the auth key from /coilysiren/eco-mcp/ ts-authkey (terraform-managed at coilysiren/infrastructure#205). ts container joins the workload Pod in kernel mode, privileged, pinned to kai-server for /dev/net/tun. Drops tailscale.com/expose from the Service. Public Ingress via traefik + cert-manager stays exactly as it was; only the tailnet path changes. After CI redeploys, http://eco-mcp resolves over the tailnet without the broken operator at coilysiren/infrastructure#198. Audit-log: none |
||
|---|---|---|
| .claude | ||
| .coily | ||
| .gauntlet/trials | ||
| .github/workflows | ||
| data | ||
| deploy | ||
| docs | ||
| investigation | ||
| scripts | ||
| src/eco_mcp_app | ||
| static | ||
| tests | ||
| .dockerignore | ||
| .gitignore | ||
| .pre-commit-config.yaml | ||
| AGENTS.md | ||
| CLAUDE.md | ||
| coily.yaml | ||
| Dockerfile | ||
| LICENSE | ||
| Makefile | ||
| pyproject.toml | ||
| README.md | ||
| uv.lock | ||
Banner: Steam header for Eco by Strange Loop Games. Attribution use, not my artwork.
eco-mcp-app
An inline Claude Desktop widget for any public Eco game server [1]. Point at the "Eco via Sirens" [2] server (default) or any other Eco server by IP/hostname. Ask Claude "what's the Eco server doing?" and you get a live card: meteor countdown, online/total, world size, laws, economy, Discord CTA, Steam link.
Also a tech demo - a minimal, hand-rolled MCP Apps implementation [3] without a bundler or React. Whole iframe is one 300-line HTML file. Useful as a reference for building an MCP App in Python rather than the TypeScript/ext-apps [4] stack.
Live at eco-mcp.coilysiren.me/preview.
How it works
src/eco_mcp_app/server.py exposes tools that hit Eco's public /info endpoint and admin exporters, redact player names, and return content blocks: markdown fallback for text-only hosts + JSON for the iframe. The tool's _meta.ui.resourceUri points at ui://eco/status.html, registered as an MCP resource.
The iframe (src/eco_mcp_app/ui/eco.html) is plain HTML/CSS/JS - no build step. Hand-rolls the MCP Apps handshake per spec [5]:
- Iframe → host:
ui/initialize(withprotocolVersion: 2026-01-26) - Host → iframe: initialize result
- Iframe → host:
ui/notifications/initialized - Host → iframe:
ui/notifications/tool-resultwhenever a matching tool fires
The handshake is ~30 lines. The ext-apps SDK [4] does more, but for a read-only dashboard we don't need it.
Tools
See docs/FEATURES.md for the full inventory. Headliner: get_eco_server_status. Plus tools for economy, world map, milestones, species, items, crafting, fair-price, ecoregions, government, climate. All accept an optional server arg (host, host:port, full URL).
Quick start
uv sync --group dev
coily smoke # stdio test of all tools
coily http # HTTP transport on :4000
coily harness # browser dev harness on :8765
Add to Claude Desktop:
coily install-desktop
Deploy
Cloned from coilysiren/backend template. Dockerfile + deploy/main.yml (k3s) + .github/workflows/build-and-publish.yml. Target: https://eco-mcp.coilysiren.me/mcp/.
License & credits
MIT. Eco is a trademark of Strange Loop Games [1]; unofficial fan tool, not affiliated.
References
- https://play.eco/
- https://eco.coilysiren.me/
- https://github.com/modelcontextprotocol/ext-apps
- https://github.com/modelcontextprotocol/ext-apps/tree/main/sdk
- https://github.com/modelcontextprotocol/ext-apps/blob/main/specification/2026-01-26/apps.mdx
See also
- AGENTS.md - agent-facing operating rules.
- docs/FEATURES.md - inventory of what ships today.
- .coily/coily.yaml - allowlisted commands.
Cross-reference convention from coilysiren/agentic-os#59.

