trackmcp
Back to directory
jpicklyk

task-orchestrator

View on GitHub

Server-enforced workflow discipline for AI agents. An MCP server providing persistent work items, dependency graphs, quality gates, and actor attribution. Schemas define what agents must produce — the server blocks the call if they don't. Works with any MCP-compatible client.

206 stars KotlinOthers Updated Sep 4, 2026
ai-coding-assistantai-developmentai-memoryai-toolsclaudeclaude-codeclaude-desktopcontext-persistencedeveloper-toolsmcpmcp-servermodel-context-protocoltask-managementvibe-codingworkflow-automationai-harnessharness-engineeringharness-framework

Documentation

MCP Task Orchestrator

Server-enforced workflow discipline for AI agents.

Prompt-based frameworks hope the LLM follows instructions. This one blocks the call if it doesn't.

Version
CI
License: MIT
MCP Compatible

The Problem

Multi-agent workflows need infrastructure the model doesn't provide. When an orchestrator dispatches sub-agents across sessions, there's no built-in way to enforce what documentation must exist before work starts, track which agent made which change, or guarantee dependency ordering across a work breakdown. These are structural concerns — they belong in the server, not in prompts.

A Different Approach

Task Orchestrator is an MCP server — not a prompt layer. It provides 14 tools that give any MCP-compatible AI agent a persistent work item graph with server-enforced quality gates. The enforcement happens at the tool level: if a required design note isn't filled, `advance_item` returns an error. If a dependency isn't satisfied, the transition is blocked. If actor authentication is enabled and an agent doesn't identify itself, the call is rejected before it reaches the server.

The rules live in the server, not the conversation.

What this means in practice:

  • An agent can't start implementation without filling the required specification note
  • A sub-agent can't advance a blocked task until its upstream dependency is complete
  • Every transition and note records *who* made the change (actor attribution)
  • Auditing mode blocks any write operation where the agent doesn't identify itself
  • A new session picks up exactly where the last one left off — persistent state, not conversation replay
  • Workflow schemas are YAML config, not hardcoded prompts — change the rules without changing code

How It's Different

Prompt-Based FrameworksTask Orchestrator
EnforcementInstructions that agents should followServer blocks the call if rules aren't met
PersistenceFile-based stateSQLite database with structured queries
AccountabilityNo concept of which agent did whatActor attribution with pluggable verification (JWKS)
Dependency orderingSequenced by prompt conventionServer validates dependency graphs before allowing transitions
Session continuityConversation history or file reconstruction`get_context()` returns full state in one call
PortabilityTied to one AI clientWorks with any MCP-compatible client

Core Capabilities

Workflow Enforcement

Schemas define what agents must produce at each phase — and the server blocks progression until it's done. But schemas do more than gate transitions. They set a planning floor: when an agent enters plan mode, the schema tells it what documentation must exist before implementation can start, shaping the plan structure itself.

yaml
# .taskorchestrator/config.yaml
work_item_schemas:
  feature-task:
    notes:
      - key: requirements
        role: queue
        required: true
        description: "Acceptance criteria before starting"
        guidance: "Cover: problem statement, acceptance criteria, alternatives considered, test strategy."
        skill: "spec-quality"
      - key: implementation-notes
        role: work
        required: true
        description: "What was built and why"

`advance_item(trigger="start")` from queue requires `requirements` to be filled. No exceptions, no prompt-dependent compliance — the server returns an error with exactly which notes are missing.

The `guidance` field provides authoring instructions surfaced at the right moment — when the agent is about to fill that note, `get_context` returns the guidance as a `guidancePointer`. The `skill` field takes this further: it references a specific skill that the agent must invoke before filling the note, providing a deterministic evaluation framework rather than freeform prose. Together, they create structured agent behavior that's configured in YAML, not hardcoded in prompts.

Composable Traits

Traits add cross-cutting note requirements to any schema without duplicating definitions. Define a trait once, apply it to any item type:

yaml
traits:
  needs-security-review:
    notes:
      - key: security-assessment
        role: review
        required: true
        description: "Security review of auth, data handling, and access control"
        skill: "security-review"

work_item_schemas:
  feature-task:
    default_traits:
      - needs-security-review
    notes:
      # ... base notes

Every `feature-task` item automatically inherits the `security-assessment` note requirement. Traits can also be applied per-item via the `traits` parameter on `manage_items` — a task touching authentication gets `needs-security-review` while a CSS cleanup doesn't.

Persistent Work Item Graph

Everything is a WorkItem in a hierarchical graph. Items nest up to 4 levels deep, connected by typed dependency edges. Create an entire work breakdown atomically:

code
create_work_tree(
  root={ "title": "User Authentication" },
  children=[
    { "ref": "schema", "title": "Database schema" },
    { "ref": "api",    "title": "Login API" },
    { "ref": "tests",  "title": "Integration tests" }
  ],
  deps=[
    { "from": "schema", "to": "api" },
    { "from": "api",    "to": "tests" }
  ]
)

When `schema` reaches terminal, `api` is automatically unblocked. When all children complete, the parent cascades to terminal. Dependency ordering is enforced by the server — structurally, not by convention.

Actor Attribution & Auditing

Every `advance_item` transition and `manage_notes` upsert accepts an optional actor claim:

json
{
  "actor": {
    "id": "impl-agent-42",
    "kind": "subagent",
    "parent": "orchestrator-1"
  }
}

Enable actor authentication in config to require it:

yaml
actor_authentication:
  enabled: true

When enabled, calls without actor claims are blocked before reaching the server. Query responses include the full delegation chain — which orchestrator dispatched which sub-agent, who wrote which note, who made which transition. Post-mortem debugging becomes a data query, not a conversation archaeology exercise.

Session Continuity

No context rebuilding. One call recovers the full picture:

code
get_context(since="2025-01-15T09:00:00Z", includeAncestors=true)

Returns active items, recent transitions (with actor attribution), blocked items, stalled items with missing notes, and full ancestor chains. A new session has complete state in a single response.

Notes as Structured Context

Notes provide targeted, phase-specific documentation attached to work items. An implementation agent reads a concise requirements note scoped to its task rather than scanning broader project context.

Notes are keyed, role-scoped, and queryable:

code
query_notes(itemId="", role="work", includeBody=false)

Metadata-only queries (`includeBody=false`) let agents check what exists without paying the token cost of reading every note body.

Search across all work items and notes by keyword. Results are relevance-ranked, so agents surfacing related work or picking up after a long gap get the most relevant matches first — not just a flat list.

code
query_items(operation="search", query="authentication login")
query_notes(operation="search", query="password validation")

Search can be scoped to a subtree, filtered by status or tag, or run across the entire workspace. Agents use this to find related work before starting something new, or to locate a specific note without knowing which item it's attached to.

Design Philosophy

Task Orchestrator enforces workflow structure without imposing methodology. The server owns the guardrails — role transitions, dependency ordering, gate enforcement, and accountability. Agents own everything else. There are no mandatory planning ceremonies, no prescribed development processes, no opinion on how agents approach implementation. Schemas, traits, and actor authentication are opt-in layers that integrate with your team's development policies through `.taskorchestrator/config.yaml`. As models gain new capabilities, the harness stays out of the way rather than constraining what agents can do.


Quick Start

Prerequisite: Docker installed and running.

If you work across multiple projects, set up once and every project you open just works: run

one persistent server with the REST API on, and each project's `.taskorchestrator/config.yaml` syncs

into it automatically via `config-sync` — no per-project container, no manual config mounting.

Pull the image, then run the plugin's `/configure-server` skill (or use the equivalent manual setup

below) to stand up a persistent local server:

bash
docker pull ghcr.io/jpicklyk/task-orchestrator:latest

docker run -d --name mcp-task-orchestrator-http --restart unless-stopped \
  -v mcp-task-data:/app/data \
  -e MCP_TRANSPORT=http -e API_ENABLED=true -e API_AUTH_MODE=none -e API_ALLOW_UNAUTHENTICATED=true \
  -p 127.0.0.1:3001:3001 \
  ghcr.io/jpicklyk/task-orchestrator:latest

Register it in `.mcp.json` (HTTP shape — not an args array):

json
{
  "mcpServers": {
    "mcp-task-orchestrator": {
      "type": "http",
      "url": "http://localhost:3001/mcp"
    }
  }
}

And export the client-side env so `config-sync` can find the server (without this, config-sync

silently no-ops):

bash
export TASK_ORCHESTRATOR_API_URL=http://localhost:3001

> SECURITY: unauthenticated REST means anyone who can reach the port has full read/write/delete

> access. This is only safe because the port is published loopback-only (`-p 127.0.0.1:3001:3001`).

> Never publish it on `0.0.0.0` or a wider interface.

Prefer not to wire this up by hand? Install the plugin and run `/configure-server` — it renders

all of the above (plus the bearer-token and STDIO alternatives) interactively.

Simpler alternative: STDIO, no config-sync

If you don't want a persistent daemon and are fine hand-mounting each project's config, STDIO is the

simpler no-setup option — a per-session container, no port, no REST API:

bash
claude mcp add-json mcp-task-orchestrator '{
  "command": "docker",
  "args": [
    "run", "--rm", "-i",
    "-v", "mcp-task-data:/app/data",
    "ghcr.io/jpicklyk/task-orchestrator:latest"
  ]
}'

Or add the same shape to `.mcp.json`:

json
{
  "mcpServers": {
    "mcp-task-orchestrator": {
      "command": "docker",
      "args": [
        "run", "--rm", "-i",
        "-v", "mcp-task-data:/app/data",
        "ghcr.io/jpicklyk/task-orchestrator:latest"
      ]
    }
  }
}

Restart your client. The server auto-initializes on first run — no setup required.

To activate workflow schema gates on STDIO, mount the project's config directly instead of relying on

config-sync:

json
{
  "mcpServers": {
    "mcp-task-orchestrator": {
      "command": "docker",
      "args": [
        "run", "--rm", "-i",
        "-v", "mcp-task-data:/app/data",
        "-v", "${workspaceFolder}/.taskorchestrator:/project/.taskorchestrator:ro",
        "-e", "AGENT_CONFIG_DIR=/project",
        "ghcr.io/jpicklyk/task-orchestrator:latest"
      ]
    }
  }
}

Without schemas, all 14 tools work in schema-free mode — no gates, no required notes. Add schemas when you want enforcement.


Claude Code Plugin

The plugin adds workflow automation on top of the MCP server — skills, hooks, and an orchestrator output style.

Install:

code
/plugin marketplace add https://github.com/jpicklyk/task-orchestrator
/plugin install task-orchestrator@task-orchestrator-marketplace

What it adds:

LayerWhat it does
SkillsSlash commands for common workflows — `/task-orchestrator:create-item`, `/task-orchestrator:manage-schemas`, `/task-orchestrator:quick-start`, `/task-orchestrator:configure-server`
HooksAutomatic context injection at session start, plan mode integration, sub-agent context handoff, actor attribution enforcement
Output styleWorkflow Orchestrator mode — Claude plans, delegates to sub-agents, and tracks progress without writing code directly

The MCP server works without the plugin. The plugin makes it seamless with Claude Code.


14 MCP Tools

CategoryToolsPurpose
Graph`manage_items`, `query_items`, `create_work_tree`, `complete_tree`Build and query the work item hierarchy
Notes`manage_notes`, `query_notes`Persistent phase-scoped documentation
Dependencies`manage_dependencies`, `query_dependencies`Typed edges with pattern shortcuts (linear, fan-out, fan-in)
Workflow`advance_item`, `get_next_status`, `get_context`, `get_next_item`, `get_blocked_items`, `claim_item`Trigger-based transitions with gate enforcement, dependency validation, and atomic find-and-claim (selector mode) for multi-agent fleets

Every tool supports short hex ID prefixes — `advance_item(itemId="a3f2")` instead of full UUIDs.


What It Looks Like in Practice

code
Morning — new session, new agent, zero context:

Agent: get_context(since="2025-01-14T17:00:00Z")
       → 2 items in work, 1 blocked, 1 stalled (missing implementation-notes)
       → Recent transitions show orchestrator-1 dispatched 3 sub-agents yesterday
       → Full ancestor chains: "Auth Feature > Login API > Input validation"

Agent: advance_item(trigger="start", itemId="a3f2",
         actor={ id: "morning-agent", kind: "subagent", parent: "orchestrator-1" })
       → Error: "Gate check failed: required notes not filled for queue phase: requirements"

Agent: manage_notes(upsert, itemId="a3f2", key="requirements",
         body="Validate email format, enforce password complexity...",
         actor={ id: "morning-agent", kind: "subagent" })
       → Upserted. guidancePointer: null, noteProgress: { filled: 1, remaining: 0, total: 1 }

Agent: advance_item(trigger="start", itemId="a3f2",
         actor={ id: "morning-agent", kind: "subagent" })
       → queue → work. No context rebuilding. No conversation replay.
       → Actor recorded. Traceable. Accountable.

Documentation

ResourceWhat's there
**Quick Start Guide**Full setup walkthrough with first work item
**API Reference**All 14 MCP tools — parameters, response shapes, actor attribution
**REST API Reference**HTTP REST endpoints, DTOs, SSE, auth, merge-patch, ETag
**Workflow Guide**Schemas, phase gates, dependencies, lifecycle modes
**Fleet Deployment**Multi-agent operators: REST API auth, MCP actor identity, SQLite tuning, capacity planning
**Wiki**Full documentation hub
**Changelog**Release history
**Contributing**Developer setup and contribution process

Technical Stack

  • Kotlin 2.3.21 with Coroutines
  • SQLite + Exposed ORM — zero-config persistent storage with FTS5 full-text search (bundled automatically)
  • Flyway Migrations — versioned schema management
  • MCP SDK 0.12.0 — STDIO and HTTP transport
  • Docker — one-command deployment

Clean Architecture (Domain > Application > Infrastructure > Interface) with comprehensive test coverage.

Key capabilities added in recent versions:

  • REST API — an HTTP REST layer (`API_ENABLED=true`) exposes items, notes, dependencies, transitions, config, and real-time SSE events to dashboards, CI systems, and operators. Supports static bearer tokens, JWKS JWT auth, and an opt-in unauthenticated loopback mode (`API_AUTH_MODE=none`) for single-developer local setups — see Quick Start above and `/configure-server`. See `current/docs/api-rest.md` for the full endpoint reference.
  • Full-text search — search work items and notes by keyword with ranked results (see Full-Text Search above)
  • Unbounded hierarchy depth — item trees are not capped at depth 3; cycle protection is enforced at the database level via a trigger
  • Backlinks — `query_dependencies(operation="backlinks")` finds all items that reference a given item (reverse-direction edge lookup)

License

MIT License — Free for personal and commercial use.

Frequently asked questions

What is task-orchestrator?

task-orchestrator is Server-enforced workflow discipline for AI agents. An MCP server providing persistent work items, dependency graphs, quality gates, and actor attribution. Schemas define what agents must produce — the server blocks the call if they don't. Works with any MCP-compatible client.

How do I install task-orchestrator?

Open the GitHub repository and follow its README. Most MCP servers are added to your client's MCP config, then called by your agent.

Is task-orchestrator open source?

Yes — it is hosted on GitHub at https://github.com/jpicklyk/task-orchestrator and has 206 stars.

Related MCP tools

riponcmprojectmem

Open-source coding agent memory. Records issues, attempts, fixes and decisions, then warns your agent before it repeats an approach that already failed. Native MCP server for Claude Code, Cursor, Antigravity and Codex. 100% local, no cloud, no telemetry. MIT.

796 Python
ai-agentsai-memoryai-tools+17
IvanMurzakUnity-MCP

AI Skills, MCP Tools, and CLI for Unity Engine. Full AI develop and test loop. Use cli for quick setup. Efficient token usage, advanced tools. Any C# method may be turned into a tool by a single line. Works with Claude Code, Gemini, Copilot, Cursor and any other absolutely for free.

4,137 C#
aiai-integrationgame-development+16
jgravellejcodemunch-mcp

Cut AI token costs 95%+ on code exploration. The leading MCP server for precise, symbol-level GitHub code retrieval via tree-sitter AST. Works with Claude Code, Cursor & any MCP client. 313B+ tokens saved.

2,651 Python
claudeclaude-codeai-coding+17
KnockOutEZwigolo

The go-to web for your AI coding agent — local-first search, fetch, crawl & research over MCP. No API keys, no cloud, $0/query. Public beta.

4,906 TypeScript
mcpagentai+17
taylorwilsdongoogle_workspace_mcp

Control Gmail, Google Calendar, Docs, Sheets, Slides, Chat, Forms, Tasks, Search & Drive with AI - Comprehensive Google Workspace MCP Server & CLI Tool

3,117 Python
aigmailgoogle-calendar+17
atlassianatlassian-mcp-server

Official remote MCP server for Atlassian. Securely connect Jira, Confluence, Jira Service Management, Bitbucket, and Compass to Claude, ChatGPT, Cursor, VS Code, and other AI tools using OAuth 2.1 or API tokens.

1,015 JavaScript
aiai-agentsatlassian+17

Run your own MCP server? See who uses it and what to fix.

Measure it with TrackMCP