Skip to content

GlobalCan/control-tower-lite

Repository files navigation

Control Tower Lite

Minimal multi-agent coordination for Claude Code. Full security, zero dependencies.

A lightweight system for coordinating multiple Claude Code sessions on a single machine. 11 tools, HMAC auth, task DAGs, browser dashboard — built with the philosophy that every feature must justify its existence.

Tests Python Dependencies License

Quick Start

# 1. Install MCP server
python install.py

# 2. Start the broker
python launch.py

# 3. Open Claude Code — use the 'join' tool

Architecture

Architecture diagram

11 Tools

Tool Purpose Role
join Register + discover peers Everyone
send Message anyone (* for broadcast) Everyone
check Read inbox Everyone
create_task Create with dependencies Architect
list_tasks Filter by status Everyone
claim_task Atomic claim (fails if taken) Worker
complete_task Requires artifact summary Worker
lock_file Reserve a file path Everyone
unlock_file Release a lock Everyone
set_memory Shared key-value Architect
get_memory Read shared state Everyone

Design Philosophy

Every tool must justify its existence with a real use case.

Design Decisions

Decision Rationale
send handles broadcast recipient='*' replaces a separate broadcast tool. One tool, not two.
send handles blockers category='blocker' replaces a separate raise_blocker tool. Routing logic belongs in the broker.
No memory versioning If a decision changes, write a new key. History adds complexity without proportional value.
No worker spawning Platform-specific shell spawning is fragile across OS. Open a terminal — it takes 2 seconds.
No budget tracking Token budgets are useful but not essential for the core coordination workflow.
No conversation logging Audit logging is infrastructure, not a user-facing tool.

What's Non-Negotiable

Feature Why
HMAC-SHA256 auth Identity without auth is theater
Role-based access Architect/worker separation prevents workers from overwriting shared decisions
Identity enforcement Sender must match token — no spoofing
Content filtering Injection defense is not optional
Rate limiting 10 msg/min/peer prevents flooding
Dead peer recovery Task reassignment on crash keeps work moving

The principle: Security is not a feature to be cut. Everything else is negotiable.

Security

  • HMAC-SHA256 tokens — generated on registration, validated every request
  • Role-based access — architect creates tasks/memory, worker claims/completes
  • Identity enforcementsender_id must match authenticated peer
  • Content filtering — blocks tool_use XML, function_call JSON, data: URIs (NFKC normalized)
  • Rate limiting — 10 messages per minute per peer
  • Localhost only — bound to 127.0.0.1, never exposed

See SECURITY.md for the full security model.

File Structure

control-tower-lite/
  broker.py          # HTTP server + SQLite + auth + security
  mcp_server.py      # 11 MCP tools + heartbeat + identity
  dashboard.html     # Standalone status page
  install.py         # MCP server registration
  launch.py          # Start broker + open dashboard
  tests/
    test_broker.py   # 50 tests — auth, messaging, tasks, DAGs, locks, memory
  SECURITY.md        # Security model documentation
  README.md
  LICENSE            # MIT

License

MIT — see LICENSE.

About

Minimal multi-agent coordination for Claude Code. 11 tools, 5 tables, full security. Python stdlib only.

Topics

Resources

License

Security policy

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors