Decibel Tools API

HTTP interface to the Decibel MCP server. Supports the MCP protocol (SSE + StreamableHTTP), a REST convenience layer, and multi-agent coordination.

v{{VERSION}} {{FACADE_COUNT}} facades {{TOOL_COUNT}} actions MCP + REST + SSE
https://senken.pro

Authentication

When the server is started with --auth-token, all mutating endpoints require a Bearer token. Health and discovery endpoints are always public.

Authorization: Bearer YOUR_TOKEN

Alternatively, pass a license key for tier-gated access:

X-License-Key: YOUR_LICENSE_KEY

Error Handling

All endpoints return a consistent JSON envelope.

// Success
{ "status": "executed", ... }

// Error
{
  "status": "error",
  "error": "Human-readable message",
  "code": "ERROR_CODE"
}
CodeHTTPMeaning
UNAUTHORIZED401Missing or invalid auth token
RATE_LIMITED429Too many requests
MISSING_TOOL400Tool not found in registry
ACCESS_DENIED403Facade not in agent's allowlist or tier
BODY_TOO_LARGE413Request body exceeds 1MB
PARSE_ERROR400Invalid JSON in request body
NOT_DAEMON503Agent management endpoint requires daemon mode
TOOL_ERROR500Tool execution failed

SSE Transport

Server-Sent Events transport for the MCP protocol. Used by ChatGPT and other MCP clients that prefer streaming.

SSE /sse/ MCP over Server-Sent Events ▶

Opens a persistent SSE connection for bidirectional MCP communication. The server sends keepalive comments every 30 seconds to maintain the connection.

Connection

curl -N https://senken.pro/sse/

Details

MethodsGET (stream), POST (messages), DELETE (close)
Content-Typetext/event-stream
KeepaliveComment heartbeat every 30s (configurable via --sse-keepalive)
CORSAll origins allowed
AuthToken if set

Notes

The trailing slash matters for some clients (e.g., ChatGPT). Both /sse and /sse/ are accepted.

StreamableHTTP (JSON-RPC)

The primary MCP protocol endpoint. Supports the full MCP spec via JSON-RPC over HTTP.

POST /mcp MCP JSON-RPC endpoint ▶

Send MCP protocol messages (JSON-RPC 2.0). This is the recommended transport for programmatic access.

Example: List Tools

curl -X POST https://senken.pro/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/list",
    "params": {}
  }'

Example: Call a Tool

curl -X POST https://senken.pro/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "tools/call",
    "params": {
      "name": "sentinel",
      "arguments": {
        "action": "list_issues",
        "project_id": "my-project"
      }
    }
  }'

Supported Methods

MethodDescription
initializeInitialize MCP session
tools/listList available tools (facades)
tools/callExecute a tool
resources/listList available resources
resources/readRead a resource
prompts/listList available prompts
prompts/getGet a prompt

Details

MethodsGET, POST, DELETE
Content-Typeapplication/json
CORSAll origins allowed
AuthToken if set

List Tools

Discover available facades and their actions.

GET /tools List all available tools ▶

Returns all registered facades and their actions. Responds with JSON or HTML based on the Accept header.

Example

curl https://senken.pro/tools \
  -H "Accept: application/json"

Response

{
  "status": "executed",
  "version": "{{VERSION}}",
  "api_version": "v1",
  "tools": [
    {
      "name": "sentinel",
      "description": "Work tracking: epics, issues, incidents",
      "actions": ["create_issue", "list_issues", "log_epic", ...]
    },
    {
      "name": "swarm",
      "description": "Multi-agent sessions and signals",
      "actions": ["start_session", "join_session", "emit_signal", ...]
    }
  ]
}
AuthPublic

Execute Tool

Call any tool directly via the REST convenience layer.

POST /call Execute any tool by name ▶

Generic dispatch endpoint. Pass the tool name and arguments. The kernel routes to the correct facade and action.

Request

curl -X POST https://senken.pro/call \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer TOKEN" \
  -d '{
    "tool": "sentinel",
    "arguments": {
      "action": "list_issues",
      "project_id": "decibel-tools-mcp"
    }
  }'

Request Body

FieldTypeRequiredDescription
toolstringYesFacade or tool name
argumentsobjectYesTool-specific parameters

Response

{
  "status": "executed",
  "result": { ... }
}

Context Headers

Include optional headers to identify the calling agent and trace requests. See Context Headers.

AuthToken if set

Batch Execute

Execute multiple independent tool calls in parallel.

POST /batch Parallel multi-tool execution ▶

Send up to 20 calls in a single request. All calls execute concurrently via Promise.allSettled. Ideal for agent bootstrap (fetching context + issues + roadmap in one round-trip).

Request

curl -X POST https://senken.pro/batch \
  -H "Content-Type: application/json" \
  -H "X-Agent-Id: analyst-01" \
  -d '{
    "calls": [
      { "facade": "sentinel", "action": "list_issues", "params": { "project_id": "my-project" } },
      { "facade": "oracle", "action": "next_actions", "params": { "project_id": "my-project" } },
      { "facade": "context", "action": "refresh", "params": { "task": "status check" } }
    ],
    "context": {
      "agentId": "analyst-01",
      "runId": "run-abc"
    }
  }'

Request Body

FieldTypeRequiredDescription
callsarrayYesArray of call objects (max 20)
calls[].facadestringYesFacade name
calls[].actionstringYesAction name
calls[].paramsobjectNoAction parameters
contextobjectNoShared context for all calls

Response

{
  "status": "executed",
  "results": [
    { "status": "executed", ... },
    { "status": "executed", ... },
    { "status": "error", "error": "...", "code": "..." }
  ]
}
Max calls20 per batch
AuthToken if set

List Facades

Facade registry for agent bootstrap and capability discovery.

GET /facades Facade registry with tiers ▶

Returns all facades with their descriptions, actions, and tier. Use the tier query param to control verbosity.

Example

curl "https://senken.pro/facades?tier=compact"

Query Parameters

ParamValuesDescription
tierfull, compact, microDescription verbosity level (default: full)

Response

{
  "status": "executed",
  "facades": [
    {
      "name": "sentinel",
      "description": "Work tracking: epics, issues, incidents...",
      "actions": ["create_issue", "list_issues", "log_epic", ...],
      "tier": "core"
    }
  ],
  "facade_count": 30,
  "internal_tool_count": 170
}
AuthPublic

Agent Connect

Register an agent with the daemon's agent registry. Required for multi-agent coordination.

POST /connect Agent handshake ▶

Registers an agent with the daemon. Returns the agent's capabilities, allowed facades, tier, and rate limit. Only available in daemon mode.

Request

curl -X POST https://senken.pro/connect \
  -H "Content-Type: application/json" \
  -d '{
    "agent_id": "analyst-01",
    "capabilities": ["sentinel", "oracle", "context"]
  }'

Request Body

FieldTypeRequiredDescription
agent_idstringYesUnique agent identifier
capabilitiesstring[]NoFacade names the agent needs

Response

{
  "status": "executed",
  "agent_id": "analyst-01",
  "connected_at": "2026-03-30T19:35:00.000Z",
  "capabilities": ["sentinel", "oracle", "context"],
  "allowed_facades": ["sentinel", "oracle", "context"],
  "tier": "pro",
  "rate_limit_rpm": 100
}
RequiresDaemon mode (--daemon)
Error503 NOT_DAEMON if not in daemon mode

Agent Disconnect

Gracefully unregister an agent from the daemon.

POST /disconnect Graceful agent disconnect ▶

Request

curl -X POST https://senken.pro/disconnect \
  -H "Content-Type: application/json" \
  -d '{ "agent_id": "analyst-01" }'

Response

{
  "status": "executed",
  "agent_id": "analyst-01",
  "disconnected": true
}

List Agents

See all currently connected agents.

GET /agents List connected agents ▶

Example

curl https://senken.pro/agents

Response

{
  "status": "executed",
  "agents": [
    {
      "id": "analyst-01",
      "connected_at": "2026-03-30T19:35:00.000Z",
      "capabilities": ["sentinel", "oracle"],
      "last_seen": "2026-03-30T19:40:00.000Z"
    }
  ],
  "count": 1
}
AuthPublic

Event Stream

Real-time SSE stream of dispatch events. Monitor tool calls as they happen.

SSE /events/stream Real-time dispatch events ▶

Opens an SSE stream that emits every tool dispatch as it happens. Useful for dashboards, audit logs, and debugging agent behavior.

Example

curl -N "https://senken.pro/events/stream?agent_id=analyst-01"

Query Parameters

ParamTypeDescription
agent_idstringFilter by agent (optional)
facadestringFilter by facade (optional)

Event Format

data: {
  "timestamp": "2026-03-30T19:35:12.345Z",
  "agentId": "analyst-01",
  "facade": "sentinel",
  "action": "list_issues",
  "duration_ms": 42,
  "status": "ok"
}
AuthPublic

Query Events

Query the dispatch event log for historical tool calls.

GET /events Query dispatch event log ▶

Query Parameters

ParamTypeDescription
sinceISO 8601Events after this timestamp
agent_idstringFilter by agent
limitnumberMax events (default: 100)

Response

{
  "status": "executed",
  "events": [ ... ],
  "total": 42
}

Health Check

System health and runtime info.

GET /health Detailed health check ▶

Response

{
  "status": "ok",
  "version": "{{VERSION}}",
  "api_version": "v1",
  "uptime_ms": 3600000,
  "uptime_human": "1h 0m 0s",
  "pid": 12345,
  "facade_count": 30,
  "internal_tool_count": 170,
  "connected_clients": 2,
  "active_requests": 0,
  "connected_agents": 3,
  "pro": true,
  "license_tier": "pro",
  "supabase_configured": true
}
AuthPublic

Readiness Probe

GET /ready K8s/orchestrator readiness probe ▶

Returns 200 when the server is ready to accept requests, 503 otherwise.

{ "ready": true, "facade_count": 30 }

Context Headers

Optional headers for multi-agent tracing and access control. Passed through to the dispatch kernel on every /call and /batch request.

HeaderDescription
X-Agent-IdAgent identifier (used for rate limiting, event attribution, facade scoping)
X-Run-IdRun/session ID for grouping related calls
X-Parent-Call-IdParent call ID for distributed tracing
X-ScopeScope hint for the kernel
X-Engagement-ModeEngagement mode selector
X-User-KeyUser identifier
X-Request-IdRequest tracking ID
X-License-KeyLicense key (overrides config for tier resolution)
X-Allowed-FacadesComma-separated facade whitelist (restricts which facades this call can access)

Rate Limiting

Sliding window rate limiter, scoped per IP or per agent.

Default: 100 requests per minute per IP. Agents registered via /connect get their own limit that can be configured in the daemon config.

When rate limited, the server returns:

HTTP 429
{
  "status": "error",
  "error": "Rate limited",
  "code": "RATE_LIMITED"
}

Facade Tiers

Facades are grouped into three access tiers. In development, all tiers are enabled. In production, pro and apps tiers require environment variables or a valid license key.

TierCountGateFacades
core 21 Always available sentinel, architect, dojo, designer, git, workflow, oracle, roadmap, vector, context, auditor, forecast, velocity, coordinator, swarm, friction, registry, feedback, learnings, provenance, bench, guardian
pro 4 License key required voice, studio, corpus, agentic
apps 2+ DECIBEL_APPS=1 senken, mother, terminal

Decibel Tools v{{VERSION}} · @decibelsystems/tools on npm · Built by Decibel Systems