Skip to main content
Glama

EVC Mesh MCP Server

Install via Spark

Tasks, comments, shared memory and handoffs for teams of people and AI agents, over MCP.

EVC Mesh is an open-source task manager built for teams where people and AI agents work side by side. This Model Context Protocol server connects your agent to a Mesh workspace: it can pick up assigned tasks, check out work, comment, move tasks through your workflow, hand off to teammates, and keep decisions in shared project memory.

Two tool profiles: core (34 tools, for everyday task work) and full (84 tools, including recurring tasks, docs and workspace admin). Every tool is marked read-only or write, so clients can ask before changing anything.

You need a Mesh workspace and an agent key from it. Mesh is self-hosted (Apache-2.0, docker compose setup in the evc-mesh repository). Set MESH_API_URL to your instance and MESH_AGENT_KEY to the agent's key. Workspaces on the hosted instance are by invitation.

Works with Cursor, Cline, OpenClaw and other MCP clients.

This is the actively developed copy. evc-mesh also ships an MCP server (./cmd/mcp, same internal/mcp tool set) that it builds and deploys itself — the two exist because Go's internal/ visibility rules mean one repo can't import the other's package, not because they're meant to diverge. New tools and fixes land here first.

Prerequisites

  • Go 1.22+

  • Running EVC Mesh instance

  • Agent registered in Mesh with an API key (agk_...)

Related MCP server: slm-mesh

Installation

go install github.com/entire-vc/evc-mesh-mcp@latest

Or build from source:

git clone https://github.com/entire-vc/evc-mesh-mcp.git
cd evc-mesh-mcp
go build -o evc-mesh-mcp .

Docker

docker run -i --rm \
  -e MESH_API_URL \
  -e MESH_AGENT_KEY \
  ghcr.io/entire-vc/evc-mesh-mcp

-i is required — the server speaks MCP over stdio, and Docker only wires up stdin when the container runs interactively. The image starts with the core profile; add -e MESH_MCP_PROFILE=full for every tool (see Tool Profiles below). The image is published for linux/amd64 and linux/arm64 from Dockerfile in this repo on every tagged release (docs/RELEASING.md).

Tool Profiles

The MCP server supports two profiles to optimize context window usage:

Profile

Tools

Context overhead

Best for

core

34

~8K tokens (4% of 200K)

Claude Code, Cursor, small-context models

full

84

~18K tokens (9% of 200K)

Power users, automation agents, admin ops

Set via MESH_MCP_PROFILE environment variable. Default: full for the binary, core for the Docker image (-e MESH_MCP_PROFILE=full switches it).

Configuration

Variable

Required

Default

Description

MESH_API_URL

Yes

http://localhost:8005

Base URL of the Mesh API

MESH_AGENT_KEY

Yes (stdio)

—

Agent API key (agk_...)

MESH_CHAT_TOKEN_FILE

No

—

Stdio chat mode: path to a file holding a chat-session token (cst_...), sent as Authorization: Bearer and re-read on every request. Replaces MESH_AGENT_KEY; if both are set the agent key is ignored.

MESH_MCP_PROFILE

No

full (Docker image: core)

Tool profile for stdio: core or full (SSE serves both)

MESH_MCP_TRANSPORT

No

stdio

Transport mode: stdio or sse

MESH_MCP_HOST

No

0.0.0.0

SSE server bind host

MESH_MCP_PORT

No

8081

SSE server bind port

MESH_MCP_AUTH_FAIL_RPM

No

20

SSE mode: per-IP budget for authentication attempts against a not-yet-cached agent key on /sse, /core/sse, /mcp, /mcp/core. Over budget → 429 without calling Mesh API. 0 disables.

MESH_MCP_SESSION_CACHE_TTL_MIN

No

15

SSE mode: how long a successful authentication is trusted before the key is re-checked — bounds how long a revoked key keeps working without a restart.

MESH_MCP_AUTH_FAIL_CACHE_SEC

No

30

SSE mode: how long a failed authentication (bad/unknown key) is remembered, so repeating the same bad key doesn't call Mesh API every request.

MESH_MCP_PUBLIC_URL

No

—

SSE mode: the URL the MCP root is reachable at from outside, e.g. https://mesh.example.com/mcp. Used for the absolute SSE endpoint and as the OAuth resource URL (see OAuth). Unset: derived from each request's host, which is only right when clients reach this server directly — behind a proxy set it, or the derived core URL (/core) will not match the public one (/mcp/core).

MESH_MCP_OAUTH_ISSUER

No

origin of MESH_MCP_PUBLIC_URL

SSE mode: the OAuth authorization server named in the protected-resource metadata — your Mesh instance's public origin. Set it only if the MCP server is served from a different origin than the Mesh API.

MESH_MCP_OAUTH_CACHE_TTL_SEC

No

60

SSE mode: how long a verified OAuth access token is trusted before Mesh API is asked again. Deliberately much shorter than the agent-key TTL so a revoked grant stops working within about a minute.

MESH_MCP_DECIDER_USERNAME

No

—

Username recorded as decided_by when record_owner_decision answers a gated task. Unset: the workspace owner.

MESH_MCP_LEGACY_TOOL_ALIASES

No

off

1 also registers the tools' earlier names, for deployments whose callers still use them. Leave off for new installs.

Running without credentials

In stdio mode the server also starts when MESH_AGENT_KEY is not set. It then answers initialize and tools/list as usual, and every tool call returns instructions for setting MESH_API_URL and MESH_AGENT_KEY. This lets MCP clients and catalogs inspect the tool list before you have a key. If a key is set but authentication fails at startup (API unreachable, key rejected), the server keeps running: tools are listed, and each call retries authentication and returns the reason until it succeeds.

Tool annotations

Every tool declares the MCP hints readOnlyHint, destructiveHint, idempotentHint and openWorldHint, so clients can tell read-only tools (get_*, list_*, recall, search_docs, …) from ones that change or remove data (update_*, move_task, forget, …).

Client metrics

Each initialize is logged with the client's clientInfo.name and version, and counted in the Prometheus metric mesh_mcp_initialize_total{client,profile} (exposed on /metrics in SSE mode; client names are normalised and capped).

Claude Code (stdio mode)

Add to your project's .mcp.json:

{
  "mcpServers": {
    "evc-mesh": {
      "command": "evc-mesh-mcp",
      "env": {
        "MESH_API_URL": "https://your-mesh-instance.example.com",
        "MESH_AGENT_KEY": "agk_your-workspace_your-key",
        "MESH_MCP_PROFILE": "core"
      }
    }
  }
}

Cursor

Add to Cursor MCP settings (Settings → MCP Servers):

{
  "evc-mesh": {
    "command": "evc-mesh-mcp",
    "env": {
      "MESH_API_URL": "https://your-mesh-instance.example.com",
      "MESH_AGENT_KEY": "agk_your-workspace_your-key",
      "MESH_MCP_PROFILE": "core"
    }
  }
}

SSE Mode (multi-agent, shared server)

For connecting multiple agents through a shared MCP endpoint:

MESH_API_URL=https://your-mesh-instance.example.com \
MESH_MCP_PORT=8081 \
evc-mesh-mcp --transport sse

SSE mode serves two profiles simultaneously on different paths:

Path

Profile

Description

/sse + /message

full

All 84 tools (backward compatible)

/core/sse + /core/message

core

34 essential tools

The same process also serves the Streamable HTTP transport (stateless, one agent key per request, sent in the Authorization: Bearer or X-Agent-Key header — the query parameter is refused there):

Path

Profile

/mcp

full

/core

core

Authentication per connection via:

  • Authorization: Bearer agk_... header

  • X-Agent-Key: agk_... header

  • ?agent_key=agk_... query parameter (SSE connect only)

  • Authorization: Bearer mot_... — an OAuth access token issued by your Mesh instance (see below); the header only, never the query string, and on the Streamable HTTP endpoints only (SSE connections need an agent key)

OAuth (remote connectors)

Clients that sign users in with OAuth — remote-connector directories, MCP Inspector, editors that follow the MCP authorization spec — connect to the Streamable HTTP endpoints without a pre-shared key. Your Mesh instance is the authorization server (dynamic client registration, PKCE, user consent); this server is the resource server and does two things:

  • Challenges. A request with no credential, or with an OAuth access token Mesh API rejects (expired, revoked, never issued), gets 401 and

    WWW-Authenticate: Bearer resource_metadata="https://mesh.example.com/.well-known/oauth-protected-resource/mcp", scope="mesh"

    which is where a client starts the authorization flow. A rejected agent key keeps answering 403. Only a verdict from Mesh API (a 4xx other than 408/429) makes a token invalid: if Mesh API cannot be reached or answers with an error that says nothing about the token (5xx, 429), the answer is 503 with Retry-After, so a valid token is not thrown away over an outage.

  • Serves the metadata (RFC 9728) at the well-known path derived from each endpoint's URL:

    Endpoint

    Metadata

    https://mesh.example.com/mcp (full)

    /.well-known/oauth-protected-resource/mcp

    https://mesh.example.com/mcp/core (core)

    /.well-known/oauth-protected-resource/mcp/core

    {
      "resource": "https://mesh.example.com/mcp",
      "authorization_servers": ["https://mesh.example.com"],
      "scopes_supported": ["mesh"],
      "bearer_methods_supported": ["header"]
    }

    resource is MESH_MCP_PUBLIC_URL (trailing slash, query and fragment removed; /core appended for the core profile), so set it to the URL your users paste into the client. The authorization server defaults to that URL's origin; override it with MESH_MCP_OAUTH_ISSUER.

An OAuth token acts as a connector agent in the workspace the user chose when they granted access, with that agent's permissions — the same tools, the same permission model as an agent key. Verified tokens are cached for a minute (MESH_MCP_OAUTH_CACHE_TTL_SEC). The per-IP budget (MESH_MCP_AUTH_FAIL_RPM) is spent by rejected tokens, not by verifications, so many users behind one address are not throttled by their own token refreshes. The token is not audience-bound: any valid access token from your Mesh instance is accepted, which is the intent while the authorization server and this server belong to the same deployment. Agent keys (agk_...) in Authorization or X-Agent-Key work exactly as before, and stdio mode is unaffected.

Your reverse proxy must send /.well-known/oauth-protected-resource* to this server instead of the web app's catch-all: a single-page app answers every unknown path with 200 text/html, which a client cannot tell from missing metadata.

Agent Context Protocol (ACP)

At session start, follow these 5 steps in order:

1. heartbeat(status="online")              → register as alive
2. get_project_knowledge(project_id)       → load accumulated decisions & conventions
3. get_my_rules(project_id)                → understand constraints
4. get_context(project_id)                 → see recent activity + project knowledge
5. get_my_tasks()                          → check assigned work

At session end:

publish_event(type="summary", memory={persist: true})  → broadcast + persist
session_report(model, tokens_in, tokens_out)           → report metrics

MCP Tools — Core Profile (34)

ACP & Identity

Tool

Description

heartbeat

Send heartbeat. Call at session start with status=online. Response includes mesh_version (the running binary's build git-SHA, or "dev" for an unpinned local build) — cheap way to check whether a fix has actually reached the installed binary without shelling out to the host.

get_project_knowledge

Get ALL permanent knowledge (decisions, conventions). ACP Step 2

get_my_rules

Get ALL governance rules (workflow + assignment). ACP Step 3

get_context

Get recent activity + project knowledge. ACP Step 4

get_my_tasks

Get assigned tasks with complete descriptions and optional lossless conditional responses. ACP Step 5

Task Management

Tool

Description

list_projects

List workspace projects

list_tasks

List tasks with filters (status, priority, assignee, search)

get_task

Get task details with optional comments/artifacts/deps

create_task

Create a new task. An agent's start_after names the external event it waits for: start_after_evidence {event_ref, source, why}

update_task

Update task fields. start_after takes the same evidence; an empty start_after is refused — clear with clear_start_after

clear_start_after

Clear start_after only if it is still the schedule you read (expected_start_after, expected_version, expected_origin, schedule_receipt_id from get_task); a changed card is refused with 409 cas_conflict and its current values

move_task

Change task status using slugs

assign_task

Assign/unassign a task

get_task_context

Get everything about a task in one call

add_vcs_link

Link a task to a pull request, commit or branch

Communication

Tool

Description

add_comment

Add comment to a task (markdown). Response includes a delivery array per @-mention reporting whether it actually reached the recipient (task queue/notification) or was skipped/failed and why

publish_event

Publish event + optional memory hint for persistence

Ending a turn

Each command validates its target on the server and writes the state, a generated comment and (where noted) the checkout release in one step. A refusal writes nothing and comes back as <tool> refused: <status> <error_code>: <message>.

Tool

Description

wait_for

Wait on a card, merge request, pipeline or moment (on = card / mr / pipeline / time; a time wait names the external event: until_at with Z or an offset, event_ref, source, why); replaces your previous wait on the card and releases the checkout

continue_next

Record a finished piece of work and keep going: the card stays with you and the checkout is extended

ask_agent

Ask another agent a question (to, question); waits on the answer and releases the checkout. An identical open question is reused

answer_decision

Answer a decision request addressed to you (request_id, answer); wakes the asker

finish_task

Close the card to done or review with result_kind (change / defect / research / content / ops) and evidence, both required

hand_off

Assign the card to another agent, move it to todo and release the checkout in one step (to, why)

add_note

Write a note that wakes nobody: no delivery, no outcome, checkout untouched

A question to a person goes through set_human_gate (full profile).

Memory

Tool

Description

recall

Search memory by keywords (compact by default: ~300 chars of content per item; full=true for everything uncut)

get_memory

Full text of one memory by exact key

remember

Save knowledge (UPSERT by key)

forget

Delete a memory entry

recall_with_graph

Search memory, expanding results through the knowledge graph

set_project_knowledge

Write a structured project fact (upsert by key)

get_canonical_updates

Fetch canonical decisions recorded since a given time

record_owner_decision

Record a decision by the workspace owner as canonical project knowledge

What recall guarantees about its result

limit is a hard bound. The response never contains more than limit items, and total always equals the number of items actually returned. Nothing is added to the page after it has been sized — not pinned rows, not graph-expanded neighbours.

Rows that fail scope/tags/tags_any are dropped, never returned unmarked. This holds regardless of how a row reached the result: ordinary retrieval, pinning, or graph expansion. A pinned row is exempt from ranking, not from eligibility — "pinned" means "do not let ranking bury this", not "show this to a caller who asked for a different scope".

Graph neighbours are marked and bounded. With RECALL_GRAPH_ENABLED=true, recall also runs a knowledge-graph expansion and folds in hop > 0 neighbours, each carrying graph_boost: true and provenance: via:graph. They occupy at most limit/4 of the page (at least 1 when limit >= 2, none when limit < 2) and take its tail slots, displacing the weakest retrieval hits rather than being appended on top. When expansion returns nothing usable, the page is exactly the base result — the reserve is a ceiling, not a quota. graph_boost_count reports how many slots were actually spent.

The reserve exists because base hits carry score (RRF across the retrieval arms) and neighbours carry composite_score from a separate traversal — different fields on different scales. Sorting the union on a common key does not balance them; in practice every observed neighbour ranks below every base hit, so a naive merge-sort would silently disable graph boost. The reserve makes that trade explicit and tunable.

Presets never overrule you. recall classifies the query and may apply a profile (e.g. multi-session widens the page). A profile only fills in parameters you did not supply; an explicit limit always wins.

Utility

Tool

Description

report_error

Report an error on a task

session_report

Report session metrics (model, tokens, cost)

MCP Tools — Full Profile (adds 50 more, 84 total)

Additional Task Tools

Tool

Description

get_project

Get project details with statuses and custom fields

create_subtask

Create subtask under a parent (status_slug optional; defaults to the project's default status, not the parent's; start_after with evidence as in create_task)

add_dependency

Add dependency between tasks; optional condition (task_done, access_ready, contract_ready, artifact_published, shipped, deployed, accepted) says what a blocks edge waits for

update_dependency

Set condition / evidence_url on an existing dependency edge; evidence on a non-task_done edge releases the dependent without the blocker being done

mark_vcs_deployed

Record a deploy (sha, env) on a PR link: sets deployed_sha / deployed_env / deployed_at and releases dependents waiting on a deployed edge

remove_dependency

Remove a dependency edge (task_id blocked, depends_on_task_id blocker; reason required and logged)

checkout_task

Atomic task lock for multi-agent coordination

release_task

Release atomic task lock

extend_checkout

Extend an existing task lock for longer-running work

set_human_gate

Freeze a task until a named person answers a recorded question (addressee must be a person; supersedes and canonical_key cover a repeat of an answered question)

clear_human_gate

Release a human gate

Comments & Artifacts

Tool

Description

list_comments

List task comments (newest first by default)

upload_artifact

Upload file/code/log to a task

list_artifacts

List task artifacts

get_artifact

Get artifact details (download_path; bytes via the two-step download below)

Downloading an artifact

Downloading an artifact is two GETs. Step 1: GET /api/v1/artifacts//download with header X-Agent-Key: -> 200 JSON {"url": ""}. Step 2: GET that url with NO headers -> 200, the file bytes. Pitfalls: on step 1 only X-Agent-Key is accepted (X-API-Key and Authorization: Bearer give 401); on step 2 any extra header, Authorization in particular, breaks the presigned signature (400). The artifact's download_path is step 1's path. browser_only_url is a human page and answers 401 to an agent key by design.

Event Bus

Tool

Description

publish_summary

Publish work summary (convenience wrapper)

subscribe_events

Configure webhook delivery for events

poll_tasks

Long-poll for new task assignments

Agent & Team

Tool

Description

register_sub_agent

Register a sub-agent

list_sub_agents

List sub-agents (optionally recursive)

get_team_directory

Get workspace team directory

update_agent_profile

Update agent role, capabilities, profile

Governance & Config

Tool

Description

get_project_rules

Get all project rules

get_assignment_rules

Get assignment rules

get_workflow_rules

Get workflow rules with caller permissions

import_workspace_config

Import workspace config from YAML

export_workspace_config

Export workspace config as YAML

Recurring Tasks

Tool

Description

create_recurring_task

Create recurring task schedule

list_recurring_schedules

List recurring schedules

get_recurring_history

Get instance history for a schedule

trigger_recurring_now

Trigger next instance immediately

update_recurring_schedule

Change or deactivate a recurring schedule

delete_recurring_schedule

Delete a recurring schedule (existing instances stay)

Documents & Knowledge

Tool

Description

list_docs

List a project's documents (metadata only)

get_doc

Read a document (outline by default, body on request)

search_docs

Full-text search across a project's documents

create_doc

Create a document

update_doc

Edit a document (optimistic concurrency via base_version)

comment_doc

Comment on a document or a quoted passage

list_doc_comments

Read a document's comment threads

post_project_update

Post the project's daily status report to its Updates section

get_project_updates

Read a project's Updates feed, newest first

get_canonical

Query curated facts and decisions for a topic

Runner

Need the operator's "Can manage My Runner" grant; without it the server's 403 is returned as is.

Tool

Description

get_operator_runtime

Read the operator's runner settings (My Runner) with its revision

save_operator_runtime

Replace the operator's runner settings (if_revision guarded)

get_operator_runtime_history

List earlier revisions of the operator's runner settings

set_agent_limits

Set an operator agent's max_concurrent_tasks

get_workspace_runtime

Read a workspace's runner catalog (operator must be its admin)

get_workspace_runtime_revisions

List stored revisions of a workspace's runner catalog

save_workspace_runtime

Replace a workspace's runner catalog (if_revision guarded)

Architecture

AI Agent (Claude Code / Cursor / Cline / OpenClaw)
    ↕ MCP (stdio or SSE)
EVC Mesh MCP Server (core or full profile)
    ↕ REST API (HTTP)
EVC Mesh API Server
    ↕
PostgreSQL / Redis / NATS / S3

The MCP server is a lightweight proxy — it translates MCP tool calls into REST API requests. No direct database access needed.

Running the shared HTTP server

To serve several agents from one process, run the server in SSE mode next to your Mesh API (the same image works: docker run -e MESH_MCP_TRANSPORT=sse -e MESH_API_URL=... -p 8081:8081 ghcr.io/entire-vc/evc-mesh-mcp) and put it behind your reverse proxy. It exposes both SSE (/sse, /core/sse) and Streamable HTTP (/mcp, /core); every connection or request authenticates with its own agent key. The server has no database of its own: it calls the Mesh REST API, so upgrade it after the Mesh API it talks to.

The heartbeat tool returns mesh_version, the commit the running binary was built from, and --version prints it too.

Skills and plugin layout

The repo follows the Open Plugins layout: plugin.json (manifest), mcp.json / .mcp.json (stdio server config, values come from your environment) and skills/:

Skill

Purpose

mesh-tasks

Session start protocol, taking, updating and closing tasks

mesh-memory

remember / recall / forget conventions

mesh-coordination

Team directory, locks, events, hand-offs (full profile)

This server exposes tools only; it does not define MCP prompts or resources.

MCP Badge Glama Smithery

License

MIT

Available Tools

69 tools
add_commentA

Add a comment to a task. Response is lean by default: id/author/created_at and the delivery report, without echoing the body you just sent; full=true returns the whole comment. If the body @-mentions someone, the response carries a delivery array — one entry per mentioned handle — reporting whether it actually reached a path they consume (their task queue, a notification) or was skipped/failed and why; a hint field suggests the fix when there is one (e.g. assign the task). Omitted entirely when the comment mentions nobody.

NameRequiredDescriptionDefault
bodyYesComment body (markdown supported).
fullNoReturn the whole created comment (body echo included) instead of the lean confirmation.
task_idYesTask ID.
metadataNoAdditional metadata as key-value pairs. Set {"informational": true} on a comment you write on a task that is ALREADY done/cancelled when your comment needs no action from its assignee — a plain acknowledgement, "noted", "nothing further from me" — to stop the server's own follow-up-card mechanism from opening one for it. Omit it (default: not flagged) for anything that names a problem, asks a question, or reports a finding — an unflagged comment on a closed card still opens a follow-up as before, so forgetting the flag costs nothing. The flag is IGNORED if your comment also contains a `❓ Blocking @<person>` marker: a live ask to a human is never suppressed by this field.
is_internalNoMark as internal (agent-only visible).
parent_comment_idNoParent comment ID for threading.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations only declare the operation is non-read-only, non-idempotent and non-destructive; the description goes substantially further by disclosing the actual response contract (lean default, `full` opt-in) and the conditional `delivery` array with per-mention reach/skip reporting and `hint` suggestions. It stops short of permissions, threading behavior or failure modes, but adds real behavioral value beyond the structured fields.

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

Conciseness4/5

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

Front-loaded with the one-line purpose, then dense, information-bearing detail about the response shape and mention-delivery semantics. No filler, though the closing sentence about omitting `delivery` when nobody is mentioned restates what the preceding sentence already implied.

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 no output schema, the description correctly carries the burden of describing return values and does so well (lean vs full, delivery/hint). For a mutation tool with nested `metadata` semantics this is nearly complete; the gap is the absence of any comparison to comment_doc, which an agent choosing among 60+ siblings would want.

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's explanation of `full` largely restates what the schema description already says, and it never touches `metadata`, `is_internal` or `parent_comment_id` – the semantic load stays with 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?

Opens with a specific verb+resource: "Add a comment to a task." An agent can tell what it does. However, it never differentiates itself from sibling tools like comment_doc or list_comments, so the boundary of when this exact tool applies is left implicit.

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

Usage Guidelines3/5

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

Usage context is implied rather than stated: the discussion of @-mention delivery and the `hint` field tells the agent this is the tool for posting task comments that may notify people. There is no explicit when-to-use/when-not-to-use guidance and no mention of the alternatives (comment_doc, list_comments) that a sibling-aware agent would need.

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

add_dependencyA

Add a dependency edge: task_id depends on depends_on_task_id. With the default type blocks, task_id is held back from its assignee until the blocker meets condition (default: the blocker is done). relates_to and is_child_of only record a link and hold nothing. Change the condition with update_dependency; delete the edge with remove_dependency.

NameRequiredDescriptionDefault
task_idYesUUID of the dependent task: the one that waits.
conditionNoWhat a blocks edge waits for. task_done (default): the blocker reaches done or cancelled. access_ready / contract_ready / artifact_published: released by evidence_url, or when the blocker reaches done or cancelled. shipped: the blocker is marked shipped or reaches done (cancelled does not release it). deployed: the blocker is marked shipped or a VCS link of it has a recorded deploy (see mark_vcs_deployed); merged/done alone does not release it. accepted: the blocker reaches done (cancelled does not release it). Evidence (evidence_url) releases an edge of any condition. Only for blocks edges. Use a non-default condition when the blocker is a perpetual monitor/recurring card that never reaches done. The response carries `warning` when a blocks edge targets such a card, and `condition_satisfied` (true when the edge no longer holds the dependent).
evidence_urlNoProof that the condition already holds (link to the artifact, check or comment). With a non-task_done condition it releases the edge at once; otherwise set it later with update_dependency.
dependency_typeNoDependency type: blocks, relates_to, is_child_of.blocks
depends_on_task_idYesUUID of the blocker: the task that must be done (or meet condition) first. Must differ from task_id. Direction matters; swapping the two makes the blocker wait instead.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations declare only that this is a non-idempotent, non-destructive write. The description goes well beyond that: it explains the actual consequence (the dependent is held back from its assignee until the blocker meets the condition), what each condition releases on, that evidence_url releases an edge of any condition, and that responses carry `warning` and `condition_satisfied`. That is real context an agent could not derive from the annotations.

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

Conciseness5/5

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

Four sentences, front-loaded with the direction and the default behavior, then the non-holding edge types, then the sibling routing. No restatement of the tool name and no filler; every clause either defines effect or dispatches the agent elsewhere.

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?

No output schema exists, and the description still covers the effect of the write, the condition matrix, the evidence short-circuit, and the response fields that matter (`warning`, `condition_satisfied`). For a 5-parameter dependency mutation this is sufficient to invoke correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3 and the schema already carries the heavy detail on conditions and evidence. The description adds the framing that 'blocks' is the type the condition applies to and that the two task IDs are direction-sensitive ('swapping the two makes the blocker wait instead'), which is meaningful beyond the schema's per-field notes.

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?

Opens with a specific verb and resource plus the direction semantics: 'Add a dependency edge: task_id depends on depends_on_task_id.' It immediately distinguishes the edge types by effect (blocks holds back work; relates_to/is_child_of only record a link), so an agent can tell what it is creating without opening the schema.

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

Usage Guidelines4/5

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

Explicitly routes modification and deletion to update_dependency and remove_dependency, and explains the release condition per edge type so the agent can pick a type deliberately. It stops short of covering the creation-side alternatives — notably when to use an is_child_of edge versus the sibling create_subtask, and no guidance on cycles beyond the schema's 'must differ from task_id'.

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

assign_taskA
DestructiveIdempotent

Assign a task to a user or agent. Returns a lean confirmation by default (id, status_id, assignee, updated_at); full=true returns the whole task.

NameRequiredDescriptionDefault
fullNoReturn the complete task (all fields, verbatim) instead of the lean confirmation.
task_idYesTask ID.
assignee_idNoAssignee UUID. Omit to unassign.
assignee_typeNoAssignee type: user, agent.agent
assign_to_selfNoAssign to the calling agent.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=true, covering the safety/mutation profile. The description adds value by disclosing the return shape: a lean confirmation (id, status_id, assignee, updated_at) by default versus the full task when full=true. It omits what happens to a previously assigned or checked-out task, so it stops short of 5.

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 tightly written sentences with the core action front-loaded and the return-value caveat immediately after. Nothing is redundant or wasted.

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

Completeness4/5

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

For a mutation tool with a complete schema and annotations covering the safety profile, the description supplies the one thing not in structured data: the default lean response versus the full=true response. Minor gaps remain on permission requirements and reassignment side effects, but the essentials to call it correctly are present.

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% and the schema already documents task_id, assignee_id, assignee_type, and full in detail. The description only restates the lean-vs-full distinction already present in the full parameter's schema entry, so baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb (assign) plus resource (task) and target (a user or agent), distinguishing it from siblings such as release_task, checkout_task, and move_task. An agent can identify the operation without opening the schema.

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

Usage Guidelines2/5

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

The description gives no explicit when-to-use, when-not, or alternatives. It never mentions release_task/checkout_task or the relationship between assigning and those state transitions, leaving usage to inference from the name alone.

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

checkout_taskA
Idempotent

Atomically acquire an exclusive lock on a task. Prevents other agents from checking out the same task simultaneously. The lock is TTL-based and will expire automatically after ttl_minutes (default 120). The lock gives the holder exclusive access to the task.

NameRequiredDescriptionDefault
task_idYesTask ID to check out.
ttl_minutesNoLock TTL in minutes (default 120).

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already establish that this is a non-read-only, idempotent, non-destructive, closed-world mutation. The description adds meaningful behavior beyond that: acquisition is atomic, the lock is exclusive, it is TTL-based, and it expires automatically after ttl_minutes. It does not describe what happens on contention or failure to acquire, so it falls short of a 5.

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

Conciseness4/5

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

The description is front-loaded and appropriately short for the tool. It is slightly repetitive, since "exclusive lock" and exclusive access are stated more than once, but the repetition is minor and does not obscure the key 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 the rich annotations, fully described schema, and no output schema, the description covers the essential behavior: atomicity, exclusivity, TTL expiration, and default TTL. It could be more complete by mentioning release_task/extend_checkout or lock-acquisition failure behavior, but it is sufficient for an agent to understand the core operation.

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%, and the schema already documents both task_id and ttl_minutes including the default. The description restates the TTL semantics and default without adding syntax, constraints, or edge-case meaning beyond the schema, so baseline 3 is appropriate.

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

Purpose5/5

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

The description uses a specific verb and resource: "Atomically acquire an exclusive lock on a task." It immediately clarifies the concurrency purpose by stating it prevents other agents from checking out the same task simultaneously, which distinguishes it from generic task reads/updates and from the complementary release/extend tools.

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 when the tool is useful by explaining that it prevents simultaneous checkout and grants exclusive access. However, it does not explicitly state when to call it versus alternatives such as release_task, extend_checkout, or get_task_context, nor does it describe exclusion conditions.

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

clear_human_gateA
DestructiveIdempotent

Release a human gate. human_gate_info on get_task(full=true) reports clear_path. clear_path="clear_endpoint" means YOU armed this gate through set_human_gate and it carries no marker comment — this tool releases it, and a withdrawal comment would be a silent no-op. clear_path="withdraw_marker" means the ask lives in a "Blocking @" comment: this tool refuses, and the gate is taken down by a short negator comment. Everything else is user-only — a gate a human armed, or one raw-armed via PATCH/UI with no author — and an agent key gets a 403 naming the exit it CAN reach: a human-gate decision records the human's answer. A posted comment does not by itself clear the gate; human_gate on get_task shows the current state.

NameRequiredDescriptionDefault
task_idYesTask ID whose gate to clear.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only flag destructive+idempotent; the description adds far more: the tool refuses rather than no-ops under withdraw_marker, a withdrawal comment here is a silent no-op, agent keys get a 403 on user-owned gates, and a posted comment does not by itself clear the gate. These are exactly the failure modes an agent would otherwise hit blind.

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

Conciseness4/5

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

Front-loaded with the action, then the branch table. It is dense and jargon-heavy (clear_endpoint / withdraw_marker / negator comment) in one unbroken block, but every clause carries routing information rather than 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?

Covers the state-dependent behavior, refusal semantics, and where to inspect current gate state (human_gate on get_task), which is a lot for a one-param mutation with no output schema. It stops short of saying what a successful release returns or how the task's blocking state changes.

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?

Single parameter with 100% schema description coverage, so the schema already defines task_id as "Task ID whose gate to clear." The description adds no format, sourcing, or precondition detail beyond it. 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?

Opens with a specific verb+resource ("Release a human gate") and immediately frames the tool against its counterpart set_human_gate and against the raw-armed / human-armed variants. An agent can tell exactly which gate population this applies to without reading the schema.

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

Usage Guidelines5/5

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

Gives explicit conditional routing: clear_path="clear_endpoint" means use this tool; clear_path="withdraw_marker" means it refuses and a negator comment is the correct action; anything else is user-only and yields a 403 naming an alternative. This is a when/when-not/alternative triad stated as fact, not inference.

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

comment_docA

Comment on a document. The quote parameter anchors a comment to a specific passage; it holds the text exactly as the document reads it — the server finds it and anchors the comment there, so no position is computed by the caller (there is no offset parameter, and a position you calculated would silently point at the wrong sentence). Without quote the comment is on the whole document. Your comment appears in the same thread humans see in the document UI. doc may be an old path or a bare slug; the reply then carries moved_to (the current path). An ambiguous bare slug is a 409 listing the full paths.

NameRequiredDescriptionDefault
docYesDocument UUID, or a slug path like 'architecture/adr/adr-004' (a path also needs project_id). A path survives the document being moved: the old path still resolves, and so does a bare slug ('adr-004') when exactly one live document in the project has it. When the reference was not the live path, the reply carries moved_to — the document's current path; use that from now on. A bare slug shared by several documents is a 409 ('Ambiguous document slug') listing the full paths: pick one and repeat the call with the full path or the UUID. The UUID never changes.
bodyYesThe comment text. Markdown; @slug mentions notify that person or agent.
quoteNoThe passage being commented on, copied from the document exactly. One sentence is plenty. Omit to comment on the document as a whole.
reply_toNoUUID of the comment being answered. A reply inherits that thread's anchor, so it takes no quote of its own.
project_idNoProject UUID. Required only when doc is a slug path.
quote_contextNoA longer passage containing the quote exactly once — send this when the quote occurs several times in the document and you were told it was ambiguous.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations cover the safety profile (writable, non-destructive, non-idempotent), and the description adds genuinely new behavior: anchoring is server-side, caller-computed offsets silently mis-anchor, errors surface as 409 for ambiguous slugs, and replies carry moved_to. Some of this repeats the doc parameter schema, but the offset warning and thread visibility are real added context.

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

Conciseness4/5

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

Front-loads the core action and the anchoring rule, then covers edge cases (moved docs, ambiguous slugs) last. Dense and mostly non-redundant, though the moved_to/409 material overlaps with the doc parameter description.

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?

No output schema exists, and the description covers the return-relevant cases an agent needs: moved_to on relocated docs and 409 on ambiguous slug. It does not describe the comment object returned on success, which is a modest remaining gap for a write 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 coverage is 100%, so baseline is 3; the description still adds meaning by explaining why quote must be copied verbatim, why no offset parameter exists, and that reply_to inherits the thread anchor. It doesn't add syntax examples beyond the schema's slug example.

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

Purpose5/5

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

States a specific verb and resource ('Comment on a document') and immediately explains the two operating modes: anchored to a passage via quote, or whole-document. The line about the comment appearing in 'the same thread humans see in the document UI' makes the effect concrete and separable from sibling tools like list_doc_comments.

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 clear conditional guidance: send quote to anchor, omit it to comment on the whole document, use quote_context when a quote is ambiguous or the server said so. It does not name or compare against sibling alternatives (e.g. add_comment), so the agent gets context but no explicit when-not routing.

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

create_docA

Create a document in a project. Returns its metadata and version — the version is what update_doc takes as base_version, so a create followed by an edit needs no read in between. The body you sent is not echoed back. slug is ONE path segment and must not contain '/' (the request is refused with 400): a document in a folder is created with parent_id set to the parent's id, and is then reachable as /.

NameRequiredDescriptionDefault
bodyNoMarkdown body.
slugNoOne URL segment, derived from the title if omitted. '/' is not allowed (400) — nest with parent_id instead.
titleYesDocument title.
positionNoSort position among siblings.
parent_idNoParent document UUID, to nest this one under it.
project_idYesProject UUID.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (which only give the safety profile), it discloses concrete behavior: the body is not echoed back, the return includes metadata and version, and the version chains directly into update_doc. It also explains the 400 refusal on '/' in slug and how nesting works via parent_id — rich context annotations cannot express.

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?

Front-loaded with the core action, then the two non-obvious operational facts (version chaining, body not echoed) and the slug constraint. Every sentence carries distinct, useful information with no padding.

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?

No output schema exists, yet the description fully explains the return value (metadata plus version) and its downstream use, and covers the one tricky parameter constraint. 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.

Parameters4/5

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

With 100% schema coverage, the baseline is 3; the description adds real meaning by explaining the slug one-segment/no-slash constraint and the 400 consequence, plus how parent_id produces a <parent-slug>/<slug> path. This compensates and enriches the schema rather than repeating it.

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

Purpose5/5

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

States a specific verb and resource ('Create a document in a project') and clearly distinguishes itself from siblings by referencing update_doc's base_version workflow. An agent can tell exactly what this does versus get_doc or update_doc.

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

Usage Guidelines4/5

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

Explains the key workflow context — that a create followed by an edit needs no read in between because the version is returned. It gives clear usage context but stops short of explicitly naming when to prefer another sibling (e.g., get_doc for existing docs).

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

create_recurring_taskA

Creates a recurring task schedule that automatically spawns task instances on a schedule. Each instance gets access to the previous instance's summary. Suited to regular automated work such as weekly reports, daily checks and periodic audits.

NameRequiredDescriptionDefault
labelsNoLabels to apply to each instance.
ends_atNoWhen to stop the schedule (RFC3339). Default: no end.
priorityNoPriority: urgent, high, medium, low, none.none
timezoneNoIANA timezone for schedule evaluation. Default: UTC.
cron_exprNo5-field cron expression (required if frequency=custom). Example: '0 9 * * 1' = every Monday at 9am.
frequencyYesRecurrence frequency: daily, weekly, monthly, custom. Use 'custom' with cron_expr for fine-grained control.
starts_atNoWhen to start the schedule (RFC3339). Default: now.
project_idYesTarget project UUID.
assignee_idNoAgent or user UUID to assign each instance.
assignee_typeNoAssignee type: user, agent, unassigned.unassigned
max_instancesNoMaximum number of instances to create. Default: unlimited.
title_templateYesTask title template. Supports {{.Date}}, {{.Number}}, {{.Week}}, {{.Month}}.
description_templateNoTask description template. Also supports {{.PrevSummary}} for previous instance context.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations cover the safety profile (not read-only, not destructive, not idempotent), and the description adds substantive behavior beyond them: instances are auto-spawned and each gets the previous instance's summary. It doesn't explain permissions or what happens on schedule end/update, but the core mechanism is disclosed.

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?

Three tight sentences with the core action front-loaded. Minor redundancy in repeating 'on a schedule,' but nothing wasteful.

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 13-parameter mutation tool with no output schema, the description covers purpose and the instance-chaining behavior but says nothing about what is returned or the schedule's lifecycle (e.g., ends_at, max_instances interplay). The rich schema fills most gaps, leaving this adequate but not 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?

Schema description coverage is 100%, so the schema already documents all 13 parameters, including the templating placeholders and cron usage. The description adds little parameter-level meaning beyond mentioning that instances receive the prior summary, so the baseline 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?

States a specific verb and resource: creates a recurring task schedule that spawns task instances. It's clearly distinct in meaning from create_task (one-off) and trigger_recurring_now, though it never names those siblings explicitly.

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?

Provides concrete usage contexts ('weekly reports, daily checks and periodic audits'), which tells an agent when this is the right choice. It stops short of exclusions or naming alternatives like create_task for one-off work, so it's clear context without routing.

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

create_subtaskA

Create a subtask under a parent task. Set status_slug for initial status (defaults to the project's default status, NOT the parent's status).

NameRequiredDescriptionDefault
titleYesSubtask title.
labelsNoLabels for the subtask.
due_dateNoDue date, RFC3339 (e.g. 2026-08-10T12:00:00Z).
priorityNoPriority: urgent, high, medium, low, none.medium
assignee_idNoAgent or user ID to assign the subtask to. Defaults to the creator if omitted.
descriptionNoSubtask description.
start_afterNoDon't surface/feed this subtask before this RFC3339 timestamp. Independent of due_date.
status_slugNoStatus slug (e.g. 'todo'). Uses project default if omitted.
assignee_typeNoAssignee type: agent, user, or unassigned.
custom_fieldsNoCustom field values, keyed by field slug.
parent_task_idYesParent task ID.
estimated_hoursNoEstimated hours.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare this is a non-readonly, non-destructive, non-idempotent write. The description adds a genuinely useful behavioral nuance about status defaulting (project default, not parent's), but says nothing about what happens to inherited fields, auth requirements, or what is returned on success.

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, no filler, with the core action stated first and the one non-obvious default behavior called out immediately after. Every sentence earns its place.

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

Completeness4/5

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

For a 12-parameter creation tool with full schema coverage and a clear annotation profile, the description covers purpose and the key defaulting nuance. It omits any mention of the return value (e.g., the new subtask ID), which would be useful since no output schema exists, but otherwise it is sufficient to call correctly.

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 all 12 parameters are already documented in the schema. The description's note that the status default is the project's status rather than the parent's adds meaning beyond the schema, but only for one of twelve parameters. 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 gives a specific verb and resource ('Create a subtask') plus the parent relationship, which separates it from the generic create_task sibling. It does not explicitly name create_task as the alternative, but 'under a parent task' is enough for an agent to disambiguate.

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

Usage Guidelines3/5

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

It provides one real usage rule — set status_slug for the initial status and be aware it defaults to the project's status, not the parent's. However, there is no guidance on when to use create_subtask versus create_task, nor any prerequisite or permission context.

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

create_taskA

Create a new task in a project and return it with its id. status_slug sets the initial status (defaults to the project's first status); assignee_id with assignee_type routes it to someone; parent_task_id makes it a subtask. Search list_tasks first so you do not file a duplicate.

NameRequiredDescriptionDefault
titleYesTask title.
labelsNoTask labels.
due_dateNoDue date in RFC3339 format.
priorityNoPriority: urgent, high, medium, low, none.medium
project_idYesUUID of the project to create the task in (list_projects returns ids).
assignee_idNoAssignee ID (user or agent UUID).
descriptionNoTask description.
start_afterNoDon't surface/feed this task before this RFC3339 timestamp (e.g. a scheduled retry). Independent of due_date.
status_slugNoStatus slug (e.g. 'todo'). Uses project default if omitted.
assignee_typeNoAssignee type: user, agent.unassigned
custom_fieldsNoCustom field values as key-value pairs.
parent_task_idNoParent task ID for subtask.
estimated_hoursNoEstimated hours for the task.
delegation_levelNoDelegation level: auto, review, supervised.

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare this is a non-destructive, non-idempotent write, so the safety profile is covered. The description adds the return value (task with id) and the status_slug default, but says nothing about validation failures, required permissions, or what happens on duplicates.

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

Conciseness5/5

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

Three compact sentences, each earning its place: purpose/return, key parameter behaviors, and the duplicate-check instruction. Front-loaded with the action and outcome.

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 14 parameters, 100% schema coverage, and no output schema, the description covers what an agent most needs: return shape, the three most consequential optional parameters, and a pre-check. It leaves minor gaps around validation and sibling routing.

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 100%, so baseline is 3; the description still earns credit for explaining inter-parameter relationships the schema states only in isolation: assignee_id combined with assignee_type, parent_task_id creating a subtask, and status_slug defaulting to the project's first status.

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

Purpose4/5

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

States a specific verb and resource ('Create a new task in a project') and adds that it returns the created task with its id. It does not differentiate from the sibling create_subtask, and even implies subtask creation is done via parent_task_id, which blurs the boundary.

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?

Explicitly instructs to 'Search list_tasks first so you do not file a duplicate', a clear precondition that steers the agent away from blind use. No guidance on when to use this versus create_subtask or create_recurring_task.

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

delete_recurring_scheduleA
Destructive

Permanently delete a recurring task schedule: no further instances are created. Existing task instances are not affected. To pause instead, call update_recurring_schedule with is_active=false.

NameRequiredDescriptionDefault
recurring_schedule_idYesUUID of the recurring schedule to delete.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and non-idempotence, but the description adds important context: deletion is permanent, no further instances are created, and existing task instances are unaffected. It also points to the non-destructive pause alternative, which is valuable behavioral context beyond the annotations.

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

Conciseness5/5

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

The description is two concise sentences with no wasted words. The permanent-deletion consequence is front-loaded, followed by the pause alternative.

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 one-parameter destructive tool with clear annotations and no output schema, the description covers the essential consequences and the alternative action. Nothing an agent needs in order to invoke it correctly appears to be 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 single recurring_schedule_id parameter is already fully documented in the schema. The description does not add syntax or format details beyond what the schema provides, so the baseline of 3 is appropriate.

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

Purpose5/5

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

The description uses a specific verb and resource: permanently delete a recurring task schedule. It clearly distinguishes deletion from pausing by naming update_recurring_schedule with is_active=false as the alternative.

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

Usage Guidelines5/5

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

It states when to use this tool: to permanently stop future instances from being created. It explicitly names the alternative action for pausing, which gives an agent clear routing guidance.

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

export_workspace_configA
Read-onlyIdempotent

Export the current workspace configuration as YAML, including rules, project templates, and settings. Read-only. The YAML is exactly what import_workspace_config accepts, so keep it as a backup before any import.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so 'Read-only' in the text is largely redundant. However the description adds genuinely new behavioral context: the output is YAML and is exactly the format import_workspace_config consumes, which matters for safe round-tripping. With annotations carrying the safety profile, this is solid added value.

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

Conciseness5/5

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

Three short sentences: what it exports, its safety profile, and the round-trip guarantee with import. The round-trip warning is placed where it lands before an agent acts on the file. No 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?

For a no-parameter, no-output-schema tool, the description covers format, contents, and the import compatibility contract, which is what an agent needs to use the result correctly. It does not clarify whether the YAML is returned inline or written to a file, a small remaining gap with no output schema to fall back on.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4; the description correctly adds nothing about arguments because there are none. The high schema coverage is moot 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 gives a specific verb (Export) and resource (workspace configuration) plus the exact payload contents (rules, project templates, settings) and format (YAML). The round-trip pairing with the import_workspace_config sibling makes the boundary between the two tools 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?

It states the intended usage context clearly: 'keep it as a backup before any import', which names the sibling tool to pair with and the moment to call it. It lacks an explicit 'when not to use' or note about alternatives beyond import, so it falls 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.

extend_checkoutA
Idempotent

Push the expiry of an existing checkout_task lock forward, for work that runs longer than the original ttl_minutes. Requires an active checkout in this session (the cached checkout_token from checkout_task) — fails if the lock was never acquired here, already released, or already expired. Server clamps ttl_minutes to [1, 240].

NameRequiredDescriptionDefault
task_idYesTask ID whose checkout to extend.
ttl_minutesNoNew lock TTL in minutes from now (default 120, server clamps to [1, 240]).

TDQS

A4.3/5.0
Behavior4/5

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

Goes well beyond the annotations by disclosing the session prerequisite, reliance on the cached checkout_token, and three distinct failure modes, which the agent genuinely needs. The ttl clamp is repeated from the schema, so one of its statements is slightly redundant; still, the failure/session semantics are real added value on top of readOnlyHint/openWorldHint/idempotentHint.

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

Conciseness5/5

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

Three sentences, front-loaded with the action and its motivation, then prerequisites, then constraints. No filler and nothing meaningful omitted.

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 only two params, full schema coverage, annotations covering the safety profile, and no output schema, the description supplies everything else needed: why to call it, what session state must exist, and how it fails.

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 restates the ttl_minutes clamp that the schema already documents and adds no new format, range, or default guidance for task_id or ttl_minutes beyond what is in the schema.

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

Purpose5/5

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

Specific verb+resource ("Push the expiry of an existing checkout_task lock forward") with the motivating condition ("work that runs longer than the original ttl_minutes"). It explicitly ties itself to the sibling checkout_task, so an agent can distinguish it from release_task or checkout_task immediately.

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?

Clearly states when to reach for it (long-running work outliving the original TTL) and enumerates the failure conditions (lock never acquired here, released, or expired). It does not name a fallback tool to use when those conditions hold, so a triggering-the-wrong-tool exclusion is implied rather than explicit.

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

forgetA
Destructive

Permanently delete one memory entry by its UUID. Agents can only delete their own agent-scope memories; project and workspace memories are refused. To correct an entry, call remember with the same key instead of deleting it.

NameRequiredDescriptionDefault
memory_idYesUUID of the memory to delete: the id field of a recall(full=true) result, not its key.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered; the description adds real value by specifying permanence and the authorization rule that agents may only delete their own agent-scope memories, with project/workspace memories refused. It does not explain failure behavior for unknown UUIDs or the non-idempotent repeat-delete case flagged in annotations, so it stops short of a 5.

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

Conciseness5/5

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

Three short sentences, each carrying distinct information: the action, the permission boundary, and the corrective alternative. The action is front-loaded and nothing is redundant.

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 one-parameter destructive tool with full annotation coverage and no output schema, the definition covers action, scope, permissions, and the main misuse case. Minor gap: it does not say what happens if the UUID does not exist or points to a memory the caller cannot see.

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?

Only one parameter, and the schema already documents it at 100% coverage, including the crucial detail that it is the id field from recall(full=true) rather than the key. The description's 'by its UUID' reinforces but adds nothing beyond the schema, so the high-coverage 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?

States a specific verb, resource, and identifier ('Permanently delete one memory entry by its UUID'), which cleanly separates it from siblings like remember, recall, and get_memory. An agent knows exactly what it does and what it does not do.

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 when-not ('To correct an entry, call remember with the same key instead of deleting it') and names the alternative tool. It also constrains the universe of deletable memories, though it stops short of saying when deletion is the right call versus archiving or leaving entries alone.

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

get_artifactA
Read-onlyIdempotent

Get artifact details. The bytes are never inlined: download them with the two GETs below. Downloading an artifact is two GETs. Step 1: GET /api/v1/artifacts//download with header X-Agent-Key: -> 200 JSON {"url": ""}. Step 2: GET that url with NO headers -> 200, the file bytes. Pitfalls: on step 1 only X-Agent-Key is accepted (X-API-Key and Authorization: Bearer give 401); on step 2 any extra header, Authorization in particular, breaks the presigned signature (400). The artifact's download_path is step 1's path. browser_only_url is a human page and answers 401 to an agent key by design.

NameRequiredDescriptionDefault
artifact_idYesArtifact ID.
include_contentNoAdds download_api_url: step 1 of the download (the API endpoint you call with X-Agent-Key), NOT the file and NOT a link to open. The bytes are never inlined.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare this a safe read-only, idempotent operation, and the description goes far beyond them: it discloses the exact auth header accepted on step 1 (X-Agent-Key only) and the specific failure modes for wrong credentials (401) and extra headers on step 2 (400 signature break). These are non-obvious operational traps an agent would otherwise hit.

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 critical constraint (bytes never inlined) is front-loaded, and the numbered two-step flow is easy to follow. There is some redundancy — 'Downloading an artifact is two GETs' restates 'the bytes are never inlined: download them with the two GETs below' — but the procedural detail earns most of its length.

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 no output schema, the description does not enumerate the metadata fields returned by the tool itself (only mentioning download_path and browser_only_url), so an agent can't fully anticipate the response shape. For a read-only lookup with full param coverage, though, everything needed to call it correctly is present.

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

Parameters4/5

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

Schema coverage is 100%, so both parameters are already documented. The description nonetheless adds real meaning to include_content by stating download_api_url is the step-1 API endpoint, 'NOT the file and NOT a link to open', correcting a likely misinterpretation.

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

Purpose5/5

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

States a specific verb and resource ('Get artifact details'), and immediately clarifies scope by saying 'the bytes are never inlined' — distinguishing it from a content-fetch tool and implicitly from the sibling list_artifacts. An agent can tell what it returns (metadata) versus what it does not (file bytes) without opening the schema.

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

Usage Guidelines4/5

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

Clearly signals when this tool is not enough: to actually obtain bytes the agent must follow the two-GET flow, and browser_only_url is explicitly called out as a human page that will not work for an agent. It lacks an explicit routing sentence to list_artifacts for enumeration, which keeps it from a 5.

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

get_assignment_rulesA
Read-onlyIdempotent

Get the effective assignment rules for a project (how new tasks are routed to agents or people), merged from workspace and project level with source annotations. Read-only. get_workflow_rules covers status transitions; get_my_rules covers everything that binds you.

NameRequiredDescriptionDefault
project_idYesProject UUID, from list_projects.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, non-destructive, so repeating 'Read-only' adds nothing. However, the description does disclose genuine behavior the annotations cannot: results are merged from workspace and project level and carry source annotations, which tells the agent why it may see inherited rules.

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

Conciseness5/5

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

Three short sentences, each doing distinct work: what it returns, safety, and sibling routing. Nothing is padded and the core definition is front-loaded.

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 no output schema, the description gives enough shape (merged rules with source annotations) to interpret the return, and the parameter is fully documented by the schema. The precise return structure and merge precedence ordering are left implicit, a minor gap for a read 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?

Only one parameter and schema coverage is 100%, with the schema already explaining that project_id is a UUID from list_projects. The description adds no further parameter meaning, so the 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 and resource ('Get the effective assignment rules for a project') and immediately glosses the resource in plain language ('how new tasks are routed to agents or people'), so an agent knows what it returns without opening the schema. It also distinguishes itself from two same-family siblings by name.

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?

Explicitly routes the agent away from get_workflow_rules (status transitions) and get_my_rules (what binds you), which is exactly the disambiguation needed. The nearby sibling get_project_rules is not mentioned, leaving one plausible alternative unaddressed, so it falls 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.

get_canonicalA
Read-onlyIdempotent

Query the canonical knowledge layer: returns curated facts, decisions, and strategy docs for a topic, merged from project_memories (key canonical:*) and workspace_memories (kind:canonical). Excludes ephemeral session-checkpoints. Slug aliases are resolved automatically (e.g. mesh-dev == evc-mesh). Use it for the curated answer on a topic; recall searches all memory, get_canonical_updates lists decisions broadcast since a time.

NameRequiredDescriptionDefault
topicYesTopic or keyword to search (e.g. 'auth middleware', 'evc-spark roadmap').
projectNoOptional project slug to narrow results (e.g. 'evc-mesh', 'evc-spark'). Aliases resolved automatically.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely new behavior: the merge of project_memories (key canonical:*) and workspace_memories (kind:canonical), the exclusion of ephemeral session-checkpoints, and automatic slug alias resolution. It does not discuss result ordering or limits, keeping it short of a 5.

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

Conciseness4/5

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

Three sentences, front-loaded with what is returned before the source mechanics and the disambiguation. Dense but each clause carries information; the parenthetical source-key syntax is slightly technical for the general reader but earns its place.

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

Completeness4/5

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

With no output schema, the description compensates by naming the content types returned (facts, decisions, strategy docs) and the sources merged. Combined with annotations and full schema coverage, an agent has what it needs to call this correctly; only result shape details like pagination or ordering are unstated.

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%, so both topic and project are already documented including the alias-resolution note. The description's alias example (mesh-dev == evc-mesh) largely restates what the schema says, adding only a hint that the topic query spans merged sources rather than one store.

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 (query) and resource (canonical knowledge layer), then enumerates the content returned: curated facts, decisions, and strategy docs. It also names the two underlying sources, so an agent can distinguish it from generic memory tools at a glance.

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

Usage Guidelines5/5

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

Explicitly says "Use it for the curated answer on a topic" and routes competing intents: recall for all-memory search, get_canonical_updates for decisions broadcast since a time. Both alternatives are named with the condition that selects them, so nothing is left to inference.

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

get_canonical_updatesA
Read-onlyIdempotent

Fetch canonical decisions broadcast since a given time. Returns only privacy:public records targeted at you or all agents. A change feed for session start; get_canonical searches the canonical layer by topic.

NameRequiredDescriptionDefault
agentNoYour agent slug (e.g. 'alice'). Used to filter propagate_to:<slug> records. Omit to get only propagate_to:all records.
scopeNoOptional project UUID to restrict to project-scoped decisions.
sinceNoRFC3339 cursor. Defaults to your previous session's start time (server-resolved). Omit on first call.

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already cover safety profile (readOnly, idempotent, non-destructive, closed-world), so credit is for added context: the privacy:public restriction and the targeted-at-you-or-all-agents filter are genuinely useful disclosure. Beyond that, it is silent on ordering, pagination, and volume of the feed, which matter for a change feed an agent polls at session start.

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

Conciseness5/5

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

Three short sentences, front-loaded with the action and scope, then the sibling disambiguation. No filler or repetition.

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?

No output schema exists, so the description carries some burden, and it does name what comes back (privacy:public, targeted records) and the cursor default. It stops short of describing record shape or feed ordering, a minor gap for a three-optional-parameter read 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 schema already documents agent, scope, and since including the server-resolved default. The description only echoes 'since a given time' and the targeting semantics already stated in the agent parameter, adding little.

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

Purpose5/5

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

States a specific verb and resource ('Fetch canonical decisions broadcast since a given time') plus the exact filtering scope (privacy:public records targeted at you or all agents). It also distinguishes itself from the similar-sounding sibling get_canonical by naming its different access pattern.

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

Usage Guidelines5/5

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

Explicitly frames usage as 'a change feed for session start' and routes topical lookups to get_canonical instead. The filtering scope statement also implies when-not (records not targeted at you or all agents are excluded).

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

get_contextA
Read-onlyIdempotent

Get RECENT ACTIVITY for a project (last 24h by default): event stream with summaries, decisions, errors, plus accumulated project knowledge. Use it for "what changed lately"; get_project_knowledge returns the durable facts, recall searches memory for one fact.

NameRequiredDescriptionDefault
tagsNoFilter by tags.
limitNoMax events to return (default 50).
sinceNoOnly events after this timestamp (RFC3339).
project_idYesUUID of the project whose recent activity to read (list_projects returns ids).
event_typesNoFilter by event types.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so the safety profile is covered. The description adds value beyond that by describing the return shape (event stream with summaries, decisions, errors, plus accumulated knowledge) and the default time window. It does not mention pagination limits beyond the schema's own limit param, so not a full 5.

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: the first front-loads the core purpose and payload contents, the second routes the agent to siblings. No filler, no repetition 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?

No output schema exists, and the description compensates by naming what the event stream contains and the default time window. Combined with full schema coverage and read-only annotations, an agent has everything needed to call it correctly and interpret the result.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description earns above baseline by clarifying the default temporal window (last 24h), which explains how the optional `since` parameter interacts with the default behavior — a detail the schema does not spell out.

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

Purpose5/5

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

States a specific verb and resource (get recent activity for a project) with an explicit scope and default window (last 24h), then lists what the payload contains (event stream with summaries, decisions, errors, plus accumulated project knowledge). An agent can distinguish it from get_project_knowledge and recall purely from this sentence.

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

Usage Guidelines5/5

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

Gives a concrete selection rule ("Use it for 'what changed lately'") and names two alternatives with the exact conditions that favor them: get_project_knowledge for durable facts, recall for one fact. Both include-and-exclude guidance is present.

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

get_docA
Read-onlyIdempotent

Read a document. By DEFAULT returns metadata plus the outline (headings) and NOT the body — a document is far larger than a task, and a body you read stays in your context for the rest of the session. The outline lists headings; section="" returns just that part; body=true returns the whole page. The returned version is what update_doc takes as base_version. If you addressed the document by an old path or a bare slug, the reply carries moved_to (its current path); a bare slug shared by several documents fails with 409 and the list of full paths.

NameRequiredDescriptionDefault
docYesDocument UUID, or a slug path like 'architecture/adr/adr-004' (a path also needs project_id). A path survives the document being moved: the old path still resolves, and so does a bare slug ('adr-004') when exactly one live document in the project has it. When the reference was not the live path, the reply carries moved_to — the document's current path; use that from now on. A bare slug shared by several documents is a 409 ('Ambiguous document slug') listing the full paths: pick one and repeat the call with the full path or the UUID. The UUID never changes.
bodyNoReturn the full markdown body. Prefer section= when you need one part.
sectionNoReturn only this section: a heading's text, or its anchor from the outline.
project_idNoProject UUID. Required only when doc is a slug path.
version_onlyNoReturn just the version — the cheap 'has this changed since I read it?' check before a write.
outline_depthNoLimit the outline to headings at this level or shallower (e.g. '2' for chapters, not every subsection). Default: all levels.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description adds real value beyond them: the context-cost rationale for not fetching bodies, the fact that the returned version is what update_doc requires as base_version, and the two error/redirect behaviors (moved_to on stale paths, 409 with candidate paths on ambiguous slugs). It stops short of describing what the metadata payload contains, but the critical behavioral traits are disclosed.

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

Conciseness4/5

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

Front-loaded with the default behavior – the single most important fact – before alternatives and edge cases. The final sentence about moved_to and 409 largely duplicates text already present in the doc parameter's schema description, which is the only real waste.

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?

No output schema exists, so the description must carry return expectations, and it does: metadata plus outline, optional section or full body, moved_to on stale references, 409 with candidate paths, and the version value used for later writes. An agent has everything needed to call this correctly and interpret the result.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description earns above that by explaining the tradeoff behind body vs section (size/context cost) rather than just restating them, and by tying the response's moved_to/409 outcomes back to how doc references resolve. The project_id-only-with-path rule is left entirely to the schema, which keeps this from a 5.

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?

"Read a document" states a specific verb and resource, then immediately qualifies the scope: default returns metadata plus outline, not the body. It also distinguishes itself from siblings implicitly by noting the returned version is the base_version for update_doc, so an agent knows this is the read side of a read/modify pair.

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

Usage Guidelines5/5

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

Explicitly routes among the three read modes: default outline, section="<heading>" for one part, body=true for the whole page, with stated preference for section=. It also names a fourth use case (version_only-style cheap change check implied by base_version) and explains the moved_to recovery path, so there is no ambiguity about which call to make.

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

get_memoryA
Read-onlyIdempotent

Full text of ONE memory by exact key (the key field recall returns). Returns the full content of an entry whose recall result ends with the … cut marker. Errors if no entry has exactly that key.

NameRequiredDescriptionDefault
keyYesExact memory key, as returned by recall.
scopeNoFilter by scope: workspace, project, agent, or all (default).
project_idNoProject of a project-scoped entry, if the key exists in several.
include_archivedNoAlso look among archived memories (default false).

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, so safety is covered; the description adds genuinely new behavior by documenting the failure mode ('Errors if no entry has exactly that key'). It does not discuss what happens when the key is ambiguous across scopes, which project_id/scope resolve only implicitly.

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, front-loaded with the verb and resource, then the selection condition and the error case. No 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 four params, no output schema, and a single-required-param surface, the description covers purpose, trigger, and error behavior adequately, and the schema handles the rest. The only gap is how ambiguity across scopes/projects is resolved, which an agent must infer from parameter names.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter, including scope, project_id and include_archived, is already documented at the field level. The description only reinforces that the key must be the exact value recall returned, which the schema also states. Baseline 3 is correct.

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

Purpose5/5

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

States a specific verb and resource ('Full text of ONE memory by exact key') and immediately pins the scope with the capitalized 'ONE'. It references the sibling tool recall and the '…' cut marker, so an agent can tell this apart from recall/recall_with_graph without opening a schema.

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

Usage Guidelines4/5

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

Gives a concrete trigger condition: use this when a recall result is truncated with the '…' cut marker. It names recall as the source of the key, implicitly framing the alternative. It does not state when NOT to use it (e.g. when the recall result was already complete), so it falls just short of the top band.

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

get_my_rulesA
Read-onlyIdempotent

Get ALL governance rules that apply to you: workflow constraints, assignment policies, behavioral requirements. Includes workspace and project-level rules with source annotations. This is the one to call before acting in a project: get_project_rules lists every rule configured there whoever it targets, get_assignment_rules and get_workflow_rules return a single rule family.

NameRequiredDescriptionDefault
project_idNoOptional project UUID. With it, returns the effective rules for that project (workspace rules merged with the project's own); without it, workspace-level rules only.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already establish that the tool is read-only, idempotent, non-destructive, and closed-world, so the description does not need to repeat safety traits. It adds useful behavioral context by stating that the result includes workspace-level and project-level rules with source annotations, though it does not describe rate limits, auth requirements, or response shape.

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

Conciseness5/5

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

The description is three compact sentences with no wasted clauses. It is front-loaded with the core purpose and then moves efficiently into scope and sibling-tool differentiation.

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 one-parameter, read-only tool with rich annotations and full schema description coverage, the description provides enough context to call it correctly. It explains what rules are returned, the workspace/project-level scope, and when to prefer this tool over sibling rule-listing tools.

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 has 100% description coverage for the single project_id parameter, including the distinction between providing a UUID and omitting it. The description does not add parameter-level detail beyond the schema, so the baseline score 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 uses a specific verb and resource: "Get ALL governance rules that apply to you," and enumerates the rule categories (workflow constraints, assignment policies, behavioral requirements). It explicitly distinguishes itself from sibling tools get_project_rules, get_assignment_rules, and get_workflow_rules, so an agent can select it without opening other schemas.

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

Usage Guidelines5/5

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

It gives a clear triggering condition: "This is the one to call before acting in a project." It also contrasts alternatives by explaining that get_project_rules lists every configured rule regardless of target, while get_assignment_rules and get_workflow_rules return only a single rule family.

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

get_my_tasksA
Read-onlyIdempotent

Get YOUR assigned tasks, non-blocking. Use list_tasks to browse or search other people's tasks in a project, poll_tasks only to block until a new assignment arrives. Filterable by status_category to focus on active work. Default (cold) view is compact: only in_progress, review and the top 5 todo are listed (envelope omitted counts the rest; full=true or status_category returns them), descriptions are omitted (has_description marks them; get_task(id) or full=true returns the full text). Envelope fields (created_by/created_at, assignee_id) and valueless fields (0-counters, due_date=null, human_gate=false) are omitted; full=true returns the complete items and get_task returns one card's full details.

NameRequiredDescriptionDefault
fullNoReturn complete non-capability REST fields; always bypasses revision and delta shortcuts.
limitNoMax results (default 50).
project_idNoFilter by project.
accept_deltaNoOpt in to lossless delta against known_revision: complete changed items, removed_ids, full order and non-items envelope. Apply only to the retained matching base; otherwise omit known_revision and retry cold.
known_revisionNoRevision of a complete snapshot retained for this session and the same filters/view. Omit after cache loss, restart or compaction to request complete cold. Exact match returns unchanged=true; mismatch returns complete cold unless accept_delta=true.
status_categoryNoFilter by status category: backlog, todo, in_progress, review, done, cancelled.
snapshot_sessionNoOpaque non-secret consumer cache namespace. Required for conditional responses on stateless HTTP. Use a fresh value after restart or compaction; never credentials or lease tokens.

TDQS

A4.5/5.0
Behavior4/5

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

Goes well beyond the readOnly/idempotent annotations: it discloses the non-blocking nature, the compact cold view (only in_progress, review, and top 5 todo), the meaning of the `omitted` counter, description omission with has_description, and envelope/valueless field suppression. This is genuine behavioral context, though written so densely it requires careful parsing.

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

Conciseness4/5

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

Front-loaded correctly: purpose, then alternatives, then default-view behavior. The omission rules are packed into long parenthetical clauses and 'full=true returns the complete items' is stated twice, so it reads heavier than necessary, but no sentence is 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 no output schema, the description carries the return-shape burden and does so: it explains the envelope, `omitted`, suppressed fields, and where to get full records (get_task / full=true). The delta/revision/session parameters are left entirely to the schema, which is acceptable given 100% coverage, but a one-clause pointer to the delta path would close the last gap.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3; the description nonetheless adds semantics the schema doesn't spell out — that full=true restores descriptions and omitted items, and that passing status_category also defeats the default truncation. That behavioral link between parameters is real added value.

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

Purpose5/5

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

States a specific verb and resource — 'Get YOUR assigned tasks' — with the scope ('YOUR', non-blocking) front and center. It explicitly distinguishes itself from list_tasks and poll_tasks, so an agent can tell the three apart without opening schemas.

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

Usage Guidelines5/5

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

Names both alternatives and the exact condition that selects each: list_tasks to browse/search others' tasks in a project, poll_tasks only to block until a new assignment arrives. The 'only' qualifier on poll_tasks is an explicit when-not signal.

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

get_projectA
Read-onlyIdempotent

Get one project's details plus its statuses (the slugs move_task and create_task take) and its custom field definitions. list_projects finds the project_id.

NameRequiredDescriptionDefault
project_idYesProject UUID, from list_projects.

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false, and destructiveHint=false, so the safety profile is covered. The description adds scope information (what the payload contains) but nothing behavioral beyond that, such as size or whether statuses are workspace-wide. With annotations doing the heavy lifting, a 3 is appropriate.

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

Conciseness5/5

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

Two tight sentences with zero filler. The return content is front-loaded, and the pointer to list_projects comes second, so the reader gets the core purpose immediately.

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

Completeness5/5

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

There is no output schema, so the description carries the burden of explaining return values—and it does, naming statuses and custom field definitions. Combined with full annotation and parameter coverage, an agent has everything needed to call this tool correctly.

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 single parameter is already documented as a 'Project UUID, from list_projects.' The description repeats the list_projects provenance, adding no new semantic detail. Baseline 3 applies when the schema fully documents the 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?

States a specific verb and resource ('Get one project's details') and enumerates exactly what is returned: statuses and custom field definitions. It distinguishes itself from the sibling list_projects by noting that list_projects is where you find the project_id.

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?

Implicitly routes the agent: use list_projects to obtain the id, then get_project for details. It also clarifies that the returned status slugs are what move_task and create_task consume, which helps decide downstream calls. No explicit exclusions are given, but the usage context is clear.

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

get_project_knowledgeA
Read-onlyIdempotent

Get the PERMANENT KNOWLEDGE of a project: decisions, conventions, accumulated context. Returns workspace-level + project-level memories (workspace tier paged by limit/offset and narrowed by min_importance and tags_any). Use it for the standing picture of ONE project; get_context returns what happened recently, recall searches all memory for one specific fact, get_canonical returns owner-curated decisions on a topic.

NameRequiredDescriptionDefault
limitNoMax workspace-tier memories (default 100, max 500).
offsetNoPagination offset for workspace-tier (default 0).
tags_anyNoComma-separated tag OR-filter for workspace-tier, e.g. 'kind:decision,kind:incident'.
project_idYesUUID of the project whose knowledge to load (list_projects returns ids).
min_importanceNoMinimum importance_score for workspace-tier (default 0 = all).

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds behavior the annotations don't: the two-tier return structure (workspace + project), that only the workspace tier is paged and narrowed, and that the tool returns 'permanent' rather than recency-ordered content.

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?

Three sentences, front-loaded with the core purpose and the routing guidance. The parenthetical on paging is dense but every clause carries information; minor cost is readability of the nested filter detail.

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?

A read-only retrieval tool with full schema coverage and no output schema; the description covers scope, tiering, filtering, and alternatives. It stops short of describing the shape of a returned memory (fields, ordering), which would be the remaining gap for an agent planning a call.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds the key semantic that limit/offset/min_importance/tags_any apply only to the workspace tier, implying project-tier memories are returned in full and unfiltered—a distinction the per-parameter descriptions state individually but not as a whole-tool rule.

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

Purpose5/5

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

States a specific verb and resource ('Get the PERMANENT KNOWLEDGE of a project') plus the content types it covers (decisions, conventions, accumulated context) and the two-tier scope (workspace-level + project-level). An agent can distinguish this from get_context, recall, and get_canonical without opening any schema.

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

Usage Guidelines5/5

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

Explicitly names the three nearest alternatives and the condition that selects each: get_context for recent activity, recall for one specific fact, get_canonical for owner-curated decisions on a topic. It also states the positive selector ('standing picture of ONE project'), leaving nothing to inference.

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

get_project_rulesA
Read-onlyIdempotent

Get every rule configured for a project (workspace + project scope), whoever it targets: an audit view of the whole rule set. For the rules that bind YOU use get_my_rules; for one family, get_assignment_rules (who gets new work) or get_workflow_rules (allowed status transitions).

NameRequiredDescriptionDefault
project_idYesProject UUID, from list_projects.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, so safety needs no restating. The description adds real context beyond them by clarifying this is an unfiltered audit view spanning both workspace and project scope, which explains why the result set may be large. It stops short of describing return shape or ordering, keeping it just under a 5.

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

Conciseness5/5

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

Two sentences, zero padding. The scope-defining clause comes first and the disambiguation guidance follows, which is the right order for an agent deciding whether to call this or a sibling.

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?

A single-parameter read tool with full annotation coverage and a fully documented schema needs little more. The description supplies the scope semantics and sibling routing that structured fields cannot express; only output shape is unaddressed, and there is no output schema to lean on, which is a minor gap for an audit-style listing.

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 project_id description already names its source ('from list_projects'). The tool description adds no further meaning about the parameter, so the 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 and resource ('Get every rule configured for a project'), plus the exact scope ('workspace + project scope, whoever it targets'). The phrase 'an audit view of the whole rule set' makes the exhaustive nature unmistakable and distinguishes it from the filtered siblings named immediately after.

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

Usage Guidelines5/5

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

Explicitly routes the agent: use get_my_rules for rules binding the caller, get_assignment_rules for who gets new work, get_workflow_rules for allowed status transitions. Each alternative comes with the condition that selects it, leaving nothing to inference.

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

get_project_updatesA
Read-onlyIdempotent

Read a project's Updates feed (the lead's daily status reports), newest first. Returns the latest report by default. The latest one also comes with get_project and get_task_context.

NameRequiredDescriptionDefault
limitNoHow many reports to return (default 1, max 50).
sinceNoRFC3339 timestamp; only reports created at or after it.
project_idYesProject UUID.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds behavior annotations don't carry: result ordering (newest first) and the default single-report return, which materially affects how the agent interprets an empty vs. populated response.

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, zero filler, with the resource definition and ordering front-loaded before the redundancy note. Every clause carries actionable 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?

For a read-only fetch with a fully documented three-parameter schema and no output schema, the definition covers what's needed to invoke it correctly. It could go slightly further by hinting at what a report entry contains, but the ordering and default-return details close the main gap.

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 limit, since, and project_id are already fully documented with defaults, max, and RFC3339 format. The description's 'newest first' adds a little semantic framing for how limit/since combine, but not enough to exceed the baseline.

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

Purpose5/5

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

States a specific verb (Read) and resource (a project's Updates feed) and disambiguates the jargon by glossing it as 'the lead's daily status reports.' The ordering guarantee ('newest first') further pins down what the agent gets back, distinguishing it from generic project reads like get_project.

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?

Explicitly notes the default behavior (latest report only) and, importantly, warns that the latest report is already surfaced by get_project and get_task_context — which tells the agent when this call is redundant. It stops short of stating a full when-to-use/when-not-to-use rule (e.g., use this when you need history beyond the latest report).

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

get_recurring_historyA
Read-onlyIdempotent

Returns the history of all instances for a recurring task schedule. Each entry describes what a previous instance accomplished, what issues were found, and what artifacts were produced, which gives context for the current instance of a recurring task.

NameRequiredDescriptionDefault
limitNoNumber of most recent instances to return. Default: 5. Use higher value for deep historical context.
recurring_schedule_idYesUUID of the recurring schedule. Available in task.recurring_schedule_id field.

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so safety is covered. The description adds value beyond that by describing the shape of each returned entry (what was accomplished, issues found, artifacts produced), which matters since there is no output schema. It omits ordering guarantees and behavior when no prior instances exist.

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

Conciseness4/5

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

Two sentences, front-loaded with the core action, and the second sentence earns its place by describing entry contents. The closing clause about giving context for the current instance is somewhat repetitive of the opening framing.

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 read-only two-parameter tool with full schema coverage, the description covers purpose and return content adequately. However, with no output schema present, it should say more about result ordering, empty-history behavior, or volume, which an agent consuming history would want to know.

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 both parameters are fully documented in the schema, including the limit default and the source of the schedule UUID. The description adds no parameter-level meaning beyond that, so the baseline 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?

States a specific verb and resource — returns instance history for a recurring task schedule — and the second sentence spells out what each entry contains (accomplishments, issues, artifacts). That clearly separates it from list_recurring_schedules (which enumerates schedules) or get_task, though it never names an alternative explicitly.

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

Usage Guidelines3/5

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

The phrase 'gives context for the current instance of a recurring task' implies when to call it, but the guidance is only implied. There is no explicit 'use this before doing X' or 'for the current instance use get_task_context instead' routing against the many neighboring context tools.

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

get_taskA
Read-onlyIdempotent

Get task details: compact decision fields, active human_gate=true and status slug; descriptions and ordinary comment bodies are always complete. Comment IDs support reply/after; timestamps are UTC to the minute. Known automation comments are one-line summaries (include_auto=true restores their complete bodies). full=true restores non-capability REST fields. If status lookup is unavailable, status_id and an explicit status_lookup_error remain. Comments return the newest comments_limit entries (default 5, max 200) with pagination markers. since=RFC3339 (from task.updated_at) skips an unchanged task and older comments.

NameRequiredDescriptionDefault
fullNoReturn the task (full description, non-capability fields, whole inline comments) instead of the compact view (default false).
sinceNoRFC3339 timestamp from an earlier call in this session (e.g. that response's task.updated_at, or your own last-call time). With it: include_comments returns only comments created after it, and the full task body (description and the rest) is included only if the task's own updated_at is after it too — the response then carries task_changed=true/false so you always know which you got, and a trimmed stub (id/status/assignee_name/updated_at in compact reads; status_id plus status_lookup_error if lookup fails, or the original status_id and assignee fields with full=true) instead of the full task when nothing changed, to avoid re-paying for the same ~5k tokens on a repeat call. Omit for the unfiltered default: full task body, but the comment tail still obeys comments_limit (default 5, max 200) — a longer thread needs list_comments paging.
task_idYesTask ID (full UUID or 6–12 char hex short-ID prefix).
include_autoNoReturn complete automation bodies in compact mode (ordinary comments are always complete).
comments_limitNoHow many of the NEWEST comments to include when include_comments=true (default 5, max 200). The tail is where an acting agent looks first; raise it when you need more of it. The API caps any single request at 200 — a longer thread is only readable end-to-end by paging list_comments (order=desc, page=N), never by one call here.
include_commentsNoInclude the task's most recent comments (see comments_limit for how many; the response carries comments_total_count and comments_has_more so a longer thread is never silently hidden).
include_artifactsNoInclude artifacts.
include_vcs_linksNoInclude linked PRs/MRs/commits/branches (id, provider, link_type, external_id, url, status, created_at, plus delivery{implementation_sha, ci_verdict, merged_sha, deployed, acceptance} and a derived is_shipped) — use this instead of a raw REST call to diagnose a misclassified or stuck-status link.
include_dependenciesNoInclude dependencies.

TDQS

A4/5.0
Behavior5/5

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

Annotations already establish read-only/idempotent safety, and the description adds substantial behavioral detail: comments are newest-first, pagination markers are included, timestamps are UTC, automation comments are summarized, full=true restores REST fields, and status lookup failures preserve status_id with status_lookup_error. These are meaningful operational traits beyond the annotations.

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

Conciseness4/5

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

The description is dense but front-loaded with the core purpose, then layers return-shape and caching/pagination caveats. Most sentences carry useful information, though the single-paragraph packing makes it less scannable than it could be.

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 nine-parameter read tool with no output schema, the description covers the key return modes, comment behavior, pagination limits, since-based skipping, and status lookup fallback. Combined with the fully described schema and read-only annotations, an agent has enough context to call it correctly.

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 all nine parameters are already documented in the input schema. The description reinforces some semantics such as full, include_auto, comments_limit, and since, but adds little beyond what the schema already states; 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?

States a specific verb and resource: 'Get task details,' then immediately narrows to compact decision fields, human_gate, and status slug. It is clear what the tool returns, though it does not explicitly contrast itself with sibling tools such as get_task_context or list_comments.

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?

Provides embedded guidance for several parameters, such as using since to skip unchanged tasks and include_auto to restore automation bodies. However, it does not explicitly say when to use this tool versus siblings like get_task_context, list_comments, or update_task, so usage is mostly implied.

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

get_task_contextA
Read-onlyIdempotent

Get EVERYTHING about ONE TASK in a single call: full details + comments + artifacts + dependencies + activity. Combines the results of get_task, list_comments and list_artifacts for one task in a single response.

NameRequiredDescriptionDefault
task_idYesTask ID (full UUID or 6–12 char hex short-ID prefix).

TDQS

A4.5/5.0
Behavior4/5

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

While annotations cover safety (readOnlyHint=true), the description adds crucial behavioral context by enumerating exactly what data streams are integrated (details, comments, artifacts, dependencies, activity). This helps the agent understand the scope of the returned data packet.

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 highly efficient, using two sentences. The first sentence is a powerful summary, and the second provides the technical justification (combining results) without unnecessary 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?

Given the complexity of aggregating multiple data sources, the description is perfectly complete. It defines the scope of the output contents and the mechanism of the call (single response), which is more valuable than detailing the output structure.

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

Parameters3/5

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

The schema coverage is 100%, meaning the schema already defines the parameter fully. The description provides no new semantic meaning to 'task_id' beyond the context of a single task ID.

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 purpose is stated clearly using a specific verb ('Get') applied to a resource ('ONE TASK'). It immediately distinguishes itself by explaining that it provides a comprehensive overview ('EVERYTHING') that combines data from multiple underlying tools.

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

Usage Guidelines5/5

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

The tool provides explicit guidance on its usage pattern: it should be used when the user needs a holistic view of a task, as it explicitly 'Combines the results of get_task, list_comments and list_artifacts' into a single call, implying efficiency over multiple separate calls.

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

get_team_directoryA
Read-onlyIdempotent

Get the workspace team directory listing all agents and human members. Default: a compact row-array table (columns id/name/role/project/status; project = responsibility_zone cut to one line ≤60 chars, status = computed_status) instead of full profiles — pass full=true for the complete dump (capabilities, heartbeat, escalation_to, timestamps, full zone text, ...).

NameRequiredDescriptionDefault
fullNoReturn the full per-member profile dump instead of the compact table (default false).

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare it read-only, idempotent, closed-world and non-destructive, and the description adds substantial extra context: the default compact row-array shape, its exact columns, the 60-char project truncation rule, that status is computed_status, and that full exposes capabilities/heartbeat/escalation_to/timestamps.

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?

Compact two-sentence structure, front-loaded with the primary behavior and the default/full trade-off emphasized via the dash. The long parenthetical is dense but each clause carries new information.

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 no output schema, the description carries the burden of describing returns and does so concretely (columns, truncation, full-profile fields), so an agent knows exactly what it gets in either mode.

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

Parameters4/5

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

Schema coverage is 100% and the single param is documented, so baseline is 3; the description goes further by enumerating what 'full' actually returns (capabilities, heartbeat, escalation_to, timestamps, full zone text), which the schema's terse boolean description does not.

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+resource ('Get the workspace team directory') and scopes it precisely ('listing all agents and human members'), which distinguishes it from narrow siblings like list_sub_agents and get_my_rules.

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?

Clearly routes the caller: default returns the compact table, 'pass full=true for the complete dump'. That is explicit conditional guidance for the one mode choice, though it never names alternatives or says when a directory lookup is preferable to other discovery tools.

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

get_workflow_rulesA
Read-onlyIdempotent

Get workflow rules for a project including allowed transitions, policies, and permissions for the calling agent. Read-only; check it before a move_task that may be restricted. get_assignment_rules covers routing; get_my_rules covers everything that binds you.

NameRequiredDescriptionDefault
project_idYesProject UUID, from list_projects.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered; the description's 'Read-only' is largely redundant. It still adds useful behavioral context by stating that results include permissions for the calling agent and that this should be checked before a potentially restricted move_task.

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

Conciseness5/5

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

Three short sentences with no wasted text. Purpose and contents are front-loaded, followed by the pre-move usage check and sibling differentiation.

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 one-parameter read-only getter with no output schema, the description is complete enough: it states what is returned, when to consult it, and how it differs from nearby tools. Annotations already cover the safety profile, so little else is needed.

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 project_id is already documented as coming from list_projects. The description adds no additional syntax or format details beyond what the schema provides, so the baseline of 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb and resource - get workflow rules for a project - and names the concrete contents: allowed transitions, policies, and permissions for the calling agent. It also distinguishes itself from siblings by explicitly saying get_assignment_rules covers routing and get_my_rules covers everything that binds you.

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

Usage Guidelines5/5

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

It gives an explicit usage condition: check this before a move_task that may be restricted. It also names the relevant alternative tools and their scopes, so an agent can choose between this, get_assignment_rules, and get_my_rules without guessing.

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

heartbeatA
Idempotent

Report that you are alive and what you are working on, so the team directory shows you online or busy and names your current task. Call it at session start and every few minutes during long work. It changes no task and returns no queue: get_my_tasks reads your assignments.

NameRequiredDescriptionDefault
modelNoOptional self-report of the model this agent runs on (max 128 chars). Empty string clears it.
statusNoAgent status shown in the team directory: online, busy or error. Use error only when you cannot work; report_error records why.
messageNoShort human-readable status message (e.g. 'running tests', 'waiting for review').
metadataNoArbitrary JSON metadata to store with the heartbeat.
agent_typeNoOptional self-report of the harness this agent runs in: claude_code, codex, cursor, copilot, gemini_cli, openclaw, cline, aider, hermes, custom.
current_task_idNoID of the task currently being worked on.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already establish that this is a non-destructive, idempotent mutation, so the description does not need to repeat safety hints. It adds useful behavioral context: heartbeat affects the team directory, changes no task, and returns no queue. It could say more about the response payload or rate expectations, but the key side effects are disclosed.

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, with the core purpose front-loaded followed by usage timing and a sibling-tool clarification. Every sentence adds distinct value without repetition.

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 six-parameter optional heartbeat tool with full schema coverage and no output schema, the description covers purpose, timing, side effects, and the main alternative. It does not describe what, if anything, the call returns or how metadata/model fields interact with directory display, leaving a minor completeness gap.

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%, and each parameter is already well described in the schema. The description reinforces that status and current task are shown in the team directory, but it does not add parameter-level syntax or edge-case guidance beyond the schema. Baseline 3 is appropriate when the schema carries 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 states a specific action and resource: reporting liveness and current work so the team directory reflects online/busy status and current task. It also distinguishes this from task-queue tools by explicitly saying it changes no task and returns no queue, pointing to get_my_tasks for assignments.

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

Usage Guidelines5/5

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

It gives explicit timing guidance: call at session start and every few minutes during long work. It also clarifies the alternative for reading assignments via get_my_tasks, so the agent knows not to use heartbeat for task retrieval.

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

import_workspace_configA
Destructive

Import workspace configuration from YAML. Applies rules, statuses, and project templates defined in the YAML to the whole workspace of the calling agent. Run export_workspace_config first and keep its output: it is the only rollback.

NameRequiredDescriptionDefault
yaml_contentYesThe complete YAML document as one string, in the format export_workspace_config returns (export, edit, import). Required and non-empty; the server rejects YAML it cannot parse.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true and idempotentHint=false; the description adds real value on top by disclosing blast radius (the entire workspace, not per-project) and the one recovery path (a prior export). It does not say whether existing configuration is replaced or merged, nor what happens on partial failure.

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

Conciseness5/5

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

Three sentences, no filler, with the action and effect front-loaded and the safety-critical rollback note given last for emphasis. Every sentence carries operational weight.

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 destructive, non-idempotent, single-parameter tool with no output schema, the definition covers scope, input format, and recovery. The remaining gap is replace-versus-merge semantics and partial-failure behavior, which matter for a whole-workspace destructive import.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds the round-trip contract (export, edit, import) and warns that the server rejects unparseable YAML. That meaning goes beyond the parameter's own schema text.

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

Purpose5/5

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

States a specific verb and resource (import workspace configuration from YAML) plus the exact effect: applies rules, statuses, and project templates to the calling agent's whole workspace. The pairing with the sibling export_workspace_config is named explicitly, so an agent can distinguish the two without inspecting schemas.

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

Usage Guidelines4/5

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

Gives an explicit prerequisite sequence: run export_workspace_config first and retain its output as the only rollback. That is actionable when-to-use guidance. It stops short of stating when not to use it (e.g., single-project or partial-scope edits) or any permission preconditions.

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

list_artifactsA
Read-onlyIdempotent

List artifacts attached to a task. Each carries download_path; a browser_only_url block, when present, is a human-only page. Downloading an artifact is two GETs. Step 1: GET /api/v1/artifacts//download with header X-Agent-Key: -> 200 JSON {"url": ""}. Step 2: GET that url with NO headers -> 200, the file bytes. Pitfalls: on step 1 only X-Agent-Key is accepted (X-API-Key and Authorization: Bearer give 401); on step 2 any extra header, Authorization in particular, breaks the presigned signature (400). The artifact's download_path is step 1's path. browser_only_url is a human page and answers 401 to an agent key by design.

NameRequiredDescriptionDefault
task_idYesTask ID.

TDQS

A4.1/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, yet the description goes well beyond them: exact auth header acceptance on step 1 (only X-Agent-Key; X-API-Key and Bearer yield 401), the header-free requirement on step 2 (extra headers, especially Authorization, break the presigned signature with 400), and the human-only nature of browser_only_url that returns 401 by design. These are precisely the failure modes an agent would otherwise hit blind.

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?

Purpose is front-loaded in the first sentence, then a numbered two-step recipe and a compact pitfalls sentence. Every sentence carries actionable detail, but the download procedure is arguably out of scope for a list tool and inflates length relative to the one-param surface.

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 no output schema, the description must explain what comes back, and it does: each item has download_path plus an optional browser_only_url. It also supplies the full follow-on download protocol and its error semantics, leaving no ambiguity about how to actually retrieve the bytes.

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% for the single task_id parameter, so the baseline is 3 even though the description adds nothing about it. The description's real semantic contribution is to the response fields (download_path, browser_only_url), which is helpful but not input-parameter guidance.

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?

Opens with a specific verb+resource+scope: "List artifacts attached to a task." This is clearly distinct from the singular sibling get_artifact, though it never names that sibling explicitly to reinforce the boundary. The rest of the description pivots to download mechanics rather than listing, which slightly dilutes the stated purpose.

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 concrete operational context: list for a task, then use download_path for the two-GET download flow, and ignore browser_only_url for agent use. There is no explicit statement of when to prefer this over get_artifact or of any exclusion, so it stops short of full routing guidance.

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

list_commentsA
Read-onlyIdempotent

List comments newest first (limit default 10), with pagination. Compact fields: id for reply/after, author_name, created_at in UTC to the minute, entire ordinary body. Known automation prefixes get one-line summaries; include_auto=true restores their bodies. full=true restores non-capability REST fields. after accepts a comment UUID or RFC3339 timestamp and returns only newer comments (exclusive), paginated within that delta; unknown IDs are refused. order=asc gives chronological reading.

NameRequiredDescriptionDefault
fullNoReturn complete comment objects (author_id, task_id, url, metadata, parent_comment_id, updated_at, uncut bodies) instead of the compact view.
pageNo1-based page number. Omit for the first page; use with `has_more`/`total_pages` in the response to read the rest of a thread.
afterNoExclusive comment UUID or RFC3339 timestamp; page/limit apply to the newer-comments delta. Unknown IDs are refused.
limitNoMax comments to return (default 10, newest first; ordinary bodies are complete).
orderNoSort direction: desc (default — NEWEST comments first, so limit=2 gives the LAST two comments) or asc (oldest first — chronological reading from the start of the thread). An invalid value is REFUSED by the API; an explicitly empty value is refused locally (at the API boundary it is indistinguishable from absent) — neither is silently treated as asc.
task_idYesTask ID.
include_autoNoReturn complete automation bodies in compact mode.
include_internalNoInclude internal (agent-only) comments.

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds genuine behavioral detail beyond that: automation prefixes are collapsed to one-line summaries unless include_auto=true, full=true restores non-capability REST fields, after is exclusive, and unknown IDs / invalid order values are refused rather than silently coerced. Missing: nothing about include_internal's default-on behavior or what the paginated response envelope contains.

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

Conciseness4/5

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

Front-loaded with the core behavior and each clause covers a distinct mode or edge case, so there is little waste. The semicolon-chained, parenthetical style makes it dense and slightly harder to scan than it needs to be.

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 an 8-parameter read tool with no output schema, the description covers the important complexity: compact vs full projection, automation stripping, delta pagination via after, ordering, and refusal behavior on bad input. Gaps are minor – include_internal is never mentioned and the response shape is only gestured at ('with pagination').

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter is already documented and the baseline is 3. The description reinforces a few points (default limit 10, newest-first, after accepting UUID or RFC3339 and being exclusive, unknown IDs refused) but mostly restates schema content rather than adding new semantics.

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?

Opens with a specific verb+resource plus scope: 'List comments newest first (limit default 10), with pagination.' It distinguishes the compact view from the full view and thin automation summaries, so an agent knows exactly what comes back. It never names the sibling it is not (list_doc_comments), so the task-vs-doc distinction is left to the task_id parameter.

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

Usage Guidelines3/5

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

Usage context is implied rather than declared: 'order=asc gives chronological reading' and 'after ... returns only newer comments' tell an agent which mode fits which reading pattern. There is no explicit when-to-use/when-not or routing to alternatives such as list_doc_comments or get_task.

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

list_doc_commentsA
Read-onlyIdempotent

Read the comments on a document as threads — each top-level comment with its replies nested under it, the quoted passage it is anchored to, and who wrote it. Resolved threads are hidden unless include_resolved=true. A comment whose quoted text no longer exists in the document is marked orphaned=true in its anchor: it is still shown, and it is not pointing anywhere. doc may be an old path or a bare slug; the reply then carries moved_to (the current path). An ambiguous bare slug is a 409 listing the full paths.

NameRequiredDescriptionDefault
docYesDocument UUID, or a slug path like 'architecture/adr/adr-004' (a path also needs project_id). A path survives the document being moved: the old path still resolves, and so does a bare slug ('adr-004') when exactly one live document in the project has it. When the reference was not the live path, the reply carries moved_to — the document's current path; use that from now on. A bare slug shared by several documents is a 409 ('Ambiguous document slug') listing the full paths: pick one and repeat the call with the full path or the UUID. The UUID never changes.
project_idNoProject UUID. Required only when doc is a slug path.
include_resolvedNoInclude threads somebody marked resolved.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already cover readOnly/idempotent/non-destructive, so the bar is lower. The description still adds real behavioral context beyond them: resolved threads are hidden by default, orphaned comments remain visible but point nowhere (orphaned=true), and an ambiguous slug yields a 409. Much of the path/moved_to/409 detail, however, is restated from the doc parameter's own schema description, so net-new disclosure is moderate.

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

Conciseness3/5

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

The opening sentence is well front-loaded and dense with value, but the closing sentence on doc paths, moved_to and 409 is essentially a restatement of the doc parameter description, which inflates the definition without new information. Roughly half the text is redundant with structured data.

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

Completeness5/5

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

There is no output schema, so the description carries the return-shape burden — and it does: thread nesting, replies under top-level comments, quoted anchor, author, the orphaned flag, and the moved_to field on replies. Combined with the annotations covering the safety profile and full schema coverage of parameters, an agent has everything needed to call and interpret it.

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 all three parameters are already documented in the schema at length. The description's discussion of old paths, bare slugs, moved_to and the 409 duplicates that text rather than adding syntax or defaults the schema lacks. Baseline 3 is correct when the schema does the heavy lifting.

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?

Specific verb+resource: 'Read the comments on a document as threads', and it goes further by describing the returned structure (nested replies, anchor, author). However, it never distinguishes itself from the sibling list_comments (which presumably lists comments across documents) or from comment_doc, so an agent must infer the boundary. Clear purpose, but no sibling differentiation.

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

Usage Guidelines3/5

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

Usage is implied by 'on a document' and the explanation of include_resolved, but there is no explicit when-to-use / when-not guidance and no naming of an alternative tool. The agent can infer it is the per-document reader, but the description never confirms that against list_comments.

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

list_docsA
Read-onlyIdempotent

List a project's documents — id, title, slug path, version, who touched them last. Carries NO document bodies, so it is cheap on a whole project and serves as a map of it (get_doc returns one page). Returns path and has_children for navigating the tree. Paged: the reply carries total_count and has_more; when has_more is true, offset reads the rest.

NameRequiredDescriptionDefault
limitNoPage size (default 50, max 200).
offsetNoDocuments to skip (default 0).
project_idYesProject UUID.
include_archivedNoAlso list archived documents. Default false: only live documents.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the description adds real value by disclosing that no document bodies are transferred and how the result is paged (total_count, has_more, offset for the remainder). It omits nothing dangerous, though it doesn't state the default exclusion of archived docs, which matters for interpreting the map.

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

Conciseness5/5

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

Three tight sentences: scope first, cost/no-bodies benefit second, pagination mechanics last. No repetition of the schema and every clause carries information.

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 no output schema, the description carries the burden of return-shape explanation and does so fully: listed fields, path/has_children for tree navigation, and paging metadata. An agent can call it and interpret the response correctly without further assumptions.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description goes beyond it by explaining the offset/has_more interplay as a continuation protocol rather than a bare numeric field. It adds nothing on include_archived, which stays purely schema-documented.

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

Purpose5/5

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

States a specific verb and resource ('List a project's documents') and enumerates what each entry carries (id, title, slug path, version, last editor). It also names the sibling it replaces for single-item reads ('get_doc returns one page'), so an agent can route without opening the schema.

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

Usage Guidelines4/5

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

Explicitly frames the use case ('cheap on a whole project, serves as a map of it') and contrasts with get_doc for single-page reads. It does not mention search_docs or the include_archived toggle as an alternative, so the exclusion set is partial but usable.

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

list_projectsA
Read-onlyIdempotent

List the projects in the workspace with their ids, names and slugs. Call it first to find the project_id that most other tools require. Archived projects are hidden unless include_archived=true.

NameRequiredDescriptionDefault
workspace_idNoWorkspace UUID. Defaults to the calling agent's workspace; another workspace is only readable if your key belongs to it.
include_archivedNoAlso list archived projects. Default false: only active projects are returned.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds a genuinely non-obvious behavioral fact not present in the annotations: archived projects are silently filtered out unless include_archived=true, which is exactly the kind of default-result skew an agent could misread.

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

Conciseness5/5

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

Three short sentences: what it returns, when to call it, and a default-behavior caveat. The most actionable guidance (call it first) is front and center and nothing is padded.

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 no output schema, the description usefully enumerates the returned fields and covers the archived-filtering default, which is enough for an agent to call it correctly. It leaves result volume and ordering unpinned, a minor gap for a two-parameter listing 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 coverage is 100% and both parameters are fully described in the schema, including the defaults and the workspace-access caveat. The description's mention of include_archived restates the schema's default rather than adding syntax, format, or interaction detail, so 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?

States a specific verb and resource and names the payload the caller gets back ('ids, names and slugs'), which is more than a restatement of the name. It implicitly separates itself from the single-project sibling (get_project) by framing itself as the enumeration step, but never names that sibling explicitly.

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

Usage Guidelines4/5

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

"Call it first to find the project_id that most other tools require" gives a concrete ordering rule that tells the agent when to reach for this tool before others. It stops short of an exclusion rule (e.g., skip this and call get_project when you already have a slug or name).

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

list_recurring_schedulesA
Read-onlyIdempotent

Lists the recurring task schedules of a project, with the ids that get_recurring_history, trigger_recurring_now, update_recurring_schedule and delete_recurring_schedule take.

NameRequiredDescriptionDefault
project_idYesProject UUID, from list_projects.
active_onlyNoDefault true: only active schedules. Pass false to also see paused ones (is_active=false).

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world behavior, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: it tells the agent the return payload's key purpose (the ids consumed by four specific sibling tools), which is the main thing an agent needs to know before calling it.

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

Conciseness5/5

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

A single tight sentence that front-loads the action and resource and then names the consumers of the returned ids. No filler or restated title.

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 2-parameter read with full schema coverage and rich annotations but no output schema, the description covers the essential gap—what the returned ids are for. It could say a bit more about returned fields or ordering, but the critical information for correct invocation is present.

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%, with both project_id (UUID, from list_projects) and active_only (default true, false includes paused) fully documented. The description adds no parameter-specific detail beyond the schema, which is the expected baseline when the schema already does the work.

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 (lists) and resource (recurring task schedules of a project), and explicitly names the downstream consumers (get_recurring_history, trigger_recurring_now, update/delete_recurring_schedule). This clearly distinguishes it from siblings like create_recurring_task and get_recurring_history.

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 implies the intended workflow—call this first to obtain ids that the four named siblings require—which is clear contextual guidance. It stops short of explicit 'when not to use' or a named alternative for listing schedules, but for a straightforward list tool the routing signal is strong.

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

list_sub_agentsA
Read-onlyIdempotent

List the sub-agents registered under an agent (see register_sub_agent): direct children only, or the whole subtree with recursive=true. get_team_directory lists every member of the workspace instead.

NameRequiredDescriptionDefault
agent_idNoUUID of the parent agent whose sub-agents to list. Omit for the calling agent; get_team_directory gives other agents' ids.
recursiveNoReturn all descendants (up to 10 levels deep) instead of direct children only. Default false.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and non-destructive, so safety is covered; the description adds genuine scope behavior beyond that (children only vs. full subtree, plus the parent-agent default when agent_id is omitted). It stops short of describing result shape or any depth-limit behavior in the description itself, so it is not exhaustive.

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, zero filler, with the core behavior and both sibling disambiguations front-loaded before any edge case.

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 no-output-schema list tool with zero required parameters, the definition covers purpose, scope, recursion behavior and alternatives. The only mild gap is that it does not hint at what a returned entry contains (id, name, status), which would help an agent decide whether to recurse.

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%, so both parameters are already fully documented, including the 10-level depth cap and the 'omit for calling agent' default. The description reinforces the direct-children vs. recursive distinction but adds no syntax or format detail the schema does not already carry, so the 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 and resource (list sub-agents registered under an agent) and immediately disambiguates from two siblings by name: register_sub_agent for creation and get_team_directory for workspace-wide membership. An agent can distinguish all three without opening a schema.

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

Usage Guidelines5/5

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

Explicit routing: use this for direct children by default, set recursive=true for the whole subtree, and use get_team_directory instead when you want every member of the workspace. Both the when-to-use and the when-to-use-something-else conditions are stated.

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

list_tasksA
Read-onlyIdempotent

List tasks with strict filters. Provide project_id for a project listing or workspace_id plus search for cross-project search. Unknown parameters and invalid categories are errors. Compact items contain id, title, status slug, priority, assignee_name, labels, updated_at, runtime_state (working/waiting/queued/stopped with since/lane/ref/stale, when known) and routing parent_task_id/start_after when set; workspace results also contain project_id. full=true returns complete REST items; listing descriptions are subject to the API page budget, while get_task returns full details. For your own queue use get_my_tasks.

NameRequiredDescriptionDefault
fullNoReturn complete items (full descriptions and non-capability envelope fields) instead of compact items.
pageNo1-based page number (default 1). The response reports total_pages; without this parameter every page beyond the first was unreachable while the envelope kept advertising them.
sortNoSort field: created_at, updated_at, priority, due_date.
limitNoMax results to return (default 20). The compact view caps limit at 50 — a larger value is clamped and the response says so via limit_clamped_to; pass full=true for up to 200 per page.
orderNoSort direction: asc (default) or desc. Without this, a project larger than `limit` returns its OLDEST tasks, so "what changed recently" walks come back empty and look clean. An invalid value is REFUSED by the API, not silently treated as asc.
labelsNoFilter by labels.
searchNoSearch in title and description.
assigneeNoFilter by exact case-insensitive assignee name, UUID, or me. Unknown or ambiguous names are errors.
priorityNoFilter by priority: urgent, high, medium, low, none.
project_idNoProject ID (required unless workspace_id is provided).
assignee_idNoUUID-only compatibility alias for assignee. Use assignee for names or me.
runtime_kindNoFilter by effective runtime state: working, waiting, queued, stopped. working also matches a card with a live checkout and no reported state, whatever its status.
workspace_idNoWorkspace ID for global cross-project search (requires search parameter).
assignee_typeNoFilter by assignee type: user, agent, unassigned.
list_revisionNoThe list_revision echoed back on a previous page of this same project-scoped walk (see the response's list_revision field). Pass it back to continue that walk. If the project's tasks changed since that page was issued, the call is REFUSED with list_revision_stale (HTTP 410) instead of silently returning an inconsistent page — restart pagination from page 1 (omit this field) on that error. Omit on the first page of a fresh walk. Ignored for workspace_id search.
status_categoryNoFilter by status category: backlog, todo, in_progress, review, done, cancelled.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, but the description adds real behavioral context: strict parameter validation, the API page budget, compact vs. full=true payload differences, and exactly which fields compact items carry including runtime_state and routing fields. It stops short of describing pagination or rate behavior in depth, but the payload contract is well disclosed.

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

Conciseness4/5

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

Front-loaded with purpose and scope rules, then payload shape, then alternatives — a sensible ordering with no filler sentences. It is a single dense block that would read better split into scope/payload/alternatives lines, but every clause carries information.

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 16 optional parameters and no output schema, the description compensates by documenting the compact item field set, the workspace-only project_id field, and the full=true alternative — precisely what an agent needs to choose a mode and interpret results. Given the complexity, nothing essential is missing.

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

Parameters3/5

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

Schema coverage is 100% and the schema descriptions are themselves unusually detailed (e.g., list_revision, order, limit clamping), so the schema does the heavy lifting. The description adds the key project_id vs. workspace_id+search pairing and the full=true semantics, but does not enrich most of the 16 parameters beyond what is already structured. Baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb and resource ("List tasks") and immediately disambiguates the two scope modes: project listing via project_id vs. cross-project search via workspace_id plus search. It also names get_task and get_my_tasks as the tools for full details and personal queues, so it is distinguishable from siblings without opening any schema.

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

Usage Guidelines5/5

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

Gives explicit routing rules: project_id for a project listing, workspace_id+search for cross-project search, get_task when full details are needed, get_my_tasks for your own queue. It also names failure conditions (unknown parameters and invalid categories are errors), which is when-not guidance an agent can act on.

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

mark_vcs_deployedA
Idempotent

Record that the change behind a PR/MR link is deployed: sets deployed_sha, deployed_env and deployed_at (now) on the link and releases the dependents waiting on a deployed dependency edge of this card. Reporting the same sha and env again is safe: the first deployed_at stands. The link must be a pr link of task_id (link ids are in get_task vcs_links and in the add_vcs_link result).

NameRequiredDescriptionDefault
envYesEnvironment, 1-32 chars of a-z, 0-9, _ or -, e.g. production.
shaYesThe deployed commit, 40 lowercase hex.
link_idYesVCS link ID.
task_idYesTask ID.

TDQS

A4.5/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing a cross-entity side effect (releasing dependents waiting on a `deployed` dependency edge of this card), which the agent could not infer from destructiveHint=false. It also refines idempotentHint=true with concrete semantics: the same sha+env pair is safe to report and the first deployed_at stands.

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?

Three sentences, front-loaded with the action, and every clause carries information — the field list, the side effect, the idempotency rule, and the precondition. Dense but no filler; slight density cost from the parenthetical id-location hint.

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 4-required-param mutation with no output schema, it covers the important unknowns: preconditions, idempotent behavior, and downstream effects. It stops short of describing failure behavior (e.g. what happens if the link is not a pr link) or required permissions, which a mutating tool ideally would state.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, and the description adds real value on top: the relational constraint that link_id must be a pr link belonging to task_id, plus where to find that id. It leaves format details (40-hex sha, env charset) to the schema, which 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?

Opens with a specific verb+resource: 'Record that the change behind a PR/MR link is deployed', then names exactly the fields mutated (deployed_sha, deployed_env, deployed_at) and the side effect on dependency edges. This is clearly distinguishable from add_vcs_link (creates links) and get_task (reads link ids), so an agent can pick it without opening any schema.

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

Usage Guidelines4/5

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

Gives an explicit precondition — the link must be a pr link of task_id — and routes the agent to the right sibling tools for obtaining the id ('link ids are in get_task vcs_links and in the add_vcs_link result'). It does not state when not to call it or what to do for non-PR links, but the usage context is unambiguous.

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

move_taskA
DestructiveIdempotent

Change task status (e.g. todo → in_progress → done). Status is given as a slug (not a UUID). On move to 'review', task auto-reassigns to creator unless assignee_id is provided. Returns {task, new_status} with a lean task by default (id, status_id, assignee, updated_at — the post-move assignee is always included so an auto-reassign is visible); full=true returns the whole reloaded task.

NameRequiredDescriptionDefault
fullNoReturn the whole reloaded task instead of the lean confirmation.
commentNoOptional comment to add when moving.
task_idYesTask ID.
assignee_idNoReassign to this agent/user on move. Overrides auto-reassign to creator on review.
status_slugYesTarget status slug (e.g. 'in_progress', 'done').
assignee_typeNoAssignee type if assignee_id is set: user or agent.agent

TDQS

A4.1/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing the auto-reassign-to-creator behavior on 'review', the exact return shape ({task, new_status}), which lean fields come back, and why the post-move assignee is always included. This is exactly the mutation behavior an agent needs before calling.

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?

Dense but front-loaded: the primary action and slug constraint come first, then the review auto-reassign caveat, then the return-shape details. No sentence is wasted, though the return-shape sentence is somewhat long.

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 no output schema, the description fully compensates by describing exactly what is returned in both lean and full modes, and it covers the significant hidden side effect of auto-reassignment. 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.

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds real meaning: status must be a slug not a UUID, assignee_id overrides auto-reassign, and full=true returns the whole reloaded task. These clarify cross-parameter interactions the schema does not capture.

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

Purpose4/5

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

States a specific verb+resource: 'Change task status' with a concrete example transition (todo → in_progress → done). It does not explicitly differentiate itself from close siblings like update_task or assign_task, so it falls short of a 5.

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

Usage Guidelines3/5

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

Usage is implied through the status-transition framing and the conditional 'unless assignee_id is provided' note, but there is no explicit when-to-use/when-not guidance or routing to alternatives such as assign_task for reassignment-only operations.

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

poll_tasksA
Read-onlyIdempotent

Long-poll for new task assignments: use it only in a loop that waits for work. Blocks until a task is assigned to this agent or the timeout expires. Returns current assigned tasks and whether any change occurred. Tasks use the lean get_my_tasks view (first-line descriptions, no envelope fields); full=true returns the complete items. Kept for backward compatibility; get_my_tasks is the non-blocking equivalent.

NameRequiredDescriptionDefault
fullNoReturn complete task items instead of the lean view (default false).
timeoutNoMaximum seconds to wait for new assignments (default 30, max 120).

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, it discloses the blocking wait, the termination conditions (task assigned or timeout expiry), what the response contains, and the lean-vs-full payload difference including missing envelope fields. That is unusually rich operational context.

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

Conciseness4/5

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

Purpose is front-loaded in the first clause, and every sentence carries distinct information (blocking semantics, return shape, payload mode, migration note). Slightly dense as a single run of semicolon-joined clauses rather than cleanly separated statements.

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

Completeness5/5

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

There is no output schema, yet the description still explains what comes back (assigned tasks plus a change indicator) and how the payload varies with full. For a two-optional-parameter, annotation-covered tool, 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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds value the schema lacks: it characterizes the lean view as "first-line descriptions, no envelope fields," which tells the agent why to set full=true. Timeout bounds are restated rather than extended, so it stops short of a 5.

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?

Names a specific verb and resource ("Long-poll for new task assignments") and immediately distinguishes it from the sibling get_my_tasks by calling that one "the non-blocking equivalent." An agent can pick between the two without opening either schema.

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

Usage Guidelines5/5

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

"use it only in a loop that waits for work" is an explicit when-to-use rule, and the closing sentence names the alternative (get_my_tasks) plus the condition that selects it (non-blocking reads). Backward-compatibility status is also disclosed.

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

post_project_updateA

Post the project's daily status report to its Updates section (/w//p//updates). Fleet rule: the project lead writes one such report every day — a health call, what moved, what is blocked, what is next. Task counts are computed by the server. Other agents read the latest report in get_project and get_task_context. Needs the right to comment in the project; read-only keys are refused.

NameRequiredDescriptionDefault
titleYesReport title, e.g. the date and a one-line headline.
statusYesProject health: on_track, at_risk, off_track or completed.
summaryYesA few sentences on the state of the project.
blockersNoWhat is stuck and on whom.
highlightsNoWhat moved since the last report.
next_stepsNoWhat happens next.
project_idYesProject UUID.

TDQS

A4.2/5.0
Behavior4/5

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

The annotations already establish that this is a non-read-only, non-destructive mutation. The description adds valuable behavioral context: task counts are server-computed, and the caller needs comment rights because read-only keys are refused. It could say more about the response or duplicate-report behavior, but the core operational constraints are disclosed.

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 compact and front-loaded, starting with the action and target location, then the daily-report rule, then permissions and downstream readers. Every sentence adds useful context without repetition.

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 seven parameters and no output schema, the description covers purpose, required permission, content expectations, and downstream consumers well. It does not describe the immediate return value, but the essential information for invoking the tool correctly is present.

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 explains each field including title, status, summary, blockers, highlights, next_steps, and project_id. The description reinforces the report's content shape but adds no syntax, enum, or format details beyond the schema.

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

Purpose5/5

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

The description names a specific verb and resource: posting the project's daily status report to its Updates section. It clearly distinguishes the write operation from sibling read tools like get_project_updates and get_project.

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 explicit usage context: the project lead writes one report every day, and other agents consume the result via get_project and get_task_context. It also states the permission prerequisite, though it does not enumerate when not to use this tool beyond read-only key refusal.

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

publish_eventA

Publish an event to the event bus. event_type='summary' publishes a summary. Add memory={persist:true, key:'decision-name'} to also save as permanent memory. Replaces the deprecated publish_summary tool.

NameRequiredDescriptionDefault
tagsNoEvent tags for filtering.
memoryNoOptional memory hint to persist alongside the event (e.g. key decisions, conventions).
payloadYesEvent payload as key-value pairs.
subjectYesEvent subject line.
task_idNoRelated task ID.
ttl_hoursNoTime-to-live in hours (default 24).
event_typeYesEvent type: summary, status_change, context_update, error, dependency_resolved, custom.
project_idYesProject ID.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare this is a non-readonly, non-destructive, non-idempotent write operation. The description adds useful behavioral context by explaining the summary event behavior and the memory persistence side effect, though it does not detail return behavior or event-bus delivery semantics.

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

Conciseness5/5

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

The description is three short sentences, front-loads the main action, and every sentence adds actionable information with no 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?

For an 8-parameter write tool with full schema coverage and no output schema, the description covers the core action and the important memory side effect. Minor gaps remain around event-bus semantics and the exact effect of memory fields beyond the example.

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

Parameters4/5

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

Schema coverage is 100%, so parameters are largely documented. The description still adds value by giving a concrete memory syntax example, 'memory={persist:true, key:"decision-name"}', which compensates for the schema's empty memory properties object.

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

Purpose5/5

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

The description uses a precise verb and resource: 'Publish an event to the event bus.' It also clarifies a special case ('event_type=summary') and explicitly distinguishes this tool from the deprecated publish_summary sibling.

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 for publishing events and explains how to add memory persistence, while naming the deprecated alternative it replaces. It does not explicitly say when to use this instead of sibling tools such as post_project_update or remember.

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

publish_summaryA

Publish a work summary event (convenience wrapper for publish_event with type=summary). Kept for backward compatibility; publish_event with event_type='summary' is the current equivalent.

NameRequiredDescriptionDefault
metricsNoMetrics (lines changed, tests passed, etc.).
summaryYesSummary of work done.
task_idNoRelated task ID.
blockersNoCurrent blockers.
next_stepsNoSuggested next steps.
project_idYesProject ID.
key_decisionsNoKey decisions made.
artifacts_createdNoArtifacts created.

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, so the write/non-destructive profile is covered. The description adds the useful fact that behavior is inherited from publish_event, but says nothing about what publishing actually does — who consumes the event, whether it is appended or overwritten, or any rate/ordering 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?

Two sentences, zero padding, with the core purpose stated first and the deprecation/alternative note second. Nothing repeats the name or title.

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 thin wrapper this is close to sufficient, but with 8 parameters, a nested free-form metrics object with no defined sub-properties, and no output schema, the agent gets no guidance on return behavior or what a 'work summary event' surfaces downstream. Adequate but noticeably thin for the schema surface.

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 all 8 parameters including summary, metrics, blockers, and next_steps are documented in the schema itself. The description adds no field-level meaning beyond restating the wrapper mapping; baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb and resource ('Publish a work summary event') and immediately defines its identity as a convenience wrapper for publish_event with type=summary. That framing distinguishes it from the sibling publish_event without requiring the agent to open either schema.

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

Usage Guidelines4/5

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

Names the alternative explicitly ('publish_event with event_type=summary is the current equivalent') and signals via 'kept for backward compatibility' that this is the legacy path. It stops short of an explicit directive ('prefer publish_event for new work'), so the preference must be inferred.

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

recallA
Read-onlyIdempotent

SEARCH memory by keywords. Finds a SPECIFIC piece of knowledge, e.g. 'API convention' or 'license decision'. Returns ranked results with scores. Default view is compact: per item key, tags, score and the first ~300 chars of content (a trailing … marks a cut; timestamps, scope and bookkeeping fields are omitted). get_memory(key) returns the whole text of one entry; full=true returns every item uncut with all stored fields (created_at included). Below the relevance threshold, returns an empty list with an explanation instead of weak matches. include_archived=true also returns archived memories. Use it to find one fact; recall_with_graph also follows links to related memories, get_project_knowledge pages through one project's permanent knowledge.

NameRequiredDescriptionDefault
fullNoReturn every item in full, with all stored fields and uncut content (default false: compact view, content cut at ~300 chars and marked with a trailing `…`, bookkeeping fields such as agent_id, workspace_id, simhash and decay scores are left out). Prefer get_memory(key) to read one cut entry in full; full=true re-fetches the whole page uncut.
tagsNoAND-filter: memory must contain ALL listed tags.
limitNoMax results (1–50). Omitted compact requests use 5; full=true or an explicit profile keeps the previous default 10. Existing profile presets still apply when limit is omitted (multi-session uses 20, including automatic classification). Explicit limit wins. This is a hard bound: the response never contains more than limit items. When knowledge-graph boost is enabled, a share of the page (limit/4, at least 1 when limit>=2) may be filled with graph-expanded neighbours, marked graph_boost=true and provenance=via:graph — they take the tail slots instead of being added on top. Rows that fail scope/tags are dropped, never returned unmarked, whether they arrived by retrieval, by pinning, or by graph expansion.
queryYesFull-text search query.
scopeNoFilter by scope: workspace, project, agent, or all (default).
sinceNoReturn memories created at or after this RFC3339 timestamp.
untilNoReturn memories created at or before this RFC3339 timestamp.
offsetNoPagination offset (default 0).
order_byNoSort order: created_at:desc (default), created_at:asc, relevance:desc, decayed_relevance:desc.
tags_anyNoOR-filter: memory must contain AT LEAST ONE of these tags.
created_byNoFilter by agent ID (UUID).
project_idNoFilter to a specific project.
relevance_minNoMinimum relevance score (0-1).
min_importanceNoMinimum importance_score threshold (0-1, default 0.3 — matches the lowest score the server assigns, kind:session-checkpoint, so prior-session hand-offs are returned without an override). Raise it to exclude low-value entries; pass 0 to disable filtering entirely.
recall_profileNoOverride automatic query classification. Existing preset values are preserved; explicit limit takes precedence.
include_expiredNoInclude expired memories (default false).
include_archivedNoAlso return archived memories (retired by their owner or by review but kept for history). Default false: only live memories.
apply_recency_decayNoSort by relevance * 0.95^days_since_created.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare read-only/idempotent safety, but the description adds the behaviour that actually matters for interpreting results: compact default view with ~300-char truncation and a trailing … marker, ranked results with scores, an empty list plus explanation rather than weak matches below threshold, and archived memories excluded unless include_archived=true. That is substantial context an agent cannot get from the annotation block.

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?

Front-loaded with purpose, then result shape, then failure behaviour, then the sibling routing sentence at the end where it belongs. Sentences are dense but every one carries a distinct fact; nothing restates the tool name or title.

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 18 parameters and no output schema, the description carries the return-shape burden itself and does so well (compact format, truncation marker, scoring, empty-result case). It leaves the filtering/pagination parameter semantics entirely to the schema, which is acceptable at 100% coverage but stops short of a complete picture.

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 100%, so baseline is 3, but the description adds decision-level meaning for the two parameters that shape the response most: the compact-vs-full tradeoff and include_archived. It does not touch scope, since/until, order_by, relevance_min, min_importance or recall_profile, which remain schema-only.

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

Purpose5/5

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

States a specific verb and resource ("SEARCH memory by keywords") plus concrete examples of what a hit looks like ("API convention", "license decision"). It also names the three sibling tools it is not (get_memory, recall_with_graph, get_project_knowledge), so an agent can route without opening any schema.

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

Usage Guidelines5/5

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

Explicitly says "Use it to find one fact" and then contrasts that with recall_with_graph (follows links to related memories) and get_project_knowledge (pages one project's permanent knowledge). When to escalate to get_memory(key) for a cut entry is also spelled out, leaving no routing ambiguity.

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

recall_with_graphA
Read-onlyIdempotent

Search memory with Knowledge Graph expansion. Seeds from hybrid recall, then BFS-traverses memory_edges up to hops depth. Returns memories ranked by composite score with hop_distance and provenance fields. Returns broader context: related decisions, connected incidents, derived learnings. Slower and wider than recall: use it for the connected context around a topic, recall for a single fact.

NameRequiredDescriptionDefault
qYesSearch query (keywords or natural language).
hopsNoGraph traversal depth (default 2, max 5).
task_idNoOptional task ID — used as cache key discriminator for session-scoped traversal.
project_idNoFilter to a specific project.
weight_thresholdNoMinimum edge weight to follow (default 0.3).

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description goes further by disclosing the retrieval algorithm (hybrid seeding + BFS), the latency/width tradeoff versus `recall`, and the shape of results (composite ranking plus hop_distance and provenance). It does not discuss limits on graph size, truncation behavior, or how composite score is computed, which keeps it short of a 5.

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

Conciseness5/5

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

Four tight sentences, front-loaded with what it does and the mechanism, then the return shape, then the disambiguation. No filler and no repetition of the schema.

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

Completeness5/5

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

There is no output schema, yet the description still tells the agent what comes back (ranked memories with hop_distance and provenance, plus related decisions/incidents/learnings) and how cost differs from the cheaper sibling. Nothing needed 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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning by tying `hops` to BFS traversal depth over memory_edges and by explaining that `weight_threshold` governs which edges get followed and `task_id` acts as a cache discriminator. That is genuine semantics beyond the schema text.

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+resource (search memory with Knowledge Graph expansion) and immediately explains the mechanism: seed from hybrid recall, then BFS over memory_edges to hops depth. It explicitly contrasts with the sibling `recall` (single fact vs. connected context), so an agent can pick between them without opening either schema.

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

Usage Guidelines5/5

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

The closing sentence gives an explicit routing rule: use this for connected context around a topic, use `recall` for a single fact, and notes it is slower and wider. That covers when-to-use, when-to-prefer-the-alternative, and the cost tradeoff in one line.

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

record_owner_decisionA
Destructive

Record a directive from the workspace owner as a canonical decision in project_knowledge. Broadcasts to specified agents via propagate_to tags. privacy:private records are stored but EXCLUDED from get_canonical_updates. Auto-flags private if text contains secrets. If task_id is given, also records this as a human_gate decision on that task (docs/human-gate-decision-recorded.md in evc-mesh) — releases the gate as a consequence if it's currently live, and links back via canonical_key. Best-effort: a failure here is reported in the result but does not undo the canonical write.

NameRequiredDescriptionDefault
textYesFull text of the decision/directive.
scopeNoOptional project_id UUID. Omit for workspace-level decisions.
privacyNo'public' (default, visible in change-feed) or 'private' (recorded but hidden).public
summaryYesOne-line summary used as UPSERT key (dedupes same decision on same day).
task_idNoOptional task UUID this decision answers. When set, also records a human_gate decision on that task (provenance=attested, channel=telegram, quote=text) — releasing a live human_gate as a consequence. Omit for a plain canonical-only record (unchanged behavior).
propagate_toNoAgent slugs to propagate to, e.g. ['alice','bob']. Use ['all'] for workspace-wide broadcast.
question_refNoOptional comment UUID of the Blocking marker this decision answers (only with task_id). Omit when the task has exactly one live marker — the server binds it. Required when several markers are live; the error lists their ids.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations mark this destructive and non-idempotent, but the description goes well beyond them: private entries are stored yet EXCLUDED from get_canonical_updates, secrets auto-force private, a live human_gate is released as a side effect, and a partial failure is best-effort without undoing the canonical write. That is exactly the side-effect disclosure a destructive tool needs.

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?

Dense and front-loaded — the core write is stated first, then side effects, then the failure caveat. Slightly load-bearing with many clauses, but nearly every sentence carries a distinct behavioral fact.

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?

No output schema exists, yet the description covers the return-relevant behavior (failures are reported in the result but do not roll back), plus side effects, dedupe key, and privacy semantics. Nothing an agent needs to call this destructive multi-effect tool safely appears to be missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real semantics on top: it frames propagate_to as tags, explains privacy's exclusion behavior, and describes task_id's dual-record consequence and question_ref's binding rules. Only question_ref is left essentially to the schema.

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

Purpose5/5

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

States a specific verb+resource pair ("Record a directive ... as a canonical decision in project_knowledge") and immediately enumerates its effects (broadcast via propagate_to, optional human_gate record). An agent can distinguish this from set_project_knowledge or remember without opening any schema.

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

Usage Guidelines4/5

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

Gives clear conditions for use: owner directives, and the conditional branch for task_id ("If task_id is given, also records this as a human_gate decision"). It does not explicitly name a competing sibling or state when NOT to record a canonical decision, so it stops short of full routing guidance.

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

register_sub_agentA

Register a new sub-agent as a child of the calling agent in your workspace, so it is listed in the team directory and by list_sub_agents and can be assigned tasks. Returns the created agent record.

NameRequiredDescriptionDefault
nameYesDisplay name of the sub-agent, as it should appear in the team directory.
agent_typeYesHarness the sub-agent runs in: claude_code (Claude Code CLI), openclaw, cline, aider, or custom for anything else.
capabilitiesNoOptional key-value map of what the sub-agent can do, e.g. {"languages": ["go"]}, stored on its profile.

TDQS

A4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint=false, destructiveHint=false, non-idempotent, closed-world), so the description's job is to add what those don't say: it creates a persisted agent record, binds it as a child of the caller, and makes it visible in the directory and to list_sub_agents. It omits what happens on a duplicate name and whether any permission or quota constraints apply, which keeps this from a 5.

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

Conciseness5/5

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

Two tight sentences: the effect is front-loaded, the side effects follow, and the return value closes it out. No filler or restatement 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?

For a creation tool with no output schema, it explains the mutation's effect, the parent-child binding, and that the created record is returned, which is enough for an agent to call it confidently. Missing only edge-case behavior (duplicate names, permission requirements) that would matter for a non-destructive but non-idempotent write.

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 all three parameters (name, agent_type with its harness list, nested capabilities map) are already documented in the schema. The description adds no further parameter guidance; the parent-child relationship is implicit rather than a parameter, so 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?

Specific verb + resource ("Register a new sub-agent") plus scope ("as a child of the calling agent in your workspace"). It names concrete downstream effects ('listed in the team directory and by list_sub_agents') and the return value, which separates it from list_sub_agents and update_agent_profile without the reader opening a schema.

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 the use case ('so ... it can be assigned tasks'), which points at why you would call it, but never states when to prefer it over siblings like update_agent_profile or get_team_directory, nor any preconditions or when-not-to-use case. Usage is inferable rather than stated.

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

release_taskA
DestructiveIdempotent

Release the exclusive lock on a task acquired via checkout_task, so another agent can take it. Releasing does not change the task's status or assignee. The lock is also released automatically when it expires.

NameRequiredDescriptionDefault
task_idYesTask ID to release.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations cover the safety profile (not read-only, destructive, idempotent, closed-world), and the description adds genuinely non-structured facts: status and assignee are unchanged, and the lock auto-expires. It does not cover failure modes such as releasing a lock you don't hold or an invalid task_id, which is the remaining gap.

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

Conciseness5/5

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

Three short sentences, front-loaded with the action and beneficiary, then the two behavioral caveats. Every sentence carries information that is not repeated elsewhere.

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 single-parameter release tool with annotations present and no output schema, this is nearly complete: purpose, effect on task state, and automatic expiry are all covered. Only error/edge behavior is unaddressed.

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?

Only one parameter with 100% schema description coverage, so the schema already carries the meaning. The description adds context that the task_id must be one you checked out, but nothing about identifier format or error behavior.

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 (release) and resource (exclusive lock on a task), and names the sibling that creates the lock (checkout_task). The agent can distinguish it from checkout_task/extend_checkout without opening any schema.

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

Usage Guidelines4/5

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

The description clearly implies the usage context: only relevant after acquiring a lock via checkout_task, to hand the task to another agent. It doesn't explicitly state when not to use it (e.g., if you never checked out, or if you still need the task), so it stops short of full routing guidance.

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

rememberA
DestructiveIdempotent

Save knowledge to persistent memory. Stores decisions, conventions, preferences. UPSERT by key — calling with same key updates the existing entry. Content is screened on write and REFUSED with a named reason (never silently stripped or stored) if it contains invisible/bidi characters, an LLM role tag, an instruction to ignore previous/system instructions, a PEM private key, a prefixed API token (sk-/ghp_/xox*/AKIA), or a literal assignment to a *_PASSWORD/_SECRET/_TOKEN/_API_KEY name. LIMITATION — this screen is partial and is not a secret filter: it cannot see a secret that has no recognisable prefix and no field name next to it (a bare value pasted on its own line), nor names it does not know. Credentials pasted here are not guaranteed to be caught; content stores where a secret lives, not its value.

NameRequiredDescriptionDefault
keyYesSlug key for UPSERT (e.g. 'api-convention', 'license-decision'). ENFORCED server-side as ^[a-z0-9][a-z0-9-]*[a-z0-9]$ — lowercase alphanumeric and hyphens only, at least two characters, no leading or trailing hyphen. Hyphens only, no colons: a colon-delimited key such as 'episode:alice:2026-09-07' is refused with a validation error — it is not normalised or accepted with a warning.
tagsNoTags for categorization and filtering. A kind: tag also SETS importance_score, which is what decides whether recall returns this entry at its default threshold of 0.3 — so the tag you choose is a retrieval decision, not a label. Base score by kind: kind:pinned 1.0, kind:incident 0.85, kind:decision 0.80, kind:preference 0.80, kind:learning 0.70, kind:fact 0.60, no kind: tag 0.50, kind:session-checkpoint 0.30. kind:session-checkpoint is a DOWNGRADE that overrides every other kind: tag on the same entry — tagging it alongside kind:decision yields 0.30, not 0.80. Any kind: value not in that list (e.g. kind:canonical-decision) is unrecognised and scores 0.50. Two boosts of +0.10 each, capped at 1.0: content mentioning icp / architecture / license / security / money, and a relevance:<n> tag whose n is >= 0.8.
scopeNoworkspace | project | agent (default: project).
reasonNoWhy this memory is worth writing — what a future thread should be able to do with it, or what changed if you are correcting an existing key. Recorded on the revision alongside the content, so a later reader can judge whether the entry still applies instead of guessing from the text alone. Optional today and about to become required; write it now.
contentYesWhat to remember (markdown).
relevanceNoRelevance score 0-1 (default 1.0 when omitted). NOT the same field as importance_score: relevance is a caller-set ranking hint, importance_score is computed from tags (see tags) and is the field min_importance filters on. A relevance:<n> TAG with n >= 0.8 does feed importance_score by +0.10; this numeric parameter does not.
thread_idNoThread identifier for same-session memory grouping. Auto-populated from the runner state file when omitted.
expires_atNoRFC3339 timestamp or Go duration (e.g. '72h') when this memory should expire.
project_idNoProject ID (required for project scope).
source_urlNoOptional URL/path to the source of this knowledge (task ID, PR, file path).
attach_contextNoWhen false, disables auto-injection of thread_id and source_task_id. Use for cross-cutting records not tied to the active task.
source_task_idNoUUID of the Mesh task that produced this memory. Auto-populated from the runner state file (FIDDLER_STATE_FILE) or the active checkout. Enables Amendment 2/3 KG edge hooks.
expected_versionNoMake the write conditional: it succeeds only if the stored version still matches this number, and is REFUSED with both version numbers if someone else wrote to the key in between. Pass the version returned by your previous remember/recall of this key. Omit for last-write-wins.

TDQS

A3.9/5.0
Behavior4/5

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

Goes well beyond the annotations: it discloses that writes are screened and REFUSED with a named reason rather than silently stripped or stored, enumerates the exact trigger classes, and then honestly bounds the screen's blind spots. The UPSERT note is consistent with idempotentHint=true and destructiveHint=true, but the description never states whether an update replaces or merges prior content and mentions revisions only implicitly.

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

Conciseness4/5

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

Front-loaded with purpose and UPSERT semantics before the screening detail, and the LIMITATION paragraph is clearly signposted. The enumerated trigger list is long but functional — each item prevents a failed write — though it could be tightened.

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 13-parameter mutation tool with a rich schema this is largely sufficient: purpose, overwrite model, refusal behaviour, and the secret-handling caveat are all present. What is missing is any statement of what a successful write returns (the version counter, inferred only from the expected_version param) and how this pairs with recall for retrieval.

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% and the 13 parameters carry their own detailed docs (key regex, kind: tag scoring, expected_version CAS semantics), so the schema does the heavy lifting. The tool description adds no parameter guidance beyond UPSERT-by-key, so baseline 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?

States a specific verb and resource ('Save knowledge to persistent memory') and narrows the payload ('decisions, conventions, preferences'), plus the crucial UPSERT-by-key behaviour, so an agent knows exactly what this writes. It does not name a sibling (recall, get_memory, forget, set_project_knowledge) or say how this differs from project-knowledge tools, which keeps it out of 5 territory.

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 clear context for when to write (durable decisions, conventions, preferences) and an explicit anti-use case: do not paste credentials, because the screen is partial and not a secret filter — 'content stores where a secret lives, not its value.' It stops short of routing the agent between this and set_project_knowledge/recall, so no explicit alternative is named.

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

remove_dependencyA
Destructive

Remove a dependency edge: task_id (the blocked card) no longer depends on depends_on_task_id. Clears a stray or reversed blocks link that holds a card open. Direction matters: the pair is given in the order add_dependency took it. reason is required and logged.

NameRequiredDescriptionDefault
reasonYesWhy the link is removed (min 10 chars); written to the server log.
task_idYesThe blocked task (the one that has the dependency).
depends_on_task_idYesThe blocker the edge points at.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, so the safety profile is covered. The description adds non-obvious behavior: the pair must be supplied in the same order add_dependency used, and a mandatory reason string is written to the server log, which signals an audited mutation. It does not say what happens when the edge does not exist or whether the removal is reversible.

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

Conciseness5/5

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

Three tight sentences: what it does, why you'd call it, then the ordering and logging constraints. No restatement of the name, no filler, constraints front-loaded where they matter.

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 three-parameter destructive mutation with no output schema and full schema coverage, the description covers purpose, direction, and audit behavior adequately. The remaining gap is edge-case behavior — whether a missing edge is an error or a no-op — which matters given idempotentHint=false.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description genuinely adds semantics: it clarifies the direction of the edge and that the argument order must mirror add_dependency, which the schema alone does not convey. It also confirms the reason parameter is required and logged, consistent with the schema's min-10-chars note.

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

Purpose5/5

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

States a specific verb and resource ('Remove a dependency edge') and immediately names the two identifiers and their roles (blocked card vs. blocker). It is clearly distinguishable from add_dependency and update_dependency, which the direction/order note reinforces.

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

Usage Guidelines4/5

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

Gives a concrete use case — clearing a stray or reversed blocks link that holds a card open — which tells the agent when this tool is appropriate rather than add_dependency or update_dependency. It stops short of an explicit exclusion rule (e.g., 'use update_dependency when the edge direction itself is correct but the target changes').

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

report_errorA

Report a failure you hit while working, so the team sees it instead of it staying in your log. With task_id, publishes an error event (tagged error and the severity, kept 72h) to that task's project, where get_context shows it. With recoverable=false it also sets your agent status to error in the team directory. It does not move the task or comment on it: use add_comment for that.

NameRequiredDescriptionDefault
task_idNoUUID of the task the error belongs to. Without it nothing is published to a project; only the agent status changes (and only when recoverable=false).
severityNoSeverity: low, medium (default), high or critical. Also added as an event tag.medium
recoverableNoDefault true. Pass false when you cannot continue: your agent status is then set to error.
stack_traceNoOptional stack trace, command output or other detail, stored in the event payload.
error_messageYesWhat went wrong, in a sentence or two. Required and non-empty; its first 100 characters become the event subject.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only declare this is a non-readonly, non-destructive, non-idempotent write; the description adds real operational detail — the event is tagged with 'error' plus severity, retained 72h, surfaced via get_context, and that recoverable=false mutates the agent's team-directory status. That is meaningful disclosure of side effects the annotations do not carry.

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

Conciseness5/5

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

Three sentences, each earning its place: purpose/effect first, conditional behavior second, exclusion third. No repetition of the schema field list and no filler.

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

Completeness5/5

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

No output schema exists, so the description must convey what happens on return; it does — event published with tags and 72h retention, visible via get_context, plus the agent-status side effect. For a 5-param write tool with one required field, nothing an agent needs before calling is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description earns a step up by explaining the cross-parameter consequence — without task_id nothing is published and only the status changes, and only when recoverable=false. It doesn't add syntax/format detail beyond the schema, but the interaction semantics are genuinely useful.

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?

Specific verb ('Report') plus resource ('a failure you hit while working'), immediately followed by the effect ('so the team sees it instead of it staying in your log'). It also explicitly fences itself off from add_comment, so an agent can distinguish it from siblings without opening the schema.

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

Usage Guidelines5/5

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

Gives the conditional when: pass task_id to publish to a task's project, pass recoverable=false to also set agent status to error. It states the exclusion explicitly — 'It does not move the task or comment on it: use add_comment for that' — which is exactly the when-not/alternative guidance the dimension asks for.

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

search_docsA
Read-onlyIdempotent

Full-text search a project's documents by title and body. Returns matching documents with a snippet and a path usable directly with get_doc — this is how you find a document when you don't already know its path; list_docs is the map, this is the index. SCOPE IS PER-PROJECT ONLY: results never cross project_id, and this is not a substitute for recall (which searches memory, not documents) or for a cross-project doc search (none exists yet). A query that matches nothing returns an empty items list, not an error. Documents saved before full-text search shipped (2026-08-20) are matched by title only until their next edit.

NameRequiredDescriptionDefault
limitNoMax results (default 20, server max 50).
queryYesSearch text. Matched against title and body.
project_idYesProject UUID. Search is scoped to this one project — call it once per project you need to check.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already cover read-only/idempotent/non-destructive, so the bar is lower, yet the description still adds genuinely useful behavior: an empty match returns an empty items list rather than an error, per-project scoping is hard, and a legacy-data caveat (pre-2026-08-20 docs match by title only until next edit). These are non-obvious traits an agent would otherwise discover by trial.

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, each carrying distinct payload: capability, return shape, routing versus siblings, and the two edge-case behaviors. The scoping constraint is capitalized and front-loaded in the middle rather than buried at the end.

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?

No output schema exists, and the description compensates by describing the return (matching documents with a snippet and a path) plus the empty-result case. For a 3-parameter read tool with full schema coverage and rich annotations, 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 schema already documents query, project_id and limit (including the default 20 / max 50). The description's scoping language ('results never cross project_id', 'call it once per project') largely restates what the project_id schema field already says, so it earns the baseline rather than extra credit.

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

Purpose5/5

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

States a specific verb and resource ('Full-text search a project's documents by title and body') and immediately distinguishes itself from the two nearest siblings: list_docs ('the map') and get_doc (its output path feeds it). An agent can identify the tool's role without opening any schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use ('this is how you find a document when you don't already know its path'), explicit when-not ('not a substitute for recall, which searches memory, not documents'), and notes that no cross-project doc search exists. This is about as complete a routing statement as a description can carry.

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

session_reportA

Report token usage and cost at the end of a session. Saves them on your agent session record and returns this session's tool-call stats and a compliance score (whether you loaded project context before acting). All parameters are optional; omitted or zero values are not recorded.

NameRequiredDescriptionDefault
modelNoLLM model used (e.g. 'claude-sonnet-4').
tokens_inNoTotal input tokens this session.
tokens_outNoTotal output tokens this session.
estimated_costNoEstimated cost in USD.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare a non-read-only, non-idempotent, non-destructive write, and the description adds real context beyond them: what gets persisted (agent session record), what comes back (tool-call stats, compliance score), and that omitted/zero values are silently dropped. It doesn't address repeated calls against the non-idempotent hint, which keeps it from a 5.

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

Conciseness5/5

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

Three tight sentences, front-loaded with purpose, then effect, then parameter behavior. Nothing redundant.

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 no output schema, the description reasonably carries the return burden by naming tool-call stats and a compliance score and defining the score's meaning. Details of the returned structure and any follow-up implications of a low compliance score are left implicit.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description adds meaning the schema cannot express — that every parameter is optional and that omitted or zero values are not recorded, which changes how an agent should fill them in.

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

Purpose5/5

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

States a specific verb and resource — report token usage and cost at session end — plus a secondary effect (saving to the agent session record). No sibling tool does anything comparable, so the agent can place it immediately.

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 timing guidance is explicit and actionable: call it at the end of a session. It doesn't name alternatives or say what to do if usage is unknown, but the intent is unambiguous.

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

set_human_gateA
DestructiveIdempotent

Arm the human gate on a task: freeze it and record WHO is waiting, WHAT was asked, and WHAT you will do if nobody answers. Records the whole ask on the task (who is waiting, what was asked, the default), so nothing has to re-read the thread; the '❓ Blocking @' comment marker is still recognised. recommended_default is REQUIRED: a gate with no stated default can only ever be resolved by finding a human. The call takes four answers (credential_exists / reversible / blocked_by_other_task / customer_visible_now), each with one line of justification. The server refuses the arm when the answers show nobody needs to be asked: the credential is held, the action is reversible, and nothing a customer sees or pays changes right now.

NameRequiredDescriptionDefault
classNo'hard' (default, never auto-released) or 'soft' (released by timeout — the release does NOT answer the question).
reasonYesThe question itself, in your own words.
task_idYesTask ID to gate.
deadlineNoRFC3339 timestamp when recommended_default applies. Omit for no deadline.
addresseeYes@name of the PERSON being asked. Must be a human in the workspace; an agent or unknown name is refused (gate_addressee_not_human). Agents are reached by assign_task, not by a gate.
copy_tierNoOnly when this ask is about VISIBLE PRODUCT COPY (a label, a page's prose, a message users read) — otherwise omit entirely. Answer three questions: (1) is this the company's voice going OUT, or a caption inside the interface? (2) would someone who never opened this screen notice the change? (3) does the text carry a promise — legal, price, product? Any "yes" → tier "A" (external/legal/marketing copy, a promise) and the workspace owner decides. All "no" → tier "B" (a field caption, menu item, system or validation message, section name, an existing dictionary string) and the product lead ships it without asking — the workspace owner sees it after the fact. The server refuses tier "B" outright: ship it yourself, tag the task `copy:b`, quote the exact string in your closing comment. Omitting copy_tier on an ask that reads as copy-approval is refused too, naming this field — state the tier and retry.
reversibleYesIs there a rollback anchor — git revert, backup, snapshot, image tag? If you can MANUFACTURE one (take a backup first), the answer is true.
supersedesNoOnly when the previous question on this task already has an answer: say what that answer does not cover. Without it the server refuses a repeat ask (repeat_ask_refused).
canonical_keyNoOptional stable key naming this question. If a human decision is already recorded under the same key, the server refuses the ask (repeat_ask_refused).
blocked_reasonYesOne line: which card, or why none.
customer_reasonYesOne line: what the customer would see, or why nothing changes for them now.
credential_existsYesDo you ALREADY hold the credential or access this needs? Check your team's credential store before answering false — a service account your team created for its agents is yours to use.
credential_reasonYesOne line: which credential, and where you checked.
reversible_reasonYesOne line: the exact rollback path, or why none exists.
recommended_defaultYesWhat you will do if nobody answers. Required — an ask with no default cannot time out.
customer_visible_nowYesDoes this change what a customer SEES or PAYS right now? A disabled gateway, an inactive flag or a reversible migration is NOT customer-visible; a rate that prints on invoices people already download is.
blocked_by_other_taskYesIs the thing you are waiting on actually ANOTHER card? If yes, the answer is add_dependency, not a gate — a blocks edge freezes the feed without adding anything to a human's queue.

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations (destructiveHint=true, idempotentHint=true), the description discloses server-side refusal behaviors the agent could not otherwise predict: refusal when the answers show nobody needs asking, a required recommended_default because 'a gate with no stated default can only ever be resolved by finding a human', and refusal when the addressee is an agent rather than a human. It also explains that the whole ask is persisted on the task so the thread needn't be re-read. This is materially richer than the annotation set.

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

Conciseness4/5

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

Front-loaded with the core action, then the required-default rationale, then the answer bundle, then the refusal rule. Every sentence carries information, though the required/default point is partly restated from the schema and a couple of sentences are long. Given 17 parameters, the length is proportionate.

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 17-parameter mutation with no output schema, the description covers the decision-relevant surface: what it records, what is mandatory, who may be addressed, and when the server will reject the call. The main gap is post-call state — it says the task is frozen but not how to unfreeze (clear_human_gate) or what the response contains.

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

Parameters4/5

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

Schema coverage is 100%, so 3 is the floor. The description still adds real meaning: it highlights that recommended_default is REQUIRED and why, names the four justification-carrying answers as a coherent set, and ties the refusal rule to specific combinations of those booleans. It does not touch class, deadline, copy_tier, supersedes or canonical_key, which is why it is not a 5.

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?

Opens with a specific verb+resource: 'Arm the human gate on a task: freeze it and record WHO is waiting, WHAT was asked, and WHAT you will do if nobody answers.' That is precise enough to separate it from clear_human_gate and from add_dependency, which the blocked_by_other_task parameter explicitly routes to.

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 states the disqualifying conditions clearly ('the credential is held, the action is reversible, and nothing a customer sees or pays changes right now'), which tells the agent when NOT to call it. It also flags the legacy '❓ Blocking @<person>' comment marker as an alternative mechanism. It never explicitly contrasts with the sibling clear_human_gate, so the alternative side is slightly thin.

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

set_project_knowledgeA
DestructiveIdempotent

Write a structured fact to project knowledge. UPSERT by key — calling with same key updates the existing entry. Stores deploy URLs, stack conventions, gotchas. These facts are visible via get_project_knowledge.

NameRequiredDescriptionDefault
keyYesSlug key for UPSERT (e.g. 'deploy-url', 'stack-convention'). Same enforced pattern as remember: ^[a-z0-9][a-z0-9-]*[a-z0-9]$ — hyphens only, no colons; a colon-delimited key is refused, not normalised.
tagsNoAdditional tags for filtering.
valueYesThe knowledge to store (markdown, max 4000 chars).
categoryNoOptional category: deploy, stack, conventions, gotchas, api, auth, etc.
thread_idNoThread identifier. Auto-populated from the runner state file when omitted.
project_idYesProject ID to store knowledge for.
source_urlNoOptional URL/path to the source of this knowledge.
attach_contextNoWhen false, disables auto-injection of thread_id and source_task_id.
source_task_idNoUUID of the Mesh task that produced this fact. Auto-populated from the runner state file when omitted.

TDQS

A3.7/5.0
Behavior4/5

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

The description discloses the key behavioral fact beyond annotations: calling with the same key updates rather than duplicates (consistent with idempotentHint=true), which explains the destructiveHint=true overwrite in practical terms. It omits auth requirements and any statement about what prior value is lost on overwrite, so it stops short of fully carrying the mutation burden.

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?

Three short sentences, front-loaded with the action and the UPSERT rule before the content examples. No filler; the only mild redundancy is restating the read path that the tool name already implies.

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 9-parameter write tool with no output schema and full schema coverage, the description covers action, idempotency behavior, intended content, and retrievability. It could be stronger by clarifying the boundary with `remember` and the consequences of overwriting an existing key, but 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%, so every one of the 9 parameters is already documented in the schema, including the key slug pattern, the 4000-char value limit, and thread_id/source_task_id auto-population. The description adds only the UPSERT framing, which the schema key field already reinforces — baseline 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?

Specific verb+resource ("Write a structured fact to project knowledge") plus explicit UPSERT-by-key semantics, which tells the agent this is a write/update tool rather than a pure insert. It names the read counterpart get_project_knowledge, but never distinguishes itself from the very similar `remember` sibling except obliquely inside the schema's key description.

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?

"Stores deploy URLs, stack conventions, gotchas" gives concrete content cues, and "visible via get_project_knowledge" points at the companion read tool. However there is no explicit when-to-use vs when-not-to-use guidance, and with `remember` sitting in the sibling list an agent would reasonably want a rule for choosing between them.

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

subscribe_eventsA
Idempotent

Configure push notification delivery for task events. Optionally sets a callback URL that Mesh will POST events to. Returns SSE and long-poll endpoint URLs for alternative delivery mechanisms.

NameRequiredDescriptionDefault
project_idYesProject ID.
event_typesNoEvent types to subscribe to.
callback_urlNoOptional URL where Mesh will POST task events (task.assigned, task.created, task.status_changed). Leave empty to only use SSE or long-polling.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations cover the safety profile (idempotentHint=true, destructiveHint=false, readOnlyHint=false, openWorldHint=false), so the bar is lower. The description adds genuinely new behavioral context: it discloses that the call returns SSE and long-poll endpoint URLs and that the callback is optional, which annotations do not convey. It stops short of stating permissions or what happens to existing subscriptions on re-call.

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

Conciseness5/5

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

Three tight sentences, front-loaded with the core purpose followed by the callback option and the returned endpoints. Every sentence earns its place and nothing is padded.

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 no output schema, the description usefully compensates by naming the returned endpoint URLs for SSE and long-poll delivery. It still leaves open what the response looks like when only a callback is configured and how repeated calls interact with idempotencyHint, but for a 3-param tool it is substantially 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?

Schema description coverage is 100% and all three parameters are documented in the schema, including the callback_url POST behavior and the empty-value fallback. The description overlaps with rather than extends that coverage, so 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?

States a specific verb and resource: 'Configure push notification delivery for task events.' An agent can tell it is about subscribing to event delivery rather than publishing (publish_event) or polling (poll_tasks). However, it does not explicitly name or contrast with those siblings, so differentiation is left to inference.

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 implicitly signals when to use it ('Configure push notification delivery') and mentions alternative delivery mechanisms (SSE, long-poll) inside the tool. But it never states when to choose this over poll_tasks or publish_event, nor any prerequisites for subscribing, so usage context is only implied.

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

trigger_recurring_nowA

Immediately creates the next instance of a recurring schedule, without waiting for the scheduled time. Useful for testing or urgent execution.

NameRequiredDescriptionDefault
recurring_schedule_idYesUUID of the recurring schedule.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, openWorldHint=false, and idempotentHint=false. The description adds the key behavioral fact that it creates the next instance immediately, but it does not clarify whether repeated calls create multiple instances or how the schedule itself is affected.

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, front-loaded with the action and followed by the use case. There is no wasted wording and the description is appropriately sized for a single-parameter action tool.

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 simple one-parameter trigger with no output schema and clear annotations, the description covers what it does and when it is useful. It could be slightly more complete by noting whether repeated calls produce duplicate instances or whether the original schedule is modified.

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%, and the schema already documents recurring_schedule_id as the UUID of the recurring schedule. The description adds no additional parameter meaning, so 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 states a specific verb and resource: it immediately creates the next instance of a recurring schedule without waiting for the scheduled time. This clearly distinguishes it from schedule-creation tools like create_recurring_task, but it does not explicitly name or contrast itself with any sibling tool.

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: 'Useful for testing or urgent execution.' That tells the agent when this tool is appropriate, but it offers no exclusions or explicit alternatives, so it falls short of the top score.

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

update_agent_profileA
DestructiveIdempotent

Update the calling agent's own profile fields such as role, capabilities, responsibility zone, and working hours. Only the fields you pass are sent; omitted ones keep their values. It cannot edit another agent.

NameRequiredDescriptionDefault
roleNoAgent role (e.g. developer, reviewer, tester).
modelNoModel this agent runs on (max 128 chars). Empty string clears it.
agent_typeNoHarness this agent runs in: claude_code, codex, cursor, copilot, gemini_cli, openclaw, cline, aider, hermes, custom.
descriptionNoHuman-readable description of the agent's purpose.
accepts_fromNoAgent IDs or types this agent accepts tasks from.
callback_urlNoURL where Mesh will POST task events (task.assigned, task.status_changed, task.commented). Set to empty string to disable.
capabilitiesNoList of capability strings (e.g. go, react, testing).
escalation_toNoAgent ID or name to escalate issues to.
working_hoursNoWorking hours description (e.g. 24/7, 9-17 UTC).
responsibility_zoneNoArea of responsibility (e.g. Backend, Frontend).
max_concurrent_tasksNoMaximum number of tasks this agent works on at once, a positive integer. Shown in the team directory for whoever assigns work. Omit to leave it unchanged.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructive=true, idempotent=true, and readOnly=false, so the agent knows the safety profile. The description adds useful behavioral context beyond annotations: partial-update semantics and the self-only restriction. It does not explain auth requirements or side effects in depth, but the added context is meaningful.

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

Conciseness5/5

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

Three short sentences, front-loaded with the action and scope, then the partial-update rule, then the boundary condition. No wasted wording.

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 an 11-parameter mutation tool with no output schema, the description covers the essential call semantics: self-only scope and partial updates. Annotations cover the destructive/idempotent profile, though return behavior and auth requirements are not described, leaving a minor gap.

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%, so all 11 parameters are already documented in the input schema. The description adds the partial-update principle and names a few example fields, but does not add per-parameter meaning beyond what the schema provides, so the baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb and resource, 'Update the calling agent's own profile fields,' and adds the self-only scope with 'It cannot edit another agent.' This makes it clearly distinguishable from agent-registration or team-directory siblings.

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

Usage Guidelines4/5

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

Explains the key usage condition that only passed fields are sent while omitted fields retain their values, and explicitly excludes editing another agent. It does not name alternative tools, but the context is clear enough for correct selection.

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

update_dependencyA
Destructive

Set the condition and/or evidence_url of an existing dependency edge (task_id depends on depends_on_task_id). Evidence on a non-task_done edge marks the condition met now and releases the dependent even though the blocker is not done; an empty evidence_url re-arms the edge.

NameRequiredDescriptionDefault
task_idYesThe blocked task (the one that has the dependency).
conditionNoWhat a blocks edge waits for. task_done (default): the blocker reaches done or cancelled. access_ready / contract_ready / artifact_published: released by evidence_url, or when the blocker reaches done or cancelled. shipped: the blocker is marked shipped or reaches done (cancelled does not release it). deployed: the blocker is marked shipped or a VCS link of it has a recorded deploy (see mark_vcs_deployed); merged/done alone does not release it. accepted: the blocker reaches done (cancelled does not release it). Evidence (evidence_url) releases an edge of any condition.
evidence_urlNoProof the condition holds; empty string clears it.
depends_on_task_idYesThe blocker the edge points at.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true and idempotentHint=false, but the description adds genuinely non-obvious semantics: evidence can release a dependent while the blocker is still unfinished, and clearing evidence_url re-arms (re-blocks) the edge. That is real behavioral value beyond the annotations. It stops short of saying what the call returns or how re-arming affects an already-running dependent.

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

Conciseness4/5

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

Two sentences with no filler, and the identity of the resource is front-loaded before the behavioral caveats. The second sentence is dense and semicolon-joined, requiring a second read, but every clause carries 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?

For a mutation tool with no output schema and full schema coverage, the description covers the semantics an agent needs to avoid misuse, including the surprising evidence-release behavior. The remaining gap is the response/return behavior and whether the call fails when the edge does not exist.

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 schema already documents every parameter including the enum values and the 'empty string clears it' rule. The description reinforces that condition and evidence_url are the two settable fields and adds the 're-arms' framing, but contributes no syntax or format detail the schema lacks. Baseline 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?

States a specific verb ('Set') and resource ('the condition and/or evidence_url of an existing dependency edge') and defines the edge direction explicitly as 'task_id depends on depends_on_task_id'. This clearly separates it from add_dependency/remove_dependency by scoping it to an 'existing' edge, though it never names those siblings directly.

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

Usage Guidelines3/5

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

Usage is conveyed indirectly through consequences: 'Evidence on a non-task_done edge marks the condition met now and releases the dependent' and 'an empty evidence_url re-arms the edge' tell an agent why it would call this. However, there is no explicit statement of when to prefer this over add_dependency (create) or remove_dependency (delete), nor any stated prerequisites such as the edge already existing.

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

update_docA
DestructiveIdempotent

Edit a document. To change ONE section, pass section= with body=<that section's new text, heading line included>: only that section is replaced and the rest of the document is kept. Without section, body is the WHOLE document — never send back the text of a single section as body (the server refuses a body that halves the document and drops its headings, unless allow_shrink=true). Replacing the body REQUIRES base_version — the version you got from get_doc — and the write is refused with a 409 if anyone changed the document since, so you can never silently overwrite someone else's edit. The append parameter adds to the end: it needs no base_version, cannot conflict, and needs no prior read of the document. The doc argument accepts an old path or a bare slug too; the reply then carries moved_to (the current path). Note the two different 409s: a stale base_version, and an ambiguous bare slug (resolved by the full path or UUID).

NameRequiredDescriptionDefault
docYesDocument UUID, or a slug path like 'architecture/adr/adr-004' (a path also needs project_id). A path survives the document being moved: the old path still resolves, and so does a bare slug ('adr-004') when exactly one live document in the project has it. When the reference was not the live path, the reply carries moved_to — the document's current path; use that from now on. A bare slug shared by several documents is a 409 ('Ambiguous document slug') listing the full paths: pick one and repeat the call with the full path or the UUID. The UUID never changes.
bodyNoReplacement markdown for the WHOLE document, or for the one section named by section. Requires base_version.
titleNoNew title.
appendNoText to add to the END of the document. No base_version needed. Cannot be combined with body.
sectionNoHeading text or anchor of the one section to replace (as in get_doc section=). body is then that section's new text, heading line included; the rest of the document is untouched.
positionNoNew sort position among siblings.
parent_idNoNew parent document UUID.
project_idNoProject UUID. Required only when doc is a slug path.
allow_shrinkNoOnly for a deliberate whole-document replacement that drops sections: lifts the guard that refuses a body halving the document.
base_versionNoThe version you read from get_doc. Required for any write other than append.

TDQS

A4.7/5.0
Behavior5/5

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

Goes well past the annotations: it discloses optimistic-concurrency semantics (409 on stale base_version, 'you can never silently overwrite'), the shrink guard and how allow_shrink lifts it, the second 409 for ambiguous slugs, and that append is conflict-free. destructiveHint=true is only meaningful because the description explains what is destroyed and under what guard.

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

Conciseness4/5

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

Front-loaded with the primary distinction (one section vs whole document) and dense with useful content throughout. Slight redundancy in the closing 'two different 409s' sentence, which largely restates slug-ambiguity detail already present in the doc parameter's schema description, but nothing else is padding.

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 10-parameter mutation tool with no output schema, this covers the high-risk paths thoroughly: conflict handling, the shrink guard, reference resolution, and moved_to in the reply. One gap remains — it never says the reply returns the new version, which the caller needs to chain a follow-up write after a successful edit.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description earns more by explaining parameter interaction rather than restating fields: section+body must be used together, append cannot be combined with body, and base_version's requirement is conditional on the mode. title, position, and parent_id are left entirely to the schema, which is acceptable given full 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?

Opens with a specific verb+resource ('Edit a document') and immediately decomposes it into three distinct modes (section-replace, whole-body replace, append), which is exactly the distinction an agent needs. A caller can tell this apart from create_doc, get_doc, and comment_doc without opening any schema.

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

Usage Guidelines5/5

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

Explicitly routes between modes: 'To change ONE section, pass section=... with body=...' versus 'Without section, body is the WHOLE document', plus append's separate rules ('needs no base_version, cannot conflict, and needs no prior read'). It also states a negative case — never send a single section's text as a whole-document body — and names get_doc as the source of base_version.

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

update_recurring_scheduleA
DestructiveIdempotent

Update an existing recurring task schedule. Change title, description, frequency, assignee, priority, or deactivate it. Only the fields you pass change; instances already created are not edited.

NameRequiredDescriptionDefault
priorityNoNew priority: urgent, high, medium, low, none.
timezoneNoNew IANA timezone.
cron_exprNoNew cron expression (for custom frequency).
frequencyNoNew frequency: daily, weekly, monthly, custom.
is_activeNoSet to false to pause the schedule.
assignee_idNoNew assignee UUID.
assignee_typeNoNew assignee type: user, agent, unassigned.
title_templateNoNew title template. Supports {{.Date}}, {{.Number}}, {{.Week}}, {{.Month}}.
description_templateNoNew description template. Supports {{.PrevSummary}}.
recurring_schedule_idYesUUID of the recurring schedule to update.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations declare destructiveHint=true and idempotentHint=true; the description adds non-obvious semantics that annotations cannot convey — the update is a partial patch and pre-existing instances are left untouched, plus deactivation is available via a flag. It stops short of explaining what the destructive flag actually destroys (future instance generation) or any permission requirements.

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

Conciseness5/5

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

Three short sentences, front-loaded with the action, followed by scope and the one caveat that matters. Nothing is redundant with the schema or wasted.

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

Completeness4/5

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

For a 10-parameter, single-required-field mutation with 100% schema coverage and no output schema, the description covers purpose, patch semantics, and side-effect boundaries. Minor gaps remain around return shape and whether the destructive flag implies irreversible loss of pending instances.

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%, so every parameter (including template placeholders and enum-like value lists) is already documented in the schema. The description only summarizes the field families (title, description, frequency, assignee, priority) and adds no syntax, defaulting, or interaction detail beyond that. Baseline 3 applies when the schema does the heavy lifting.

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?

Opens with a specific verb and resource ("Update an existing recurring task schedule") and immediately enumerates the mutable surface, which cleanly separates it from create_recurring_task, delete_recurring_schedule, and trigger_recurring_now. An agent knows exactly what class of operation this is without opening the schema.

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

Usage Guidelines4/5

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

"Only the fields you pass change; instances already created are not edited" gives the agent a decision rule: use this for template-level changes and go elsewhere (e.g. update_task) to touch generated instances. No explicit when-not or named alternative, 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.

update_taskA
DestructiveIdempotent

Update task fields. Returns a lean confirmation by default (id, status_id, assignee, updated_at) — the card's static fields are not echoed back; full=true or get_task returns them.

NameRequiredDescriptionDefault
fullNoReturn the complete updated task (all fields, verbatim) instead of the lean confirmation (id, status_id, assignee, updated_at).
titleNoNew title.
labelsNoNew labels.
task_idYesTask ID.
due_dateNoDue date in RFC3339 format. Pass an empty string to clear it.
priorityNoNew priority.
descriptionNoNew description.
start_afterNoDon't surface/feed this task before this RFC3339 timestamp. Independent of due_date. Pass an empty string to clear it.
custom_fieldsNoCustom field values to update.
estimated_hoursNoEstimated hours.
delegation_levelNoRouting after work: auto, review, or supervised.
completion_signalNoMark agent-side work as finished.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare the safety profile (destructiveHint=true, idempotentHint=true, readOnlyHint=false), so the description is not required to restate that. It adds genuinely useful behavioral context about the default return shape — a lean confirmation with id, status_id, assignee, updated_at — and that static fields are not echoed, which is valuable since there is no output schema. It stops short of explaining partial-update semantics or what the destructive behavior actually overwrites.

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, front-loaded with the core action and then the return-shape caveat. Nothing is redundant, and the most important non-obvious detail (lean confirmation by default) is surfaced immediately.

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 12-parameter mutation tool with no output schema, the description does well to document the return shape, which is otherwise missing. But it leaves significant gaps: whether updates are partial or overwrite existing values, how custom_fields are merged, and what the destructive annotation means in practice. The schema fills in parameter docs, but the description should do more for a tool of this complexity.

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

Parameters3/5

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

Schema description coverage is 100%, so all twelve parameters, including full and custom_fields, are already documented in the schema. The description only echoes the full=true behavior, which the schema already explains in detail, so it adds little parameter meaning beyond the structured fields. Baseline 3 applies when the schema carries the burden.

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 opens with a specific verb and resource ("Update task fields"), which is clear at a glance. It distinguishes itself from the read path by naming get_task, but does not differentiate from other mutating siblings such as assign_task or move_task, so sibling separation is incomplete.

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 usage (update task fields) and usefully points to get_task or full=true when the full card is needed. However, it gives no explicit when-to-use versus alternatives like assign_task, move_task, or checkout_task, and no exclusions or prerequisites for a mutation tool.

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

upload_artifactC

Upload an artifact (file, code, log, etc.) to a task. Downloading an artifact is two GETs. Step 1: GET /api/v1/artifacts//download with header X-Agent-Key: -> 200 JSON {"url": ""}. Step 2: GET that url with NO headers -> 200, the file bytes. Pitfalls: on step 1 only X-Agent-Key is accepted (X-API-Key and Authorization: Bearer give 401); on step 2 any extra header, Authorization in particular, breaks the presigned signature (400). The artifact's download_path is step 1's path. browser_only_url is a human page and answers 401 to an agent key by design. Content is sent inline, so a binary larger than a few KB may be truncated in transit.

NameRequiredDescriptionDefault
nameYesArtifact filename.
sha256NoOptional hex sha256 of the DECODED bytes. Verified before upload; a mismatch fails the call. Recommended for binary, since it is the only check that catches a payload truncated in transit.
contentYesArtifact content. Plain text by default; set encoding="base64" to send binary.
task_idYesTask ID.
encodingNoHow to interpret content: "text" (stored as-is) or "base64" (decoded before storing). Required for binary — without it a base64 string is stored literally as the file body.text
metadataNoAdditional metadata, stored on the artifact as JSON.
mime_typeNoMIME type. Auto-detected from name if omitted. For png/jpeg/gif/pdf/zip the content is checked against the type's magic bytes and the upload is refused on a mismatch.
artifact_typeNoCategory used to label and filter the artifact: file (default), code, log, report, link, image or data. It does not affect how content is decoded; encoding and mime_type do.file

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare this is a non-readonly, non-destructive, non-idempotent, closed-world write, and the schema covers sha256 verification, magic-byte checks, and base64 decoding. The description still adds genuine value with the warning that inline content over a few KB may be truncated in transit, but it omits upload-side behavior such as auth requirements, overwrite semantics, and what the call returns.

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

Conciseness2/5

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

The purpose is front-loaded in one sentence, but the bulk of the text is a two-step download recipe with pitfall notes that belongs on get_artifact. For an upload tool, most of these sentences do not earn their place and dilute the actionable content.

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

Completeness2/5

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

With 8 parameters, a nested metadata object, and no output schema, the description should say what an upload returns (artifact id? download_path?) so the agent can chain into retrieval, and it should state auth and overwrite behavior. Neither is covered; the download details do not substitute for upload-side completeness.

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 each parameter carries a substantive description, so the schema does the heavy lifting. The description adds only an indirect hint about content size and encoding ('sent inline... may be truncated'), which is baseline-appropriate but not additive.

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 opening clause states a specific verb and resource: 'Upload an artifact (file, code, log, etc.) to a task.' However, the majority of the description then describes the download protocol, which is a different operation, and it never distinguishes this tool from siblings like get_artifact or list_artifacts.

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

Usage Guidelines2/5

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

There is no statement of when to use this tool versus alternatives (e.g., create_doc for documents, list_artifacts to inspect existing artifacts), and no prerequisites or required permissions for uploading. The download walkthrough is instructions for a different task, not usage guidance for this one.

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. 31 tool updatesv0.1.6
    • Changedadd_dependency4 fields changed
      • addedInput schema / properties / condition
        Added value: +{
        +  "description": "What a blocks edge waits for. task_done (default): the blocker reaches done or cancelled. access_ready / contract_ready / artifact_published: released by evidence_url, or when the blocker reaches done or cancelled. shipped: the blocker is marked shipped or reaches done (cancelled does not release it). deployed: the blocker is marked shipped or a VCS link of it has a recorded deploy (see mark_vcs_deployed); merged/done alone does not release it. accepted: the blocker reaches done (cancelled does not release it). Evidence (evidence_url) releases an edge of any condition. Only for blocks edges. Use a non-default condition when the blocker is a perpetual monitor/recurring card that never reaches done. The response carries `warning` when a blocks edge targets such a card, and `condition_satisfied` (true when the edge no longer holds the dependent).",
        +  "enum": [
        +    "task_done",
        +    "access_ready",
        +    "contract_ready",
        +    "artifact_published",
        +    "shipped",
        +    "deployed",
        +    "accepted"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / depends_on_task_id / description
        Previous value: -"ID of the task this depends on."New value: +"UUID of the blocker: the task that must be done (or meet condition) first. Must differ from task_id. Direction matters; swapping the two makes the blocker wait instead."
      • addedInput schema / properties / evidence_url
        Added value: +{
        +  "description": "Proof that the condition already holds (link to the artifact, check or comment). With a non-task_done condition it releases the edge at once; otherwise set it later with update_dependency.",
        +  "type": "string"
        +}
      • changedInput schema / properties / task_id / description
        Previous value: -"Task ID."New value: +"UUID of the dependent task: the one that waits."
    • Changedadd_vcs_link12 fields changed
      • addedInput schema / properties / acceptance_by
        Added value: +{
        +  "description": "Who accepted.",
        +  "type": "string"
        +}
      • addedInput schema / properties / acceptance_evidence_url
        Added value: +{
        +  "description": "Link to the acceptance proof.",
        +  "type": "string"
        +}
      • addedInput schema / properties / acceptance_result
        Added value: +{
        +  "description": "Delivery state: live acceptance result, passed or failed — separate from CI and deploy. Add acceptance_by, acceptance_evidence_url and acceptance_sha for who, proof and the commit it covered.",
        +  "type": "string"
        +}
      • addedInput schema / properties / acceptance_sha
        Added value: +{
        +  "description": "Commit the acceptance covered, 40 hex.",
        +  "type": "string"
        +}
      • addedInput schema / properties / ci_pipeline_id
        Added value: +{
        +  "description": "Pipeline id of the CI verdict.",
        +  "type": "number"
        +}
      • addedInput schema / properties / ci_sha
        Added value: +{
        +  "description": "Commit the CI verdict ran on, 40 hex.",
        +  "type": "string"
        +}
      • addedInput schema / properties / ci_status
        Added value: +{
        +  "description": "Delivery state: CI verdict status (pending, running, success, failed, canceled, skipped, manual). Use ci_pipeline_id and ci_sha for the pipeline and commit it ran on.",
        +  "type": "string"
        +}
      • addedInput schema / properties / deployed_at
        Added value: +{
        +  "description": "RFC3339 deploy time; defaults to now.",
        +  "type": "string"
        +}
      • addedInput schema / properties / deployed_sha
        Added value: +{
        +  "description": "Delivery state: the commit now running in `environment`, 40 hex. Requires environment. The link counts as shipped only when this equals merged_sha on environment=prod. Reporting the same sha and environment again keeps the first deployed_at.",
        +  "type": "string"
        +}
      • addedInput schema / properties / environment
        Added value: +{
        +  "description": "Environment of deployed_sha, e.g. prod or staging.",
        +  "type": "string"
        +}
      • addedInput schema / properties / implementation_sha
        Added value: +{
        +  "description": "Delivery state (pr links): the commit the change was implemented at, 40 hex.",
        +  "type": "string"
        +}
      • addedInput schema / properties / merged_sha
        Added value: +{
        +  "description": "Delivery state: the commit the MR merged as on the target branch, 40 hex.",
        +  "type": "string"
        +}
    • Changedcreate_task1 field changed
      • changedInput schema / properties / project_id / description
        Previous value: -"Project ID."New value: +"UUID of the project to create the task in (list_projects returns ids)."
    • Changedforget1 field changed
      • changedInput schema / properties / memory_id / description
        Previous value: -"UUID of the memory to delete."New value: +"UUID of the memory to delete: the id field of a recall(full=true) result, not its key."
    • Changedget_assignment_rules1 field changed
      • changedInput schema / properties / project_id / description
        Previous value: -"Project ID."New value: +"Project UUID, from list_projects."
    • Changedget_context1 field changed
      • changedInput schema / properties / project_id / description
        Previous value: -"Project ID."New value: +"UUID of the project whose recent activity to read (list_projects returns ids)."
    • Changedget_my_rules1 field changed
      • changedInput schema / properties / project_id / description
        Previous value: -"Optional project ID to get project-specific effective rules."New value: +"Optional project UUID. With it, returns the effective rules for that project (workspace rules merged with the project's own); without it, workspace-level rules only."
    • Changedget_project1 field changed
      • changedInput schema / properties / project_id / description
        Previous value: -"Project ID."New value: +"Project UUID, from list_projects."
    • Changedget_project_knowledge1 field changed
      • changedInput schema / properties / project_id / description
        Previous value: -"Project UUID."New value: +"UUID of the project whose knowledge to load (list_projects returns ids)."
    • Changedget_project_rules1 field changed
      • changedInput schema / properties / project_id / description
        Previous value: -"Project ID."New value: +"Project UUID, from list_projects."
    • Addedget_project_updates
    • Changedget_task1 field changed
      • changedInput schema / properties / include_vcs_links / description
        Previous value: -"Include linked PRs/MRs/commits/branches (id, provider, link_type, external_id, url, status, created_at) — use this instead of a raw REST call to diagnose a misclassified or stuck-status link."New value: +"Include linked PRs/MRs/commits/branches (id, provider, link_type, external_id, url, status, created_at, plus delivery{implementation_sha, ci_verdict, merged_sha, deployed, acceptance} and a derived is_shipped) — use this instead of a raw REST call to diagnose a misclassified or stuck-status link."
    • Changedget_workflow_rules1 field changed
      • changedInput schema / properties / project_id / description
        Previous value: -"Project ID."New value: +"Project UUID, from list_projects."
    • Changedheartbeat1 field changed
      • changedInput schema / properties / status / description
        Previous value: -"Agent status: online, busy, error."New value: +"Agent status shown in the team directory: online, busy or error. Use error only when you cannot work; report_error records why."
    • Changedimport_workspace_config1 field changed
      • changedInput schema / properties / yaml_content / description
        Previous value: -"YAML configuration content as a string."New value: +"The complete YAML document as one string, in the format export_workspace_config returns (export, edit, import). Required and non-empty; the server rejects YAML it cannot parse."
    • Changedlist_docs1 field changed
      • changedInput schema / properties / include_archived / description
        Previous value: -"Include archived documents."New value: +"Also list archived documents. Default false: only live documents."
    • Changedlist_projects2 fields changed
      • changedInput schema / properties / include_archived / description
        Previous value: -"Include archived projects."New value: +"Also list archived projects. Default false: only active projects are returned."
      • changedInput schema / properties / workspace_id / description
        Previous value: -"Workspace ID. Defaults to agent's workspace."New value: +"Workspace UUID. Defaults to the calling agent's workspace; another workspace is only readable if your key belongs to it."
    • Changedlist_recurring_schedules2 fields changed
      • changedInput schema / properties / active_only / description
        Previous value: -"Only return active schedules."New value: +"Default true: only active schedules. Pass false to also see paused ones (is_active=false)."
      • changedInput schema / properties / project_id / description
        Previous value: -"Project ID."New value: +"Project UUID, from list_projects."
    • Changedlist_sub_agents2 fields changed
      • changedInput schema / properties / agent_id / description
        Previous value: -"Parent agent ID. Defaults to the calling agent."New value: +"UUID of the parent agent whose sub-agents to list. Omit for the calling agent; get_team_directory gives other agents' ids."
      • changedInput schema / properties / recursive / description
        Previous value: -"Return all descendants (up to 10 levels deep)."New value: +"Return all descendants (up to 10 levels deep) instead of direct children only. Default false."
    • Addedmark_vcs_deployed
    • Addedpost_project_update
    • Changedrecall1 field changed
      • changedInput schema / properties / include_archived / description
        Previous value: -"Include archived memories in results (default false)."New value: +"Also return archived memories (retired by their owner or by review but kept for history). Default false: only live memories."
    • Changedregister_sub_agent3 fields changed
      • changedInput schema / properties / agent_type / description
        Previous value: -"Agent type: claude_code, openclaw, cline, aider, custom."New value: +"Harness the sub-agent runs in: claude_code (Claude Code CLI), openclaw, cline, aider, or custom for anything else."
      • changedInput schema / properties / capabilities / description
        Previous value: -"Agent capabilities as key-value pairs."New value: +"Optional key-value map of what the sub-agent can do, e.g. {\"languages\": [\"go\"]}, stored on its profile."
      • changedInput schema / properties / name / description
        Previous value: -"Sub-agent name."New value: +"Display name of the sub-agent, as it should appear in the team directory."
    • Changedremember1 field changed
      • changedInput schema / properties / key / description
        Previous value: -"Slug key for UPSERT (e.g. 'api-convention', 'license-decision'). ENFORCED server-side as ^[a-z0-9][a-z0-9-]*[a-z0-9]$ — lowercase alphanumeric and hyphens only, at least two characters, no leading or trailing hyphen. Hyphens, NEVER colons: a colon-delimited key such as 'episode:alice:2026-09-07' is REFUSED with a validation error — it is not normalised or accepted with a warning."New value: +"Slug key for UPSERT (e.g. 'api-convention', 'license-decision'). ENFORCED server-side as ^[a-z0-9][a-z0-9-]*[a-z0-9]$ — lowercase alphanumeric and hyphens only, at least two characters, no leading or trailing hyphen. Hyphens only, no colons: a colon-delimited key such as 'episode:alice:2026-09-07' is refused with a validation error — it is not normalised or accepted with a warning."
    • Changedreport_error5 fields changed
      • changedInput schema / properties / error_message / description
        Previous value: -"Error message."New value: +"What went wrong, in a sentence or two. Required and non-empty; its first 100 characters become the event subject."
      • changedInput schema / properties / recoverable / description
        Previous value: -"Whether the error is recoverable."New value: +"Default true. Pass false when you cannot continue: your agent status is then set to error."
      • changedInput schema / properties / severity / description
        Previous value: -"Severity: low, medium, high, critical."New value: +"Severity: low, medium (default), high or critical. Also added as an event tag."
      • changedInput schema / properties / stack_trace / description
        Previous value: -"Stack trace or details."New value: +"Optional stack trace, command output or other detail, stored in the event payload."
      • changedInput schema / properties / task_id / description
        Previous value: -"Related task ID."New value: +"UUID of the task the error belongs to. Without it nothing is published to a project; only the agent status changes (and only when recoverable=false)."
    • Changedset_human_gate4 fields changed
      • addedInput schema / properties / addressee
        Added value: +{
        +  "description": "@name of the PERSON being asked. Must be a human in the workspace; an agent or unknown name is refused (gate_addressee_not_human). Agents are reached by assign_task, not by a gate.",
        +  "type": "string"
        +}
      • addedInput schema / properties / canonical_key
        Added value: +{
        +  "description": "Optional stable key naming this question. If a human decision is already recorded under the same key, the server refuses the ask (repeat_ask_refused).",
        +  "type": "string"
        +}
      • addedInput schema / properties / supersedes
        Added value: +{
        +  "description": "Only when the previous question on this task already has an answer: say what that answer does not cover. Without it the server refuses a repeat ask (repeat_ask_refused).",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "task_id",
        -  "reason",
        -  "recommended_default",
        -  "credential_exists",
        -  "credential_reason",
        -  "reversible",
        -  "reversible_reason",
        -  "blocked_by_other_task",
        -  "blocked_reason",
        -  "customer_visible_now",
        -  "customer_reason"
        -]New value: +[
        +  "task_id",
        +  "reason",
        +  "recommended_default",
        +  "addressee",
        +  "credential_exists",
        +  "credential_reason",
        +  "reversible",
        +  "reversible_reason",
        +  "blocked_by_other_task",
        +  "blocked_reason",
        +  "customer_visible_now",
        +  "customer_reason"
        +]
    • Changedset_project_knowledge1 field changed
      • changedInput schema / properties / key / description
        Previous value: -"Slug key for UPSERT (e.g. 'deploy-url', 'stack-convention'). Same enforced pattern as remember: ^[a-z0-9][a-z0-9-]*[a-z0-9]$ — hyphens, NEVER colons; a colon-delimited key is REFUSED, not normalised."New value: +"Slug key for UPSERT (e.g. 'deploy-url', 'stack-convention'). Same enforced pattern as remember: ^[a-z0-9][a-z0-9-]*[a-z0-9]$ — hyphens only, no colons; a colon-delimited key is refused, not normalised."
    • Changedupdate_agent_profile1 field changed
      • changedInput schema / properties / max_concurrent_tasks / description
        Previous value: -"Maximum number of concurrent tasks this agent can handle."New value: +"Maximum number of tasks this agent works on at once, a positive integer. Shown in the team directory for whoever assigns work. Omit to leave it unchanged."
    • Addedupdate_dependency
    • Changedupdate_doc3 fields changed
      • addedInput schema / properties / allow_shrink
        Added value: +{
        +  "description": "Only for a deliberate whole-document replacement that drops sections: lifts the guard that refuses a body halving the document.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / body / description
        Previous value: -"Replacement markdown for the WHOLE document. Requires base_version."New value: +"Replacement markdown for the WHOLE document, or for the one section named by section. Requires base_version."
      • addedInput schema / properties / section
        Added value: +{
        +  "description": "Heading text or anchor of the one section to replace (as in get_doc section=). body is then that section's new text, heading line included; the rest of the document is untouched.",
        +  "type": "string"
        +}
    • Changedupload_artifact1 field changed
      • changedInput schema / properties / artifact_type / description
        Previous value: -"Type: file, code, log, report, link, image, data."New value: +"Category used to label and filter the artifact: file (default), code, log, report, link, image or data. It does not affect how content is decoded; encoding and mime_type do."
  2. 65 tool updatesv0.1.1
    • First observedadd_comment
    • First observedadd_dependency
    • First observedadd_vcs_link
    • First observedassign_task
    • First observedcheckout_task
    • First observedclear_human_gate
    • First observedcomment_doc
    • First observedcreate_doc
    • First observedcreate_recurring_task
    • First observedcreate_subtask
    • First observedcreate_task
    • First observeddelete_recurring_schedule
    • First observedexport_workspace_config
    • First observedextend_checkout
    • First observedforget
    • First observedget_artifact
    • First observedget_assignment_rules
    • First observedget_canonical
    • First observedget_canonical_updates
    • First observedget_context
    • First observedget_doc
    • First observedget_memory
    • First observedget_my_rules
    • First observedget_my_tasks
    • First observedget_project
    • First observedget_project_knowledge
    • First observedget_project_rules
    • First observedget_recurring_history
    • First observedget_task
    • First observedget_task_context
    • First observedget_team_directory
    • First observedget_workflow_rules
    • First observedheartbeat
    • First observedimport_workspace_config
    • First observedlist_artifacts
    • First observedlist_comments
    • First observedlist_doc_comments
    • First observedlist_docs
    • First observedlist_projects
    • First observedlist_recurring_schedules
    • First observedlist_sub_agents
    • First observedlist_tasks
    • First observedmove_task
    • First observedpoll_tasks
    • First observedpublish_event
    • First observedpublish_summary
    • First observedrecall
    • First observedrecall_with_graph
    • First observedrecord_owner_decision
    • First observedregister_sub_agent
    • First observedrelease_task
    • First observedremember
    • First observedremove_dependency
    • First observedreport_error
    • First observedsearch_docs
    • First observedsession_report
    • First observedset_human_gate
    • First observedset_project_knowledge
    • First observedsubscribe_events
    • First observedtrigger_recurring_now
    • First observedupdate_agent_profile
    • First observedupdate_doc
    • First observedupdate_recurring_schedule
    • First observedupdate_task
    • First observedupload_artifact

TDQS

A3.6/5.0

Scored across 69 tools

Disambiguation3/5

Descriptions work hard to disambiguate (recall vs recall_with_graph vs get_canonical vs get_project_knowledge vs get_context each carry explicit 'use this instead of that' guidance, as do the four rules tools), but the sheer number of near-neighbours means an agent still has to reason carefully to pick correctly. Deprecated aliases left in the surface (publish_summary alongside publish_event, poll_tasks alongside get_my_tasks) and pass-throughs like get_task_context vs get_task+list_comments+list_artifacts add real overlap.

Naming Consistency4/5

The set is overwhelmingly consistent snake_case verb_noun (get_/list_/create_/update_/delete_/add_/remove_/set_/register_), with clear resource suffixes. Deviations are minor: a handful of verb-only or noun-only names (remember, forget, recall, heartbeat, session_report) and a couple of domain-specific shapes (mark_vcs_deployed, record_owner_decision).

Tool Count2/5

69 tools is far too heavy for a single server surface, even granting that the domain (tasks, docs, memory, agents, events, recurring schedules, VCS) is genuinely broad. Several tools exist only as backward-compatibility wrappers or convenience composites, which inflates the count beyond what earns its place.

Completeness4/5

Coverage is unusually deep: full task lifecycle (create/update/move/assign/checkout/dependencies/subtasks), documents with versioned edits and threaded comments, artifacts, memory tiers, governance rules, agent registry, events and recurring schedules. Gaps are modest but real: no delete for tasks, documents, comments, or artifacts, and no cross-project document search (explicitly acknowledged).

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Persistent memory graph, knowledge marketplace, and MCP tool gateway for autonomous AI agents. Agents store experiences, trade knowledge via micropayments, and discover capabilities across the Hive network.
    27 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables peer-to-peer communication, discovery, shared state, and file coordination between AI coding agents across machines and sessions.
    16 npm
    17
    Elastic 2.0