Skip to main content
Glama

Tower πŸ—Ό

CI Node β‰₯22.13 License: MIT

Multiplayer for your team's AI coding agents.

tower-mcp on npm Β· Website Β· Docs β€” setup: npx -y tower-mcp setup

Every great work tool went multiplayer β€” Docs beat Word, Figma beat Photoshop. AI is still the one everyone uses alone: one prompt, one box, one person.

Tower is an MCP server that turns your team's coding agents β€” Claude Code, Cursor, Codex, on different machines and different accounts β€” into one crew on one repo. Your agent delegates a task to your teammate's agent; theirs does the work with their tokens, commits it, and reports back with the sha β€” and the task, the reply and the sha all land on one shared board the whole team can see, instead of a thousand private threads. And because everyone declares intent before editing, no two agents ever burn tokens on the same code β€” collisions are held before the first keystroke, not found at merge.

YOUR MACHINE β€” alice                          THEIR MACHINE β€” bob
──────────────────────────────                ──────────────────────────────
you: "swap JWT for sessions;
      hand rate-limiting to bob"
agent β†’ send_message (task)      ─────────►   agent claims src/auth.ts
                                              β†’ "unreadMessages: 1" β†’ fetch_messages
                                              (or: tower work accepted it, running claude…)
                                              β†’ does the task, their machine/tokens
                                              β†’ commits (hook completes the claim)
[DONE] bob β†’ alice:              ◄─────────   β†’ send_message (task_update)
"rate limit 30/min, merged in ab12f3"

Tower live board β€” a delegated task, a reply, and a prevented collision

Status: v0.12.1 β€” early, building in public. Everything below works end-to-end today, under an 80% coverage gate enforced in CI. What's shipped and what's next: CHANGELOG.md Β· design doc: MVP-SPEC.md.

Why

Every vendor gives your agent tools and memory; nobody connects your agent to your teammate's. Two people, ten agents, one codebase β€” and the agents can't see each other, can't hand off work, and collide on the same files with nothing to show for it but a merge conflict. Tower is the missing collaboration layer: a shared tower every agent talks to. It sits above git and uses MCP; it doesn't replace either. Model-agnostic by construction β€” coordination only matters if the other vendor's agent is in the room.

Related MCP server: Agent Collab MCP

The six words you need

Word

What it means here

MCP

the standard way agents call external tools. Claude Code, Cursor and Codex all speak it β€” so Tower works with all of them, no plugin

claim

an agent saying "I'm about to edit these files/functions" before it edits. The core move

symbol

a named function, class or method β€” so two agents editing different functions in one file aren't treated as colliding

hard / soft

hard = same symbol β†’ the claim is refused, with what to work on instead (force overrides). soft = same file different symbols, or another branch β†’ you're told, you proceed

board

a web page showing every agent's active claims, tasks and messages

worker

tower work β€” a daemon on a machine that picks up delegated tasks and runs a coding agent headlessly

Claims expire on their own (15-minute TTL, refreshed by heartbeats), so a crashed agent never locks a file forever β€” and a live agent's claims are extended automatically, so they don't lapse mid-task.

One repo means one coordination space. Tower keys claims on the repository's root commit sha, which every clone, fork and mirror shares. So a fork and its upstream coordinate with each other, and git@github.com:acme/app.git and https://github.com/Acme/App are the same place rather than two isolated groups.

See it β€” 30 seconds

Needs Node 22.13+ (it uses the built-in node:sqlite, so there's nothing to compile). Nothing to install, nothing written to disk:

npx -y tower-mcp demo

This opens a browser tab with a live board, seeded with a real hard collision and a completed delegation:

Tower demo is live β†’ http://localhost:52410/board#token=demo

What you're seeing: alice and bob both claimed AuthService.verify β€” a HARD
collision caught before either wrote a line. Below it: a delegated task with
bob's reply + commit, a broadcast still waiting, and a pinned team rule.
Ctrl+C stops the demo (nothing was written to disk).

Didn't work? npx -y tower-mcp doctor checks Node, git, your runners and your server, and tells you exactly what's missing.

npm run demo    # after: git clone … && npm install
β›” COLLISION β€” AuthService.verify
   Agent "cursor-bob" is mid-change (started 2s ago, ETA ~6m, purpose: replace JWT).
   Options:
     [w] wait      β€” no need to retry: Tower messages you when their claim ends
     [d] dependent β€” run: tower next-task  (a module that's safe to start now)
     [b] branch    β€” build on their WIP instead of racing them
     [f] force     β€” re-run guard with --force; you own the merge risk

Install it in your repo

What setup writes β€” all of it in your repo, nothing global, no network calls you didn't configure:

Path

What

.mcp.json

the tower server entry (merged with any servers you already have)

CLAUDE.md

the claim-first rule appended (created if you don't have one)

AGENTS.md

same rule appended β€” only if the file already exists

.tower/

your local SQLite state (claims, messages, tasks). Safe to delete

.gitignore

.tower/ appended, so you never commit the local db

.git/hooks/pre-commit, post-commit

only with --hooks

npx -y tower-mcp setup

Reload your editor β€” done. Add --keep-going and the rule it writes tells agents to route around a conflict rather than stop and ask you (see Nobody waits). Joining a team server instead?

npx -y tower-mcp setup --url https://tower-xxxx.onrender.com/mcp --token <team-secret> --hooks

setup writes the tower entry into .mcp.json (merging with your existing servers), appends the claim-first + check-your-inbox rule to CLAUDE.md (and AGENTS.md if you have one), and with --hooks installs the git pre/post-commit guards. Manual equivalent:

// Claude Code β€” .mcp.json
{
  "mcpServers": {
    "tower": { "command": "npx", "args": ["-y", "tower-mcp", "serve"] },
  },
}
npx -y tower-mcp init      # writes .tower/policy.yaml + prints MCP setup
npx -y tower-mcp serve     # MCP over stdio (or: serve --http --port 4319 --token <secret>)
git clone https://github.com/Rohanxmalik/Tower && cd Tower
npm install && npm run build
node packages/cli/dist/index.js serve

Then add to your agent's rules file:

"Before editing any file, call claim_intent with the files and symbols you'll change. If a hard conflict returns, stop and ask the user; the response's alternatives says what is safe to work on meanwhile."

Full setup β†’ docs/quickstart.md.

Delegate work across machines (the core loop)

Two people, two machines, two accounts β€” one repo. This is what Tower is for:

  1. Delegate β€” you tell your agent "hand the rate-limiting work to bob" (or it decides itself, per your rules): it calls send_message with kind: "task". Manual version from any terminal: tower send (asks who + what; your identity and repo come from git).

  2. Pick up β€” the next time bob's agent touches Tower (any claim_intent), the response says unreadMessages: 1; the rules file tells it to fetch_messages and act. Delivery is inbox-style β€” MCP has no push channel β€” so it's asynchronous, like Slack, not a phone call. Or make it always-on: with tower work running on bob's machine, the pickup is automatic β€” the worker accepts the task and runs a local agent headlessly, no editor needed.

  3. Do the work β€” their machine, their account. Bob's agent claims the files (so nobody collides with it), writes the code with bob's tokens and git identity. No API keys ever cross machines.

  4. Commit & close the loop β€” on commit, the git post-commit hook completes the claim with the sha; the agent replies send_message { kind: "task_update", replyTo: <task> }: "rate limit 30/min on /login, merged in ab12f3." Your agent sees it on its next contact β€” and the whole exchange is on the board's COMMS panel the whole time. Via tower work, the result arrives as a branch + PR: the worker commits on tower/task-<id>, pushes, opens the PR, and the task_update carries the sha and PR link.

Always-on delegation: npx -y tower-mcp work turns any machine into a task worker β€” it polls for delegated tasks, confirms with you (or runs unattended with --auto), drives claude -p / codex exec headlessly, and PRs the result. Full guide + security model β†’ docs/worker.md.

A worker needs three things (run npx -y tower-mcp doctor and it checks all of them): a clean git working tree β€” it refuses to run on uncommitted changes, so it never mixes your work into a task's commit; claude or codex on PATH; and authenticated gh if you want pull requests (without it, branches still push).

Trust model, plainly: an inbound task is code your teammate's agent will act on β€” treat the shared TOWER_TOKEN like push access, and agents should confirm out-of-scope tasks with their human (SECURITY.md).

Drive it from your phone

The board is a remote control, not just a dashboard. Open https://<your-tower>/board on your phone:

  • Send box β€” delegate a task in one line. Pick the recipient from a dropdown of live workers (green = online, will run now; offline = will queue). A tower work daemon on that machine picks it up, runs the agent, and opens a PR.

  • Approve / Reject β€” run the worker with --approve remote and it parks each task instead of asking a terminal. Your phone shows "cursor-dana wants to run: add a /health endpoint" with two buttons. Tap Approve; your laptop does the work.

  • Map view β€” a command-flow tree: who directs whom, each task and its reply, live presence dots. Tap any agent to command it. (docs/map.png)

  • One-tap auth β€” open /board#token=<token> and it connects with no typing.

Same TOWER_TOKEN as everything else β€” anyone who can open your board can drive your worker, so share it like push access. Details β†’ docs/worker.md.

Catch duplicate work before it happens

The expensive failure isn't usually a merge conflict β€” it's two agents doing the same work. They pick different filenames, git merges both cleanly, and you've paid for one deliverable twice. No file-level check can see that, and by the time either agent touches a file the tokens are already spent.

So before researching anything, an agent says what it's about to do:

propose_intent  "write a blog post about prompt injection"

⚠️  claude-bob is already on this (2m ago):
    "AI agent security / prompt injection"
    β†’ stand down, or pick something else

Matched on meaning, not paths β€” it fires even though one agent would have written prompt-injection-agent-security.mdx and the other ai-agent-security-prompt-injection.mdx. Entirely local: no model, no embeddings, no network call.

Catch the contract that moved under you

A claim is only as fresh as the read that produced it.

Comparing what two agents will write catches them editing the same function. It is blind to the more common failure: alice changes AuthService.verify in auth.ts while bob, who read the old signature ten minutes ago, writes a caller in payments.ts. Different file, different symbol β€” nothing overlaps, both are told to proceed, and bob finds out at CI.

So a claim also carries what it was built on:

claim_intent  files: ["src/payments.ts"]  symbols: ["charge"]

[HARD] AuthService.verify moved under you β€” alice changed the declaration you read
    was: verify(token: string)
    now: verify(token: string, opts: Opts)

Two details make this worth having switched on:

It shows you the delta, not a warning. Telling an agent "your context may be stale, re-read the file" costs a whole module back in context to discover one parameter moved. Two lines replace it, and the agent patches its call sites without reopening anything.

It only fires when a caller could actually break. The fingerprint covers the declaration, never the body β€” so a rewritten implementation, a renamed local, a comment or a prettier run move nothing. An added parameter or a changed return type always does.

You don't have to declare what you read: the PostToolUse hook watches Read and records it for you, with each declaration's signature at the moment you looked. And if you claimed first and something moved afterwards, heartbeat tells you β€” on the call your agent already makes every 60 seconds.

Honest limits: a behavioural change under an identical signature is invisible, which is the trade that keeps false positives near zero. See docs/protocol.md.

Nobody waits

A refusal used to be a full stop: stand_down, and a rule telling the agent to ask you. One conflict parked an agent until a human noticed. As of 0.12.0 a conflict is a detour:

The refusal says what's still safe. It carries alternatives β€” what to stay out of, and one line of advice:

(claim REFUSED β€” another agent holds this. Re-run with --force to override.)
What to do instead:
  Held by bob (~10 min). Don't wait: work on anything outside the 2 symbols in
  `avoid`. Tower will message you when it frees up β€” no need to retry.
  Avoid for now: AuthService.verify() (src/auth.ts), charge() (src/payments.ts)

charge is in there because Tower inferred it: an earlier claim wrote charge having read verify, so charge depends on it. No dependency map to write β€” it comes from what agents actually read.

Nobody polls. The moment bob's claim completes, is released or expires, the agent that was refused gets a message from tower saying what freed up.

The same holds when the block comes from the PreToolUse hook or the git pre-commit guard (as of 0.12.1): the blocked agent sees the alternatives and gets the message when the claim frees up.

You find out when you read, not when you edit. Open a file someone is changing and the PostToolUse hook tells your agent right then β€” before it plans anything on top of code that's about to move.

Dependent work runs in parallel β€” contract-first. If alice is changing a signature, she says what it will become:

claim_intent  symbols: [{ symbol: "AuthService.verify",
                          declares: "verify(token: string, opts: Opts): boolean" }]

Bob, writing a caller, is handed that contract β€” not just a warning that verify is moving β€” and codes against it now instead of waiting for alice to land. When alice completes, Tower checks what actually landed and tells bob whether it matches what she declared β€” so if the plan changed, he hears it from Tower, not from CI.

Let agents keep going on their own. tower setup --keep-going writes a rule that says: on a conflict, work outside avoid and only ask the human if nothing safe is left. The default rule still says stop and ask β€” waiting on a person is the conservative choice, and it stays the default.

What actually collides

$ tower stats

2 collision(s) recorded

  by kind
    write_write  1  (50%)  two agents on the same symbol
    write_read   1  (50%)  a contract moved under a reader

Counts only β€” no file names, no symbol names, no code, and nothing leaves your machine. It exists because Tower spent four versions detecting collisions and forgetting every one, so nobody could say which kind actually happens.

The 20 tools

Tool

Purpose

claim_intent

Register intent and get collisions in one call (primary)

check_collision

Dry-run collision check, no claim persisted

heartbeat

Keep a claim alive (auto-expires otherwise)

complete_claim / release_claim

Free a claim on commit / abandon; waiting agents are told it's free

list_claims

Live claim state

log_decision / get_decisions

Shared architecture-decision memory

next_task

Rule-based sequencer: a module that's safe to start now

send_message / fetch_messages

The agent channel: async messages + task delegation between agents

pending

Read-only count of unread messages + open tasks waiting for you (the nudge)

accept_task / complete_task / list_tasks

Task lifecycle: first-accept-wins assignment, results with sha/PR

request_approval / resolve_approval

Human-in-the-loop gate: park a task, approve it from the board/phone

heartbeat_worker

Live presence β€” a worker announces it's online & ready to run tasks

propose_intent

Before you research: say what you plan to do; catches duplicate work

record_reads

What you just read β€” and who is changing it right now (the hook calls it)

Wire contract β†’ docs/protocol.md.

How it works

MCP clients (Claude Code / Cursor / Codex)
        β”‚  stdio  Β·  HTTP/SSE
        β–Ό
Tower server ── collision engine (tree-sitter) Β· agent inbox Β· sequencer Β· SQLite Β· /board UI
        β–²
tower CLI: demo Β· doctor Β· init Β· setup Β· serve Β· status Β· stats Β· watch Β· complete Β· claim Β· guard Β· next-task Β· send Β· inbox Β· nudge Β· work Β· version
  • Semantic, not textual: symbols come from tree-sitter ASTs (TS/JS/Python), so AuthService.verify collides even across different diff hunks.

  • Model-agnostic: it's an MCP server β€” every major agent works today.

Enforcement (don't rely on the agent remembering)

A tool call the agent chooses to make isn't a safety net. Tower has three enforcement layers β€” stack them:

  1. MCP tools + rules file β€” every agent (Claude, Cursor, Codex) claims before editing. tower setup writes this for you.

  2. Claude Code hooks β€” a conflicting Edit/Write/MultiEdit is physically blocked. ⚠️ Needs a clone of Tower today β€” the hook scripts aren't in the npm package; they run from the clone and import its built CLI:

    npm install && npm run build
    npx tower-mcp init --hooks   # writes .claude/settings.json, then reload Claude Code

    That wires five hooks: SessionStart registers the session, UserPromptSubmit tells you when tasks or messages are waiting, PreToolUse blocks a hard-conflicting edit (exit 2), PostToolUse keeps your presence alive on edits and, on Read, records what you read and warns you if someone is changing it, SessionEnd releases your claims. Upgrading an existing install is the same command β€” git pull && npm install && npm run build && npx tower-mcp init --hooks β€” which rewrites Tower's own entries to the current version and never changes your own hooks. Re-running it changes nothing.

  3. Universal git pre-commit guard β€” works with any editor or agent; the commit itself is refused while a teammate's agent holds a conflicting claim:

    cp examples/git-hooks/pre-commit .git/hooks/pre-commit && chmod +x .git/hooks/pre-commit

How precise the hook is: it locates each edit and claims the function it lands in, so two agents in different functions of one file don't block each other. A Write, a new file, or an edit between declarations (imports, top-level code) falls back to the whole file β€” over-claiming is safe, under-claiming is not. Full scope and limits β†’ docs/enforcement.md.

The live board

Every serve --http Tower ships a live board at /board (it refreshes every 2s): every agent's active claims, collisions flagged red, how long each claim has been open β€” and the COMMS panel showing every message and delegated task as it lands. Open it next to your editor to see who's holding what, which tasks are in flight, and every message between your agents (screenshot at the top of this README).

To be clear about what this is: the board shows claims, tasks and messages β€” not a live transcript of an agent's session. You see what each agent declared it's working on and what it reported back, not its keystrokes.

The agent channel from a terminal β€” just run send; it asks the rest (who you are + the repo come from git):

$ npx -y tower-mcp send
To (agent id, or * for everyone): bob
Message: add rate limiting to /login
Is this a task for them? [y/N]: y
πŸ“¨ Sent task c78094d1 β†’ bob

$ npx -y tower-mcp inbox         # your messages (identity inferred from git)

(Scripts/agents pass flags instead: send --to bob --body "..." --task β€” prompts never appear outside a real terminal.)

GitHub Action: PR collision reports

No server needed β€” one workflow file comments on any PR that touches the same files (overlapping lines flagged) as another open PR, and shows live agent claims if you run a hosted Tower:

- uses: Rohanxmalik/Tower/action@v0.12.1

Pin a release tag like this; @main works too but tracks the bleeding edge. Setup + screenshots β†’ docs/action.md.

Team mode (whole team, different machines)

Point everyone's agents β€” Claude, Cursor, Codex β€” at one Tower. When two people's agents reach for the same file, the second is flagged before it spends a token β€” not at merge. Two setups, pick by your team:

  • Same office / same WiFi (or living together): no deploy, no tunnel β€” one laptop hosts (serve --http --host 0.0.0.0), everyone points at its 192.168.x.x address. 2 minutes.

  • Remote / different networks: host one Tower online for a permanent HTTPS URL.

Deploy your own online in ~5 minutes (free tiers available), no tunnels:

Deploy to Render

Or self-manage with Docker:

TOWER_TOKEN=your-secret docker compose up -d   # http://<host>:4319/mcp

Each dev's .mcp.json uses "type": "http", "url": ".../mcp" β€” now your Claude tells your co-founder's Codex "don't touch auth until commit abc123." Full setup, beginner-friendly β€” same-WiFi mode + click-by-click Render steps + per-editor config β†’ docs/team.md.

πŸš€ Don't want to host it? Tower Cloud β€” a managed, always-on coordination server for teams β€” is coming. Join the waitlist.

Trust, data, and how to remove it

  • No telemetry. Tower makes no network calls except the ones you configure. The board page loads zero external resources β€” no CDN, no fonts, no analytics.

  • Your data stays in your repo. Claims, messages, tasks and decisions live in .tower/tower.db β€” a plain SQLite file. Delete the folder and it's gone.

  • No API keys cross machines. A worker shells out to the claude / codex already installed on that machine. Tower never sees a vendor credential.

  • TOWER_TOKEN is a shared secret β€” treat it like push access. Anyone holding it can delegate a task to a worker on your team. See SECURITY.md.

  • Tower never blocks you by failing. Every hook fails open: if Tower is unreachable or a hook errors, your edit and your commit go through.

  • To remove it: delete .tower/, drop the tower entry from .mcp.json, and delete .git/hooks/pre-commit and post-commit if you installed them with --hooks. If you ran init --hooks, also drop Tower's node hooks/… entries from .claude/settings.json.

Monorepo layout

packages/shared   protocol types + zod schemas (source of truth)
packages/server   collision engine, sequencer, SQLite store, MCP server, transports
packages/cli      the `tower` command
hooks/            the five Claude Code hooks (SessionStart … SessionEnd; PreToolUse blocks)
action/           GitHub Action β€” PR collision reports
extensions/       tower-anywhere β€” claim-before-you-edit for non-code work (docs, briefs)
examples/         two-agents-demo, git-hooks (pre-commit guard, post-commit release)
docs/             quickstart, protocol, worker, enforcement, team, action
Dockerfile        hosted team server

Develop

npm install
npm test          # vitest, 80% coverage gate
npm run build     # tsc -b

Roadmap

  • Per-agent identity & auth (today: one shared team token) β€” the Tower Cloud foundation

  • More language grammars for symbol extraction (Go, Rust, Java β€” contributions welcome)

  • Predictive conflict detection (ML on your merge history) β€” the eventual moat

  • Auto-resolution / reconciliation agent

  • Cross-repo / org-wide intent graph + API-contract break detection

  • Enterprise: policy engine, SSO, audit ledger

Contributing & community

PRs welcome β€” see CONTRIBUTING.md (TDD, small PRs, good-first ideas inside). Security reports β†’ SECURITY.md. Changes β†’ CHANGELOG.md.

License

MIT

Available Tools

20 tools
accept_taskB

Claim a delegated task before working on it (first accept wins β€” prevents two agents doing the same work).

ParametersJSON Schema
NameRequiredDescriptionDefault
taskIdYes
agentIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
taskYes
reasonNo

TDQS

B3.4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It does disclose a meaningful behavioral trait β€” first-accept-wins semantics that prevent duplicate work β€” which is valuable. But it omits what happens on a losing claim (error vs. no-op), idempotency, and any auth requirements for agentId.

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?

A single front-loaded sentence with no filler; the parenthetical efficiently conveys the concurrency rationale. Nothing is wasted.

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?

An output schema exists, so return values need not be described, and the core concurrency rationale is present. The main gap is the failure path when a task is already claimed, which is central to the 'first accept wins' framing but never spelled out.

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

Parameters2/5

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

Schema coverage is 0% and the two required parameters (taskId, agentId) have no schema descriptions. The description implies a task identifier but says nothing about agentId β€” whether it is the claiming agent's own identity or something else β€” so it does not compensate for the coverage gap.

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

Purpose4/5

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

States a specific verb (claim) and resource (delegated task) plus the scope of the operation, so it is distinct from release_claim and complete_claim. It stops short of naming a sibling by name, so differentiation requires a bit of inference from the sibling list.

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

Usage Guidelines3/5

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

The phrase 'before working on it' gives timing guidance (claim precedes work), which implies when to call it. However, it never addresses alternatives such as check_collision, claim_intent, or complete_claim, nor when-not to call it, leaving routing to inference.

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

check_collisionA

Check for collisions without registering a claim (a dry run).

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYes
filesNo
readsNo
branchYes
repoIdNo
agentIdNo
symbolsNo
projectIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
conflictsYes

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It discloses an important trait, that no claim is registered, but omits permissions, side effects beyond claim registration, validation behavior, and whether any state is mutated.

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?

It is a single, front-loaded sentence with no wasted words. The dry-run constraint is placed after the core action, keeping the purpose immediately clear.

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

Completeness2/5

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

For an 8-parameter tool with no annotations and no parameter documentation, this one-sentence description is incomplete. The output schema may cover return values, but the description says too little about inputs, collision semantics, and required context.

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

Parameters1/5

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

The schema has 8 parameters with 0% description coverage, and the description names none of them. It does not explain repo, branch, files, symbols, or the other inputs that determine collision checking.

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: 'Check for collisions.' It also distinguishes this tool from claim-registering siblings with 'without registering a claim (a dry run),' so an agent can tell it apart from claim_intent 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 Guidelines4/5

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

The dry-run phrasing clearly implies when to use this tool: to check collisions before or instead of registering a claim. However, it does not explicitly name the alternative tool or state when registration is required, so some inference remains.

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

claim_intentA

Register intent to edit code BEFORE editing. Returns any collisions with other active agents. Call this first, always. Also pass reads: the declarations you consulted to write this β€” the functions, methods or types you are calling or implementing against. Tower tells you when one of them changes under you, and shows the old and new signature so you can patch your call sites without re-reading the file. If you are changing a symbol's signature, set declares on it to the new declaration as it will read in the source, up to the body (e.g. function verify(token: string, opts: Opts): boolean): agents whose work reads it are handed that contract immediately and can code against it in parallel instead of waiting for you. If the claim is refused, the response carries alternatives: what to avoid, and advice. Don't stop β€” work outside avoid; Tower messages you when it frees up.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYes
filesNo
forceNo
readsNo
branchYes
repoIdNo
agentIdYes
purposeNo
symbolsNo
projectIdNo
etaMinutesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
claimIdYes
blockingNo
conflictsYes
alternativesNo
projectWarningNo
recommendationNo
unreadMessagesNo

TDQS

A3.8/5.0
Behavior4/5

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

No annotations, so the description carries the full burden and does so well: it discloses collision reporting, that Tower notifies on read changes and shows old/new signatures, that `declares` hands a contract to parallel agents, and the refusal response shape (`alternatives`, `avoid`). It omits auth/permission and rate-limit behavior, keeping it from a 5.

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?

Front-loaded with the core action and effect, then elaborates on reads/declares/refusal. It is a long single paragraph, but nearly every sentence conveys actionable behavior rather than filler.

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

Completeness3/5

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

An output schema exists, so return values need no explanation, and the collision/refusal behavior is described. However, for an 11-parameter tool with 0% schema documentation, the roles of `files` vs `symbols`, `force`, and `etaMinutes` are left to inference, leaving gaps an agent must still resolve.

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 0% across 11 parameters, so the description must compensate. It explains the subtle `reads` and `declares` semantics well (including example syntax), but leaves central parameters like `files`, `force`, `purpose`, `etaMinutes`, `repoId`, and `projectId` entirely undocumented. Partial compensation for a large parameter surface.

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

Purpose4/5

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

States a specific verb+resource ('Register intent to edit code') and its primary effect ('Returns any collisions with other active agents'). The intent is unambiguous and distinguishable from adjacent siblings like release_claim or propose_intent. It stops short of explicitly naming the sibling it differs from, so it lands at 4 rather than 5.

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

Usage Guidelines4/5

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

Strong temporal directive: 'Register intent to edit code BEFORE editing' and 'Call this first, always.' It also gives an explicit fallback path for refusal ('work outside avoid; Tower messages you when it frees up'). It does not name alternative tools (e.g. record_reads vs the reads param), so it is clear context without explicit tool alternatives.

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

complete_claimA

Release a claim after committing (optionally record the commit sha). Pass symbols with their final sig/sigText and every agent whose work reads a changed declaration is told what it landed as, and whether it matches what you declared.

ParametersJSON Schema
NameRequiredDescriptionDefault
claimIdYes
symbolsNo
commitShaNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
notifiedNo

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It does disclose a meaningful side effect: every agent reading a changed declaration is notified of the final signature and whether it matches the declaration. But it says nothing about what releasing the claim actually mutates, whether it is reversible, auth/permission needs, or 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.

Conciseness4/5

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

Two sentences, action front-loaded, no filler. The second sentence is somewhat tangled ('is told what it landed as'), but it earns its length by disclosing the cross-agent notification behavior.

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

Completeness3/5

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

An output schema exists, so return values need no explanation, and the core payload semantics are covered. For a state-mutating claim operation with zero annotations, though, the description should say more about the effect on claim state and how it differs from release_claim.

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 description coverage is 0%, so the description must compensate, and it does for two params: it explains that symbols should carry the final sig/sigText (not just any value) and that commitSha is optional. claimId is left implicit, which is the only real gap.

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

Purpose4/5

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

States a specific verb+resource (release a claim) and a precise trigger (after committing, optionally recording commitSha). It does not, however, name or differentiate itself from the near-identical sibling release_claim, which an agent would reasonably confuse it with from name alone.

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

Usage Guidelines4/5

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

Gives a clear timing condition β€” use it after you have committed β€” and notes that recording the commit sha is optional. It stops short of the 5-level bar because it never states a when-not or points to release_claim as the alternative for the non-commit case.

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

complete_taskA

Finish an accepted task: success or failure, with the result and optional commit sha / PR url. Auto-notifies the delegator.

ParametersJSON Schema
NameRequiredDescriptionDefault
prUrlNo
resultNo
taskIdYes
agentIdYes
successNo
commitShaNo
filesChangedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It does disclose one important side effect ("Auto-notifies the delegator"), which is real added value, but it omits permissions/auth requirements, idempotency (what happens if called twice), and error behavior for tasks not in an accepted state.

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?

A single dense sentence with zero filler. The core action is front-loaded and the side effect is appended, so nothing is wasted.

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

Completeness3/5

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

An output schema exists, so return values need not be described. Still, for a 7-parameter mutation tool with zero annotation coverage and no parameter descriptions in the schema, the definition leaves too much unspecified β€” notably identifier semantics, filesChanged, and failure/edge-case behavior.

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 0%, so the description must compensate. It explains result, commitSha, prUrl, and success (including the default-true semantics implied by "success or failure"), covering the most ambiguous fields, but it says nothing about the required taskId/agentId or filesChanged, leaving three parameters undocumented everywhere.

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

Purpose4/5

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

States a specific verb and resource ("Finish an accepted task") plus the outcome semantics (success or failure) and the artifacts carried back (result, commit sha, PR url). It does not distinguish itself from the close sibling complete_claim, which an agent could easily confuse with this tool, so it falls short of a 5.

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

Usage Guidelines3/5

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

"an accepted task" implies the precondition that the task was previously claimed/accepted, which is useful routing context. However, it never states when not to use it or names complete_claim as the alternative, so the usage guidance is only implied rather than explicit.

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

fetch_messagesA

Read your inbox (marks messages read). Call whenever claim_intent reports unreadMessages > 0.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoNo
repoIdNo
agentIdYes
projectIdNo
unreadOnlyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
messagesYes

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden, and it does disclose the critical side effect that reading marks messages read. However, it says nothing about whether it drains all messages or a page, error behavior, or what happens to already-read messages when unreadOnly is defaulted.

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?

Two short sentences, action first and trigger second, with zero filler. Every clause carries information an agent needs.

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

Completeness3/5

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

An output schema exists so return values need not be explained, and the when-to-call guidance is complete. But for a five-parameter tool with no annotations and no parameter documentation, the definition leaves the agent guessing about scoping inputs.

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

Parameters2/5

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

Schema description coverage is 0% across five parameters, so the description must compensate and instead adds no parameter meaning whatsoever β€” nothing about agentId/repo/repoId/projectId scoping or what unreadOnly=true (the default) means. Only the side-effect note tangentially hints that read messages are affected.

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

Purpose4/5

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

States a specific verb and resource ('Read your inbox') and even flags the side effect in parentheses, so the agent knows exactly what the operation is. It stops short of explicitly distinguishing itself from other read-oriented siblings like pending or get_decisions, but the inbox framing is clear enough to route on.

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?

Gives a concrete, executable trigger: 'Call whenever claim_intent reports unreadMessages > 0.' It names the sibling tool that produces the condition and the exact field value that selects this tool, leaving nothing to inference.

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

get_decisionsC

Recall past architecture decisions before acting.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoNo
tagsNo
queryNo
repoIdNo
projectIdNo
relatedFilesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
decisionsYes

TDQS

C2.8/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It implies a read/recall operation, but says nothing about scoping behavior when all six optional filters are omitted, result limits/ordering, or the cost of an unfiltered query.

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

Conciseness3/5

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

The single short sentence is front-loaded and free of waste, but for a tool with six undocumented and overlapping filters it is undersized rather than concise β€” there is room to add distinguishing detail without bloat.

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

Completeness2/5

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

An output schema exists, so return-value documentation is not owed. Still, given six optional parameters with zero coverage and no annotations, the description leaves the invocation mechanics (which filters to combine, what an unfiltered call returns) entirely unresolved.

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

Parameters2/5

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

All six parameters have 0% schema description coverage and the description mentions none of them. The schema exposes ambiguous pairs (repo vs repoId, projectId, tags vs relatedFiles vs query) with no explanation of how they interact or which to prefer, leaving the agent to guess.

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

Purpose4/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 ('Recall past architecture decisions'), which is much clearer than a tautology. However, it never distinguishes this tool from its sibling log_decision, the obvious write-side counterpart, so an agent must infer the read/write split from names alone.

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

Usage Guidelines3/5

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

'before acting' supplies a temporal trigger for use, which is more than nothing, but there is no statement of when not to use it, no mention of the log_decision sibling, and no guidance on which parameters are needed for which retrieval scenario.

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

heartbeatB

Keep an active claim alive; claims auto-expire without heartbeats. Returns invalidations: declarations your work read that have moved, or that another agent has declared it is about to change β€” with the new signature, so you can adapt before it lands.

ParametersJSON Schema
NameRequiredDescriptionDefault
claimIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
expiresAtYes
invalidationsNo

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It usefully discloses auto-expiration and explains what `invalidations` means, but it omits TTL behavior, failure modes, ownership requirements, and what happens when the claim is already invalid.

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 first sentence front-loads the core purpose, and the second explains the return payload. The description is dense but well-structured, with no obviously wasted sentences.

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

Completeness3/5

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

The tool is simple, has an output schema, and the description covers its basic purpose and return meaning. Still, it lacks usage cadence, parameter sourcing, and key behavioral details that would help an agent call it correctly without additional context.

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

Parameters2/5

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

Schema description coverage is 0%, so the description should compensate for the undocumented `claimId` parameter. It only implies that the claim must be active; it does not explain where `claimId` comes from, its format, or how to obtain one.

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

Purpose4/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: keeping an active claim alive. It distinguishes the action from mere claim creation or release, but it does not differentiate this tool from its sibling heartbeat_worker.

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

Usage Guidelines3/5

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

It implies when to use the tool by warning that claims auto-expire without heartbeats. However, it gives no explicit guidance on frequency, timing, prerequisites, or when to prefer a sibling such as heartbeat_worker.

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

heartbeat_workerB

Announce that this worker is online and ready to run tasks (call it every poll so the board shows live presence).

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYes
repoIdNo
runnerNo
statusNook
agentIdYes
projectIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It discloses the cadence (every poll) and the observable effect (board shows live presence), but omits idempotency, permission requirements, and what happens if the call is skipped or fails.

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?

A single front-loaded sentence with a compact parenthetical for usage cadence. Every clause earns its place, and there is no filler.

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

Completeness2/5

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

The output schema exists, so return values need not be explained. However, for a tool with six undocumented parameters and no annotations, the description is too thin on parameter meaning and operational prerequisites to let an agent call it correctly without inspecting the schema.

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

Parameters1/5

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

Schema description coverage is 0% across six parameters, and the description adds no meaning for any of them. Required fields (agentId, repo), the status enum (ok/low), and optional fields like runner and projectId are left entirely unexplained.

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

Purpose4/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: announce that this worker is online and ready to run tasks. It also clarifies the effect on the board. It does not differentiate itself from the sibling `heartbeat` tool, leaving some ambiguity about which to use.

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

Usage Guidelines4/5

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

It explicitly says to call the tool every poll so the board shows live presence, which gives clear usage cadence. It does not say when not to use it or mention any alternative tools like `heartbeat`.

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

list_claimsB

List claims, optionally filtered by repo/branch/status.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoNo
branchNo
repoIdNo
statusNo
projectIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
claimsYes

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden; the verb 'List' implies a non-destructive read, which is the key trait. It says nothing about ordering, pagination, or limits, though the presence of an output schema removes the need to explain return values.

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?

A single compact sentence with the core action front-loaded and the modifiers trailing. Nothing redundant or wasted.

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

Completeness3/5

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

Output schema exists so return values needn't be described, and the tool is a simple list operation, lowering the bar. Still, two of five filter parameters are undocumented and there is no guidance on ordering or result size, leaving gaps for a zero-annotation tool.

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

Parameters2/5

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

Schema description coverage is 0% across 5 parameters, so the description must compensate, yet it only names repo, branch, and status. The repoId and projectId parameters are completely undocumented in both schema and description, and no filter semantics (AND vs OR, enum behavior) are explained.

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

Purpose4/5

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

States a specific verb+resource ('List claims') and names the filterable fields, which is clear on its own. However, it offers no differentiation from siblings such as list_tasks or get_decisions, so an agent cannot tell from the description alone why it would pick this over those.

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

Usage Guidelines3/5

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

'optionally filtered by repo/branch/status' implies the use case (browse claims with optional narrowing), but there is no explicit when-to-use, when-not-to-use, or pointer to an alternative tool. Usage is inferable but not stated.

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

list_tasksB

List delegated tasks by repo/status/recipient/assignee (the worker's poll).

ParametersJSON Schema
NameRequiredDescriptionDefault
repoNo
repoIdNo
statusNo
projectIdNo
forAgentIdNo
assigneeAgentIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
tasksYes

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. 'List' implies read-only behavior and 'poll' implies repeated retrieval, but the description omits permissions, rate limits, pagination, or side-effect details.

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 a single front-loaded sentence with no wasted words. It states the verb, resource, filter dimensions, and usage context efficiently.

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

Completeness2/5

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

For a six-parameter tool with no annotations and 0% schema description coverage, the description is too sparse. An output schema exists so return values need not be explained, but missing parameter semantics and usage guidance leave significant gaps.

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 0%, so the description must add parameter meaning. It maps repo, status, recipient, and assignee to four of the six parameters, but omits repoId and projectId and does not explain optionality or the distinction between similarly named filters.

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

Purpose4/5

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

States a clear verb ('List'), resource ('delegated tasks'), and filter dimensions. The parenthetical '(the worker's poll)' adds a usage context. It does not explicitly distinguish itself from siblings like list_claims or next_task, so it falls short of a 5.

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

Usage Guidelines3/5

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

'The worker's poll' implies the context in which this tool is used, giving some usage guidance. However, it provides no explicit when-to-use, when-not-to-use, or alternative-sibling guidance, which leaves the agent to infer selection behavior.

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

log_decisionC

Record an architecture decision and WHY it was made, for the team's shared memory.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNo
repoNo
tagsNo
titleYes
authorYes
repoIdNo
projectIdNo
relatedFilesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes

TDQS

C2.8/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden and mostly fails to: it does not say whether records are permanent, whether duplicates are merged, whether teammates are notified, or what identity requirements the author field implies. 'Shared memory' does disclose that the entry is team-visible, which is the only real behavioral signal.

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?

A single sentence, front-loaded with the action and resource, with zero filler. The rationale emphasis is delivered compactly.

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

Completeness2/5

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

An output schema exists so return values need no explanation, but for an 8-parameter mutation tool with no annotations and no schema descriptions, the description is far short of what an agent needs. It omits parameter mapping, required-field implications, and any behavioral consequences of writing to shared memory.

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

Parameters2/5

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

Schema description coverage is 0% across 8 parameters (title, author, body, repo, repoId, projectId, tags, relatedFiles), and the description mentions none of them. The emphasis on 'WHY' loosely implies what belongs in body, but title/author being required and the id-vs-name distinction between repo and repoId are left completely unexplained.

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

Purpose4/5

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

The description names a specific verb and resource ('Record an architecture decision') and adds the distinguishing nuance that the rationale ('WHY') is captured too. It implicitly contrasts with the read-side sibling get_decisions, though it never names that sibling explicitly.

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

Usage Guidelines2/5

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

There is no when-to-use or when-not-to-use guidance, and no alternative is named despite get_decisions existing in the sibling set. 'For the team's shared memory' hints at intent but leaves the triggering condition for logging a decision entirely to inference.

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

next_taskB

Ask the sequencer for a task whose module is safe to start right now.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYes
repoIdNo
agentIdYes
projectIdNo
candidatesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
taskYes
reasonYes

TDQS

B3/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden. It hints at sequencer coordination and module-safety, but does not disclose whether fetching reserves/locks the task, what happens when no safe task exists, whether it mutates state, or any auth requirements.

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?

A single, front-loaded sentence with no filler. Every word contributes to conveying the tool's action and selection criterion.

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

Completeness2/5

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

The output schema covers return values, so that need not be explained. But for a coordination tool with five undocumented params and zero annotations, the description omits essential context about inputs and side effects, leaving the agent under-informed.

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

Parameters2/5

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

Five parameters with 0% schema description coverage and no parameter explanation in the description. The phrase 'whose module is safe' loosely gestures at the module concept likely tied to the 'candidates' array, but required inputs agentId and repo, and optional repoId/projectId/candidates, are entirely unexplained.

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

Purpose4/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 ('Ask the sequencer for a task') and adds a meaningful qualifier ('whose module is safe to start right now'), which conveys collision-aware selection. It does not explicitly differentiate itself from potentially overlapping siblings like pending, list_tasks, or accept_task, so it stops short of a 5.

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

Usage Guidelines3/5

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

Usage is implied: an agent should call this when it wants to begin work and needs a task that won't collide. However, the description never says when to prefer this over pending, list_tasks, or accept_task, nor does it state prerequisites or exclusions.

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

pendingA

Read-only count of unread messages + open tasks waiting for you. Marks nothing read β€” the interactive nudge; if it returns > 0, call fetch_messages / list_tasks.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoNo
repoIdNo
agentIdYes
projectIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
openTasksYes
unreadMessagesYes

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does disclose the key behavioral trait: 'Read-only ... Marks nothing read,' making the side-effect-free nature explicit. It does not cover auth requirements, scoping, or rate limits, but the most important behavioral fact (it is a non-mutating nudge) is front and center.

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?

Two tight sentences, front-loading the read-only count semantics and then the follow-up routing. Every clause earns its place with no filler.

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

Completeness3/5

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

An output schema exists, so return values need not be explained, and the '> 0' condition hints at the count. However, the four undocumented filter parameters leave a real gap for an agent deciding how to scope the call, so it is only minimally complete.

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

Parameters2/5

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

Four parameters (agentId required, plus repo, repoId, projectId) have 0% schema description coverage, and the description explains none of them. Whether the count is scoped by repo/project is left entirely to inference, so the description fails to compensate for the coverage gap.

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

Purpose4/5

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

The description states a specific verb+resource: a read-only count of unread messages and open tasks. It implicitly distinguishes itself from the listing siblings (fetch_messages/list_tasks) by framing itself as a count/nudge rather than a full read. It does not explicitly name itself against those siblings, but the purpose is unmistakable.

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

Usage Guidelines4/5

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

It gives a clear conditional trigger: 'if it returns > 0, call fetch_messages / list_tasks,' routing the agent to the correct follow-up tools. It stops short of stating when not to use it (e.g., when you already know you need full content, skip the count), so it is clear context without explicit exclusions.

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

propose_intentA

BEFORE you research or write anything: say in plain English what you plan to work on. Returns anyone already doing the same work, matched on meaning rather than file paths β€” so it catches a duplicate even when you would have picked a different filename. One call per task; it is the cheapest check Tower offers and the only one that fires before your tokens are spent.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYes
repoIdNo
agentIdYes
purposeYes
projectIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
matchesYes
duplicateNo
recommendationNo

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It discloses what comes back (anyone already doing the same work, semantic matching) and a cost/ordering trait, but leaves unresolved whether the call registers durable state, whether it mutates anything, or whether repeated calls are idempotent β€” key behavior for a 'propose' tool.

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 the imperative timing constraint front-loaded. Every clause adds routing or behavioral information; nothing is padding.

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

Completeness3/5

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

An output schema exists, so return values needn't be explained, and usage timing is well covered. However, with zero annotation coverage and five undocumented parameters, an agent still lacks guidance on what the identifier fields mean and whether the call has side effects.

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

Parameters2/5

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

Schema description coverage is 0% across 5 parameters (agentId, repo, repoId, purpose, projectId). The description only loosely implies the purpose field via 'say in plain English what you plan to work on' and says nothing about repo, repoId, projectId, or agentId semantics, so it fails to compensate for the coverage gap.

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

Purpose4/5

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

The description gives a concrete verb and resource: state in plain English what you plan to work on before researching or writing. It also distinguishes the matching behavior ('matched on meaning rather than file paths') from path-based checks, though it never names the sibling tools (claim_intent, check_collision) it sits beside.

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

Usage Guidelines4/5

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

It states the timing condition clearly ('BEFORE you research or write anything'), the call frequency ('One call per task'), and the value rationale ('cheapest check', 'fires before your tokens are spent'). It stops short of naming explicit alternatives or when-not-to-use cases.

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

record_readsA

Record declarations you just read, so your next claim_intent knows what your work is built on. Returns conflicts straight away when another agent is changing what you read β€” the cheapest moment to find out, before you plan against it. Normally called by the PostToolUse hook, not by you.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYes
readsNo
branchNo
repoIdNo
agentIdYes
projectIdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
recordedYes
conflictsNo

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does well: it discloses this is a recording/mutation step, that it returns `conflicts` immediately when a peer is editing what you read, and why that timing matters. It doesn't cover auth, idempotency, or error behavior, but the output schema covers the return shape.

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 tight sentences: purpose first, the payoff (early conflict detection) second, the operational caveat last. Every sentence earns its place with no filler.

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

Completeness3/5

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

The output schema covers return values, and the description explains the tool's role in the coordination loop well. But for a 6-parameter coordination tool with 0% parameter coverage, an agent still lacks semantic grounding on the required and identity fields.

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

Parameters2/5

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

Schema description coverage is 0% across 6 parameters, so the description must compensate and does not. Only 'declarations you just read' loosely maps to the `reads` payload; repo, repoId, branch, agentId, and projectId receive no explanation anywhere.

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?

States a specific verb and resource ('Record declarations you just read') and immediately frames its role in the workflow by naming the sibling it feeds into (claim_intent). An agent can tell this apart from check_collision or claim_intent without opening the schema.

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

Usage Guidelines4/5

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

Gives explicit routing guidance: 'Normally called by the PostToolUse hook, not by you,' which is a strong when-not-to-call signal. It lacks a stated condition for when an agent should call it manually, but the negative guidance is unusually valuable.

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

release_claimC

Abandon a claim without committing.

ParametersJSON Schema
NameRequiredDescriptionDefault
claimIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes

TDQS

C2.7/5.0
Behavior2/5

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

No annotations are provided, so the description carries full behavioral burden, yet it only states 'abandon' with no mention of side effects (does the claim get freed for others?), required permissions, reversibility, or failure modes. An output schema exists so return values need not be described, but the mutation semantics remain opaque.

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?

A single short sentence that is front-loaded and wastes no words. It is arguably too terse to be complete, but from a pure conciseness standpoint it is efficient.

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

Completeness2/5

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

For a state-mutating claim operation with no annotations, no parameter documentation, and many sibling claim-related tools, the description is too thin. An agent cannot tell what happens to the claim on release or how it differs from complete_claim.

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

Parameters2/5

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

There is one parameter (claimId) with 0% schema description coverage, so the description must compensate and does not β€” claimId is never mentioned or explained. This leaves the single required parameter undocumented in both schema and description.

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

Purpose4/5

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

The description gives a clear verb (abandon/release) and resource (claim) and the qualifier 'without committing' hints at the distinction from the sibling complete_claim. It does not explicitly name alternatives, but the core purpose is unambiguous.

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

Usage Guidelines2/5

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

No when-to-use guidance is provided and the sibling tools (claim_intent, complete_claim, list_claims) are never referenced. The phrase 'without committing' vaguely implies a distinction from committing flows, but the agent must infer when to choose this over complete_claim.

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

request_approvalB

Park a task for human approval before running it (remote-approve worker mode) β€” a person approves it from the board/phone.

ParametersJSON Schema
NameRequiredDescriptionDefault
taskIdYes
agentIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It usefully discloses that the task is parked (execution blocks until approval) and that approval happens out-of-band by a person from the board/phone. It omits denial/timeout behavior, whether the call is idempotent or re-requestable, and what the caller should do while waiting.

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?

A single front-loaded sentence with the blocking behavior stated first and the approval channel in the trailing clause. No filler, though the parenthetical and em-dash aside make it slightly less crisp than it could be.

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

Completeness3/5

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

An output schema exists, so return values need not be described. For a two-parameter workflow tool with no annotations, the definition still leaves gaps around the approval lifecycle (how to poll, resolve, or what happens on rejection), which an agent needs to use it end-to-end.

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

Parameters2/5

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

Schema description coverage is 0% and the description adds no parameter meaning at all. It is not clear whether agentId is the requester's own identity or the approver, nor whether taskId must already be claimed. The self-evident names are the only guide.

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

Purpose4/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: it parks a task for human approval rather than executing it. That clearly separates it from executing siblings like complete_task or next_task. It does not explicitly name a sibling such as resolve_approval, so it stops short of a 5.

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

Usage Guidelines3/5

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

"before running it (remote-approve worker mode)" gives implied usage context β€” this tool is for workers configured to request remote approval. However, it never says when not to use it, what the alternative path is, or how the approval is later resolved (resolve_approval) or checked (pending).

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

resolve_approvalC

Approve or reject a parked task (used by the board; also callable by tools).

ParametersJSON Schema
NameRequiredDescriptionDefault
taskIdYes
approvedYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden. It is a mutation tool, yet it does not say what happens to the task on approval vs rejection, whether the change is reversible, what permissions are required, or what error occurs on an already-resolved task. The actor note is the only extra context.

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?

A single front-loaded sentence with no filler. Efficient, though the parenthetical is arguably the least informative clause placed last.

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

Completeness2/5

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

An output schema exists so return values need not be described, but for an unannotated mutation tool with zero parameter descriptions the definition is too thin: an agent learns neither the preconditions nor the side effects of resolving an approval.

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 0%, so the schema documents neither parameter. The description's 'approve or reject' does map clearly onto the `approved` boolean, but `taskId` is left entirely unexplained. Partial compensation for a low-coverage schema.

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

Purpose4/5

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

States a specific verb+resource: approving or rejecting a 'parked task'. This is distinguishable from the sibling request_approval as the resolution side of the flow, though the description never names that sibling or defines what 'parked' means.

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

Usage Guidelines2/5

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

The parenthetical 'used by the board; also callable by tools' describes who calls it, not when to call it or what preconditions must hold (e.g., whether a pending approval request must already exist). No alternative or exclusion is given relative to request_approval.

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

send_messageB

Send an async message or task to another agent (toAgentId, or '*' to broadcast). Delivered on their next Tower contact. kind 'task' delegates work; reply with kind 'task_update' (replyTo=the task id) when done.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYes
kindNomessage
repoYes
sizeNo
repoIdNo
replyToNo
projectIdNo
toAgentIdYes
fromAgentIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes

TDQS

B3.4/5.0
Behavior3/5

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

No annotations, so the description carries the full burden. It usefully discloses async delivery semantics ('delivered on their next Tower contact') and the task/reply protocol, but says nothing about auth, failure behavior for unknown agents, rate limits on broadcast, or delivery guarantees.

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?

Two dense sentences that front-load the core action and broadcast capability, then the delegation/reply protocol. No filler, though the second sentence packs two ideas together.

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

Completeness3/5

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

An output schema exists, so return values need no explanation, and the async-delivery model is conveyed. But with 9 parameters, 0% schema coverage, and no annotations, several parameters and behaviors remain undocumented for an agent to call this correctly.

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

Parameters2/5

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

Schema coverage is 0% across 9 parameters, so the description must compensate. It clarifies toAgentId (including '*'), the kind enum, and replyTo, but leaves body, repo, fromAgentId, size, repoId, and projectId entirely unexplained, covering only about a third of the surface.

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

Purpose4/5

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

States a specific verb+resource ('send an async message or task to another agent') and clarifies the '@*' broadcast target. The send/receive split from sibling fetch_messages is inferable, but no sibling is named explicitly, so it falls short of a 5.

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

Usage Guidelines4/5

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

Explains how to use the tool's modes: kind 'task' delegates work and should be answered with kind 'task_update' (replyTo=task id). This gives clear in-tool usage guidance, though it does not contrast with sibling tools like accept_task/complete_task.

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. 20 tool updatesv0.1.0
    • First observedaccept_task
    • First observedcheck_collision
    • First observedclaim_intent
    • First observedcomplete_claim
    • First observedcomplete_task
    • First observedfetch_messages
    • First observedget_decisions
    • First observedheartbeat
    • First observedheartbeat_worker
    • First observedlist_claims
    • First observedlist_tasks
    • First observedlog_decision
    • First observednext_task
    • First observedpending
    • First observedpropose_intent
    • First observedrecord_reads
    • First observedrelease_claim
    • First observedrequest_approval
    • First observedresolve_approval
    • First observedsend_message

TDQS

B3.4/5.0

Scored across 20 tools

Disambiguation4/5

Most tools have clearly distinct roles, and the rich descriptions help separate the claim lifecycle (claim_intent/check_collision/release_claim/complete_claim) from intent proposals (propose_intent) and task flows. However, a couple of pairs invite confusion: heartbeat vs heartbeat_worker, and the trio claim_intent/propose_intent/check_collision all touch pre-work collision checking.

Naming Consistency4/5

The dominant pattern is predictable verb_noun (claim_intent, release_claim, complete_claim, list_claims, send_message, accept_task, complete_task, list_tasks, request_approval, resolve_approval). A few deviations stand outβ€”heartbeat, heartbeat_worker, pending, next_taskβ€”which break the otherwise clean convention.

Tool Count4/5

20 tools is on the heavier side, but the server legitimately spans several subdomains (claims, tasks, messaging, decisions, approvals, presence), so most tools earn their place. A little redundancy exists (pending duplicates part of fetch_messages/list_tasks; two heartbeat tools), but not enough to feel bloated.

Completeness4/5

Coverage is strong: full claim lifecycle, task delegation/accept/complete with approvals, messaging, decision memory, and presence. Minor gaps remainβ€”no explicit task-creation tool (folded into send_message with kind 'task') and no update/delete for recorded decisions.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Enables multiple AI agents to collaborate on the same git repository by coordinating work via a shared claims branch, detecting file conflicts before they happen.
    9
    32 PyPI
    PolyForm Noncommercial 1.0.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables multiple AI coding agents to collaborate on a project by coordinating tasks, file leases, and messages through a shared hub, preventing conflicts and enabling parallel development.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Coordinates multiple AI coding agents by providing a shared task board, memory, and advisory file claims, letting agents work on the same repo concurrently without duplicating work or overwriting each other.
    16 npm
    1
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables teams to share structured, git-synced context among AI coding agents working on the same repository, including living plans, task declarations, handoff briefs, file-provenance history, and conflict detection.
    12
    30 npm
    3
    MIT