Skip to main content
Glama

frontier-mcp

An MCP server that serves the markdown issue tracker under .scratch/ as a queryable graph — so agents stop re-parsing prose to learn what is open, blocked, or takeable.

Stability

Pre-1.0: the API can change in a breaking way on any release. The tool surface is fixed at eight tools, but their arguments, results, and the on-disk conventions under .scratch/ are still being settled — Ticket id format among them. Semver is honoured within 0.x as best it can be, and the CHANGELOG.md records every break, but a 0.x bump is not a promise of compatibility. Pin an exact version (see below) and read the changelog before moving the pin. From v1.0.0 on, breaking changes wait for a major.

Related MCP server: brainforge-mcp

Requirements

  • Node 20.20.2+ on 20.x, 22.17.1+ on 22.x, or 24.15.0+ on 24.x for frontier-mcp@0.4.0

  • Node 16.20.2+ to run the setup bootstrap; pnpm for development of this repository

Node 24 LTS is recommended for new installations. The package floors passed on macOS, Linux, and Windows in runtime CI.

Install

Register FrontierMCP once in the client's user scope. The recommended setup downloads the bootstrap from the published 0.4.1 tarball, installs the exact 0.4.0 server outside your project, verifies its MCP handshake, and previews a Cursor user-scope entry before applying it. npm's current release is 0.4.1; the server stays pinned to 0.4.0 here because that is the exact version covered by the runtime measurements in the installation guide.

SETUP_DIR="$(mktemp -d)"
curl -fsSL https://registry.npmjs.org/frontier-mcp/-/frontier-mcp-0.4.1.tgz \
  -o "$SETUP_DIR/frontier-mcp-0.4.1.tgz"
tar -xzf "$SETUP_DIR/frontier-mcp-0.4.1.tgz" -C "$SETUP_DIR" \
  package/scripts/frontier-setup.cjs
node "$SETUP_DIR/package/scripts/frontier-setup.cjs" --version 0.4.0 --apply

It may run from a project pinned to Node 16; project runtime markers are evaluated later from the client's working directory when the saved launcher starts. Omit --apply for a preview. For a manual Cursor entry instead:

{
  "mcpServers": {
    "another-server": {
      "command": "/absolute/path/to/another-server"
    },
    "frontier": {
      "command": "npx",
      "args": ["-y", "frontier-mcp@0.4.0"]
    }
  }
}

Restart Cursor after saving. The pin is the version you get; updates remain manual.

The installation guide covers Node 16 projects, a PowerShell bootstrap, runtime managers, absolute desktop paths, Bun 0.4.0 support, Deno's Node fallback, other clients, updates, recovery, and removal.

First use in a repository

  1. Open the repository in your editor. FrontierMCP resolves the workspace from the session working directory — walking upward to the nearest .scratch/, or .git in either form — so opening the project is the only setup step. A git worktree is its own workspace: it carries .git as a file, and it is served instead of the repository it was made from.

  2. Read the tracker configuration document once: fetch MCP resource frontier://tracker-doc, or read docs/agents/issue-tracker.md in a repo that vendors it.

  3. Call list_efforts to see whether .scratch/ exists yet.

  4. Call get_board on an Effort to see the Frontier, then get_tickets only for the ids you work.

A repository with no .scratch/ directory is not an error. Create the first Effort with create_tickets, edit_map, or spec and create: true.

Override the workspace

Optional, per call or per session:

  • Pass root on any tool call to read another directory.

  • Set FRONTIER_ROOT in the server environment for a non-standard layout.

The working directory is the one your client launched the server in, and it is fixed for the session. Moving to another worktree mid-session does not retarget it — use root, FRONTIER_ROOT, or restart the server.

Tools

Eight tools: list_efforts, get_board, get_tickets, create_tickets, update_ticket, edit_map, spec, migrate_effort. See the tracker configuration document for when to use each.

Development

pnpm install
pnpm test
pnpm run check
pnpm run build
pnpm run test:runtime
FRONTIER_NODE16=/path/to/node16 FRONTIER_NODE24=/path/to/node24 pnpm run test:setup
node src/bin.ts

Releasing

Publishing is CI-only via release-it. There is no local publish script, and adding one would mean minting the long-lived npm token that the CI setup exists to avoid.

  1. Merge the work you want to ship to master.

  2. On GitHub: Actions → Release → Run workflow, pick auto / patch / minor / major. auto is the default and derives the bump from the conventional commits since the last release — feat: gives a minor, fix: a patch. Pick an explicit one to override it. If nothing since the last tag is releasable, auto exits green having shipped nothing, so confirm a new tag appeared.

  3. The workflow runs checks + tests, bumps package.json, updates CHANGELOG.md, tags v*, creates a GitHub Release, and publishes to npm with pnpm.

  4. Replace the current frontier-mcp@0.4.0 pin in your user MCP config with the exact version you released when you want the new build — pins stay manual on purpose.

The workflow is dispatchable from any branch but refuses to run off master: release-it commits, tags and pushes as part of the run, so a release from a feature branch would rewrite that branch.

Local dry-run (no tag, no publish). It needs a clean working tree and an upstream branch, so commit first:

pnpm run release:dry

npm publishing uses Trusted Publishing — GitHub Actions OIDC, configured for this repo on npmjs.com, so there is no NPM_TOKEN to rotate.

Before changing .release-it.json or the workflow, read the release-it bullet in AGENTS.md Work Guidance. Several settings there look removable and are not — the absent registry-url, npm.skipChecks, npm.publishArgs, and the pnpm 10 pin each exist for a reason recorded in one place so it cannot drift.

License

MIT — see LICENSE.

Available Tools

8 tools
create_ticketsCreate TicketsA

Publish a whole breakdown in one call. Edges may name a sibling by a temporary key you choose; the server mints repo-unique ids, numbers the files, and resolves the keys atomically — a partial failure creates nothing. Cycles are refused. An unknown Effort needs create.

ParametersJSON Schema
NameRequiredDescriptionDefault
rootNoWorkspace directory. Defaults to the session workspace.
createNoStart the Effort if the workspace does not hold it. Otherwise an unknown slug fails.
effortYesEffort slug to create them in.
ticketsYesThe whole set, in the order they should be numbered.

TDQS

A4.4/5.0
Behavior5/5

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

Adds substantial context beyond annotations: atomic all-or-nothing ('a partial failure creates nothing'), repo-unique id minting, file numbering, key resolution, cycle refusal, and the create flag requirement. These are non-obvious, decision-relevant behaviors an agent cannot infer from the schema or annotations.

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

Conciseness5/5

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

Two dense sentences with no filler; the purpose is front-loaded, and every clause adds behavioral or parameter insight, from atomicity to cycle refusal.

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

Completeness4/5

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

For a bulk-create tool with dependencies and an all-or-nothing guarantee, the description covers failure semantics, key resolution, effort handling, and ordering. A small gap is the lack of any statement about return values; however, there is no output schema, and the core invocation behavior is fully specified.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description enriches parameter meaning by explaining that 'key' is a temporary, never-stored name, that 'blocked_by' can reference such keys, and that ticket order controls numbering. This connects the schema fields to the atomic key-resolution behavior.

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

Purpose5/5

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

Description states a specific verb and resource: 'Publish a whole breakdown in one call' – creating a set of tickets in an Effort atomically. The behaviors described (minting ids, numbering files, resolving keys) clearly differentiate it from siblings like update_ticket or get_tickets.

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

Usage Guidelines3/5

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

The description implies this is the bulk-creation tool ('whole breakdown in one call'), but it does not explicitly state when to prefer it over update_ticket for single changes or how it relates to the other siblings. It does give one concrete conditional: an unknown Effort requires the create flag.

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

edit_mapEdit MapA
Destructive

Read a Map's Destination and Notes, or edit one typed section — set Destination or Notes, add or graduate a fog patch, rule something out of scope — without rewriting the others. Decisions-so-far is generated from resolved Tickets and never accepted as input. Mutations pass expected_revision from a prior read so concurrent sessions cannot clobber each other.

ParametersJSON Schema
NameRequiredDescriptionDefault
rootNoWorkspace directory. Defaults to the session workspace.
notesNoReplace the Notes section.
createNoStart a missing Effort and its Map. Only for Effort/Map that do not exist yet — not a flag to send on every call. Does not change revision rules for mutations on an existing Map; create with no section fields reads an existing Map like a plain read.
effortYesEffort slug whose Map to read or edit.
add_fogNoAppend a fog patch under Not yet specified.
rule_outNoAppend a hand-ruled item under Out of scope. Never touches Decisions-so-far.
destinationNoReplace the Destination section.
graduate_fogNoRemove a fog patch matched on its text. Fails when none match.
expected_revisionNoRevision from a prior edit_map read. Required when overwriting an existing Map; omitted when creating one.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already mark this as destructive and non-idempotent; the description adds genuinely useful behavior beyond that: expected_revision provides optimistic concurrency so concurrent sessions cannot clobber each other, and Decisions-so-far is always derived from Tickets rather than accepted as input. This meaningfully discloses important side effects and invariants.

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

Conciseness5/5

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

The description is three tight sentences with no filler: the first front-loads the read/edit capability and operation types, the second states a key invariant, and the third explains the revision requirement. Every sentence earns its place.

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

Completeness4/5

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

For a nine-parameter tool with full schema descriptions and no output schema, the description covers the essential context: partial edits, the Decisions-so-far invariant, and the expected_revision concurrency mechanism. It could slightly expand on what a read response contains, but 'Read a Map's Destination and Notes' plus the revision requirement gives the agent enough to invoke it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline baseline is 3. The description adds extra meaning by explaining the concurrency role of expected_revision and by explicitly stating that Decisions-so-far is never accepted as input, which helps the agent understand an important non-obvious constraint not encoded in the schema.

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

Purpose5/5

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

The description names a specific resource ('Map') and a specific verb set ('Read ... or edit one typed section'), then lists concrete operations: set Destination or Notes, add/graduate a fog patch, rule out of scope. This clearly differentiates edit_map from sibling ticket-centric tools like create_tickets and update_ticket.

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

Usage Guidelines4/5

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

The description gives clear context: use it to read the Map's sections or make a single typed edit without rewriting the others, and never to supply Decisions-so-far. It does not explicitly name alternative sibling tools or say when not to use it, but the edit-versus-read framing and mutation constraints provide solid usage guidance.

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

get_boardGet BoardA
Read-only

An Effort's Destination, then one line per Ticket — id, title, kind, status, Edges — with the Frontier marked. Never returns bodies; fetch those with get_tickets.

ParametersJSON Schema
NameRequiredDescriptionDefault
rootNoWorkspace directory. Defaults to the session workspace.
effortYesEffort slug, as reported by list_efforts.

TDQS

A4.2/5.0
Behavior4/5

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

The description adds meaningful behavioral detail beyond the readOnlyHint: the output is intentionally limited to one line per ticket and never includes bodies, which is important scoping context. No contradiction with the annotations, and read-only behavior is already covered.

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

Conciseness5/5

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

Two compact sentences with no filler: the core output shape is up front and the bodies caveat arrives immediately afterward. Every phrase earns its place.

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

Completeness4/5

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

Given the read-only annotation, 100% schema coverage, and simple required parameter (effort), the description tells an agent what it will get and explicitly what it will not get. It doesn't elaborate on 'Destination' semantics, but the sibling set and schema cover the remaining calling context.

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

Parameters3/5

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

Schema description coverage is 100%, so the params (root and effort) are already documented. The description clarifies output behavior but does not add new meaning to the parameters themselves; baseline 3 is appropriate.

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

Purpose5/5

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

The description states the resource ('An Effort's Destination') and the exact output shape (one line per Ticket with id, title, kind, status, Edges; Frontier marked). It also distinguishes itself from get_tickets by explicitly noting it never returns bodies, so an agent can select it correctly.

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

Usage Guidelines4/5

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

The description gives clear context: it returns board-style summaries for an effort and explicitly directs body-fetching to get_tickets. It does not enumerate all alternatives (e.g., list_efforts, edit_map), so it stops short of full when/when-not guidance.

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

get_ticketsGet TicketsA
Read-only

Full bodies for a list of Ticket ids, in one call. Use after get_board, only for the Tickets you actually work.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesTicket ids, e.g. ["T12","T14"], resolved repo-wide. A Legacy Ticket with no id is fetched by the <effort>#<order> handle its Board line shows.
rootNoWorkspace directory. Defaults to the session workspace.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is known. The description adds useful context about batching ('in one call') and about resolving legacy ticket handles, but it does not disclose failure behavior or limits when invalid ids are passed.

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

Conciseness5/5

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

Two short sentences with no filler. The most important scoping instruction is front-loaded and every sentence earns its place.

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

Completeness4/5

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

For a simple read-only batch-fetch tool with a complete parameter schema and safety annotations, the description is adequate. It lacks an explicit output shape description, but no output schema exists and the tool is simple enough that this is a minor gap.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema fully documents ids and root. The description's phrase 'Full bodies' hints at return semantics rather than adding new parameter meaning, so it meets but does not exceed the baseline.

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

Purpose5/5

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

The description states a specific verb and resource: 'Full bodies for a list of Ticket ids, in one call'. It clearly distinguishes this from the sibling get_board by framing get_tickets as the detail-fetch step after board listing.

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

Usage Guidelines4/5

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

The description gives explicit sequencing ('Use after get_board') and call-scoping guidance ('only for the Tickets you actually work'). It does not name alternatives like update_ticket or create_tickets, but the primary routing decision is clear.

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

list_effortsList EffortsA
Read-only

List the Efforts in a repo, each with its Ticket count and which header docs it holds.

ParametersJSON Schema
NameRequiredDescriptionDefault
rootNoWorkspace directory. Defaults to $FRONTIER_ROOT, then the session working directory.

TDQS

A4.1/5.0
Behavior4/5

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

The readOnlyHint annotation already establishes the safety profile, and the description adds useful behavioral context by specifying what the result contains: each Effort's ticket count and header docs. For a simple read-only tool with no output schema, this is meaningful disclosure beyond the annotation.

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

Conciseness5/5

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

One compact sentence states the operation, scope, and key output fields with no filler. The most important information is front-loaded, and every element earns its place.

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

Completeness5/5

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

For a low-complexity, read-only tool with a single optional parameter, this description is complete: it says what the tool returns and where it operates. Since there is no output schema, covering the essential return values in the description is sufficient.

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

Parameters3/5

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

Schema coverage is 100%, and the single optional 'root' parameter is already described in the schema. The description's mention of 'repo' loosely reinforces that root points at the workspace directory, but it adds no substantial parameter-level meaning. Baseline 3 applies.

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

Purpose5/5

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

The description names a specific verb ('List'), resource ('Efforts'), scope ('in a repo'), and the returned information ('Ticket count' and 'header docs'). This clearly distinguishes it from siblings like get_tickets or get_board, which focus on different resources or views.

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

Usage Guidelines3/5

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

The intended use is implied: call this when you need a high-level list of Efforts with their ticket counts and header-doc ownership. However, it never explicitly names alternatives or states when not to use it, so the guidance is limited to what the purpose statement already conveys.

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

migrate_effortMigrate EffortA
Destructive

Normalize Legacy Tickets in an Effort: schema frontmatter, preserve existing ids, mint ids for Tickets that have none, turn prose Edges into blocked_by. Preview writes nothing. Filename rewriting is opt-in. Unrecognized files in the Effort directory are ignored.

ParametersJSON Schema
NameRequiredDescriptionDefault
rootNoWorkspace directory. Defaults to the session workspace.
effortYesEffort slug whose Legacy Tickets to normalize.
renameNoRename files to <NN>-T<n>-<slug>.md. Off by default so relative links keep resolving.
previewNoReport every change and write nothing. Defaults to false.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already indicate destructiveHint=true and readOnlyHint=false, and the description adds valuable context: preview writes nothing, filename rewriting is opt-in with a link-preservation rationale, unrecognized files are ignored, and id/edge handling rules are spelled out. This goes well beyond the annotation flags without contradicting them.

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

Conciseness5/5

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

Four tight sentences front-load the core purpose, then highlight the two safety/decision-critical behaviors (preview, rename opt-in), and close with a clear boundary for unrecognized files. No redundant wording or unnecessary detail.

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

Completeness4/5

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

Despite having no output schema, the description sufficiently covers what the tool does, the safe preview mode, the opt-in rename behavior, and the handling of unrecognized files. The destructive nature is carried by the annotation and reinforced by the preview note. Minor omissions like return format or transactional guarantees are acceptable given the simple required-parameter surface and strong schema coverage.

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

Parameters3/5

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

The input schema documents all four parameters at 100% coverage, including defaults and behavioral implications (e.g., rename off by default, preview defaults to false). The description reinforces the rename and preview behaviors but adds only marginal meaning beyond the schema. With such high schema coverage, a baseline of 3 is appropriate.

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

Purpose5/5

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

The description opens with a specific verb ('Normalize') and resource ('Legacy Tickets in an Effort'), then lists concrete transformations: schema frontmatter, id preservation/minting, and prose-edge conversion. This clearly differentiates it from sibling CRUD tools like create_tickets or update_ticket, which operate on new or existing ticket state rather than legacy format migration.

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

Usage Guidelines4/5

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

The purpose statement makes it obvious when to use this tool—when there are legacy tickets in an Effort that need normalization. It also highlights that preview mode writes nothing, giving a clear safe-usage path. It doesn't explicitly name alternatives or state when not to use it, but since no sibling offers migration functionality, the usage context is unambiguous.

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

specSpecA
Destructive

Get or put a Spec as a whole opaque document (conventionally with YAML frontmatter). Nothing edits a Spec section by section — an Effort may hold both a Map and a Spec. Puts pass expected_revision from a prior read so concurrent sessions cannot clobber each other.

ParametersJSON Schema
NameRequiredDescriptionDefault
rootNoWorkspace directory. Defaults to the session workspace.
createNoStart the Effort and its Spec if neither exists. Otherwise an unknown slug fails.
effortYesEffort slug whose Spec to get or put.
contentNoWhen set, replace the Spec wholesale (conventionally a document with YAML frontmatter). When omitted, return the current document.
expected_revisionNoRevision from a prior spec read. Required when overwriting an existing Spec; omitted when creating one.

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the destructiveHint annotation, the description discloses meaningful behavior: the Spec is an opaque whole document, section-by-section editing is not possible, and Puts require expected_revision from a prior read to prevent concurrent clobbering. This is substantial behavioral context, not a restatement of annotations.

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

Conciseness5/5

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

Three dense sentences, front-loaded with the core action, and every sentence earns its place. The YAML frontmatter note, the Map contrast, and the concurrency protection are all useful and non-redundant.

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

Completeness4/5

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

With all parameters documented in the schema, the description covers the main behavioral nuances: whole-document semantics, no section editing, and revision-based concurrency. Since there is no output schema, a note on the exact return shape for a get (document plus revision) would make it fully complete, but the current definition is sufficient for correct invocation.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds value by explaining that the document is opaque, conventionally YAML frontmatter, and that expected_revision comes from a prior read to enable concurrency safety. This deepens meaning beyond the schema without needing to repeat parameter details.

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

Purpose5/5

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

Clear and specific: “Get or put a Spec as a whole opaque document” names the resource, the action, and the granularity. The line “an Effort may hold both a Map and a Spec” helps distinguish it from sibling tools like edit_map.

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

Usage Guidelines4/5

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

The description clearly implies when to use the tool: whole-document Spec reads/writes, with “Nothing edits a Spec section by section” ruling out section-level edits. It does not explicitly name an alternative tool like edit_map, but the Map/Spec contrast gives enough routing context.

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

update_ticketUpdate TicketA
Destructive

Change one Ticket. Lifecycle: claim, resolve with a one-line gist, drop with a reason, reopen with a reason, or release a claim — at most one of those per call. Graph: replace the Edges, refused if they close a cycle. Identity: title, kind, and type. Annotations: triage role, a comment, ticking acceptance criteria; these touch no part of the graph. Any of the four groups may accompany the others or stand alone.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTicket id, or the <effort>#<order> handle of a Legacy Ticket.
dropNoClose the Ticket as work ruled out of scope.
kindNoReplace the Ticket kind.
rootNoWorkspace directory. Defaults to the session workspace.
tickNoAcceptance criteria to check off, matched on their text. Wrapped criteria match both as get_tickets returns them and re-joined onto one line. All references resolve before anything is written — one unmatched name fails the whole call and leaves the file untouched.
typeNoReplace the decision type — research, prototype, grilling, or task.
claimNoTake the Ticket. Fails if another holder already has it.
titleNoReplace the Ticket title.
reopenNoReturn a resolved or dropped Ticket to open.
statusNoNot settable directly — use claim, resolve, drop, reopen, or release. Named here to say so.
triageNoSet the triage role. A separate field from status; neither touches the other.
commentNoAppend to the comment log, stored exactly as written.
releaseNoRelease the claim on a claimed Ticket and return it to open. Pass { release: true }.
resolveNoClose the Ticket as a step on the route.
blocked_byNoReplace the Edges outright, each a plain Ticket id resolved repo-wide. An empty list clears them. A cycle is refused.

TDQS

A4.2/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true, and the description adds substantial behavior: 'at most one' lifecycle change per call, graph replacements refused on cycles, annotations touching no part of the graph, and transactional reference resolution ('leaves the file untouched'). It fully discloses atomicity and failure semantics.

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

Conciseness5/5

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

The description is dense yet well-structured, front-loaded with the core action and then organized by change group. No sentence is wasted; each adds a distinct constraint or clarification.

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

Completeness4/5

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

Given the high complexity (15 params, nested objects, no output schema), the description covers the major behavioral constraints and failure modes well, including atomicity and cycle refusal. Minor gaps remain: no explicit note about return values or atomicity when multiple non-reference validation failures occur, but the description is still remarkably complete.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds meaningful interaction context: status is 'not settable directly', blocked_by replacement behavior with cycle refusal, tick matching rules, and grouping of parameters into coherent semantic groups. This goes beyond the schema's individual parameter descriptions.

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

Purpose5/5

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

The description opens with 'Change one Ticket,' a specific verb and resource, then enumerates the four distinct change groups: lifecycle, graph, identity, and annotations. This clearly differentiates it from siblings like create_tickets (creation) and edit_map (map-level editing).

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

Usage Guidelines2/5

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

The description provides no when-to-use guidance against alternatives. It never mentions create_tickets for new tickets or edit_map for graph-wide changes, and it gives no exclusions or prerequisites. The usage context is only implied by the phrase 'Change one Ticket.'

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

Tool Schema Changelog

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

  1. 8 tool updatesv0.4.1
    • Changedcreate_tickets1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changededit_map1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_board1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_tickets1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_efforts1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmigrate_effort1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedspec1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedupdate_ticket7 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / kind
        Added value: +{
        +  "description": "Replace the Ticket kind.",
        +  "enum": [
        +    "build",
        +    "decision"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / release
        Added value: +{
        +  "const": true,
        +  "description": "Release the claim on a claimed Ticket and return it to open. Pass { release: true }.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / reopen
        Added value: +{
        +  "description": "Return a resolved or dropped Ticket to open.",
        +  "properties": {
        +    "reason": {
        +      "description": "Why it is being reopened.",
        +      "minLength": 1,
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "reason"
        +  ],
        +  "type": "object"
        +}
      • changedInput schema / properties / status / description
        Previous value: -"Not settable directly — use claim, resolve, or drop. Named here to say so."New value: +"Not settable directly — use claim, resolve, drop, reopen, or release. Named here to say so."
      • addedInput schema / properties / title
        Added value: +{
        +  "description": "Replace the Ticket title.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / type
        Added value: +{
        +  "description": "Replace the decision type — research, prototype, grilling, or task.",
        +  "minLength": 1,
        +  "type": "string"
        +}
  2. 2 tool updatesv0.2.1
    • Changededit_map1 field changed
      • changedInput schema / properties / create / description
        Previous value: -"Start the Effort and its Map if neither exists. Otherwise an unknown slug fails."New value: +"Start a missing Effort and its Map. Only for Effort/Map that do not exist yet — not a flag to send on every call. Does not change revision rules for mutations on an existing Map; create with no section fields reads an existing Map like a plain read."
    • Changedupdate_ticket1 field changed
      • changedInput schema / properties / tick / description
        Previous value: -"Acceptance criteria to check off, matched on their text."New value: +"Acceptance criteria to check off, matched on their text. Wrapped criteria match both as get_tickets returns them and re-joined onto one line. All references resolve before anything is written — one unmatched name fails the whole call and leaves the file untouched."
  3. 8 tool updatesv0.1.0
    • First observedcreate_tickets
    • First observededit_map
    • First observedget_board
    • First observedget_tickets
    • First observedlist_efforts
    • First observedmigrate_effort
    • First observedspec
    • First observedupdate_ticket

TDQS

A4.3/5.0

Scored across 8 tools

Disambiguation5/5

Each tool targets a distinct resource or action: get_tickets fetches bodies, get_board provides an overview, create_tickets does batch creation, update_ticket handles single modifications, edit_map and spec manage different document types, and migrate_effort is a utility for normalization. No two tools have overlapping purposes.

Naming Consistency4/5

Most tools follow a consistent verb_noun snake_case pattern (get_tickets, list_efforts, create_tickets, update_ticket, edit_map, migrate_effort). The lone exception is 'spec', which uses a bare noun instead of a verb, creating a minor inconsistency but remaining clear and predictable.

Tool Count5/5

With 8 tools, the server is well-scoped for its purpose of managing efforts, tickets, maps, and specs. Each tool serves a distinct function without redundancy, and the count is squarely within the optimal 3-15 range.

Completeness4/5

The core ticket lifecycle is covered (batch create, single update, read via board and bodies), along with map and spec editing and migration. The main gap is the lack of a delete or archive tool for tickets, and there is no explicit create_effort tool, though create_tickets references needing one. These are minor gaps given the planning-centric focus.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides an MCP server for scraping and retrieving data from GitHub Projects, including issues, pull requests, and organizational metadata. It enables natural language interaction with project boards and repository contents using GitHub Personal Access Tokens.
    1
    -
  • A
    license
    A
    quality
    D
    maintenance
    An MCP server that transforms markdown notes into an AI-powered knowledge graph. It enables LLM clients to explore, analyze, and diagnose knowledge graphs through tools for node explanation, path finding, causal chain analysis, and wiki health reporting.
    5
    MIT