backlog-mcp
backlog-mcp is an MCP server that gives AI agents structured read/write access to a story-based project backlog backed by plain markdown files in a requirements/ directory, with Git for versioning and collaboration.
Read operations:
list_stories— List stories with optional filtering by epic ID or status (draft,in-progress,done,blocked)get_story— Fetch full markdown content and metadata for a specific storyget_index_summary— High-level overview of all epics and story counts by status
Write operations:
set_story_status— Update a story's status in the index and backlog filesadd_story_note— Append a timestamped note to a story (for decisions, progress, or blockers)complete_story— Mark a story as done with a mandatory completion summarycreate_epic— Create a new epic with an auto-assignedEPIC-NNNID and optional descriptioncreate_story— Add a new story under an existing epic with an auto-assignedSTORY-NNNIDset_acceptance_criteria— Replace a story's acceptance criteria with a checklist (idempotent)
Deployment & collaboration:
Installable via Go or as a binary; configurable via
BACKLOG_ROOTandBACKLOG_TRANSPORT(stdioorhttp) environment variablesAll data lives in plain markdown files committable to Git, enabling multi-agent collaboration through standard Git workflows
Provides structured read/write access to story-based project backlogs stored as markdown files in git repositories, enabling AI agents to manage stories, update statuses, append notes, and handle collaboration through git's version control and merge capabilities.
backlog-mcp
An MCP server that gives AI agents structured read/write access to a story-based project backlog. Agents can list stories, read content, update status, and append notes — all backed by plain markdown files that live inside your project repository.
How collaboration works
There is no shared server. The backlog files live in your repo under requirements/, committed and versioned alongside your code. Collaboration between agents, or between an agent and a human, works exactly the way the rest of your codebase does: through git. If two agents update different stories concurrently, git merges them. If they touch the same line, you resolve it like any other merge conflict.
The MCP server is a local process each agent runs for itself. It reads and writes files; git handles the rest.
Related MCP server: Jira MCP
Install
Homebrew (tap)
brew tap corbym/backlog-mcp
brew install backlog-mcpYou can also install directly without an explicit tap step:
brew install corbym/backlog-mcp/backlog-mcpBinary release
Download the latest binary for your platform from the Releases page and put it somewhere on your $PATH.
Go install
If you have Go installed:
go install github.com/corbym/backlog-mcp@latestBuild from source
go mod tidy
go build -o backlog-mcp .Setup
Initialise a requirements/ folder in your project root:
./backlog-mcp init /path/to/your/project/requirementsThis creates:
requirements/
requirements-index.md # master index — source of truth for epics and story status
backlog.md # priority-ordered list of not-done stories
epic-001-example/
story-001.md # example story fileCommit the requirements/ folder to your repo. Edit the files to add your own epics and stories.
Running
./backlog-mcpThe server looks for a requirements/ directory relative to the working directory it is launched from. Claude Code sets the working directory to the project root, so no configuration is needed.
Create a plan file
./backlog-mcp plan [name]Creates a new plan scaffold in the requirements/ directory. Without a name the file is plan.md; with a name it is plan-<name>.md. If the file already exists a numeric suffix is added (plan-002.md, etc.). Open the file and work with your agent to fill it in before creating stories.
Configuring your MCP client
Prefer a local config file committed to your project root. This scopes the server to the project and means any agent cloning the repo gets the right setup automatically. Only use a global config if you want backlog-mcp available in every project without per-project configuration.
VS Code / GitHub Copilot — add .vscode/mcp.json to your project root:
{
"servers": {
"backlog-mcp": {
"command": "/path/to/backlog-mcp",
"type": "stdio"
}
}
}Claude Code — add .claude/settings.json to your project root:
{
"mcpServers": {
"backlog-mcp": {
"command": "/path/to/backlog-mcp"
}
}
}For a global fallback (applies to every project), place the same config in ~/.claude/settings.json (Claude Code) or add it to VS Code's user settings.json under the mcp.servers key (GitHub Copilot). Always prefer the local per-project file.
Tools
Tool | Description |
| List stories, optionally filtered by |
| Get full markdown content and metadata for a story, including |
| High-level epic/story counts by status |
| Create a new epic — assigns next EPIC-NNN ID, writes epic file, registers in index |
| Create a new story under an epic — assigns next STORY-NNN ID, registers in index and backlog |
| Update epic lifecycle status with completion and regression guards (see below) |
| Update story status ( |
| Replace the acceptance criteria section of a story (idempotent) |
| Tick a single acceptance criterion |
| Append a timestamped note to a story file |
| Mark a story done with a mandatory completion summary and acceptance criteria validation |
| Reconcile an epic's |
| Update multiple acceptance-criteria checkbox states for one story in one call |
| Update multiple stories in one call (status, note, and/or acceptance criteria patches) |
| Update multiple epics in one call (status and/or note) |
set_epic_status guards
Setting status to done requires:
summary— a completion note, appended as a timestamped entry to the epic file.All stories done — if any stories are still open the call fails and lists them. Pass
override_incomplete=trueonly after the user explicitly confirms the incomplete stories are intentionally omitted.
Moving backwards (e.g. done → in-progress, in-progress → draft) triggers a regression prompt: the agent should offer to create new stories before proceeding. Pass confirm_regression=true only if the user explicitly insists on skipping that step. blocked and deferred are lateral states and can be set freely.
complete_story guards
Acceptance criteria must be set (not the default placeholder) before a story can be completed. Unchecked criteria block completion unless incomplete_items is provided with one explanation per unchecked item. Tick done criteria [x] via set_acceptance_criteria first — do not use incomplete_items to confirm work that is actually finished.
Environment variables
Variable | Required | Default | Description |
| no |
| Override the path to the requirements directory |
File format
requirements-index.md — one epic section per heading, one story per table row:
## EPIC-001: Combat System — `draft`
| Story | Title | Status | Type |
|-------|-------|--------|------|
| [STORY-001](./epic-001-combat-system/story-001.md) | Basic combat | draft | feature |backlog.md — priority-ordered numbered list:
1. **STORY-001** — Basic combat
2. **STORY-002** — Enemy AI *(in-progress)*Story files live at epic-NNN-slug/story-NNN.md under BACKLOG_ROOT.
Story types: feature, bug, chore, spike
Status values: draft, in-progress, done, blocked, deferred
Automated PR backlog agent
A GitHub Actions workflow is included that automatically updates story statuses and appends notes when pull requests are opened or updated. It requires no API keys — only the standard GITHUB_TOKEN.
How it works
On every pull_request event (opened, synchronize) the workflow:
Installs the
backlog-mcpbinary viago install github.com/corbym/backlog-mcp@latest.Scans the PR title and branch name for
STORY-NNNIDs.For each matched story, sets status to
in-progress(if it wasdraftand the PR was just opened) and appends a timestamped note with the PR number and title.Commits any changed files under
requirements/back to the PR branch.
Setting it up in your repository
Copy these three files into your repo:
.github/
actions/
install/
action.yml # composite action — installs the binary via go install
scripts/
backlog_agent.py # deterministic MCP client (Python 3, stdlib only)
workflows/
backlog-agent.yml # the workflowThe files are in the corbym/backlog-mcp repository. No secrets or additional configuration are required beyond a requirements/ folder already being present.
Branch and PR naming
The agent matches stories by STORY-NNN ID. Include the ID in your branch name or PR title:
story-042-short-description # branch
STORY-042: Short description # PR title
STORY-042 STORY-043: Short desc # multiple stories
chore: bump goreleaser to v2 # no story — agent skips cleanlySee CONTRIBUTING.md for the full convention.
Using backlog-mcp with GitHub Copilot agent mode
GitHub Copilot's agent mode in VS Code reads MCP servers from .vscode/mcp.json in your project root. Note the key is "servers", not "mcpServers" (which is the Claude Code convention):
{
"servers": {
"backlog-mcp": {
"command": "/path/to/backlog-mcp",
"type": "stdio"
}
}
}MCP tools are only available in Agent mode — switch to it via the mode dropdown in Copilot Chat. Once configured, Copilot agent can call list_stories, get_story, add_story_note, and all other backlog tools during a chat session — the same tools the GitHub Actions workflow uses.
Notes
File writes are atomic (temp file + rename) — a crash mid-write cannot corrupt your files.
The filesystem is the source of truth. The MCP server never owns the data.
Available Tools
16 toolsadd_story_noteADestructive
Append a timestamped note to a story file. Use to record progress, decisions made, or blockers encountered. Notes are appended under a '## Notes' section with an ISO 8601 timestamp. Returns {story_id, appended_at, path}.
| Name | Required | Description | Default |
|---|---|---|---|
| note | Yes | The note text to append. Can be multi-line. Will be stored with a UTC timestamp. | |
| story_id | Yes | Story ID to annotate, e.g. STORY-047 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description discloses behavior beyond annotations: notes appended under '## Notes' section with ISO 8601 timestamp, return structure {story_id, appended_at, path}. It is consistent with destructiveHint=true and idempotentHint=false.
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 efficient sentences cover action, use cases, and behavior/return. No wasted words, front-loaded with key 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?
Complete for a simple append tool with 2 params and no output schema. Could mention prerequisite (story must exist) but not essential given context signals and sibling tools.
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 covers both parameters with descriptions. Description adds meaning: notes are multi-line, stored with UTC timestamp, under specific section, and return fields. No ambiguity.
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 action 'append a timestamped note to a story file' and specifies resource (story file). It distinguishes from sibling tools which handle other operations like creating stories or updating statuses.
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 explicitly says 'Use to record progress, decisions made, or blockers encountered', providing clear use cases. However, it does not explicitly state when not to use or mention alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_update_acceptance_criteriaADestructive
Update the checked state of individual acceptance criteria on a story in one operation. Only the criteria explicitly listed are modified; all others are left untouched. Criteria are matched by exact text. If any criterion text is not found, no changes are made and an error is returned. Returns {story_id, path, criteria_updated, errors}. Call get_story separately if you need to see the resulting content.
| Name | Required | Description | Default |
|---|---|---|---|
| criteria | Yes | Map of criterion text to desired checked state. true = checked [x], false = unchecked [ ]. Criterion text must match exactly. | |
| story_id | Yes | Story ID to update, e.g. STORY-047 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses partial update behavior, exact match, atomicity (no changes on mismatch), and return shape. Annotations already indicate mutability and destructiveness, but description adds context beyond 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?
Four sentences, each with distinct information. Front-loaded with main action. No redundancy.
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?
Adequately covers all aspects given no output schema. Return format specified. Could add more on success behavior but sufficient.
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%, but description explains exact matching, boolean meaning, and partial update semantics. Adds value beyond 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+resource: 'Update the checked state of individual acceptance criteria on a story'. Distinguishes from siblings like check_acceptance_criterion (single) and set_acceptance_criteria (setting list).
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?
Tells when to use (bulk update) and behavior: only listed criteria modified, exact match required, error if not found. Suggests using get_story to see results. Lacks explicit sibling differentiation but context permits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_update_epicsADestructive
Update multiple epics in one operation. Each entry may set status and/or append a note. Updates are applied atomically per file. If an epic does not exist, an error is recorded for that entry and processing continues. Returns an array of per-epic result objects with fields: epic_id, status_updated, old_status, new_status, note_appended, errors.
| Name | Required | Description | Default |
|---|---|---|---|
| updates | Yes | Array of epic update objects. Each must include epic_id; status and note are optional. status must be one of: draft, in-progress, done, blocked, deferred. note is appended, not replaced. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate destructiveness, and the description adds valuable context: atomicity per file, error handling on missing epics, and structure of return results. This goes beyond what annotations provide.
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?
Description is concise with three sentences, front-loads purpose, and covers key behaviors. Efficient but could be slightly more streamlined.
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 no output schema, the description adequately explains return format. Annotations cover safety. Missing details on prerequisites or rate limits, but overall sufficient for a bulk update 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% and already explains parameter details (required fields, status enum, note behavior). The description merely echoes 'Each entry may set status and/or append a note', adding negligible new meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool updates multiple epics in one operation, specifies actions (set status, append note), and addresses error handling. It distinguishes from single-epic tools like set_epic_status and create_epic.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use case for bulk updates but does not explicitly state when to prefer this over single-update siblings (e.g., set_epic_status). Lacks when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_update_storiesADestructive
Update multiple stories in one operation. Each entry may set status, append a note, and/or patch acceptance criteria. Updates are applied atomically per file. If a story does not exist, an error is recorded for that entry and processing continues. Returns an array of per-story result objects with fields: story_id, status_updated, old_status, new_status, note_appended, criteria_updated, criteria_errors, errors.
| Name | Required | Description | Default |
|---|---|---|---|
| updates | Yes | Array of story update objects. Each must include story_id; status, note, and criteria are optional. status must be one of: draft, in-progress, blocked, deferred (use complete_story to mark done). note is appended, not replaced. criteria is a map of criterion text (or AC ID) to boolean checked state — true = checked, false = unchecked. Example: {"User can log in": true, "User sees error on bad password": false}. Keys are matched case-insensitively with tolerance for Unicode dash variants (em-dash, en-dash, etc.). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, and description adds that non-existent stories result in errors but processing continues. It also mentions atomicity per file. Does not contradict annotations; adds useful behavioral detail beyond what annotations provide.
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 paragraph, dense but well-organized. Front-loads purpose, then details. Slightly verbose in the criteria description, but overall efficient for the complexity.
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?
Covers all key aspects: what is updated, input format, atomicity, error handling, and return array structure. No output schema, but description adequately describes the per-story result objects. Given the tool's complexity, the description is fully 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%, but description adds critical meaning: enumerates valid statuses (draft, in-progress, blocked, deferred) and notes 'complete_story' for done. For criteria, explains it's a map with case-insensitive matching and Unicode dash tolerance. This goes well beyond the schema's minimal descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Update multiple stories in one operation' and lists the fields that can be updated (status, note, criteria). Distinguishes from siblings like 'complete_story' by explicitly mentioning when to use that sibling. Also describes atomicity per file and error handling.
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?
Provides guidance on status values and directs to 'complete_story' for marking done. Implicitly indicates this tool is for bulk updates, but does not explicitly state when not to use it or provide alternatives for single story updates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_acceptance_criterionADestructive
Mark a single acceptance criterion as checked (- [ ] → - [x]) in a story file. Identify the target by criterion_index (0-based) or criterion_text (case-insensitive exact match). Exactly one must be provided. Returns {story_id, criterion, checked, path}. Errors if the story is not found, the criterion is not found, or it is already checked.
| Name | Required | Description | Default |
|---|---|---|---|
| story_id | Yes | Story ID to update, e.g. STORY-047 | |
| criterion_text | No | Exact text of the criterion to check (case-insensitive). Use when you know the text. Mutually exclusive with criterion_index. | |
| criterion_index | No | 0-based index of the criterion to check. Use when you know the position. Mutually exclusive with criterion_text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (destructiveHint=true, idempotentHint=false), the description discloses specific error conditions (story not found, criterion not found, already checked) and the return format, adding concrete behavioral context.
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: first states action and transformation, second covers identification, return values, and errors. No redundant fluff; 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 description, combined with annotations and schema, fully covers purpose, usage, parameters, behaviors, and error states. No additional information is needed for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already has 100% coverage with good descriptions. The description adds value by explicitly stating 'Exactly one must be provided' for the mutually exclusive parameters, reinforcing the constraint.
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 'Mark' and resource 'acceptance criterion' with a clear transformation '- [ ] → - [x]'. It distinguishes from sibling tools like bulk_update_acceptance_criteria and set_acceptance_criteria by focusing on a single 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 specifies how to identify the criterion (index or text, exactly one required) and lists error conditions. It implies single-criterion use but does not explicitly contrast with bulk alternatives; however, the context of sibling tools makes the distinction clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
complete_storyADestructive
Mark a story done and append a mandatory completion summary note in one atomic call. Validates acceptance criteria before completing: if the AC section has not been set (contains only the placeholder), completion is blocked — call set_acceptance_criteria first. IMPORTANT: if a criterion is actually done, mark it [x] in the story file via set_acceptance_criteria BEFORE calling this tool — do not leave it unchecked. If criteria remain unchecked (genuinely not done), incomplete_items is required with one explanation per unchecked item explaining WHY it was not completed (e.g. deferred, out of scope). incomplete_items is for unfinished work only — never use it to confirm completed work. On success, removes the story from backlog.md and returns {story_id, completed_at, backlog_removed}.
| Name | Required | Description | Default |
|---|---|---|---|
| summary | Yes | Completion summary describing what was done. Appended as a timestamped note to the story file. | |
| story_id | Yes | Story ID to complete, e.g. STORY-047 | |
| incomplete_items | No | Required when the story has unchecked (genuinely unfinished) acceptance criteria. Each string must explain WHY that criterion was not met (e.g. 'Deferred to STORY-010 — rarity system not yet designed'). One entry per unchecked item, in the order they appear. DO NOT use this field to confirm items that are done — if a criterion is done, tick it [x] via set_acceptance_criteria first, then retry. Never prefix entries with 'Done:' — if it is done, it should not appear here at all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While annotations already mark destructiveHint=true and readOnlyHint=false, the description adds critical context: removal from backlog.md, return fields, blocking behavior when AC not set, and conditional requirement for incomplete_items. Does not contradict annotations. Deduction for not explicitly stating error behavior beyond blocking.
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 concise (about 6 sentences) and front-loads the core action. Every sentence adds value, but it packs many conditional rules into a single paragraph. Slight improvement possible with structured list for key constraints.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (validation, conditional parameter, destructive side effects, no output schema), the description covers: purpose, preconditions (AC set, proper tick marking), conditional field usage, success effects (backlog removal, return values). No output schema, but return values are described. Completeness ensures an agent can use it correctly.
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 has 100% coverage with descriptions, but the description adds significant meaning: explains when incomplete_items is required vs prohibited, and that summary is timestamped. Goes beyond baseline of 3 by clarifying conditional logic and constraints not fully captured in 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 the tool's purpose: 'Mark a story done and append a mandatory completion summary note in one atomic call.' It specifies the verb, resource, and action. It also distinguishes itself from siblings by mentioning validation of acceptance criteria and the need to call set_acceptance_criteria first.
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?
Provides explicit guidance: explains when to use set_acceptance_criteria first, when incomplete_items is required, and what constitutes proper usage. Contrasts with sibling tools like set_acceptance_criteria. Clearly states when-not-to-use for incomplete_items field.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_epicADestructive
Create a new epic. Assigns the next EPIC-NNN ID, creates the epic directory and epic.md file, and registers it in requirements-index.md with status draft. Returns {epic_id, path}.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Title of the epic, e.g. 'User Authentication' | |
| description | No | Optional description or goal for the epic. Written into the epic.md file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate destructive hint true; description adds detail on side effects: ID assignment, directory/file creation, index registration. Adds context beyond annotations without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: purpose then action sequence and return value. No fluff, front-loaded with key 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?
Covers return value and side effects comprehensively for a create operation. Lacks error conditions but acceptable given 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 coverage is 100%; description adds value by noting the description parameter is written into epic.md file. Otherwise aligns with schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action 'Create a new epic' and the resource. Distinguishes from siblings like 'create_story' and 'bulk_update_epics' by specifying it creates a single epic with ID assignment and file creation.
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?
Provides no explicit when-to-use or alternatives. Implicitly for creating a single epic, but no guidance on when to use this versus sibling tools like 'create_story'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_storyADestructive
Create a new story under an existing epic. Assigns the next STORY-NNN ID, writes the story file, and registers it in requirements-index.md and backlog.md with status draft. The story is appended to the end of the backlog. Returns {story_id, path}.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Title of the story, e.g. 'User can reset password' | |
| epic_id | Yes | Epic ID the story belongs to, e.g. EPIC-003. The epic must already exist. | |
| story_type | No | Type of story. Valid values: feature, bug, chore, spike. Defaults to 'feature' if not provided. | |
| description | No | Optional description or goal for the story. Written into the story.md file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true), the description explains the exact side effects: ID assignment, file writes, registration in two files, and appending to backlog. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the main action, followed by essential details. Every sentence is informative and no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the return value, preconditions (epic exists), process steps, and side effects. It does not address error handling or constraints on title/description length, but it is sufficient for most use cases.
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% with parameter descriptions. The description adds value by explaining that the description parameter is written into story.md and that epic_id must already exist. It also reveals the ID assignment mechanism not present in 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 the verb 'create', the resource 'story', and the context 'under an existing epic'. It distinguishes from sibling tools like create_epic by specifying the parent requirement. The details on ID assignment and file registration further clarify the action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the epic must exist and the story will be placed into the backlog. It does not explicitly say when not to use this tool or mention alternatives, but the name and context make it clear this is the primary tool for creating stories.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_index_summaryADestructive
Get a high-level summary of all epics and their story counts broken down by status. Useful for situational awareness at the start of a session, without reading every file. Returns an array of {epic_id, title, status, counts: {status: n}, stories: [{story_id, status}]}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description describes a read-only operation ('Get a high-level summary'), but the annotation destructiveHint=true indicates the tool may cause destructive side effects. This is a direct contradiction. Additionally, no other behavioral traits (e.g., authentication requirements, side effects) are disclosed beyond what annotations provide, which is insufficient for a tool with contradictory 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 sentences, front-loaded with the core functionality, and includes both usage context and return format. Every sentence is informative and concise, with no waste.
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 details the return format, compensating for the lack of an output schema. It also provides usage context. However, it does not address the contradiction with the destructiveHint annotation, leaving uncertainty about side effects. For a simple zero-parameter tool, this is a noticeable gap that impacts completeness.
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?
There are no parameters, so the input schema is fully covered. The baseline score of 4 applies as per the rule for 0 parameters. The description does not need to add parameter information, and it does not attempt to.
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 provides a high-level summary of all epics with story counts by status. It specifies the action (Get), the resource (epics summary), and the scope (all epics, broken down by status), which distinguishes it from sibling tools that focus on individual items or mutations.
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 it is 'useful for situational awareness at the start of a session, without reading every file,' providing clear guidance on when to use it. However, it does not mention alternatives or explicitly state when not to use it, which would strengthen the guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_storyADestructive
Get the full markdown content and metadata for a single story. Returns {story_id, title, status, epic_id, path, content} where content is the raw markdown of the story file. Set include_notes=false to omit the '## Notes' section (and everything after it) from content — use this when you only need current status, goal, or acceptance criteria and want to avoid paying for a long accumulated note history.
| Name | Required | Description | Default |
|---|---|---|---|
| story_id | Yes | Story ID to retrieve, e.g. STORY-047 | |
| include_notes | No | Set to false to exclude the '## Notes' section from the returned content. Defaults to true (full content, unchanged behaviour). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains that the tool returns content and how include_notes alters the returned content. However, the annotations indicate destructiveHint:true, implying potential modification, which contradicts the read-only nature described. This mismatch reduces transparency.
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 purpose. Every sentence adds value without redundancy. 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?
Provides return structure and behavior of include_notes. No output schema, so description compensates. However, the destructiveHint annotation inconsistency is not addressed, leaving a gap in completeness about the tool's true effect.
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 covers both parameters (100% coverage). The description adds context for include_notes: omitting the '## Notes' section and everything after it, which is not evident from the schema alone. This enhances understanding of the parameter's effect.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get the full markdown content and metadata for a single story.' It also lists the return fields (story_id, title, status, epic_id, path, content), making it distinct from sibling tools like list_stories or add_story_note.
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?
Describes when to set include_notes=false ('when you only need current status, goal, or acceptance criteria and want to avoid paying for a long accumulated note history'). Provides clear context for using this parameter, though no explicit when-not-to-use or alternative tools are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
groom_epicADestructive
Reconcile the ## Stories section in an epic.md file with the story files on disk and the requirements index. Adds missing entries, removes entries for story files that no longer exist, and refreshes titles and done/undone markers. Returns {epic_id, added, removed, updated, unchanged}.
| Name | Required | Description | Default |
|---|---|---|---|
| epic_id | Yes | Epic ID to groom, e.g. EPIC-003 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark the tool as destructive, and the description confirms modifications (adds, removes, refreshes). It provides context beyond annotations by detailing what is changed (epic.md sections) and the return object. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the main action, and uses precise language. Every sentence adds value without redundancy.
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 single-parameter tool with no output schema, the description adequately covers the operation and return structure. It could mention prerequisites (e.g., file existence) but is sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% with a description for epic_id. The tool description does not add additional semantics beyond reiterating the parameter's use. Since schema coverage is high, 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 clearly states the tool's purpose: reconciling the Stories section in an epic.md file with story files on disk and the requirements index. It specifies exactly what it does (add, remove, refresh) and the return value, which distinguishes it from all sibling 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?
The description implies when to use the tool (to synchronize epic file with disk state) but does not explicitly state when not to use it or mention alternatives. However, given the unique purpose, the agent can infer appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_storiesADestructive
List stories from the project index, optionally filtered by epic, status, or type. Returns an array of {story_id, title, status, epic_id, story_type} objects. With no filters, returns all stories across all epics. Other tools in this server: get_story, get_index_summary, create_epic, create_story, set_story_status, set_epic_status, add_story_note, set_acceptance_criteria, check_acceptance_criterion, complete_story, bulk_update_stories, bulk_update_epics, bulk_update_acceptance_criteria, groom_epic, reorder_backlog.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Optional status to filter by. Valid values: draft, in-progress, done, blocked. When provided, only stories with this status are returned. | |
| epic_id | No | Optional epic ID to filter by (e.g. EPIC-003). When provided, only stories belonging to this epic are returned. | |
| story_type | No | Optional story type to filter by. Valid values: feature, bug, chore, spike. When provided, only stories of this type are returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description describes a read operation (list stories), but annotations mark destructiveHint=true, suggesting potential mutation. This contradiction is critical and not addressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with a clear structure, front-loading purpose and adding return format and sibling tools efficiently.
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?
Despite no output schema, the description specifies the return format and covers all necessary information for a filtering list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds default behavior context (returns all stories when no filters) beyond the schema, which already covers parameters well (100% 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 clearly states the tool lists stories from the project index with optional filters, and distinguishes from siblings like get_story and get_index_summary.
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 indicates when to use (listing stories, with or without filters) but does not explicitly exclude alternative tools or provide guidance on when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reorder_backlogADestructive
Reorder the active backlog by supplying the desired story ID sequence. Entries present in story_ids are placed first in that order; any backlog entries omitted from the list are appended at the end so nothing is silently dropped. IDs not found in the backlog (e.g. already done) are reported in not_found but do not cause a failure. Returns {placed: [ordered story IDs written], not_found: [IDs absent from backlog], appended: [IDs moved to end because they were omitted]}.
| Name | Required | Description | Default |
|---|---|---|---|
| story_ids | Yes | Ordered list of story IDs representing the desired backlog priority, highest priority first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond annotations by detailing that entries omitted from story_ids are appended at the end, that not-found IDs are reported without causing failure, and that the response includes placed, not_found, and appended lists. This adds significant context to the destructiveHint=true and readOnlyHint=false 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 with no wasted words. The first sentence states the action, the second explains details and return values. Information is front-loaded and every sentence contributes.
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 single parameter, no output schema, and existing annotations, the description fully explains the tool's behavior and return format. It covers what happens to all backlog entries, handling of not-found IDs, and the structure of the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema describes story_ids as an ordered list of story IDs for backlog priority. The description adds that entries listed are placed first and omitted ones are appended, enhancing the semantic understanding beyond the schema description.
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 reorders the active backlog by supplying a desired story ID sequence. It specifies the verb 'reorder' and the resource 'backlog', and details the behavior with omitted and not-found IDs, distinguishing it from siblings like 'set_story_status' or 'complete_story'.
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 what the tool does but does not explicitly state when to use it or when not to use it, nor does it mention alternatives among siblings. Usage is implied by the purpose, but no explicit guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_acceptance_criteriaADestructive
Replace the acceptance criteria section of a story file. Each string in the criteria array becomes a checklist line. Plain text is written as an unchecked - [ ] ... item. A string may also be passed as a full checklist line (e.g. - [x] text, [x] text, or the full stored line including an existing AC-ID) — the leading checkbox marker is stripped and its checked state is preserved, and any existing AC-ID in the input is kept rather than regenerated. Idempotent: calling again replaces the previous AC entirely. Acceptance criteria must be set before a story can be completed with complete_story. Returns {story_id, criteria_count, path}.
| Name | Required | Description | Default |
|---|---|---|---|
| criteria | Yes | List of acceptance criteria strings. Plain text becomes an unchecked `- [ ] ...` item. To mark a criterion as already checked, prefix it with `[x] ` or `- [x] ` (e.g. `- [x] User can log in`) — the checked state is preserved and any leading AC-ID in the string is kept rather than regenerated. Must contain at least one item. | |
| story_id | Yes | Story ID to update, e.g. STORY-007 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description claims the tool is 'Idempotent', but the annotations set idempotentHint to false, creating a direct contradiction. Additionally, the description discloses behavioral details (checkmark preservation, AC-ID handling) beyond the annotations, but the contradiction severely undermines transparency.
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 well-structured, starting with the main action, then explaining the checklist format, idempotency, and a prerequisite. While it packs a lot of information, it remains clear and efficient, with each sentence serving a distinct 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 description covers key aspects: what the tool does, how to format criteria, idempotency, prerequisite, and return value. However, the annotation contradiction (idempotentHint mismatch) introduces confusion, reducing overall completeness for a reliable agent decision.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides 100% parameter descriptions, but the description adds significant value by explaining the checklist behavior: plain text becomes unchecked `- [ ] ...` items, and how to pass pre-checked items or preserve AC-IDs. This goes beyond the schema's basic description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Replace the acceptance criteria section of a story file.' It elaborates on the format of criteria strings, idempotency, and the prerequisite relationship with complete_story, making the function unambiguous and distinct from sibling 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?
The description explicitly states when to use the tool: 'Acceptance criteria must be set before a story can be completed with complete_story.' It also notes idempotency. However, it does not provide explicit exclusions or guidance on when not to use it versus alternative tools like bulk_update_acceptance_criteria or check_acceptance_criterion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_epic_statusADestructive
Update the lifecycle status of an epic. Use this tool to manage the epic's own status — not the status of individual stories within it (use set_story_status for that). Typical progression: draft → in-progress (when the first story starts) → done (when all stories are complete) or deferred (if the epic is postponed). Status meanings: 'draft' = epic created but no work started; 'in-progress' = actively being worked on; 'done' = all stories complete and the epic is closed; 'blocked' = progress prevented by an external dependency; 'deferred' = postponed indefinitely. Guards: (1) Setting 'done' requires a summary and checks all stories are done. If any are not done, the call fails — set override_incomplete=true only after the user explicitly confirms this is acceptable. (2) Moving backwards (e.g. done → in-progress, in-progress → draft) asks you to create new stories to justify the regression first. Set confirm_regression=true only if the user explicitly insists on skipping story creation. Returns {epic_id, old_status, new_status}.
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | New status to assign. Must be one of: draft, in-progress, done, blocked, deferred. | |
| epic_id | Yes | Epic ID to update, e.g. EPIC-003 | |
| summary | No | Required when setting status to 'done'. Describes what was accomplished by this epic. Appended as a timestamped note to the epic file. | |
| confirm_regression | No | Set to true to allow a backwards status transition (e.g. done → in-progress) without first creating new stories. Only set if the user explicitly insists on skipping story creation. | |
| override_incomplete | No | Set to true to mark the epic 'done' even when some stories are not done. Only set after the user explicitly confirms the incomplete stories are intentionally omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (destructiveHint: true), description details mutation behavior, guards for backwards transitions and incomplete stories, required summary for 'done', and return object.
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?
Well-structured with front-loaded purpose, then progression, status meanings, and guards. Every sentence adds essential information without redundancy.
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?
Comprehensively covers conditional logic (required summary for done, guards for incomplete and regression), return structure, and all edge cases despite lacking output 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?
Adds meaning beyond schema by explaining status meanings, typical progression, and contextual use of override_incomplete and confirm_regression.
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 updates epic lifecycle status, distinguishes from set_story_status, and provides typical status progression.
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 this tool vs alternatives (set_story_status) and provides detailed guards for override_incomplete and confirm_regression with user confirmation requirements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_story_statusADestructive
Update the status of a story to draft, in-progress, blocked, or deferred. To mark a story done, use complete_story instead — it enforces acceptance criteria, appends a summary note, and removes the story from the backlog. Returns {story_id, old_status, new_status, backlog_updated}.
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | New status to assign. Must be one of: draft, in-progress, blocked, deferred. To mark done, use complete_story. | |
| story_id | Yes | Story ID to update, e.g. STORY-047 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate destructiveness and non-idempotence; description elaborates on behavior (return values, backlog update) without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, critical info front-loaded, 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?
Given full schema, annotations, and description covering return format, no gaps remain.
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% with good descriptions; description adds minimal extra meaning beyond what schema already provides.
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 it updates story status to four specific values and distinguishes from complete_story, making the tool's 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?
Explicitly tells when to use this tool vs complete_story, including rationale for the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a clearly distinct purpose. Despite some functional overlap between individual and bulk operations, the descriptions explicitly clarify the scope (single vs. multiple, validation vs. simple status change). The agent can reliably distinguish between tools like set_story_status and complete_story.
All tool names follow a consistent verb_noun pattern in snake_case. Verbs like 'create', 'get', 'set', 'check', 'complete', 'add', 'bulk_update', 'groom', 'list' are descriptive and consistently applied. There is no mixing of conventions.
15 tools is well-scoped for a backlog management system. Each tool addresses a specific need without redundancy. The number is large enough to cover core workflows but not bloated.
The tool surface covers creation, status updates, acceptance criteria management, and status reporting. However, there is no tool to update story/epic titles or descriptions, and no delete functionality. These gaps would force agents to work around limitations, e.g., by relying on notes for content changes.
Maintenance
Related MCP Connectors
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
One memory, every AI. A shared, user-owned markdown memory your AI clients read and write over MCP.
Roadmap, tasks, releases and user feedback your coding agent reads and writes over MCP.
Task management your AI agents can actually run. One line becomes a context-ready task over MCP.
Related MCP Servers
- -
- AlicenseBqualityCmaintenanceEnables control and interaction with Jira through the Jira Command Line interface, allowing users to manage Jira tasks and operations through natural language commands.37MIT
- AlicenseAqualityNot gradedmaintenanceEnables AI assistants to interact with Atlassian Jira Cloud, allowing users to manage projects, issues, comments, and workflows through natural language commands.6983-
- AlicenseNot gradedqualityDmaintenanceA file-backed MCP server for hierarchical project management that enables AI assistants to create, claim, and complete tasks within a project→epic→feature→task structure, with dependency management and Markdown-based storage.MIT
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/corbym/backlog-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server