Skip to main content
Glama

CI crates.io License: Apache-2.0

Foremerge is the open-source coordination protocol for coding agents, built above Git. Agents keep isolated worktrees while sharing intent, semantic claims, dependencies, provisional ChangeSets, decisions, validation, and provenance.

Tell your agent to install

Done

See collisions before they land

Paste one line into Claude Code, Codex, or Cursor

It installs Foremerge and wires itself up

Every agent sees what the others are about to change, even in separate worktrees

Status: Foremerge 0.4.3 is a pre-1.0, local-first MVP. The CLI, JSON API, MCP server, SQLite store, deterministic conflict detector, and verification-gated lifecycle are implemented. Public schemas may still change. Published benchmark results do not yet exist, and coordination between machines is outside this project's scope.

How it works

Say you have two AI agents working on the same project at the same time. Each one gets its own copy of the code, so they never fight over files. Both finish. Both look correct. Then you find they undid each other's work.

Git cannot warn you about that, because Git compares text and not intent. It will stop you when two agents edit the same part of the same file. What it cannot see is two edits that are each perfectly reasonable on their own and land in different files. If one agent moves every caller onto a new StripePaymentService while another adds PayPal support to the old PaymentService, nothing overlaps, so Git merges both without complaint and the PayPal work is left stranded on a class nothing calls any more.

Foremerge fixes this by having agents announce what they are about to do, before they do it.

  1. Each agent says what it is about to touch. Not the code, just the target, like "I am going to change the sendEmail function."

  2. Every agent reads from one shared list. It is a small database inside your project's .git folder, so every agent on your machine sees the same picture, whether it is Claude, Codex, or Cursor.

  3. If two plans collide, you hear about it right away. Foremerge names the two agents, explains why their plans clash, and suggests how to split the work. Both worktrees are still clean at that point, so no work has to be thrown away.

Think of it as a shared whiteboard. Before an agent starts, it writes down what it is about to work on, and it reads what everyone else already wrote.

Two things Foremerge deliberately does not do. It never locks a file or blocks an agent, because a single crashed agent would then stall the whole fleet, so the warnings are advisory and you stay in charge. And it never asks a model to judge conflicts, so the same inputs always produce the same answer.

Related MCP server: uacos

The conflict Git cannot see yet

Agent A: Replace PaymentService with StripePaymentService
Agent B: Add PayPal support to PaymentService

These agents can work in different trees without touching the same line. The plans still collide: one removes the extension point while the other depends on it.

Both agents declare the same symbol:PaymentService scope, one saying it will replace it and the other that it will extend it. Foremerge compares those two declarations before either writes code, raises a HIGH advisory, and suggests coordinating on a stable abstraction such as PaymentProvider. That suggestion is explainable evidence, not an automatic architecture decision or a hard lock.

Because the operation is declared rather than read out of the summary, it does not matter how either agent phrased its plan. "Consolidate payments onto Stripe" and "Replace PaymentService with Stripe" reach the same verdict.

Git remains the durable repository. Foremerge supplies the missing shared awareness above it.

Terminal rendering of an actual Foremerge release demo detecting the PaymentService conflict before either worktree changed

Rendered from the actual conflict fields captured by the 0.1.0 release-binary run in examples/terminal-session.txt. The displayed command uses the shown jq filter; output is abridged for readability.

Quickstart: first conflict in under five minutes

Let your coding agent do it

Paste this into Claude Code, Codex, or Cursor from inside the repository you want to coordinate:

Set up Foremerge in this repository so we can coordinate parallel agents.

1. Install it:      curl -fsSL https://foremerge.com/install.sh | sh
2. Initialize:      foremerge init
3. Wire this client and any others in use: foremerge setup all
4. Register the check I should be validated against, for example:
                    foremerge checks set test -- cargo test --all-targets
5. Confirm:         foremerge doctor --client all

Then read the Foremerge skill that step 3 installed for this client and follow
it from now on: publish your intent with semantic scopes before editing, claim
the scope, and check for conflicts before you start.

Adjust step 4 to whatever this repository's real test command is. Step 3 asks the client to enable an MCP server, so it will prompt you before doing so. The Codex registration is user level, but one registration serves every repository: start Codex inside the repository you want it to coordinate.

Or do it yourself

You need a recent Git and jq. Install a prebuilt, checksum-verified release binary (macOS and Linux; the script installs to ~/.local/bin):

curl -fsSL https://foremerge.com/install.sh | sh
TIP

Two commands, one program. This installs foremerge and fmg, the same binary under a shorter name, so fmg status and foremerge status do the same thing. Examples below spell out foremerge; type whichever you prefer.

Or build from source with Rust 1.85+: cargo install --locked --git https://github.com/naw103/foremerge foremerge, or cargo install --locked --path . from a checkout. Windows binaries are on the releases page. To update, upgrade the same way you installed, then re-run foremerge setup and restart your agent clients; Upgrading Foremerge explains why each step matters. Then, inside the repository you want to coordinate:

foremerge init
foremerge doctor

The installer, the release archives and cargo install all carry both names from 0.4.0 onward. If something else on your PATH already answers to fmg, the installer leaves it alone and says so rather than shadowing it.

Install the native skill and MCP entry for any clients used in this repository, then define the trusted checks agents may request by name:

foremerge setup all
foremerge checks set test -- cargo test --all-targets
foremerge doctor --client all

Acceptance is verification-gated: Foremerge runs the check itself rather than taking an agent's word for it. Pick a check that is fast and that would actually catch a broken handoff, such as a build or a typecheck, rather than a full CI suite; this gate decides whether other agents may treat the work as done, and it does not replace CI. If this repository has nothing meaningful to verify, say so once rather than registering a check that always passes:

foremerge checks policy advisory

Work accepted that way is recorded as UNVERIFIED with the reason, so the audit trail never implies a check ran when none did. foremerge doctor reports whether the registered checks can actually run here, which matters in agent worktrees, because dependency directories are usually gitignored and git worktree add will not create them.

Use setup codex, setup claude, or setup cursor for one client. Setup preserves unrelated configuration (including key order in project MCP JSON). Upgrading Foremerge refreshes its own unedited skill file in place, but a skill file you edited, or a differing Foremerge MCP entry, is never replaced unless you explicitly pass --force. setup all attempts every client and reports each result, exiting nonzero if any failed. The Codex MCP registration is user-level and serves every repository, resolved from the directory Codex is started in; see agent client setup.

init creates local coordination state under the repository's Git common directory. It does not change tracked files. The following no-worktree sessions are enough to exercise pre-code detection; real coding agents should register their isolated worktrees and actual model identifiers.

STRIPE_AGENT=$(
  foremerge --json agent register \
    --name stripe-agent \
    --no-worktree |
  jq -er '.data.id'
)

STRIPE_RESULT=$(
  foremerge --json intent publish \
    --agent "$STRIPE_AGENT" \
    --task "modernize-payments" \
    --summary "Replace PaymentService with StripePaymentService" \
    --scope symbol:PaymentService=replace
)
STRIPE_INTENT=$(printf '%s\n' "$STRIPE_RESULT" | jq -er '.data.intent.id')

PAYPAL_AGENT=$(
  foremerge --json agent register \
    --name paypal-agent \
    --no-worktree |
  jq -er '.data.id'
)

PAYPAL_RESULT=$(
  foremerge --json intent publish \
    --agent "$PAYPAL_AGENT" \
    --task "add-paypal" \
    --summary "Add PayPal support to PaymentService" \
    --scope symbol:PaymentService=extend
)
PAYPAL_INTENT=$(printf '%s\n' "$PAYPAL_RESULT" | jq -er '.data.intent.id')

printf '%s\n' "$PAYPAL_RESULT" |
  jq '.data.conflicts[] | {kind, severity, scope, explanation, suggestion}'

printf '%s\n' "$PAYPAL_RESULT" |
  jq '.data.related_work[] | {agent, summary, asserted, overlap}'

The first command prints the live finding from your local run. The second prints related_work: the other agent's intent and every overlapping scope with both declared operations. Foremerge states what overlaps; you decide what it means and record that with foremerge assess record. No files need to change first. Inspect the captured, clearly labeled transcript in examples/terminal-session.txt.

Claims add ownership context without blocking either agent:

foremerge --json work claim \
  --agent "$STRIPE_AGENT" \
  --intent "$STRIPE_INTENT" \
  --scope symbol:PaymentService \
  --reason "Changing the provider boundary" >/dev/null

foremerge --json work claim \
  --agent "$PAYPAL_AGENT" \
  --intent "$PAYPAL_INTENT" \
  --scope symbol:PaymentService \
  --reason "Adding another provider" |
  jq '.data | {advisory_only, warnings}'

foremerge --json work query --scope symbol:PaymentService |
  jq '.data[] | {agent: .agent.name, intent: .intent.summary, open_conflicts}'

Both claims succeed. The second response includes an overlap warning because a claim is a leased advisory, never exclusive ownership.

Real terminal recording: two agents declare intents on symbol:PaymentService and Foremerge raises the HIGH destructive_vs_additive finding before either writes code

Recorded against the released 0.4.0 binary; every command and its output is real.

How it fits above Git

  coding agent A                                  coding agent B
        |                                               |
  isolated worktree A                            isolated worktree B
        |                                               |
        +--------- semantic events, not edits ----------+
                              |
                    CLI / MCP / JSON API
                              |
                     Foremerge service
                    /        |        \
       SQLite coordination   git CLI   validation argv
       in <git-common-dir>       |           |
                    \         Git repository /
                     durable commits and refs

Every frontend uses the same service and store. The semantic graph is:

Agent → Task → Intent → Claim → Symbol → Dependency
      → ChangeSet → Test → Result → Decision → Provenance

Mutations update typed SQLite projections, materialize graph edges, and append a hash-chained semantic event in one transaction. The log is useful tamper evidence; it is not a remote identity signature or distributed consensus.

Git worktrees: isolated files, shared awareness

Foremerge resolves the Git common directory and stores its default database at:

<git-common-dir>/foremerge/state.sqlite3

Linked worktrees share that common directory even though their checked-out files are separate. Create a worktree with Foremerge's thin wrapper around stock Git:

foremerge worktree create \
  --branch agent/paypal \
  --path ../payments-paypal \
  --base HEAD

foremerge --cwd ../payments-paypal --json agent register \
  --name paypal-agent \
  --model "$ACTUAL_MODEL_ID"

Another worktree in the same repository sees the registered agent and its intents immediately. You can override storage with --database PATH or FOREMERGE_DB, but every local agent must point at the same database to share state. The MVP does not replicate SQLite across machines; do not infer distributed safety from a network-mounted database.

Foremerge snapshots Git state for ChangeSet fingerprints and accepted refs. It does not automatically merge, rebase, cherry-pick, push, or update a target branch.

Semantic workflow

INTENT ─claim→ CLAIMED ─start→ IN_PROGRESS ─publish→ PROVISIONAL
       ─validate current fingerprint→ VALIDATED
       ─accept gates→ ACCEPTED ─record Git ref→ COMMITTED

Supported scope kinds are:

symbol api schema config infra test migration env file component contract domain

Publish the narrowest useful semantic scope. File paths alone miss API, configuration, schema, infrastructure, and cross-language collisions.

Common commands:

Boundary

Command

Register provenance

foremerge agent register --name NAME --model MODEL

Publish intent

foremerge intent publish --agent ID --task TASK --summary TEXT --scope KIND:KEY=OPERATION

Claim scope

foremerge work claim --agent ID --intent ID --scope KIND:KEY

Start implementation

foremerge work start INTENT_ID --agent AGENT_ID

Ask who is changing it

foremerge work query --scope KIND:KEY

See what every agent is doing

foremerge status

Preflight a plan

foremerge conflicts check --intent TEXT --scope KIND:KEY=OPERATION

Record what you concluded

foremerge assess record --agent ID --intent ID --related-intent-id ID --verdict V --rationale TEXT --action A

Send coordination

foremerge coordinate send --from ID --to ID --message TEXT

Watch semantic events

foremerge work watch --after-seq 0

Run foremerge <command> --help for the complete current flags. Global flags such as --json, --cwd, and --database may appear before or after subcommands.

ChangeSets and the verification gate

A ChangeSet captures the agent/model, task and intent, affected files/symbols/contracts, dependencies, implementation summary, reported tests, decisions, provenance, worktree, fingerprint, status, and Git ref. The accepted candidate and its later landing commit are retained separately as accepted_commit and integration_commit.

The honest integration order is:

  1. Publish intent, claim semantic scope, and mark implementation in progress.

  2. Work and commit on the isolated agent branch.

  3. Publish a ChangeSet for that clean candidate.

  4. Ask Foremerge to execute validation against its exact fingerprint.

  5. Resolve high conflicts, then accept the still-clean, still-validated ref.

  6. Integrate with ordinary Git or a pull request.

  7. Record the durable integration commit in Foremerge.

foremerge work claim \
  --agent "$AGENT_ID" \
  --intent "$INTENT_ID" \
  --scope component:payments
foremerge work start "$INTENT_ID" --agent "$AGENT_ID"

# Implement the change and commit it on this isolated branch before publishing.
CHANGESET_ID=$(
  foremerge --json changeset publish \
    --agent "$AGENT_ID" \
    --intent "$INTENT_ID" \
    --summary "Introduce PaymentProvider and StripePaymentProvider" \
    --file src/payments.rs \
    --symbol PaymentProvider \
    --symbol StripePaymentProvider \
    --contract payment-provider \
    --provenance-json '{"source":"coding-agent"}' \
    --git-ref HEAD \
    --worktree "$PWD" |
  jq -er '.data.id'
)

foremerge changeset validate "$CHANGESET_ID" \
  --worktree "$PWD" \
  -- cargo test --all-targets

foremerge changeset accept "$CHANGESET_ID" --git-ref HEAD

# Integrate with ordinary Git, then record the commit that actually landed.
foremerge changeset commit "$CHANGESET_ID" --git-ref main

Agent-reported --reported-test COMMAND=STATUS values are provenance only. They do not satisfy acceptance. Foremerge-owned validation records the command argument vector, exit status, output, duration, and candidate fingerprint. Any detected change after validation makes that attempt non-authoritative, but its output and changed-path diagnostic remain queryable with changeset attempts.

For trusted checks that generate disposable untracked output, an operator may set exact or directory-prefix rules without changing tracked files:

foremerge validation-exclusions set \
  --path coverage.log \
  --path target/validation-reports/

The normalized policy digest is part of the candidate fingerprint, tracked changes are never excludable, MCP cannot change the policy, and generated files must still be removed before acceptance. See ADR 0001.

Acceptance also requires a clean worktree and no unresolved HIGH conflict, unless the caller deliberately uses the visible --allow-high-conflicts override together with --override-reason "...". Prefer resolving a conflict with an explicit rationale. Acceptance creates refs/foremerge/accepted/<changeset-id>; it does not merge code.

Validation commands run as trusted local code with your operating-system permissions. Foremerge does not sandbox them.

Agent clients and MCP: complete lifecycle tools

Run foremerge mcp over stdio. MCP does not require the HTTP daemon; both are adapters over the same database.

Tool

Purpose

register_agent

Record agent, model, capabilities, and worktree provenance

publish_intent

Announce planned work, declare what it does to each scope, and receive conflicts plus related work to assess

record_assessment

Record what you concluded about one related intent and what you will do

claim_work

Create leased advisory claims on semantic scopes

query_work

Find agents, intents, claims, ChangeSets, and conflicts

check_conflicts

Check a published or provisional intent before code changes

publish_changeset

Record implementation, tests, decisions, and Git provenance

coordinate_with_agent

Send a durable message linked to a conflict or ChangeSet

start_work

Advance claimed work into implementation

resolve_conflict

Record an audited resolution for a durable conflict

run_verification

Run a trusted repository check by name, never raw MCP argv

accept_changeset

Apply final conflict, dependency, validation, and Git gates

record_commit

Record the actual Git integration commit

discard_work

Preserve abandoned work while releasing claims and blockers

list_agents

Read registered agent provenance

get_intent

Read one intent and current conflict snapshot

get_changeset

Read one ChangeSet and Git/provenance state

status

Read one consistent coordinator status snapshot

Start from the valid minimal config in examples/mcp-config.json. It assumes the client launches foremerge with the repository as its working directory. Clients without a repository working-directory setting should pass an absolute --database before mcp; derive the Git common directory instead of assuming that a linked worktree's .git is a directory.

See agent client setup for the installer, native skill locations, client-specific MCP files, diagnostics, and safe replacement rules. See MCP setup for transport behavior, schemas, named checks, example inputs, and multi-worktree configuration.

Source clones include equivalent skills in .codex/skills, .claude/skills, .cursor/skills, the portable .agents/skills location, and the Claude Code plugin, plus portable Claude and Cursor MCP templates. A Cargo installation embeds the canonical skill so foremerge setup can install it into another repository without copying this source tree.

Local JSON API

The daemon defaults to authenticated loopback HTTP on http://127.0.0.1:47811. init creates a bearer token with private file permissions where the platform supports them.

In one terminal:

foremerge daemon

In another terminal, read the token path from Foremerge rather than guessing it:

export FOREMERGE_URL=http://127.0.0.1:47811
TOKEN_FILE=$(foremerge --json init | jq -er '.data.token_file')
FOREMERGE_TOKEN=$(tr -d '\r\n' < "$TOKEN_FILE")

curl --fail --silent --show-error \
  --header "Authorization: Bearer $FOREMERGE_TOKEN" \
  --get "$FOREMERGE_URL/v1/work" \
  --data-urlencode 'scope=symbol:PaymentService' |
  jq .

Do not print, commit, or share the token. /healthz is database-free process liveness and /readyz is a bounded non-waiting store probe; both are public. Every /v1 route, including the paged event-chain audit, requires the token unless the daemon was deliberately started with --no-auth for a trusted local test. The MVP refuses non-loopback binds and is not a hardened multi-tenant service.

The CLI escape hatch foremerge request reads local auth automatically. A runnable curl walkthrough is in examples/api-requests.sh; the full route and error reference is JSON API.

What the MVP deliberately does not claim

  • Conflict detection is deterministic and explainable, but heuristic. It can miss synonymous concepts and warn on compatible work.

  • Claims warn; they never lock files, symbols, or agents.

  • Passing validation proves only that the recorded command passed for the recorded fingerprint, not that the test plan was complete.

  • Git refs and process results are stronger evidence than self-reported model, prompt, or test prose.

  • The event chain detects changes inside the retained chain; it is not a signature, remote attestation, or external checkpoint.

  • Local SQLite is not shared-mode consensus, and the loopback bearer token is not a public deployment security model.

  • There are executable benchmark fixtures, a reproducible query harness, and a benchmark plan, but no published coordinated-vs-uncoordinated performance results yet.

  • Foremerge does not replace code review, architecture ownership, CI, security scanning, Git hosting rules, or backups.

Read the complete limitations and trust model before using Foremerge as an integration gate.

Documentation

Document

What it answers

Architecture

Why one Rust binary, SQLite, Git CLI, and shared common-dir state?

Protocol

What do agents publish and when?

State model

Which transitions and invariants gate work?

Conflict detection

Which deterministic rules produce findings and suggestions?

Git integration

How do fingerprints, worktrees, and accepted refs behave?

Agent clients

How do Codex, Claude Code, and Cursor discover the skill and MCP server?

MCP setup

How do clients configure and call the 18 lifecycle/read tools?

JSON API

Which routes, request bodies, auth, and errors are shipped?

OpenAPI schema

What is the machine-readable HTTP contract?

Benchmark plan

How will coordinated and uncoordinated runs be compared?

Validation exclusion ADR

Which generated paths may validation ignore, and why?

Roadmap

What is current, next, later, or a non-goal?

Limitations

What does the MVP not guarantee?

Brand

Which mark, colors, type, icons, and CLI output rules apply to any Foremerge surface?

Also see the changelog, security policy, and code of conduct.

Contributing and license

Contributions are welcome, especially protocol feedback on scope vocabulary, conflict evidence, ChangeSet provenance, and verification policy. Read CONTRIBUTING.md, then run the complete local gate:

make verify

Foremerge is licensed under the Apache License 2.0.

Available Tools

18 tools
accept_changesetAccept a validated ChangeSetA

Accept a ChangeSet as done so other agents may build on it. Use this after run_verification passes; use record_commit later, once the work has actually landed on the target branch. Foremerge re-checks every gate before accepting: the worktree must be clean and unchanged since publication, verification must have passed (unless the repository's policy is advisory and nothing was verified), no HIGH conflict on the intent may be OPEN or COORDINATING (resolve_conflict clears an agreed one, and discard_work dismisses the conflicts of work you drop), and every intent in the ChangeSet's dependencies must already be accepted, with its accepted commit in this commit's history. On success it marks the ChangeSet and intent ACCEPTED, pins the commit as accepted_commit, writes refs/foremerge/accepted/, and returns the updated ChangeSet. A failed gate returns an error naming it (CHECK_FAILED, BLOCKING_CONFLICT, UNSATISFIED_DEPENDENCY, STALE_CHANGESET, INVALID_TRANSITION) and changes nothing. Overriding a gate is an operator action on the CLI or HTTP API and is refused over MCP, so ask a human when a gate should be bypassed.

ParametersJSON Schema
NameRequiredDescriptionDefault
git_refNoOptional commit to accept. Defaults to the ref recorded at publication, then the worktree HEAD. Whatever it names must resolve to the current worktree HEAD.
changeset_idYesThe ChangeSet to accept (chg_...), as returned by publish_changeset.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite annotations only stating non-read-only/non-idempotent, the description goes far beyond them by disclosing that Foremerge re-checks every gate, that a failed gate changes nothing and returns named error codes, that success writes refs/foremerge/accepted/<changeset_id>, and that overriding gates via MCP is refused. This is comprehensively transparent about side effects and failure behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence carries load-bearing information: purpose, sequencing, gate criteria, side effects, error behavior, and override policy. The most important usage guidance is front-loaded, and the gate details are grouped logically.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a state-changing tool with no output schema, the description fully explains preconditions, gate checks, success effects, failure modes, error identifiers, and the boundary of what MCP can do. An agent has enough to decide whether to call it and what to expect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers both parameters fully, so the baseline is 3. The description adds meaningful semantics for git_ref by explaining its fallback resolution order (publication ref, then worktree HEAD) and the constraint that it must resolve to the current worktree HEAD, which is not in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Accept a ChangeSet as done') and immediately names the higher-level purpose ('so other agents may build on it'). It also contrasts with record_commit, which is the later step once work lands, so an agent can distinguish this from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says when to use the tool ('after run_verification passes'), when not to use it yet ('use record_commit later'), and how to handle conflicts via resolve_conflict and discard_work. It also tells the agent that gate overrides are refused over MCP and a human should be consulted, which is actionable routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_conflictsCheck intent conflictsA
Read-only

Ask whether planned work collides with other agents' active work, before any code changes exist. Read-only: nothing is stored. Pass intent_id alone to list the persisted OPEN or COORDINATING conflicts on a published intent (use this before publish_changeset and before run_verification, since conflicts are raised when the later intent publishes). Pass intent text with scopes, or intent_id with replacement scopes, for a what-if check against every intent from INTENT through VALIDATED, excluding ACCEPTED, COMMITTED and DISCARDED; those findings carry ephemeral eph_ ids and are not recorded. Returns conflicts (each with severity, explanation, evidence and a suggested coordination step), checked_intents, blocking (true when any finding is HIGH), and the active policy. To record a decision about overlap, use record_assessment or resolve_conflict instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
intentNoFree-form summary of work not yet published, for a what-if check. Provide this or intent_id. Passing an intent id here is rejected; use intent_id.
scopesNoScopes to compare, each with the operation you would perform. With intent text, these are the proposed scopes. With intent_id, non-empty scopes replace the intent's own for this check only.
agent_idNoOptional caller agent id. Informational only; it does not change which work is compared.
intent_idNoA published intent (int_...) to check. Provide this or intent.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and destructiveHint, and the description reinforces this with 'Read-only: nothing is stored' and adds the key ep heral nuance that findings carry ephemeral eph_ ids and are not recorded. It also discloses when block ing is true and that persisted conflicts are OPEN or COORDINATING. This substantially exceeds annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and information-rich, yet each sentence carries a distinct purpose: purpose, read-only guarantee, two usage modes, return fields, and alternatives. There is no filler or repetition. The structure moves logically from 'what' to 'when' to 'how' to 'instead', keeping all critical facts front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema, the description admirably covers return semantics (conf licts, checked intents, block ing flag, active policy), id formats, status filters, ephemer ality, and exclusions. An agent has enough context to know when to call it, how to invoke each mode, and what the results mean. Nothing important is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema is fully described (100% coverage), the description adds critical semantic guidance beyond the schema: it explains that intent text with scopes is a what-if check against a specific status range, that intent_id alone pists only OPEN/COORDINATING conflicts, and that intent_id with non-empty scopes replaces the intents' scopes for that check only. This is far more than the schema alone provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Ask whether planned work collides with other agents' active work'. It further distinguishes itself from sibling tools like record_assessment and resolve_conflict by naming them as alternatives for recording decisions. This makes the tool's identity clear and unique among its siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use each mode: intent_id alone before publish_changeset and run_verification, intent text with scopes for a what-if check, and intent_id with replacement scopes. It also tells the agent which tools to use instead when the goal is to record a decision. This is exemplary usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

claim_workClaim semantic workA

Tell other agents you are working on specific scopes of your own intent, for a limited time. Use this after publish_intent and record_assessment, and before start_work. Claims are advisory and never lock: if any other intent, another of yours included, holds a live claim on a matching scope (symbols match loosely by name), you still get the claim, and a claim-overlap conflict is recorded and returned as a warning. The first claim moves the intent from INTENT to CLAIMED. Claiming a scope the intent already holds renews its lease instead of adding a second claim, which is how long-running work keeps its claims. Only the intent's owner may claim, and only while the intent is INTENT, CLAIMED or IN_PROGRESS. Returns the created or renewed claims, overlap warnings, and advisory_only: true.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNoOptional note shown to other agents explaining why you hold the claim.
scopesYesThe scopes to claim. Use the scopes declared on the intent; operations are not repeated here.
agent_idYesYour agent id (agt_...). Must own the intent.
intent_idYesYour intent (int_...) that the claims belong to.
lease_secondsNoHow long the claim lasts before it expires, from 60 seconds to 24 hours. Default one hour. Claim again to renew.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes far beyond annotations: discloses that claims never lock, that overlap still grants the claim and records a warning, that re-claiming renews the lease instead of adding a second claim, that the first claim moves the intent to CLAIMED, and that the result includes advisory_only: true. This fully describes side effects and semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence contributes: purpose, workflow position, locking semantics, renewal behavior, ownership/state constraints, and return payload. It front-loads the core purpose before diving into edge-case behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a stateful, advisory claim operation with no output schema and no idempotency hint, the description covers success behavior, failure/conflict handling, state transitions, expiry/renewal, and return contents. An agent has enough information to call it correctly and understand consequences.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents all five parameters with 100% coverage, so the baseline is 3. The description adds value by clarifying that scopes must be those declared on the intent, by explaining the loose-by-name overlap matching, and by describing renewal behavior tied to lease_seconds. It does not add per-parameter syntax, but the schema already covers that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: claim semantic work on scopes of your own intent for a limited time. It also places the operation in a workflow (after publish_intent and record_assessment, before start_work) and contrasts it with start_work by saying claims are advisory and non-locking.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly gives the when-to-use context: 'Use this after publish_intent and record_assessment, and before start_work.' It also states constraints (only the intent's owner, only while intent is INTENT/CLAIMED/IN_PROGRESS) and tells the caller to use the intent's declared scopes, which routes the agent away from inventing scopes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

coordinate_with_agentCoordinate with another agentA

Send a stored message to another registered agent, usually to agree how two overlapping pieces of work should coexist. Use it when check_conflicts or related_work shows a clash you need the other agent to act on; afterwards, a party to the conflict records the agreement with resolve_conflict, naming this message's id. Linking a conflict_id moves that conflict from OPEN to COORDINATING. The message is appended to a durable log with status UNREAD; it does not interrupt or control the other agent. No MCP tool reads messages: the recipient reads them with the CLI, foremerge coordinate inbox. Returns the stored message, including its msg_ id.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageYesWhat you propose or need, in plain language.
conflict_idNoOptional stored conflict (cfl_...) this message is about. An eph_ id from a what-if check_conflicts is rejected with NOT_FOUND. May be combined with changeset_id.
to_agent_idYesThe recipient's agent id (agt_...), for example the owner of the conflicting intent.
changeset_idNoOptional ChangeSet (chg_...) this message is about. Must exist.
from_agent_idYesYour agent id (agt_...).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the uninformative all-false annotations, disclosing that the message is appended to a durable log with status UNREAD, that it does not interrupt or control the recipient, that linking a conflict_id moves it from OPEN to COORDINATING, and that no MCP tool reads messages. It also states the return value includes the stored message and its msg_ id.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than typical but every sentence carries distinct information: purpose, trigger, follow-up action, state transition, durability, non-interruptive nature, and return value. It is deliberately structured and front-loaded with the core operation, with no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite lacking an output schema, the description explicitly states what is returned. It covers the integration with sibling tools, the state change on conflict_id, the durable status semantics, and the limitation that only the CLI can read messages. This is a complete briefing for a tool with this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all five parameters. The description adds a bit of contextual meaning (e.g., conflict_id linking moves the conflict, eph_ ids are rejected), but most parameter semantics already appear in the schema, so a baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Send a stored message to another registered agent,' and immediately states the purpose—'to agree how two overlapping pieces of work should coexist.' It also differentiates from siblings by referencing check_conflicts and resolve_conflict, clarifying this tool is for the message-sending step, not conflict detection or resolution.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance is given: 'Use it when check_conflicts or related_work shows a clash you need the other agent to act on.' It also explains the follow-up flow with resolve_conflict and names the message id, and notes that the recipient reads via CLI since no MCP tool reads messages. This fully covers when and how to use the tool relative to alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

discard_workDiscard workA
Destructive

Abandon one of your own intents that will not be finished, for example a duplicate or work another agent took over. It sets the intent to DISCARDED, releases all of its active claims, and dismisses its OPEN or COORDINATING conflicts so they stop blocking the other party. The history stays in the event log, but a discarded intent cannot be resumed; publish a new intent instead. Only the owner may discard, and not once the intent is ACCEPTED, COMMITTED or already DISCARDED. Returns the updated intent. To agree that two intents can coexist, use resolve_conflict instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonYesWhy the work is being abandoned. Required and recorded in the event log.
agent_idYesYour agent id (agt_...). Must own the intent.
intent_idYesThe intent (int_...) to discard.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the destructiveHint annotation by specifying exact behavioral effects: setting intent to DISCARDED, releasing active claims, dismissing OPEN/COORDINATING conflicts, preserving history, and preventing resumption. It also discloses ownership and state restrictions, and notes the return value, giving the agent a complete mental model of side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense paragraph, but every sentence contributes meaningful operational detail: usage context, state effects, side effects, restrictions, return value, and the alternative tool. It is appropriately front-loaded and not padded, though slightly longer than minimal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a state-mutating tool with no output schema, the description covers all necessary context: valid states, ownership, side effects on claims and conflicts, irreversibility, event log behavior, and how to proceed instead. Nothing an agent needs to decide whether and how to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with each parameter (reason, agent_id, intent_id) already documented clearly. The description adds context that reason is recorded and that only the owner can discard, but this mostly reinforces schema information rather than supplying substantial new meaning. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool abandons one of your own intents with concrete examples (duplicate, work taken over), and explicitly contrasts it with resolve_conflict. It names the resource (intent) and the primary effect (set to DISCARDED), so an agent can distinguish it from siblings without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: for unfinished intents that are duplicates or taken over by another agent. It also names the alternative tool (resolve_conflict) and states when not to use this tool, such as ACCEPTED, COMMITTED, or already DISCARDED intents, plus ownership requirements.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_changesetGet a ChangeSetA
Read-onlyIdempotent

Read one ChangeSet by id. Use it to check a ChangeSet's status (PROVISIONAL, VALIDATED, ACCEPTED, COMMITTED or SUPERSEDED), its fingerprint, and its commit provenance: accepted_commit, pinned at acceptance and never changed, and integration_commit, set by record_commit. Read-only. Use get_intent for the work item itself. To find an id, status lists PROVISIONAL, VALIDATED and ACCEPTED ChangeSets, and query_work shows each intent's latest one.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe ChangeSet id (chg_...).

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, non-destructive, and openWorld=false, and the description reinforces this with 'Read-only.' It also adds meaningful behavioral detail beyond the annotations: accepted_commit is pinned at acceptance and never changed, and integration_commit is set by record_commit. No contradiction with annotations is present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is information-dense and well-structured: operation and target first, then what can be checked, then read-only status, then routing to alternatives. Every sentence earns its place, and no filler or redundant restating of the title appears.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read tool with full schema coverage and comprehensive annotations, the description fully covers what an agent needs: what the tool returns conceptually (status, fingerprint, provenance) and how to obtain an id. The absence of an output schema does not create a material gap because the description names the fields the agent should expect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers 100% of parameters with a clear description of id, so the baseline is 3. The description adds useful parameter context by explaining how to find an id: status lists qualifying ChangeSets and query_work shows each intent's latest one. This exceeds the schema's minimal id description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb-resource pair: 'Read one ChangeSet by id', and clearly distinguishes it from siblings by stating what it is not for: 'Use get_intent for the work item itself.' An agent can tell this tool apart from get_intent, status, and query_work without inspecting schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to use this tool: to check ChangeSet status, fingerprint, and commit provenance. It also names alternatives and when they apply, including get_intent for the work item, status for finding PROVISIONAL/VALIDATED/ACCEPTED ids, and query_work for each intent's latest ChangeSet.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_intentGet an intentA
Read-onlyIdempotent

Read one intent by id, with its owning agent and the count and ids of its OPEN or COORDINATING conflicts (check_conflicts with intent_id shows severity). Use it to see an intent's current status (INTENT, CLAIMED, IN_PROGRESS, PROVISIONAL, VALIDATED, ACCEPTED, COMMITTED or DISCARDED), declared scopes and depends_on, for example before assessing someone else's related work. Read-only. Use query_work to search intents by agent, status or scope, and status for everything at once.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe intent id (int_...).

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and non-destructive, and the description reinforces this with 'Read-only.' It goes beyond annotations by disclosing the return shape (conflict counts/ids, status enum, scopes, depends_on) and noting that severity requires check_conflicts.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences with zero filler. The core purpose is front-loaded, followed by return details and sibling routing. Each sentence contributes distinct value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read tool with strong annotations and explicit sibling routing, the description covers the purpose, return contents, safety profile, and alternatives. No critical information an agent needs is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already fully documents the single id parameter with format 'int_...'. The description mentions reading by id but adds no new parameter semantics beyond what the schema provides, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Read one intent by id') and enumerates exactly what is returned: owning agent, OPEN/COORDINATING conflict count and ids, status, scopes, and depends_on. It also distinguishes itself from query_work and status explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear when-to-use context ('before assessing someone else's related work') and explicitly routes to alternatives: query_work for searching by agent/status/scope and status for everything at once. This leaves little ambiguity about tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_agentsList coding agentsA
Read-onlyIdempotent

List every registered agent in registration order, with its id, name, model, capabilities, worktree, Git branch and head at registration, and status. Read-only and takes no arguments. Use it to find the agent id of another participant before coordinate_with_agent. Use status for the active agents alongside their current work.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false. The description reinforces read-only behavior and adds the detail of registration order, which goes beyond the annotations. It doesn't contradict annotations and provides useful context about the returned data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficient with no fluff. It front-loads the purpose, then provides usage guidance in separate short sentences. Each sentence adds value: purpose, read-only/no-args, usage for coordinate_with_agent, and usage for status. No redundant text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no output schema, the description compensates by listing all returned fields and their order. It also covers a primary use case (finding agent ids) and mentions the alternative (status). For a simple read-only list tool, nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema is empty, so there is nothing to explain. The description explicitly notes 'takes no arguments', which is helpful confirmation. Baseline for 0 params is 4, and this description meets that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists every registered agent with a specific set of fields (id, name, model, capabilities, worktree, Git branch/head, status). It distinguishes from siblings by noting it's a full listing, unlike status which focuses on active agents. The verb 'List' and resource 'registered agents' are explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance: use it to find agent ids before coordinate_with_agent, and use status for active agents alongside current work. This differentiates it from the status tool and provides a clear when-to-use and when-not-to-use scenario.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

publish_changesetPublish a provisional ChangeSetA

Record a finished unit of implementation for your intent so it can be verified and accepted. Use it once the change is committed in your worktree, after check_conflicts and before run_verification. Foremerge snapshots the worktree (defaulting to your registered one), resolves the candidate commit and its diff base, and stores a fingerprint that verification and acceptance are later checked against. files and symbols are inferred only from uncommitted changes, so list them yourself for committed work. The ChangeSet starts PROVISIONAL and the intent becomes PROVISIONAL. Publishing again while the previous ChangeSet is PROVISIONAL or VALIDATED creates a new one, marks the old one SUPERSEDED, and resets verification. Only the intent's owner may publish, while the intent is CLAIMED, IN_PROGRESS, PROVISIONAL or VALIDATED. Git itself is not modified. Returns the ChangeSet, including its chg_ id, fingerprint, and open_conflicts on the intent at that moment.

ParametersJSON Schema
NameRequiredDescriptionDefault
filesNoChanged file paths. Left empty, they are inferred from uncommitted changes only, so list them for committed work.
testsNoTests you ran yourself. Recorded as history only; acceptance relies on run_verification, not on this list.
git_refNoCandidate commit. Omit it: it defaults to the worktree's HEAD, and acceptance rejects any other commit with STALE_CHANGESET.
summaryYesWhat the change does, in one or two sentences.
symbolsNoCode symbols added or changed. Left empty, they are inferred from uncommitted changes only, so list them for committed work.
agent_idYesYour agent id (agt_...). Must own the intent.
base_refNoTrue diff base when known (for example the fork point of this agent branch); defaults to the candidate commit's first parent.
worktreeNoPath of the Git worktree holding the change. Defaults to your registered worktree, then the server's working directory. Must belong to your registered repository.
contractsNoNamed interfaces or agreements this change affects, for example payment-provider.
decisionsNoDesign decisions a reviewer or later agent should know about.
intent_idYesThe intent (int_...) this implementation fulfils.
provenanceNoOptional JSON object of your own context, such as a prompt or task reference. Foremerge adds Git provenance under provenance.git.
dependenciesNoIntent ids (int_...) this change builds on, and the dependency list acceptance enforces. accept_changeset refuses with UNSATISFIED_DEPENDENCY unless each is ACCEPTED or COMMITTED and its accepted commit is in this change's Git history. Intent ids only: not package or library names.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses significant side effects beyond the annotations: it snapshots the worktree, stores a fingerprint, starts the ChangeSet as PROVISIONAL, marks old ChangeSets SUPERSEDED, resets verification, and explicitly notes 'Git itself is not modified.' It also explains the return value, which is important because there is no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence carries distinct information: purpose, placement in workflow, snapshot/fingerprint behavior, file/symbol inference, state transitions, republish semantics, authorization constraints, Git safety, and return value. Despite its length, it is front-loaded with the most decision-relevant facts and contains no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has 13 parameters, nested objects, and no output schema, yet the description covers return values, state transitions, side effects, ownership rules, and workflow ordering. Combined with the fully documented input schema, an agent has everything it needs to decide when to call and what to expect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all 13 parameters thoroughly. The description adds workflow context around files/symbols inference and defaults, but most of that is also present in the parameter descriptions. This meets the high-coverage baseline without adding substantial new per-parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Record a finished unit of implementation for your intent so it can be verified and accepted.' It clearly positions the tool in the workflow relative to siblings by saying 'after check_conflicts and before run_verification', leaving no ambiguity about what this tool does or how it differs from adjacent tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance: 'once the change is committed in your worktree, after check_conflicts and before run_verification.' It also states preconditions and restrictions: only the intent's owner may publish, and only while the intent is in specific states. This is strong, actionable routing information.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

publish_intentPublish intentA

Announce work you are about to do, and the scopes it will change, before editing any code. This is the first call for every task, after register_agent. The intent is stored with status INTENT and compared against every other active intent. Returns the intent (with its int_ id), any conflicts detected immediately, and related_work: active intents, your own others included, that may relate to yours. Entries with asserted: true are collisions with both declared operations stated; the rest are candidates, with why_surfaced saying why. Assess each related_work entry and call record_assessment before writing code, then claim_work and start_work. Use check_conflicts instead for a what-if check that stores nothing.

ParametersJSON Schema
NameRequiredDescriptionDefault
taskYesShort name of the task this belongs to, for example payments-provider. Intents with the same task text share one task record.
scopesNoEvery scope this work will touch, each with the operation performed on it. Conflict detection relies on these, so declare them all.
summaryYesWhat you are going to change, in one sentence.
agent_idYesYour agent id (agt_...) from register_agent.
metadataNoOptional JSON object of extra context stored with the intent.
rationaleNoOptional reason for the change.
depends_onNoIntent ids (int_...) this work relies on, recorded for the coordination graph and reported as dependents by query_work. Not checked or enforced: to make acceptance require them, also list them in publish_changeset's dependencies.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are all false, providing minimal safety signals. The description carries the full behavioral burden and delivers: it states the intent is stored with status INTENT, compared against all active intents, returns the intent ID, detected conflicts, and related_work with asserted vs candidate semantics. It also explains side effects on the coordination graph via depends_on, all without contradicting the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: it states the purpose, positions the tool in the workflow, explains the return semantics, and gives the alternative. It is front-loaded with the core purpose and avoids redundancy. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (7 params, nested scopes object, no output schema), the description is remarkably complete: it covers the intent lifecycle, return structure (intent ID, conflicts, related_work with asserted/candidate logic), and the required next steps. It also clarifies the depends_on parameter's role in the coordination graph and references the alternative tool. An agent has everything needed to call it correctly and integrate it with the surrounding workflow.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter is well-documented in the schema itself. The description does not add new parameter-level meaning beyond what the schema already provides—it reinforces the purpose of scopes (conflict detection) but that is also stated in the schema's scopes description. Thus a baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb ('Announce') and a clear resource ('work you are about to do, and the scopes it will change'), immediately stating the tool's purpose. It distinguishes itself from siblings by explicitly positioning it as 'the first call for every task, after register_agent' and naming check_conflicts as a what-if alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance: 'before editing any code' and 'the first call for every task'. It also prescribes the follow-up sequence (record_assessment, claim_work, start_work) and clearly states when NOT to use it, directing the agent to check_conflicts instead for a non-storing what-if check.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_workQuery active workA
Read-onlyIdempotent

Search intents by owner, status or scope, to answer questions like who is changing this symbol, or which work still has open conflicts. Read-only. Each result joins an intent to its agent, its claims, its latest ChangeSet (id and full object), the ids of intents that depend on it, and its count of OPEN or COORDINATING conflicts. Results are an array, capped by limit. With no filters it returns intents of every status, including finished ones. Use get_intent when you already have an id, and status for a grouped overview of everything at once.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of intents to return, from 1 to 500. Default 50.
scopeNoIntents that declared, or ever claimed, a matching scope. Symbols match loosely, on their last two :: segments ignoring namespace and case, so unrelated same-named symbols can appear.
statusNoOnly intents in this lifecycle status: INTENT, CLAIMED, IN_PROGRESS, PROVISIONAL, VALIDATED, ACCEPTED, COMMITTED or DISCARDED. Case-insensitive.
agent_idNoOnly intents owned by this agent (agt_...).

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false), so the description's 'Read-only' phrase is redundant but harmless. It adds genuine behavioral value beyond annotations by disclosing the result shape (joins intent to agent, claims, latest ChangeSet, dependent intent ids, and OPEN/COORDINATING conflict counts), array capping by limit, and the surprising default that with no filters it returns intents of every status including finished ones.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three focused sentences with zero filler: purpose and examples, result shape and safety, default behavior and sibling routing. The most decision-relevant information (what it does, how results look) is front-loaded, and the sibling routing closes the description. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex query tool with no output schema, the description compensates well by describing the joined result shape, the capping behavior, and the unfiltered default. The exhaustive schema covers parameter semantics, so the only gap is exact output field names/types, which the narrative join description largely mitigates. Minor omissions like pagination details are covered by the limit parameter's schema description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%: limit, status, agent_id, and the nested scope object all have thorough descriptions, including the loose symbol-matching caveat. The description reinforces the semantic mapping of filters to questions (owner/status/scope) but adds no syntax or format detail beyond the schema, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Search intents by owner, status or scope') and illustrates the purpose with concrete questions ('who is changing this symbol, or which work still has open conflicts'). It also names the siblings it is not ('Use get_intent when you already have an id, and status for a grouped overview'), so an agent can distinguish it from confusable read-only tools without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly routes the agent to alternatives with the triggering condition: 'Use get_intent when you already have an id, and status for a grouped overview of everything at once.' It also embeds usage signals via the example questions and states the default no-filter behavior, which tells the agent when this tool is appropriate versus when a narrower lookup is better.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

record_assessmentRecord an assessment of related workA

Record what you concluded about one entry from related_work. Foremerge states which scopes overlap and how the declared operations relate; deciding what that means is yours. Call this once per related intent, after publish_intent and before you write code. Each call appends a new assessment rather than replacing an earlier one, and changes no statuses: it does not open, resolve or dismiss conflicts. Act on the verdict with coordinate_with_agent, resolve_conflict or discard_work as needed. Only the intent's owner may assess it. Returns the stored assessment with its asm_ id.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesWhat you will do next. proceeding: continue as planned. rescoping: change your scopes first. waiting: hold until the other work lands. abandoning: drop your intent (then call discard_work).
verdictYesconflicts: the two plans cannot both land as written. compatible: they can. duplicate: the same work twice. depends_on: yours needs theirs to land first.
agent_idYesYour agent id (agt_...). Must own intent_id.
intent_idYesYour intent (int_...) whose publish returned the related_work.
rationaleYesWhy you reached that verdict, specific enough for a later reader to check.
related_intent_idYesThe other intent (int_...) from the related_work entry you are assessing. It may belong to another agent or be one of your own.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are minimal (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the description carries the burden and meets it: append semantics ('Each call appends a new assessment rather than replacing an earlier one'), non-mutation of statuses ('changes no statuses: it does not open, resolve or dismiss conflicts'), an ownership check, and the return shape ('Returns the stored assessment with its asm_ id'). These behaviors go well beyond what the annotation flags convey and do not contradict them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Seven sentences, each earning its place: purpose, verdict semantics, timing, side-effect disclosure, follow-up routing, ownership, and return value. The purpose is front-loaded in the first sentence, followed by the workflow constraint. There is no filler, no repetition of schema text, and the level of detail is proportionate to the tool's 6-parameter workflow complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description discloses the return value ('Returns the stored assessment with its asm_ id'). It covers the full call envelope: when to call, how often, what side effects occur (appended, no status changes), who may call (owner only), and what to do next. For a 6-required-parameter workflow tool with two enums, this is complete enough for an agent to select and invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds workflow meaning the schema cannot: 'deciding what that means is yours' tells the agent the verd_ict parameter is a judgment call on foremerge's overlap data, and 'Act on the verdict with coordinate_with_agent, resolve_conflict or discard_work' explains the intent of the action enum. It doesn't redundantly restate parameter docs, only enriches them, justifying a point above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Record what you concluded about one entry from related_work.' It distinguishes itself from siblings by explicitly framing what it is not: 'it does not open, resolve or dismiss conflicts,' and by routing follow-up action to coordinate_with_agent, resolve_conflict, and discard_work. An agent can tell it apart from publish_intent, check_conflicts, and resolve_conflict without opening their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Timing is explicit: 'Call this once per related intent, after publish_intent and before you write code.' Ownership is stated as a precondition: 'Only the intent's owner may assess it.' Alternative routing is named directly: 'Act on the verdict with coordinate_with_agent, resolve_conflict or discard_work as needed.' Nothing about when to invoke this tool is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

record_commitRecord integration commitA

Record where accepted work finally landed, after it has been merged through ordinary Git or a pull request. Use it last, after accept_changeset and the merge. The commit must contain the accepted commit in its history, otherwise the call fails with TARGET_DIVERGED. On success it stores integration_commit, moves the ChangeSet to COMMITTED, and returns the updated ChangeSet. accepted_commit is kept unchanged, so the record shows both what was verified and where it landed. Foremerge does not merge or push anything itself.

ParametersJSON Schema
NameRequiredDescriptionDefault
git_refYesThe landed commit, as a SHA or ref such as main, resolved in the ChangeSet's worktree.
changeset_idYesAn ACCEPTED ChangeSet (chg_...).

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the failure mode (TARGET_DIVERGED), side effects on success (stores integration_commit, moves ChangeSet to COMMITTED, returns updated ChangeSet), and the non-destructive behavior toward accepted_commit. Since annotations only give false safety hints, this detailed behavioral context is essential and well provided.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: purpose, sequence, failure condition, success effects, preservation of accepted_commit, and a limiter on what the tool does not do. It is compact yet information-dense, with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for invoking the tool correctly, covering prerequisites, ordering, error conditions, return value, and side effects. Even without an output schema or meaningful annotations, the agent has enough context to know when and how to call record_commit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes both parameters with 100% coverage. The description adds important relational context: git_ref must contain the accepted commit in its history or the call fails. This goes beyond the schema's basic definitions and helps the agent understand the meaningful constraint between changeset_id and git_ref.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool records where accepted work landed after a merge, naming both the action and the resource. It distinguishes itself from siblings like accept_changeset by explaining it is used last, after acceptance and merging, and explicitly says it does not merge or push.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit workflow guidance is provided: 'Use it last, after accept_changeset and the merge.' It also states the precondition that the commit must contain the accepted commit in its history, and clarifies that Foremerge does not merge or push anything itself, preventing misuse.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

register_agentRegister coding agentA

Register yourself as a participant and get the agent id every other write tool needs. Call it once at the start of each session, before publish_intent. Every call creates a new agent record, even for a name already in use; a warning is returned when an active agent with the same name and worktree exists, because that record's intents cannot be claimed by the new one. Passing a worktree records its Git branch and head; it must be inside the repository this server is bound to, normally the one it was launched in, or it is rejected with INVALID_INPUT. Returns the agent, including its agt_ id, and any warnings.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesA readable name for this agent, for example payments-stripe.
modelNoOptional model identifier, for example the LLM you are running as.
worktreeNoPath to your Git worktree, inside the repository this server is bound to. Recommended.
capabilitiesNoOptional skills or areas, for example rust or payments, shown to other agents.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses important non-obvious behaviors: every call creates a new agent record even for a repeated name, a warning is returned when an active same-name/worktree agent exists, invalid worktree paths are rejected with INVALID_INPUT, and the response includes the agent plus warnings. These details are significant for correct invocation and are not visible from annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence adds essential information: purpose, call timing, non-idempotence, warning conditions, validation behavior, and return value. It is longer than average but justified by the need to explain branching behavior and constraints. Slight restructuring could improve scannability, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a registration tool with no output schema, the description is remarkably complete: it covers lifecycle timing, idempotency caveats, validation failures, response contents, and relationship to other tools. An agent has enough information to call it correctly and interpret the result without additional investigation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema parameter descriptions already cover all four parameters at 100% coverage, providing a solid baseline. The description adds meaningful extra context for worktree by stating it must be inside the bound repository and is otherwise rejected, and clarifies that the worktree records Git branch and head. This goes beyond the schema without needing to repeat every parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Register yourself as a participant') and the concrete resource produced ('the agent id every other write tool needs'), immediately distinguishing it from sibling tools like list_agents or publish_intent. It clearly communicates the tool's central role in the workflow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to call it once at the start of each session and before publish_intent, providing clear ordering. It also warns about calling it again for the same name/worktree, which tells the agent when reusing the tool may not be appropriate. This is strong, actionable guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolve_conflictResolve a persisted conflictA

Record an audited resolution decision for a durable cfl_* conflict so blocked work can proceed. Over MCP only an agent whose intent is a party may resolve it, and the decision is recorded under its agent id. Foremerge does not verify agreement or message ids, so either party can clear the gate alone: resolve only after the other party agrees. Use coordinate_with_agent first to reach that agreement, and discard_work instead when one side is simply dropping its work. Resolving moves the conflict to RESOLVED, which clears it from the acceptance gate for both intents; it does not change any code. It fails if the conflict is already resolved or dismissed. Returns the updated conflict.

ParametersJSON Schema
NameRequiredDescriptionDefault
agent_idYesYour agent id (agt_...). Your intent must be one of the conflict's two parties.
rationaleYesWhy this resolves the clash, naming the msg_ ids where you agreed it. Must be non-empty; its content is not checked.
resolutionYesShort title for the agreed outcome, for example sequenced: provider abstraction lands first, or split scopes. No fixed vocabulary.
conflict_idYesThe conflict to resolve (cfl_...), from check_conflicts, publish_intent or status.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With only generic annotations (all false), the description carries the full burden and does so thoroughly. It discloses that agreement and message ids are not verified, that either party may resolve alone, the state transition to RESOLVED, the effect on both intents' acceptance gates, that code is not changed, failure conditions, and the return value. This goes far beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is information-dense yet every sentence earns its place: purpose, access constraint, safety warning, alternatives, side effects, failure mode, and return value. It is front-loaded with the core purpose and avoids filler, making it easy for an agent to scan and apply.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's mutation semantics, the lack of an output schema, and minimal annotations, the description is complete. It covers the state change, failure conditions, constraints, and what is returned. An agent has enough information to invoke the tool safely and correctly without needing additional details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all four parameters in detail. The description adds some operational context (e.g., only a party may resolve, decision recorded under agent id), but it does not materially extend parameter meaning beyond what the schema's property descriptions already state. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Record an audited resolution decision') on a specific resource ('durable cfl_* conflict') and explains the goal ('so blocked work can proceed'). It also differentiates from discard_work, making the tool's unique role unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells the agent when to use the tool ('resolve only after the other party agrees'), which tool to use first ('Use coordinate_with_agent first'), and which alternative to choose instead ('discard_work instead when one side is simply dropping its work'). This is clear, actionable guidance with exclusions and alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_verificationRun a trusted verification checkA

Run one named check from the trusted Foremerge registry of the repository this store is bound to. Raw commands are intentionally not accepted over MCP, and the registry cannot be selected by the caller or the server's working directory. Use it after publish_changeset and before accept_changeset; acceptance relies on this result, not on tests you report yourself. The check's command runs in the ChangeSet's worktree with the registry's timeout. It may create only generated files excluded from the fingerprint: changing any other file fails with STALE_CHANGESET, and excluded files left from an earlier run fail with CHECK_FAILED before it starts. The worktree must still match the fingerprint recorded at publication, or the call fails with STALE_CHANGESET and you must publish again. A pass moves the ChangeSet to VALIDATED; a failure leaves or returns it to PROVISIONAL. Returns the validation record: whether it passed, the exit code, captured stdout and stderr, the duration, and the fingerprint it ran against.

ParametersJSON Schema
NameRequiredDescriptionDefault
checkYesName of a check an operator registered with foremerge checks set, for example test. Unknown names are rejected.
changeset_idYesThe ChangeSet (chg_...) to verify. Must be PROVISIONAL or VALIDATED.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide no hints (all false), so the description carries the full burden and excels. It discloses side effects: may create generated files, moves state to VALIDATED or returns to PROVISIONAL, specific failure modes (STALE_CHANGESET, CHECK_FAILED), fingerprint requirements, and the registry timeout. This goes well beyond what annotations offer.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Though lengthy, every sentence earns its place: purpose, usage timing, constraints, error conditions, state transitions, and return value are all covered. Front-loaded with purpose and usage, structured logically. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a state-changing verification tool with error conditions and a return record, the description is complete. It covers prerequisites (fingerprint match), timing relative to siblings, error semantics, state outcomes, and the returned validation record. An agent can invoke it correctly without further info.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers both parameters fully (100% coverage) with descriptions including format and state constraints. The description reiterates the changeset state requirement but adds no new parameter-specific meaning beyond what the schema provides, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('run') and resource ('one named check from the trusted Foremerge registry'), and explicitly differentiates from siblings by noting it is for verification between publish and accept, and that raw commands are not accepted. An agent can clearly identify this as the verification step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: 'Use it after publish_changeset and before accept_changeset; acceptance relies on this result, not on tests you report yourself.' Also says raw commands are not accepted, guiding away from any alternative that might accept free-form commands. No ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_workStart claimed workA

Mark your claimed intent as being implemented. Call it after claim_work, immediately before you begin editing code. It moves the intent from CLAIMED to IN_PROGRESS and fails in any other state, or if you do not own the intent. It does not create or renew claims; use claim_work for that. Returns the updated intent with open_conflicts, the count and ids of its OPEN or COORDINATING conflicts; check their severity with check_conflicts before going further.

ParametersJSON Schema
NameRequiredDescriptionDefault
agent_idYesYour agent id (agt_...). Must own the intent.
intent_idYesYour CLAIMED intent (int_...).

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide no positive hints (all false), so the description carries the burden. It discloses the state machine transition, failure conditions ('fails in any other state, or if you do not own the intent'), scope ('does not create or renew claims'), and return value format. It does not mention reversibility or other side effects, but the state change itself is clearly described.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: purpose first, then usage timing, then state behavior, then exclusions, then return value. Every sentence earns its place and the most critical information (what and when) is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description explains the return value ('Returns the updated intent with open_conflicts, the count and ids of its OPEN or COORDINATING conflicts') and provides a follow-up action. It covers state machine, failure conditions, and excluded behavior, making it sufficient for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds meaning beyond the schema by explaining that intent_id must be in CLAIMED state (though the schema already says 'Your CLAIMED intent') and by clarifying the ownership consequence ('fails... if you do not own the intent'). It also states 'does not create or renew claims,' which clarifies what the parameters do not imply.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Mark your claimed intent as being implemented.' It immediately distinguishes itself from claim_work by stating it 'moves the intent from CLAIMED to IN_PROGRESS' and explicitly noting it does not create or renew claims, so an agent can tell it apart from its sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance: 'Call it after claim_work, immediately before you begin editing code.' It names the alternative for claim creation/renewal ('use claim_work for that') and recommends a follow-up action ('check their severity with check_conflicts'). This fully covers when and when not to use the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

statusRead coordinator statusA
Read-onlyIdempotent

Get the whole coordination picture in one call, taken from a single consistent read: active agents, all intents grouped by lifecycle status, unexpired claims, OPEN or COORDINATING conflicts with both parties named, and ChangeSets grouped by status. Read-only and takes no arguments. Use it to orient at the start of a session or before choosing work. Use query_work to filter by agent, status or scope, and get_intent or get_changeset for full detail on one item.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and non-destructive. The description adds value by stating it is a single consistent read and enumerating the exact content included, which helps the agent understand what the returned picture covers without an output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core capability and content list, then adds usage guidance and alternatives. Every sentence serves a distinct purpose: what, safety, when, and what else to use.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-argument read tool, the description completely specifies what the result includes, its consistency property, and when to call it. It also points to sibling tools for filtering and detail, so an agent has enough context to choose correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, and the description explicitly says 'takes no arguments,' leaving no ambiguity. The schema fully covers parameter semantics, and the description reinforces that no arguments should be supplied.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific purpose: get the whole coordination picture in one call, enumerating active agents, intents grouped by lifecycle status, claims, conficts, and ChangeSets. It also differentiates from siblings by point out query_work for filtering and get_intent/get_changeset for detail.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says when to use it: orient at session start or before choosing work. It also names alternatives for other needs: query_work for filtering and get_intent/get_changeset for single item detail, making routing clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 16 tool updatesv0.4.3
    • Changedaccept_changeset2 fields changed
      • addedInput schema / properties / changeset_id / description
        Added value: +"The ChangeSet to accept (chg_...), as returned by publish_changeset."
      • addedInput schema / properties / git_ref / description
        Added value: +"Optional commit to accept. Defaults to the ref recorded at publication, then the worktree HEAD. Whatever it names must resolve to the current worktree HEAD."
    • Changedcheck_conflicts6 fields changed
      • addedInput schema / properties / agent_id / description
        Added value: +"Optional caller agent id. Informational only; it does not change which work is compared."
      • addedInput schema / properties / intent / description
        Added value: +"Free-form summary of work not yet published, for a what-if check. Provide this or intent_id. Passing an intent id here is rejected; use intent_id."
      • addedInput schema / properties / intent_id / description
        Added value: +"A published intent (int_...) to check. Provide this or intent."
      • addedInput schema / properties / scopes / description
        Added value: +"Scopes to compare, each with the operation you would perform. With intent text, these are the proposed scopes. With intent_id, non-empty scopes replace the intent's own for this check only."
      • addedInput schema / properties / scopes / items / properties / key / description
        Added value: +"The name within that kind, for example PaymentService, POST /orders, or src/billing.rs. Comparison is case-insensitive."
      • addedInput schema / properties / scopes / items / properties / kind / description
        Added value: +"What sort of thing the scope names: a code symbol, an API route, a data schema, a config key, infrastructure, a test, a migration, an environment variable, a file path, a component, a contract, or a broader domain."
    • Changedclaim_work7 fields changed
      • addedInput schema / properties / agent_id / description
        Added value: +"Your agent id (agt_...). Must own the intent."
      • addedInput schema / properties / intent_id / description
        Added value: +"Your intent (int_...) that the claims belong to."
      • addedInput schema / properties / lease_seconds / description
        Added value: +"How long the claim lasts before it expires, from 60 seconds to 24 hours. Default one hour. Claim again to renew."
      • addedInput schema / properties / reason / description
        Added value: +"Optional note shown to other agents explaining why you hold the claim."
      • addedInput schema / properties / scopes / description
        Added value: +"The scopes to claim. Use the scopes declared on the intent; operations are not repeated here."
      • addedInput schema / properties / scopes / items / properties / key / description
        Added value: +"The name within that kind, for example PaymentService, POST /orders, or src/billing.rs. Comparison is case-insensitive."
      • addedInput schema / properties / scopes / items / properties / kind / description
        Added value: +"What sort of thing the scope names: a code symbol, an API route, a data schema, a config key, infrastructure, a test, a migration, an environment variable, a file path, a component, a contract, or a broader domain."
    • Changedcoordinate_with_agent5 fields changed
      • addedInput schema / properties / changeset_id / description
        Added value: +"Optional ChangeSet (chg_...) this message is about. Must exist."
      • addedInput schema / properties / conflict_id / description
        Added value: +"Optional stored conflict (cfl_...) this message is about. An eph_ id from a what-if check_conflicts is rejected with NOT_FOUND. May be combined with changeset_id."
      • addedInput schema / properties / from_agent_id / description
        Added value: +"Your agent id (agt_...)."
      • addedInput schema / properties / message / description
        Added value: +"What you propose or need, in plain language."
      • addedInput schema / properties / to_agent_id / description
        Added value: +"The recipient's agent id (agt_...), for example the owner of the conflicting intent."
    • Changeddiscard_work3 fields changed
      • addedInput schema / properties / agent_id / description
        Added value: +"Your agent id (agt_...). Must own the intent."
      • addedInput schema / properties / intent_id / description
        Added value: +"The intent (int_...) to discard."
      • addedInput schema / properties / reason / description
        Added value: +"Why the work is being abandoned. Required and recorded in the event log."
    • Changedget_changeset1 field changed
      • addedInput schema / properties / id / description
        Added value: +"The ChangeSet id (chg_...)."
    • Changedget_intent1 field changed
      • addedInput schema / properties / id / description
        Added value: +"The intent id (int_...)."
    • Changedpublish_changeset18 fields changed
      • addedInput schema / properties / agent_id / description
        Added value: +"Your agent id (agt_...). Must own the intent."
      • addedInput schema / properties / contracts / description
        Added value: +"Named interfaces or agreements this change affects, for example payment-provider."
      • addedInput schema / properties / decisions / description
        Added value: +"Design decisions a reviewer or later agent should know about."
      • addedInput schema / properties / decisions / items / properties / alternatives / description
        Added value: +"Options you considered and rejected."
      • addedInput schema / properties / decisions / items / properties / rationale / description
        Added value: +"Why you chose it."
      • addedInput schema / properties / decisions / items / properties / title / description
        Added value: +"The decision, for example Use a provider trait."
      • addedInput schema / properties / dependencies / description
        Added value: +"Intent ids (int_...) this change builds on, and the dependency list acceptance enforces. accept_changeset refuses with UNSATISFIED_DEPENDENCY unless each is ACCEPTED or COMMITTED and its accepted commit is in this change's Git history. Intent ids only: not package or library names."
      • addedInput schema / properties / files / description
        Added value: +"Changed file paths. Left empty, they are inferred from uncommitted changes only, so list them for committed work."
      • addedInput schema / properties / git_ref / description
        Added value: +"Candidate commit. Omit it: it defaults to the worktree's HEAD, and acceptance rejects any other commit with STALE_CHANGESET."
      • addedInput schema / properties / intent_id / description
        Added value: +"The intent (int_...) this implementation fulfils."
      • addedInput schema / properties / provenance / description
        Added value: +"Optional JSON object of your own context, such as a prompt or task reference. Foremerge adds Git provenance under provenance.git."
      • addedInput schema / properties / summary / description
        Added value: +"What the change does, in one or two sentences."
      • addedInput schema / properties / symbols / description
        Added value: +"Code symbols added or changed. Left empty, they are inferred from uncommitted changes only, so list them for committed work."
      • addedInput schema / properties / tests / description
        Added value: +"Tests you ran yourself. Recorded as history only; acceptance relies on run_verification, not on this list."
      • addedInput schema / properties / tests / items / properties / command / description
        Added value: +"The command you ran, for example cargo test."
      • addedInput schema / properties / tests / items / properties / status / description
        Added value: +"Its outcome as you observed it, for example passed or failed."
      • addedInput schema / properties / tests / items / properties / summary / description
        Added value: +"Optional short note on what ran or failed."
      • addedInput schema / properties / worktree / description
        Added value: +"Path of the Git worktree holding the change. Defaults to your registered worktree, then the server's working directory. Must belong to your registered repository."
    • Changedpublish_intent9 fields changed
      • addedInput schema / properties / agent_id / description
        Added value: +"Your agent id (agt_...) from register_agent."
      • addedInput schema / properties / depends_on / description
        Added value: +"Intent ids (int_...) this work relies on, recorded for the coordination graph and reported as dependents by query_work. Not checked or enforced: to make acceptance require them, also list them in publish_changeset's dependencies."
      • addedInput schema / properties / metadata / description
        Added value: +"Optional JSON object of extra context stored with the intent."
      • addedInput schema / properties / rationale / description
        Added value: +"Optional reason for the change."
      • addedInput schema / properties / scopes / description
        Added value: +"Every scope this work will touch, each with the operation performed on it. Conflict detection relies on these, so declare them all."
      • addedInput schema / properties / scopes / items / properties / key / description
        Added value: +"The name within that kind, for example PaymentService, POST /orders, or src/billing.rs. Comparison is case-insensitive."
      • addedInput schema / properties / scopes / items / properties / kind / description
        Added value: +"What sort of thing the scope names: a code symbol, an API route, a data schema, a config key, infrastructure, a test, a migration, an environment variable, a file path, a component, a contract, or a broader domain."
      • addedInput schema / properties / summary / description
        Added value: +"What you are going to change, in one sentence."
      • addedInput schema / properties / task / description
        Added value: +"Short name of the task this belongs to, for example payments-provider. Intents with the same task text share one task record."
    • Changedquery_work6 fields changed
      • addedInput schema / properties / agent_id / description
        Added value: +"Only intents owned by this agent (agt_...)."
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of intents to return, from 1 to 500. Default 50."
      • addedInput schema / properties / scope / description
        Added value: +"Intents that declared, or ever claimed, a matching scope. Symbols match loosely, on their last two :: segments ignoring namespace and case, so unrelated same-named symbols can appear."
      • addedInput schema / properties / scope / properties / key / description
        Added value: +"The name within that kind, for example PaymentService, POST /orders, or src/billing.rs. Comparison is case-insensitive."
      • addedInput schema / properties / scope / properties / kind / description
        Added value: +"What sort of thing the scope names: a code symbol, an API route, a data schema, a config key, infrastructure, a test, a migration, an environment variable, a file path, a component, a contract, or a broader domain."
      • addedInput schema / properties / status / description
        Added value: +"Only intents in this lifecycle status: INTENT, CLAIMED, IN_PROGRESS, PROVISIONAL, VALIDATED, ACCEPTED, COMMITTED or DISCARDED. Case-insensitive."
    • Changedrecord_assessment5 fields changed
      • addedInput schema / properties / action / description
        Added value: +"What you will do next. proceeding: continue as planned. rescoping: change your scopes first. waiting: hold until the other work lands. abandoning: drop your intent (then call discard_work)."
      • addedInput schema / properties / agent_id / description
        Added value: +"Your agent id (agt_...). Must own intent_id."
      • addedInput schema / properties / intent_id / description
        Added value: +"Your intent (int_...) whose publish returned the related_work."
      • addedInput schema / properties / rationale / description
        Added value: +"Why you reached that verdict, specific enough for a later reader to check."
      • addedInput schema / properties / related_intent_id / description
        Added value: +"The other intent (int_...) from the related_work entry you are assessing. It may belong to another agent or be one of your own."
    • Changedrecord_commit2 fields changed
      • addedInput schema / properties / changeset_id / description
        Added value: +"An ACCEPTED ChangeSet (chg_...)."
      • addedInput schema / properties / git_ref / description
        Added value: +"The landed commit, as a SHA or ref such as main, resolved in the ChangeSet's worktree."
    • Changedregister_agent4 fields changed
      • addedInput schema / properties / capabilities / description
        Added value: +"Optional skills or areas, for example rust or payments, shown to other agents."
      • addedInput schema / properties / model / description
        Added value: +"Optional model identifier, for example the LLM you are running as."
      • addedInput schema / properties / name / description
        Added value: +"A readable name for this agent, for example payments-stripe."
      • addedInput schema / properties / worktree / description
        Added value: +"Path to your Git worktree, inside the repository this server is bound to. Recommended."
    • Changedresolve_conflict4 fields changed
      • addedInput schema / properties / agent_id / description
        Added value: +"Your agent id (agt_...). Your intent must be one of the conflict's two parties."
      • addedInput schema / properties / conflict_id / description
        Added value: +"The conflict to resolve (cfl_...), from check_conflicts, publish_intent or status."
      • addedInput schema / properties / rationale / description
        Added value: +"Why this resolves the clash, naming the msg_ ids where you agreed it. Must be non-empty; its content is not checked."
      • addedInput schema / properties / resolution / description
        Added value: +"Short title for the agreed outcome, for example sequenced: provider abstraction lands first, or split scopes. No fixed vocabulary."
    • Changedrun_verification2 fields changed
      • addedInput schema / properties / changeset_id / description
        Added value: +"The ChangeSet (chg_...) to verify. Must be PROVISIONAL or VALIDATED."
      • addedInput schema / properties / check / description
        Added value: +"Name of a check an operator registered with foremerge checks set, for example test. Unknown names are rejected."
    • Changedstart_work2 fields changed
      • addedInput schema / properties / agent_id / description
        Added value: +"Your agent id (agt_...). Must own the intent."
      • addedInput schema / properties / intent_id / description
        Added value: +"Your CLAIMED intent (int_...)."
  2. 18 tool updatesv0.1.0
    • First observedaccept_changeset
    • First observedcheck_conflicts
    • First observedclaim_work
    • First observedcoordinate_with_agent
    • First observeddiscard_work
    • First observedget_changeset
    • First observedget_intent
    • First observedlist_agents
    • First observedpublish_changeset
    • First observedpublish_intent
    • First observedquery_work
    • First observedrecord_assessment
    • First observedrecord_commit
    • First observedregister_agent
    • First observedresolve_conflict
    • First observedrun_verification
    • First observedstart_work
    • First observedstatus

TDQS

A4.5/5.0

Scored across 18 tools

Disambiguation5/5

Every tool targets a distinct resource or lifecycle step: reads are separated by entity (intent, changeset, overview/search), and state transitions have explicit sequential roles. The overlap among publish/claim/start/verify/accept/record is intentional and clearly sequenced, so an agent should not confuse one for another.

Naming Consistency5/5

All tools use lower_snake_case and follow a predictable verb_noun pattern (get_intent, publish_changeset, resolve_conflict, run_verification), with only status as a noun-only outlier. There is no mixing of camelCase, bare generic verbs, or multiple verbs for the same action.

Tool Count3/5

At 18 tools the server sits in the 16–25 range that feels heavy for an MCP toolset, even though the coordination workflow genuinely needs most of them. The count is defensible, but it is borderline rather than lean.

Completeness4/5

The full lifecycle is covered: register, publish intent, assess/claim/start, publish changeset, verify, accept, and record commit, with conflict and overview tools throughout. The main gap is that coordinated messages cannot be read through MCP, only sent, so an agent must use the CLI to receive the other side of the conversation.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    F
    maintenance
    MCP server that decomposes tasks into plans with disjoint file boundaries, validates overlaps, and creates git worktrees with a ready prompt per plan.
    3
    28 npm
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Local-first code intelligence and safety layer for AI coding agents. MCP server exposes dependency graph, impact analysis, and AST-compressed repo context, backed by typed local memory, patch-scope safety gates, and git-independent transaction rollback.
    1
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    A filesystem-based MCP server for AI coding agents to coordinate work across git worktrees by claiming files, checking for conflicts, and logging progress without affecting the repository's git history.
    5
    MIT