| Version | Supported |
|---|---|
| 1.1.x | Yes |
| 1.0.x | No (never tagged on GroepOnline) |
Please do not open public GitHub issues for security problems.
Email security reports to the repository maintainers via GitHub private security advisories: https://github.com/GroepOnline/kater-dev-tools/security/advisories/new
Include:
- Description of the issue and impact
- Steps to reproduce
- Affected version/commit
- Suggested fix (if any)
We aim to acknowledge reports within 72 hours.
Kater exposes MCP tools over HTTP/SSE. Treat a public instance like an API gateway:
- Never expose
/ssewithout auth. SetKATER_PUBLIC=1andKATER_AUTH_MODE=oauthorapikey. - Use OAuth for ChatGPT Remote MCP — built-in PKCE flow at
/authorizeand/token. - Use API keys for Cursor/agents —
Authorization: Bearer <key>on MCP and REST requests. - Enable rate limiting —
KATER_RATE_LIMIT=60(default when public). Applied to REST, MCP/sse, and WebSocket;X-Forwarded-Foris honored only from loopback/private proxy peers or withKATER_TRUST_PROXY=1. - Restrict CORS — avoid
*on public deployments; setKATER_CORS_ORIGINS. - Keep adapter secrets in env — never commit
.env; Kater redacts secrets in API/MCP tool responses. - Bind to loopback behind a tunnel — Cloudflare Tunnel or Tailscale; do not expose raw ports.
- Set an admin key —
KATER_ADMIN_KEYseparates tool usage from settings and catalog credential changes. In public mode, settings mutations and Catalog Connect mutations (POST /credentials,POST /oauth/start,DELETE /connections/{id}) are blocked without it. MaskedGET /connectionsstays authenticated-only. - Secret storage stays local-only and masked — dashboard credential saves (manual
POST /credentialsincluded) persist to the gitignored.kater/settings.json, written0600with a0700directory, and are masked (***) in every API response. ChefVault (docs/ops/chefvault.md) remains the referenced durable team sink; this gateway does not write Vault items,mcp.json, or git. - Public Connect origin is configured, not requested — set
KATER_CONNECT_PUBLIC_BASE_URL=https://<canonical-host>. Host / X-Forwarded-Host are not used to build OAuth redirect URLs in public mode. Localhost HTTP is allowed only on loopback. - Keep client registration closed — public
/registeris disabled unlessKATER_ALLOW_DYNAMIC_REGISTRATION=1andKATER_REGISTRATION_TOKENis set. Prefer pre-seeded first-party clients/admin bootstrap over anonymous runtime registration. - Dashboard key —
KATER_DASHBOARD_KEYis an optional shortcut that bypasses OAuth token validation for a browser dashboard session inoauthmode. Leave unset unless you need it.
OAuth redirect_uri values must be https (or http for loopback per RFC 8252); dangerous schemes (javascript:, data:) are rejected at registration.
Run kater doctor before going live — it flags public deployments without auth.