Skip to main content
Glama

Backlogr

A small, self-hosted system of record for a team of AI agents' work (research, purchases, edits, outreach, code). Agents talk to it over MCP or a CLI. Tasks are the objects; the MCP tool verbs are task_*. Rule: no task, no work.

  • Python, SQLite (WAL), append-only update log enforced by triggers.

  • MCP over streamable HTTP (or stdio), plus a JSON API used by the CLI. Bearer-token auth on API/MCP; /healthz is unauthenticated.

  • Nightly JSON export and SQLite backup inside the service.

Documentation

Related MCP server: pith

Rule for every agent (paste verbatim)

No task, no work: before you start anything for the user, create or find its task in Backlogr (task_create / backlogr new), and record every status change, blocker and result on that task (task_update / backlogr update, backlogr done) as it happens, using your bot name as the actor.

Run the server

git clone '<repo-url>' ~/backlogr && cd ~/backlogr
python3 -m venv .venv && .venv/bin/pip install -e '.[test]'
mkdir -p data backups exports && chmod 700 data backups exports
cp deploy/env.example .env && chmod 600 .env    # fill in BACKLOGR_TOKEN etc.
set -a && . ./.env && set +a && .venv/bin/backlogr-server
curl -fsS http://127.0.0.1:8796/healthz         # ok

As a systemd user service: install -D -m 644 deploy/backlogr.service ~/.config/systemd/user/backlogr.service && systemctl --user daemon-reload && systemctl --user enable --now backlogr (and loginctl enable-linger $USER to start at boot).

Expose it only on a private network or behind an authenticating reverse proxy, for example Tailscale serve under a path: tailscale serve --bg --https=443 --set-path /backlogr http://127.0.0.1:8796, then BACKLOGR_URL=https://backlogr.example.invalid/backlogr. Add that host name to BACKLOGR_ALLOWED_HOSTS for MCP transport checks; enforce Host restrictions for all routes at the proxy. Use TLS and authentication before any public exposure. Routes: $BACKLOGR_URL/mcp, $BACKLOGR_URL/healthz, $BACKLOGR_URL/api/<op>.

In a container

Release tags publish ghcr.io/oceanswave/backlogr:<version> (and :latest). The image runs as a non-root user, keeps the DB, exports and backups in the /data volume, and has a health check.

cp deploy/env.example .env && chmod 600 .env    # set BACKLOGR_TOKEN; path settings are overridden
docker compose up -d                             # or: docker build -t backlogr . && docker run ...
curl -fsS http://127.0.0.1:8796/healthz
docker compose exec backlogr backlogr list       # CLI inside the container, local mode

compose.yaml publishes the port on loopback only; put an authenticating proxy such as tailscale serve in front, and add its host name to BACKLOGR_ALLOWED_HOSTS. Inside the container the server binds 0.0.0.0 so the published port reaches it.

Configuration

See the complete reference for all environment variables, including deployment settings.

Variable

Used by

Default

BACKLOGR_TOKEN

server (required for HTTP)

none

BACKLOGR_DB

server, local CLI

~/backlogr/data/backlogr.db

BACKLOGR_PORT

server

8796

BACKLOGR_HOSTS

server bind IPs (comma list)

127.0.0.1

BACKLOGR_ALLOWED_HOSTS

extra MCP Host headers (proxy DNS names)

none

BACKLOGR_BACKUP_DIR / BACKLOGR_BACKUP_KEEP

nightly backup (backlogr-YYYY-MM-DD.db)

off / 14

BACKLOGR_EXPORT

nightly export, CLI export

~/backlogr/exports/backlogr-export.json

BACKLOGR_URL

CLI remote mode (and client configs below)

unset = local DB

BACKLOGR_TOKEN_FILE

CLI remote mode

~/backlogr/.token

BACKLOGR_OWNER

name in messages and default person for act (server and CLI)

owner

BACKLOGR_HUMANS

people whose act done attestation can satisfy completion gates

unset

BACKLOGR_BOTS

bot names that can never be approved_by (DB owners/actors are included, except configured humans)

none

BACKLOGR_APPROVERS

if set, the only names accepted as approved_by

unset

BACKLOGR_TZ, BACKLOGR_DASHBOARD_CATEGORIES, BACKLOGR_TRUST_TAILSCALE_HEADERS

dashboard time zone, card grouping, Tailscale header auth

local zone / none / off

Install the MCP

Server name backlogr, streamable HTTP at $BACKLOGR_URL/mcp, header Authorization: Bearer <token>. Keep the token in an env var or a mode-600 file; never commit it or paste it into chat.

  • Claude Code (project .mcp.json or ~/.claude.json; Claude Code expands ${VAR}):

    {"mcpServers": {"backlogr": {"type": "http", "url": "${BACKLOGR_URL}/mcp",
      "headers": {"Authorization": "Bearer ${BACKLOGR_TOKEN}"}}}}
  • Codex (~/.codex/config.toml, with BACKLOGR_TOKEN exported in the launching shell):

    [mcp_servers.backlogr]
    url = "https://<your-host>/backlogr/mcp"
    bearer_token_env_var = "BACKLOGR_TOKEN"
  • Cursor (~/.cursor/mcp.json):

    {"mcpServers": {"backlogr": {"url": "https://<your-host>/backlogr/mcp",
      "headers": {"Authorization": "Bearer ${env:BACKLOGR_TOKEN}"}}}}
  • Stdio-only clients (runs on the server host, reads .env there):

    {"mcpServers": {"backlogr": {"command": "ssh", "args": ["<user>@<server-host>",
      "cd backlogr && set -a && . ./.env && .venv/bin/backlogr-server --stdio"]}}}
  • Any other client: streamable HTTP, the URL above, the bearer header.

Install the skill

The agent skill is skills/backlogr/SKILL.md (CLI, MCP tools, status flow, rules). Copy or symlink the folder into your agent's skills directory:

git clone '<repo-url>' ~/src/backlogr
ln -s ~/src/backlogr/skills/backlogr ~/.claude/skills/backlogr     # Claude Code
ln -s ~/src/backlogr/skills/backlogr ~/.codex/skills/backlogr      # Codex

Other agents: point them at AGENTS.md, or paste the rule above into their instructions.

MCP tools

task_create, task_update (status/due/owner/approval_needed/note), task_add_link, task_get, task_list (owner, status or comma list, overdue, stale_hours, due_before, q, source, include_closed, limit, offset), task_flags (overdue, stale, blocked, waiting_on_owner, created_recently), task_stale (hours), task_waiting (waiting_on_owner queue with asks), task_import, task_act. Fields: id, title, done_means, owner_bot, due (ISO), status (todo|in_progress|waiting_on_owner|blocked|done|declined), source (direct_to_bot|via_coordinator|bot_initiated), approval_needed, ask (required when moving to waiting_on_owner), waiting_since, created_at, updated_at, updates[], links[].

CLI (backlogr)

Remote when BACKLOGR_URL is set (token from BACKLOGR_TOKEN_FILE), else the local DB (BACKLOGR_DB).

backlogr new "Order sample tee" --owner Mint --source via_coordinator --by Coordinator --done-means "tee arrives" --due 2026-10-30 --approval --key mint:sample-tee   # --key: retries return the same task
backlogr update T-abc123 --by Mint --status blocked --note "needs card"
backlogr update T-abc123 --by Mint --due none    # clear the due date (MCP/API: due="")
backlogr update T-abc123 --by Mint --link https://example.com/order --kind order
backlogr done T-abc123 --by Mint --evidence "https://example.com/pr/12" --test unit=pass --test e2e=pass   # --evidence required; --test when done_means mentions tests
backlogr list [--owner Mint] [--status todo,in_progress] [--q PR] [--source via_coordinator] [--due-before 2026-11-01] [--overdue] [--stale-hours 24] [--all] [--limit 50] [--offset 0]
backlogr flags [--stale 24] [--recent 24]
backlogr waiting                    # waiting_on_owner queue: exact ask + age, oldest first
backlogr approve T-id --by Forge --approver Operator --source "Operator in chat 11:17"   # human approval record
backlogr stale [--hours 2]          # in_progress with no note in N hours, by owner
backlogr get T-abc123 [--short]      backlogr import file.json --by Coordinator      backlogr export [--path P]

new, update and done print one line (T-abc123 in_progress); add --json (before or after the subcommand) for the full row. Other commands print a readable summary or JSON with --json.

Deploying to a host with deploy.sh

scripts/deploy.sh updates an existing install (a git clone with a .venv and a systemd user unit, as in Run the server) on a host that has no GitHub access. Ship the release as a git bundle:

git bundle create /tmp/backlogr.bundle --all --tags
scp /tmp/backlogr.bundle "$DEPLOY_HOST:/tmp/backlogr.bundle"
# on the host, from the install dir:
scripts/deploy.sh --bundle /tmp/backlogr.bundle --ref vX.Y.Z --dry-run   # preview: fetches refs, changes no files, DB or service
scripts/deploy.sh --bundle /tmp/backlogr.bundle --ref vX.Y.Z

It refuses to run (exit 4) if tracked files in the install are modified. Otherwise it backs up the DB to backups/pre-deploy-<ts>.db, checks out the ref, runs pip install -e ., restarts the service and waits for /healthz (5 s per try, 40 tries). If pip install, the restart or healthz fails, it rolls the code back to the previous commit and exits 1; schema changes are not reverted, so the DB backup is kept. Without --ref it deploys the highest v* tag; without --bundle it fetches from origin.

Env

Default

BACKLOGR_HOME

~/backlogr (install dir)

BACKLOGR_SERVICE

backlogr (systemd --user unit)

BACKLOGR_DB, BACKLOGR_PORT

environment, else $BACKLOGR_HOME/.env, else data/backlogr.db and 8796

Tests

.venv/bin/python -m pytest -q tests (unit, CLI local + remote, auth 401s, live MCP HTTP end-to-end). ensure.sh health-checks $BACKLOGR_URL. Migrating from the earlier "task manager" deployment: MIGRATION.md.

License

MIT (see license for copyright attribution)

Diagnostics and restore

backlogr --version prints the installed code version. backlogr doctor prints configuration without the token value, including token presence and token-file permissions. Locally it checks DB writability and schema version/columns; remotely it checks /healthz and an authenticated list with limit=1. Exit status is 0 when all checks pass, 1 otherwise. Remote token files should have mode 600. Other CLI failures, including unreadable files, invalid import JSON, and network errors, print error: ... on stderr and exit 2.

List pagination is optional: --limit N --offset N (MCP/API: limit, offset), with no limit by default. Both must be non-negative integers; pagination applies after filtering.

backlogr export writes tasks plus rules and playbooks. backlogr import export.json --by Bot accepts either the exported {"tasks": [...], "rules": [...], "playbooks": [...]} object or a task list; rules and playbooks are upserted as in rules import. Normal imports, including API/MCP snapshots, enforce approval, evidence, and test gates; snapshot history and derived metadata are not restored. For trusted local recovery, backlogr import export.json --by Bot --restore preserves IDs, timestamps, task fields, update history, and links verbatim, bypassing creation gates. Remote --restore is rejected; unset BACKLOGR_URL for local use. Existing IDs are left as they are and reported in skipped; the result also lists created IDs and per-item errors. SQLite backups remain the primary restore method.

One-call human actions (act)

backlogr act T-id done|na|question|later|undo [--reason TEXT] [--by NAME] (MCP: task_act, API op act). --by defaults to BACKLOGR_OWNER (owner when unset). Set BACKLOGR_OWNER=Operator on the server and CLI clients to retain that name.

action

effect

done

status done, with evidence confirmed done by <by>[: reason]. If <by> is listed in BACKLOGR_HUMANS (and in BACKLOGR_APPROVERS, when that is set), their word counts: the tests gate is skipped, and a missing approval is recorded as <by> via act done. Anyone else goes through the normal gates.

na

status declined, with the reason in the note

question

status unchanged. --reason is the question; it is stored in open_question and listed under flags.questions_for_owner, and it clears on the owner bot's next update

later

adds a note without changing status; --reason is required

undo

restores status, evidence, approval, tests and question to what they were before the last act. This works only if nothing else changed the task since.

Every act is logged in the history as act <action> by <by>.... Each act is checked inside the write lock. If the task changed after it was read, the act is refused with "retry". Names in BACKLOGR_HUMANS (comma-separated) never count as bots, even after they act on tasks. The HTTP API accepts only the parameters exposed by the corresponding MCP tool; unknown fields return HTTP 400 (unknown field: x). Request bodies over 1 MiB return HTTP 413.

Dashboard mapping: DASH T-x DONE → act T-x done; DASH T-x N/A[: r] → act T-x na --reason r; DASH T-x QUESTION: q → act T-x question --reason q.

Rules and Playbooks (1.5.0)

Store reusable rules alongside tasks, and group them into playbooks with optional skill names and test commands. IDs are supplied by you. A rule needs nonempty rule text; its title and other descriptive fields are optional.

backlogr rules add M1 --title "Check examples" --rule "Examples must run." --test "python -m pytest" --category quality --by Agent
backlogr playbooks add P-check --name "Example checks" --rules M1 --skill example-check --test "python -m pytest"
backlogr rules list --playbook P-check --testable yes --json
backlogr rules get M1
backlogr rules untested
backlogr rules remove M1            # also: backlogr playbooks remove P-check (keeps its rules)
backlogr playbooks list
backlogr playbooks get P-check --json
backlogr rules import tests/fixtures/rules-playbooks.json --by Agent --json

rules add accepts --evidence, --source, --applies-to, --playbook, --testable yes|no, and --replace. Duplicate rule IDs fail unless --replace is given; replacement supplies the full editable record, preserving creation metadata. --by defaults to BACKLOGR_OWNER for rule creation. Playbook add upserts by ID; --description is optional. An omitted --rules preserves links; an explicit list replaces additional links. Unknown rule/playbook references fail.

A rule's testable defaults to true when it has a test. Empty or whitespace-only tests and tests starting with UNTESTED (case-insensitive, ignoring leading whitespace) always derive false. Explicit true with an empty test is rejected. rules untested and rules list --untested return every rule with testable=false, just like rules list --testable no. This includes empty tests, UNTESTED placeholders, and rules explicitly added or imported with testable=false despite descriptive test text. Rules with testable=true are excluded. MCP/API rule_untested uses the same flag-based filter. rules list also accepts --category. --json works at every command level.

The same authenticated HTTP API and MCP expose rule_list, rule_get, rule_add, rule_untested, rule_remove, playbook_list, playbook_get, playbook_add, playbook_remove, and rules_import. API operations use those exact names: POST to $BACKLOGR_URL/api/rule_get with {"id":"M1"}, for example. See the agent skill for signatures and import format for relationships and bulk import.

Live dashboard

Open /dashboard on your Backlogr server (or /backlogr/dashboard under a /backlogr reverse-proxy prefix) for the live dashboard. The page reads SQLite on every request and refreshes every 60 seconds. It shows task counts, assignees, decisions waiting on the owner (BACKLOGR_OWNER), task cards (grouped by optional BACKLOGR_DASHBOARD_CATEGORIES), the latest 40 finished tasks, up to 80 timeline events from the last 48 hours, and rules/playbooks. /dashboard.json serves the same computed model for other read-only clients.

Both routes accept GET and HEAD only and require the Authorization: Bearer … API credential. Behind tailscale serve you can set BACKLOGR_TRUST_TAILSCALE_HEADERS=1 to also accept the Tailscale-User-Login identity header it adds; enable that only when the listener is reachable solely through tailscale serve, because a direct client could forge the header. The existing BACKLOGR_ALLOWED_HOSTS configuration also applies. The dashboard sends a strict Content-Security-Policy and has no scripts, task action controls, or external assets. Times use BACKLOGR_TZ (default: the server's local zone).

Available Tools

20 tools
playbook_addC

Upsert a playbook and its rule links; unknown rule IDs are errors.

NameRequiredDescriptionDefault
idYes
nameYes
testNo
skillNo
rule_idsNo
descriptionNo

TDQS

C2.7/5.0
Behavior2/5

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

With no annotations, the description must carry the full behavioral burden. It usefully discloses upsert semantics and that unknown rule IDs cause errors, but it omits permissions, whether existing rule links are replaced, atomicity, destructive effects, and response behavior.

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

Conciseness4/5

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

The definition is a single front-loaded sentence with no filler. It is appropriately concise, though its brevity contributes to gaps covered by other dimensions.

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

Completeness2/5

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

For a six-parameter mutation tool with no annotations and no output schema, the description is too thin. It does not explain required fields, optional fields, side effects, or what happens to existing rule links during an upsert.

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

Parameters2/5

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

Schema description coverage is 0%, so the description should compensate but does not. It hints that rule_ids refers to rule links, but id, name, test, skill, description, and the replacement/null behavior of rule_ids remain unexplained.

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

Purpose4/5

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

"Upsert a playbook and its rule links" uses a specific verb and resource, making the create-or-update intent clear. It distinguishes the tool from playbook_list, playbook_get, and playbook_remove by operation, though it does not explicitly mention those siblings.

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 guidance or alternatives. It only states a validation constraint (unknown rule IDs are errors), leaving the agent to infer that this is the tool for adding or updating playbooks rather than listing, getting, or removing them.

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

playbook_getA

Get a playbook with linked rules embedded.

NameRequiredDescriptionDefault
idYes

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are present, so the description carries the full burden. It usefully discloses that linked rules are embedded in the result, which is real behavioral information beyond the schema. It omits error/not-found behavior, whether the read is side-effect free, and any pagination or size considerations for embedded rules.

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?

One short sentence with the key qualifier (embedded rules) front-loaded and no filler. It is efficient, though the extreme terseness leaves gaps that a slightly longer sentence could have closed.

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 read tool with no annotations and no output schema, the description covers what it returns at a high level (playbook plus embedded rules). Missing details are minor: id provenance and not-found behavior.

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

Parameters3/5

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

Schema description coverage is 0% and the single parameter 'id' has no description, so the description would need to compensate. It does not define the id format or source (e.g., obtained from playbook_list), leaving semantics implicit, though the meaning of a playbook id is largely self-evident.

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 (get) and resource (playbook) and adds that linked rules are embedded, which distinguishes its payload from a bare retrieval. It does not explicitly contrast with the sibling playbook_list, so the 5 bar is not quite met.

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?

Retrieval by id implies the natural use case, and the sibling playbook_list makes the single-vs-many split reasonably inferable. However, there is no explicit when-to-use statement, no mention of when to prefer playbook_list, and no note about behavior when the id does not exist.

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

playbook_listB

List playbooks with linked rules.

NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden, and it does establish that the result is a collection that embeds linked rules rather than bare playbook entries. It says nothing about result volume, ordering, pagination, or whether the call is safe/read-only, and with zero parameters there is no way to narrow the result set — a constraint worth stating explicitly.

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 short sentence with the resource and returned data front-loaded and zero filler. Nothing could be removed without losing information.

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 zero-parameter read listing with no output schema, the description is minimal but not empty: it tells the agent playbooks come back with their linked rules attached. However, without an output schema it should ideally describe the practical shape of the response (fields, whether rules are nested arrays, volume), and it omits any routing note versus playbook_get.

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 no parameters, so the baseline of 4 applies; there is nothing for the description to disambiguate. One could argue for a note that the absence of parameters means no filtering is possible, but that is not required by this dimension.

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?

"List playbooks with linked rules" states a specific verb (list) and resource (playbooks), plus a hint at the payload (linked rules included). It is distinguishable from playbook_add/playbook_remove by the verb, though it never explicitly contrasts with playbook_get, which fetches a single playbook.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no exclusions, and no pointer to the nearest alternative (playbook_get for a single playbook). The only routing signal is the verb "List" in the name and description, leaving the agent to infer that this is the bulk-retrieval option.

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

playbook_removeA

Delete a playbook; its rules are kept, and rules whose primary playbook it was are detached.

NameRequiredDescriptionDefault
idYes

TDQS

A4/5.0
Behavior4/5

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

No annotations are supplied, so the description carries the full behavioral burden, and it does disclose the key non-obvious side effect: rules survive the deletion but lose their primary-playbook association. It omits whether deletion is reversible, what permissions are needed, and what happens if the id is unknown, 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?

A single front-loaded sentence states the action first and the cascade behavior second. Every clause carries information; nothing 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 one-parameter mutation tool with no output schema, the crucial fact an agent needs — that rules are preserved and detached rather than destroyed — is present. Missing are failure behavior (unknown id), permission requirements, and any indication of return value or confirmation of detach count.

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?

With one required string parameter at 0% schema description coverage, the description never explicitly identifies `id` as the playbook identifier, though 'Delete a playbook' makes that reading natural. It adds no format, naming-convention, or lookup guidance beyond that implication.

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 plus resource ('Delete a playbook') with scope spelled out, and it is plainly distinguishable from siblings like playbook_add, playbook_get, rule_remove, and rules_import. An agent can tell exactly what this does 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 Guidelines3/5

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

The word 'Delete' implies the usage context, and the description hints that this is playbook-level removal rather than rule-level removal (which maps to rule_remove). However, it never states preconditions, when-not-to-use, or what to check first, so the agent must infer the selection criteria.

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

rule_addB

Add a rule; replace=true explicitly updates an existing ID. UNTESTED tests derive testable=false. actor defaults to BACKLOGR_OWNER.

NameRequiredDescriptionDefault
idYes
ruleYes
testNo
actorNo
titleNo
sourceNo
replaceNo
categoryNo
evidenceNo
testableNo
applies_toNo
playbook_idNo

TDQS

B3.1/5.0
Behavior3/5

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

With no annotations, the description carries the full burden and does disclose some behavior: replace semantics, testable derivation from UNTESTED tests, and the actor default. It still omits important mutation details such as permissions, error behavior when an ID already exists without replace, and return behavior.

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

Conciseness4/5

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

The description is compact and front-loads the main action, with no filler sentences. Some clauses, especially "UNTESTED tests derive testable=false," are terse enough to be slightly cryptic, but overall it is efficiently structured.

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?

This is a 12-parameter mutation tool with no annotations and no output schema, so the description needs to be richer. It provides a few important behavioral hints but does not explain most parameters, validation rules, side effects, or expected responses.

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

Parameters2/5

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

Schema description coverage is 0% across 12 parameters, so the description must compensate. It explains only replace, testable, and actor partially, leaving id, rule, test, title, source, category, evidence, applies_to, and playbook_id without added meaning.

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 clear verb and resource: "Add a rule." It also clarifies replace behavior, which helps distinguish adding from updating, but it does not explicitly differentiate this tool from siblings such as rule_remove, rule_get, or rule_list.

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

Usage Guidelines3/5

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

The phrase "replace=true explicitly updates an existing ID" gives useful guidance for updating rather than adding. However, it does not state when to choose rule_add over related tools like rule_remove, rule_get, or rules_import, so usage is only implied.

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

rule_getC

Get one rule.

NameRequiredDescriptionDefault
idYes

TDQS

C2/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden, yet it discloses nothing about error behavior for missing IDs, permissions, or whether the result is a read-only snapshot. Only the generic implication of "get" signals a non-mutating operation.

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?

Three words with no filler and no front-loading problem, but the brevity reflects under-specification rather than efficient communication. It reads as a stub rather than a usable definition.

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

Completeness1/5

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

With no annotations, no output schema, no parameter coverage, and a large sibling set, the definition leaves essentially everything an agent needs unresolved: what is returned, what a missing rule looks like, and how it differs from rule_list.

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

Parameters2/5

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

Schema description coverage is 0% and the single required parameter "id" is undocumented in both schema and description. The description does not say whether the ID is a rule identifier, name, or slug, nor the expected format.

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

Purpose2/5

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

"Get one rule." essentially restates the tool name rule_get; the only added information is the singular "one," which weakly distinguishes it from rule_list. It never says what a rule is or what identifying information is returned.

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 guidance on when to call this instead of rule_list, rule_add, rule_remove, or playbook_get. The agent must infer from the name alone that this is the single-record lookup path.

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

rule_listB

List rules with optional playbook, testability and category filters.

NameRequiredDescriptionDefault
categoryNo
playbookNo
testableNo

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It confirms that the operation lists rules and supports filters, but it does not disclose whether no filters returns all rules, pagination behavior, sorting, permissions required, or the shape of returned data. For an unannotated tool, this leaves important behavioral context unstated.

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

Conciseness5/5

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

The description is a single front-loaded sentence with no redundant wording. Every term—'List rules' and the three filter dimensions—earns its place.

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

Completeness2/5

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

The tool has three optional parameters, 0% schema description coverage, no annotations, and no output schema. The description identifies the filter dimensions but omits default behavior, return characteristics, and any usage boundaries relative to siblings. For a completely undocumented schema with no annotations, the definition is too thin to be fully self-sufficient.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It names all three filter concepts (playbook, testability, category), which maps to the three input parameters and clarifies that they are optional filters. However, it does not explain accepted values, matching behavior, or how 'testability' relates to the boolean 'testable' parameter, so the added semantic value is limited.

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: 'List rules'. It also names the optional filter dimensions, so an agent can distinguish this from single-rule operations like rule_get or mutations like rule_add. It does not explicitly differentiate from the sibling rule_untested tool, which also lists rules under a specific condition, but the general listing purpose is clear.

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 'with optional ... filters' implies the tool is used to retrieve rules and optionally narrow them, but there is no explicit guidance on when to use this versus rule_untested, rule_get, or other sibling tools. Usage is implied rather than stated, leaving the agent to infer the right selection context.

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

rule_removeA

Delete a rule and its playbook links.

NameRequiredDescriptionDefault
idYes

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It usefully discloses that playbook links are also deleted, but it does not state whether the deletion is irreversible, what permissions are required, or whether confirmation is expected for a destructive operation.

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

Conciseness5/5

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

The description is a single front-loaded sentence with no wasted wording. It communicates the core action and cascade effect efficiently.

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 simple one-parameter tool, the description covers the essential action and its side effect. However, because this is a destructive mutation with no annotations and no output schema, it is missing important context about irreversibility, permissions, and the required identifier.

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

Parameters2/5

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

Schema description coverage is 0% and the only parameter is an undocumented 'id' string. The description refers to 'a rule' but never explains that 'id' is the rule identifier, where to obtain it, or what format it uses.

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 (Delete) and resource (a rule) and also discloses the cascade effect on playbook links. This clearly distinguishes it from sibling tools such as rule_add, rule_get, and playbook_remove.

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 verb 'Delete' implies when the tool is used, but the description provides no explicit guidance about when to choose this over alternatives or what prerequisites must be met. With no exclusions or alternatives named, usage is only implied.

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

rules_importC

Atomically import a rules/playbooks object; return created/updated/unchanged counts.

NameRequiredDescriptionDefault
actorYes
itemsYes

TDQS

C2.9/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden, and it does add two real facts: the operation is atomic (all-or-nothing) and it returns created/updated/unchanged counts. It says nothing about permissions, conflict/idempotency behavior, whether anything can be deleted, or size limits, which are material for a bulk mutation.

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

Conciseness4/5

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

A single front-loaded sentence with two useful clauses and no filler. It is efficient, though the compressed 'rules/playbooks object' phrasing is slightly ambiguous about whether items is one object or a collection.

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?

No output schema exists, so the description's mention of return counts is valuable, but a two-parameter mutation tool with 0% schema coverage needs far more: payload shape, actor's role, conflict handling, and routing versus the add/import siblings.

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

Parameters2/5

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

Schema description coverage is 0% and both parameters are undocumented; 'items' is a free-form object with additionalProperties and 'actor' has no explanation at all. The phrase 'rules/playbooks object' hints at the expected payload, but the actor parameter and the item structure are left entirely unexplained.

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

Purpose4/5

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

States a specific verb ('Atomically import') and resource ('a rules/playbooks object'), which clearly separates it from single-item siblings like rule_add or playbook_add. It stops short of naming those siblings explicitly, so the differentiation is implied rather than stated.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no prerequisites, and no mention of the obvious alternatives (rule_add, playbook_add, task_import). The agent must infer that this is the bulk/batch path from the word 'import' alone.

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

rule_untestedA

List every rule whose testable flag is false, including rules with test text.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are supplied, so the description must carry the full behavioral burden; "List" does signal a non-mutating read, which is the main safety signal. The clause "including rules with test text" usefully disambiguates an edge case where the filter might otherwise be ambiguous, but there is no mention of ordering, result size, pagination, or return shape.

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

Conciseness4/5

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

A single sentence with no filler, and the scope constraint is front-loaded. It is terse to the point of being slightly cryptic for a domain-specific predicate, which keeps it out of the top band.

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 zero-parameter, no-output-schema list tool the description covers the essential selection logic, so nothing critical is missing. It still leaves the agent guessing about result volume, ordering, and whether the output includes test text alongside the rules, which matters given no output schema exists.

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 there is nothing for the description to disambiguate beyond the filter, which it states explicitly. Baseline for a parameterless tool is a 4.

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 ("List every rule") plus a precise filter predicate ("whose testable flag is false"), which separates it from the broader rule_list sibling. It loses a point only because "testable flag" is a domain-specific concept left unexplained, so an agent unfamiliar with the model may not be fully certain what qualifies.

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 filter condition implies when this tool is appropriate — when you want only untested rules rather than the full set — and the presence of rule_list in the sibling list makes the contrast inferable. However, the description never states the alternative or the condition explicitly, so routing relies on inference.

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

task_actA

One-call action by a person (default BACKLOGR_OWNER), e.g. from dashboard buttons. action: later (note only; reason required) | done (status done; the person's word is the evidence) | na (status declined, reason in the note) | question (status unchanged; reason is the question, marked as open_question for the owner bot until the owner updates) | undo (reverts the last act if nothing changed since). Logged in the task history as "act by ".

NameRequiredDescriptionDefault
byNo
idYes
actionYes
reasonNo

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden and does so well: it discloses the default actor (BACKLOGR_OWNER), the status effect of each action, that 'later' is note-only, that 'question' leaves status unchanged but flags an open_question for the owner bot, and that undo reverts the last act only if nothing changed. It omits permission requirements and what happens to the reason field for actions other than 'later'/'question'.

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 lead sentence establishes the concept immediately and the action taxonomy follows in a compact, scannable pipe-delimited list. The final sentence about history logging is short and informative. The dense run-on packing of five action definitions into one paragraph slightly hurts readability but nothing is wasted.

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

Completeness4/5

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

For a 4-parameter mutation tool with no annotations and no output schema, the definition covers the actor, all action semantics, side effects, undo conditions, and the audit trail. Missing pieces are the actual return payload and error behavior (e.g. what happens when undo is attempted after a change), but the call-critical information 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 description coverage is 0%, so the description must compensate, and it largely does: it defines the full action value set with per-value semantics, establishes 'by' as the acting person with a documented default, and explains that 'reason' is mandatory for 'later' and constitutes the question text for 'question'. Only 'id' is left unspecified, which is self-evident from the task-focused siblings.

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: a single-call 'action' on a task, attributed to a person, with the enumerated action values and their outcomes. This is clearly not task_create/task_update-style editing. It falls short of a 5 because it never names the sibling it should be preferred over (e.g. task_update or task_flags), leaving the boundary 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?

The per-action breakdown (later / done / na / question / undo) effectively tells the agent which action to pick for a given intent, and the 'dashboard buttons' framing implies interactive use. However there is no explicit guidance on when to choose this tool versus task_update or task_flags, and no stated precondition for 'undo' beyond 'if nothing changed since'.

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

task_createA

Create a task. key: a stable idempotency key (e.g. "forge:pr-12-review"); if a task already has it, that task is returned unchanged with existing=true, so retries never duplicate. The result has warnings when an open task has a very similar title: check it before carrying on. source: direct_to_bot | via_coordinator | bot_initiated. status: todo|in_progress|waiting_on_owner|blocked|done|declined. due: ISO 8601. done_means: one line saying what done looks like. ask: required with status waiting_on_owner, one line saying exactly what the owner must decide or do. approved_by/approval_source: the human approval (never a bot name); required before an approval_needed task can be in_progress or done. evidence/test_results: see task_update. actor: your bot name.

NameRequiredDescriptionDefault
askNo
dueNo
keyNo
noteNo
actorYes
titleYes
sourceYes
statusNotodo
evidenceNo
owner_botYes
done_meansNo
approved_byNo
test_resultsNo
approval_neededNo
approval_sourceNo

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does so well: it explains that a duplicate key returns the existing task unchanged with existing=true, that results can carry similarity warnings to check before continuing, and that human approval gates progression. It stops short of describing permissions, what a successful create returns beyond warnings, or failure modes.

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

Conciseness5/5

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

It is a single dense block built from field-to-meaning pairs, front-loaded with the verb, with no filler sentences. Each clause adds a rule or constraint rather than restating the schema.

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 15-parameter mutation tool with no annotations and no output schema, the description does the heavy lifting on idempotency, approval gating and the similarity warning, which is what an agent most needs. A couple of parameters and the shape of the created record remain unexplained.

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 0%, so the description must compensate, and it explains key, source, status, due, done_means, ask, approved_by, approval_source, evidence and test_results with real meaning beyond type. Gaps remain: note and approval_needed are never defined directly, and approved_by versus approval_source is left ambiguous.

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?

"Create a task" gives a specific verb and resource, and the rest of the sentence enumerates what the created task carries. It never names siblings like task_update or task_import, so the agent must infer the create-vs-update boundary, but the intent is unmistakable.

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

Usage Guidelines3/5

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

Usage rules are stated for parameters rather than for tool selection: key makes retries safe, ask is mandatory when status is waiting_on_owner, approved_by is mandatory before an approval_needed task can be in_progress or done. Nothing tells the agent when to reach for task_import or task_update instead, so selection guidance is only implied.

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

task_flagsB

Check-in view: overdue, stale, blocked, waiting_on_owner, open questions for owners, and tasks created in the last N hours.

NameRequiredDescriptionDefault
stale_hoursNo
created_within_hoursNo

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden; it does disclose what categories of results come back, which is real behavioral content, and the word 'view' weakly implies read-only. It omits whether the result set is OR-combined across flags, whether there is a limit or ordering, and never states that the call is non-mutating.

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

Conciseness4/5

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

A single front-loaded sentence that enumerates the flags without filler; the condition list is dense but every item earns its place. It could be marginally tighter by folding the hour-window mention into the flags list.

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?

There is no output schema, so the flag enumeration usefully stands in for describing return categories, but for a two-parameter aggregation view with zero annotation coverage the definition should still state read-only behavior, result ordering/limits, and the meaning of the stale threshold.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. 'Tasks created in the last N hours' directly explains created_within_hours, and the 'stale' flag plus the stale_hours name together imply a staleness threshold, but neither default (24) nor how staleness is measured is clarified.

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

Purpose4/5

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

The description names a concrete result set ('check-in view') and enumerates the exact conditions surfaced: overdue, stale, blocked, waiting_on_owner, owner questions, and recently created tasks. That is specific enough to separate it from generic listing siblings, though it never uses an explicit verb (list/return) and does not mention the overlapping sibling task_stale.

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 only implied by the label 'Check-in view', which suggests a periodic health sweep rather than a general query. There is no explicit statement of when to prefer this over task_list or task_stale, even though task_stale clearly overlaps with the 'stale' category here.

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

task_getC

Get one task with its full updates log and links.

NameRequiredDescriptionDefault
idYes

TDQS

C2.8/5.0
Behavior2/5

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

No annotations exist, so the description carries the full behavioral burden. It does disclose that the response bundles the updates log and links (a useful payload-shape signal), but says nothing about permissions, behavior when the id is unknown, or payload size.

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?

One short sentence with the resource and the returned payload front-loaded and no filler. It is efficient, though the terseness leaves the gaps noted in other dimensions.

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 simple single-parameter read with no output schema, the description covers the core question of what comes back. It is still missing identifier format and not-found behavior, which matter for correct invocation.

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

Parameters2/5

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

Schema description coverage is 0% and the sole parameter 'id' has only a bare string type. The description does not clarify whether this is a task id, a slug, or a composite key, nor any format expectations, so it does not compensate for the schema gap.

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

Purpose4/5

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

Specific verb ('Get') plus resource ('one task') and an explicit content scope ('full updates log and links'), which distinguishes it from the plural sibling task_list. It never names a sibling outright, so differentiation is inferential rather than explicit.

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

Usage Guidelines2/5

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

There is no when-to-use or when-not-to-use guidance and no mention of alternatives like task_list or task_stale. The singular 'one task' weakly implies a fetch-by-identifier pattern, but the agent must infer that from the schema's required 'id' alone.

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

task_importA

Bulk create tasks. items: a list, or an export object {tasks, rules, playbooks}. Each task takes task_create fields except actor (title, owner_bot, source, done_means, due, status, approval_needed, note, created_at) plus optional links [{ref, kind}]. Rules and playbooks are upserted as in rules_import.

NameRequiredDescriptionDefault
actorYes
itemsYes

TDQS

A3.9/5.0
Behavior3/5

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

"Bulk create tasks" and the note that rules and playbooks are upserted disclose mutation and side effects, which is useful with no annotations. It does not cover permissions, duplicate handling, atomicity or partial failure, or response behavior for an import operation.

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

Conciseness5/5

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

The description is front-loaded and dense with useful specifics; the field list and export-object shape earn their space. No filler or repetition is present.

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

Completeness3/5

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

For a complex bulk import with no annotations and no output schema, the description covers the items structure and upsert side effects but leaves actor semantics and import failure or return behavior unclear. It is adequate to attempt a call 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 coverage is 0%, and the description compensates strongly for the complex items parameter by defining list vs export-object forms, per-task fields, and optional links. The required actor parameter is never explained, leaving one of the two parameters undocumented.

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

Purpose5/5

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

The description opens with "Bulk create tasks," a specific verb and resource, and distinguishes scope from task_create through bulk import and from rules_import via the export object and upsert behavior. An agent can identify this as the batch-import tool 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 Guidelines4/5

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

It explains the primary use case: bulk creation and importing an export object containing tasks, rules, and playbooks. It does not explicitly state when to choose task_create/rules_import instead, so alternative routing is implied rather than spelled out.

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

task_listA

List tasks (open only unless status or include_closed given). Filters (AND): owner, status (one or comma list e.g. "todo,in_progress"), overdue, stale_hours (no update in N hours), due_before (ISO date), q (text in title/done_means/notes/links), source.

NameRequiredDescriptionDefault
qNo
limitNo
ownerNo
offsetNo
sourceNo
statusNo
overdueNo
due_beforeNo
stale_hoursNo
include_closedNo

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are supplied, so the description carries the full burden. It does disclose one important non-obvious behavior: results silently exclude closed tasks unless status or include_closed is set, and it explains that filters are ANDed and that q searches specific fields. It says nothing about result ordering, default page size, or how limit/offset behave, which matters for a listing tool with no output schema.

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

Conciseness4/5

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

The default-scope caveat is front-loaded in the first clause, and the filter list is dense with zero filler. The telegraphic parenthetical style ("AND", "no update in N hours") is efficient but slightly compressed, and the filter enumeration is not ordered by importance.

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 10-parameter read tool with no annotations and no output schema, the description covers 8 of the 10 filters well but omits pagination (limit/offset) and says nothing about what a result looks like or how results are ordered. An agent could call it correctly for filtering, but would be guessing on paging and on the overlap with task_stale/task_waiting.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate and it largely does: it defines status as a single value or comma list with a concrete example, due_before as ISO date, stale_hours as "no update in N hours", and enumerates the fields q searches (title/done_means/notes/links). The notable gap is limit and offset, which are never mentioned even though pagination semantics are exactly what the bare schema fails to convey.

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 ("List tasks") and immediately qualifies the default scope, which tells an agent this is a read/enumerate tool rather than a create or mutate one. It does not name sibling alternatives such as task_stale or task_waiting, which look like they overlap with the overdue/stale filters, so sibling differentiation is only partial.

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 states the default behavior clearly ("open only unless status or include_closed given"), which is effectively a when-to-use rule for closed vs open tasks. It gives no guidance on when to pick this tool over task_stale, task_waiting, or task_get, even though the overdue/stale_hours filters imply overlap with those siblings.

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

task_staleA

in_progress tasks with no note or change in the last N hours, grouped by owner (oldest first).

NameRequiredDescriptionDefault
hoursNo

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are supplied, so the description carries the full burden. It does disclose useful behavior beyond the schema: results are grouped by owner and sorted oldest-first, and the staleness criterion is defined as absence of a note OR a change. It does not state that it is a read-only operation, what 'no note' means concretely, or whether results are capped.

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

Conciseness5/5

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

A single sentence with zero waste; the defining condition is front-loaded and the output characteristics follow as a compact qualifier. Nothing could be removed without losing 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 one-parameter read tool with no output schema, the definition covers the filter criterion, the grouping, and the ordering — the things an agent needs to interpret results. Only the read-only nature and any result limits are left unstated.

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 0% (the single `hours` property has no description), so the description must compensate, and it does: 'last N hours' ties the parameter to the staleness window measured against last note/change activity. It does not restate the default of 2, but the meaning of the parameter is otherwise clear.

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

Purpose4/5

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

The description names the resource (in_progress tasks) with a precise qualifying condition (no note or change in the last N hours) and the output shape (grouped by owner, oldest first). That is enough to distinguish it from generic listers like task_list, though it never explicitly contrasts itself with siblings such as task_waiting or task_flags.

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 only implied: an agent can infer this is the tool for surfacing abandoned work, but there is no explicit statement of when to prefer it over task_list or task_waiting, and no exclusions or prerequisites are given. Minimum viable, with clear gaps.

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

task_updateA

Update a task's status/due/owner/approval_needed and/or append a note to its log. due="" clears the due date. Moving to waiting_on_owner requires ask (one line: exactly what the owner must decide or do). Record a human approval with approved_by (the human, never a bot) and approval_source (e.g. "owner in chat"); an approval_needed task cannot move to in_progress or done without one. Moving to done requires evidence (link, commit sha, path or command output summary), and test_results {test name: "pass"|"fail"} when done_means mentions tests. actor: your bot name.

NameRequiredDescriptionDefault
idYes
askNo
dueNo
noteNo
actorYes
statusNo
evidenceNo
owner_botNo
approved_byNo
test_resultsNo
approval_neededNo
approval_sourceNo

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the full load and does well: it discloses gating rules (approval_needed tasks cannot reach in_progress or done without a human approval), a destructive-ish sentinel (due="" clears the date), and a human-only constraint on approved_by. It does not describe error behavior when a precondition fails or what the tool returns, which is the main 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.

Conciseness4/5

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

Nearly every clause carries a distinct rule and the mutation/constraint information is front-loaded before the parameter notes. The long semicolon-chained approval sentence packs three obligations into one breath, which slightly hurts scannability but wastes no words.

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 mutation tool with no annotations and no output schema, the description covers the high-risk semantic rules an agent needs to avoid bad writes. It stops short of enumerating status values and explaining owner_bot/approval_needed, so an agent must still guess at those fields.

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 0% across 12 parameters, and the description supplies real meaning for most of them: ask, due, evidence, approved_by, approval_source, test_results (with its shape and allowed values), actor, note. It leaves owner_bot, approval_needed, and id unexplained, and never enumerates the full set of valid status values even though it names several.

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 sentence gives a specific verb plus resource and enumerates the mutable fields (status/due/owner/approval_needed) and the log-append behavior, so an agent knows exactly what this tool touches. It does not distinguish itself from ambiguous siblings like task_act or task_waiting, which likely also affect status transitions.

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?

Usage rules are explicit and conditional: ask is required when moving to waiting_on_owner, approved_by/approval_source are needed to record an approval, and evidence plus test_results are needed to reach done. What is missing is routing guidance against siblings (task_act, task_waiting) for the same state transitions.

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

task_waitingA

Owner queue: every waiting_on_owner task, oldest first, with its exact ask and age in hours.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description must carry the behavioral burden. It usefully discloses that the tool returns all waiting_on_owner tasks, sorts them oldest first, and includes the exact ask and age in hours. It does not explicitly confirm that the operation is read-only or describe permission needs, pagination, or rate-limit behavior.

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

Conciseness5/5

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

The description is a single dense sentence with no wasted wording. It front-loads the resource ('Owner queue') and then adds ordering and returned fields in a compact structure.

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 zero-parameter, no-output-schema queue tool, the description is largely complete: it names the task subset, the sort order, and the key returned fields. It could be slightly more complete by explicitly stating read-only behavior or confirming that the returned 'exact ask' is the primary payload.

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 there is no parameter semantics to document beyond the baseline. The description correctly avoids inventing parameter details that do not exist.

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

Purpose4/5

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

The description clearly identifies a specific resource subset: every waiting_on_owner task. It also states the ordering (oldest first) and payload (exact ask and age in hours), making the tool's purpose clear without needing the schema. It does not explicitly name sibling tools such as task_list or task_stale, so it stops short of full 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?

The phrase 'Owner queue' and the waiting_on_owner filter imply when this tool is useful: retrieving tasks blocked on the owner. However, there is no explicit guidance about when to use this instead of task_list or task_stale, nor are there any stated exclusions or prerequisites.

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

Tool Schema Changelog

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

  1. 20 tool updatesv0.1.0
    • First observedplaybook_add
    • First observedplaybook_get
    • First observedplaybook_list
    • First observedplaybook_remove
    • First observedrule_add
    • First observedrule_get
    • First observedrule_list
    • First observedrule_remove
    • First observedrule_untested
    • First observedrules_import
    • First observedtask_act
    • First observedtask_add_link
    • First observedtask_create
    • First observedtask_flags
    • First observedtask_get
    • First observedtask_import
    • First observedtask_list
    • First observedtask_stale
    • First observedtask_update
    • First observedtask_waiting

TDQS

B3/5.0

Scored across 20 tools

Disambiguation3/5

Core operations are distinguishable, but several specialized views overlap: task_list can reproduce much of task_stale and task_waiting, task_flags aggregates those same concerns, and rule_untested overlaps filtered rule_list. The two import tools also overlap because task_import can upsert rules and playbooks, though their descriptions help clarify the intended entry points.

Naming Consistency4/5

Names consistently use snake_case and mostly follow a predictable resource_action pattern. Minor deviations include plural rules_import, mixed create/add verbs, and view names such as task_flags and rule_untested that do not use action verbs.

Tool Count3/5

Twenty tools is somewhat heavy for this backlog and rules domain. Several tools are specialized convenience views or overlapping import paths rather than clearly essential capabilities, so the surface could be consolidated.

Completeness4/5

Task creation, querying, status transitions, evidence, approvals, links, and bulk import are covered, while rules and playbooks have list/get/add-or-update/remove workflows. Remaining gaps include limited editing of general task fields, no task or link deletion, and no export counterpart to the import tools, though closure states and upserts provide partial workarounds.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Server-enforced workflow discipline for AI agents. An MCP server providing persistent work items, dependency graphs, quality gates, and actor attribution. Schemas define what agents must produce — the server blocks the call if they don't. Works with any MCP-compatible client.
    211
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for task management that enables AI agents to read, create, update tasks, and track work sessions, allowing agents and humans to collaborate on the same task board.
    6 npm
    11
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Agent-first project management MCP server that enables AI agents to manage tasks, spaces, lists, boards, subtasks, comments, and automations via natural language, with full audit trail and real-time sync.
    8,807 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    An MCP server enabling AI coding agents to interact with a task tracker that enforces rules server-side, replacing markdown files and hooks with a database, CLI, and web UI.
    23 npm
    2
    MIT