Skip to main content
Glama
yurikaza
by yurikaza

agent-work-mcp

Let your coding agent work for hours while you're away, and come back to a clean handoff.

agent-work-mcp is a Model Context Protocol server that orchestrates agent work. It gives a coding agent (Claude Code, or any MCP client) a persistent work session with a time budget, a dependency graph of work, a human decision queue, required validation, and an exact handoff.

License: MIT Node >= 20 MCP spec 2026-07-28 Status: v0.1

It has two modes:

  • OUTSIDE_MODE: bounded autonomous execution, for when you are away. The agent owns the phase goal until the budget is spent or no meaningful executable work remains. It never stops to ask you a question. It records the question, parks the work that depends on the answer, and keeps going with everything else.

  • DESK_MODE: human-in-the-loop execution, for when you are back. You start from the handoff, answer the queued decisions (most blocking first), and resume in either mode.

Status: v0.1. The core session lifecycle is implemented and tested end to end: 218 tests, covering the MCP boundary and the built binary over stdio. It is not yet published to npm. GitHub and Todoist integrations are deliberately not part of v0.1.


Contents


Related MCP server: WorkspaceGuard

Why

Coding agents are good at individual tasks and bad at owning an outcome over several hours without supervision. The failure modes are predictable:

  • Stopping too early. The agent finishes one task and ends its turn, although the budget and plenty of work remain.

  • Blocking on questions. It asks "JWT or sessions?" and then waits hours for an answer nobody is there to give.

  • Guessing instead. It makes an architectural or product decision on its own.

  • Busywork. It invents work to fill the time it was given.

  • Unverified "done". It declares work finished without checking it.

  • Lost context. It crashes or runs out of context and leaves no record of where it was.

agent-work-mcp moves the parts an agent can't hold reliably in its context window into a small, persistent control plane, and enforces the rules on the server rather than only in a prompt.

How it works

The server is a control plane. It does not run models or edit files. Your agent is the execution plane: it reads the code, makes changes, runs tests, and spawns its own subagents. The agent pulls work from the server and reports back.

flowchart LR
    A["Coding agent<br/>(Claude Code, any MCP client)"] -- "MCP tools (stdio)" --> M["mcp/<br/>thin tool layer"]
    M --> C["core/<br/>orchestrator · state machine · work graph<br/>decisions · budget · execution policy<br/>handoff · report"]
    C --> P[("adapters/persistence<br/>.agent-work/ JSON revisions")]
    C --> G["adapters/project<br/>git status + docs"]

The OUTSIDE loop, from the agent's point of view:

sequenceDiagram
    participant Agent
    participant Server as agent-work-mcp
    Agent->>Server: start_session(mode: outside, goal, budgetMinutes)
    Server-->>Agent: sessionId, repo snapshot, docs to read
    Note over Agent: analyze the repository
    Agent->>Server: update_work_graph(units, projectContext)
    loop until next_work says stop
        Agent->>Server: next_work
        Server-->>Agent: execute (direct or parallel) · wait · stop
        Note over Agent: do the unit, run the checks
        Agent->>Server: report_work(completed + validation evidence)
        opt human judgment needed
            Agent->>Server: request_decision(question, affected units)
            Server-->>Agent: independent work that can continue
        end
    end
    Agent->>Server: get_handoff

Session states (simplified; the full transition table is in docs/state-model.md):

stateDiagram-v2
    [*] --> analyzing: start_session
    analyzing --> planning: update_work_graph
    planning --> running: next_work (execute)
    running --> planning: report_work
    planning --> validating: completed work needs validation
    validating --> planning: report_work
    planning --> waiting_for_human: all remaining work waits on decisions
    planning --> blocked: remaining work blocked or failed
    planning --> resumable: budget spent, work remains
    planning --> completed: everything done and validated
    running --> paused: pause_session
    paused --> running: resume_session
    waiting_for_human --> resumable: record_decision
    resumable --> planning: resume_session
    blocked --> planning: resume_session
    completed --> [*]

Guarantees

These rules are enforced by the server, not just stated in a prompt.

Rule

How it is enforced

A finished task never ends the run

report_work never halts a session; it moves it back to planning and tells the agent to call next_work. Only a stop from next_work ends a run.

The budget is for the session, not per task

A 4-hour unit may use 4 hours of a 5-hour budget; a 20-minute unit takes 20 minutes and the next work is picked. Estimates never consume budget; only elapsed time does.

Never invent work to use up budget

Units added after the initial plan need a rationale and appear in the report as mid-session scope. Unused budget is reported as a normal outcome.

Never invent decisions

record_decision is refused while an OUTSIDE run is active. Removing a decision gate from a unit, or cancelling work that waits on an open decision, is refused too.

Decisions don't stop independent work

A decision gates only its affected units and their dependents. The run halts as waiting_for_human only when all remaining work waits on a human.

Parallelism must be earned

Subagents are used only for provably isolated units whose time savings beat the overhead. Remaining budget is not an input: more budget never means more agents.

Smaller verified change over speculation

Completing a unit requires validation evidence. Before halting with unvalidated work, an integration validation unit runs.

Survive interruption

State is written as immutable revision files with an atomic compare-and-swap that is safe across processes. Recovery restores in-flight units from their checkpoints.

Install

Requirements: Node.js 20 or newer, and an MCP client.

git clone https://github.com/yurikaza/agent-work-mcp.git
cd agent-work-mcp && npm install && npm run build

This produces dist/cli.js, a stdio MCP server. Check it:

node dist/cli.js --version

Connect it to your agent

Claude Code

Run this inside the project you want the agent to work on. The local scope keeps the registration private to you and to that project, so no machine-specific paths end up in the project's repository.

claude mcp add agent-work --scope local -e AGENT_WORK_PROJECT_ROOT="$PWD" -- node /absolute/path/to/agent-work-mcp/dist/cli.js

Verify:

claude mcp get agent-work

If your Claude Code is launched from a GUI with a minimal PATH, use the absolute path to node (which node) instead of node. Start a new Claude Code session afterwards: sessions that were already open do not pick up new servers.

Other MCP clients

Most clients accept an mcpServers entry like this:

{
  "mcpServers": {
    "agent-work": {
      "command": "node",
      "args": ["/absolute/path/to/agent-work-mcp/dist/cli.js"],
      "env": { "AGENT_WORK_PROJECT_ROOT": "/absolute/path/to/your/project" }
    }
  }
}

The server speaks the MCP 2026-07-28 revision and also serves clients that open with the 2025-era initialize handshake.

Using OUTSIDE_MODE

Before you leave, ask your agent something like:

Start an agent-work OUTSIDE session. Goal: "finish team invitations (phase 2)". Budget: 180 minutes. Exit criteria: "invites can be sent and accepted". Constraint: "don't touch billing". Follow next_work until it says stop, then give me the handoff.

What happens:

  1. start_session creates the session and returns a sessionId, a git snapshot (branch, head, uncommitted files) and the docs to read first. The operating rules for both modes reach the agent through the server's MCP instructions.

  2. Analysis. The agent reads the docs and code, then submits the plan with update_work_graph. The project context it records (summary, key files, test and build commands) is what makes the later handoff useful:

    {
      "sessionId": "ses_…",
      "projectContext": {
        "summary": "Express + Postgres monolith; migrations via knex.",
        "keyFiles": ["src/app.ts", "src/db/migrations"],
        "commands": { "test": "npm test", "build": "npm run build" }
      },
      "units": [
        { "id": "invite-model", "title": "Invite table and model", "estimateMinutes": 30,
          "acceptance": ["migration runs up and down"], "touches": ["src/db", "src/models"] },
        { "id": "invite-email", "title": "Send invitation email", "dependsOn": ["invite-model"],
          "estimateMinutes": 40, "touches": ["src/mail"] },
        { "id": "invite-accept", "title": "Accept-invite endpoint", "dependsOn": ["invite-model"],
          "estimateMinutes": 45, "touches": ["src/routes/invites.ts"] }
      ]
    }
  3. The loop. next_work returns execute (with a direct or parallel dispatch and the reasons for it), wait (units still in flight), plan (the work graph isn't submitted yet), or stop.

  4. Reporting. After each unit the agent calls report_work with evidence:

    {
      "sessionId": "ses_…", "unitId": "invite-model", "outcome": "completed",
      "summary": "Migration and model added",
      "validation": { "passed": true, "checks": [{ "name": "npm test", "passed": true }] },
      "artifacts": ["src/db/migrations/20260919_invites.ts"]
    }

    A failing check counts as a failed attempt. After three attempts the unit is marked failed, and the units that depend on it wait for a human.

  5. Questions. When human judgment is needed, the agent calls request_decision with the question, why it matters, options, an optional recommendation, and the affected units. It gets back the independent work that can continue.

  6. Integration validation. When no other work is executable, a validation unit runs the full checks across the completed units before the run is allowed to halt.

  7. Stop. The run ends with one of these reasons:

    Stop reason

    Meaning

    Session afterwards

    completed

    Everything done and validated

    completed

    waiting_for_human

    All remaining work waits on at least one open decision

    waiting_for_human

    blocked

    Remaining work is blocked or failed

    blocked

    budget_exhausted

    Budget spent and executable work remains

    resumable

    budget_insufficient

    No ready unit fits the remaining budget

    resumable

Using DESK_MODE

When you are back:

Show me the agent-work handoff for the last session and walk me through the open decisions.

The agent calls list_sessions, then get_handoff and get_decisions. You answer, and the agent records it with record_decision (decidedBy is required). The resolution is attached to every affected unit, so whoever executes it later sees your answer. Then:

  • resume_session with mode: "desk" works through the remaining units with you, one at a time;

  • resume_session with mode: "outside" and addBudgetMinutes hands the work back to autonomy.

You can also start in DESK_MODE directly with start_session(mode: "desk"). DESK_MODE consumes no autonomous budget and always dispatches one unit at a time.

What a handoff looks like

This is real output from the server (only the session id is shortened). An OUTSIDE session was given 180 minutes. The agent hit a product question, parked the one unit that depended on it, finished and validated everything else, and stopped:

# Handoff: Team invitations

Session `ses_3f9c2a7b…` · mode **outside** · state **waiting_for_human** — 1 remaining unit(s) cannot proceed; waiting on decision(s) dec-1.
Budget: 96m used of 180m (84m left)
Goal: Add team invitations

## Next actions
1. Decide dec-1: Should invitations expire? (blocks 1 unit(s)) → record_decision

## Decisions needed (1)
- **dec-1** [product, blocks 1] Should invitations expire?
  - Why it matters: Changes the accept flow and how long a leaked link stays valid.
  - Option `7d`: Expire after 7 days
  - Option `never`: Never expire
  - Agent suggestion (not applied): 7d: limits exposure of forwarded links.
  - Blocks: invite-accept

## Blocked / waiting
- invite-accept: Accept-invite endpoint — waiting_on_decision (decision:dec-1)

## Completed
- invite-model: Invite table and model — Migration and model added
- invite-email: Send invitation email — Send invitation email done
- audit-log: Audit log for team changes — Audit log for team changes done
- validate-1: Integration validation #1 — Full suite, build and lint green

## Project context
Express + Postgres monolith; migrations via knex.
Key files: src/app.ts, src/db/migrations
- test: `npm test`
- build: `npm run build`

## Repository
Branch feat/invites @ 9c1e4b7a2d5f; 0 uncommitted file(s)

The 84 unused minutes are not a failure. Nothing meaningful was left that did not depend on your answer, so the agent stopped rather than inventing work.

Concepts

Work session and budget

A session is one campaign toward one goal (usually the current project phase) in one project. In OUTSIDE_MODE it has a total wall-clock budget. The clock runs only while the session is active (analyzing, planning, running, validating); paused and halted time is not charged. A unit may start when its estimate fits the remaining budget, with 25% tolerance and a 10-minute reserve kept for the final validation. Units without an estimate may start while enough budget remains. Estimates are never limits and never consume budget.

Work graph

A dependency graph of work units. Each unit has an id, a title, dependsOn edges, optional decisionIds, an optional estimate, acceptance criteria, and touches (the paths it changes). The server rejects bad ids, unknown references and cycles, with nothing applied. It derives each unit's readiness and root causes (for example decision:dec-1, blocker:deploy, failure:migrate), and schedules units that unblock the most work first.

Human decisions

A decision is a persistent question with why it matters, options, the agent's recommendation (stored, never applied), and the units it blocks. The queue is sorted by how much work each decision blocks. Only a human resolves it; see docs/decision-model.md.

Execution policy: direct vs parallel

Units are dispatched in parallel only when all of these hold:

  • the mode is outside;

  • the units declare touches and estimates, and are parallelSafe;

  • they don't share a workstream or overlapping paths with each other or with in-flight work;

  • the net saving beats the overhead: Σestimates − max(estimate) − (n − 1) × (10 + 5) ≥ 30 minutes.

For example, two isolated 60-minute units run in parallel (net 45m), while two 20-minute units don't (net 5m). The main agent takes the largest unit, subagents take the rest in isolated worktrees, and the main agent integrates and owns validation. It never holds more than one unit.

Validation

Completing a unit requires evidence: at least one check, or an explicit notApplicableReason. Before a run halts with unvalidated completed work, a session-level validation unit re-checks the exit criteria and the acceptance criteria of the covered units together. If that validation fails, fix units run first and then validation re-runs. A validation unit that fails or is blocked halts the session as blocked for a human.

Interruption and recovery

Every state change is persisted before the tool returns, so any crash leaves a readable session. A session whose agent has been silent for longer than the stale threshold (60 minutes, or 1.5× the largest in-flight estimate) shows liveness: stale. pause_session, stop_session and resume_session recover it without charging the silent gap, and resume_session returns in-flight units to the queue with their last checkpoint. Any other call after a silence is treated as the agent carrying on, and the gap is charged. Over-charging a dead agent only stops the session early, whereas under-charging would break the budget bound.

Tools

Sixteen high-level tools. All except start_session and list_sessions take the explicit sessionId handle, because MCP 2026-07-28 has no protocol-level session.

Tool

Purpose

start_session

Create a session (mode, goal, budgetMinutes, exitCriteria, constraints, projectRoot).

list_sessions

Find sessions with state, liveness, budget and open decisions.

get_session

State, budget, unit counts, in-flight units, runs.

get_phase

Goal, exit criteria, constraints, progress, recorded project context.

get_work_graph

Units with readiness and root causes, plus edges.

update_work_graph

Add or update units, cancel or reopen units, record project context. Applied all-or-nothing.

next_work

Claim the next work: execute / wait / plan / stop.

report_work

progress, completed (with evidence), failed, blocked, released.

request_decision

Queue a question for a human; get the independent work back.

get_decisions

The queue, most blocking first.

record_decision

A human's answer (or a withdrawal).

pause_session

Pause; the budget clock stops and claims are kept.

resume_session

Resume from the handoff; optionally switch mode or add budget.

stop_session

End the run and return the report; markFailed ends the session permanently.

get_handoff

Where to pick up, as Markdown plus structured data.

get_session_report

Outcome, budget use, evidence, decisions, parallelism, next steps.

Every tool has an input and output schema and annotations. Rule violations come back as readable tool errors (CODE: message) that the model can act on. The full reference, including error codes, is in docs/mcp-tools.md.

Configuration and storage

Variable

Default

Meaning

AGENT_WORK_PROJECT_ROOT

the server's working directory

Default project root for new sessions.

AGENT_WORK_STATE_DIR

<project root>/.agent-work

Where session state is stored.

The state directory writes its own .gitignore, so it never shows up in git status:

.agent-work/
├── .gitignore                 # "*"
├── sessions/<sessionId>/      # immutable revisions; the last 5 are kept
│   └── <revision>.json
└── projects/<hash>/<n>.json   # per-project start sequence (one active session per project)

Each revision is published with an atomic hard link, so two processes can never both overwrite the same revision, and a crash never leaves a half-written file or a stale lock. Policy defaults (parallelism thresholds, budget reserve, retry limit, staleness) live in src/core/policy/policy.ts and can be overridden when you construct the orchestrator yourself.

Using the core as a library

The orchestration core has no dependency on MCP, so it can back a CLI or another protocol:

import { Orchestrator, FileSessionRepository } from 'agent-work-mcp';

const o = new Orchestrator({
  repository: new FileSessionRepository('.agent-work'),
  policy: { maxParallel: 2 },
});

const { session } = await o.startSession({ mode: 'outside', goal: 'Ship phase 1', budgetMinutes: 120 });
const next = await o.nextWork(session.sessionId); // { action: 'plan', … } until a graph is submitted

Development

npm test
npm run typecheck && npm run build
src/
├── core/            # no MCP, no I/O
│   ├── model/       # session types, state machine, work graph, decisions, budget
│   ├── policy/      # execution policy (direct vs parallel), defaults
│   ├── orchestrator.ts, evaluate.ts, handoff.ts, report.ts, views.ts
│   ├── contracts.ts # zod schemas for commands and views
│   └── ports.ts     # SessionRepository, Clock, IdGenerator, ProjectInspector
├── adapters/        # file + memory persistence, git/docs inspector
├── mcp/server.ts    # tool registration only
└── cli.ts           # stdio entry point
test/                # 218 tests

The tests cover the state machine, the work graph, the execution policy, the budget, the full OUTSIDE and DESK lifecycles, decision behavior, interruption and resume, persistence across restarts and concurrent writers, lifecycle invariants under 120 seeded random operation sequences, the MCP surface over an in-memory transport, and the built binary over stdio.

Issues and pull requests are welcome. Please keep the core free of transport and I/O details, and add tests alongside behavior changes.

Limitations

  • Agent compliance is instructed, not verified. The server enforces its rules, but a real end-to-end run with Claude Code against a test repository has not been automated yet.

  • "Human" is enforced by state, not identity. Decisions can't be recorded during an active OUTSIDE run. In DESK_MODE the server can't tell whether the human or the agent answered.

  • Silence is charged unless you recover explicitly. If an agent dies and your first call is not pause_session, stop_session or resume_session, the silent time counts against the budget. Long units should send progress reports at least hourly.

  • Two narrow storage edge cases. A crash in the millisecond between creating a session and claiming its project slot leaves an orphan session that blocks new starts on that project for up to 60 minutes. Pruning of old revisions could, in theory, hide an update if a writer stalls while five or more newer revisions land.

  • Not on npm yet. Install from source.

Roadmap

  • An automated end-to-end run with a real agent (headless Claude Code) against a test repository.

  • MCP prompts that start each mode (/outside, /desk).

  • Work sources: GitHub issues and Todoist tasks mapped into the work graph.

  • An AgentExecutor port so the server can dispatch work to headless agents directly.

  • Streamable HTTP transport for remote use.

Documentation

Document

Covers

Architecture

Layers, ports, control flow, durability

State model

States, transition table, budget, liveness

Work graph

Units, validation rules, readiness, scheduling, parallelism

Decision model

Raising, resolving and ordering decisions

Session lifecycle

OUTSIDE loop, DESK flow, pause/resume/stop, handoff, report

MCP tools

Tool reference and error codes

Implementation plan

v0.1 plan and technology choices

License

MIT

Available Tools

16 tools
get_decisionsGet decisionsA
Read-only

The decision queue, most blocking first, with why each matters, options, the agent suggestion and blocked/independent work.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoDefault 'open'.
sessionIdYesSession handle returned by start_session.

Output Schema

ParametersJSON Schema
NameRequiredDescription
modeYes
stateYes
decisionsYes
sessionIdYes
canRecordDecisionsYes

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true, and the description adds behavioral detail: results are ordered by blocking priority and include rationale, options, suggestion, and blocked/independent work flags. No contradiction with annotations.

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

Conciseness4/5

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

The description is a single dense sentence with no filler, front-loading the core resource. However, it is a sentence fragment rather than a complete declarative statement, which slightly reduces clarity.

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?

With an output schema present and full parameter documentation, the description adequately covers the tool's purpose and return content. The only missing element is explicit usage context, which is more of a usage-guidelines concern. Overall complete for a read-only list tool.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description does not add any parameter-specific nuance; status filtering and sessionId semantics are left entirely to the 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?

The description identifies the resource as the decision queue and specifies its ordering (most blocking first) and content (why each matters, options, agent suggestion, blocked/independent work). It clearly implies a read-only retrieval operation, but lacks an explicit verb like 'returns' or 'lists'. It is distinguishable from sibling mutations by its focus on the queue.

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 guidance is provided for when to call this tool versus alternatives such as request_decision or record_decision, nor any mention of prerequisites beyond the sessionId in the schema. The usage context is only implied by the resource name.

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

get_handoffGet handoffA
Read-only

Exactly where to pick up: state and why, decisions needed (most blocking first), in-flight checkpoints, ready units, blocked units with causes, completed work, project context, repository state and ordered next actions. Start DESK_MODE here.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionIdYesSession handle returned by start_session.

Output Schema

ParametersJSON Schema
NameRequiredDescription
modeYes
notesYes
phaseYes
stateYes
budgetYes
blockedYes
inFlightYes
livenessYes
markdownYes
completedYes
readyNextYes
sessionIdYes
repositoryNo
generatedAtYes
nextActionsYes
projectRootYes
stateReasonYes
projectContextNo
decisionsNeededYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already mark this as read-only with openWorldHint=false. The description adds useful behavioral context by specifying the exact content of the handoff and the ordering guarantee ('decisions needed (most blocking first)', 'ordered next actions'), which goes beyond the schema and annotations.

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

Conciseness5/5

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

The description is one information-dense sentence followed by a short directive. It front-loads the core idea ('Exactly where to pick up') then enumerates the included content without repetition or filler.

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

Completeness5/5

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

With an output schema present, the return structure does not need to be described in detail. The description covers the tool's purpose, content, ordering, and when to use it, while the input schema fully documents the single required parameter. Nothing essential is missing for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%: the single sessionId parameter is fully described as 'Session handle returned by start_session.' The description adds no parameter-level detail, but with full schema coverage the baseline of 3 applies.

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 makes the tool's purpose clear: return a comprehensive handoff summary including state, decisions, checkpoints, ready/blocked units, completed work, context, repository state, and next actions. It is distinct from siblings like get_session or get_phase because it packages the full handoff picture, though it does not explicitly name those alternatives.

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 instruction 'Start DESK_MODE here' gives an explicit usage moment for this tool. It does not state exclusions or explicitly compare with get_session, get_work_graph, or get_session_report, but the context is clear enough for a capable agent.

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

get_phaseInspect phaseA
Read-only

The phase goal, exit criteria and constraints this session owns, progress toward it, and the project context recorded during analysis.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionIdYesSession handle returned by start_session.

Output Schema

ParametersJSON Schema
NameRequiredDescription
phaseYes
stateYes
progressYes
sessionIdYes
openDecisionsYes
projectContextNo

TDQS

A3.5/5.0
Behavior4/5

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

The readOnlyHint annotation already signals safety. The description adds value by detailing exactly what data is returned (goal, exit criteria, constraints, progress, project context), which is beyond the annotation. No contradictions.

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

Conciseness4/5

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

The description is a single sentence that front-loads the key items returned. It is efficient and not overly verbose, though it lists several items in a way that could be seen as slightly dense.

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

Completeness4/5

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

For a read-only getter with one parameter and an output schema, the description covers what the tool returns. It does not mention prerequisites like session existence or activeness, but that is likely handled by the output schema or error messages, so it is reasonably complete.

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

Parameters3/5

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

The single parameter sessionId is fully described in the schema (100% coverage), so the description need not elaborate. Baseline of 3 applies; the description adds no extra meaning beyond the 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?

The description clearly indicates this tool retrieves phase-related information for a session: goal, exit criteria, constraints, progress, and project context. It is not a tautology and is distinct from sibling tools focused on sessions or work graphs, though it could be more explicit about the retrieval action.

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 guidance is given on when to use this tool versus alternatives like get_session or get_work_graph. The description implies it is for inspecting a phase, but there is no explicit context for selection or exclusions.

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

get_sessionInspect sessionA
Read-only

Current state, mode, budget, unit counts, in-flight units and run history of one session.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionIdYesSession handle returned by start_session.

Output Schema

ParametersJSON Schema
NameRequiredDescription
sessionYes
guidanceYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds the list of inspected data fields, but it does not disclose staleness, caching, error behavior, or any prerequisites beyond what the schema provides.

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 telegraphic sentence that front-loads the core content immediately. Every listed item adds information, and there is no filler or repetition of the tool name.

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?

With an output schema present, one fully documented parameter, and read-only annotations, the description is sufficient for correct invocation. The only minor gap is not clarifying how this relates to get_session_report, but that falls under optional usage routing rather than essential invocation context.

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

Parameters3/5

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

The input schema fully documents sessionId as the required session handle returned by start_session (100% coverage). The description adds no additional parameter semantics, so the baseline of 3 applies.

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 names the specific resource ('one session') and the exact data returned: state, mode, budget, unit counts, in-flight units, and run history. This clearly differentiates it from siblings like list_sessions, start_session, and get_session_report.

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 description implies use when inspecting a single session's current state, but it gives no explicit when/when-not guidance or named alternatives. A capable agent can infer the use case, but the routing is not made explicit.

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

get_session_reportGet session reportA
Read-only

Session report: outcome, budget used and why any was left unused, completed work with validation evidence, unresolved work, decisions, parallel dispatches and their rationale, scope added mid-session, and next steps.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionIdYesSession handle returned by start_session.

Output Schema

ParametersJSON Schema
NameRequiredDescription
runsYes
phaseYes
budgetYes
outcomeYes
markdownYes
completedYes
decisionsYes
nextStepsYes
sessionIdYes
dispatchesYes
unitCountsYes
unresolvedYes
validationYes
generatedAtYes
stateReasonYes
scopeAddedMidSessionYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the description doesn't need to restate that. It adds useful context by listing the detailed contents of the report, which goes beyond the schema. However, it doesn't disclose any potential performance costs or whether the report is generated on demand, but it's a read-only operation so the burden is lower.

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

Conciseness4/5

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

The description is a single, dense sentence that lists all the report contents without fluff. It is slightly long but packs useful detail, making it efficient. The key content list is front-loaded after 'Session report'. Every word contributes to explaining what the tool delivers.

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?

Given the tool's complexity—it returns a rich report with many fields—the description enumerates all the key sections. The output schema exists and likely details the exact structure, so the description doesn't need to repeat that. The only minor gap is that it doesn't mention how to obtain the sessionId beyond the schema's pointer to start_session, but that's already covered.

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

Parameters3/5

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

The only parameter is sessionId, and its schema description ('Session handle returned by start_session.') fully explains its semantics. The description adds no additional information about the parameter, but with 100% schema coverage, the baseline 3 is appropriate.

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 clearly states the tool's purpose as fetching a session report and enumerates the specific content it includes (outcome, budget usage, completed work, etc.). It distinguishes it from tools like get_session, which likely returns basic session info, though it doesn't explicitly name a sibling for contrast.

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 description implies that this should be used after a session has been started and when a detailed report is needed, but it does not explicitly state when to use it vs. alternatives like get_session or list_sessions. No guidance on when not to use it is provided.

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

get_work_graphInspect work graphA
Read-only

Units with status, derived readiness and root causes (decision:, blocker:, failure:, cancelled:), plus dependency edges. Filter: all | remaining | ready | in_progress | done.

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNoDefault 'all'.
sessionIdYesSession handle returned by start_session.

Output Schema

ParametersJSON Schema
NameRequiredDescription
edgesYesfrom depends on to.
stateYes
unitsYes
sessionIdYes
graphRevisionYes

TDQS

A4/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds meaningful context by explaining the graph contains derived readiness and enumerating root-cause kinds ('decision:', 'blocker:', 'failure:', 'cancelled:'), which goes beyond what annotations alone convey. No contradiction.

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 dense sentences with no filler; the graph contents are front-loaded and the filter options are presented compactly. Every clause adds information about what the tool returns or how to constrain it.

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

Completeness4/5

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

For a read-only inspection tool with an output schema and fully documented parameters, the description covers the graph contents and filter choices sufficiently. It does not discuss ordering or pagination, but nothing in the annotations or schema signals that such details are required.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents sessionId and filter, including the 'Default all' behavior. The description's 'Filter: all | remaining | ready | in_progress | done' restates the enum without adding new meaning, so it earns the baseline 3.

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 precise contents: 'Units with status, derived readiness and root causes..., plus dependency edges,' making it immediately clear this returns a graph snapshot. The title 'Inspect work graph' reinforces the verb-resource pair and distinguishes it from sibling tools like get_phase or get_session.

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?

No explicit when-to-use or when-not-to-use guidance is given, and no sibling alternatives are named. The readOnlyHint and graph-centric wording imply this is the inspection tool, but the agent must infer the selection context rather than being told.

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

list_sessionsList work sessionsA
Read-only

List recorded sessions (newest first) with state, budget and open decision counts. Use to find a session to inspect or resume.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectRootNoOnly sessions for this project root.
includeTerminalNoInclude completed and failed sessions. Default true.

Output Schema

ParametersJSON Schema
NameRequiredDescription
sessionsYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true and openWorldHint=false, so the description does not need to reiterate safety. It adds value by disclosing the ordering (newest first), the included fields, and the default behavior of includeTerminal (via schema, but the description does not mention the default). The description does not contradict annotations. Given the annotations, a score of 4 is appropriate for going beyond them with ordering and filter 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 sentence that is front-loaded with the primary purpose and then adds a usage hint. Every word is useful, with no redundancy or filler. It is concise and well-structured.

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?

Given the tool's complexity (a simple list operation with 2 optional parameters), the description is sufficient. An output schema exists (though not shown in the prompt, it is indicated), so the description does not need to explain return values. The description covers what the tool does, how results are ordered, and when to use it. Minor gaps: it does not mention what happens if no sessions exist or how pagination works, but these are not critical for basic usage.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema fully documents both parameters, including defaults. The description does not add any parameter-specific information beyond what the schema provides. Thus, a baseline of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool 'lists recorded sessions' with a specific ordering (newest first) and included fields (state, budget, open decision counts). This distinguishes it from sibling tools like get_session, which likely retrieves a single session. The purpose is unambiguous and actionable.

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 description says 'Use to find a session to inspect or resume,' which provides clear context for when to use this tool. However, it does not explicitly mention alternatives or when not to use it, though siblings like get_session or get_session_report are implied. This is a minor gap.

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

next_workNext workA

Re-evaluate the graph, budget and policy and claim the next work. action "execute" = do the dispatched units (direct, or parallel with subagents when justified); "wait" = finish in-flight units first; "plan" = analysis/graph needed; "stop" = the run is over (budget spent, waiting for human, blocked, or completed). Call after every report_work. Only "stop" ends an OUTSIDE_MODE run.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionIdYesSession handle returned by start_session.

Output Schema

ParametersJSON Schema
NameRequiredDescription
modeYes
stateYes
actionYes
budgetYes
dispatchNo
guidanceYes
inFlightYes
sessionIdYes
stopReasonNo
openDecisionsYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already signal a non-read-only, non-idempotent operation, so the description is not required to prove mutation. It adds value by defining the state-transition semantics of each action and the critical rule that only 'stop' terminates an OUTSIDE_MODE run. No contradiction with annotations.

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

Conciseness5/5

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

Every sentence earns its place: the purpose, all four action semantics, call cadence, and termination rule fit in a compact description. The key claim is front-loaded and the action definitions are efficiently packed.

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?

Given one documented parameter, a true output schema, and the action semantics explained, an agent has enough to call next_work correctly. Minor ambiguity remains around terms like 'dispatched units' and 'policy,' but these do not block correct invocation.

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

Parameters3/5

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

Schema coverage is 100% and the sole parameter sessionId is already described as 'Session handle returned by start_session.' The description adds no parameter-specific information, so it sits at the baseline for high schema coverage.

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?

Description opens with a clear, specific action: 'Re-evaluate the graph, budget and policy and claim the next work.' It then unpacks the four action values (execute, wait, plan, stop) with concrete meanings, which disambiguates it from lifecycle siblings like report_work and get_phase.

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?

States an explicit call condition: 'Call after every report_work.' It also clarifies the terminal condition: 'Only "stop" ends an OUTSIDE_MODE run.' It does not name alternatives or exclusions, so it isn't a 5, but the timing guidance is clear.

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

pause_sessionPause sessionA

Pause an active session. Stops the budget clock and keeps in-flight claims. Optional handoff notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
notesNoHandoff notes for whoever resumes.
reasonNo
sessionIdYesSession handle returned by start_session.

Output Schema

ParametersJSON Schema
NameRequiredDescription
sessionYes
guidanceYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already signal non-read-only and non-destructive. The description adds useful behavioral details: stopping the budget clock and preserving in-flight claims, plus optional handoff notes. This goes beyond the annotation baseline and enriches the agent's understanding of side effects, even though it doesn't cover auth or rate limits.

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 sentences with no redundancy. The core action is front-loaded, and behavioral details follow immediately. Every word earns its place; there is no filler or extraneous information.

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?

Given the presence of an output schema, return values need not be explained. The description covers the essential behavior (pausing, budget clock, in-flight claims, handoff notes) and correctly restricts to active sessions. Missing details like error handling are minor for a state-change tool of this simplicity.

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 67%, so the baseline is 3. The tool description reiterates the purpose of the notes parameter ('Optional handoff notes'), which aligns with the schema's own description, adding little new meaning. The reason parameter remains undocumented in both places, so the description does not fully compensate for the coverage gap.

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

Purpose5/5

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

The description clearly states the action ('Pause an active session') and adds specific behavioral consequences ('Stops the budget clock and keeps in-flight claims'), which distinguishes it from siblings like resume_session and stop_session. The mention of handoff notes further clarifies its purpose without ambiguity.

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

Usage Guidelines4/5

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

The description implicitly indicates usage by describing the pause behavior (stops budget clock, keeps claims) which suggests a temporary halt compared to a stop. However, it does not explicitly state when to use this tool instead of alternatives like stop_session or resume_session, nor does it mention exclusions. Sibling context helps infer, but it falls short of explicit guidance.

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

record_decisionRecord human decisionA

Record a decision made by a human (or withdraw a question that no longer applies). Only call with the human's explicit answer. Refused while an OUTSIDE_MODE run is active. Releases the units the decision gated.

ParametersJSON Schema
NameRequiredDescriptionDefault
choiceNoThe human decision: an option id/label or free text. Required unless withdraw.
withdrawNoThe question no longer applies.
decidedByYesName of the human who decided.
rationaleNo
sessionIdYesSession handle returned by start_session.
decisionIdYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
stateYes
decisionYes
guidanceYes
sessionIdYes
unblockedUnitIdsYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only indicate non-readonly non-destructive flags. The description adds a behavioral effect ('Releases the units the decision gated') and a refusal condition, both of which go beyond the structured annotations. No contradiction exists.

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 sentences, with the primary purpose front-loaded and constraints/effects packed tightly afterward. Every clause adds information and there is no repetition or filler.

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?

With an output schema available, return values need no explanation. The description covers the essential call conditions, refusal context, and side effect, making it complete enough for correct invocation.

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 67%, so the schema already defines most parameters. The description clarifies the choice-vs-withdraw relationship ('or withdraw') which adds meaning beyond the individual parameter descriptions, but it does not otherwise deepen the parameter semantics.

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 names a specific action ('Record') on a specific resource ('a decision made by a human') and immediately distinguishes the alternative use case ('withdraw a question'). It clearly separates this from sibling tools like request_decision (which asks) and get_decisions (which reads).

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 description gives a decisive usage rule ('Only call with the human's explicit answer') and a hard precondition ('Refused while an OUTSIDE_MODE run is active'). It does not explicitly name when to prefer this over request_decision, but the sibling names and the wording make that inference straightforward.

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

report_workReport workA

Report a claimed unit: progress (checkpoint), completed (requires validation evidence), failed, blocked (requires blocker), or released. Completed with failing checks counts as a failed attempt. Then call next_work: a finished unit never ends the session.

ParametersJSON Schema
NameRequiredDescriptionDefault
unitIdYes
blockerNoRequired for blocked.
outcomeYesprogress = checkpoint/heartbeat; completed = done with passing validation; failed = attempt failed; blocked = external blocker; released = hand the unit back unstarted or partially done.
summaryYesWhat happened, in one or two sentences.
artifactsNoFiles changed, commits, PRs.
sessionIdYesSession handle returned by start_session.
checkpointNoExact resume point for unfinished work.
validationNoRequired for completed.

Output Schema

ParametersJSON Schema
NameRequiredDescription
unitYes
stateYes
guidanceYes
sessionIdYes
newlyReadyUnitIdsYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations are minimal (readOnlyHint false, idempotentHint false, destructiveHint false), so the description adds value by explaining the behavioral nuance: 'Completed with failing checks counts as a failed attempt' and that reporting does not end the session. It also mentions required evidence for completed and blocker for blocked, which are behavioral constraints beyond the schema.

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

Conciseness5/5

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

The description is two sentences with no fluff. It front-loads the primary action and outcome types, then adds the crucial workflow instruction. Every word contributes to understanding the tool's purpose and use.

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?

The description covers the core purpose and the required next step (next_work). It doesn't detail every parameter, but the schema covers that. It also lacks explicit mention of the sessionId requirement, but that is standard. The output schema exists, so return values need no explanation. The description is sufficient for an agent to know when and how to call this tool.

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 88%, so the schema already documents most parameters. The description adds semantic clarity for the completed outcome: 'Completed with failing checks counts as a failed attempt,' which clarifies how the validation object's 'passed' field interacts with the outcome. It also highlights that completed requires validation evidence and blocked requires a blocker, reinforcing schema descriptions.

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

Purpose5/5

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

The description clearly states the tool's function: 'Report a claimed unit' with a specific set of outcomes (progress, completed, failed, blocked, released). It distinguishes itself from siblings like next_work by naming the next step explicitly and by defining what each outcome means. The verb and resource are unambiguous.

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 description gives clear guidance on the follow-up action: 'Then call next_work: a finished unit never ends the session.' This implies the tool is for reporting status and that the session continues. It doesn't explicitly state when not to use it, but the context is sufficient for an agent to know this is the reporting action in a workflow.

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

request_decisionRequest human decisionA

Queue a question that needs human judgment (architecture, product, scope, security...). Never guess instead. Affected units wait; everything else continues. Returns impact and the independent work that can proceed. Does not block and does not wait for an answer.

ParametersJSON Schema
NameRequiredDescriptionDefault
optionsNo
categoryNo
questionYesAnswerable by a human without reading code.
sessionIdYesSession handle returned by start_session.
checkpointNoResume point for an in-progress affected unit.
whyItMattersYesWhat goes wrong if this is decided badly or not at all.
recommendationNoYour suggestion. Stored as a suggestion; never applied.
affectedUnitIdsNoUnits that cannot proceed until this is decided.

Output Schema

ParametersJSON Schema
NameRequiredDescription
stateYes
decisionYes
guidanceYes
sessionIdYes
releasedUnitIdsYes

TDQS

A4.4/5.0
Behavior5/5

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

Discloses important behavioral traits beyond annotations: affected units wait while others continue, it returns impact and independent work, and it does not block or wait for an answer. This is substantial non-obvious behavior that helps the agent understand side effects and asynchronous semantics.

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

Conciseness5/5

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

Four tight, information-dense sentences with no filler. Key behavioral distinctions are front-loaded: queueing, no guessing, partial waiting, and non-blocking behavior.

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?

Given an output schema and 75% schema parameter coverage, the description covers the important behavioral context: what is blocked, what continues, and what is returned. It could add a bit more guidance on how checkpoint and affectedUnitIds relate to the waiting behavior, but the essential calling context is clear.

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 75%, so the schema already documents most parameters. The description adds general context about human-judgment categories but does not enrich individual parameters like options, checkpoint, or recommendation beyond what the schema provides. Baseline 3 applies.

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 ('Queue') and resource ('a question that needs human judgment'), with a clear scope of categories. The description distinguishes this from sibling tools like record_decision by emphasizing it queues a question rather than recording an outcome.

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 an explicit condition for use: when human judgment is needed, and instructs 'Never guess instead.' It clarifies non-blocking behavior and partial waiting, but does not explicitly name alternative tools or exclusions, so it stops short of a 5.

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

resume_sessionResume sessionA

Resume a paused, halted or interrupted session from its handoff. Optionally switch mode (desk/outside) and add budget. Recovers in-flight units of an interrupted run (they return to pending with their checkpoints). Returns the handoff.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoSwitch mode on resume. Default: keep current mode.
takeoverNoTake over a session that still looks active (e.g. the previous agent died recently).
sessionIdYesSession handle returned by start_session.
addBudgetMinutesNoExtend the autonomous budget.

Output Schema

ParametersJSON Schema
NameRequiredDescription
handoffYes
sessionYes
guidanceYes
releasedUnitIdsYes
recoveredFromInterruptionYes

TDQS

A4.3/5.0
Behavior4/5

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

With annotations already indicating this is not read-only and not idempotent, the description adds useful behavioral detail: it recovers in-flight units to pending with their checkpoints and returns the handoff. It doesn't cover auth or failure side effects, but it goes beyond annotation data.

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

Conciseness5/5

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

The description is four short, focused sentences that front-load the main purpose, then add optional behaviors, recovery semantics, and return value. No filler or redundant restatement of the tool name.

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

Completeness5/5

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

For a tool with 4 parameters, full schema coverage, and an output schema, the description covers the operation, optional modifications, recovery side effect, and return value. Nothing an agent needs to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the parameters are already fully documented. The description mentions mode and budget but only echoes the schema; it doesn't add new semantic meaning to any parameter.

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

Purpose5/5

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

The description names a specific verb and resource ('Resume a paused, halted or interrupted session from its handoff'), which clearly distinguishes it from start_session, pause_session, and stop_session. It also states the optional mode/budget actions, so an agent can tell exactly what the tool is for.

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 clear usage context: use when a session is paused, halted, or interrupted, and optionally when you want to switch mode or add budget. It doesn't explicitly name start_session as the alternative for new sessions or list when-not conditions, so it stops short of a 5.

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

start_sessionStart work sessionA

Start a work session for a project goal. mode "outside" = bounded autonomous run (no human; requires budgetMinutes, the total wall-clock autonomy for the whole session, not per task). mode "desk" = human in the loop. Returns a sessionId handle (pass it to every other tool), a repository snapshot and analysis instructions. Next: analyze the project, then update_work_graph.

ParametersJSON Schema
NameRequiredDescriptionDefault
goalYesThe outcome this session owns, typically the current project phase objective.
modeYes'outside' = bounded autonomous run with no human present (primary). 'desk' = human in the loop.
phaseTitleNoShort name of the phase. Defaults to the goal.
constraintsNoBoundaries the agent must respect (areas not to touch, etc.).
projectRootNoAbsolute path of the project. Defaults to the server working directory.
exitCriteriaNoObservable conditions that mean the phase is done.
budgetMinutesNoTotal autonomous wall-clock budget for the whole session. Required for outside mode.

Output Schema

ParametersJSON Schema
NameRequiredDescription
sessionYes
guidanceYes
snapshotNo
otherSessionsYesNon-terminal sessions already recorded for this project.

TDQS

A3.5/5.0
Behavior3/5

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

Annotations provide no hints (all false), so the description carries the burden. It discloses that it returns a sessionId handle and a repository snapshot, and clarifies the budgetMinutes semantics. However, it doesn't explicitly state whether starting a session modifies the repository, whether it can overwrite an existing session, or whether the session starts executing immediately. No contradiction with annotations, but more detail on side effects would be helpful.

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

Conciseness4/5

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

The description is compact and front-loaded with the purpose. Each sentence contributes: purpose, mode definitions, and return value/next steps. It's efficient but somewhat dense, mixing mode semantics with workflow hints, so it's not a 5.

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?

Given the tool's seven parameters, complete schema descriptions, and existing output schema, the description provides enough context for correct invocation. It specifies the required modes, budget requirement, return value, and next steps. It doesn't cover edge cases like session conflicts or failure modes, but these are partially addressed by the schema and output schema. A slightly deeper explanation of the session lifecycle would push this to a 5.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds minor value by clarifying that budgetMinutes is the total wall-clock autonomy 'for the whole session, not per task,' which slightly disambiguates the schema's wording. It does not otherwise go beyond the schema's parameter descriptions.

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 clearly states the tool starts a work session for a project goal, with a specific verb and resource. It distinguishes itself from sibling session-management tools (pause, resume, stop) by being the entry point, but it doesn't explicitly name resume_session as the alternative for continuing an existing session, 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 description gives clear guidance on selecting between 'outside' and 'desk' modes, including the budgetMinutes requirement for outside mode. It also suggests next steps, but it doesn't explicitly state when to use this tool versus resume_session or other session tools, nor does it mention any preconditions like having no active session.

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

stop_sessionStop sessionA
Destructive

End the current run. In-flight units are released with their checkpoints and the session is classified (resumable, waiting_for_human, blocked or completed). markFailed: true ends it permanently as failed. Returns the final report.

ParametersJSON Schema
NameRequiredDescriptionDefault
notesNoHandoff notes for whoever resumes.
reasonYes
sessionIdYesSession handle returned by start_session.
markFailedNoEnd the session permanently as failed.

Output Schema

ParametersJSON Schema
NameRequiredDescription
reportYes
sessionYes

TDQS

A4.1/5.0
Behavior5/5

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

Annotations mark destructiveHint=true, and the description goes well beyond that by detailing exactly what happens: in-flight units are released with checkpoints, the session is classified as resumable/waiting_for_human/blocked/completed, and markFailed:true permanently fails the session. It also notes the final report return value, giving a clear side-effect model with no contradiction.

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 three tight sentences, front-loaded with the core action and followed by side effects and the markFailed flag. No filler or redundancy is present.

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?

For a destructive, non-idempotent tool with a required reason parameter, the description omits what 'reason' should contain and what 'notes' are for. While the output schema may describe the final report, invocation-critical parameter semantics are incomplete.

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 75%, so most parameters are already documented. The description repeats markFailed's behavior but does not compensate for the required 'reason' parameter or optional 'notes', neither of which have schema descriptions or explanatory text here.

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

Purpose5/5

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

The description states a specific action, 'End the current run', and explains the consequences: in-flight units are released with checkpoints, the session is classified into one of four states, and markFailed:true ends it permanently. This clearly differentiates stop_session from sibling tools like pause_session and resume_session.

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 description implies this tool is for ending a run versus pausing it, and explains that markFailed:true makes the end permanent. However, it never explicitly names the alternative tools (pause_session or resume_session) or states when not to use stop_session, relying on inference.

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

update_work_graphUpdate work graphA

Add or update units (upsert by id), cancel or reopen units, and record project context (summary, key files, commands). The first call submits the initial plan. Rejected as a whole if ids, references or dependencies are invalid or cyclic. Units added after the initial plan need a rationale. Never add work only to use remaining budget.

ParametersJSON Schema
NameRequiredDescriptionDefault
unitsNoUnits to add or update (upsert by id).
cancelNoRemove units from scope.
reopenNoReturn blocked, failed or cancelled units to pending (resets attempts).
sessionIdYesSession handle returned by start_session.
projectContextNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
addedYes
stateYes
updatedYes
guidanceYes
reopenedYes
cancelledYes
sessionIdYes
readyUnitIdsYes
graphRevisionYes

TDQS

A4.4/5.0
Behavior4/5

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

With annotations carrying only default/negative hints, the description carries the transparency burden. It discloses atomic rejection on invalid/cyclic ids, explains that later-added units require a rationale, and warns against budget padding. It does not detail side effects of cancel on dependents, but the key behavioral traits are surfaced.

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?

Four sentences with no redundancy; the main operations are front-loaded, constraints follow logically, and the final sentence is a crisp boundary. Every sentence adds information.

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?

Given the tool's multi-operation complexity and the presence of an output schema, the description covers the essential usage context, validation behavior, and budget expectations. It omits minor details like dependency-cancellation semantics but is sufficient for correct invocation.

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

Parameters4/5

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

Schema coverage is high (80%), so the baseline is 3. The description adds beyond the schema by explaining upsert semantics, the cancel/reopen actions, and the initial-plan condition that determines when rationale is required, giving inter-parameter meaning.

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

Purpose5/5

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

The description opens with a specific verb-resource pairing ('Add or update units... cancel or reopen... record project context') that makes the tool's function unmistakable. It also names the distinguishing context ('The first call submits the initial plan'), separating it from read-only siblings like get_work_graph and execution tools like next_work.

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 clear context on when to use the tool: the first call initializes the plan, and later calls add/update with rationale requirements. It includes a when-not ('Never add work only to use remaining budget'), though it does not explicitly name sibling alternatives.

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

Tool Schema Changelog

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

  1. 16 tool updatesv0.1.0
    • First observedget_decisions
    • First observedget_handoff
    • First observedget_phase
    • First observedget_session
    • First observedget_session_report
    • First observedget_work_graph
    • First observedlist_sessions
    • First observednext_work
    • First observedpause_session
    • First observedrecord_decision
    • First observedreport_work
    • First observedrequest_decision
    • First observedresume_session
    • First observedstart_session
    • First observedstop_session
    • First observedupdate_work_graph

TDQS

A4.1/5.0

Scored across 16 tools

Disambiguation5/5

Each tool targets a distinct aspect of session and work-graph management, with clear separation between session lifecycle (start/pause/resume/stop), state inspection (get_session, get_phase, get_handoff, get_session_report), work graph manipulation (get/update_work_graph, next/report_work), and decision handling (request/get/record_decision). No two tools appear to do the same thing.

Naming Consistency5/5

All 16 tools follow a consistent snake_case verb_noun pattern (e.g., pause_session, update_work_graph, request_decision). The verbs are imperative and match the action taken, with no mixing of conventions or vague generic names.

Tool Count4/5

At 16 tools, the set is slightly above the typical 3–15 range, but each tool serves a distinct and necessary function for managing complex agent work sessions, covering lifecycle, graph, decisions, and reporting. The count feels justified rather than bloated.

Completeness5/5

The tool surface fully covers the session lifecycle (start, pause, resume, stop), work graph operations (create/update, query, claim, report), decision management (request, query, record), and reporting (handoff, session report). No obvious dead ends or missing operations for the stated domain.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers