so_…) is workspace admin for that organization — it can list, create, stop, and delete every agent in the workspace. Treat it like a password. Hermes dashboard and api_server_key values are a different secret for each tenant runtime.
API key scope
A SeaOtter access key (so_…) authenticates as workspace admin for that organization. The same secret is:
SEAOTTER_API_KEYin MCP client configAuthorization: Bearer so_…againsthttps://api.seaotter.dev/api/v1
hermes commands in the agent pod.
Treat the key like a password. Do not commit it. Prefer per-client keys and revoke from Settings when done.
Hermes runtime credentials (api_server_key on each agent) are a separate Bearer for that agent’s /v1 API. The MCP server fetches them after authenticating with so_… and caches them in process memory only. After dashboard or MCP rotate_agent_credentials, the cache is updated automatically; talk_to_hermes_agent also re-reveals once on Hermes 401/403. Do not paste Hermes runtime credentials into MCP config, and you should not need to restart Cursor to pick up a rotated Hermes key. SeaOtter re-pins Hermes platform runtime credentials into the agent PVC .env from the mounted Secret on every boot so Hermes dotenv cannot drift from GSM; SeaOtter-managed integration keys are not persisted there. The control plane verifies rotate against authenticated /v1/models before succeeding.
Connection-key lifecycle
Visiting Connect does not create a key. A workspace admin must choose a client and explicitly select Create key. SeaOtter retains one active MCP key per client purpose (cursor, claude, or codex); replacing it revokes the previous key immediately.
Hobby users without a team receive a one-seat personal workspace automatically and are admins of that workspace.
The full secret is shown once and cleared from the dashboard after 45 seconds. After you create a Cursor key, Connect opens the Cursor install deeplink (and copies JSON as a fallback). Treat that URL like the secret — do not share or bookmark it. Settings shows the key prefix, purpose, creation time, and last-used time so admins can identify and revoke stale credentials. Legacy keys named MCP connect should be replaced with per-client keys, then revoked.
Confirm gating (tier 3)
Destructive Hermes CLI tools and some control-plane actions requireconfirm: true. The calling model should restate the action in plain language and wait for your OK before setting that flag.
Examples: hermes_uninstall, hermes_checkpoints_clear, delete_agent, restore_agent.
No --yolo
Hermes’ --yolo flag skips local approval prompts. It is excluded from the MCP and control-plane exec allowlists so a remote chat message cannot disable the agent’s own safety net.
Secrets
Hermes recommends loading provider keys from an external secret manager at startup instead of storing them in.env. SeaOtter-managed integration keys follow that path.
Audit
EveryPOST /agents/{id}/exec call is audit-logged (argv, org, actor, exit code, timestamp). Interactive OAuth / TUI flows are not scripted — use the dashboard link (tier 4).
Tier 4 interactive flows
hermes model, OAuth hermes auth, full hermes setup, desktop/GUI, WhatsApp pairing, and egress setup cannot be represented as a single non-interactive call. MCP returns dashboard_handoff_url instead.
