CntrlNode is a single binary that gives your AI agents shared state, recursive task cancellation, and capability-based discovery. No cloud dependency. Works with any framework.
docker run -p 7474:7474 ghcr.io/meetpatell07/cntrlnode:latestEvery multi-agent team rebuilds these from scratch
Four primitives. One binary. No lock-in.
Key-value state namespaced by workflow. Agents read and write the same data with optimistic locking and real-time SSE subscriptions.
Submit tasks that form a parent-child tree. Cancel a parent and every descendant is cancelled automatically — no orphan agents.
Agents register with capability tags. Discover them by tag or natural-language query via local Ollama embeddings. No cloud calls.
Claude agents call CntrlNode tools natively via the Model Context Protocol. Works with Claude Desktop and Claude Code.
Connect two agents with shared state in under 15 lines.
import { CntrlNodeClient } from '@cntrlnode/sdk'
const client = new CntrlNodeClient({ baseUrl: 'http://localhost:7474' })
// Agent A writes shared state
await client.state.set('wf-123', 'status', { step: 'researching' })
// Agent B reads it
const { value } = await client.state.get('wf-123', 'status')
// Submit a task to any registered agent
const task = await client.tasks.submit({
workflowId: 'wf-123',
agentId: 'researcher-1',
payload: { query: 'summarise Q4 results' },
})
// Cancel the whole tree when done
await client.tasks.cancel(task.id)from cntrlnode import CntrlNodeClient
client = CntrlNodeClient(base_url="http://localhost:7474")
# Agent A writes shared state
await client.state.set("wf-123", "status", {"step": "researching"})
# Agent B reads it
entry = await client.state.get("wf-123", "status")
# Submit a task
task = await client.tasks.submit(
workflow_id="wf-123",
agent_id="researcher-1",
payload={"query": "summarise Q4 results"},
)
# Cancel the whole tree
await client.tasks.cancel(task["id"])Start CntrlNode with Docker or download the binary. Zero config needed in dev mode — it starts with an embedded database.
Each agent registers itself with tags describing its capabilities. They share state and delegate tasks through CntrlNode.
Agents read and write shared state, spawn child tasks, and cancel subtrees. CntrlNode propagates cancellations automatically.