leadtech-bmad-mcp: serveur MCP central HTTP via sidecar Tailscale

Transforme le MCP leadtech-bmad de stdio local en service HTTP central
conteneurisé, accessible depuis tout périphérique du tailnet.

- server.main(): transport piloté par LEADTECH_MCP_TRANSPORT (stdio par
  défaut → aucune régression locale; streamable-http pour le central).
  Host/port via LEADTECH_MCP_HOST/_PORT.
- _build_transport_security(): whitelist d'hôtes via LEADTECH_MCP_ALLOWED_HOSTS
  pour lever la protection anti-DNS-rebinding (HTTP 421) derrière le sidecar.
- Dockerfile (python:3.11-slim, build index au démarrage, lance le serveur HTTP).
- docker-compose.yml: service mcp (réseau interne, aucun port publié) +
  sidecar tailscale (tailscale serve TLS MagicDNS). user 1000:1000 pour
  l'écriture dans le bind-mont. ALLOW_WRITE=1 sur l'instance centrale.
- tailscale/serve.json, .env.example, mcp.config.http.example.json.
- .gitignore: ignore le .env (secrets), garde .env.example.
- docs/design_nuc_tailscale.md: statut passé à IMPLÉMENTÉ + URL réelle.

Validé: handshake MCP initialize HTTPS via tailnet → 200, 7 tools listables,
écriture 95_a_capitaliser.md confirmée, 79 tests verts.
This commit is contained in:
MaksTinyWorkshop
2026-06-25 10:30:53 +02:00
parent 2fa34f0f6f
commit 1c876309f1
8 changed files with 240 additions and 13 deletions
+10
View File
@@ -0,0 +1,10 @@
# leadtech-bmad-mcp — secrets du déploiement central (à copier en .env, non versionné).
#
# Auth key Tailscale pour le sidecar.
# Générer dans l'admin console Tailscale : https://login.tailscale.com/admin/settings/keys
# - Reusable : OUI (sinon ré-enrôlement impossible après recreate)
# - Ephemeral : NON (sinon le nœud disparaît à chaque arrêt → pollution tailnet)
# - Tags : optionnel (ex tag:mcp) selon ta politique ACL
# Après le 1er `up`, pense à DISABLE KEY EXPIRY sur le nœud `leadtech-mcp`
# dans l'admin console (sinon ré-auth tous les ~90j).
LEADTECH_TS_AUTHKEY=tskey-auth-xxxxxxxxxxxx