ODIN Sentinel is a portable control layer for visible agent teams running across terminal panes, local CLIs, editors, and MCP-capable harnesses. It does not try to be another agent. It gives the agents a room, a roster, and a way to work without dissolving into chatter.
npm i -g @bradheitmann/odin-sentinel
Demo preview. This slot is reserved for a short boot walkthrough: register the server, call odin.get_startup_packet, bring up an executive office and one development pod, sign a team manifest, and exit cleanly.
No hand-copied protocol lore when MCP is available. Harnesses can load the startup packet and bootstrap skill directly from the server.
Not another agent. Not a hosted service. Not a private ritual. No hand-copied protocol lore.
Startup packets, role contracts, model/harness defaults, delegation envelopes, receipts, manifests, closeout checklists. One server. Many harnesses.
MIT. Source at github.com/bradheitmann/odin-sentinel.
Any MCP-capable harness can ask. Codex, Claude, Droid, Crush, Goose, Zed, OpenCode — or a client written in Rust, Go, Zig, or WebAssembly — all fit the same boundary when they can launch or bridge stdio MCP.
The boundary is plain MCP JSON-RPC. The protocol is portable. The roles are visible.
MCP-capable clients ┌─────────────────────────────────────────┐ │ Codex · Claude · Droid · Crush · UI │ └────────────────────┬────────────────────┘ ▼ ┌──────────────────────────┐ │ odin-sentinel │ │ mcp server · stdio │ └─────────────┬────────────┘ │ ┌───────────────────────┼───────────────────────┐ ▼ ▼ ▼ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ Resources │ │ Tools │ │ Exports │ │ protocol │ │ validate │ │ standalone │ │ roles │ │ startup │ │ protocol │ │ topology │ │ closeout │ │ snapshots │ └───────────────┘ └───────────────┘ └───────────────┘ │ │ │ └───────────────────────┼───────────────────────┘ ▼ ┌──────────────────────────┐ │ Visible role mesh │ │ EXEC · TEAM · DEV │ │ QA · ODIN · SHADOW │ └──────────────────────────┘
ODIN Sentinel is built for multi-pane agent coordination, with cmux as the preferred runtime surface. The MCP server can expose protocol tools anywhere MCP stdio is supported, but full team orchestration works best when agents are visible in a shared pane/session surface such as cmux.
npm i -g cmux.20.10 LTS or newer. Used for npx and the MCP server.git ≥ 2.40 · rg on PATH.Zero install required. Every config below uses npx -y to fetch the latest package at first run. No global install, no path bookkeeping.
Or install once: npm i -g @bradheitmann/odin-sentinel — then the executable is odin-sentinel-mcp.
# option a — install as a Claude Code plugin (recommended) claude plugin marketplace add bradheitmann/odin-sentinel claude plugin install sentinel-coordination-protocol@odin-sentinel
# option b — register the bare MCP server claude mcp add odin-sentinel -- npx -y -p @bradheitmann/odin-sentinel odin-sentinel-mcp
[mcp_servers.odin-sentinel] command = "npx" args = ["-y", "-p", "@bradheitmann/odin-sentinel", "odin-sentinel-mcp"]
{ "mcpServers": { "odin-sentinel": { "command": "npx", "args": ["-y", "-p", "@bradheitmann/odin-sentinel", "odin-sentinel-mcp"] } } }
"odin-sentinel": { "source": "custom", "command": "npx", "args": ["-y", "-p", "@bradheitmann/odin-sentinel", "odin-sentinel-mcp"] }
odin-sentinel: type: stdio cmd: npx args: ["-y", "-p", "@bradheitmann/odin-sentinel", "odin-sentinel-mcp"] enabled: true
{ "mcp": { "odin-sentinel": { "type": "stdio", "command": "npx", "args": ["-y", "-p", "@bradheitmann/odin-sentinel", "odin-sentinel-mcp"] } } }
{ "mcp": { "odin-sentinel": { "type": "local", "command": ["npx", "-y", "-p", "@bradheitmann/odin-sentinel", "odin-sentinel-mcp"], "enabled": true } } }
[mcp.stdio_servers.odin-sentinel] name = "odin-sentinel" command = "npx" args = ["-y", "-p", "@bradheitmann/odin-sentinel", "odin-sentinel-mcp"]
After the harness picks up the new config, hand your agent an instruction like the one below. It will read the protocol resources, follow the role contracts, and stay inside the SCP governance rules — no hand-copied ritual required.
| URI | Kind |
|---|---|
| odin://protocol/main | core |
| odin://protocol/roles | contract |
| odin://protocol/topology | topology |
| odin://protocol/model-profiles | defaults |
| odin://protocol/closeout | checklist |
| odin://protocol/delegation | contract |
| odin://protocol/receipts/boot | template |
| odin://protocol/receipts/team-manifest | template |
| odin://protocol/bootstrap-skill | skill |
| Name | Purpose | Group |
|---|---|---|
| odin.get_version | Server version and build identity. | meta |
| odin.get_startup_packet | Initial topology + role roster for a new session. | bootstrap |
| odin.get_role_profile | Role contract, defaults, and verification gates. | roles |
| odin.get_bootstrap_skill | Full Sentinel Coordination Protocol skill. | bootstrap |
| odin.validate_boot_receipt | Verify a session boot receipt against template. | validate |
| odin.validate_team_manifest | Verify a team manifest against template. | validate |
| odin.get_delegation_packet | Visible-role delegation envelope. | delegate |
| odin.validate_delegation_packet | Verify a delegation envelope is well-formed. | validate |
| odin.get_closeout_checklist | Park-for-continuity or full-shutdown checklist. | closeout |
| odin.get_runtime_notice | Current runtime advisories and warnings. | meta |
| odin.export_protocol_snapshot | Self-contained snapshot for non-MCP clients. | export |
| odin.compute_surface_layout | Compute pane-surface layout from inputs. | layout |
| odin.compute_surface_layout_gate | Gate layout decisions against current state. | layout |
| odin.compile_session_report | Compile end-of-session report from receipts. | report |
| odin.preview_telemetry_redaction | Preview redaction before submission. | privacy |
| odin.submit_session_report | Submit a compiled session report. | report |
| odin.get_telemetry_config | Active telemetry configuration and consent. | privacy |
Pipe a raw MCP initialize request into the server. A successful response confirms the server is on PATH, the protocol shake works, and the published serverInfo matches the version you expect.
# initialize → handshake → serverInfo $ printf '{"jsonrpc":"2.0","id":1,"method":"initialize", "params":{"protocolVersion":"2024-11-05", "capabilities":{},"clientInfo":{"name":"probe","version":"0"}}}\n' \ | npx -y -p @bradheitmann/odin-sentinel odin-sentinel-mcp {"serverInfo":{"name":"odin-sentinel","version":"0.4.6"}} ✓
Every field below is also exposed in the JSON-LD block at the bottom of this document. Agents crawling this page can lift the same metadata without parsing prose.