Workfile
This server exposes a complete Workfile project management and knowledge protocol over MCP, letting agents inspect, mutate and maintain a repository's work cards, documentation, changelog history and durable memory — all backed by Markdown files in your repository.
Work Cards: Create, list, claim (with optional filesystem scope), release, transition through statuses (backlog → doing → review → done), patch metadata, archive, reopen, append notes, and replace card bodies — using optimistic concurrency with revision tokens, actor tracking, scope declarations and dependencies.
Documentation: Create managed Markdown docs with stable DOC IDs, list indexed and managed documents by kind/status, patch with concurrency safety, and move documents between folders.
Changelog & Releases: Add unreleased change fragments linked to cards and decisions, list and patch fragments, preview a release without mutating, and cut a release that consumes selected fragments into a canonical release record.
Memory: Add typed learnings, decisions, incidents, conventions and context records (with confidence, severity, status, expiry, owners, deciders, corrective actions, etc.), list and patch them, graduate learnings into durable conventions/docs, and supersede one record with another atomically.
Search & Discovery: Full-text search across all record types using lexical or hybrid ranking; read any single record by stable ID with body, revision, backlinks and health signals; and rank "what to work on next" cards by priority, blockers and ownership.
Agent Context: Build a bounded context bundle around a specific card — pulling in direct relations, active conventions, open incidents, and non-expired context.
Health & Introspection: Run the workfile doctor to validate Work, Docs, History, Memory, agent instructions, CI templates and cross-record references (optionally checking filesystem paths), and read the effective workspace configuration, schema, enabled modules and mutation mode.
Provides CI integration with GitHub, enabling automated release and verification workflows.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Workfileshow open cards in the api area"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@illodev/workfile is a repository-native protocol for coordinating Work, Docs,
History and durable project Memory between humans and software agents.
Markdown files in the repository are canonical. The CLI, HTTP API and local UI use the same core services, collection registry, index and validation rules. No exclusive state is kept in the browser or in a database.
Work, Docs, History and Memory share the common
ProjectRecordindex. The core, CLI, HTTP server and MCP runtime are authored in TypeScript and distributed as compiled ESM with public declarations. The local UI is precompiled and included in the package, and semantic search runs on-device through the optional@illodev/workfile-search-localworkspace package.
Try the live demo — it replays this repository's own workspace: the real cards, releases, incidents and learnings of Workfile's development. Mutations work per browser session and reset on reload.
https://github.com/user-attachments/assets/c9cd3035-6729-4cda-9172-984829ab5dbc
Used by
Related MCP server: elefante
Boundaries
Workfile records work. It does not configure agents.
The two get confused because both live next to the same repository. Ecosystem configurators — gentle-ai is a good example — install a persona, curated skills, model routing, MCP servers and review gates into the agents you already use, across many agents at once. Their question is how your agent works. Workfile's question is what was done, who holds it and on what evidence, and its answer is Markdown files that outlive the agent, the session and this package.
They compose. A well-configured agent still needs somewhere durable to write down what it did.
What is here, and is not a configurator's job:
The repository is canonical. A card is a file in the pull request: reviewed in the diff, reported by
workfile doctorwhen malformed. No exclusive state in a browser, a database or~/.config. Remove the package and the records stay readable.Claims are enforced, not agreed. Ownership is checked at the mutation, so a card another actor holds refuses your transition with
CARD_CLAIM_OWNER_MISMATCHinstead of quietly accepting it — a guarantee no sentence in a prompt can make.reviewis notdone.donerequires evidence from somewhere the code actually ran. A merge is not evidence.Humans read the same records. The UI, the rendered changelog and the releases are derived from exactly what the agent writes; there is no machine view and human view to keep in sync.
What is deliberately absent: Workfile does not install or update agents, ship a
persona, route models or curate a skill catalogue. It syncs its own protocol into
the instruction files an agent already reads (workfile agents sync) and exposes
every operation over MCP — vendor neutral, but a server, not an ecosystem.
Requirements
Node.js 22 or newer.
npm, pnpm, yarn or Bun may invoke the package.
Install
Every workfile … command in this README requires the package to be installed —
pnpm dlx / npx one-offs run a command and discard the binary afterwards:
pnpm add -D @illodev/workfile # per repository (recommended)
pnpm workfile doctor # dependency bins run through pnpm / npx
pnpm add -g @illodev/workfile # or globally: `workfile` lands on your PATH
workfile doctor
wf doctor # `wf` is the same binary, for typing by handwf is an alias, not a rename: both names reach the same entry point, and the
help and error hints answer in whichever one you typed. Keep the long form in
anything generated or shared. wf only resolves once the package is installed,
and an unrelated wf exists on the registry — so npx wf would fetch someone
else's tool where npx workfile fails outright.
pnpm dlx @illodev/workfile init is fine for one-shot initialization, but keep the
package as a devDependency afterwards: that is what makes the project* scripts that
init adds to package.json resolve. That prefix is an npm script namespace — pnpm project opens the UI, pnpm project:doctor runs the checks — and has nothing to do
with the old binary name.
TypeScript API
The published surface exposes JavaScript and declarations through conditional package exports. TypeScript consumers receive typed configuration, workspace, record, search and integration contracts from the root package and every documented subpath:
import {
defineProject,
type CardStatus,
type ProjectConfig,
type ProjectRecord
} from "@illodev/workfile";
import { createSemanticSearchProvider } from "@illodev/workfile/search";
const config: ProjectConfig = defineProject({
schemaVersion: 2,
name: "Billing",
cards: {
areas: ["api", "web"]
}
});
const status: CardStatus = "doing";The CLI and UI do not require TypeScript in consuming projects. React, Primer, Vite and the
UI type packages are build-only dependencies; the installed package serves bundled browser
assets from dist/ui.
Workspace
A project is discovered through project.config.mjs and normally stores protocol-owned
files under .project/:
project.config.mjs
.project/
├── VERSION
├── cards/
│ └── archive/
├── assets/
├── docs/
├── changelog/
│ ├── unreleased/
│ └── releases/
├── memory/
│ ├── learnings/
│ ├── decisions/
│ ├── incidents/
│ ├── conventions/
│ └── context/
├── agents/
└── .cache/Minimal configuration — a plain object, not defineProject(...). The loader
applies defineProject itself, and an import here is a bare specifier the file
can only resolve with node_modules present, which breaks the two consumers
that run without one: a pnpm dlx-initialized workspace before the package is
installed, and the generated CI job's npx run on a clean clone. The JSDoc
annotation keeps editor typing without a runtime import:
/** @type {import("@illodev/workfile").ProjectConfigInput} */
export default {
schemaVersion: 2,
name: "My project",
cards: {
areas: ["api", "web", "infra", "docs"]
},
docs: {
sources: [
"README.md",
"docs/**/*.md",
"apps/*/README.md",
".project/specs/**/*.md"
]
},
changelog: {
releaseStrategy: "semver",
defaultVisibility: "public"
},
memory: {
collections: [
"learnings",
"decisions",
"incidents",
"conventions",
"context"
]
},
agents: {
targets: ["agents-md", "cursor"]
},
ci: {
targets: ["github"]
},
mcp: {
allowMutations: true
},
search: {
semanticWeight: 0.35,
maxProviderRecords: 500
}
};Project-specific areas, paths and vocabularies are resolved at runtime and exposed through the effective schema. The eight Work statuses and the schema-v2 memory collection semantics remain protocol contracts.
Work
Cards are managed Markdown records under .project/cards/. The Work module provides
hierarchy, dependencies, claims, scope, status transitions, archives, assets and
conflict-aware writes.
workfile card list --json
workfile card show T-0042 --json
workfile card create --title "Implement runtime schema" --area infra
workfile card create --json-input card.json # body, parent, source and tags in one call
workfile card claim T-0042 --scope apps/api,packages/sdk # actor resolves itself
workfile card transition T-0042 review
workfile card patch T-0042 --json-input changes.json --expected-revision sha256:...
workfile card archive T-0042
workfile card reopen T-0042 --status backlogDocs
Docs combines two sources without copying existing documentation:
Indexed documents discovered from configured globs. They receive deterministic
PATH-*IDs and remain read-only through the protocol.Managed documents stored in
.project/docs/with stableDOC-NNNNIDs, typed frontmatter and revision-aware mutations.
Managed documents are read recursively, so they can be grouped in folders — including
folders you create by hand. IDs stay global and sequential: a folder is organization,
not identity. New documents follow docs.layout (kind, the default, groups them by
document kind; flat writes them to the managed root) and --folder overrides it.
workfile doc list --query billing
workfile doc show DOC-0012 --json
workfile doc create --title "Deployment runbook" --kind runbook --status current
workfile doc create --title "Rate limiting" --folder architecture/billing
workfile doc move DOC-0012 --folder architecture
workfile doc patch DOC-0012 --json-input changes.json --expected-revision sha256:...The doctor detects broken local links, unresolved related or superseded records, missing scope paths and stale review/source relationships.
History
History uses atomic change fragments rather than asking multiple branches or agents to
edit one shared CHANGELOG.md.
Unreleased fragment:
---
id: CHG-0042
title: Add portable history workspace
type: added
area: infra
visibility: public
cards: [T-0042]
created: 2026-07-28
updated: 2026-07-28
---A release consumes selected fragments, moves them beneath the release directory and
creates a canonical REL-NNNN record. Public or internal changelogs are derived output.
workfile changelog list --unreleased
workfile changelog add --title "Add portable history" --type added --area infra
workfile changelog preview
workfile changelog release 0.4.0 --title "History and Memory"
workfile changelog render --visibility public
workfile changelog render --visibility public --write
workfile changelog verifyRelease versions can use semver, calendar or freeform validation according to
configuration. Fragments and releases participate in the same workfile search and backlink
graph as cards, docs and memory.
Memory
Memory is a set of typed, atomic and lifecycle-aware records rather than a single growing conversation transcript:
Collection | Prefix | Purpose |
Learnings |
| Reusable observations with confidence and occurrence signals |
Decisions |
| Proposed, accepted, rejected or superseded decisions |
Incidents |
| Operational events, severity, timing and corrective actions |
Conventions |
| Durable rules followed by humans and agents |
Context |
| Useful but potentially expiring project state |
workfile memory list --collection learnings --status active
workfile memory add learning --title "Atomic fragments avoid merge conflicts" \
--confidence high
workfile memory add decision --title "Keep Markdown canonical" --status accepted
workfile memory add incident --title "Release pipeline stalled" --severity high
workfile memory graduate LRN-0004 --to CONV-0002,DOC-0012
workfile memory supersede ADR-0003 --by ADR-0009
workfile memory patch CTX-0002 --json-input changes.json --expected-revision sha256:...
workfile memory verifyThe doctor checks invalid lifecycle states, missing graduation/supersession targets, expired context and incomplete incident resolution metadata.
Unified index
Every module normalizes its files as ProjectRecord entries through a common collection
registry. The derived process-local index provides:
weighted full-project text search;
lookup by stable record ID;
outgoing references and incoming backlinks across all four domains;
card
source:links and local Markdown links;module-specific health, lifecycle and freshness signals;
module and collection counts.
Canonical state always remains on disk. The server cache is short-lived, invalidatable and fully rebuildable.
workfile search "billing architecture"
workfile search release --kind change,release,memory --limit 25 --jsonInitialization
The initializer can run interactively or deterministically in automation. It detects the package manager, monorepo folders, likely card areas, documentation sources, existing agent environments and CI providers. A dry run exposes the exact filesystem plan.
pnpm dlx @illodev/workfile init
pnpm dlx @illodev/workfile init --yes \
--agents agents-md,claude,cursor,copilot --ci github
workfile init --dry-run --jsonThe generated project.config.mjs exports a plain object, so a workspace initialized via
pnpm dlx remains loadable before the package is installed locally. Existing files are not
overwritten unless --force is explicit. .project/.cache/ is added to .gitignore; all
canonical protocol files remain tracked.
Hosted demo
The UI ships with a demo mode for static hosting (Vercel, GitHub Pages, any file server).
npm run build:demo builds the UI with an in-memory API that replays a snapshot of a seeded
workspace: every view works and mutations behave normally for the session, then reset on
reload. The repository includes a vercel.json, so importing it into Vercel deploys the
demo with zero configuration.
pnpm run demo:data # reseed and resnapshot packages/workfile/ui/src/demo-data.json
pnpm run build:demo # static demo build into packages/workfile/dist/demoRegular builds tree-shake the demo layer and snapshot out of the bundle.
Releasing
Releases publish from CI via npm trusted publishing (OIDC) — no npm token is stored in the repository. The circuit:
Cut the changelog:
workfile changelog release <version>andworkfile changelog render --write.Bump and tag:
npm version <version>thengit push && git push --tags. The version hook carries everypackages/*package inside the same bump — workspace packages always ship the core's version.The
Releaseworkflow verifies the tag matchespackage.json(and that no workspace version drifted), runscheck:release(build, typechecks, tests, audit and a packaged-tarball smoke) with pnpm, and publishes the core and every workspace package with the npm CLI underlatest.
There is no prerelease channel: every published version is one npm install
away, and a v*-rc.* tag fails the release rather than publishing. That is a
consequence of trusted publishing rather than a preference — OIDC authorizes
npm publish and no other registry write, so CI cannot move a dist-tag off a
release candidate once it has been set.
Agent Protocol
Canonical instructions and workflows live under .project/agents/. Compact managed blocks
are synchronized into supported environments without replacing unrelated user content:
AGENTS.md
CLAUDE.md
.cursor/rules/workfile.mdc
.github/copilot-instructions.mdworkfile agents sync
workfile agents sync --targets agents-md,claude,cursor,copilot
workfile agents check
workfile agents context --card T-0042Managed blocks carry the package version and a SHA-256 digest. agents check and
workfile doctor report missing, unmanaged or stale generated instructions. Agent context is
bounded and prioritizes the selected card, direct relationships, active conventions,
unresolved incidents and non-expired context instead of loading all workfile memory.
Model Context Protocol
Workfile includes a local, dependency-free MCP server using UTF-8,
newline-delimited JSON-RPC over stdio. It delegates every operation to the same core
services used by the CLI and HTTP API, speaks both the modern (2026-07-28) and legacy
(2025-11-25) protocol revisions, and exposes 30 tools, four resources and three
prompts. Mutation tools disappear entirely in --read-only mode.
Point a client at it without installing anything. This is the invocation the
official registry publishes for
io.github.illodev/workfile, and what most clients will build for you from
that listing:
{
"mcpServers": {
"workfile": {
"command": "npx",
"args": ["-y", "@illodev/workfile", "mcp"]
}
}
}mcp there is a subcommand, not a binary: npx resolves the bin whose name
matches the package and hands it everything that follows. Append --root PATH
when the client starts somewhere other than the workspace — it searches
upwards for .project/ otherwise — and --read-only to serve the read tools
alone, with every mutation refused.
With the package installed, the same server is a subcommand away:
workfile mcp
workfile mcp inspect --json
workfile mcp config --read-only --jsonFor Claude Code the same surface ships as a plugin — the MCP server plus
/claim, /context, /next and /done commands, a skill, and hooks that
turn card claims into an executable guard rail — with no generated files
committed to the repository:
/plugin marketplace add illodev/workfile
/plugin install workfile@illodevThe full contract — tool inventory, resources, prompts, process hygiene and the
plugin's surface — is documented in docs/mcp.md.
The server is listed on Glama, which builds it in a container and inspects the capabilities it reports:
Search integrations
Lexical search remains deterministic and local. Hosts may inject an optional semantic provider programmatically; Workfile never selects a vendor or sends repository content over the network by itself.
First-party: local embeddings
@illodev/workfile-search-local runs embeddings on-device (onnxruntime-web,
ONNX on CPU, Xenova/multilingual-e5-small quantized) — repository content
never leaves the machine. Declare it in project.config.mjs with a guarded
import, because the config must also load where the package cannot resolve
(the generated CI job runs npx on a clean clone):
export const integrations = await (async () => {
try {
const { localSearchIntegration } = await import(
"@illodev/workfile-search-local"
);
return [localSearchIntegration()];
} catch {
return []; // package absent: search stays lexical
}
})();
export default {
// …
search: { provider: "local-embeddings" }
};Know the cost model before wiring it: the first hybrid search embeds every
uncached candidate record — minutes of sustained CPU on a few-thousand-record
workspace, triggered by whichever surface searches first (CLI, board UI, or
the MCP server an agent loads). The provider caps ONNX at half the cores by
default, persists per batch so an interrupted pass resumes instead of
restarting, and reports progress on stderr; sizing search.maxProviderRecords
to your corpus makes every record eligible. Details and options in
packages/search-local/README.md.
Bring your own
import {
createSemanticSearchProvider,
searchProjectRecordsHybrid
} from "@illodev/workfile/search";
const provider = createSemanticSearchProvider({
id: "company-embeddings",
async search({ query, records }) {
// Return [{ id, score }] with scores between 0 and 1.
return rankWithYourApprovedProvider(query, records);
}
});
const result = await searchProjectRecordsHybrid(index.records, query, {
provider,
semanticWeight: 0.35
});The adapter boundary makes external data disclosure an explicit host decision and keeps the canonical Markdown/index implementation provider-independent.
Experimental integration registry
Programmatic hosts can group approved semantic search and health adapters in a small, vendor-neutral registry:
import {
createIntegrationRegistry,
defineProjectIntegration
} from "@illodev/workfile/integrations";
const integrations = createIntegrationRegistry([
defineProjectIntegration({
id: "company.platform",
semanticSearchProvider: provider,
async healthCheck({ workspace, index }) {
return [];
}
})
]);The registry is accepted by the MCP server and doctor APIs. It is intentionally limited in the current RC: vendor-specific issue trackers, deployment systems and credentials are not part of the canonical package. The boundary can mature from real integrations without committing the schema to GitHub, GitLab, Jira or a deployment provider.
CI templates
CI files use the same managed-file contract and can be generated for GitHub Actions, GitLab CI or a generic shell runner:
workfile ci sync --targets github,gitlab,generic
workfile ci checkTemplates run both the workfile doctor and agent synchronization check against the pinned Workfile version.
Legacy migration
The v1 .planning system can be planned and applied with deterministic collision checks:
workfile migrate plan --source .planning
workfile migrate apply --source .planning --mode copy
workfile migrate apply --source .planning --mode moveValid legacy cards and assets become canonical v2 Work records. Old proposals, changelogs,
learnings and malformed records are preserved under .project/sources/legacy-planning/
rather than being silently reinterpreted with an incompatible schema. Every applied
migration writes .project/migrations/legacy-planning.json with source, destination, digest
and result metadata.
General CLI
workfile init
workfile schema --json
workfile doctor --json
workfile ui
workfile ui --read-only --host 0.0.0.0 --allowed-host board.example.comCommands return stable machine-readable errors with --json. A stale revision exits with
code 3; configuration errors exit with code 2; validation and not-found errors exit
with code 1. The complete command surface is documented in
docs/cli.md.
HTTP API
workfile ui --read-only --host 0.0.0.0 --allowed-host board.example.com serves the same
board as a thing people read: every mutating route answers 409 WORKSPACE_READ_ONLY and
the UI drops its editing affordances. There is still no authentication of its own, so put
a reverse proxy that authenticates in front of anything published this way — see
docs/security.md.
workfile ui starts the local server, normally at http://127.0.0.1:4747. The versioned
/api/v2/* surface covers the workspace, unified search, and every collection — cards,
docs, changelog (including release preview/assembly/render), memory lifecycle, agents and
CI sync. Managed record reads expose an ETag, writes accept If-Match, and errors use
stable codes. The endpoint reference lives in docs/http-api.md.
Local UI
Navigation is a collapsible sidebar grouped by domain:
Work: Explorer, Triage, Flow, Epics and a Gantt Timeline (status-colored bars, month scale, today marker).
Knowledge: Docs (search, Markdown, metadata, freshness, scope, backlinks) and Memory (typed collections, lifecycle warnings, graduation and supersession).
Project: Workflow (the provenance graph — every record a node, typed relations as edges), History (fragments, releases, release preparation, rendered changelog preview) and Health.
Health issues can navigate to records in any domain. Runtime configuration drives card
areas, change vocabularies and memory collection statuses; these values are not compiled
into the views. File links open the local editor, or the repository web UI when the
server provides a repoUrl (as the hosted demo does).

The Overview answers "how are we doing" in a sentence chosen worst-first — doctor errors, hanging claims, colliding scopes, blocked cards, work in flight — above the trail of every move the agents wrote while you were away.
Explorer with the inspector open | Gantt timeline |
|
|
History with releases | Memory (dark theme) |
|
|

Workflow reads the collections into one graph instead of four lists: the first row of toggles selects them, the second selects relation types. A relation declared in frontmatter draws a solid edge and an ID written into a sentence a dashed one, because a link in prose is a weaker claim than a field and should not look equally solid. Prose scanning is off by default — it is 294 of this workspace's 742 edges.
Development
The repository is a pnpm workspace: the root is a private shell that holds the
version and delegator scripts, while everything published lives under
packages/ — the core in packages/workfile, providers
like packages/search-local beside it, all shipping
in version lockstep. pnpm is pinned via the packageManager field
(corepack enable picks it up automatically):
pnpm install
pnpm run check
pnpm run smoke:package
node ./packages/workfile/dist/bin/workfile.js mcp inspect --root ./packages/workfile/test/fixtures/workspace --json
node ./packages/workfile/dist/bin/workfile.js schema --root ./packages/workfile/test/fixtures/workspace --json
node ./packages/workfile/dist/bin/workfile.js doctor --root ./packages/workfile/test/fixtures/workspace --json
node ./packages/workfile/dist/bin/workfile.js ui --root ./packages/workfile/test/fixtures/workspacepnpm run check compiles the TypeScript runtime and declarations, checks the strict public
consumer contract, typechecks and bundles the React UI, and runs the complete test suite.
pnpm run smoke:package packs and installs the actual tarball in a temporary project before
exercising initialization, all four domains, MCP and the packaged UI — the smoke installs
with npm on purpose, exercising the npm consumer path.
prepack rebuilds the runtime declarations and UI so a future published package contains
only compiled runtime artifacts under dist/, never development TypeScript or a copied UI
source tree.
Current guarantees
restricted frontmatter codec with byte-stable scalar/list round trips;
preservation of unknown frontmatter fields and body bytes;
atomic file replacement, per-record locks and collision-safe ID reservations;
SHA-256 revision tokens and stale-write rejection;
atomic Work claims, transitions, archive and reopen operations;
managed Docs, History fragments and typed Memory mutations;
release assembly with canonical fragment consumption and derived rendering;
configurable repository-safe paths and runtime vocabularies;
common normalization, search, references and backlinks across all domains;
health diagnostics for Work, Docs, History and Memory;
compiled ESM and
.d.tsdeclarations for the public package and subpath exports;executable packaged CLI/MCP binaries verified from a clean tarball installation;
versioned API plus a compatibility adapter for the original board.
Documents
docs/getting-started.md— install, initialize and the daily loop.docs/cli.md— complete CLI reference for every module.docs/http-api.md— endpoint reference, conventions and errors.docs/mcp.md— MCP server contract: tools, resources, prompts.docs/security.md— threat model of the local server, request guard, asset handling and what is deliberately out of scope.docs/ui.md— the interface: its build, the zero-dependency guarantee and how the shadcn migration coexists with the design system.docs/SPEC.md— the normative protocol specification: data model, record contracts, revision semantics and the MCP integration contract.
Available Tools
30 toolsproject_agent_contextBuild bounded agent contextARead-onlyIdempotent
Build a compact context bundle around a card from direct relations, active conventions, open incidents and active project context. Prefer this over reading records one by one before working on a card.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum related records to include. | |
| cardId | Yes | Card the bundle is centred on, e.g. T-0042. |
Output Schema
| Name | Required | Description |
|---|---|---|
| focus | Yes | ID of the card the bundle was built around. |
| records | Yes | The selected records, with bodies. |
| markdown | No | The same bundle rendered as Markdown, ready to paste into a prompt. |
| truncated | No | True when relevant records were dropped to respect limit. |
| generatedAt | No | When the bundle was assembled, RFC 3339. |
| totalAvailable | No | Related records before limit was applied. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds the key behavior of aggregation (from multiple source types: direct relations, conventions, incidents, project context) and boundedness ('compact context bundle', 'limit' defaults). However, it doesn't describe what happens when no data is found for a category, or how current the data is. With strong annotations present, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste. The first sentence states the purpose with concrete content types; the second provides an actionable usage recommendation. Every phrase earns its place, and the description is front-loaded with the most important information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool outputs a context bundle (with an output schema present), so the description need not explain return values. It enumerates the source types that feed the bundle, names the intended workflow use-case, and the annotations + schema cover the safety and parameter dimensions. For a read-only aggregation tool, this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the input schema already documents both parameters (cardId and limit) fully. The description adds value by explaining that the bundle is 'centred on' the card and is 'compact' (bounded), which clarifies the semantic role of the limit parameter beyond its schema description. However, the param-level value-add is modest since the schema is already complete, giving a 4 rather than 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb+resource ('Build a compact context bundle around a card') and clearly enumerates what it aggregates: direct relations, active conventions, open incidents, and active project context. It clearly distinguishes itself from sibling tools like project_get_record or project_search, making the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to prefer this tool: 'Prefer this over reading records one by one before working on a card.' This gives the agent a clear decision rule and differentiates from sibling tools that fetch single records or search. It explains the intended workflow context (working on a card) rather than just what the tool does.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_card_archiveArchive a closed work cardADestructive
Move a closed card to the canonical archive directory. Only done and discarded cards can be archived; the ID and the file survive, so project_card_reopen undoes this.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Card to archive. Must already be done or discarded. | |
| expectedRevision | No | Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check. |
Output Schema
| Name | Required | Description |
|---|---|---|
| record | Yes | A canonical record with its body, revision and reference graph. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=false. The description adds meaningful behavioral context: the card 'survives' (the archive is reversible via project_card_reopen), which is genuinely new information beyond annotations. It doesn't discuss permission/auth requirements, but given the annotation coverage and that this is a state-change operation, the transparency is decent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two crisp sentences with zero filler. The first sentence states the action, the second packs the precondition, survivability, and reversibility notes into an efficient caveat clause. Everything earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema (so return format is handled), full schema coverage for 2 params, and clear annotations (destructiveHint=true), the description covers the essential semantics: what it does, which cards qualify, and reversibility. It could mention concurrency/revision implications or permissions, but for a single-item state-change tool this is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are documented in the schema. The description adds value by confirming the id parameter must reference a done/discarded card, aligning with the schema. The expectedRevision parameter is not elaborated in the description, but the schema covers its semantics (concurrency check) thoroughly, so the baseline 3 is exceeded slightly by the id constraint reinforcement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The title 'Archive a closed work card' plus description 'Move a closed card to the canonical archive directory' clearly state the verb (archive/move) and resource (closed card). It doesn't explicitly distinguish from siblings like project_card_write or project_card_reopen, but the domain-specific 'canonical archive directory' adds clarity. It drops slightly from a 5 because it doesn't name the sibling alternatives for differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states the precondition ('Only done and discarded cards can be archived') and notes the reversible nature via project_card_reopen, giving clear context. It doesn't explicitly say when NOT to use it or name alternatives as the when/not alternatives, but the inversion (reopen undoes) implies the lifecycle placement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_card_claimClaim a work cardA
Claim a card for an actor, move it to doing and optionally declare the filesystem scope that will be changed. Claim before editing anything the card covers; another actor's claim is refused unless forced.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Card to claim, e.g. T-0042. | |
| actor | Yes | Who is claiming. Defaults to the MCP client's own name; a hand-typed value will not match the identity the edit guard sees. | |
| force | No | Take a claim another actor already holds. Requires reason. | |
| scope | No | Repository paths this claim covers. Overlapping scopes are what stop two agents editing the same files. | |
| reason | No | Why the existing claim is being taken over. Recorded on the card. | |
| expectedRevision | No | Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check. |
Output Schema
| Name | Required | Description |
|---|---|---|
| record | Yes | A canonical record with its body, revision and reference graph. |
| warnings | No | Non-fatal findings, such as a stale claim that was taken over. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly and non-idempotent, so the description needn't repeat that. It adds valuable context: the claim mutates state (moves to 'doing'), enforces exclusivity (refused unless forced), and involves concurrency protection. It doesn't describe the return format or outcome details, but with annotations covering the basic safety profile plus output schema present, this is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero filler. Front-loads the core action and purpose, then adds the critical exclusivity caveat. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex concurrency-sensitive tool with 6 parameters, dedicated annotations, and an output schema, the description is complete. It captures the essential mutating behavior, exclusivity rules, filesystem scope purpose, force/override semantics, and timing guidance. The output schema and rich parameter descriptions handle the rest.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and parameters are richly described in the schema itself. However the description adds meaningful semantics beyond the schema: it frames scope as the mechanism 'stopping two agents editing the same files' and clarifies that claim refusal semantics are the core behavior. The description and schema together fully explain the 6 parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the verb, resource, and concurrent effects: 'Claim a card for an actor, move it to doing and optionally declare the filesystem scope that will be changed.' This distinctly differentiates it from siblings like project_card_release, project_card_transition, and project_card_patch by naming the claim + move-to-doing + scope behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('Claim before editing anything the card covers') and the exclusivity semantics ('another actor's claim is refused unless forced'), giving clear when/when-not guidance versus the sibling release and patch tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_card_createCreate a work cardA
Create one canonical Work card with a concurrency-safe stable ID. Search first: this mints a new record rather than finding an existing one.
| Name | Required | Description | Default |
|---|---|---|---|
| due | No | Target completion date, YYYY-MM-DD. | |
| area | No | Part of the system this touches. Project-declared, so the accepted values vary; project_workspace reports them. | |
| axes | No | Declared classification axes as { axis: value }, e.g. { context: "treasury" }. Project-declared, so the accepted values vary; project_workspace reports them. | |
| body | No | Markdown body, written below the frontmatter. | |
| tags | No | Free-form tags for filtering. | |
| type | No | What kind of work this is. | |
| scope | No | Repository paths this work will change. Declared here, enforced when the card is claimed. | |
| start | No | Planned start date, YYYY-MM-DD. | |
| title | Yes | What the card is about, in one line. | |
| effort | No | Rough size: S, M or L. | |
| parent | No | ID of the parent card. The hierarchy is bounded by cards.maxHierarchyDepth. | |
| source | No | Where the work came from: an issue URL, a person, a meeting. | |
| status | No | Starting lifecycle status. | backlog |
| depends | No | IDs of cards that must close first. Blocks this card from being ranked as actionable. | |
| related | No | IDs of records worth reading alongside this one. | |
| priority | No | How urgent the work is. |
Output Schema
| Name | Required | Description |
|---|---|---|
| record | Yes | A canonical record with its body, revision and reference graph. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false (it mutates), which the description's 'Create' and 'mints a new record' wording confirms—no contradiction. The description adds the concurrency-safe stable ID behavior as useful context. However, as a creation tool with an output schema, it doesn't disclose return behavior or whether partial failures occur, and 100% schema coverage means the description carries moderate additional burden beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with no filler. The operational guidance ('search first') is front-loaded and adds value. It could arguably mention the distinction from project_card_write explicitly, but the existing structure is tight and purposeful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a complex 16-parameter tool with an output schema and annotations present, the description covers the key operational concern (search-first to avoid duplicates, concurrency-safe ID). The nuanced project-declared values (area, axes) are delegated to project_workspace which is correctly referenced. It's reasonably complete for a create operation, though could note what the canonical-creation invariant ensures about duplicates.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema documents all 16 parameters thoroughly. The description doesn't add parameter-level meaning beyond the schema. Baseline 3 is appropriate since the schema does the heavy lifting, though the description's comment about project_workspace for accepted area/axes values aligns with what schema already notes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb+resource ('Create one canonical Work card') with a distinctive attribute ('concurrency-safe stable ID'). It distinguishes from project_card_write (which shares the 'create' domain) by emphasizing 'one canonical' card with concurrency safety. However, it doesn't explicitly name the sibling it differs from, leaving some differentiation implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Search first: this mints a new record rather than finding an existing one' provides explicit usage guidance, implying the agent should check for existing cards (via project_next or project_search) before calling create to avoid duplication. This gives clear context on when this tool is appropriate. It doesn't explicitly list excluded sibling tools, but the guidance is actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_card_listList work cardsARead-onlyIdempotent
List cards filtered by status, area, type, priority, parent or claim. Use before starting work; use project_search for full-text.
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | Keep only these areas. Project-declared, so the accepted values vary; project_workspace reports them. | |
| tags | No | Keep cards carrying any of these tags. | |
| type | No | Keep only these card types. One of: epic, idea, feature, bug, task, audit, docs, chore. | |
| limit | No | Maximum cards to return. | |
| offset | No | Skip this many matches before the page starts. | |
| parent | No | Keep only direct children of this card ID. | |
| status | No | Keep only these statuses; any match passes. One of: backlog, next, doing, review, blocked, deferred, done, discarded. | |
| priority | No | Keep only these priorities. One of: critical, high, medium, low. | |
| claimedBy | No | Keep only cards claimed by this actor. | |
| unclaimed | No | Keep only cards nobody has claimed. | |
| updatedSince | No | Only records updated on or after this date. YYYY-MM-DD; an RFC 3339 timestamp is read as its date. |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | No | Maximum this page could contain. |
| total | Yes | Matches before offset and limit were applied. |
| offset | No | Offset this page started at. |
| records | Yes | Cards matching the filters, in list projection. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is well covered by structured data. The description adds the filtered-list semantics and the 'use before starting work' workflow context. The openWorldHint=false is slightly in tension with the description implying exhaustive results, but this is reasonable for a filter-based read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the first enumerates the filter dimensions in a compact list, the second states usage context and the alternative tool. Zero waste, all information earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 11-parameter read tool with an output schema and strong annotations, the description is complete enough. It explains the filter scope, provides usage timing, and names the alternative. No nested-object complexity or undocumented safety concerns. Could mention pagination behavior (limit/offset) but the schema documents those defaults clearly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each parameter having a detailed description including enums for type, status, and priority. The description names the filter dimensions but adds little beyond the schema. Baseline 3 is appropriate since the schema carries the full burden of parameter documentation and does so well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (list) and resource (work cards) with explicit filter dimensions (status, area, type, priority, parent, claim). It distinguishes from sibling project_search by noting the full-text alternative, and name/title reinforce the same purpose without contradiction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use before starting work' provides clear contextual guidance for when to invoke this tool, and it explicitly names project_search as the alternative for full-text queries. It doesn't enumerate every sibling's differentiation, but the key alternative is called out, which is sufficient given the schema provides exhaustive filter options.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_card_noteAppend a note to a cardA
Append one timestamped line under a heading. Cheaper than rewriting the body and safe when two agents write at once.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Card to append to. | |
| text | Yes | The line to append. One observation, not a paragraph. | |
| actor | No | Who to attribute this to. Defaults to the MCP client's own name; pass one only to act on another actor's behalf. | |
| section | No | Heading to append under. Created if it does not exist yet. | Notes |
Output Schema
| Name | Required | Description |
|---|---|---|
| record | Yes | A canonical record with its body, revision and reference graph. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false (mutation) and destructiveHint=false, which the description supports by explaining it appends rather than rewrites. The description adds value by explaining concurrency safety and the "created if it does not exist" section behavior via the schema. It doesn't mention idempotency implications or whether the timestamp is server-side, but annotations cover the core safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action, and zero filler. Every phrase earns its place — the timestamped-line detail, the cost comparison, and the concurrency safety are all high-value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an append-only tool with 4 params (100% schema coverage) and an output schema, the description plus schema fully covers the behavioral contract. The concurrency-safety note addresses the key risk of a mutation tool, and the heading-creation behavior is documented in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds the "timestamped" behavior and the "safe for concurrent writes" framing but doesn't add details about parameter formats or constraints beyond schema descriptions, which already document actor defaulting and section creation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description says "Append one timestamped line under a heading" — specific verb (append), specific resource (card), and specific mechanism (timestamped line under heading). It distinguishes from sibling card_write and card_patch by emphasizing the append-only, cheap, concurrent-safe nature.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description says it's "cheaper than rewriting the body and safe when two agents write at once," which signals when to prefer this tool over writing/patching the body. It doesn't explicitly name the alternative tools (card_write/card_patch) or give exclusions, but the context is clear enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_card_patchPatch a work cardAIdempotent
Patch allowed card metadata using optimistic concurrency. Use expectedRevision whenever the card was read earlier. Declared axes go in changes.axes as { name: value }; an empty value clears one.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Card to patch. | |
| changes | Yes | Frontmatter fields to overwrite, e.g. { priority: "high", tags: ["mcp"] }. Only the keys present are touched. Use project_card_transition for status and project_card_write for the body; declared axes go under an axes key. | |
| expectedRevision | No | Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check. |
Output Schema
| Name | Required | Description |
|---|---|---|
| record | Yes | A canonical record with its body, revision and reference graph. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=true, covering the safety profile. The description adds valuable behavior not in annotations: optimistic concurrency semantics — that expectedRevision causes refusal on stale writes and that an empty axes value clears an axis. The 'only the keys present are touched' partial-update behavior is also disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two dense, front-loaded sentences with zero filler. Every clause conveys load-bearing information: the operation, the concurrency model, the expectedRevision condition, and the axes clearing semantics. The schema descriptions are also concise and informative. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 3 params (100% schema coverage), nested objects, an output schema, and clear annotations. The description, combined with the rich schema and annotations, fully covers the patch mechanics, concurrency behavior, and axis handling. It's complete for the tool's complexity. The only minor gap is it doesn't explicitly preview the output, but the output schema exists so that burden is transferred.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters well. The description adds value beyond the schema: it clarifies that an empty axes value clears an axis, names the exact shape '{ name: value }' for changes.axes, and explains the concurrency-check behavior of expectedRevision beyond its schema text. This exceeds the schema-only baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description says 'Patch allowed card metadata using optimistic concurrency' — a specific verb (patch) plus resource (card metadata) plus a defining mechanism (optimistic concurrency). It clearly distinguishes itself from siblings: the schema notes status belongs to project_card_transition and body to project_card_write, and the description explains axes placement, disambiguating from project_card_write and others.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance: 'Use expectedRevision whenever the card was read earlier' and 'Declared axes go in changes.axes'. The schema additionally directs status changes to project_card_transition and body changes to project_card_write, naming concrete alternatives. This is strong when-to-use versus alternative-tool guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_card_releaseRelease a claimAIdempotent
Release your claim on a card and move it out of doing. Call when work stops, finished or not.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Card whose claim is being released. | |
| actor | No | Who to attribute this to. Defaults to the MCP client's own name; pass one only to act on another actor's behalf. | |
| force | No | Release a claim held by another actor. Requires reason. | |
| reason | No | Why another actor's claim is being released. Recorded on the card. | |
| status | No | Status to leave the card in. Omit to keep the current one — a card just moved to done is not demoted by releasing it — except doing, which becomes next because active work without a claimant is a contradiction. doing is refused as an explicit target. | |
| expectedRevision | No | Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check. |
Output Schema
| Name | Required | Description |
|---|---|---|
| record | Yes | A canonical record with its body, revision and reference graph. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, so the mutation profile is known. The description adds valuable behavioral nuance: the status handling rule that 'doing becomes next because active work without a claimant is a contradiction' and that doing is refused as an explicit target. The status-field description (inside params) explains the done-not-demoted edge case. Describes the force/actor interaction implicitly. Good behavioral context beyond annotations, though it could note the audit/permission implications of force more explicitly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences front-load the purpose and trigger condition. No wasted words. Every sentence earns its place, and the nuanced status behavior is deferred to the parameter schema where it belongs rather than cluttering the description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with idempotence declared and full schema coverage plus an output schema, the description is largely complete. It covers the action, the trigger, and the core behavioral twist (status handling). Could arguably add more on the force/reason authorization flow, but with 100% schema coverage and output schema present, the description carries adequate weight. Good completeness for its complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 6 parameters are documented in the schema. The description adds specific behavioral context for the status parameter: the exception that a card just moved to done is not demoted by releasing, and the doing-becomes-next rule. This is genuinely useful semantic guidance beyond the raw enum/schema text. However, the description itself doesn't enumerate each parameter, relying on the full schema coverage, so baseline 3 plus the status nuance earns a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action: 'Release your claim on a card and move it out of doing.' This is a specific verb+resource with clear scope. It distinguishes from sibling tools like project_card_claim (the inverse operation) and project_card_transition by focusing on claim release specifically. Clear and actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Call when work stops, finished or not' provides clear trigger context for when to use the tool. It distinguishes releasing from simply transitioning by noting it moves cards 'out of doing.' While it doesn't explicitly name alternatives or when-not-to-use, the purpose is clear enough that the agent can differentiate this from claim, transition, and patch operations. Lacks explicit exclusions naming sibling alternatives, hence not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_card_reopenReopen an archived work cardA
Move an archived card back out of the archive directory and into a live status. The ID never changes, so every existing reference to it keeps resolving.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Archived card to bring back. | |
| actor | No | Who to attribute this to. Defaults to the MCP client's own name; pass one only to act on another actor's behalf. | |
| status | No | Status to reopen into. | backlog |
| expectedRevision | No | Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check. |
Output Schema
| Name | Required | Description |
|---|---|---|
| record | Yes | A canonical record with its body, revision and reference graph. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false. The description's key value is the 'ID never changes' guarantee and the mechanism (moving out of archive directory into a live status). However, it doesn't disclose things like whether reopened cards retain notes/memory, or what happens to the prior done/archived status beyond the archive flag. With annotations covering the safety profile, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero waste. The first delivers the purpose and action; the second delivers the critical behavioral guarantee (ID stability). Front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema exists and schema coverage is 100%, so the description doesn't need to detail returns. The key forward-looking guarantee (ID never changes) is stated. It could briefly note that reopening impacts references for the status param or the actor field, but the essentials are covered for this moderately complex tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all 4 params are documented. The description adds meaningful context on the 'id' param (the one that never changes) and complements the 'status' enum by clarifying the card is 'brought back into a live status.' It reinforces the expectedRevision semantics through the 'write is refused if no longer matches' phrasing, adding practical value beyond the schema's 'skip the check' note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb+resource: 'Move an archived card back out of the archive directory and into a live status.' Specifies what it does and the key net effect (the ID never changes, references keep resolving). While it's clear and distinct from siblings like project_card_archive (the inverse action), it doesn't explicitly name a sibling as a contrast, so not quite a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is used after project_card_archive, and states the ID-stability benefit. However, it doesn't explicitly say when to use this versus project_card_transition or project_card_write (which also affect status), nor state any preconditions or exclusions for when reopening is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_card_transitionTransition a work cardA
Move a card to another protocol status. Moving to doing claims the card for the actor; review means the implementation is finished but unverified, and done requires evidence it ran, not a commit.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Card to transition. | |
| actor | No | Who to attribute this to. Defaults to the MCP client's own name; pass one only to act on another actor's behalf. | |
| scope | No | Repository paths to claim when moving to doing. Ignored by the other statuses. | |
| status | Yes | Target status. backlog: identified, uncommitted. next: prioritized. doing: actively worked, and claimed by the actor. review: implemented, awaiting verification. blocked: externally blocked, record why. deferred: postponed on purpose, record why. done: verified where it actually runs. discarded: will not be done, record why. | |
| expectedRevision | No | Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check. |
Output Schema
| Name | Required | Description |
|---|---|---|
| record | Yes | A canonical record with its body, revision and reference graph. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, so the tool is known to mutate but not destroy. The description adds valuable semantics beyond annotations: moving to 'doing' claims the card for the actor, 'done' requires evidence it ran (not a commit). This adds protocol-level behavioral context that annotations alone don't convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action and then targeted clarifications on the most semantically-loaded statuses (doing, review, done). No wasted words. Could arguably be even tighter, but every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is moderately complex (8 statuses, 5 params) with a full output schema and 100% schema coverage. The description covers the key conceptual distinctions (claim semantics, verification requirement, evidence standard). The mutating-but-not-destructive profile is clear, and the complexity is well addressed for an agent selecting transitions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the status enum and parameter descriptions are complete. The description adds meaningful value beyond the schema: it clarifies the claim-on-doing behavior and the evidence requirement for 'done', which enrich what the enum descriptions alone convey. The description reinforces but doesn't restate the full enum.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Move') and resource ('a card') with clear target (''another protocol status'). It names what the tool does. However, it doesn't explicitly distinguish from siblings like project_card_claim, project_card_release, or project_card_reopen, though the status-enum and claim semantics provide implicit differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clarifies nuanced semantics of moving to 'doing', 'review', and 'done' (claiming for actor, verification, evidence-of-run). It gives implicit context but doesn't explicitly say when to use this vs alternatives like project_card_claim/release, nor state exclusions. Sibling differentiation is implied through status semantics rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_card_writeReplace a card bodyA
Replace the Markdown body of a card under the protocol's lock and revision check. Use project_card_note to append instead.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Card whose body is being replaced. | |
| body | Yes | The complete new Markdown body. This overwrites, so read the card first unless you intend to discard what is there. | |
| expectedRevision | No | Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check. |
Output Schema
| Name | Required | Description |
|---|---|---|
| record | Yes | A canonical record with its body, revision and reference graph. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=false, but the description and schema clarify this is an overwriting operation ('The complete new Markdown body. This overwrites'). The schema's expectedRevision parameter explains the concurrency behavior ('The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten'), which adds meaningful behavioral context beyond the annotations about the destructive/overwrite semantics and lock/version checking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tight sentences: one states the primary action and mechanism, the second gives the sibling alternative. Zero wasted words, and the overwrite warning is delivered in the schema. Perfect front-loading of the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a mutation with a concurrency-control mechanism, and the schema + annotations cover the essential context well. The description explains the protocol lock/revision behavior and names the append alternative. The output schema exists, so return-value documentation isn't needed. Slight gap: no mention of what happens if the id doesn't exist, but the revision check covers the main failure mode.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (id, body, expectedRevision) are documented in the schema itself. The description adds marginal value ('This overwrites, so read the card first' clarifies body semantics beyond a plain field label). Per the rubric, baseline 3 is appropriate when the schema already handles parameter documentation fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb+resource+action: 'Replace the Markdown body of a card' with a specific mechanism ('under the protocol's lock and revision check'). It distinguishes from sibling project_card_patch (partial vs full replace) and explicitly points to project_card_note as the append alternative. This clearly differentiates from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly names the alternative tool for appending ('Use project_card_note to append instead') and the schema hints to read the card first ('read the card first unless you intend to discard what is there'). The expectedRevision parameter semantics also tell the agent when to use it and what happens on mismatch, giving clear when-to-use and excluded-behavior guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_changelog_addAdd a changelog fragmentA
Create an atomic unreleased changelog fragment and relate it to cards, decisions or other records. One fragment per user-visible change, written when the change lands rather than when the release is cut.
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | Part of the system that changed. Project-declared, so the accepted values vary; project_workspace reports them. | |
| body | No | Markdown body, written below the frontmatter. | |
| tags | No | Free-form tags for filtering. | |
| type | No | What kind of change this is — added, changed, fixed and so on. Project-declared, so the accepted values vary; project_workspace reports them. | |
| cards | No | IDs of the cards this change came from. | |
| title | Yes | The change, stated from the reader's side rather than the implementer's. | |
| issues | No | External issue or ticket references. | |
| related | No | IDs of other records worth reading alongside. | |
| decisions | No | IDs of decision records this change implements. | |
| visibility | No | Who the entry is rendered for, typically public or internal. Project-declared, so the accepted values vary; project_workspace reports them. |
Output Schema
| Name | Required | Description |
|---|---|---|
| record | Yes | A canonical record with its body, revision and reference graph. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, so the mutating nature is already signaled; annotations do not contradict. The description adds behavioral context: fragments are 'unreleased' (they accumulate until a release tool consolidates them) and 'atomic', giving the agent a sense of scope and lifecycle. It doesn't detail response format or failure modes, but output schema and annotations cover some of this. Slight gap on what happens after creation, but the note about 'unreleased' is valuable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, front-loaded with the core purpose. The second sentence adds genuinely useful operational guidance (granularity and timing). Could arguably be trimmed but every word earns its place and nothing is redundant with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 10 parameters but full schema coverage and a present output schema, the description's job is modest. It communicates the invariance rules (atomic, unreleased, timing) which the schema cannot express. It doesn't spell out the relation types fully, but the schema fields (cards, decisions, related, issues) cover that. Reasonably complete for a create-oriented tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all 10 parameters have structured descriptions already. The description adds the 'atomic' and 'unreleased' framing that connects to title/body semantics, but doesn't itself explain individual parameters. Per the baseline rule, schema is doing the heavy lifting, so 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Create an atomic unreleased changelog fragment') and adds clear semantics: one fragment per user-visible change, written when the change lands rather than when release is cut. It also mentions relating to cards, decisions, or other records, which distinguishes it from siblings like project_changelog_patch (edits existing) and project_changelog_list (lists).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear timing guidance ('written when the change lands rather than when the release is cut') and the atomicity rule ('One fragment per user-visible change'). It implies the creation use-case distinct from patch/release siblings, though it doesn't explicitly say 'use list/patch instead when...'. The timing and granularity advice is useful, context-rich guidance by name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_changelog_listList change fragments and releasesARead-onlyIdempotent
List unreleased change fragments and cut releases, filtered by type, area or visibility.
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | Keep only these areas. Project-declared, so the accepted values vary; project_workspace reports them. | |
| type | No | Keep only these change types. Project-declared, so the accepted values vary; project_workspace reports them. | |
| limit | No | Maximum records to return. | |
| offset | No | Skip this many matches before the page starts. | |
| released | No | true keeps only fragments already consumed by a release; false keeps only unreleased ones. | |
| visibility | No | Keep only these visibilities, typically public or internal. Project-declared, so the accepted values vary; project_workspace reports them. |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | No | Maximum this page could contain. |
| total | Yes | Matches before offset and limit were applied. |
| offset | No | Offset this page started at. |
| records | Yes | Change fragments and releases matching the filters, in list projection. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, establishing this as a safe read operation. The description adds the 'released' filtering semantic (consumed by release vs unreleased) as context beyond what annotations provide. For a read-only listing tool with strong annotations, the coverage is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence covering purpose and filter dimensions. It's efficient and front-loaded, though the enumerated filters in the description are implied rather than explicitly mapped to parameter names, which would add marginal clarity without bloating length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is an output schema present (has_output_schema=true), so return structure doesn't need description coverage. With 100% param schema coverage and read-only annotations, the tool is reasonably self-documenting. The description could mention the released/unreleased distinction as the core listing dimension, but overall completeness is good for a listing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all 6 parameters have descriptions in the schema itself. The description adds a collapsed enumeration of filter dimensions (type, area, visibility) mapping to 3 of the params. The 'released' boolean parameter is documented in the schema but not surfaced in the description, which would have been helpful. Baseline 3 plus the filter-dimension synopsis merits a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists unreleased change fragments and cut releases, filterable by type, area, or visibility. This distinguishes it from sibling changelog tools (add, patch, preview, release) which are mutation or preview operations. However, it doesn't explicitly contrast against sibling changelog_list variants, so it's clear but not fully differentiating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for listing/filtering changelog content but provides no explicit when-to-use guidance or exclusions. Siblings like project_changelog_add, project_changelog_patch, project_changelog_release are clearly mutations, so listing is the natural read operation, but no alternative tools are named and no exclusion criteria given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_changelog_patchPatch a changelog fragmentAIdempotent
Patch an unreleased changelog fragment using optimistic concurrency. Only works before a release consumes the fragment; afterwards the text belongs to that release.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Unreleased fragment to patch, e.g. CHG-0101. | |
| changes | Yes | Frontmatter fields to overwrite — title, type, area, visibility, tags and the relation lists — plus body to replace the Markdown. Only the keys present are touched. | |
| expectedRevision | No | Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check. |
Output Schema
| Name | Required | Description |
|---|---|---|
| record | Yes | A canonical record with its body, revision and reference graph. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false (it's a write), idempotentHint=true, and destructiveHint=false. The description adds meaningful behavioral context beyond annotations: the optimistic-concurrency mechanism and the release-boundary constraint ('afterwards the text belongs to that release'). This directly explains what happens in the concurrent-edit case and the lifecycle boundary.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two crisp, front-loaded sentences with zero wasted words. The first sentence states the purpose plus the key concurrency mechanism; the second sentence nails the critical lifecycle boundary. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the moderately complex signature (a nested object parameter, an optional concurrency-check param) and the presence of an output schema, the description covers the essential operational semantics. It leaves details of the output schema to the schema itself. Could mention what fields are valid in 'changes' or error behavior, but the schema covers field names and the description covers the partial-update and concurrency semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description's first sentence adds lifecycle semantics for the id parameter context and explains the concurrency-check behavior of expectedRevision. The 'Only the keys present are touched' note clarifies partial-update semantics for the changes object beyond what the schema states, which is valuable for an object parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Patch an unreleased changelog fragment') with clear scoping — it operates on 'unreleased' fragments only and explicitly distinguishes itself from the release-related lifecycle ('Only works before a release consumes the fragment'). It differentiates from sibling tools like project_changelog_add, project_changelog_list, and project_changelog_release which are lifecycle peers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states when the tool works ('before a release consumes the fragment') and its optimistic-concurrency behavior. It could be strengthened with an explicit alternative mention (e.g., adding vs patching a fragment), but the lifecycle constraint provides clear operational guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_changelog_previewPreview a releaseARead-onlyIdempotent
Render selected unreleased fragments without mutating the repository. Use to read a release before project_changelog_release makes it permanent.
| Name | Required | Description | Default |
|---|---|---|---|
| visibility | No | Render only entries at this visibility, typically public or internal. Omit to include all of them. Project-declared, so the accepted values vary; project_workspace reports them. | |
| fragmentIds | No | Fragments to include, e.g. CHG-0101. Omit to preview every unreleased fragment. |
Output Schema
| Name | Required | Description |
|---|---|---|
| groups | No | Entries bucketed by change type, in render order. |
| markdown | Yes | The release notes as they would be written. |
| fragments | No | Fragments this preview covered. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the agent knows it's a safe read. The description adds the non-mutating scoping ('without mutating the repository'), which reinforces but doesn't heavily extend beyond annotations. No info on output format, but output_schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero padding. Each sentence earns its place: one states the action+non-mutating guarantee, the other gives usage context against the sibling. Front-loaded purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only preview tool with 2 optional params, full schema descriptions, an output schema, and solid annotations, the description is complete. The only slight gap is explaining why visibility values are project-variable, but the description already points to project_workspace for resolution, which is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema documents both params well. The description adds context: it explains that visibility is project-declared with varying accepted values, and that omitting fragmentIds previews every unreleased fragment. This adds operational meaning beyond raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb ('Render') + resource ('selected unreleased fragments') with explicit non-mutating scope. Names the sibling project_changelog_release as the permanent counterpart, distinguishing it well.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use to read a release before project_changelog_release makes it permanent,' naming the alternative and the sequential relationship. This gives clear when-to-use guidance against a specific sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_changelog_releaseCreate a releaseADestructive
Consume selected unreleased fragments and create a canonical release record. This moves fragment files into the release directory, so preview first: the fragments stop being separately editable.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Markdown prelude written above the generated entries. | |
| date | No | Release date, YYYY-MM-DD. Defaults to today. | |
| tags | No | Free-form tags for filtering. | |
| title | No | Release title. Defaults to the version itself. | |
| commit | No | Commit SHA this release was cut from. | |
| version | Yes | Version being cut, e.g. 0.5.4. Validated against changelog.releaseStrategy. | |
| visibility | No | Visibility of the release record itself, typically public or internal. Project-declared, so the accepted values vary; project_workspace reports them. | |
| fragmentIds | No | Fragments to consume, e.g. CHG-0101. Omit to consume every unreleased fragment. |
Output Schema
| Name | Required | Description |
|---|---|---|
| record | Yes | The release record that was created. |
| consumedFragments | Yes | Fragments that moved into the release directory and no longer exist as unreleased records. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=false and destructiveHint=true, but the description adds genuine value by explaining the specific destructive consequence: 'the fragments stop being separately editable' and that files are moved into the release directory. This goes beyond the annotation's generic destructive flag, warning the agent that the action is irreversible for those fragments. Combined with the destructiveHint=true annotation, this is solid behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste. Each sentence earns its place: the first states the action and resource, the second adds the critical destructive consequence and preview instruction. Front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 8 parameters but all are documented in the 100%-covered schema. It has an output schema and destructiveHint annotation. The description explains the core destructive behavior (moving fragments, losing separate editability) and the preview prerequisite. Given the complexity of the release operation, the description is adequate though it could mention what the output schema contains; however, with an output schema present, the description isn't required to explain return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is documented in the schema itself. The description adds marginal value: it clarifies the semantics of the key destructive parameter (fragmentIds: 'Omit to consume every unreleased fragment') which is a meaningful behavioral note. However, most parameter meaning is carried by the schema descriptions, so the baseline-3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb+resource+outcome: 'Consume selected unreleased fragments and create a canonical release record.' It distinguishes from siblings by describing the fragment-to-release mechanism, which is unique among changelog-related tools (project_changelog_add/list/patch/preview don't aggregate fragments into a release).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: you consume fragments and create a release record. It implies this is the finalization step and that previewing (project_changelog_preview) is a prerequisite via 'preview first'. It doesn't explicitly name the sibling alternative or give when-not scenarios, but the guidance is strong enough for selecting this tool over changelog add/patch/preview.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_doc_createCreate managed documentationA
Create a managed Markdown document with a stable DOC ID. Without an explicit folder the workspace docs.layout decides where it is written.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Markdown body, written below the frontmatter. | |
| kind | No | What sort of document this is — architecture, runbook, reference and so on. Project-declared, so the accepted values vary; project_workspace reports them. | |
| tags | No | Free-form tags for filtering. | |
| scope | No | Subject matter this document covers — topics, not file paths. | |
| title | Yes | What the document is about, in one line. | |
| folder | No | Folder below the managed docs root. Omit to let docs.layout decide; an empty string writes to the root. | |
| owners | No | Who is answerable for keeping this accurate. | |
| source | No | Where the content came from: a URL, a person, a meeting. | |
| status | No | Lifecycle status, typically draft or current. Project-declared, so the accepted values vary; project_workspace reports them. | |
| related | No | IDs of records worth reading alongside this one. | |
| supersedes | No | IDs of documents this replaces. They are marked superseded. | |
| review_after | No | Date after which this goes stale, YYYY-MM-DD. Defaults to docs.reviewIntervalDays from now. |
Output Schema
| Name | Required | Description |
|---|---|---|
| record | Yes | A canonical record with its body, revision and reference graph. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, indicating mutation but with no safety issue requiring disclosure. The description adds useful context about folder routing behavior and implicitly the creation action. However, it doesn't disclose behavioral traits like whether a DOC ID is auto-generated, what happens with duplicate titles, or whether creating generates review/stale reminders beyond the default review_after semantics mentioned in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose and a single meaningful behavioral constraint about folder placement. No fluff or redundancy. It earns its words, though it could be slightly more explicit about sibling differentiation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 12 parameters but 100% schema coverage and an output schema present, the description doesn't need to enumerate everything. It covers the most complex behavior (folder routing) that the schema can't fully express. Combined with the annotations and output schema, this is reasonably complete for a creation tool with a single required parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all 12 parameters having descriptions. The tool-level description adds the folder-routing nuance which schema alone wouldn't convey. However, most parameter semantics (kind, status, related, supersedes, etc.) are solely carried by the schema since the description doesn't elaborate further. Baseline 3 is appropriate given full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Create a managed Markdown document') and adds a distinguishing feature ('stable DOC ID'). It differentiates from siblings like project_card_create and project_memory_add by focusing on managed documentation, though it doesn't explicitly name alternatives. The 'managed' qualifier and DOC ID point are genuinely informative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the folder placement behavior ('Without an explicit folder the workspace docs.layout decides where it is written'), including that an empty string writes to the root. This gives clear context on when/where content lands, but doesn't explicitly discuss when to use this vs sibling doc tools (e.g., project_doc_patch for edits).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_doc_listList documentsARead-onlyIdempotent
List indexed and managed documents, filtered by kind, status or freshness.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Keep only these document kinds. Project-declared, so the accepted values vary; project_workspace reports them. | |
| limit | No | Maximum documents to return. | |
| offset | No | Skip this many matches before the page starts. | |
| status | No | Keep only these document statuses. Project-declared, so the accepted values vary; project_workspace reports them. | |
| managed | No | true keeps only documents Workfile owns under the managed docs root; false keeps only repository files it merely indexes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | No | Maximum this page could contain. |
| total | Yes | Matches before offset and limit were applied. |
| offset | No | Offset this page started at. |
| records | Yes | Documents matching the filters, in list projection. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the read-only safety profile is already covered. The description adds freshness filtering and the indexed-vs-managed distinction, which enriches behavioral understanding beyond what annotations state. It doesn't contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, efficient, front-loaded with the core purpose. Minimal waste. The freshness mention is a small ambiguity since it's not an actual parameter, but overall concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists and is rich (5 params, all documented). The description covers what's expected of a filtered list tool. The one gap: 'freshness' is referenced in the description but no freshness parameter exists, which could confuse the agent about what filtering is actually available.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 5 parameters are described in the schema itself. The description adds 'freshness' as a filter axis (not a parameter, suggesting time-based filtering exists implicitly), and 'project_workspace reports them' for kind/status is useful cross-tool pointer that goes slightly beyond schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description is clear: 'List indexed and managed documents, filtered by kind, status or freshness.' It identifies verb (list), resource (documents), and the three filter axes. It distinguishes from siblings by noting these are 'indexed and managed' documents (vs card/changelog/memory lists), though it doesn't explicitly name an alternative sibling for filtering.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies a query/filter tool and mentions 'indexed and managed' distinction which hints at scope, but it doesn't explicitly state when to use this vs project_doc_create/patch/move or when the managed vs indexed distinction matters practically. The managed parameter hints at one usage nuance but no explicit when-to-use guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_doc_moveMove managed documentationAIdempotent
Move a managed document to another folder below the managed docs root. The DOC ID never changes; use an empty folder for the root.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Managed document to move, e.g. DOC-0003. | |
| folder | Yes | Destination folder relative to the managed docs root. An empty string moves it to the root. | |
| expectedRevision | No | Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check. |
Output Schema
| Name | Required | Description |
|---|---|---|
| record | Yes | A canonical record with its body, revision and reference graph. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, and the description competently adds context: the DOC ID is stable across moves, and an empty folder targets the root. The expectedRevision optimistic-concurrency detail is valuable. No contradiction with the idempotentHint=true annotation; moving a doc to a location is plausibly idempotent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two focused sentences with zero waste. The first states the action and constraint; the second adds the critical ID-stability fact and root-folder convention. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with a strong schema (100% coverage) and an output schema present. The description covers the key behavioral nuance (ID stability, root targeting) plus concurrency semantics via expectedRevision in the schema. Adequately complete for this level of complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and parameter descriptions are strong (id, folder with root semantics, expectedRevision with concurrency behavior). The description adds the 'DOC ID never changes' fact and root convention, which complements rather than duplicates the schema. Baseline 3 is appropriate since the schema already carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Move a managed document to another folder below the managed docs root' — a specific verb (move), resource (managed document), and destination (folder below root). It distinguishes from sibling doc tools (create/list/patch) by focusing on relocation. However, it doesn't explicitly name alternative tools for other doc operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it (moving a document) but doesn't state when not to use it or name alternatives like project_doc_patch or project_doc_create. The 'DOC ID never changes' note and root-folder convention provide some usage context, but there's no explicit exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_doc_patchPatch managed documentationAIdempotent
Patch a managed document using optimistic concurrency. Indexed repository docs are intentionally read-only through this tool — edit those files directly.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Managed document to patch, e.g. DOC-0003. | |
| changes | Yes | Frontmatter fields to overwrite, plus body to replace the Markdown. Only the keys present are touched. Use project_doc_move to change the folder. | |
| expectedRevision | No | Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check. |
Output Schema
| Name | Required | Description |
|---|---|---|
| record | Yes | A canonical record with its body, revision and reference graph. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With idempotentHint=true annotation present, the bar is lower. The description adds genuine value by explaining the optimistic concurrency behavior (write refused on revision mismatch, concurrent edits reported rather than overwritten) and the read-only constraint on indexed repo docs. It doesn't mention the return format or error behavior in detail despite having an output schema, but the annotation plus inline concurrency explanation provide solid coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences that are front-loaded with the primary purpose and mechanism. The second sentence adds a critical safety constraint (read-only indexed docs) without padding. No filler or redundant restatement of the title. Slightly more guidance on return shape could push it higher, but overall it's economical and earns its sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has nested objects and an output schema, so the description doesn't need to explain return values. The description covers the concurrency mechanism, the partial-update behavior, the read-only restriction, and references the move tool for folder changes. This is well-rounded for a patch tool of moderate complexity, though it could mention error responses (e.g., revision conflict handling details) beyond what the schema states.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful context beyond schema: it notes indexed docs are read-only, and it states that only keys present in 'changes' are touched (partial update semantics). The expectedRevision parameter's concurrency behavior is already well-described in the schema itself, so the description's mention reinforces rather than duplicates it. The partial-touch semantics in the description meaningfully complement the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Patch a managed document using optimistic concurrency' — a specific verb+resource with a distinctive mechanism (optimistic concurrency). It also adds important scoping information by noting indexed repository docs are intentionally read-only through this tool. While the sibling project_doc_move is separately named for folder changes, the description doesn't explicitly differentiate from other patch tools like project_card_patch or project_memory_patch, though those target different resource types so the distinction is reasonably clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use (patch managed docs) and explicitly excludes indexed repository docs ('edit those files directly'), providing a clear when-not. The exclusion is valuable context. However, it doesn't contrast with the sibling patch tools (card, memory, changelog) explicitly, leaving the agent to infer resource-type differentiation, nor does it mention the project_doc_create/list alternatives for creation/listing flows.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_doctorRun workfile doctorARead-onlyIdempotent
Validate Work, Docs, History, Memory, agent instructions, CI templates and cross-record references. Run before declaring work finished.
| Name | Required | Description | Default |
|---|---|---|---|
| checkPaths | No | Also verify that paths referenced by records exist on disk. Set false to skip the filesystem walk on a large repository. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when no error-severity issue was found. |
| cards | No | Cards inspected. |
| counts | No | Issue counts by severity: error, warning, info. |
| issues | Yes | Findings, each with a severity, a code and the record it concerns. |
| modules | No | Record counts per module and collection. |
| generatedAt | No | When this run completed, as an RFC 3339 timestamp. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description provides solid behavioral context: it validates multiple artifact categories and checks cross-record references, and critically mentions that checkPaths performs a filesystem walk which can be disabled on large repos (a cost/perf disclosure). Annotations already declare readOnlyHint=true and destructiveHint=false, which the description aligns with. The description adds the performance-aware behavior about the filesystem walk beyond what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, information-dense sentence followed by a directive clause. Every word earns its place: it enumerates the validation targets, mentions cross-record references, and states the trigger condition. No filler, no redundancy with the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete enough for this tool's complexity: single optional parameter fully documented in schema, output schema present (so return value details are covered elsewhere), and annotations declare the read-only, idempotent, non-destructive safety profile. The validation scope is enumerated explicitly. A pre-completion diagnostic tool with good schema/annotation coverage doesn't require much more.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter checkPaths is fully documented in the schema itself (verify paths exist, skip filesystem walk on large repos). The description complements the schema by mentioning the filesystem walk implication ('checkPaths' behavior) in the context of validation scope. Since there's only one well-documented param and schema coverage is complete, the description doesn't need to add much here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The title and description clearly state the verb+resource: 'Run workfile doctor' and 'Validate Work, Docs, History, Memory, agent instructions, CI templates and cross-record references.' It enumerates the specific things validated, distinguishing it from sibling tools like project_card_list or project_memory_list, which are individual-file operations. The 'Run before declaring work finished' clause gives the purpose strong operational context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear when-to-use guidance ('Run before declaring work finished'), establishing it as a pre-completion verification step. It doesn't explicitly name alternatives or exclusions, but given the tool's unique validation role among siblings (none of which do cross-record validation), direction is reasonably clear. A named alternative or 'when not to use' would push this to 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_get_recordRead a project recordARead-onlyIdempotent
Read one canonical project record by stable ID, including body, revision, outgoing references, backlinks and health signals. The revision it returns is what a later write passes as expectedRevision.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Stable record ID of any family: T-0042, DOC-0003, CHG-0101, REL-0007, ADR-0009. |
Output Schema
| Name | Required | Description |
|---|---|---|
| record | Yes | A canonical record with its body, revision and reference graph. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, fully covering the safety profile. The description adds value by specifying the exact return contents (body, revision, outgoing references, backlinks, health signals) and the critical revision behavior — that the returned revision is what a later write passes as expectedRevision. This is genuinely useful beyond annotations, though it doesn't describe error cases (e.g., 404 for nonexistent IDs) or pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two efficient sentences, zero filler. The first states the action and scope; the second provides a critical behavioral detail about revision semantics. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich output schema, good annotations, and a single well-documented parameter, the description is nearly complete. The revision→expectedRevision linkage is a subtle and important behavior clearly disclosed. It could mention error handling for nonexistent IDs, but given the completeness of structured fields, this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% — the id parameter is fully documented with examples (T-0042, DOC-0003, etc.) and a clear definition of stable record ID. The description adds the key semantic detail that the revision value is reused by writes as expectedRevision, which is valuable context linking this read to the write flow. Baseline of 3 is appropriate since the schema already handles parameter documentation well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb+resource: 'Read one canonical project record by stable ID'. It specifies exactly what's returned (body, revision, outgoing references, backlinks, health signals). Distinguishes from siblings like project_doc_list and project_search which fetch multiple/filtered results. The scope ('one canonical record') is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states it reads by stable ID and notes this is the getter counterpart to write tools. It implies this is for fetching single records by ID rather than listing/searching. However, it doesn't explicitly name alternative tools or state when NOT to use it (e.g., for bulk retrieval use project_search/project_card_list).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_memory_addAdd workfile memoryA
Create a typed learning, decision, incident, convention or temporary context record. For knowledge that should change future behaviour — not for narrating what happened this session.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Markdown body, written below the frontmatter. | |
| tags | No | Free-form tags for filtering. | |
| scope | No | Subject matter this applies to — topics, not file paths. | |
| title | Yes | The knowledge itself, stated as a claim rather than a topic. | |
| owners | No | Who is answerable for keeping this accurate. | |
| status | No | Lifecycle status. Each collection has its own vocabulary — a decision is proposed or accepted, an incident is open or resolved. Project-declared, so the accepted values vary; project_workspace reports them. | |
| expires | No | For context: the date after which this stops being true, YYYY-MM-DD. | |
| related | No | IDs of records worth reading alongside this one. | |
| category | No | Optional sub-classification within the collection. | |
| deciders | No | For decisions: who made the call. | |
| severity | No | For incidents: how bad it was. | |
| collection | Yes | Which kind of memory this is. learnings: something discovered that changes how the next attempt goes. decisions: a choice made, with its rationale (ADR). incidents: something that broke, and what it cost. conventions: a rule the project now follows. context: temporary situational state, which expires. | |
| confidence | No | How well established this is — for learnings, whether it has been seen once or many times. | |
| started_at | No | For incidents: when it began, YYYY-MM-DD. | |
| supersedes | No | IDs of memory records this replaces. Prefer project_memory_supersede, which updates both sides. | |
| occurrences | No | How many times this has been observed. | |
| resolved_at | No | For incidents: when it was resolved, YYYY-MM-DD. | |
| graduated_to | No | IDs of the durable records a learning has been promoted into. | |
| review_after | No | Date after which this should be re-read, YYYY-MM-DD. | |
| corrective_actions | No | For incidents: IDs of the cards that stop it recurring. |
Output Schema
| Name | Required | Description |
|---|---|---|
| record | Yes | A canonical record with its body, revision and reference graph. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, so mutation is implied by the annotation already. The description adds the intended-use context (behavior-changing knowledge vs session narration). However, it doesn't disclose what happens on record creation (return value, whether duplicates are checked, side effects like index updates, or how errors are surfaced). With 4 annotation fields all set to defaults/false, the description doesn't compensate for the lack of behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences and front-loads the purpose immediately in sentence one. Sentence two provides the essential exclusion criterion. It's efficient with no filler. Slightly more guidance on when NOT to use (which alternative tool for narration) would push it to 5, but as written it earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 20-parameter tool, the description relies heavily on the schema (100% coverage) and output schema being present to explain return values. The description correctly focuses on the selection decision (which collection type, purpose vs narration). The phrase about status vocabulary varying by collection and being project-declared is valuable cross-tool guidance referencing project_workspace. The main gap is no explicit statement about whether related records or supersede chains are validated/created atomically.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description need not repeat parameter meaning. However, the description adds meaningful cross-collection guidance, particularly the collection enum values ('learnings: something discovered... decisions: a choice made... incidents: something that broke...') in the schema itself, and pointers like 'prefer project_memory_supersede' for supersedes, and 'project_workspace reports them' for status. This enriches param semantics beyond bare types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (Create) and resource (typed learning, decision, incident, convention or temporary context record). It distinguishes from sibling tools (project_memory_list, project_memory_patch, project_memory_supersede, project_memory_graduate) by being the add operation. The phrase 'not for narrating what happened this session' adds a clear exclusion criterion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states the tool is for 'knowledge that should change future behaviour' and excludes 'narrating what happened this session'. While it doesn't name specific alternative tools for the 'narrating' case, the collection parameter enum and cross-references to project_memory_supersede and project_memory_graduate in schema properties provide contextual alternatives. It could more explicitly say which sibling handles narration.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_memory_graduateGraduate a learningA
Mark a learning as graduated and link it to the convention, decision or documentation that now carries the durable rule. Create the target record first — graduating points at something that must already exist.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Learning to graduate, e.g. LRN-0015. | |
| targets | Yes | IDs of the records that now carry the rule: a convention, a decision or a document. | |
| expectedRevision | No | Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check. |
Output Schema
| Name | Required | Description |
|---|---|---|
| record | Yes | A canonical record with its body, revision and reference graph. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, so it's clearly a write operation. The description adds the key dependency constraint (target must pre-exist) and the expectedRevision param is documented in the schema. Since annotations already establish the mutation context and the schema covers revision guarding, the description adds meaningful context with the prerequisite rule.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tight sentences with zero filler. It front-loads the action and adds the critical prerequisite in the second sentence. Only minor credit lost for not structuring the prerequisite as an explicit 'When to use' framing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With full schema coverage, an output schema present, and annotations clarifying it's a non-readonly write, the description covers the core workflow (create target first, then graduate). The completeness is strong given what structured fields already provide, though it doesn't describe what happens to the learning's state beyond 'graduated'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters (id, targets, expectedRevision) are documented in the input schema. The description adds context about targets being conventions/decisions/documents and the expectedRevision referential integrity behavior, but the schema already explains these thoroughly. Baseline 3 for full schema coverage is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource (graduate a learning/mark as graduated and link it to the target record). It clearly distinguishes from siblings like project_memory_supersede (which likely supersedes a learning differently) and project_memory_patch. The 'mark as graduated and link to durable rule' phrasing is specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear guidance to create the target record first ('graduating points at something that must already exist'), which is a critical prerequisite. However, it doesn't explicitly contrast with alternatives like project_memory_supersede or state when to graduate vs supersede, which would push to a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_memory_listList durable memoryARead-onlyIdempotent
List learnings, decisions, incidents, conventions and context, filtered by collection or lifecycle status.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum records to return. | |
| offset | No | Skip this many matches before the page starts. | |
| status | No | Keep only these lifecycle statuses. Each collection has its own vocabulary — a decision is proposed or accepted, an incident is open or resolved. Project-declared, so the accepted values vary; project_workspace reports them. | |
| collection | No | Keep only these collections: learnings, decisions, incidents, conventions, context. |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | No | Maximum this page could contain. |
| total | Yes | Matches before offset and limit were applied. |
| offset | No | Offset this page started at. |
| records | Yes | Memory records matching the filters, in list projection. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds the scoping dimension (filter by collection or lifecycle status) and notes that status vocabularies are project-declared and vary by collection, which is genuinely useful behavioral context beyond the schema. This adds good value atop strong annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence that captures purpose and filtering dimensions with zero filler. Every word earns its place, and the collection\.enum in the schema carries the detailed vocabulary without cluttering the description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with 100% parameter coverage, an output schema present, and strong annotations, the description is quite complete. The one gap is guidance on how it relates to project_search/project_get_record for discovering memory content, but this is minor given the structured annotations and schema richness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters (limit, offset, status, collection). The description lists what the tool filters by but doesn't add much beyond what the schema provides — the collection enum is fully specified in-schema, and the status field already explains its variability. At full coverage, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('List durable memory') and enumerates the content types (learnings, decisions, incidents, conventions, context) plus the filtering dimensions (collection, lifecycle status). It's clear, though it doesn't explicitly distinguish itself from sibling tools like project_card_list or project_changelog_list — the memory vs card distinction is implied by the title and description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is a read/list operation for durable memory records and mentions filtering options. However, it doesn't explicitly say when NOT to use this (e.g., vs project_search for cross-cutting queries or project_card_list for card-type records). The breadth of sibling tools makes this guidance gap noticeable, but the readOnlyHint and list-focused purpose provide reasonable implied context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_memory_patchPatch workfile memoryAIdempotent
Patch a durable memory record using optimistic concurrency. To retire one in favour of another use project_memory_supersede, which updates both sides.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Memory record to patch: LRN-, ADR-, INC-, CONV- or CTX-. | |
| changes | Yes | Frontmatter fields to overwrite — status, tags, related, owners and the collection-specific fields — plus body to replace the Markdown. Only the keys present are touched. | |
| expectedRevision | No | Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check. |
Output Schema
| Name | Required | Description |
|---|---|---|
| record | Yes | A canonical record with its body, revision and reference graph. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains the optimistic concurrency mechanism (write refused if expectedRevision no longer matches, concurrent edit reported rather than overwritten), which adds meaningful behavioral context beyond the annotations. While annotations declare idempotentHint=true and readOnlyHint=false, the description's explanation of the revision-refusal behavior adds genuine value. It could note the destructive nature of body replacement more explicitly, but the 'only keys present are touched' qualifier helps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste. The first sentence states the core action with the concurrency qualifier, and the second gives a precise pointer to an alternative. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a memory-record patching tool with 100% schema description coverage, a rich output schema, and detailed per-parameter documentation, the description is complete. It covers the action, the concurrency behavior, the partial-update semantics (delegated to schema), and the sibling distinction. The schema already explains expectedRevision and changes thoroughly, and the description adds the retire-orientation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter already has detailed descriptions in the schema, including the revision string's purpose, the id prefix pattern, and the changes semantics with partial-update behavior. The description's main contribution is naming the retire flow via supersede, which reinforces schema content but doesn't add substantial new parameter semantics beyond what's already documented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool patches a durable memory record using optimistic concurrency, with a specific verb (patch) and resource (durable memory record). It explicitly distinguishes itself from the sibling project_memory_supersede, naming the alternative and explaining the difference (retirement updates both sides).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when NOT to use this tool: for retiring a record in favour of another, pointing to project_memory_supersede as the alternative. This is direct when/when-not guidance with a named sibling tool, exactly the highest tier of usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_memory_supersedeSupersede workfile memoryA
Supersede one memory record with another and update both sides atomically. Create the replacement first; neither record is deleted, so the superseded one stays readable and its ID keeps resolving.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Memory record being retired. | |
| replacementId | Yes | Memory record that replaces it. Must already exist. | |
| expectedRevision | No | Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check. |
Output Schema
| Name | Required | Description |
|---|---|---|
| record | Yes | The superseded record. |
| replacement | Yes | The record that replaces it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, which already convey this is a write operation that isn't destructive. The description adds atomicity ('update both sides atomically') and the non-deletion detail, which is genuinely useful. However, it doesn't disclose behaviors like whether the operation requires additional permissions, whether it's reversible, or what the response shape validates—though the output schema partially covers the latter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler. Every clause adds value: atomicity, prerequisite ordering, non-deletion behavior, and ID persistence. Front-loaded purpose with critical behavioral caveats following. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter tool with full schema coverage and an output schema present, the description covers the core semantics well: atomicity, prerequisite, and non-destructive nature. It could mention reversibility or permission requirements for full completeness, but for the complexity level this is solidly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters already have descriptions in the schema. The description reinforces that replacementId 'must already exist' and explains the expectedRevision 'revision string' guard (concurrent edit protection), which adds semantic meaning beyond the schema. With full schema coverage, this is the appropriate baseline 3 with slight credit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('supersede') and resource (memory records), and clearly explains the binary relationship: one record supersedes another with both sides updated. It distinguishes itself from siblings like project_memory_graduate and project_memory_patch by framing the action as a pair-wise replacement rather than a single-record modification.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs to 'Create the replacement first' as a prerequisite, and explains the important exclusion: 'neither record is deleted, so the superseded one stays readable and its ID keeps resolving.' This gives clear when-to-use framing and sets expectations about alternative behaviors (non-destructive) that differentiate it from delete-like operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_nextWhat to work on nextARead-onlyIdempotent
Rank actionable cards: unblocked, unclaimed or claimed by you, highest priority first. Answers "what should I do now".
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | Rank only cards in these areas. Project-declared, so the accepted values vary; project_workspace reports them. | |
| actor | No | Who to attribute this to. Defaults to the MCP client's own name; pass one only to act on another actor's behalf. | |
| limit | No | Maximum candidates to rank. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | Actionable cards found before limit was applied. |
| records | Yes | Candidates, most actionable first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is fully covered. The description adds behavioral value by defining what 'actionable' means (unblocked, unclaimed or claimed by you) and the ranking logic (highest priority first), which are non-obvious behaviors not in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste. The purpose statement and the guiding question are both front-loaded and directly actionable. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only ranking tool with an output schema present, full parameter schema coverage, and comprehensive annotations (readOnly, idempotent, non-destructive), the description is complete. It explains what it ranks, the filtering rules, and the ordering logic. No gaps that would confuse an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The area parameter description is useful ('Project-declared, so the accepted values vary; project_workspace reports them'), which adds meaning beyond the schema. The actor and limit parameters are adequately described in the schema and the description doesn't need to repeat them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'Rank actionable cards' with clear scope (unblocked, unclaimed or claimed by you, highest priority first). The description directly answers the question 'what should I do now', distinguishing it from card_list (listing), card_create (creating), etc. Clearly distinct from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states it ranks actionable cards with defined inclusion criteria and explicitly frames it as an answer to 'what should I do now'. While it doesn't explicitly name alternative tools to use instead, the purpose framing plus sibling context (card_list, search) makes the usage situation clear. Could add exclusions for alternatives but the core context is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_searchSearch project recordsARead-onlyIdempotent
Search cards, documentation, changelog entries, releases and durable memory. Uses deterministic lexical ranking and an injected semantic provider when available.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | hybrid adds the injected semantic provider when the host configured one and falls back to lexical when it did not. lexical is deterministic. | hybrid |
| view | No | summary omits record bodies and returns an excerpt; full returns everything, which costs far more tokens at the same limit. | summary |
| kinds | No | Restrict to these record families: card, doc, change, release, memory. Omit to search all of them. | |
| limit | No | Maximum records to return. | |
| query | Yes | Free text. Matched against titles, bodies and tags; never empty. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | No | Which ranking ran: lexical or hybrid. |
| view | No | Which projection was applied: summary or full. |
| limit | No | Maximum this page could contain. |
| total | Yes | Matches found before limit was applied. |
| offset | No | Offset this page started at. |
| records | Yes | Matches, best-scoring first. |
| provider | No | Semantic provider that contributed, or null when ranking was purely lexical. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is well covered. The description adds behavioral context about deterministic lexical ranking and the optional semantic provider fallback behavior, which is genuinely useful. However, it doesn't describe token cost implications between modes beyond what the schema's 'view' parameter already hints at; the description doesn't independently disclose behavioral traits like pagination or result ordering beyond ranking mention.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two well-formed sentences with zero wasted words. The first sentence states the scope precisely, the second explains the ranking mechanism. Every element contributes value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Description plus a comprehensive 100%-covered schema and rich annotations together fully specify the tool, including its hybrid/lexical modes, view choices, and record-family filtering. An output schema exists so return format doesn't need explaining. The only minor gap is that the description could hint at the breadth of use cases served by a cross-family search vs individual list tools like project_card_list.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all 5 parameters (mode, view, kinds, limit, query) are documented in the input schema itself. The description adds the deterministic-vs-semantic behavioral distinction for the 'mode' parameter, which complements the schema. However, it doesn't add further semantic guidance beyond what the schema already covers, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it searches multiple record types (cards, documentation, changelog, releases, durable memory) with a specific verb 'Search' plus resource. It distinguishes from siblings like project_card_list and project_doc_list by covering all record families, though it doesn't explicitly name an alternative for differentiated queries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description notes it 'Uses deterministic lexical ranking and an injected semantic provider when available,' giving context on how search behaves. It implicitly covers when to use (broad cross-family search) vs more specific list tools, but doesn't explicitly state when not to use it or name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_workspaceRead project workspaceARead-onlyIdempotent
Return the effective Workfile workspace, schema, enabled modules and mutation mode. Read this first when a vocabulary is project-declared: it reports the areas, axes, document kinds, changelog types and memory collections this project accepts.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | Project name from project.config.mjs. |
| root | Yes | Absolute path to the workspace root. |
| schema | No | Effective vocabularies and paths per module: cards (statuses, types, priorities, efforts, areas, axes), docs, memory, changelog, agents, ci, mcp and search. |
| version | No | Schema version the workspace was created with. |
| readOnly | Yes | Whether this server refuses mutations, from --read-only or mcp.allowMutations. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds value by listing the specific categories of info it reports (areas, axes, document kinds, changelog types, memory collections) and the 'effective' workspace qualifier. No specific output/pagination details, but the output schema exists to cover that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences. The first states the purpose precisely, the second gives actionable usage guidance. No wasted words — every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A parameterless read tool with strong annotations (readOnly, idempotent, non-destructive) and an output schema. The description adds the crucial 'read this first' sequencing guidance and enumerates the domain categories it covers. Complete for this tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema fully documents the input surface (100% coverage, empty properties object). With no params, the baseline is 4 — and the description correctly focuses on what the tool RETURNS rather than inputs, which is appropriate here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states it returns 'the effective Workfile workspace, schema, enabled modules and mutation mode' — a specific verb+resource combination. It doesn't explicitly distinguish from siblings, but 'read this first' hints at its foundational role among the many project_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Read this first when a vocabulary is project-declared' and enumerates what it reports (areas, axes, document kinds, changelog types, memory collections). It provides clear context for when to invoke it, though it doesn't name specific alternative tools to exclude.
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. Dates show when Glama detected each change.
30 tool updates
v0.5.4- Changed
project_agent_context4 fields changed- added
Input schema / properties / cardId / descriptionAdded value: +"Card the bundle is centred on, e.g. T-0042." - added
Input schema / properties / limit / defaultAdded value: +20 - added
Input schema / properties / limit / descriptionAdded value: +"Maximum related records to include." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "focus": { + "description": "ID of the card the bundle was built around.", + "type": "string" + }, + "generatedAt": { + "description": "When the bundle was assembled, RFC 3339.", + "type": "string" + }, + "markdown": { + "description": "The same bundle rendered as Markdown, ready to paste into a prompt.", + "type": "string" + }, + "records": { + "description": "The selected records, with bodies.", + "items": { + "additionalProperties": true, + "description": "A canonical record with its body, revision and reference graph.", + "properties": { + "archived": { + "description": "Whether the record lives in the archive directory.", + "type": "boolean" + }, + "body": { + "description": "Markdown body below the frontmatter.", + "type": "string" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "file": { + "description": "File name within the collection directory.", + "type": "string" + }, + "id": { + "description": "Stable record ID.", + "type": "string" + }, + "incoming": { + "description": "Backlinks: references other records make to this one.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "incomingTotal": { + "description": "Total backlinks, which may exceed the returned page.", + "type": "integer" + }, + "issues": { + "description": "Validation findings doctor would report for this record.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "outgoing": { + "description": "References this record makes to others.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family.", + "type": "string" + }, + "revision": { + "description": "Content hash to pass back as expectedRevision on the next write.", + "type": "string" + }, + "status": { + "description": "Lifecycle status.", + "type": "string" + }, + "tags": { + "description": "Free-form tags.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "totalAvailable": { + "description": "Related records before limit was applied.", + "type": "integer" + }, + "truncated": { + "description": "True when relevant records were dropped to respect limit.", + "type": "boolean" + } + }, + "required": [ + "focus", + "records" + ], + "type": "object" +}
- Changed
project_card_archive3 fields changed- added
Input schema / properties / expectedRevision / descriptionAdded value: +"Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check." - added
Input schema / properties / id / descriptionAdded value: +"Card to archive. Must already be done or discarded." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "record": { + "additionalProperties": true, + "description": "A canonical record with its body, revision and reference graph.", + "properties": { + "archived": { + "description": "Whether the record lives in the archive directory.", + "type": "boolean" + }, + "body": { + "description": "Markdown body below the frontmatter.", + "type": "string" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "file": { + "description": "File name within the collection directory.", + "type": "string" + }, + "id": { + "description": "Stable record ID.", + "type": "string" + }, + "incoming": { + "description": "Backlinks: references other records make to this one.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "incomingTotal": { + "description": "Total backlinks, which may exceed the returned page.", + "type": "integer" + }, + "issues": { + "description": "Validation findings doctor would report for this record.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "outgoing": { + "description": "References this record makes to others.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family.", + "type": "string" + }, + "revision": { + "description": "Content hash to pass back as expectedRevision on the next write.", + "type": "string" + }, + "status": { + "description": "Lifecycle status.", + "type": "string" + }, + "tags": { + "description": "Free-form tags.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "record" + ], + "type": "object" +}
- Changed
project_card_claim8 fields changed- added
Input schema / properties / actor / descriptionAdded value: +"Who is claiming. Defaults to the MCP client's own name; a hand-typed value will not match the identity the edit guard sees." - added
Input schema / properties / expectedRevision / descriptionAdded value: +"Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check." - added
Input schema / properties / force / defaultAdded value: +false - added
Input schema / properties / force / descriptionAdded value: +"Take a claim another actor already holds. Requires reason." - added
Input schema / properties / id / descriptionAdded value: +"Card to claim, e.g. T-0042." - added
Input schema / properties / reason / descriptionAdded value: +"Why the existing claim is being taken over. Recorded on the card." - added
Input schema / properties / scope / descriptionAdded value: +"Repository paths this claim covers. Overlapping scopes are what stop two agents editing the same files." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "record": { + "additionalProperties": true, + "description": "A canonical record with its body, revision and reference graph.", + "properties": { + "archived": { + "description": "Whether the record lives in the archive directory.", + "type": "boolean" + }, + "body": { + "description": "Markdown body below the frontmatter.", + "type": "string" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "file": { + "description": "File name within the collection directory.", + "type": "string" + }, + "id": { + "description": "Stable record ID.", + "type": "string" + }, + "incoming": { + "description": "Backlinks: references other records make to this one.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "incomingTotal": { + "description": "Total backlinks, which may exceed the returned page.", + "type": "integer" + }, + "issues": { + "description": "Validation findings doctor would report for this record.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "outgoing": { + "description": "References this record makes to others.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family.", + "type": "string" + }, + "revision": { + "description": "Content hash to pass back as expectedRevision on the next write.", + "type": "string" + }, + "status": { + "description": "Lifecycle status.", + "type": "string" + }, + "tags": { + "description": "Free-form tags.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + }, + "warnings": { + "description": "Non-fatal findings, such as a stale claim that was taken over.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "record" + ], + "type": "object" +}
- Changed
project_card_create22 fields changed- added
Input schema / properties / area / descriptionAdded value: +"Part of the system this touches. Project-declared, so the accepted values vary; project_workspace reports them." - added
Input schema / properties / axes / descriptionAdded value: +"Declared classification axes as { axis: value }, e.g. { context: \"treasury\" }. Project-declared, so the accepted values vary; project_workspace reports them." - added
Input schema / properties / body / descriptionAdded value: +"Markdown body, written below the frontmatter." - added
Input schema / properties / depends / descriptionAdded value: +"IDs of cards that must close first. Blocks this card from being ranked as actionable." - added
Input schema / properties / due / descriptionAdded value: +"Target completion date, YYYY-MM-DD." - added
Input schema / properties / effort / descriptionAdded value: +"Rough size: S, M or L." - added
Input schema / properties / effort / enumAdded value: +[ + "S", + "M", + "L" +] - added
Input schema / properties / parent / descriptionAdded value: +"ID of the parent card. The hierarchy is bounded by cards.maxHierarchyDepth." - added
Input schema / properties / priority / descriptionAdded value: +"How urgent the work is." - added
Input schema / properties / priority / enumAdded value: +[ + "critical", + "high", + "medium", + "low" +] - added
Input schema / properties / related / descriptionAdded value: +"IDs of records worth reading alongside this one." - added
Input schema / properties / scope / descriptionAdded value: +"Repository paths this work will change. Declared here, enforced when the card is claimed." - added
Input schema / properties / source / descriptionAdded value: +"Where the work came from: an issue URL, a person, a meeting." - added
Input schema / properties / start / descriptionAdded value: +"Planned start date, YYYY-MM-DD." - added
Input schema / properties / status / defaultAdded value: +"backlog" - added
Input schema / properties / status / descriptionAdded value: +"Starting lifecycle status." - added
Input schema / properties / status / enumAdded value: +[ + "backlog", + "next", + "doing", + "review", + "blocked", + "deferred", + "done", + "discarded" +] - added
Input schema / properties / tags / descriptionAdded value: +"Free-form tags for filtering." - added
Input schema / properties / title / descriptionAdded value: +"What the card is about, in one line." - added
Input schema / properties / type / descriptionAdded value: +"What kind of work this is." - added
Input schema / properties / type / enumAdded value: +[ + "epic", + "idea", + "feature", + "bug", + "task", + "audit", + "docs", + "chore" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "record": { + "additionalProperties": true, + "description": "A canonical record with its body, revision and reference graph.", + "properties": { + "archived": { + "description": "Whether the record lives in the archive directory.", + "type": "boolean" + }, + "body": { + "description": "Markdown body below the frontmatter.", + "type": "string" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "file": { + "description": "File name within the collection directory.", + "type": "string" + }, + "id": { + "description": "Stable record ID.", + "type": "string" + }, + "incoming": { + "description": "Backlinks: references other records make to this one.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "incomingTotal": { + "description": "Total backlinks, which may exceed the returned page.", + "type": "integer" + }, + "issues": { + "description": "Validation findings doctor would report for this record.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "outgoing": { + "description": "References this record makes to others.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family.", + "type": "string" + }, + "revision": { + "description": "Content hash to pass back as expectedRevision on the next write.", + "type": "string" + }, + "status": { + "description": "Lifecycle status.", + "type": "string" + }, + "tags": { + "description": "Free-form tags.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "record" + ], + "type": "object" +}
- Changed
project_card_list16 fields changed- added
Input schema / properties / area / descriptionAdded value: +"Keep only these areas. Project-declared, so the accepted values vary; project_workspace reports them." - added
Input schema / properties / claimedBy / descriptionAdded value: +"Keep only cards claimed by this actor." - added
Input schema / properties / limit / defaultAdded value: +50 - added
Input schema / properties / limit / descriptionAdded value: +"Maximum cards to return." - added
Input schema / properties / offset / defaultAdded value: +0 - added
Input schema / properties / offset / descriptionAdded value: +"Skip this many matches before the page starts." - added
Input schema / properties / parent / descriptionAdded value: +"Keep only direct children of this card ID." - added
Input schema / properties / priority / descriptionAdded value: +"Keep only these priorities. One of: critical, high, medium, low." - added
Input schema / properties / priority / items / enumAdded value: +[ + "critical", + "high", + "medium", + "low" +] - added
Input schema / properties / status / descriptionAdded value: +"Keep only these statuses; any match passes. One of: backlog, next, doing, review, blocked, deferred, done, discarded." - added
Input schema / properties / status / items / enumAdded value: +[ + "backlog", + "next", + "doing", + "review", + "blocked", + "deferred", + "done", + "discarded" +] - added
Input schema / properties / tags / descriptionAdded value: +"Keep cards carrying any of these tags." - added
Input schema / properties / type / descriptionAdded value: +"Keep only these card types. One of: epic, idea, feature, bug, task, audit, docs, chore." - added
Input schema / properties / type / items / enumAdded value: +[ + "epic", + "idea", + "feature", + "bug", + "task", + "audit", + "docs", + "chore" +] - added
Input schema / properties / unclaimed / descriptionAdded value: +"Keep only cards nobody has claimed." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "limit": { + "description": "Maximum this page could contain.", + "type": "integer" + }, + "offset": { + "description": "Offset this page started at.", + "type": "integer" + }, + "records": { + "description": "Cards matching the filters, in list projection.", + "items": { + "additionalProperties": true, + "description": "A record in list projection: identity and frontmatter without the Markdown body.", + "properties": { + "bodyBytes": { + "description": "Size in bytes of the body this projection left out.", + "type": "integer" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "id": { + "description": "Stable record ID: T-0042, DOC-0003, CHG-0101, ADR-0009.", + "type": "string" + }, + "incomingTotal": { + "description": "How many other records link to this one.", + "type": "integer" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family — a card's type, a document's kind, a memory record's collection.", + "type": "string" + }, + "status": { + "description": "Lifecycle status, in the vocabulary of this record's family.", + "type": "string" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "total": { + "description": "Matches before offset and limit were applied.", + "type": "integer" + } + }, + "required": [ + "records", + "total" + ], + "type": "object" +}
- Changed
project_card_note6 fields changed- added
Input schema / properties / actor / descriptionAdded value: +"Who to attribute this to. Defaults to the MCP client's own name; pass one only to act on another actor's behalf." - added
Input schema / properties / id / descriptionAdded value: +"Card to append to." - added
Input schema / properties / section / defaultAdded value: +"Notes" - added
Input schema / properties / section / descriptionAdded value: +"Heading to append under. Created if it does not exist yet." - added
Input schema / properties / text / descriptionAdded value: +"The line to append. One observation, not a paragraph." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "record": { + "additionalProperties": true, + "description": "A canonical record with its body, revision and reference graph.", + "properties": { + "archived": { + "description": "Whether the record lives in the archive directory.", + "type": "boolean" + }, + "body": { + "description": "Markdown body below the frontmatter.", + "type": "string" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "file": { + "description": "File name within the collection directory.", + "type": "string" + }, + "id": { + "description": "Stable record ID.", + "type": "string" + }, + "incoming": { + "description": "Backlinks: references other records make to this one.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "incomingTotal": { + "description": "Total backlinks, which may exceed the returned page.", + "type": "integer" + }, + "issues": { + "description": "Validation findings doctor would report for this record.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "outgoing": { + "description": "References this record makes to others.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family.", + "type": "string" + }, + "revision": { + "description": "Content hash to pass back as expectedRevision on the next write.", + "type": "string" + }, + "status": { + "description": "Lifecycle status.", + "type": "string" + }, + "tags": { + "description": "Free-form tags.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "record" + ], + "type": "object" +}
- Changed
project_card_patch4 fields changed- added
Input schema / properties / changes / descriptionAdded value: +"Frontmatter fields to overwrite, e.g. { priority: \"high\", tags: [\"mcp\"] }. Only the keys present are touched. Use project_card_transition for status and project_card_write for the body; declared axes go under an axes key." - added
Input schema / properties / expectedRevision / descriptionAdded value: +"Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check." - added
Input schema / properties / id / descriptionAdded value: +"Card to patch." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "record": { + "additionalProperties": true, + "description": "A canonical record with its body, revision and reference graph.", + "properties": { + "archived": { + "description": "Whether the record lives in the archive directory.", + "type": "boolean" + }, + "body": { + "description": "Markdown body below the frontmatter.", + "type": "string" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "file": { + "description": "File name within the collection directory.", + "type": "string" + }, + "id": { + "description": "Stable record ID.", + "type": "string" + }, + "incoming": { + "description": "Backlinks: references other records make to this one.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "incomingTotal": { + "description": "Total backlinks, which may exceed the returned page.", + "type": "integer" + }, + "issues": { + "description": "Validation findings doctor would report for this record.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "outgoing": { + "description": "References this record makes to others.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family.", + "type": "string" + }, + "revision": { + "description": "Content hash to pass back as expectedRevision on the next write.", + "type": "string" + }, + "status": { + "description": "Lifecycle status.", + "type": "string" + }, + "tags": { + "description": "Free-form tags.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "record" + ], + "type": "object" +}
- Changed
project_card_release9 fields changed- added
Input schema / properties / actor / descriptionAdded value: +"Who to attribute this to. Defaults to the MCP client's own name; pass one only to act on another actor's behalf." - added
Input schema / properties / expectedRevision / descriptionAdded value: +"Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check." - added
Input schema / properties / force / defaultAdded value: +false - added
Input schema / properties / force / descriptionAdded value: +"Release a claim held by another actor. Requires reason." - added
Input schema / properties / id / descriptionAdded value: +"Card whose claim is being released." - added
Input schema / properties / reason / descriptionAdded value: +"Why another actor's claim is being released. Recorded on the card." - added
Input schema / properties / status / descriptionAdded value: +"Status to leave the card in. Omit to keep the current one — a card just moved to done is not demoted by releasing it — except doing, which becomes next because active work without a claimant is a contradiction. doing is refused as an explicit target." - added
Input schema / properties / status / enumAdded value: +[ + "backlog", + "next", + "review", + "blocked", + "deferred", + "done", + "discarded" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "record": { + "additionalProperties": true, + "description": "A canonical record with its body, revision and reference graph.", + "properties": { + "archived": { + "description": "Whether the record lives in the archive directory.", + "type": "boolean" + }, + "body": { + "description": "Markdown body below the frontmatter.", + "type": "string" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "file": { + "description": "File name within the collection directory.", + "type": "string" + }, + "id": { + "description": "Stable record ID.", + "type": "string" + }, + "incoming": { + "description": "Backlinks: references other records make to this one.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "incomingTotal": { + "description": "Total backlinks, which may exceed the returned page.", + "type": "integer" + }, + "issues": { + "description": "Validation findings doctor would report for this record.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "outgoing": { + "description": "References this record makes to others.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family.", + "type": "string" + }, + "revision": { + "description": "Content hash to pass back as expectedRevision on the next write.", + "type": "string" + }, + "status": { + "description": "Lifecycle status.", + "type": "string" + }, + "tags": { + "description": "Free-form tags.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "record" + ], + "type": "object" +}
- Changed
project_card_reopen7 fields changed- added
Input schema / properties / actor / descriptionAdded value: +"Who to attribute this to. Defaults to the MCP client's own name; pass one only to act on another actor's behalf." - added
Input schema / properties / expectedRevision / descriptionAdded value: +"Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check." - added
Input schema / properties / id / descriptionAdded value: +"Archived card to bring back." - added
Input schema / properties / status / defaultAdded value: +"backlog" - added
Input schema / properties / status / descriptionAdded value: +"Status to reopen into." - added
Input schema / properties / status / enumAdded value: +[ + "backlog", + "next", + "doing", + "review", + "blocked", + "deferred", + "done", + "discarded" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "record": { + "additionalProperties": true, + "description": "A canonical record with its body, revision and reference graph.", + "properties": { + "archived": { + "description": "Whether the record lives in the archive directory.", + "type": "boolean" + }, + "body": { + "description": "Markdown body below the frontmatter.", + "type": "string" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "file": { + "description": "File name within the collection directory.", + "type": "string" + }, + "id": { + "description": "Stable record ID.", + "type": "string" + }, + "incoming": { + "description": "Backlinks: references other records make to this one.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "incomingTotal": { + "description": "Total backlinks, which may exceed the returned page.", + "type": "integer" + }, + "issues": { + "description": "Validation findings doctor would report for this record.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "outgoing": { + "description": "References this record makes to others.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family.", + "type": "string" + }, + "revision": { + "description": "Content hash to pass back as expectedRevision on the next write.", + "type": "string" + }, + "status": { + "description": "Lifecycle status.", + "type": "string" + }, + "tags": { + "description": "Free-form tags.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "record" + ], + "type": "object" +}
- Changed
project_card_transition8 fields changed- added
Input schema / properties / actor / descriptionAdded value: +"Who to attribute this to. Defaults to the MCP client's own name; pass one only to act on another actor's behalf." - added
Input schema / properties / expectedRevision / descriptionAdded value: +"Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check." - added
Input schema / properties / id / descriptionAdded value: +"Card to transition." - added
Input schema / properties / scope / descriptionAdded value: +"Repository paths to claim when moving to doing. Ignored by the other statuses." - added
Input schema / properties / status / descriptionAdded value: +"Target status. backlog: identified, uncommitted. next: prioritized. doing: actively worked, and claimed by the actor. review: implemented, awaiting verification. blocked: externally blocked, record why. deferred: postponed on purpose, record why. done: verified where it actually runs. discarded: will not be done, record why." - added
Input schema / properties / status / enumAdded value: +[ + "backlog", + "next", + "doing", + "review", + "blocked", + "deferred", + "done", + "discarded" +] - removed
Input schema / properties / status / minLengthRemoved value: -1 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "record": { + "additionalProperties": true, + "description": "A canonical record with its body, revision and reference graph.", + "properties": { + "archived": { + "description": "Whether the record lives in the archive directory.", + "type": "boolean" + }, + "body": { + "description": "Markdown body below the frontmatter.", + "type": "string" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "file": { + "description": "File name within the collection directory.", + "type": "string" + }, + "id": { + "description": "Stable record ID.", + "type": "string" + }, + "incoming": { + "description": "Backlinks: references other records make to this one.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "incomingTotal": { + "description": "Total backlinks, which may exceed the returned page.", + "type": "integer" + }, + "issues": { + "description": "Validation findings doctor would report for this record.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "outgoing": { + "description": "References this record makes to others.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family.", + "type": "string" + }, + "revision": { + "description": "Content hash to pass back as expectedRevision on the next write.", + "type": "string" + }, + "status": { + "description": "Lifecycle status.", + "type": "string" + }, + "tags": { + "description": "Free-form tags.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "record" + ], + "type": "object" +}
- Changed
project_card_write4 fields changed- added
Input schema / properties / body / descriptionAdded value: +"The complete new Markdown body. This overwrites, so read the card first unless you intend to discard what is there." - added
Input schema / properties / expectedRevision / descriptionAdded value: +"Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check." - added
Input schema / properties / id / descriptionAdded value: +"Card whose body is being replaced." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "record": { + "additionalProperties": true, + "description": "A canonical record with its body, revision and reference graph.", + "properties": { + "archived": { + "description": "Whether the record lives in the archive directory.", + "type": "boolean" + }, + "body": { + "description": "Markdown body below the frontmatter.", + "type": "string" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "file": { + "description": "File name within the collection directory.", + "type": "string" + }, + "id": { + "description": "Stable record ID.", + "type": "string" + }, + "incoming": { + "description": "Backlinks: references other records make to this one.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "incomingTotal": { + "description": "Total backlinks, which may exceed the returned page.", + "type": "integer" + }, + "issues": { + "description": "Validation findings doctor would report for this record.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "outgoing": { + "description": "References this record makes to others.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family.", + "type": "string" + }, + "revision": { + "description": "Content hash to pass back as expectedRevision on the next write.", + "type": "string" + }, + "status": { + "description": "Lifecycle status.", + "type": "string" + }, + "tags": { + "description": "Free-form tags.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "record" + ], + "type": "object" +}
- Changed
project_changelog_add11 fields changed- added
Input schema / properties / area / descriptionAdded value: +"Part of the system that changed. Project-declared, so the accepted values vary; project_workspace reports them." - added
Input schema / properties / body / descriptionAdded value: +"Markdown body, written below the frontmatter." - added
Input schema / properties / cards / descriptionAdded value: +"IDs of the cards this change came from." - added
Input schema / properties / decisions / descriptionAdded value: +"IDs of decision records this change implements." - added
Input schema / properties / issues / descriptionAdded value: +"External issue or ticket references." - added
Input schema / properties / related / descriptionAdded value: +"IDs of other records worth reading alongside." - added
Input schema / properties / tags / descriptionAdded value: +"Free-form tags for filtering." - added
Input schema / properties / title / descriptionAdded value: +"The change, stated from the reader's side rather than the implementer's." - added
Input schema / properties / type / descriptionAdded value: +"What kind of change this is — added, changed, fixed and so on. Project-declared, so the accepted values vary; project_workspace reports them." - added
Input schema / properties / visibility / descriptionAdded value: +"Who the entry is rendered for, typically public or internal. Project-declared, so the accepted values vary; project_workspace reports them." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "record": { + "additionalProperties": true, + "description": "A canonical record with its body, revision and reference graph.", + "properties": { + "archived": { + "description": "Whether the record lives in the archive directory.", + "type": "boolean" + }, + "body": { + "description": "Markdown body below the frontmatter.", + "type": "string" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "file": { + "description": "File name within the collection directory.", + "type": "string" + }, + "id": { + "description": "Stable record ID.", + "type": "string" + }, + "incoming": { + "description": "Backlinks: references other records make to this one.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "incomingTotal": { + "description": "Total backlinks, which may exceed the returned page.", + "type": "integer" + }, + "issues": { + "description": "Validation findings doctor would report for this record.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "outgoing": { + "description": "References this record makes to others.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family.", + "type": "string" + }, + "revision": { + "description": "Content hash to pass back as expectedRevision on the next write.", + "type": "string" + }, + "status": { + "description": "Lifecycle status.", + "type": "string" + }, + "tags": { + "description": "Free-form tags.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "record" + ], + "type": "object" +}
- Changed
project_changelog_list9 fields changed- added
Input schema / properties / area / descriptionAdded value: +"Keep only these areas. Project-declared, so the accepted values vary; project_workspace reports them." - added
Input schema / properties / limit / defaultAdded value: +50 - added
Input schema / properties / limit / descriptionAdded value: +"Maximum records to return." - added
Input schema / properties / offset / defaultAdded value: +0 - added
Input schema / properties / offset / descriptionAdded value: +"Skip this many matches before the page starts." - added
Input schema / properties / released / descriptionAdded value: +"true keeps only fragments already consumed by a release; false keeps only unreleased ones." - added
Input schema / properties / type / descriptionAdded value: +"Keep only these change types. Project-declared, so the accepted values vary; project_workspace reports them." - added
Input schema / properties / visibility / descriptionAdded value: +"Keep only these visibilities, typically public or internal. Project-declared, so the accepted values vary; project_workspace reports them." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "limit": { + "description": "Maximum this page could contain.", + "type": "integer" + }, + "offset": { + "description": "Offset this page started at.", + "type": "integer" + }, + "records": { + "description": "Change fragments and releases matching the filters, in list projection.", + "items": { + "additionalProperties": true, + "description": "A record in list projection: identity and frontmatter without the Markdown body.", + "properties": { + "bodyBytes": { + "description": "Size in bytes of the body this projection left out.", + "type": "integer" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "id": { + "description": "Stable record ID: T-0042, DOC-0003, CHG-0101, ADR-0009.", + "type": "string" + }, + "incomingTotal": { + "description": "How many other records link to this one.", + "type": "integer" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family — a card's type, a document's kind, a memory record's collection.", + "type": "string" + }, + "status": { + "description": "Lifecycle status, in the vocabulary of this record's family.", + "type": "string" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "total": { + "description": "Matches before offset and limit were applied.", + "type": "integer" + } + }, + "required": [ + "records", + "total" + ], + "type": "object" +}
- Changed
project_changelog_patch4 fields changed- added
Input schema / properties / changes / descriptionAdded value: +"Frontmatter fields to overwrite — title, type, area, visibility, tags and the relation lists — plus body to replace the Markdown. Only the keys present are touched." - added
Input schema / properties / expectedRevision / descriptionAdded value: +"Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check." - added
Input schema / properties / id / descriptionAdded value: +"Unreleased fragment to patch, e.g. CHG-0101." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "record": { + "additionalProperties": true, + "description": "A canonical record with its body, revision and reference graph.", + "properties": { + "archived": { + "description": "Whether the record lives in the archive directory.", + "type": "boolean" + }, + "body": { + "description": "Markdown body below the frontmatter.", + "type": "string" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "file": { + "description": "File name within the collection directory.", + "type": "string" + }, + "id": { + "description": "Stable record ID.", + "type": "string" + }, + "incoming": { + "description": "Backlinks: references other records make to this one.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "incomingTotal": { + "description": "Total backlinks, which may exceed the returned page.", + "type": "integer" + }, + "issues": { + "description": "Validation findings doctor would report for this record.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "outgoing": { + "description": "References this record makes to others.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family.", + "type": "string" + }, + "revision": { + "description": "Content hash to pass back as expectedRevision on the next write.", + "type": "string" + }, + "status": { + "description": "Lifecycle status.", + "type": "string" + }, + "tags": { + "description": "Free-form tags.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "record" + ], + "type": "object" +}
- Changed
project_changelog_preview3 fields changed- added
Input schema / properties / fragmentIds / descriptionAdded value: +"Fragments to include, e.g. CHG-0101. Omit to preview every unreleased fragment." - added
Input schema / properties / visibility / descriptionAdded value: +"Render only entries at this visibility, typically public or internal. Omit to include all of them. Project-declared, so the accepted values vary; project_workspace reports them." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "fragments": { + "description": "Fragments this preview covered.", + "items": { + "additionalProperties": true, + "description": "A record in list projection: identity and frontmatter without the Markdown body.", + "properties": { + "bodyBytes": { + "description": "Size in bytes of the body this projection left out.", + "type": "integer" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "id": { + "description": "Stable record ID: T-0042, DOC-0003, CHG-0101, ADR-0009.", + "type": "string" + }, + "incomingTotal": { + "description": "How many other records link to this one.", + "type": "integer" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family — a card's type, a document's kind, a memory record's collection.", + "type": "string" + }, + "status": { + "description": "Lifecycle status, in the vocabulary of this record's family.", + "type": "string" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "groups": { + "description": "Entries bucketed by change type, in render order.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "markdown": { + "description": "The release notes as they would be written.", + "type": "string" + } + }, + "required": [ + "markdown" + ], + "type": "object" +}
- Changed
project_changelog_release9 fields changed- added
Input schema / properties / body / descriptionAdded value: +"Markdown prelude written above the generated entries." - added
Input schema / properties / commit / descriptionAdded value: +"Commit SHA this release was cut from." - added
Input schema / properties / date / descriptionAdded value: +"Release date, YYYY-MM-DD. Defaults to today." - added
Input schema / properties / fragmentIds / descriptionAdded value: +"Fragments to consume, e.g. CHG-0101. Omit to consume every unreleased fragment." - added
Input schema / properties / tags / descriptionAdded value: +"Free-form tags for filtering." - added
Input schema / properties / title / descriptionAdded value: +"Release title. Defaults to the version itself." - added
Input schema / properties / version / descriptionAdded value: +"Version being cut, e.g. 0.5.4. Validated against changelog.releaseStrategy." - added
Input schema / properties / visibility / descriptionAdded value: +"Visibility of the release record itself, typically public or internal. Project-declared, so the accepted values vary; project_workspace reports them." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "consumedFragments": { + "description": "Fragments that moved into the release directory and no longer exist as unreleased records.", + "items": { + "additionalProperties": true, + "description": "A record in list projection: identity and frontmatter without the Markdown body.", + "properties": { + "bodyBytes": { + "description": "Size in bytes of the body this projection left out.", + "type": "integer" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "id": { + "description": "Stable record ID: T-0042, DOC-0003, CHG-0101, ADR-0009.", + "type": "string" + }, + "incomingTotal": { + "description": "How many other records link to this one.", + "type": "integer" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family — a card's type, a document's kind, a memory record's collection.", + "type": "string" + }, + "status": { + "description": "Lifecycle status, in the vocabulary of this record's family.", + "type": "string" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "record": { + "additionalProperties": true, + "description": "The release record that was created.", + "properties": { + "archived": { + "description": "Whether the record lives in the archive directory.", + "type": "boolean" + }, + "body": { + "description": "Markdown body below the frontmatter.", + "type": "string" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "file": { + "description": "File name within the collection directory.", + "type": "string" + }, + "id": { + "description": "Stable record ID.", + "type": "string" + }, + "incoming": { + "description": "Backlinks: references other records make to this one.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "incomingTotal": { + "description": "Total backlinks, which may exceed the returned page.", + "type": "integer" + }, + "issues": { + "description": "Validation findings doctor would report for this record.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "outgoing": { + "description": "References this record makes to others.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family.", + "type": "string" + }, + "revision": { + "description": "Content hash to pass back as expectedRevision on the next write.", + "type": "string" + }, + "status": { + "description": "Lifecycle status.", + "type": "string" + }, + "tags": { + "description": "Free-form tags.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "record", + "consumedFragments" + ], + "type": "object" +}
- Changed
project_doc_create13 fields changed- added
Input schema / properties / body / descriptionAdded value: +"Markdown body, written below the frontmatter." - added
Input schema / properties / folder / descriptionAdded value: +"Folder below the managed docs root. Omit to let docs.layout decide; an empty string writes to the root." - added
Input schema / properties / kind / descriptionAdded value: +"What sort of document this is — architecture, runbook, reference and so on. Project-declared, so the accepted values vary; project_workspace reports them." - added
Input schema / properties / owners / descriptionAdded value: +"Who is answerable for keeping this accurate." - added
Input schema / properties / related / descriptionAdded value: +"IDs of records worth reading alongside this one." - added
Input schema / properties / review_after / descriptionAdded value: +"Date after which this goes stale, YYYY-MM-DD. Defaults to docs.reviewIntervalDays from now." - added
Input schema / properties / scope / descriptionAdded value: +"Subject matter this document covers — topics, not file paths." - added
Input schema / properties / source / descriptionAdded value: +"Where the content came from: a URL, a person, a meeting." - added
Input schema / properties / status / descriptionAdded value: +"Lifecycle status, typically draft or current. Project-declared, so the accepted values vary; project_workspace reports them." - added
Input schema / properties / supersedes / descriptionAdded value: +"IDs of documents this replaces. They are marked superseded." - added
Input schema / properties / tags / descriptionAdded value: +"Free-form tags for filtering." - added
Input schema / properties / title / descriptionAdded value: +"What the document is about, in one line." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "record": { + "additionalProperties": true, + "description": "A canonical record with its body, revision and reference graph.", + "properties": { + "archived": { + "description": "Whether the record lives in the archive directory.", + "type": "boolean" + }, + "body": { + "description": "Markdown body below the frontmatter.", + "type": "string" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "file": { + "description": "File name within the collection directory.", + "type": "string" + }, + "id": { + "description": "Stable record ID.", + "type": "string" + }, + "incoming": { + "description": "Backlinks: references other records make to this one.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "incomingTotal": { + "description": "Total backlinks, which may exceed the returned page.", + "type": "integer" + }, + "issues": { + "description": "Validation findings doctor would report for this record.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "outgoing": { + "description": "References this record makes to others.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family.", + "type": "string" + }, + "revision": { + "description": "Content hash to pass back as expectedRevision on the next write.", + "type": "string" + }, + "status": { + "description": "Lifecycle status.", + "type": "string" + }, + "tags": { + "description": "Free-form tags.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "record" + ], + "type": "object" +}
- Changed
project_doc_list8 fields changed- added
Input schema / properties / kind / descriptionAdded value: +"Keep only these document kinds. Project-declared, so the accepted values vary; project_workspace reports them." - added
Input schema / properties / limit / defaultAdded value: +50 - added
Input schema / properties / limit / descriptionAdded value: +"Maximum documents to return." - added
Input schema / properties / managed / descriptionAdded value: +"true keeps only documents Workfile owns under the managed docs root; false keeps only repository files it merely indexes." - added
Input schema / properties / offset / defaultAdded value: +0 - added
Input schema / properties / offset / descriptionAdded value: +"Skip this many matches before the page starts." - added
Input schema / properties / status / descriptionAdded value: +"Keep only these document statuses. Project-declared, so the accepted values vary; project_workspace reports them." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "limit": { + "description": "Maximum this page could contain.", + "type": "integer" + }, + "offset": { + "description": "Offset this page started at.", + "type": "integer" + }, + "records": { + "description": "Documents matching the filters, in list projection.", + "items": { + "additionalProperties": true, + "description": "A record in list projection: identity and frontmatter without the Markdown body.", + "properties": { + "bodyBytes": { + "description": "Size in bytes of the body this projection left out.", + "type": "integer" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "id": { + "description": "Stable record ID: T-0042, DOC-0003, CHG-0101, ADR-0009.", + "type": "string" + }, + "incomingTotal": { + "description": "How many other records link to this one.", + "type": "integer" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family — a card's type, a document's kind, a memory record's collection.", + "type": "string" + }, + "status": { + "description": "Lifecycle status, in the vocabulary of this record's family.", + "type": "string" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "total": { + "description": "Matches before offset and limit were applied.", + "type": "integer" + } + }, + "required": [ + "records", + "total" + ], + "type": "object" +}
- Changed
project_doc_move4 fields changed- added
Input schema / properties / expectedRevision / descriptionAdded value: +"Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check." - added
Input schema / properties / folder / descriptionAdded value: +"Destination folder relative to the managed docs root. An empty string moves it to the root." - added
Input schema / properties / id / descriptionAdded value: +"Managed document to move, e.g. DOC-0003." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "record": { + "additionalProperties": true, + "description": "A canonical record with its body, revision and reference graph.", + "properties": { + "archived": { + "description": "Whether the record lives in the archive directory.", + "type": "boolean" + }, + "body": { + "description": "Markdown body below the frontmatter.", + "type": "string" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "file": { + "description": "File name within the collection directory.", + "type": "string" + }, + "id": { + "description": "Stable record ID.", + "type": "string" + }, + "incoming": { + "description": "Backlinks: references other records make to this one.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "incomingTotal": { + "description": "Total backlinks, which may exceed the returned page.", + "type": "integer" + }, + "issues": { + "description": "Validation findings doctor would report for this record.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "outgoing": { + "description": "References this record makes to others.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family.", + "type": "string" + }, + "revision": { + "description": "Content hash to pass back as expectedRevision on the next write.", + "type": "string" + }, + "status": { + "description": "Lifecycle status.", + "type": "string" + }, + "tags": { + "description": "Free-form tags.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "record" + ], + "type": "object" +}
- Changed
project_doc_patch4 fields changed- added
Input schema / properties / changes / descriptionAdded value: +"Frontmatter fields to overwrite, plus body to replace the Markdown. Only the keys present are touched. Use project_doc_move to change the folder." - added
Input schema / properties / expectedRevision / descriptionAdded value: +"Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check." - added
Input schema / properties / id / descriptionAdded value: +"Managed document to patch, e.g. DOC-0003." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "record": { + "additionalProperties": true, + "description": "A canonical record with its body, revision and reference graph.", + "properties": { + "archived": { + "description": "Whether the record lives in the archive directory.", + "type": "boolean" + }, + "body": { + "description": "Markdown body below the frontmatter.", + "type": "string" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "file": { + "description": "File name within the collection directory.", + "type": "string" + }, + "id": { + "description": "Stable record ID.", + "type": "string" + }, + "incoming": { + "description": "Backlinks: references other records make to this one.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "incomingTotal": { + "description": "Total backlinks, which may exceed the returned page.", + "type": "integer" + }, + "issues": { + "description": "Validation findings doctor would report for this record.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "outgoing": { + "description": "References this record makes to others.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family.", + "type": "string" + }, + "revision": { + "description": "Content hash to pass back as expectedRevision on the next write.", + "type": "string" + }, + "status": { + "description": "Lifecycle status.", + "type": "string" + }, + "tags": { + "description": "Free-form tags.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "record" + ], + "type": "object" +}
- Changed
project_doctor3 fields changed- added
Input schema / properties / checkPaths / defaultAdded value: +true - changed
Input schema / properties / checkPaths / descriptionPrevious value: -"Check referenced filesystem paths."New value: +"Also verify that paths referenced by records exist on disk. Set false to skip the filesystem walk on a large repository." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "cards": { + "description": "Cards inspected.", + "type": "integer" + }, + "counts": { + "additionalProperties": true, + "description": "Issue counts by severity: error, warning, info.", + "type": "object" + }, + "generatedAt": { + "description": "When this run completed, as an RFC 3339 timestamp.", + "type": "string" + }, + "issues": { + "description": "Findings, each with a severity, a code and the record it concerns.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "modules": { + "additionalProperties": true, + "description": "Record counts per module and collection.", + "type": "object" + }, + "ok": { + "description": "True when no error-severity issue was found.", + "type": "boolean" + } + }, + "required": [ + "ok", + "issues" + ], + "type": "object" +}
- Changed
project_get_record2 fields changed- added
Input schema / properties / id / descriptionAdded value: +"Stable record ID of any family: T-0042, DOC-0003, CHG-0101, REL-0007, ADR-0009." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "record": { + "additionalProperties": true, + "description": "A canonical record with its body, revision and reference graph.", + "properties": { + "archived": { + "description": "Whether the record lives in the archive directory.", + "type": "boolean" + }, + "body": { + "description": "Markdown body below the frontmatter.", + "type": "string" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "file": { + "description": "File name within the collection directory.", + "type": "string" + }, + "id": { + "description": "Stable record ID.", + "type": "string" + }, + "incoming": { + "description": "Backlinks: references other records make to this one.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "incomingTotal": { + "description": "Total backlinks, which may exceed the returned page.", + "type": "integer" + }, + "issues": { + "description": "Validation findings doctor would report for this record.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "outgoing": { + "description": "References this record makes to others.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family.", + "type": "string" + }, + "revision": { + "description": "Content hash to pass back as expectedRevision on the next write.", + "type": "string" + }, + "status": { + "description": "Lifecycle status.", + "type": "string" + }, + "tags": { + "description": "Free-form tags.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "record" + ], + "type": "object" +}
- Changed
project_memory_add21 fields changed- added
Input schema / properties / body / descriptionAdded value: +"Markdown body, written below the frontmatter." - added
Input schema / properties / category / descriptionAdded value: +"Optional sub-classification within the collection." - added
Input schema / properties / collection / descriptionAdded value: +"Which kind of memory this is. learnings: something discovered that changes how the next attempt goes. decisions: a choice made, with its rationale (ADR). incidents: something that broke, and what it cost. conventions: a rule the project now follows. context: temporary situational state, which expires." - added
Input schema / properties / confidence / descriptionAdded value: +"How well established this is — for learnings, whether it has been seen once or many times." - added
Input schema / properties / corrective_actions / descriptionAdded value: +"For incidents: IDs of the cards that stop it recurring." - added
Input schema / properties / deciders / descriptionAdded value: +"For decisions: who made the call." - added
Input schema / properties / expires / descriptionAdded value: +"For context: the date after which this stops being true, YYYY-MM-DD." - added
Input schema / properties / graduated_to / descriptionAdded value: +"IDs of the durable records a learning has been promoted into." - added
Input schema / properties / occurrences / descriptionAdded value: +"How many times this has been observed." - added
Input schema / properties / owners / descriptionAdded value: +"Who is answerable for keeping this accurate." - added
Input schema / properties / related / descriptionAdded value: +"IDs of records worth reading alongside this one." - added
Input schema / properties / resolved_at / descriptionAdded value: +"For incidents: when it was resolved, YYYY-MM-DD." - added
Input schema / properties / review_after / descriptionAdded value: +"Date after which this should be re-read, YYYY-MM-DD." - added
Input schema / properties / scope / descriptionAdded value: +"Subject matter this applies to — topics, not file paths." - added
Input schema / properties / severity / descriptionAdded value: +"For incidents: how bad it was." - added
Input schema / properties / started_at / descriptionAdded value: +"For incidents: when it began, YYYY-MM-DD." - added
Input schema / properties / status / descriptionAdded value: +"Lifecycle status. Each collection has its own vocabulary — a decision is proposed or accepted, an incident is open or resolved. Project-declared, so the accepted values vary; project_workspace reports them." - added
Input schema / properties / supersedes / descriptionAdded value: +"IDs of memory records this replaces. Prefer project_memory_supersede, which updates both sides." - added
Input schema / properties / tags / descriptionAdded value: +"Free-form tags for filtering." - added
Input schema / properties / title / descriptionAdded value: +"The knowledge itself, stated as a claim rather than a topic." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "record": { + "additionalProperties": true, + "description": "A canonical record with its body, revision and reference graph.", + "properties": { + "archived": { + "description": "Whether the record lives in the archive directory.", + "type": "boolean" + }, + "body": { + "description": "Markdown body below the frontmatter.", + "type": "string" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "file": { + "description": "File name within the collection directory.", + "type": "string" + }, + "id": { + "description": "Stable record ID.", + "type": "string" + }, + "incoming": { + "description": "Backlinks: references other records make to this one.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "incomingTotal": { + "description": "Total backlinks, which may exceed the returned page.", + "type": "integer" + }, + "issues": { + "description": "Validation findings doctor would report for this record.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "outgoing": { + "description": "References this record makes to others.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family.", + "type": "string" + }, + "revision": { + "description": "Content hash to pass back as expectedRevision on the next write.", + "type": "string" + }, + "status": { + "description": "Lifecycle status.", + "type": "string" + }, + "tags": { + "description": "Free-form tags.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "record" + ], + "type": "object" +}
- Changed
project_memory_graduate4 fields changed- added
Input schema / properties / expectedRevision / descriptionAdded value: +"Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check." - added
Input schema / properties / id / descriptionAdded value: +"Learning to graduate, e.g. LRN-0015." - added
Input schema / properties / targets / descriptionAdded value: +"IDs of the records that now carry the rule: a convention, a decision or a document." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "record": { + "additionalProperties": true, + "description": "A canonical record with its body, revision and reference graph.", + "properties": { + "archived": { + "description": "Whether the record lives in the archive directory.", + "type": "boolean" + }, + "body": { + "description": "Markdown body below the frontmatter.", + "type": "string" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "file": { + "description": "File name within the collection directory.", + "type": "string" + }, + "id": { + "description": "Stable record ID.", + "type": "string" + }, + "incoming": { + "description": "Backlinks: references other records make to this one.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "incomingTotal": { + "description": "Total backlinks, which may exceed the returned page.", + "type": "integer" + }, + "issues": { + "description": "Validation findings doctor would report for this record.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "outgoing": { + "description": "References this record makes to others.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family.", + "type": "string" + }, + "revision": { + "description": "Content hash to pass back as expectedRevision on the next write.", + "type": "string" + }, + "status": { + "description": "Lifecycle status.", + "type": "string" + }, + "tags": { + "description": "Free-form tags.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "record" + ], + "type": "object" +}
- Changed
project_memory_list8 fields changed- added
Input schema / properties / collection / descriptionAdded value: +"Keep only these collections: learnings, decisions, incidents, conventions, context." - added
Input schema / properties / collection / items / enumAdded value: +[ + "learnings", + "decisions", + "incidents", + "conventions", + "context" +] - added
Input schema / properties / limit / defaultAdded value: +50 - added
Input schema / properties / limit / descriptionAdded value: +"Maximum records to return." - added
Input schema / properties / offset / defaultAdded value: +0 - added
Input schema / properties / offset / descriptionAdded value: +"Skip this many matches before the page starts." - added
Input schema / properties / status / descriptionAdded value: +"Keep only these lifecycle statuses. Each collection has its own vocabulary — a decision is proposed or accepted, an incident is open or resolved. Project-declared, so the accepted values vary; project_workspace reports them." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "limit": { + "description": "Maximum this page could contain.", + "type": "integer" + }, + "offset": { + "description": "Offset this page started at.", + "type": "integer" + }, + "records": { + "description": "Memory records matching the filters, in list projection.", + "items": { + "additionalProperties": true, + "description": "A record in list projection: identity and frontmatter without the Markdown body.", + "properties": { + "bodyBytes": { + "description": "Size in bytes of the body this projection left out.", + "type": "integer" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "id": { + "description": "Stable record ID: T-0042, DOC-0003, CHG-0101, ADR-0009.", + "type": "string" + }, + "incomingTotal": { + "description": "How many other records link to this one.", + "type": "integer" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family — a card's type, a document's kind, a memory record's collection.", + "type": "string" + }, + "status": { + "description": "Lifecycle status, in the vocabulary of this record's family.", + "type": "string" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "total": { + "description": "Matches before offset and limit were applied.", + "type": "integer" + } + }, + "required": [ + "records", + "total" + ], + "type": "object" +}
- Changed
project_memory_patch4 fields changed- added
Input schema / properties / changes / descriptionAdded value: +"Frontmatter fields to overwrite — status, tags, related, owners and the collection-specific fields — plus body to replace the Markdown. Only the keys present are touched." - added
Input schema / properties / expectedRevision / descriptionAdded value: +"Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check." - added
Input schema / properties / id / descriptionAdded value: +"Memory record to patch: LRN-, ADR-, INC-, CONV- or CTX-." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "record": { + "additionalProperties": true, + "description": "A canonical record with its body, revision and reference graph.", + "properties": { + "archived": { + "description": "Whether the record lives in the archive directory.", + "type": "boolean" + }, + "body": { + "description": "Markdown body below the frontmatter.", + "type": "string" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "file": { + "description": "File name within the collection directory.", + "type": "string" + }, + "id": { + "description": "Stable record ID.", + "type": "string" + }, + "incoming": { + "description": "Backlinks: references other records make to this one.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "incomingTotal": { + "description": "Total backlinks, which may exceed the returned page.", + "type": "integer" + }, + "issues": { + "description": "Validation findings doctor would report for this record.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "outgoing": { + "description": "References this record makes to others.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family.", + "type": "string" + }, + "revision": { + "description": "Content hash to pass back as expectedRevision on the next write.", + "type": "string" + }, + "status": { + "description": "Lifecycle status.", + "type": "string" + }, + "tags": { + "description": "Free-form tags.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "record" + ], + "type": "object" +}
- Changed
project_memory_supersede4 fields changed- added
Input schema / properties / expectedRevision / descriptionAdded value: +"Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check." - added
Input schema / properties / id / descriptionAdded value: +"Memory record being retired." - added
Input schema / properties / replacementId / descriptionAdded value: +"Memory record that replaces it. Must already exist." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "record": { + "additionalProperties": true, + "description": "The superseded record.", + "properties": { + "archived": { + "description": "Whether the record lives in the archive directory.", + "type": "boolean" + }, + "body": { + "description": "Markdown body below the frontmatter.", + "type": "string" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "file": { + "description": "File name within the collection directory.", + "type": "string" + }, + "id": { + "description": "Stable record ID.", + "type": "string" + }, + "incoming": { + "description": "Backlinks: references other records make to this one.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "incomingTotal": { + "description": "Total backlinks, which may exceed the returned page.", + "type": "integer" + }, + "issues": { + "description": "Validation findings doctor would report for this record.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "outgoing": { + "description": "References this record makes to others.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family.", + "type": "string" + }, + "revision": { + "description": "Content hash to pass back as expectedRevision on the next write.", + "type": "string" + }, + "status": { + "description": "Lifecycle status.", + "type": "string" + }, + "tags": { + "description": "Free-form tags.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + }, + "replacement": { + "additionalProperties": true, + "description": "The record that replaces it.", + "properties": { + "archived": { + "description": "Whether the record lives in the archive directory.", + "type": "boolean" + }, + "body": { + "description": "Markdown body below the frontmatter.", + "type": "string" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "file": { + "description": "File name within the collection directory.", + "type": "string" + }, + "id": { + "description": "Stable record ID.", + "type": "string" + }, + "incoming": { + "description": "Backlinks: references other records make to this one.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "incomingTotal": { + "description": "Total backlinks, which may exceed the returned page.", + "type": "integer" + }, + "issues": { + "description": "Validation findings doctor would report for this record.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "outgoing": { + "description": "References this record makes to others.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family.", + "type": "string" + }, + "revision": { + "description": "Content hash to pass back as expectedRevision on the next write.", + "type": "string" + }, + "status": { + "description": "Lifecycle status.", + "type": "string" + }, + "tags": { + "description": "Free-form tags.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "record", + "replacement" + ], + "type": "object" +}
- Changed
project_next5 fields changed- added
Input schema / properties / actor / descriptionAdded value: +"Who to attribute this to. Defaults to the MCP client's own name; pass one only to act on another actor's behalf." - added
Input schema / properties / area / descriptionAdded value: +"Rank only cards in these areas. Project-declared, so the accepted values vary; project_workspace reports them." - added
Input schema / properties / limit / defaultAdded value: +5 - added
Input schema / properties / limit / descriptionAdded value: +"Maximum candidates to rank." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "records": { + "description": "Candidates, most actionable first.", + "items": { + "additionalProperties": true, + "description": "A ranked candidate, carrying `reason` — why the ranking surfaced it.", + "properties": { + "bodyBytes": { + "description": "Size in bytes of the body this projection left out.", + "type": "integer" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "id": { + "description": "Stable record ID: T-0042, DOC-0003, CHG-0101, ADR-0009.", + "type": "string" + }, + "incomingTotal": { + "description": "How many other records link to this one.", + "type": "integer" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family — a card's type, a document's kind, a memory record's collection.", + "type": "string" + }, + "status": { + "description": "Lifecycle status, in the vocabulary of this record's family.", + "type": "string" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "total": { + "description": "Actionable cards found before limit was applied.", + "type": "integer" + } + }, + "required": [ + "records", + "total" + ], + "type": "object" +}
- Changed
project_search9 fields changed- added
Input schema / properties / kinds / descriptionAdded value: +"Restrict to these record families: card, doc, change, release, memory. Omit to search all of them." - added
Input schema / properties / limit / defaultAdded value: +20 - added
Input schema / properties / limit / descriptionAdded value: +"Maximum records to return." - added
Input schema / properties / mode / defaultAdded value: +"hybrid" - added
Input schema / properties / mode / descriptionAdded value: +"hybrid adds the injected semantic provider when the host configured one and falls back to lexical when it did not. lexical is deterministic." - added
Input schema / properties / query / descriptionAdded value: +"Free text. Matched against titles, bodies and tags; never empty." - added
Input schema / properties / view / defaultAdded value: +"summary" - changed
Input schema / properties / view / descriptionPrevious value: -"summary (default) omits record bodies and returns an excerpt; full returns everything."New value: +"summary omits record bodies and returns an excerpt; full returns everything, which costs far more tokens at the same limit." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "limit": { + "description": "Maximum this page could contain.", + "type": "integer" + }, + "mode": { + "description": "Which ranking ran: lexical or hybrid.", + "type": "string" + }, + "offset": { + "description": "Offset this page started at.", + "type": "integer" + }, + "provider": { + "description": "Semantic provider that contributed, or null when ranking was purely lexical.", + "type": "string" + }, + "records": { + "description": "Matches, best-scoring first.", + "items": { + "additionalProperties": true, + "description": "A match, carrying searchScore and — in summary view — excerpt.", + "properties": { + "bodyBytes": { + "description": "Size in bytes of the body this projection left out.", + "type": "integer" + }, + "created": { + "description": "Creation date, YYYY-MM-DD.", + "type": "string" + }, + "id": { + "description": "Stable record ID: T-0042, DOC-0003, CHG-0101, ADR-0009.", + "type": "string" + }, + "incomingTotal": { + "description": "How many other records link to this one.", + "type": "integer" + }, + "kind": { + "description": "Record family: card, doc, change, release or memory.", + "type": "string" + }, + "path": { + "description": "Repository-relative path to the Markdown file.", + "type": "string" + }, + "recordType": { + "description": "Type within the family — a card's type, a document's kind, a memory record's collection.", + "type": "string" + }, + "status": { + "description": "Lifecycle status, in the vocabulary of this record's family.", + "type": "string" + }, + "title": { + "description": "Human-readable title.", + "type": "string" + }, + "updated": { + "description": "Date of the last write, YYYY-MM-DD.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "total": { + "description": "Matches found before limit was applied.", + "type": "integer" + }, + "view": { + "description": "Which projection was applied: summary or full.", + "type": "string" + } + }, + "required": [ + "records", + "total" + ], + "type": "object" +}
- Changed
project_workspace1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "properties": { + "name": { + "description": "Project name from project.config.mjs.", + "type": "string" + }, + "readOnly": { + "description": "Whether this server refuses mutations, from --read-only or mcp.allowMutations.", + "type": "boolean" + }, + "root": { + "description": "Absolute path to the workspace root.", + "type": "string" + }, + "schema": { + "additionalProperties": true, + "description": "Effective vocabularies and paths per module: cards (statuses, types, priorities, efforts, areas, axes), docs, memory, changelog, agents, ci, mcp and search.", + "type": "object" + }, + "version": { + "additionalProperties": true, + "description": "Schema version the workspace was created with.", + "type": "object" + } + }, + "required": [ + "name", + "root", + "readOnly" + ], + "type": "object" +}
30 tool updates
v0.1.0- First observed
project_agent_context - First observed
project_card_archive - First observed
project_card_claim - First observed
project_card_create - First observed
project_card_list - First observed
project_card_note - First observed
project_card_patch - First observed
project_card_release - First observed
project_card_reopen - First observed
project_card_transition - First observed
project_card_write - First observed
project_changelog_add - First observed
project_changelog_list - First observed
project_changelog_patch - First observed
project_changelog_preview - First observed
project_changelog_release - First observed
project_doc_create - First observed
project_doc_list - First observed
project_doc_move - First observed
project_doc_patch - First observed
project_doctor - First observed
project_get_record - First observed
project_memory_add - First observed
project_memory_graduate - First observed
project_memory_list - First observed
project_memory_patch - First observed
project_memory_supersede - First observed
project_next - First observed
project_search - First observed
project_workspace
TDQS
Every tool targets a distinct resource+action combination. Similar verbs are separated by resource prefix (card_create vs memory_add vs doc_create vs changelog_add), and similar actions on the same resource are disambiguated by purpose: patch vs write vs note on cards, release vs preview on changelog, supersede vs patch on memory. An agent can reliably select among the 30 tools.
All tools follow a strict project_<resource>_<action> pattern. Resources are consistent (card, memory, changelog, doc) and verbs are consistent (create, list, patch, get) throughout. Even cross-cutting tools fit the pattern (project_search, project_next, project_doctor, project_workspace). No mixed conventions or stylistic deviations.
At 30 tools, the surface is heavy. While the resource families are each well-scoped, the total exceeds the 15-25 comfortable range and approaches the 25+ threshold. Several tools feel granular (project_changelog_preview vs project_changelog_list; project_memory_graduate vs project_memory_supersede; project_card_note vs project_card_write) and could plausibly be consolidated, suggesting this could be tightened to the low-to-mid 20s.
The server provides full lifecycle coverage across multiple domains: cards (create, list, get, claim, transition, patch, write, note, release, archive, reopen), memory (add, list, patch, graduate, supersede), changelog (add, list, patch, preview, release), docs (create, list, move, patch), plus cross-cutting utilities (search, next, doctor, workspace, context bundle). No obvious gaps in the canonical project-management workflow, and dead-end operations are paired with inverses (archive/reopen, claim/release, supersede).
Maintenance
Related MCP Connectors
One memory, every AI. A shared, user-owned markdown memory your AI clients read and write over MCP.
Agent-native notes, tasks, dev-docs, vaults, sync & handoffs. MCP + OpenAPI dual surface.
Work management where AI agents are first-class members: tasks, projects, memory over hosted MCP
- hiveWikiOAuthai.hivewiki
Shared project wiki for AI agents: read and write pages, next actions, and activity logs over MCP.
Related MCP Servers
- AlicenseAqualityDmaintenancePersistent, cross-session task management for Claude Code. 24 MCP tools for tasks, projects, dependencies, and docs. 7 skills for planning, standups, and handoffs. Event-sourced storage with per-project isolation.5MIT
- AlicenseNot gradedqualityCmaintenanceOpen, Git-native memory protocol for MCP agents: stores memories as Markdown files in a Git repo, enabling portability, auditability, and human-editable memory across different AI agents.6815MIT
- FlicenseNot gradedqualityDmaintenanceGit-native MCP server for managing AI context across sessions. Enables LLMs to access project and feature context via markdown files, preserving decisions and constraints.1-
- FlicenseNot gradedqualityCmaintenanceMCP server for managing a project backlog as Markdown files in Git, enabling AI agents to read, create, and update tasks programmatically.2-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/illodev/workfile'
If you have feedback or need assistance with the MCP directory API, please join our Discord server



