kai mcp #27

Closed
opened 2026-05-23 20:55:42 +00:00 by coilysiren · 1 comment
Owner

Originally filed by @coilysiren on 2026-04-28T10:51:06Z - https://github.com/coilysiren/website/issues/1324

Bootstrap coilysiren-mcp — self-MCP with live GitHub + homelab pulse cards

🤖 Filed by Claude Code on Kai's behalf.

Why

Personal MCP App as portfolio piece — same shape as eco-mcp-app, retargeted at "what's Kai building and running right now" instead of an Eco game server. Public, no-auth, hosted. Renders inline as an MCP Apps card in Claude Desktop and equivalents; degrades to a markdown summary elsewhere.

The point is recruiter-legible skill evidence (Python, Starlette, MCP Apps spec impl, hosted on the homelab k3s, GH Actions in the loop) plus a cold-outreach asset for AI-tooling shops, especially Anthropic. Not a load-bearing infra artifact — Gauntlet covers that lane.

Goals

  • Two cards working end-to-end: GitHub pulse (30d) + homelab pulse.
  • Hosted at a stable URL on *.coilysiren.me, CORS open, no auth.
  • One-line install via claude mcp add --transport http coilysiren https://....
  • Repo legible as a portfolio piece on cold click-through: clean README, install one-liners for Claude Desktop / Claude Code / Cursor / Windsurf / Zed / Cline, deploy infra visible.

Non-goals

  • No OAuth, no API keys, no per-user state. Auth is the demo-killer here.
  • No scaling story, no SLO, no multi-tenancy. Single instance.
  • Not a Claude Code plugin marketplace. Pure MCP path.
  • Not a skill (folder of instructions). MCP server with tools that hit live data.

Architecture

Lift wholesale from eco-mcp-app:

  • Python + Starlette, MCP over Streamable-HTTP, stateless, CORS open.
  • Hand-rolled MCP Apps init handshake (~30 lines), spec 2026-01-26.
  • Single iframe HTML resource registered as ui://coilysiren/status.html, served alongside the tool result.
  • Two content blocks per tool response: markdown fallback + JSON for the iframe.
  • Deploy stack cloned from coilysiren/backend: Dockerfile, Makefile, k3s manifest, GH Actions to GHCR, Tailscale + cert-manager.

Open question worth deciding early: factor the iframe handshake out of eco-mcp-app into a small library both repos vendor, or copy-paste for now? Lean copy-paste until there's a third caller — extracting prematurely is more work than the duplication costs at N=2.

Card 1: GitHub pulse

Source: coilysiren/website/scripts/pulse-data.yaml, refreshed daily by GH Actions. 30-day rolling window with per-day totals, top commit, per-repo segments, and a pre-computed outlier block.

Tool: get_github_pulse — no args, returns the latest pulse YAML rendered as a card.

Card sections:

  • Headline: 30d total LOC + commits, refresh timestamp with link to the workflow run (mirrors eco-mcp-app's "Fetched 4:12 PM" stamp).
  • Activity sparkline: 30 bars, one per day, height = totalLoc. Log-scale or apply an outlier dampener — the Apr 22 coily-initial-commit spike (514k LOC, 163k from one commit) eats everything linearly. Tap a bar → that day's topCommit.message + URL.
  • Repo breakdown: stacked color bar from repos[].color, rolled up over 30d.
  • Pinned outlier: render the outlier: block already pre-computed in the YAML, with a link to the commit URL.
  • Latest top commit: most recent non-null days[].topCommit. Filter Revert and chore(pulse): prefixes from the topCommit slot — they're noise on this surface (the 2026-04-27 entry is currently a revert of a pulse refresh, which is funny but not the signal we want surfaced).

Ships first. Data already exists; no upstream dependencies. Estimated ~1 day including iframe styling and a deploy.

Card 2: Homelab pulse

Blocked on the VictoriaMetrics + Grafana deploy landing (tracked in coilysiren/infrastructure#60).

Tool: get_homelab_pulse — no args, returns kai-server vitals.

Card sections (each renders only if data is present, per the eco-mcp-app "cards you don't have data for just aren't rendered" pattern):

  • kai-server uptime, CPU / mem / disk gauges from VictoriaMetrics hostmetrics.
  • k3s node + pod count from kube-state-metrics.
  • Sentry-backed error count over last 24h across backend, eco-mcp-app, eco-spec-tracker, eco-telemetry, coily (SDKs wired up 2026-04-24).
  • Tailscale online/offline dot for the host.
  • Latest deploy: most recent GHCR push timestamp or GH Actions run for infrastructure.
  • Embedded eco-mcp-app sub-card: just call get_eco_server_status and reuse the existing meteor card. Graceful degrade between cycles is already handled there.

Ships second, after the o11y substrate is live.

Time budget

2–3 focused days total, riding the eco-mcp-app template hard. If this stretches past a week, stop — the marginal hour is better spent on a public Terraform contribution or finishing the VictoriaMetrics deploy + a writeup, both of which close more of the bio-vs-evidence gap per hour against the actual 2026 job target.

Out-of-scope follow-ups (file separately if pursued)

  • coilysiren/website — link to the new repo from /apps, plus a "try this in Claude" CTA on the landing page.
  • coilysiren/eco-mcp-app — extract the MCP Apps handshake into a vendored mini-lib if a third caller appears (don't do it preemptively at N=2).
  • Talk submission: "MCP Apps in Python, hand-rolled, 300 lines" — fresh-spec window is roughly 6 months from 2026-01-26, so this year.
  • Bluesky/X post once it's live, screenshots of the cards.

🤖 Filed by Claude Code on Kai's behalf.

_Originally filed by @coilysiren on 2026-04-28T10:51:06Z - [https://github.com/coilysiren/website/issues/1324](https://github.com/coilysiren/website/issues/1324)_ # Bootstrap coilysiren-mcp — self-MCP with live GitHub + homelab pulse cards > 🤖 Filed by Claude Code on Kai's behalf. ## Why Personal MCP App as portfolio piece — same shape as `eco-mcp-app`, retargeted at "what's Kai building and running right now" instead of an Eco game server. Public, no-auth, hosted. Renders inline as an MCP Apps card in Claude Desktop and equivalents; degrades to a markdown summary elsewhere. The point is recruiter-legible skill evidence (Python, Starlette, MCP Apps spec impl, hosted on the homelab k3s, GH Actions in the loop) plus a cold-outreach asset for AI-tooling shops, especially Anthropic. Not a load-bearing infra artifact — Gauntlet covers that lane. ## Goals - Two cards working end-to-end: GitHub pulse (30d) + homelab pulse. - Hosted at a stable URL on `*.coilysiren.me`, CORS open, no auth. - One-line install via `claude mcp add --transport http coilysiren https://...`. - Repo legible as a portfolio piece on cold click-through: clean README, install one-liners for Claude Desktop / Claude Code / Cursor / Windsurf / Zed / Cline, deploy infra visible. ## Non-goals - No OAuth, no API keys, no per-user state. Auth is the demo-killer here. - No scaling story, no SLO, no multi-tenancy. Single instance. - Not a Claude Code plugin marketplace. Pure MCP path. - Not a skill (folder of instructions). MCP server with tools that hit live data. ## Architecture Lift wholesale from `eco-mcp-app`: - Python + Starlette, MCP over Streamable-HTTP, stateless, CORS open. - Hand-rolled MCP Apps init handshake (~30 lines), spec `2026-01-26`. - Single iframe HTML resource registered as `ui://coilysiren/status.html`, served alongside the tool result. - Two content blocks per tool response: markdown fallback + JSON for the iframe. - Deploy stack cloned from `coilysiren/backend`: Dockerfile, Makefile, k3s manifest, GH Actions to GHCR, Tailscale + cert-manager. Open question worth deciding early: factor the iframe handshake out of `eco-mcp-app` into a small library both repos vendor, or copy-paste for now? Lean copy-paste until there's a third caller — extracting prematurely is more work than the duplication costs at N=2. ## Card 1: GitHub pulse Source: `coilysiren/website/scripts/pulse-data.yaml`, refreshed daily by GH Actions. 30-day rolling window with per-day totals, top commit, per-repo segments, and a pre-computed outlier block. Tool: `get_github_pulse` — no args, returns the latest pulse YAML rendered as a card. Card sections: - *Headline*: 30d total LOC + commits, refresh timestamp with link to the workflow run (mirrors eco-mcp-app's "Fetched 4:12 PM" stamp). - *Activity sparkline*: 30 bars, one per day, height = `totalLoc`. Log-scale or apply an outlier dampener — the Apr 22 coily-initial-commit spike (514k LOC, 163k from one commit) eats everything linearly. Tap a bar → that day's `topCommit.message` + URL. - *Repo breakdown*: stacked color bar from `repos[].color`, rolled up over 30d. - *Pinned outlier*: render the `outlier:` block already pre-computed in the YAML, with a link to the commit URL. - *Latest top commit*: most recent non-null `days[].topCommit`. Filter `Revert ` and `chore(pulse):` prefixes from the topCommit slot — they're noise on this surface (the 2026-04-27 entry is currently a revert of a pulse refresh, which is funny but not the signal we want surfaced). Ships first. Data already exists; no upstream dependencies. Estimated ~1 day including iframe styling and a deploy. ## Card 2: Homelab pulse Blocked on the VictoriaMetrics + Grafana deploy landing (tracked in `coilysiren/infrastructure#60`). Tool: `get_homelab_pulse` — no args, returns kai-server vitals. Card sections (each renders only if data is present, per the eco-mcp-app "cards you don't have data for just aren't rendered" pattern): - kai-server uptime, CPU / mem / disk gauges from VictoriaMetrics `hostmetrics`. - k3s node + pod count from kube-state-metrics. - Sentry-backed error count over last 24h across `backend`, `eco-mcp-app`, `eco-spec-tracker`, `eco-telemetry`, `coily` (SDKs wired up 2026-04-24). - Tailscale online/offline dot for the host. - Latest deploy: most recent GHCR push timestamp or GH Actions run for `infrastructure`. - Embedded eco-mcp-app sub-card: just call `get_eco_server_status` and reuse the existing meteor card. Graceful degrade between cycles is already handled there. Ships second, after the o11y substrate is live. ## Time budget 2–3 focused days total, riding the eco-mcp-app template hard. If this stretches past a week, stop — the marginal hour is better spent on a public Terraform contribution or finishing the VictoriaMetrics deploy + a writeup, both of which close more of the bio-vs-evidence gap per hour against the actual 2026 job target. ## Out-of-scope follow-ups (file separately if pursued) - `coilysiren/website` — link to the new repo from `/apps`, plus a "try this in Claude" CTA on the landing page. - `coilysiren/eco-mcp-app` — extract the MCP Apps handshake into a vendored mini-lib if a third caller appears (don't do it preemptively at N=2). - Talk submission: "MCP Apps in Python, hand-rolled, 300 lines" — fresh-spec window is roughly 6 months from `2026-01-26`, so this year. - Bluesky/X post once it's live, screenshots of the cards. > 🤖 Filed by Claude Code on Kai's behalf.
Author
Owner

Iceboxed in the 2026-05-29 backlog burn-down: Far-future self-MCP portfolio play. Reopen anytime if it becomes real.

Iceboxed in the 2026-05-29 backlog burn-down: Far-future self-MCP portfolio play. Reopen anytime if it becomes real.
coilysiren 2026-05-30 05:42:57 +00:00
  • closed this issue
  • added the
    icebox
    label
Sign in to join this conversation.
No labels
icebox
P0
P1
P2
P3
P4
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
coilysiren/website#27
No description provided.