agent-work-mcp
Orchestrate long-running coding-agent work sessions with budgets, dependency graphs, human decisions, validation, and handoffs.
Start work sessions in OUTSIDE_MODE (autonomous, budgeted) or DESK_MODE (human-in-the-loop).
Define a phase goal, exit criteria, constraints, and project context.
Build and update a dependency graph of work units with estimates, acceptance criteria, and touch paths.
Claim next work via
next_work— direct, parallel, wait, or stop based on policy and budget.Report progress, completions with validation evidence, failures, blockers, or released units.
Queue human decisions without blocking independent work; get suggestions and impacted units.
Record human decisions (or withdraw questions) to unblock dependent units.
Pause, resume, and stop sessions; recover interrupted runs from checkpoints.
Get full handoffs with next actions, blocked work, decisions, and project context.
Inspect sessions, work graphs, phases, decisions, and detailed session reports.
Enforce server-side rules: budget, retry limits, parallelism constraints, and validation requirements.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@agent-work-mcpStart an outside session with a 90-minute budget to complete the login feature."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.
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_handoffSession 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 |
|
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 |
|
Decisions don't stop independent work | A decision gates only its affected units and their dependents. The run halts as |
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.gitcd agent-work-mcp && npm install && npm run buildThis produces dist/cli.js, a stdio MCP server. Check it:
node dist/cli.js --versionConnect 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.jsVerify:
claude mcp get agent-workIf 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:
start_sessioncreates the session and returns asessionId, 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 MCPinstructions.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"] } ] }The loop.
next_workreturnsexecute(with a direct or parallel dispatch and the reasons for it),wait(units still in flight),plan(the work graph isn't submitted yet), orstop.Reporting. After each unit the agent calls
report_workwith 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.Questions. When human judgment is needed, the agent calls
request_decisionwith the question, why it matters, options, an optional recommendation, and the affected units. It gets back the independent work that can continue.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.
Stop. The run ends with one of these reasons:
Stop reason
Meaning
Session afterwards
completedEverything done and validated
completedwaiting_for_humanAll remaining work waits on at least one open decision
waiting_for_humanblockedRemaining work is blocked or failed
blockedbudget_exhaustedBudget spent and executable work remains
resumablebudget_insufficientNo 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_sessionwithmode: "desk"works through the remaining units with you, one at a time;resume_sessionwithmode: "outside"andaddBudgetMinuteshands 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
touchesand estimates, and areparallelSafe;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) ≥ 30minutes.
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 |
| Create a session ( |
| Find sessions with state, liveness, budget and open decisions. |
| State, budget, unit counts, in-flight units, runs. |
| Goal, exit criteria, constraints, progress, recorded project context. |
| Units with readiness and root causes, plus edges. |
| Add or update units, cancel or reopen units, record project context. Applied all-or-nothing. |
| Claim the next work: |
|
|
| Queue a question for a human; get the independent work back. |
| The queue, most blocking first. |
| A human's answer (or a withdrawal). |
| Pause; the budget clock stops and claims are kept. |
| Resume from the handoff; optionally switch mode or add budget. |
| End the run and return the report; |
| Where to pick up, as Markdown plus structured data. |
| 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 |
| the server's working directory | Default project root for new sessions. |
|
| 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 submittedDevelopment
npm testnpm run typecheck && npm run buildsrc/
├── 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 testsThe 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_sessionorresume_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
AgentExecutorport so the server can dispatch work to headless agents directly.Streamable HTTP transport for remote use.
Documentation
Document | Covers |
Layers, ports, control flow, durability | |
States, transition table, budget, liveness | |
Units, validation rules, readiness, scheduling, parallelism | |
Raising, resolving and ordering decisions | |
OUTSIDE loop, DESK flow, pause/resume/stop, handoff, report | |
Tool reference and error codes | |
v0.1 plan and technology choices |
License
Available Tools
16 toolsget_decisionsGet decisionsARead-only
The decision queue, most blocking first, with why each matters, options, the agent suggestion and blocked/independent work.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Default 'open'. | |
| sessionId | Yes | Session handle returned by start_session. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| state | Yes | |
| decisions | Yes | |
| sessionId | Yes | |
| canRecordDecisions | Yes |
TDQS
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.
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.
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.
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.
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.
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 handoffARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | Session handle returned by start_session. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| notes | Yes | |
| phase | Yes | |
| state | Yes | |
| budget | Yes | |
| blocked | Yes | |
| inFlight | Yes | |
| liveness | Yes | |
| markdown | Yes | |
| completed | Yes | |
| readyNext | Yes | |
| sessionId | Yes | |
| repository | No | |
| generatedAt | Yes | |
| nextActions | Yes | |
| projectRoot | Yes | |
| stateReason | Yes | |
| projectContext | No | |
| decisionsNeeded | Yes |
TDQS
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.
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.
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.
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.
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.
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 phaseARead-only
The phase goal, exit criteria and constraints this session owns, progress toward it, and the project context recorded during analysis.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | Session handle returned by start_session. |
Output Schema
| Name | Required | Description |
|---|---|---|
| phase | Yes | |
| state | Yes | |
| progress | Yes | |
| sessionId | Yes | |
| openDecisions | Yes | |
| projectContext | No |
TDQS
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.
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.
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.
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.
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.
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 sessionARead-only
Current state, mode, budget, unit counts, in-flight units and run history of one session.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | Session handle returned by start_session. |
Output Schema
| Name | Required | Description |
|---|---|---|
| session | Yes | |
| guidance | Yes |
TDQS
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.
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.
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.
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.
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.
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 reportARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | Session handle returned by start_session. |
Output Schema
| Name | Required | Description |
|---|---|---|
| runs | Yes | |
| phase | Yes | |
| budget | Yes | |
| outcome | Yes | |
| markdown | Yes | |
| completed | Yes | |
| decisions | Yes | |
| nextSteps | Yes | |
| sessionId | Yes | |
| dispatches | Yes | |
| unitCounts | Yes | |
| unresolved | Yes | |
| validation | Yes | |
| generatedAt | Yes | |
| stateReason | Yes | |
| scopeAddedMidSession | Yes |
TDQS
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.
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.
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.
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.
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.
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 graphARead-only
Units with status, derived readiness and root causes (decision:, blocker:, failure:, cancelled:), plus dependency edges. Filter: all | remaining | ready | in_progress | done.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Default 'all'. | |
| sessionId | Yes | Session handle returned by start_session. |
Output Schema
| Name | Required | Description |
|---|---|---|
| edges | Yes | from depends on to. |
| state | Yes | |
| units | Yes | |
| sessionId | Yes | |
| graphRevision | Yes |
TDQS
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.
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.
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.
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.
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.
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 sessionsARead-only
List recorded sessions (newest first) with state, budget and open decision counts. Use to find a session to inspect or resume.
| Name | Required | Description | Default |
|---|---|---|---|
| projectRoot | No | Only sessions for this project root. | |
| includeTerminal | No | Include completed and failed sessions. Default true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sessions | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | Session handle returned by start_session. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| state | Yes | |
| action | Yes | |
| budget | Yes | |
| dispatch | No | |
| guidance | Yes | |
| inFlight | Yes | |
| sessionId | Yes | |
| stopReason | No | |
| openDecisions | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Handoff notes for whoever resumes. | |
| reason | No | ||
| sessionId | Yes | Session handle returned by start_session. |
Output Schema
| Name | Required | Description |
|---|---|---|
| session | Yes | |
| guidance | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| choice | No | The human decision: an option id/label or free text. Required unless withdraw. | |
| withdraw | No | The question no longer applies. | |
| decidedBy | Yes | Name of the human who decided. | |
| rationale | No | ||
| sessionId | Yes | Session handle returned by start_session. | |
| decisionId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| state | Yes | |
| decision | Yes | |
| guidance | Yes | |
| sessionId | Yes | |
| unblockedUnitIds | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| unitId | Yes | ||
| blocker | No | Required for blocked. | |
| outcome | Yes | progress = checkpoint/heartbeat; completed = done with passing validation; failed = attempt failed; blocked = external blocker; released = hand the unit back unstarted or partially done. | |
| summary | Yes | What happened, in one or two sentences. | |
| artifacts | No | Files changed, commits, PRs. | |
| sessionId | Yes | Session handle returned by start_session. | |
| checkpoint | No | Exact resume point for unfinished work. | |
| validation | No | Required for completed. |
Output Schema
| Name | Required | Description |
|---|---|---|
| unit | Yes | |
| state | Yes | |
| guidance | Yes | |
| sessionId | Yes | |
| newlyReadyUnitIds | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| options | No | ||
| category | No | ||
| question | Yes | Answerable by a human without reading code. | |
| sessionId | Yes | Session handle returned by start_session. | |
| checkpoint | No | Resume point for an in-progress affected unit. | |
| whyItMatters | Yes | What goes wrong if this is decided badly or not at all. | |
| recommendation | No | Your suggestion. Stored as a suggestion; never applied. | |
| affectedUnitIds | No | Units that cannot proceed until this is decided. |
Output Schema
| Name | Required | Description |
|---|---|---|
| state | Yes | |
| decision | Yes | |
| guidance | Yes | |
| sessionId | Yes | |
| releasedUnitIds | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Switch mode on resume. Default: keep current mode. | |
| takeover | No | Take over a session that still looks active (e.g. the previous agent died recently). | |
| sessionId | Yes | Session handle returned by start_session. | |
| addBudgetMinutes | No | Extend the autonomous budget. |
Output Schema
| Name | Required | Description |
|---|---|---|
| handoff | Yes | |
| session | Yes | |
| guidance | Yes | |
| releasedUnitIds | Yes | |
| recoveredFromInterruption | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | Yes | The outcome this session owns, typically the current project phase objective. | |
| mode | Yes | 'outside' = bounded autonomous run with no human present (primary). 'desk' = human in the loop. | |
| phaseTitle | No | Short name of the phase. Defaults to the goal. | |
| constraints | No | Boundaries the agent must respect (areas not to touch, etc.). | |
| projectRoot | No | Absolute path of the project. Defaults to the server working directory. | |
| exitCriteria | No | Observable conditions that mean the phase is done. | |
| budgetMinutes | No | Total autonomous wall-clock budget for the whole session. Required for outside mode. |
Output Schema
| Name | Required | Description |
|---|---|---|
| session | Yes | |
| guidance | Yes | |
| snapshot | No | |
| otherSessions | Yes | Non-terminal sessions already recorded for this project. |
TDQS
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.
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.
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.
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.
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.
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 sessionADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Handoff notes for whoever resumes. | |
| reason | Yes | ||
| sessionId | Yes | Session handle returned by start_session. | |
| markFailed | No | End the session permanently as failed. |
Output Schema
| Name | Required | Description |
|---|---|---|
| report | Yes | |
| session | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| units | No | Units to add or update (upsert by id). | |
| cancel | No | Remove units from scope. | |
| reopen | No | Return blocked, failed or cancelled units to pending (resets attempts). | |
| sessionId | Yes | Session handle returned by start_session. | |
| projectContext | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| added | Yes | |
| state | Yes | |
| updated | Yes | |
| guidance | Yes | |
| reopened | Yes | |
| cancelled | Yes | |
| sessionId | Yes | |
| readyUnitIds | Yes | |
| graphRevision | Yes |
TDQS
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.
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.
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.
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.
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.
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.
16 tool updates
v0.1.0- First observed
get_decisions - First observed
get_handoff - First observed
get_phase - First observed
get_session - First observed
get_session_report - First observed
get_work_graph - First observed
list_sessions - First observed
next_work - First observed
pause_session - First observed
record_decision - First observed
report_work - First observed
request_decision - First observed
resume_session - First observed
start_session - First observed
stop_session - First observed
update_work_graph
TDQS
Scored across 16 tools
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.
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.
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.
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
Related MCP Connectors
AI work orchestration for plans, tasks, teams, and coding-agent dispatch.
Hosted runtime for persistent agent teams, durable workflows, memory, schedules, and goals.
- ParleyOAuthdev.weldra
Coordination hub for AI coding agents: message teammates, ask humans, audit every event.
Cross-agent artifact workspace with provenance across Claude Code, Codex, Cursor, LangGraph.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables persistent task and goal management with AI-powered decomposition, cross-session continuity, and fault-tolerant multi-agent pipelines.1-
- FlicenseBqualityDmaintenanceStructured workspace runtime for long-running coding agents, providing controlled workspace capabilities with task state, snapshots, checkpoints, drift detection, verification evidence, audit logs, and structured handoff.20-
- FlicenseNot gradedqualityCmaintenanceEnables AI coding agents to plan, build, and review websites and product interfaces with a persistent, user-led process, including design direction, component contracts, and implementation review.-
- AlicenseNot gradedqualityAmaintenanceEnables evidence-gated, multi-session AI coding runs with plan-build-ship state management, coordinating Claude Code and Codex native agents.10 npmMIT