Hosted MCP service operations¶
URLs¶
- Production: https://mcp.klein.business/legal/de
- Staging: https://staging-mcp.klein.business/legal/de
- Privacy: https://mcp.klein.business/privacy
- Terms: https://mcp.klein.business/terms
- Health: https://mcp.klein.business/health
- Metrics: https://mcp.klein.business/metrics (internal only)
Topology¶
[Internet] → Caddy (TLS + CSP) → legal-text-mcp-de container (×N) → /data/corpus mount
Deploy¶
# Tag and image must already exist on GHCR
./deployment/deploy.sh 2.0.0-rc.4
Rollback¶
./deployment/deploy.sh 2.0.0-rc.3 # previous stable
Corpus refresh¶
Daily cron pulls latest bundle from S3 → swaps /data/corpus/latest.tar.zst symlink atomically.
Soak testing¶
- New tags first ship to staging
- Verify zero SEV≥2 incidents for 2 weeks before promoting to production
Production promotion checklist¶
Before promoting a tag from staging to production:
- [ ] Staging has run the tag for ≥ 2 weeks
- [ ] No SEV≥2 incidents in that window
- [ ] /metrics shows P95 latency < 500ms for get_norm (warm cache)
- [ ] /health returns status=ok consistently
- [ ] CodeQL, Trivy, Gitleaks all green on the source commit
- [ ] CHANGELOG updated with any operational notes
- [ ] DNS TTL lowered before swap, restored after
- [ ] On-call notified
Record the promotion in docs/operations/soak-test.md with verdict "OK for promotion to prod".