v0.1.0-alpha · Open Source · Self-hosted

Coordination infrastructure
for multi-agent AI

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:latest

Every multi-agent team rebuilds these from scratch

Shared state between agents
Cancellation that propagates
Finding the right agent
Context handoff on delegation

Everything you need to coordinate agents

Four primitives. One binary. No lock-in.

Shared State Store

Key-value state namespaced by workflow. Agents read and write the same data with optimistic locking and real-time SSE subscriptions.

Task Tree + Cancellation

Submit tasks that form a parent-child tree. Cancel a parent and every descendant is cancelled automatically — no orphan agents.

Agent Registry

Agents register with capability tags. Discover them by tag or natural-language query via local Ollama embeddings. No cloud calls.

MCP Bridge

Claude agents call CntrlNode tools natively via the Model Context Protocol. Works with Claude Desktop and Claude Code.

Up in 60 seconds

Connect two agents with shared state in under 15 lines.

TypeScript
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)
Python
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"])

How it works

01

Run the binary

Start CntrlNode with Docker or download the binary. Zero config needed in dev mode — it starts with an embedded database.

02

Agents connect

Each agent registers itself with tags describing its capabilities. They share state and delegate tasks through CntrlNode.

03

Coordinate

Agents read and write shared state, spawn child tasks, and cancel subtrees. CntrlNode propagates cancellations automatically.

Start building today

Self-hosted. Open source. No account required.