No description
  • Python 81.7%
  • HTML 11.6%
  • CSS 5.8%
  • Makefile 0.8%
Find a file
Kai Siren 106745f97f
Some checks are pending
build-publish-deploy / build-publish (push) Waiting to run
build-publish-deploy / deploy (push) Blocked by required conditions
TruffleHog / Scan for secrets (push) Waiting to run
feat(deploy): in-Pod tailscale sidecar replaces operator ts-proxy
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
2026-05-20 00:47:44 -07:00
.claude chore(lockdown): adopt agent-guard pre-tool-use delegate 2026-05-16 13:59:15 -07:00
.coily rename: update cross-repo refs after coilyco-ai to agentic-os-kai 2026-05-15 02:28:59 -07:00
.gauntlet/trials add: gauntlet trials for eco-mcp-app 2026-04-24 19:08:24 -07:00
.github/workflows chore(ci): remove codex-review-gate + undraft-and-poke-codex workflows 2026-05-16 15:42:42 -07:00
data feat: pre-fetch ecopedia + species caches as committed JSON 2026-04-21 13:33:58 -07:00
deploy feat(deploy): in-Pod tailscale sidecar replaces operator ts-proxy 2026-05-20 00:47:44 -07:00
docs chore: trim README + AGENTS + FEATURES under cap 2026-05-16 00:11:39 -07:00
investigation investigation: log the audience=user widget-empty-placeholder bug 2026-04-27 22:13:38 -07:00
scripts chore: adopt coilysiren/agentic-os v0.2.1 upstream-ref pre-commit suite 2026-05-15 23:30:04 -07:00
src/eco_mcp_app climate: parse parallel-array dataset payloads (closes #34) 2026-05-10 16:06:30 -07:00
static chore: rename dev/ to static/, drop issue 61 reply draft 2026-04-20 19:09:37 -07:00
tests climate: parse parallel-array dataset payloads (closes #34) 2026-05-10 16:06:30 -07:00
.dockerignore feat: homelab deploy rig + HTTP transport + point at any public Eco server 2026-04-20 19:30:38 -07:00
.gitignore Migrate pyinvoke -> Makefile + coily 2026-05-09 16:58:50 -07:00
.pre-commit-config.yaml chore: trim README + AGENTS + FEATURES under cap 2026-05-16 00:11:39 -07:00
AGENTS.md chore: trim README + AGENTS + FEATURES under cap 2026-05-16 00:11:39 -07:00
CLAUDE.md Convert CLAUDE.md symlink to @AGENTS.md import 2026-04-23 13:35:39 -07:00
coily.yaml deploy: rename config.yml to coily.yaml 2026-05-13 22:50:24 -07:00
Dockerfile Drop requirements.txt, use uv.lock directly in Docker 2026-05-14 06:22:26 -07:00
LICENSE feat: initial eco-mcp-app scaffold 2026-04-20 17:07:10 -07:00
Makefile Drop requirements.txt, use uv.lock directly in Docker 2026-05-14 06:22:26 -07:00
pyproject.toml Migrate pyinvoke -> Makefile + coily 2026-05-09 16:58:50 -07:00
README.md chore: trim README + AGENTS + FEATURES under cap 2026-05-16 00:11:39 -07:00
uv.lock Migrate pyinvoke -> Makefile + coily 2026-05-09 16:58:50 -07:00

Eco by Strange Loop Games

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 card

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]:

  1. Iframe → host: ui/initialize (with protocolVersion: 2026-01-26)
  2. Host → iframe: initialize result
  3. Iframe → host: ui/notifications/initialized
  4. Host → iframe: ui/notifications/tool-result whenever 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

  1. https://play.eco/
  2. https://eco.coilysiren.me/
  3. https://github.com/modelcontextprotocol/ext-apps
  4. https://github.com/modelcontextprotocol/ext-apps/tree/main/sdk
  5. https://github.com/modelcontextprotocol/ext-apps/blob/main/specification/2026-01-26/apps.mdx

See also

Cross-reference convention from coilysiren/agentic-os#59.