From ec48041b54e873d9a578028d24fdcd2b5a14c7b0 Mon Sep 17 00:00:00 2001 From: dtoro Date: Tue, 2 Jun 2026 00:25:34 +0200 Subject: [PATCH] fix: correct endpoint path to /mcp for streamable-http transport --- bootstrap.sh | 4 +- containers/105-apps.md | 2 +- hosts/apps.yaml | 4 +- hosts/arriman.yaml | 2 +- hosts/authentik.yaml | 2 +- hosts/caddy.yaml | 2 +- hosts/claudio-bot.yaml | 2 +- hosts/elementsynapse.yaml | 2 +- hosts/gitea.yaml | 2 +- hosts/haos.yaml | 2 +- hosts/hubris.yaml | 2 +- hosts/jellyfin.yaml | 2 +- hosts/ludo-mini.yaml | 2 +- hosts/mac-mini.yaml | 2 +- hosts/mule-images.yaml | 2 +- hosts/netbird-vps.yaml | 2 +- hosts/nextcloud.yaml | 2 +- hosts/nfs-export.yaml | 2 +- hosts/paperless.yaml | 2 +- hosts/plato.yaml | 2 +- hosts/republic-laptop.yaml | 2 +- hosts/sophia.yaml | 2 +- hosts/zimaos.yaml | 2 +- infrastructure/homelab-context.md | 2 +- inventory.yaml | 2 +- tools/caveman/caveman.js | 23 ++++++ tools/caveman/caveman_wrapper.sh | 76 +++++++++++++++++++ tools/caveman/templates/git_log.txt | 3 + tools/caveman/templates/git_status.txt | 12 +++ tools/caveman/templates/test_results.txt | 4 + .../network.hubris.homelab-context-sync.plist | 27 +++++++ tools/post-pull.sh | 36 +++++++++ tools/setup-caveman.sh | 72 ++++++++++++++++++ 33 files changed, 280 insertions(+), 27 deletions(-) create mode 100644 tools/caveman/caveman.js create mode 100644 tools/caveman/caveman_wrapper.sh create mode 100644 tools/caveman/templates/git_log.txt create mode 100644 tools/caveman/templates/git_status.txt create mode 100644 tools/caveman/templates/test_results.txt create mode 100644 tools/network.hubris.homelab-context-sync.plist create mode 100644 tools/post-pull.sh create mode 100644 tools/setup-caveman.sh diff --git a/bootstrap.sh b/bootstrap.sh index 090af9b..643171f 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -23,8 +23,8 @@ REPO_HTTPS="${HOMELAB_REPO_URL:-https://git.hubris.network/dtoro/Homelab-Docs.gi CLONE_DIR="${HOMELAB_CONTEXT_DIR:-/opt/homelab-context}" ISSUANCE_URL_NETBIRD="${HOMELAB_ISSUANCE_NETBIRD:-https://secrets.hubris.network/issue}" ISSUANCE_URL_TAILSCALE="${HOMELAB_ISSUANCE_TAILSCALE:-https://secrets.hubris.network/issue}" -MCP_URL="${HOMELAB_MCP_URL:-https://mcp.hubris.network}" -HERMES_MCP_URI="${HOMELAB_HERMES_MCP_URI:-https://mcp.hubris.network}" +MCP_URL="${HOMELAB_MCP_URL:-https://mcp.hubris.network/mcp}" +HERMES_MCP_URI="${HOMELAB_HERMES_MCP_URI:-https://mcp.hubris.network/mcp}" HERMES_MODEL="${HOMELAB_HERMES_MODEL:-nousresearch/hermes-4-405b}" WITH_MCP=0 diff --git a/containers/105-apps.md b/containers/105-apps.md index f277e61..1477f10 100644 --- a/containers/105-apps.md +++ b/containers/105-apps.md @@ -60,7 +60,7 @@ is `dtoro/Homelab-Docs/mcp/server.py`; service unit disabled at the FastMCP layer because mesh+LAN gating is the actual trust boundary. -- Endpoint: `https://mcp.hubris.network` (Caddy → `:9810`). StreamableHTTP transport (POST `/`). +- Endpoint: `https://mcp.hubris.network/mcp` (Caddy → `:9810`). StreamableHTTP transport (POST `/mcp`). - 14 tools registered: `get_host`, `list_services`, `find_service`, `get_topology`, `search_docs`, `get_page`, `get_changelog`, `whoami`, `list_my_secrets` (context); `get_service_status`, `tail_log`, diff --git a/hosts/apps.yaml b/hosts/apps.yaml index aa76910..7e3ee4c 100644 --- a/hosts/apps.yaml +++ b/hosts/apps.yaml @@ -38,7 +38,7 @@ services_hosted: port: 9810 systemd_unit: homelab-mcp public_host: mcp.hubris.network - endpoint: https://mcp.hubris.network + endpoint: https://mcp.hubris.network/mcp note: MCP server. Read-only context + management. Reachable on the LAN via Caddy and from off-LAN via Netbird (192.168.8.0/24 is a network resource routed through hubris). - name: secrets_issuance @@ -51,5 +51,5 @@ services_hosted: age_pubkey: age1duyl8mkpgu80uv934dy8q7enqjms6yvdz264hme8uryuxmvvqesq6rusq0 see_also: - containers/105-apps.md -mcp_endpoint: https://mcp.hubris.network +mcp_endpoint: https://mcp.hubris.network/mcp secrets_issuance_endpoint: https://secrets.hubris.network/issue diff --git a/hosts/arriman.yaml b/hosts/arriman.yaml index a8dd7d6..15cdede 100644 --- a/hosts/arriman.yaml +++ b/hosts/arriman.yaml @@ -30,5 +30,5 @@ services_hosted: note: jellyseerr / qbit / sab on docker compose see_also: - containers/122-arriman.md -mcp_endpoint: https://mcp.hubris.network +mcp_endpoint: https://mcp.hubris.network/mcp secrets_issuance_endpoint: https://secrets.hubris.network/issue diff --git a/hosts/authentik.yaml b/hosts/authentik.yaml index 8e98999..5a050bc 100644 --- a/hosts/authentik.yaml +++ b/hosts/authentik.yaml @@ -28,5 +28,5 @@ notes: - 'Also hosts split-horizon dnsmasq: /etc/dnsmasq.d/hubris-split.conf' see_also: - containers/124-authentik.md -mcp_endpoint: https://mcp.hubris.network +mcp_endpoint: https://mcp.hubris.network/mcp secrets_issuance_endpoint: https://secrets.hubris.network/issue diff --git a/hosts/caddy.yaml b/hosts/caddy.yaml index 12537f7..cc0adcc 100644 --- a/hosts/caddy.yaml +++ b/hosts/caddy.yaml @@ -28,5 +28,5 @@ notes: - /etc/caddy is a git checkout of dtoro/caddy-conf see_also: - containers/121-caddy.md -mcp_endpoint: https://mcp.hubris.network +mcp_endpoint: https://mcp.hubris.network/mcp secrets_issuance_endpoint: https://secrets.hubris.network/issue diff --git a/hosts/claudio-bot.yaml b/hosts/claudio-bot.yaml index a0fb3bd..bfce5bd 100644 --- a/hosts/claudio-bot.yaml +++ b/hosts/claudio-bot.yaml @@ -18,5 +18,5 @@ notes: age_pubkey: age1xmkeq968areza2necqyq0065dpeegngzyr6dhagh0n6pl33lccfqe5mqn9 see_also: - containers/123-claudio-bot.md -mcp_endpoint: https://mcp.hubris.network +mcp_endpoint: https://mcp.hubris.network/mcp secrets_issuance_endpoint: https://secrets.hubris.network/issue diff --git a/hosts/elementsynapse.yaml b/hosts/elementsynapse.yaml index c2b4f51..a162061 100644 --- a/hosts/elementsynapse.yaml +++ b/hosts/elementsynapse.yaml @@ -25,5 +25,5 @@ services_hosted: backend: elementsynapse see_also: - containers/118-elementsynapse.md -mcp_endpoint: https://mcp.hubris.network +mcp_endpoint: https://mcp.hubris.network/mcp secrets_issuance_endpoint: https://secrets.hubris.network/issue diff --git a/hosts/gitea.yaml b/hosts/gitea.yaml index dde53fb..87f25a2 100644 --- a/hosts/gitea.yaml +++ b/hosts/gitea.yaml @@ -30,5 +30,5 @@ notes: - Bare repos live at /mnt/library/repos/dtoro/*.git see_also: - containers/104-gitea.md -mcp_endpoint: https://mcp.hubris.network +mcp_endpoint: https://mcp.hubris.network/mcp secrets_issuance_endpoint: https://secrets.hubris.network/issue diff --git a/hosts/haos.yaml b/hosts/haos.yaml index 08227bd..40e3e9c 100644 --- a/hosts/haos.yaml +++ b/hosts/haos.yaml @@ -23,5 +23,5 @@ services_hosted: backend: haos see_also: - vms/108-haos.md -mcp_endpoint: https://mcp.hubris.network +mcp_endpoint: https://mcp.hubris.network/mcp secrets_issuance_endpoint: https://secrets.hubris.network/issue diff --git a/hosts/hubris.yaml b/hosts/hubris.yaml index 877d61e..bb156ce 100644 --- a/hosts/hubris.yaml +++ b/hosts/hubris.yaml @@ -31,5 +31,5 @@ services_hosted: age_pubkey: age1xkklkvnk5z0fsnh6cfgv70hy9ksfy8rdprwerzw4yk3p4p7cxcqs2yvpz6 see_also: - hosts/hubris.md -mcp_endpoint: https://mcp.hubris.network +mcp_endpoint: https://mcp.hubris.network/mcp secrets_issuance_endpoint: https://secrets.hubris.network/issue diff --git a/hosts/jellyfin.yaml b/hosts/jellyfin.yaml index b50c70d..c95f5a1 100644 --- a/hosts/jellyfin.yaml +++ b/hosts/jellyfin.yaml @@ -27,5 +27,5 @@ services_hosted: backend: jellyfin see_also: - containers/101-jellyfin.md -mcp_endpoint: https://mcp.hubris.network +mcp_endpoint: https://mcp.hubris.network/mcp secrets_issuance_endpoint: https://secrets.hubris.network/issue diff --git a/hosts/ludo-mini.yaml b/hosts/ludo-mini.yaml index e3f651b..cc44feb 100644 --- a/hosts/ludo-mini.yaml +++ b/hosts/ludo-mini.yaml @@ -13,5 +13,5 @@ mesh_globals: accepted: - netbird - tailscale -mcp_endpoint: https://mcp.hubris.network +mcp_endpoint: https://mcp.hubris.network/mcp secrets_issuance_endpoint: https://secrets.hubris.network/issue diff --git a/hosts/mac-mini.yaml b/hosts/mac-mini.yaml index 416df8b..829ebd6 100644 --- a/hosts/mac-mini.yaml +++ b/hosts/mac-mini.yaml @@ -19,5 +19,5 @@ ssh: notes: - Only macOS in the fleet. Bootstrap uses launchd. age_pubkey: age1z62ff2ak9zj5ctcvaxwyyhedwjvlwgm2dkn9nk3wrwk8fkavcpmsqwc2vs -mcp_endpoint: https://mcp.hubris.network +mcp_endpoint: https://mcp.hubris.network/mcp secrets_issuance_endpoint: https://secrets.hubris.network/issue diff --git a/hosts/mule-images.yaml b/hosts/mule-images.yaml index fd3f4dc..75b8633 100644 --- a/hosts/mule-images.yaml +++ b/hosts/mule-images.yaml @@ -27,5 +27,5 @@ services_hosted: backend: mule-images see_also: - containers/120-mule-images.md -mcp_endpoint: https://mcp.hubris.network +mcp_endpoint: https://mcp.hubris.network/mcp secrets_issuance_endpoint: https://secrets.hubris.network/issue diff --git a/hosts/netbird-vps.yaml b/hosts/netbird-vps.yaml index 13d026c..713a0bb 100644 --- a/hosts/netbird-vps.yaml +++ b/hosts/netbird-vps.yaml @@ -25,5 +25,5 @@ notes: - Configs rendered by `homelab render-vps-configs` from vps/turnserver.conf.tmpl + vps/management.json.tmpl, with secrets decrypted from secrets/turn-shared-secret.yaml + secrets/netbird-authentik-oidc.yaml on hubris. -mcp_endpoint: https://mcp.hubris.network +mcp_endpoint: https://mcp.hubris.network/mcp secrets_issuance_endpoint: https://secrets.hubris.network/issue diff --git a/hosts/nextcloud.yaml b/hosts/nextcloud.yaml index 16ff6c3..a0f5a39 100644 --- a/hosts/nextcloud.yaml +++ b/hosts/nextcloud.yaml @@ -27,5 +27,5 @@ services_hosted: backend: nextcloud see_also: - containers/114-nextcloud.md -mcp_endpoint: https://mcp.hubris.network +mcp_endpoint: https://mcp.hubris.network/mcp secrets_issuance_endpoint: https://secrets.hubris.network/issue diff --git a/hosts/nfs-export.yaml b/hosts/nfs-export.yaml index 28ebe8c..a38c1b4 100644 --- a/hosts/nfs-export.yaml +++ b/hosts/nfs-export.yaml @@ -15,5 +15,5 @@ mesh_globals: - tailscale see_also: - containers/102-nfs-export.md -mcp_endpoint: https://mcp.hubris.network +mcp_endpoint: https://mcp.hubris.network/mcp secrets_issuance_endpoint: https://secrets.hubris.network/issue diff --git a/hosts/paperless.yaml b/hosts/paperless.yaml index 1fb426d..71b5372 100644 --- a/hosts/paperless.yaml +++ b/hosts/paperless.yaml @@ -27,5 +27,5 @@ services_hosted: backend: paperless see_also: - containers/103-paperless.md -mcp_endpoint: https://mcp.hubris.network +mcp_endpoint: https://mcp.hubris.network/mcp secrets_issuance_endpoint: https://secrets.hubris.network/issue diff --git a/hosts/plato.yaml b/hosts/plato.yaml index dc7169d..e391ff2 100644 --- a/hosts/plato.yaml +++ b/hosts/plato.yaml @@ -24,5 +24,5 @@ services_hosted: backend: plato see_also: - containers/126-plato.md -mcp_endpoint: https://mcp.hubris.network +mcp_endpoint: https://mcp.hubris.network/mcp secrets_issuance_endpoint: https://secrets.hubris.network/issue diff --git a/hosts/republic-laptop.yaml b/hosts/republic-laptop.yaml index f975a78..23fad6a 100644 --- a/hosts/republic-laptop.yaml +++ b/hosts/republic-laptop.yaml @@ -15,5 +15,5 @@ mesh_globals: - tailscale ssh: user: dtoro -mcp_endpoint: https://mcp.hubris.network +mcp_endpoint: https://mcp.hubris.network/mcp secrets_issuance_endpoint: https://secrets.hubris.network/issue diff --git a/hosts/sophia.yaml b/hosts/sophia.yaml index 64774aa..3f28389 100644 --- a/hosts/sophia.yaml +++ b/hosts/sophia.yaml @@ -20,5 +20,5 @@ mounts: - /mnt/library see_also: - containers/119-sophia.md -mcp_endpoint: https://mcp.hubris.network +mcp_endpoint: https://mcp.hubris.network/mcp secrets_issuance_endpoint: https://secrets.hubris.network/issue diff --git a/hosts/zimaos.yaml b/hosts/zimaos.yaml index 7020217..8b2a553 100644 --- a/hosts/zimaos.yaml +++ b/hosts/zimaos.yaml @@ -22,5 +22,5 @@ services_hosted: backend: zimaos see_also: - vms/100-zimaos.md -mcp_endpoint: https://mcp.hubris.network +mcp_endpoint: https://mcp.hubris.network/mcp secrets_issuance_endpoint: https://secrets.hubris.network/issue diff --git a/infrastructure/homelab-context.md b/infrastructure/homelab-context.md index b839b03..c147607 100644 --- a/infrastructure/homelab-context.md +++ b/infrastructure/homelab-context.md @@ -16,7 +16,7 @@ page is the architecture reference. | Per-client clone | every enrolled client | `/opt/homelab-context/` | Read by `homelab` CLI, MCP server, claudio-bot | | `homelab` CLI | every enrolled client | `/usr/local/bin/homelab` → `/opt/homelab-context/bin/homelab` (symlink) | Operator surface for enroll/secret/ssh/pct | | Per-client age key | every enrolled client | `/etc/age/key.txt` (0600 root) | Decrypts SOPS-encrypted secrets the client is a recipient on | -| MCP server | [apps (105)](../containers/105-apps.md) | `homelab-mcp.service` on port 9810 (https://mcp.hubris.network) | 14 tools: 8 context (get_host, search_docs, …) + 5 read-only management (get_service_status, tail_log, …) + list_my_secrets | +| MCP server | [apps (105)](../containers/105-apps.md) | `homelab-mcp.service` on port 9810 (https://mcp.hubris.network/mcp) | 14 tools: 8 context (get_host, search_docs, …) + 5 read-only management (get_service_status, tail_log, …) + list_my_secrets | | Secrets-issuance | [apps (105)](../containers/105-apps.md) | `secrets-issuance.service` on port 9820 (https://secrets.hubris.network/issue) | Generates per-client age keypair on first bootstrap; idempotent; admin-token-gated `/revoke` | | Sync timer | every enrolled client | `homelab-context-sync.timer` (Linux) / `network.hubris.homelab-context-sync.plist` (macOS) | `git pull --ff-only` every 5 min | | Encrypted secrets | `dtoro/Homelab-Docs` | `secrets/*.yaml` (SOPS+age) | Recipients declared in `.sops.yaml` | diff --git a/inventory.yaml b/inventory.yaml index 00c79a0..9d1e724 100644 --- a/inventory.yaml +++ b/inventory.yaml @@ -88,7 +88,7 @@ services: port: 9810 systemd_unit: homelab-mcp public_host: mcp.hubris.network - endpoint: https://mcp.hubris.network + endpoint: https://mcp.hubris.network/mcp note: MCP server. Read-only context + management. Reachable on the LAN via Caddy and from off-LAN via Netbird (192.168.8.0/24 is a network resource routed through hubris). diff --git a/tools/caveman/caveman.js b/tools/caveman/caveman.js new file mode 100644 index 0000000..6f17d44 --- /dev/null +++ b/tools/caveman/caveman.js @@ -0,0 +1,23 @@ +#!/usr/bin/env node +// Caveman template renderer — reads template + data JSON files and renders output +// Installed automatically via homelab-context post-pull hook +const caveman = require("caveman"); +const fs = require("fs"); +const path = require("path"); + +const args = process.argv.slice(2); +if (args.length === 0) { + console.error("Usage: caveman