Agent operations center over MCP — orchestration, persistent memory, scheduling, and multi-agent coordination in one Rust binary. https://univerlab.org/canopy/
See the code ██████ ██████ ████████ ██████ ████████ █████ ████
███░░███ ░░░░░███ ░░███░░███ ███░░███░░███░░███░░███ ░███
░███ ░░░ ███████ ░███ ░███ ░███ ░███ ░███ ░███ ░███ ░███
░███ ███ ███░░███ ░███ ░███ ░███ ░███ ░███ ░███ ░███ ░███
░░██████ ░░████████ ████ █████░░██████ ░███████ ░░███████
░░░░░░ ░░░░░░░░ ░░░░ ░░░░░ ░░░░░░ ░███░░░ ░░░░░███
░███ ███ ░███
█████ ░░██████
░░░░░ ░░░░░░
harness-canopy is a modern, self-contained MCP (Model Context Protocol) server and TUI for orchestrating AI agent sessions, background tasks, and file event triggers. Designed for reliability, modularity, and performance — it enables advanced scheduling, persistent knowledge graphs, multi-agent coordination, loop automation, and interactive terminal management with zero runtime dependencies.

canopy orchestrates AI agent tools — it doesn't ship one. Before installing, you need at least one supported platform installed and authenticated on this machine. "Installed" is not enough: the most common first failure is a platform that's present but not logged in, and canopy has no way to tell you apart from "canopy is broken."
canopy calls each supported AI tool a platform. Most ship as a
standalone terminal command (claude, codex, gemini, ...); a few —
Cursor, Antigravity, Qoder — ship as a code editor with one built in.
canopy drives either kind the same way, through the CLI binary each one
exposes, so editors show up in the same list as terminal tools.
| Platform | Binary | Ships as |
|---|---|---|
| claude | claude | terminal (Claude Code) |
| codex | codex | terminal (Codex CLI) |
| gemini | gemini | terminal (Gemini CLI) |
| copilot | copilot | terminal (GitHub Copilot CLI) |
| qwen | qwen | terminal (Qwen Code) |
| mistral | vibe | terminal (Mistral's Vibe CLI) |
| opencode | opencode | terminal (OpenCode) |
| kiro | kiro-cli | terminal (Kiro) |
| kilo | kilo | terminal (Kilo Code) |
| cline | cline | editor (Cline, VS Code) |
| continue | cn | editor (Continue, VS Code/JetBrains) |
| blackbox | blackbox | terminal (Blackbox AI CLI) |
| mimocode | mimo | terminal (Mimo Code) |
| cursor | agent | editor (Cursor) |
| antigravity | agy | editor (Antigravity) |
| qoder | qoder | editor (Qoder) |
This list is drawn from the live platform registry
(index.toml); canopy setup re-fetches it, so newly added platforms show
up there before they show up here.
canopy doctor
Its "Harnesses" line confirms each configured platform's binary is present
and executable on PATH — it does not check that you're logged in.
There's no single command across all 16 platforms for that; check the
platform's own way, e.g. claude auth status or codex login status. Most
tools will otherwise tell you the moment you actually run them for real.
canopy setup is meant to detect nothing, say so, list every platform it
supports, and finish with zero platforms configured so you can install one
and re-run. In practice it doesn't reach that message: the registry fetch
(src/setup_module/registry_fetch.rs, try_fetch_v6 / try_fetch_v5 /
try_fetch_local) filters the platform list down to already-installed
binaries before returning it, and bails out if that filtered list is
empty — discarding the full list that the "no platforms detected" branch
(src/setup_module/wizard.rs:50-61) needs. Verified by running
canopy setup with no supported binary on PATH: the real registry path
fails with Error: Registry returned HTTP 404 Not Found (it falls through
to a dead legacy endpoint), and canopy setup --local-registry <dir> fails
with Error: Local registry not found or invalid at: <dir>. Either way,
setup exits instead of guiding you — this is a bug in canopy setup,
tracked separately, not fixed here.
Linux / macOS:
curl -fsSL https://raw.githubusercontent.com/UniverLab/harness-canopy/main/scripts/install.sh | sh
Or via cargo: cargo install harness-canopy (the binary is canopy).
See docs/installation.md for all methods and first-time setup.
Full documentation lives in docs/: installation, quick start, the
TUI, agents and seed identities, intelligence & sync, loops, the RAG
pipeline, all 83 MCP tools, and the complete CLI reference.
notify crate with configurable debouncing, recursive directory monitoring, and macOS FSEvents compatibility.osascript), Linux (notify-send).agent_probe tests whether a platform+model pair can actually respond before loop_run spends real quota on it. Probes the exact pair a node would use, not just the platform default.~/.canopy/seeds/<id>/identity.toml. Each seed has a unique name, family, behavioral directives, and personality traits. Binded sessions receive the seed's prompt injection automatically. The evolve_identity MCP tool lets agents refine themselves over time. 4 KB size cap, case-insensitive name uniqueness, and mandatory field validation.identity.toml and CLI-specific instruction files (e.g. CLAUDE.md, AGENTS.md) that guide the agent to interview the user and define the seed's personality. Validates and registers the seed on completion.project_hash (SHA-256 of canonical workdir path, truncated to 8 hex). Auto-detected from the session workdir — agents never need to set it manually.depends_on, complements, relates_to, independent) and query related projects for context enrichment.intelligence_get_context auto-detects the project, returns a curated mix of session knowledge, project facts, and related-project summaries.low/high/breaking) so peers can see what's happening.stable/unstable/testing) to coordinate safe concurrent work.sync_get_context returns active missions, recent chatter, and a computed workspace "vibe" (worst status among active intents).Specs, each with Nodes connected by Edges with routing conditions (pass/fail/always).spec_create, spec_list, spec_update, spec_delete.queue_create, queue_add_spec, queue_list, queue_remove_spec, queue_reorder.agent nodes invoke CLI tools with prompt templates; check nodes execute shell commands; gate nodes validate previous output (e.g., output_contains); router nodes classify and route by token matching with fallback; quorum is the engine-managed node that closes an ensemble.loop_add_ensemble creates a parallel group of 2-8 agent-node members sharing one prompt (or per-member prompt overrides for specialist panels), plus a wait-all quorum that consolidates their outputs and routes onward, in a single MCP call. loop_update_ensemble edits the shared prompt, member list, and quorum/exit config as one unit. See docs/loops.md.{name, kind, config} templates referenced by name in loop_add_node. Five builtins seeded at startup; custom blueprints via blueprint_create/blueprint_delete/blueprint_list.loop_schedule_autorun resumes failed/completed loops at a future time. Archive and restore loops without losing history. Export and import loop designs as shareable JSON documents. Copy nodes and ensembles within or across loops. View node run history for failure diagnosis.on_completed Hook — Post-completion agent execution (e.g. documentation maintenance) that fires once per completion.{{loop_name}}, {{workdir}}, {{spec_id}}, {{spec_name}}, {{spec_content}}, {{node_id}}, {{previous_feedback}}, and {{spec_start_head}} (git HEAD at spec start, for check nodes)..canopy/ragignore — Regex-based exclusion patterns for files and directories.◀ None / SeedName ▶), directory browser, and yolo mode toggle.Shift+Enter (Kitty keyboard protocol) sends prompts at a chosen time instead of immediately.{{TIMESTAMP}}, {{TASK_ID}}, {{LOG_PATH}}, {{FILE_PATH}}, {{EVENT_TYPE}} placeholders.## heading). Search and update via project_search and project_update MCP tools.get_tools MCP tool returns scope-sensitive action protocols (session_start, file_write, test_run, close_session, multi_agent) with risk levels and recommended tool sets.canopy setup detects installed AI CLIs from a GitHub-hosted registry, configures binary paths, model flags, headless modes, environment variables, and temperature units. Generates ~/.canopy/config.toml.canopy mcp subcommand for syncing, adding, and removing MCP server entries across all detected platforms with automatic format conversion (JSON ↔ TOML).~/.agents/skills/ with cross-platform symlinks. List, validate symlink integrity, and remove installed skills across platforms.canopy doctor checks data directory, database, config, harnesses, RAG status, file watchers, daemon process, registry connectivity, and auto-update health.| Category | Tools |
|---|---|
| Agent Management (14) | agent_add, agent_watch, agent_list, agent_remove, agent_enable, agent_disable, agent_schedule_enable, agent_run, agent_status, agent_models, agent_logs, agent_update, agent_report, agent_probe |
| Multi-Agent Sync (4) | sync_declare_intent, sync_report_status, sync_broadcast, sync_get_context |
| Intelligence V2 (8) | intelligence_get_context, intelligence_upsert, intelligence_search, intelligence_graph_walk, intelligence_list_projects, intelligence_link_projects, intelligence_delete_node, intelligence_delete_relation |
| Seed Identity (5) | get_identity, evolve_identity, create_seed, list_seeds, remove_seed |
| Loop Engine (32) | loop_create, loop_update, loop_add_spec, loop_update_spec, loop_add_node, loop_update_node, loop_add_edge, loop_update_edge, loop_delete_edge, loop_delete_node, loop_add_ensemble, loop_update_ensemble, loop_get, loop_list, loop_run, loop_reset, loop_schedule_autorun, loop_pause, loop_continue, loop_complete_node, loop_report_blocker, loop_export, loop_import, loop_archive, loop_restore, loop_node_runs_list, loop_node_run_get, loop_copy_node, loop_copy_ensemble, loop_audit_node_configs, loop_schedule_continue, loop_preflight |
| Spec Backlog (5) | spec_create, spec_list, spec_update, spec_delete, spec_set_status |
| Spec Queues (5) | queue_create, queue_add_spec, queue_list, queue_remove_spec, queue_reorder |
| Node Blueprints (3) | blueprint_list, blueprint_create, blueprint_delete |
| Project (3) | project_search, project_update, project_remap |
| RAG (1) | rag_search |
| Protocol (1) | get_tools |
application/ — Application ports and abstractionsautoupdate/ — Self-update system (GitHub releases)daemon/ — MCP server, handler, params, RAG CLI, doctordb/ — SQLite persistence and migrations (agents, runs, sessions, sync, intelligence, loops, projects, seeds, groups, state)domain/ — Core models: Agent, Trigger, WatchEvent, Project, SeedIdentity, Loop, LoopSpec, Queue, LoopNodeBlueprint, SyncMessage, IntelligenceNodeexecutor/ — Task and agent execution logicrag/ — RAG pipeline (ingestion, chunking, embedding, vector store, rate limiting)scheduler/ — Internal cron scheduler with template variablessync_manager/ — Multi-agent coordination broadcasttui/ — Terminal UI: agent management, dialogs, sidebar, system dashboard, context transferwatchers/ — File system watcher engineloop_engine/ — DAG loop execution engine| Data | Location | Format |
|---|---|---|
| Structured data | ~/.canopy/background_agents.db | SQLite (WAL mode) |
| Vector embeddings | ~/.canopy/rag/vectors.lancedb | LanceDB |
| Seed identities | ~/.canopy/seeds/<id>/identity.toml | TOML |
| Terminal history | ~/.canopy/terminals/<name>/history.toml | TOML |
| Configuration | ~/.canopy/config.toml | TOML |
| Agent logs | ~/.canopy/logs/<id>.log | Text (5 MB rotation) |
| Daemon log | ~/.canopy/daemon.log | Text |
| RAG indexed files | ~/.canopy/rag/ | Markdown, PDF |
Start the daemon:
canopy daemon start
Configure (first time):
canopy setup
Choose AI CLI platforms, model flags, temperature units, and RAG settings. Generates ~/.canopy/config.toml.
Launch the TUI:
canopy
Opens the full-screen Canopy Hub. Press Ctrl+N or n to create a new agent (Interactive, Background, or Terminal). Select a seed identity to give the agent a persistent personality.
Check health:
canopy doctor
Manage MCP servers across platforms:
canopy mcp
RAG indexing:
canopy rag auto-index start # Start background watcher
canopy rag auto-index stop # Stop
canopy rag report # Per-file indexing report
All state persists in ~/.canopy/. The daemon auto-updates to stable releases every 24 hours.
|Rust 2021| Tokio | Axum | rusqlite | LanceDB | notify | vt100 | ratatui | clap | serde | tracing | fastembed |
MIT — see LICENSE for details.
An experiment of UniverLab — an open computational laboratory. Made with ❤️ by JheisonMB
Rust
99.9%
Agent operations center over MCP — orchestration, persistent memory, scheduling, and multi-agent coordination in one Rust binary. https://univerlab.org/canopy/
See the code ██████ ██████ ████████ ██████ ████████ █████ ████
███░░███ ░░░░░███ ░░███░░███ ███░░███░░███░░███░░███ ░███
░███ ░░░ ███████ ░███ ░███ ░███ ░███ ░███ ░███ ░███ ░███
░███ ███ ███░░███ ░███ ░███ ░███ ░███ ░███ ░███ ░███ ░███
░░██████ ░░████████ ████ █████░░██████ ░███████ ░░███████
░░░░░░ ░░░░░░░░ ░░░░ ░░░░░ ░░░░░░ ░███░░░ ░░░░░███
░███ ███ ░███
█████ ░░██████
░░░░░ ░░░░░░
harness-canopy is a modern, self-contained MCP (Model Context Protocol) server and TUI for orchestrating AI agent sessions, background tasks, and file event triggers. Designed for reliability, modularity, and performance — it enables advanced scheduling, persistent knowledge graphs, multi-agent coordination, loop automation, and interactive terminal management with zero runtime dependencies.

canopy orchestrates AI agent tools — it doesn't ship one. Before installing, you need at least one supported platform installed and authenticated on this machine. "Installed" is not enough: the most common first failure is a platform that's present but not logged in, and canopy has no way to tell you apart from "canopy is broken."
canopy calls each supported AI tool a platform. Most ship as a
standalone terminal command (claude, codex, gemini, ...); a few —
Cursor, Antigravity, Qoder — ship as a code editor with one built in.
canopy drives either kind the same way, through the CLI binary each one
exposes, so editors show up in the same list as terminal tools.
| Platform | Binary | Ships as |
|---|---|---|
| claude | claude | terminal (Claude Code) |
| codex | codex | terminal (Codex CLI) |
| gemini | gemini | terminal (Gemini CLI) |
| copilot | copilot | terminal (GitHub Copilot CLI) |
| qwen | qwen | terminal (Qwen Code) |
| mistral | vibe | terminal (Mistral's Vibe CLI) |
| opencode | opencode | terminal (OpenCode) |
| kiro | kiro-cli | terminal (Kiro) |
| kilo | kilo | terminal (Kilo Code) |
| cline | cline | editor (Cline, VS Code) |
| continue | cn | editor (Continue, VS Code/JetBrains) |
| blackbox | blackbox | terminal (Blackbox AI CLI) |
| mimocode | mimo | terminal (Mimo Code) |
| cursor | agent | editor (Cursor) |
| antigravity | agy | editor (Antigravity) |
| qoder | qoder | editor (Qoder) |
This list is drawn from the live platform registry
(index.toml); canopy setup re-fetches it, so newly added platforms show
up there before they show up here.
canopy doctor
Its "Harnesses" line confirms each configured platform's binary is present
and executable on PATH — it does not check that you're logged in.
There's no single command across all 16 platforms for that; check the
platform's own way, e.g. claude auth status or codex login status. Most
tools will otherwise tell you the moment you actually run them for real.
canopy setup is meant to detect nothing, say so, list every platform it
supports, and finish with zero platforms configured so you can install one
and re-run. In practice it doesn't reach that message: the registry fetch
(src/setup_module/registry_fetch.rs, try_fetch_v6 / try_fetch_v5 /
try_fetch_local) filters the platform list down to already-installed
binaries before returning it, and bails out if that filtered list is
empty — discarding the full list that the "no platforms detected" branch
(src/setup_module/wizard.rs:50-61) needs. Verified by running
canopy setup with no supported binary on PATH: the real registry path
fails with Error: Registry returned HTTP 404 Not Found (it falls through
to a dead legacy endpoint), and canopy setup --local-registry <dir> fails
with Error: Local registry not found or invalid at: <dir>. Either way,
setup exits instead of guiding you — this is a bug in canopy setup,
tracked separately, not fixed here.
Linux / macOS:
curl -fsSL https://raw.githubusercontent.com/UniverLab/harness-canopy/main/scripts/install.sh | sh
Or via cargo: cargo install harness-canopy (the binary is canopy).
See docs/installation.md for all methods and first-time setup.
Full documentation lives in docs/: installation, quick start, the
TUI, agents and seed identities, intelligence & sync, loops, the RAG
pipeline, all 83 MCP tools, and the complete CLI reference.
notify crate with configurable debouncing, recursive directory monitoring, and macOS FSEvents compatibility.osascript), Linux (notify-send).agent_probe tests whether a platform+model pair can actually respond before loop_run spends real quota on it. Probes the exact pair a node would use, not just the platform default.~/.canopy/seeds/<id>/identity.toml. Each seed has a unique name, family, behavioral directives, and personality traits. Binded sessions receive the seed's prompt injection automatically. The evolve_identity MCP tool lets agents refine themselves over time. 4 KB size cap, case-insensitive name uniqueness, and mandatory field validation.identity.toml and CLI-specific instruction files (e.g. CLAUDE.md, AGENTS.md) that guide the agent to interview the user and define the seed's personality. Validates and registers the seed on completion.project_hash (SHA-256 of canonical workdir path, truncated to 8 hex). Auto-detected from the session workdir — agents never need to set it manually.depends_on, complements, relates_to, independent) and query related projects for context enrichment.intelligence_get_context auto-detects the project, returns a curated mix of session knowledge, project facts, and related-project summaries.low/high/breaking) so peers can see what's happening.stable/unstable/testing) to coordinate safe concurrent work.sync_get_context returns active missions, recent chatter, and a computed workspace "vibe" (worst status among active intents).Specs, each with Nodes connected by Edges with routing conditions (pass/fail/always).spec_create, spec_list, spec_update, spec_delete.queue_create, queue_add_spec, queue_list, queue_remove_spec, queue_reorder.agent nodes invoke CLI tools with prompt templates; check nodes execute shell commands; gate nodes validate previous output (e.g., output_contains); router nodes classify and route by token matching with fallback; quorum is the engine-managed node that closes an ensemble.loop_add_ensemble creates a parallel group of 2-8 agent-node members sharing one prompt (or per-member prompt overrides for specialist panels), plus a wait-all quorum that consolidates their outputs and routes onward, in a single MCP call. loop_update_ensemble edits the shared prompt, member list, and quorum/exit config as one unit. See docs/loops.md.{name, kind, config} templates referenced by name in loop_add_node. Five builtins seeded at startup; custom blueprints via blueprint_create/blueprint_delete/blueprint_list.loop_schedule_autorun resumes failed/completed loops at a future time. Archive and restore loops without losing history. Export and import loop designs as shareable JSON documents. Copy nodes and ensembles within or across loops. View node run history for failure diagnosis.on_completed Hook — Post-completion agent execution (e.g. documentation maintenance) that fires once per completion.{{loop_name}}, {{workdir}}, {{spec_id}}, {{spec_name}}, {{spec_content}}, {{node_id}}, {{previous_feedback}}, and {{spec_start_head}} (git HEAD at spec start, for check nodes)..canopy/ragignore — Regex-based exclusion patterns for files and directories.◀ None / SeedName ▶), directory browser, and yolo mode toggle.Shift+Enter (Kitty keyboard protocol) sends prompts at a chosen time instead of immediately.{{TIMESTAMP}}, {{TASK_ID}}, {{LOG_PATH}}, {{FILE_PATH}}, {{EVENT_TYPE}} placeholders.## heading). Search and update via project_search and project_update MCP tools.get_tools MCP tool returns scope-sensitive action protocols (session_start, file_write, test_run, close_session, multi_agent) with risk levels and recommended tool sets.canopy setup detects installed AI CLIs from a GitHub-hosted registry, configures binary paths, model flags, headless modes, environment variables, and temperature units. Generates ~/.canopy/config.toml.canopy mcp subcommand for syncing, adding, and removing MCP server entries across all detected platforms with automatic format conversion (JSON ↔ TOML).~/.agents/skills/ with cross-platform symlinks. List, validate symlink integrity, and remove installed skills across platforms.canopy doctor checks data directory, database, config, harnesses, RAG status, file watchers, daemon process, registry connectivity, and auto-update health.| Category | Tools |
|---|---|
| Agent Management (14) | agent_add, agent_watch, agent_list, agent_remove, agent_enable, agent_disable, agent_schedule_enable, agent_run, agent_status, agent_models, agent_logs, agent_update, agent_report, agent_probe |
| Multi-Agent Sync (4) | sync_declare_intent, sync_report_status, sync_broadcast, sync_get_context |
| Intelligence V2 (8) | intelligence_get_context, intelligence_upsert, intelligence_search, intelligence_graph_walk, intelligence_list_projects, intelligence_link_projects, intelligence_delete_node, intelligence_delete_relation |
| Seed Identity (5) | get_identity, evolve_identity, create_seed, list_seeds, remove_seed |
| Loop Engine (32) | loop_create, loop_update, loop_add_spec, loop_update_spec, loop_add_node, loop_update_node, loop_add_edge, loop_update_edge, loop_delete_edge, loop_delete_node, loop_add_ensemble, loop_update_ensemble, loop_get, loop_list, loop_run, loop_reset, loop_schedule_autorun, loop_pause, loop_continue, loop_complete_node, loop_report_blocker, loop_export, loop_import, loop_archive, loop_restore, loop_node_runs_list, loop_node_run_get, loop_copy_node, loop_copy_ensemble, loop_audit_node_configs, loop_schedule_continue, loop_preflight |
| Spec Backlog (5) | spec_create, spec_list, spec_update, spec_delete, spec_set_status |
| Spec Queues (5) | queue_create, queue_add_spec, queue_list, queue_remove_spec, queue_reorder |
| Node Blueprints (3) | blueprint_list, blueprint_create, blueprint_delete |
| Project (3) | project_search, project_update, project_remap |
| RAG (1) | rag_search |
| Protocol (1) | get_tools |
application/ — Application ports and abstractionsautoupdate/ — Self-update system (GitHub releases)daemon/ — MCP server, handler, params, RAG CLI, doctordb/ — SQLite persistence and migrations (agents, runs, sessions, sync, intelligence, loops, projects, seeds, groups, state)domain/ — Core models: Agent, Trigger, WatchEvent, Project, SeedIdentity, Loop, LoopSpec, Queue, LoopNodeBlueprint, SyncMessage, IntelligenceNodeexecutor/ — Task and agent execution logicrag/ — RAG pipeline (ingestion, chunking, embedding, vector store, rate limiting)scheduler/ — Internal cron scheduler with template variablessync_manager/ — Multi-agent coordination broadcasttui/ — Terminal UI: agent management, dialogs, sidebar, system dashboard, context transferwatchers/ — File system watcher engineloop_engine/ — DAG loop execution engine| Data | Location | Format |
|---|---|---|
| Structured data | ~/.canopy/background_agents.db | SQLite (WAL mode) |
| Vector embeddings | ~/.canopy/rag/vectors.lancedb | LanceDB |
| Seed identities | ~/.canopy/seeds/<id>/identity.toml | TOML |
| Terminal history | ~/.canopy/terminals/<name>/history.toml | TOML |
| Configuration | ~/.canopy/config.toml | TOML |
| Agent logs | ~/.canopy/logs/<id>.log | Text (5 MB rotation) |
| Daemon log | ~/.canopy/daemon.log | Text |
| RAG indexed files | ~/.canopy/rag/ | Markdown, PDF |
Start the daemon:
canopy daemon start
Configure (first time):
canopy setup
Choose AI CLI platforms, model flags, temperature units, and RAG settings. Generates ~/.canopy/config.toml.
Launch the TUI:
canopy
Opens the full-screen Canopy Hub. Press Ctrl+N or n to create a new agent (Interactive, Background, or Terminal). Select a seed identity to give the agent a persistent personality.
Check health:
canopy doctor
Manage MCP servers across platforms:
canopy mcp
RAG indexing:
canopy rag auto-index start # Start background watcher
canopy rag auto-index stop # Stop
canopy rag report # Per-file indexing report
All state persists in ~/.canopy/. The daemon auto-updates to stable releases every 24 hours.
|Rust 2021| Tokio | Axum | rusqlite | LanceDB | notify | vt100 | ratatui | clap | serde | tracing | fastembed |
MIT — see LICENSE for details.
An experiment of UniverLab — an open computational laboratory. Made with ❤️ by JheisonMB
Rust
99.9%