Skip to main content
Glama

When a coding agent dies mid-task, the task frees itself.

rhizome-mcp gives autonomous coding agents crash-safe task coordination over MCP: claims are renewable expiring leases, in_progress is derived — never stored — and an interrupted attempt hands its checkpoint to whichever session picks the work up next. One static Go binary, one SQLite database per project. No daemon, no accounts, no cloud.

It works with agents from different products at once — Claude Code, Codex, GitHub Copilot, VS Code, and any other MCP-compatible client — giving them one shared, durable view of project work.

Why · How it compares · Quick start · Monitor your project · MCP surface · Documentation

Why

AI coding agents are concurrent, context-limited, and interruptible. A TODO.md or a single chat context doesn't survive that. rhizome-mcp is built around those failure modes:

  • Crash-safe claiming. Issues are claimed atomically with renewable leases. in_progress is never a stored status — it is derived from an active lease, so a vanished agent can't lock an issue forever. When the lease expires, the issue becomes claimable again. A partial unique index guarantees at most one active attempt per issue at the database level.

  • Token-efficient by contract. Compact list projections (a 100-issue page stays under 64 KB — enforced by an integration test), graph nodes that exclude free-text bodies at the SQL layer, snippet-only search, delta sync via event IDs, and a bounded single-call work-context package.

  • Durable project memory. Checkpoints with next steps, supersedable decision records, append-only event history, and FTS5 full-text search across issues, comments, decisions, and notes. A fresh session resumes from the last checkpoint instead of re-deriving state.

  • Planning and dependency graphs. Cycle-checked blocks relations, epics, claimable entry-point highlighting, and atomic batch planning (up to 50 issues, 100 relations, and 20 decisions in one all-or-nothing transaction).

  • Review workflow. Review requests pin an exact issue version and event position; approving changed code is structurally impossible — a stale request can only be superseded and re-pinned.

  • Resource reservations. A claim can atomically reserve files, directories, globs, or logical resources (a port, a migration window, a deploy slot); an overlapping claim fails fast with the holder and its lease expiry named, instead of two agents colliding later.

  • Concurrency discipline throughout. Optimistic versioning on mutations, replay-safe idempotency keys, stable machine-actionable error codes.

  • Human observability without a server. rhizome-mcp board prints live leases, blockers, and the review queue, or writes a self-contained HTML snapshot; the CLI reads everything as tables, JSON, or Mermaid.

This repository tracks its own backlog through the server it ships — work is selected, claimed, checkpointed, and reviewed via rhizome-mcp itself (AGENTS.md).

Use it when several agent sessions (or several agent products) work the same repository over time and you need handoffs, parallel work, and recovery after crashes or context limits.

Skip it if you need a hosted multi-user tracker with auth, permissions, and a web UI — this is a local single-developer tool by design.

Related MCP server: memory-arbiter-mcp

How it compares

Compare agent task trackers on guarantees under failure, not on feature lists — local-first SQLite storage and MCP support are table stakes in this category.

When things go wrong

rhizome-mcp

beads

Kata

Guild

Task frees itself after a crash

Yes — expiring lease

No

No

No

Double-claim prevented at the storage layer

Yes

Atomic claim

Atomic claim

Atomic claim

Stale review approval impossible

Yes — version-pinned

No

No

No

Response sizes bounded by a tested contract

Yes — ≤ 64 KiB / 100 issues

No

No

No

Interrupted attempt resumable by another session

Yes — checkpoints

No

No

Note only

Full comparison with sources, pinned versions, and honest "choose X if" guidance: How rhizome-mcp compares.

Quick start

Install and run

Choose the approach that matches your workflow:

Zero-install trial via npm

Try rhizome-mcp immediately with no separate binary install, no Go toolchain:

npx rhizome-mcp serve

Works with any MCP client. See packages/npm/README.md for platform coverage. Great for quick evaluation.

Claude Code plugin

/plugin marketplace add Odrin/rhizome-mcp
/plugin install rhizome-mcp@rhizome

Registers the MCP server (via npx, no binary install) and adds the rhizome-task-workflow and rhizome-execution-plan skills. Each repository you track still needs a one-time npx rhizome-mcp init in its root.

VS Code

Install Rhizome MCP (odrin.rhizome-mcp) from the Marketplace or Open VSX. The extension bundles the platform binary, registers the MCP server automatically, and adds Rhizome: Initialize Project to the Command Palette. No terminal, no mcp.json editing. Details: docs/10-vscode-extension.md.

Prefer a standalone binary with a plain mcp.json entry instead? Install the binary below and use this one-click link: Add to VS Code.

Native binary installer

Download and install a release binary for your platform. Verifies checksums, installs to ~/.local/bin by default:

curl -fsSL https://raw.githubusercontent.com/Odrin/rhizome-mcp/main/scripts/install.sh | sh
irm https://raw.githubusercontent.com/Odrin/rhizome-mcp/main/scripts/install.ps1 | iex

Official MCP Registry

Use rhizome-mcp via the official MCP Registry, available in the Model Context Protocol registry as io.github.Odrin/rhizome-mcp for clients that consume the registry.

Initialize and connect

Initialize tracking inside your repository:

rhizome-mcp init

Then register the server with your MCP client. Automated setup for common clients:

rhizome-mcp connect claude    # Claude Code
rhizome-mcp connect codex     # Codex
rhizome-mcp connect vscode    # VS Code (if using standalone binary instead of extension)
rhizome-mcp connect json      # Template for any other client

Use --print for a dry run. connect discovers your project's actual root (walking up from the current directory the same way serve does) and pins it with --project-root, so the written config works regardless of which subdirectory an MCP client later launches the server from. All four targets (claude, codex, vscode, json) agree on this. The manual equivalent for any MCP client, matching connect's own server key:

{
  "mcpServers": {
    "rhizome-mcp": {
      "command": "/absolute/path/to/rhizome-mcp",
      "args": ["serve", "--project-root", "/absolute/path/to/your/repository"]
    }
  }
}

or, via npx, without installing a binary at all:

{
  "mcpServers": {
    "rhizome-mcp": {
      "command": "npx",
      "args": ["-y", "rhizome-mcp", "serve", "--project-root", "/absolute/path/to/your/repository"]
    }
  }
}

connect detects when it is itself running through the npx rhizome-mcp wrapper and automatically emits this npx form instead of the wrapper's resolved binary path, which lives in the npx cache and goes stale on eviction or a version bump. A config written with a resolved absolute path (the default otherwise) is machine-specific and not meant to be checked in and shared across machines; pass connect TARGET --command to instead emit a bare rhizome-mcp command name that relies on PATH, for a portable config you do intend to share, provided every machine that uses it has rhizome-mcp on PATH.

Stdio is the default transport; protocol output goes to stdout, logs to stderr.

That's it — connected agents start with open_project using the absolute repository root, retain its project_ref, and pass that reference to later project-scoped calls. See the agent workflow guide for the complete workflow. The returned metadata links the rhizome://guides/agent-workflow, rhizome://guides/issue-lifecycle, and rhizome://guides/multi-agent-handoff resources, and repository agents can load the rhizome-task-workflow skill from .github/skills/.

Install the agent workflow skill

For agents that support the open Agent Skills format, install rhizome-task-workflow with the npm-distributed skills CLI:

npx skills add Odrin/rhizome-mcp --skill rhizome-task-workflow

Run the command in a project for a project-scoped installation, or add --global to make the skill available across projects. The skill teaches compatible agents how to select, claim, checkpoint, hand off, and finish Rhizome work. It complements the MCP server; it does not install the rhizome-mcp binary or configure an MCP connection.

Monitor your project

rhizome-mcp board                        # status counts, active leases, blockers, review queue
rhizome-mcp board --serve                # interactive local board UI at a loopback URL
rhizome-mcp board --output board.html    # self-contained HTML snapshot with the planning graph
rhizome-mcp issue list --status ready
rhizome-mcp graph ISSUE-42 --format mermaid
rhizome-mcp doctor --full

The status board reports live lease counts, blocked issues and their reasons, open review requests, and the project-wide planning graph. The planning graph excludes finished work (done, cancelled) from the node budget, so the entry-point count always reflects claimable work. When the graph is truncated due to the 100-node budget, the board marks it as truncated and reports the retained node count in both table and JSON formats.

Optional: local HTTP transport

rhizome-mcp serve --http-address 127.0.0.1:0

The bound endpoint is logged to stderr; the Streamable HTTP endpoint is http://127.0.0.1:<port>/mcp. The transport is loopback-only, unauthenticated, and enforces strict Host/Origin validation plus a 1 MiB outer request body limit. Modern MCP 2026-07-28 clients call server/discover and then send direct requests with protocol metadata; legacy 2025-11-25 clients can still use initialize and notifications/initialized without relying on a persistent transport session. If you want durable audit attribution, create an explicit agent_session_handle with create_agent_session, pass it to the relevant mutating tools, and end it later with end_agent_session; transport closure never ends it.

How it works

init writes exactly one file into the repository:

{
  "version": 1,
  "project_id": "01J..."
}

stored as .agent-tracker.json. The SQLite database lives outside the repository in the platform application-data directory, resolved through project_id:

<application-data>/rhizome-mcp/projects/<project-id>/tasks.db

Use --data-root PATH to select an explicit data root for any command. Nothing else touches your repository, and the database is never committed to Git.

Design principle: an issue must never remain permanently stuck in in_progress. Effective status is computed from stored status plus the presence of an active leased attempt; if the agent disappears and the lease expires, the attempt becomes expired and the issue is available again when its stored state permits it.

Core constraints (by design): Go, SQLite (modernc.org/sqlite, pure Go, CGO-free), stdio as the primary transport, one database per project, no hosted or authenticated web UI (a loopback-only local status board is included), no authentication, minimal CLI. Deferred features are listed in docs/06.

CLI reference

Command

Purpose

init

Create .agent-tracker.json and the project database

serve [--http-address ADDR] [--profile full|agent|read-only|migration] [--toolsets GROUP[,GROUP...]] [--project-root PATH]

Run the MCP server (stdio; --http-address for local HTTP; --profile to narrow the advertised tool catalog to a named profile, or --toolsets to compose one from capability groups; --project-root to serve a project other than the working directory)

connect TARGET [--print] [--command]

Register the server with an MCP client (claude, codex, vscode, json)

board [--output PATH] [--serve [--http-address ADDR]]

Status board: counts, leases, blockers, review queue; optional HTML snapshot; --serve runs a temporary HTTP server

issue list / issue show ISSUE-ID

Inspect issues with filters

search QUERY

Full-text search across issues, comments, decisions, notes

graph ISSUE-ID

Dependency graph as table, JSON, or Mermaid

project info / project export / project import

Project metadata; logical JSON export; logical JSON import (`--input PATH

backup --output PATH

WAL-safe online backup

doctor [--full]

Integrity, schema, and invariant checks

maintenance release-attempt / rebuild-search-index / normalize-issue-timestamps --backup PATH

Administrative recovery; timestamp normalization requires a new validated backup

Run rhizome-mcp without arguments for complete usage, rhizome-mcp version for build information.

MCP surface

The server exposes 44 tools covering the full lifecycle: project discovery, issue CRUD with labels and relations, archive/unarchive visibility transitions, planning and dependency graphs, batch plan validation/apply, comments and decisions, claim/renew/checkpoint/finish work attempts with optional atomic resource reservations, work-context assembly, review requests, full-text search, delta changes, logical project export/import, and workflow-policy administration with gate evidence and diagnostics. The complete contract, including the MCP tool annotation matrix and the full/agent/read-only/migration exposure profile matrix, is in docs/03-mcp-tools.md.

By default serve advertises the complete full catalog. Pass --profile agent|read-only|migration (or set RHIZOME_TOOL_PROFILE) to narrow it — for example serve --profile read-only for a client that should never see a mutating tool. When no named profile fits, pass --toolsets (or set RHIZOME_TOOLSETS) with a comma-separated list of capability groups instead — for example serve --toolsets issues,planning — to advertise exactly those groups plus the always-on core pair (open_project, get_project); the two flags are mutually exclusive. Profiles and toolsets are an exposure and prompt-size control, not an authorization boundary: every tool still enforces its own server-side validation regardless of what a client can see in tools/list. See docs/04-storage-runtime.md §17.1 for the full environment-variable set and precedence, including the deprecated unprefixed fallback names.

Documentation

The modular files under docs/ are the canonical specification; SPEC.md is the index. Agents should load only the sections relevant to their current task (AGENT_BRIEF.md explains how).

  1. Product goals and scope

  2. Domain model

  3. MCP tools

  4. Storage and runtime

  5. Implementation requirements

  6. Deferred features and non-goals

  7. Logical interchange format

  8. Local HTTP transport contract

  9. Review workflow contract

  10. VS Code extension

  11. Project routing contract

  12. Resource reservations

  13. Status board

Guides for humans (quick start, workflow, CLI) live in site/ and are published via GitHub Pages. Release history is in the CHANGELOG.

Development

Build and test (no CGO, no external services):

CGO_ENABLED=0 go build -o rhizome-mcp .
go test ./...
go test -tags=integration ./...

The integration tag runs real-process MCP smoke and workflow tests: they build a temporary server binary, initialize a fresh repository and SQLite data root per test, and speak to serve over stdio or HTTP. Beyond single-process smoke coverage, the suite also exercises cross-process scenarios on one shared SQLite data root — concurrent claim and update-version races, an ungraceful process kill and restart, and a backup taken while a server is writing — to catch defects a single-process test structurally cannot see. Most live in the dedicated integration package; tests that need unexported package-main internals stay at the repository root.

CI runs go vet, all non-race unit and integration tests, and npm launcher tests on Ubuntu, macOS, and Windows for every push and pull request targeting main. Linux also runs the existing fuzzing budgets, while a separate coverage job enforces unit and integration coverage thresholds. A parallel Linux Race smoke job runs an explicit selection of claim, reservation, transaction-admission, project-router, and HTTP-lifecycle tests with the race detector; its selection is maintained in .github/workflows/ci.yml.

Full race checks runs the complete unit and integration race suites against the latest main daily at 02:17 UTC. GitHub may delay scheduled runs. It can also be started from the Actions tab using Run workflow and selecting a branch, including a feature branch before merging. The workflow records the tested commit, retains JSON test logs for 14 days, and uses a cache separate from ordinary CI and race smoke. Nightly and smoke tests use -count=1 so successful cached test results cannot bypass execution.

Full race checks are not a PR gate: a green PR confirms the selected race checks, not the full race suite. Race regressions outside that selection may be discovered after merge, at the next scheduled run; monitor nightly failures and fix or revert them promptly. For local full-race verification (requires CGO and a C compiler):

go test -race -count=1 ./...
go test -race -count=1 -tags=integration -run '^TestIntegration' ./...

The integration harness builds the real server subprocess with -race whenever the harness is race-instrumented.

Releases (.github/workflows/release.yml) publish CGO-free binaries with SHA-256 checksums for linux/amd64, linux/arm64, darwin/amd64, darwin/arm64, and windows/amd64; release binaries embed the version, commit, and build timestamp (local builds report git VCS info or dev, and the VERSION environment variable overrides both).

Release verification steps are documented in CONTRIBUTING.md.

This repository tracks its own backlog in rhizome-mcp: work is selected, claimed, and finished through the MCP server, and durable choices are recorded as decisions. Markdown holds specification only, not task status. See AGENTS.md and CONTRIBUTING.md.

License

Apache-2.0. Security policy: SECURITY.md.

Available Tools

35 tools
add_commentA

Append collaboration context to an issue without rewriting history.

NameRequiredDescriptionDefault
contentYes
issue_idYesCanonical issue identifier (ULID or ISSUE-N).
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
idempotency_keyNo
agent_session_handleNoOptional durable session handle for request attribution.

Output Schema

NameRequiredDescription
commentYes
apply_importA
DestructiveIdempotent

Apply a validated logical project import document into an empty destination.

NameRequiredDescriptionDefault
documentNo
source_uriNo
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
agent_session_handleNoOptional durable session handle for request attribution.

Output Schema

NameRequiredDescription
countsYes
conflictsYes
latest_event_idYes
apply_issue_planB
DestructiveIdempotent

Atomically create issues, relations, and decisions from a valid plan.

NameRequiredDescriptionDefault
issuesYes
decisionsYes
relationsYes
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
idempotency_keyYes
agent_session_handleNoOptional durable session handle for request attribution.

Output Schema

NameRequiredDescription
next_actionsYes
created_issuesYes
latest_event_idYes
created_decisionsYes
created_relationsYes
archive_issueA
DestructiveIdempotent

Archive one issue using its current version; history remains available.

NameRequiredDescriptionDefault
viewNo
issue_idYesCanonical issue identifier (ULID or ISSUE-N).
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
idempotency_keyNo
expected_versionYes
agent_session_handleNoOptional durable session handle for request attribution.

Output Schema

NameRequiredDescription

No output parameters

cancel_review_requestA
DestructiveIdempotent

Cancel an open or claimed review request using its current version.

NameRequiredDescriptionDefault
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
expected_versionYes
review_request_idYesCanonical review request identifier (ULID).
agent_session_handleNoOptional durable session handle for request attribution.

Output Schema

NameRequiredDescription
idYes
statusYes
versionYes
issue_idYes
claimableYes
created_atYes
resolved_atNo
artifact_idsYes
supersedes_idNo
target_event_idYes
active_attempt_idNo
target_issue_versionYes
claim_issueA
Idempotent

Atomically acquire exclusive ready/review work for a 60-3600s renewable lease; already claimed work fails; keyed retries replay.

NameRequiredDescriptionDefault
viewNoResponse shape; compact is the default.
issue_idYesClaimable ready or review issue (ULID or ISSUE-N).
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
lease_secondsNoRequested lease duration in seconds.
idempotency_keyNoOptional key that replays the same claim request.
agent_session_handleNoOptional durable session handle for request attribution.

Output Schema

NameRequiredDescription

No output parameters

create_agent_sessionA

Create a durable attribution session and one unrecoverable handle; writes a new session on every call (non-idempotent).

NameRequiredDescriptionDefault
modelNoOptional model identifier.
agent_labelNoOptional human-readable agent identity.
client_nameYesRequired client identity.
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
instance_keyNoOptional stable key for this client instance.
client_versionNoOptional client version.

Output Schema

NameRequiredDescription
sessionYes
agent_session_handleYes
create_issueA

Create one epic, task, or bug with optional hierarchy and labels.

NameRequiredDescriptionDefault
typeYes
viewNo
titleYes
labelsNo
statusNo
priorityNo
descriptionNo
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
blocked_reasonNo
idempotency_keyNo
parent_issue_idNoCanonical issue identifier (ULID or ISSUE-N).
acceptance_criteriaNo
agent_session_handleNoOptional durable session handle for request attribution.
create_missing_labelsNo

Output Schema

NameRequiredDescription

No output parameters

create_review_requestA

Create a review request for an exact issue version, event position, and artifact set. Deprecated: prefer replace_review_request.

NameRequiredDescriptionDefault
issue_idYesCanonical issue identifier (ULID or ISSUE-N).
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
artifact_idsNo
supersedes_idNoCanonical review request identifier (ULID).
target_event_idYes
agent_session_handleNoOptional durable session handle for request attribution.
target_issue_versionYes

Output Schema

NameRequiredDescription
idYes
statusYes
versionYes
issue_idYes
claimableYes
created_atYes
resolved_atNo
artifact_idsYes
supersedes_idNo
target_event_idYes
active_attempt_idNo
target_issue_versionYes
end_agent_sessionB
Idempotent

End one explicitly created durable agent session handle.

NameRequiredDescriptionDefault
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
agent_session_handleYes

Output Schema

NameRequiredDescription
sessionYes
export_projectB
Read-onlyIdempotent

Export the selected project as the version 1 logical interchange document.

NameRequiredDescriptionDefault
deliveryNo
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
agent_session_handleNoOptional durable session handle for request attribution.

Output Schema

NameRequiredDescription

No output parameters

finish_attemptB
DestructiveIdempotent

End a leased attempt with outcome, verification, artifacts, and status.

NameRequiredDescriptionDefault
viewNo
outcomeYes
artifactsNo
attempt_idYes
next_stepsNo
lease_tokenYes
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
verificationNo
blocked_reasonNo
reason_detailsNo
result_summaryYes
review_outcomeNo
idempotency_keyNo
failure_reason_codeNo
target_issue_statusNo
acknowledged_changesNo
agent_session_handleNoOptional durable session handle for request attribution.
interruption_reason_codeNo

Output Schema

NameRequiredDescription

No output parameters

get_changesA
Read-onlyIdempotent

Get ordered issue events after an event ID for incremental synchronization.

NameRequiredDescriptionDefault
limitNo
issue_idNoCanonical issue identifier (ULID or ISSUE-N).
event_typesNo
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
since_event_idYes
agent_session_handleNoOptional durable session handle for request attribution.

Output Schema

NameRequiredDescription
eventsYes
has_moreYes
next_event_idYes
latest_event_idYes
get_issueA
Read-onlyIdempotent

Get the current issue record by ULID or ISSUE-N display ID.

NameRequiredDescriptionDefault
viewNo
issue_idYesCanonical issue identifier (ULID or ISSUE-N).
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
agent_session_handleNoOptional durable session handle for request attribution.

Output Schema

NameRequiredDescription
idYes
typeYes
titleYes
labelsNo
statusNo
versionYes
priorityNo
closed_atNo
created_atNo
display_idYes
updated_atYes
archived_atNo
descriptionNo
sequence_noYes
blocked_reasonNo
parent_issue_idNo
acceptance_criteriaNo
get_issue_activityA
Read-onlyIdempotent

Get a unified newest-first timeline of issue work and artifacts.

NameRequiredDescriptionDefault
limitNo
orderNo
typesNo
cursorNo
issue_idYesCanonical issue identifier (ULID or ISSUE-N).
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
agent_session_handleNoOptional durable session handle for request attribution.

Output Schema

NameRequiredDescription
itemsYes
has_moreYes
next_cursorYes
get_issue_graphA
Read-onlyIdempotent

Get a bounded relation and hierarchy graph around one issue.

NameRequiredDescriptionDefault
viewNoOnly compact graph nodes are available.
depthNoRelation hops from root; default 2.
directionNoRelation traversal direction.
max_nodesNoMaximum returned nodes; default 100.
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
root_issue_idYesIssue at the graph traversal root.
relation_typesNoOptional relation kinds; empty includes all.
include_terminalNoInclude terminal issue nodes.
include_hierarchyNoInclude derived epic hierarchy edges.
agent_session_handleNoOptional durable session handle for request attribution.

Output Schema

NameRequiredDescription
edgesYes
nodesYes
summaryYes
warningsNo
truncatedYes
entry_pointsYes
next_actionsYes
root_issue_idNoCanonical issue identifier (ULID or ISSUE-N).
blocking_nodesNo
truncation_reasonNo
get_planning_graphA
Read-onlyIdempotent

Get dependency-aware entry points and blocking nodes for work selection.

NameRequiredDescriptionDefault
depthNo
max_nodesNo
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
root_issue_idNoCanonical issue identifier (ULID or ISSUE-N).
include_reviewNo
include_relatedNo
agent_session_handleNoOptional durable session handle for request attribution.

Output Schema

NameRequiredDescription
edgesYes
nodesYes
summaryYes
warningsNo
truncatedYes
entry_pointsYes
next_actionsYes
root_issue_idNoCanonical issue identifier (ULID or ISSUE-N).
blocking_nodesNo
truncation_reasonNo
get_projectA
Read-onlyIdempotent

Get metadata, limits, supported values, event position, and guide links for a project_ref or configured default.

NameRequiredDescriptionDefault
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
agent_session_handleNoOptional durable session handle for request attribution.
include_instructionsNo

Output Schema

NameRequiredDescription
guidesYes
limitsYes
projectYes
sessionYes
app_versionYes
project_refYes
next_actionsYes
tool_profileYes
config_versionYes
schema_versionYes
latest_event_idYes
supported_statusesYes
supported_prioritiesYes
supported_issue_typesYes
supported_relation_typesYes
get_review_requestA
Read-onlyIdempotent

Get one review request by identifier.

NameRequiredDescriptionDefault
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
review_request_idYesCanonical review request identifier (ULID).
agent_session_handleNoOptional durable session handle for request attribution.

Output Schema

NameRequiredDescription
idYes
statusYes
versionYes
issue_idYes
claimableYes
created_atYes
resolved_atNo
artifact_idsYes
supersedes_idNo
target_event_idYes
active_attempt_idNo
target_issue_versionYes
get_work_contextB
Read-onlyIdempotent

Get bounded task, blocker, decision, checkpoint, and recovery context.

NameRequiredDescriptionDefault
limitsNoOptional 1-20 bounds for requested list sections only.
includeNoOptional unique context sections; empty returns the compact default.
issue_idYesIssue whose work context to load.
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
agent_session_handleNoOptional durable session handle for request attribution.

Output Schema

NameRequiredDescription
issueYes
reviewsYes
blockersYes
warningsYes
artifactsYes
decisionsYes
relationsYes
truncatedYes
checkpointYes
parent_epicYes
next_actionsYes
attempt_historyYes
recent_commentsYes
previous_attemptYes
truncated_sectionsYes
project_instructionsYes
recent_attempt_notesYes
related_issue_summariesYes
changes_since_previous_attemptYes
list_decisionsA
Read-onlyIdempotent

List project-wide or issue-scoped decisions with cursor pagination.

NameRequiredDescriptionDefault
limitNo0 uses the default limit of 20; maximum is 100.
cursorNo
issue_idNoCanonical issue identifier (ULID or ISSUE-N).
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
agent_session_handleNoOptional durable session handle for request attribution.

Output Schema

NameRequiredDescription
itemsYes
has_moreYes
next_cursorYes
list_issuesA
Read-onlyIdempotent

List and filter issues, including effective status, blockers, and claimability.

NameRequiredDescriptionDefault
viewNo
limitNo0 uses the default limit of 20; maximum is 100.
typesNo
cursorNo
labelsNo
statusesNo
is_blockedNo
prioritiesNo
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
is_claimableNo
parent_issue_idNoCanonical issue identifier (ULID or ISSUE-N).
include_archivedNo
effective_statusesNo
agent_session_handleNoOptional durable session handle for request attribution.

Output Schema

NameRequiredDescription
itemsYes
has_moreYes
next_cursorYes
next_actionsYes
list_labelsA
Read-onlyIdempotent

List reusable labels with optional name search and cursor pagination.

NameRequiredDescriptionDefault
limitNo0 uses the default limit of 50; maximum is 100.
queryNo
cursorNo
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
agent_session_handleNoOptional durable session handle for request attribution.

Output Schema

NameRequiredDescription
itemsYes
has_moreYes
next_cursorYes
list_review_requestsA
Read-onlyIdempotent

List review requests with optional status and claimability filters.

NameRequiredDescriptionDefault
limitNoMaximum is 100; the default is 20.
cursorNo
statusNo
claimableNo
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
agent_session_handleNoOptional durable session handle for request attribution.

Output Schema

NameRequiredDescription
itemsYes
has_moreYes
next_cursorNo
manage_issue_relationB
DestructiveIdempotent

Add or remove one blocks, related_to, or duplicates relation.

NameRequiredDescriptionDefault
actionYes
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
relation_typeYes
idempotency_keyNo
source_issue_idYesCanonical issue identifier (ULID or ISSUE-N).
target_issue_idYesCanonical issue identifier (ULID or ISSUE-N).
agent_session_handleNoOptional durable session handle for request attribution.

Output Schema

NameRequiredDescription
changedYes
relationYes
affected_issuesYes
open_projectA
Read-onlyIdempotent

Open a project by absolute root and return its project_ref, metadata, limits, supported values, event position, and guide links.

NameRequiredDescriptionDefault
project_rootYes

Output Schema

NameRequiredDescription
guidesYes
limitsYes
projectYes
sessionYes
app_versionYes
project_refYes
next_actionsYes
tool_profileYes
config_versionYes
schema_versionYes
latest_event_idYes
supported_statusesYes
supported_prioritiesYes
supported_issue_typesYes
supported_relation_typesYes
record_decisionA
Destructive

Append a durable project or issue decision, optionally superseding one.

NameRequiredDescriptionDefault
titleYes
statusNo
contentYes
summaryYes
issue_idNo
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
supersedes_idNo
agent_session_handleNoOptional durable session handle for request attribution.

Output Schema

NameRequiredDescription
decisionYes
superseded_decision_idYes
renew_attemptA

Extend an active work or review lease before it expires.

NameRequiredDescriptionDefault
attempt_idYes
lease_tokenYes
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
lease_secondsNo
agent_session_handleNoOptional durable session handle for request attribution.

Output Schema

NameRequiredDescription
server_timeYes
next_actionsYes
lease_expires_atYes
replace_review_requestB
DestructiveIdempotent

Atomically supersede a predecessor review request and create its open successor in one transaction.

NameRequiredDescriptionDefault
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
artifact_idsNo
idempotency_keyYes
target_event_idYes
agent_session_handleNoOptional durable session handle for request attribution.
target_issue_versionYes
predecessor_request_idYesCanonical review request identifier (ULID).
predecessor_expected_versionYes

Output Schema

NameRequiredDescription
successorYes
predecessorYes
latest_event_idYes
save_attempt_noteB

Append a restartable checkpoint, finding, warning, or progress note.

NameRequiredDescriptionDefault
kindYesHow the note should be classified.
contentYesRequired restartable note content.
artifactsNoOptional artifacts created or referenced by this work.
importantNoMarks the note as important.
attempt_idYesActive attempt receiving the note.
next_stepsNoOptional concrete actions after this note.
lease_tokenYesSecret proof of the active attempt lease.
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
idempotency_keyNoOptional key that replays the same note request.
agent_session_handleNoOptional durable session handle for request attribution.

Output Schema

NameRequiredDescription
artifactsYes
attempt_noteYes
next_actionsYes
supersede_review_requestA
DestructiveIdempotent

Supersede an open or claimed review request using its current version. Deprecated: prefer replace_review_request.

NameRequiredDescriptionDefault
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
expected_versionYes
review_request_idYesCanonical review request identifier (ULID).
agent_session_handleNoOptional durable session handle for request attribution.

Output Schema

NameRequiredDescription
idYes
statusYes
versionYes
issue_idYes
claimableYes
created_atYes
resolved_atNo
artifact_idsYes
supersedes_idNo
target_event_idYes
active_attempt_idNo
target_issue_versionYes
update_issueA
DestructiveIdempotent

Patch one issue using its current version for optimistic concurrency.

NameRequiredDescriptionDefault
viewNo
changesYes
issue_idYesCanonical issue identifier (ULID or ISSUE-N).
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
idempotency_keyNo
expected_versionYes
agent_session_handleNoOptional durable session handle for request attribution.
create_missing_labelsNo

Output Schema

NameRequiredDescription

No output parameters

validate_importA
Read-onlyIdempotent

Validate a logical project import document without writing anything.

NameRequiredDescriptionDefault
documentNo
source_uriNo
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
agent_session_handleNoOptional durable session handle for request attribution.

Output Schema

NameRequiredDescription
countsYes
writesYes
conflictsYes
validate_issue_planA
Read-onlyIdempotent

Normalize and validate a bounded multi-issue plan without writing it.

NameRequiredDescriptionDefault
issuesYes
decisionsYes
relationsYes
project_refNoProject reference returned by open_project. Pass it explicitly for stateless routing; omit only when using a configured default.
agent_session_handleNoOptional durable session handle for request attribution.
include_normalized_planNo

Output Schema

NameRequiredDescription
validYes
errorsYes
summaryYes
warningsYes
next_actionsYes
normalized_planNo
plan_fingerprintYes
normalization_changedYes

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 33 tool updatesv1.2.1
    • Changedadd_comment1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
    • Changedapply_import1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
    • Changedapply_issue_plan1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
    • Changedarchive_issue1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
    • Changedcancel_review_request1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
    • Changedclaim_issue5 fields changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
      • addedInput schema / properties / idempotency_key / description
        Added value: +"Optional key that replays the same claim request."
      • changedInput schema / properties / issue_id / description
        Previous value: -"Canonical issue identifier (ULID or ISSUE-N)."New value: +"Claimable ready or review issue (ULID or ISSUE-N)."
      • addedInput schema / properties / lease_seconds / description
        Added value: +"Requested lease duration in seconds."
      • addedInput schema / properties / view / description
        Added value: +"Response shape; compact is the default."
    • Changedcreate_agent_session5 fields changed
      • addedInput schema / properties / agent_label / description
        Added value: +"Optional human-readable agent identity."
      • addedInput schema / properties / client_name / description
        Added value: +"Required client identity."
      • addedInput schema / properties / client_version / description
        Added value: +"Optional client version."
      • addedInput schema / properties / instance_key / description
        Added value: +"Optional stable key for this client instance."
      • addedInput schema / properties / model / description
        Added value: +"Optional model identifier."
    • Changedcreate_issue1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
    • Changedcreate_review_request1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
    • Changedexport_project1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
    • Changedfinish_attempt1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
    • Changedget_changes1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
    • Changedget_issue1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
    • Changedget_issue_activity1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
    • Changedget_issue_graph9 fields changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
      • addedInput schema / properties / depth / description
        Added value: +"Relation hops from root; default 2."
      • addedInput schema / properties / direction / description
        Added value: +"Relation traversal direction."
      • addedInput schema / properties / include_hierarchy / description
        Added value: +"Include derived epic hierarchy edges."
      • addedInput schema / properties / include_terminal / description
        Added value: +"Include terminal issue nodes."
      • addedInput schema / properties / max_nodes / description
        Added value: +"Maximum returned nodes; default 100."
      • addedInput schema / properties / relation_types / description
        Added value: +"Optional relation kinds; empty includes all."
      • changedInput schema / properties / root_issue_id / description
        Previous value: -"Canonical issue identifier (ULID or ISSUE-N)."New value: +"Issue at the graph traversal root."
      • addedInput schema / properties / view / description
        Added value: +"Only compact graph nodes are available."
    • Changedget_planning_graph1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
    • Changedget_project1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
    • Changedget_review_request1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
    • Changedget_work_context4 fields changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
      • addedInput schema / properties / include / description
        Added value: +"Optional unique context sections; empty returns the compact default."
      • changedInput schema / properties / issue_id / description
        Previous value: -"Canonical issue identifier (ULID or ISSUE-N)."New value: +"Issue whose work context to load."
      • addedInput schema / properties / limits / description
        Added value: +"Optional 1-20 bounds for requested list sections only."
    • Changedlist_decisions1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
    • Changedlist_issues1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
    • Changedlist_labels1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
    • Changedlist_review_requests1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
    • Changedmanage_issue_relation1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
    • Changedrecord_decision1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
    • Changedrenew_attempt1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
    • Changedreplace_review_request1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
    • Changedsave_attempt_note9 fields changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
      • addedInput schema / properties / artifacts / description
        Added value: +"Optional artifacts created or referenced by this work."
      • addedInput schema / properties / attempt_id / description
        Added value: +"Active attempt receiving the note."
      • addedInput schema / properties / content / description
        Added value: +"Required restartable note content."
      • addedInput schema / properties / idempotency_key / description
        Added value: +"Optional key that replays the same note request."
      • addedInput schema / properties / important / description
        Added value: +"Marks the note as important."
      • addedInput schema / properties / kind / description
        Added value: +"How the note should be classified."
      • addedInput schema / properties / lease_token / description
        Added value: +"Secret proof of the active attempt lease."
      • addedInput schema / properties / next_steps / description
        Added value: +"Optional concrete actions after this note."
    • Changedsearch11 fields changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
      • addedInput schema / properties / cursor / description
        Added value: +"Cursor from a previous page."
      • addedInput schema / properties / entity_types / description
        Added value: +"Optional result types; empty includes all."
      • changedInput schema / properties / epic_id / description
        Previous value: -"Canonical issue identifier (ULID or ISSUE-N)."New value: +"Optional epic scope (ULID or ISSUE-N)."
      • addedInput schema / properties / include_archived / description
        Added value: +"Include archived issue records."
      • changedInput schema / properties / issue_id / description
        Previous value: -"Canonical issue identifier (ULID or ISSUE-N)."New value: +"Optional issue scope (ULID or ISSUE-N)."
      • addedInput schema / properties / labels / description
        Added value: +"Optional label filter."
      • addedInput schema / properties / limit / description
        Added value: +"0 uses the default; 1-100 caps results."
      • addedInput schema / properties / query / description
        Added value: +"Required full-text terms."
      • addedInput schema / properties / snippet_length / description
        Added value: +"0 uses the default; 1-1000 caps excerpts in runes."
      • addedInput schema / properties / statuses / description
        Added value: +"Optional issue-status filter."
    • Changedsupersede_review_request1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
    • Changedupdate_issue1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
    • Changedvalidate_import1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
    • Changedvalidate_issue_plan1 field changed
      • addedInput schema / properties / agent_session_handle / description
        Added value: +"Optional durable session handle for request attribution."
  2. 35 tool updatesv1.2.0
    • First observedadd_comment
    • First observedapply_import
    • First observedapply_issue_plan
    • First observedarchive_issue
    • First observedcancel_review_request
    • First observedclaim_issue
    • First observedcreate_agent_session
    • First observedcreate_issue
    • First observedcreate_review_request
    • First observedend_agent_session
    • First observedexport_project
    • First observedfinish_attempt
    • First observedget_changes
    • First observedget_issue
    • First observedget_issue_activity
    • First observedget_issue_graph
    • First observedget_planning_graph
    • First observedget_project
    • First observedget_review_request
    • First observedget_work_context
    • First observedlist_decisions
    • First observedlist_issues
    • First observedlist_labels
    • First observedlist_review_requests
    • First observedmanage_issue_relation
    • First observedopen_project
    • First observedrecord_decision
    • First observedrenew_attempt
    • First observedreplace_review_request
    • First observedsave_attempt_note
    • First observedsearch
    • First observedsupersede_review_request
    • First observedupdate_issue
    • First observedvalidate_import
    • First observedvalidate_issue_plan

TDQS

B3.4/5.0

Scored across 35 tools

Disambiguation2/5

Several tools have overlapping purposes: create_review_request, replace_review_request, and supersede_review_request all handle review request creation/supersedure, with two marked deprecated. Also, get_planning_graph and get_work_context both provide context-heavy views, and the abundance of similar verbs (create/list/get/manage) creates boundary confusion despite useful descriptions.

Naming Consistency4/5

Tool names overwhelmingly use a consistent snake_case verb_noun pattern (e.g., list_issues, renew_attempt, archive_issue). The only notable deviation is the single-word 'search' and a few unconventional verb choices like 'open_project' and 'manage_issue_relation', which are minor and do not obscure the overall pattern.

Tool Count2/5

With 35 tools, the server is well above the 'too many (25+)' threshold. The count is inflated by deprecated tools (create_review_request, supersede_review_request) that could be removed, and the sheer number makes the tool surface unnecessarily heavy for agents to navigate.

Completeness4/5

The server covers a comprehensive domain: issue lifecycle, review requests, attempts/leases, decisions, relations, sessions, import/export, and planning graphs. Minor gaps like lacking a direct 'list_relations' tool are mitigated by get_issue_graph, but the presence of deprecated tools and some redundancies suggest the surface is not fully polished.

Maintenance

ActivityMaintained
ResponsivenessMixed handling

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    B
    maintenance
    A lightweight, fully local MCP server that provides AI coding tools with a shared SQLite memory store and built-in conflict arbitration, enabling structured memory sharing across tools like ZCode, Codex, Cursor, and Claude Code without external dependencies.
    4
    10
    Apache 2.0
  • A
    license
    A
    quality
    C
    maintenance
    Local MCP server giving AI coding agents (Claude Code, Cursor, VS Code/JetBrains Copilot) a shared, persistent memory of your projects and every bug/issue faced during development. Stateless, plain-file storage (AGENTS.md + issues.jsonl) — no database.
    16
    67 npm
    1
    MIT
  • F
    license
    B
    quality
    D
    maintenance
    A fully local, privacy-first MCP server that gives AI coding assistants deep repository intelligence with file-and-line-cited answers, persistent semantic memory, and agentic abilities like task planning and code review—all without any cloud API calls.
    23
    -