FronyBoard
FronyBoard is an MCP-based project tracker that lets an agent register projects and manage their roadmaps, quarterly periods, and task workflow through validated tool calls.
Register and manage projects: create a project with a task-id prefix (
create_project), rename/re-describe/pause/archive it (update_project), and list all projects with summaries (list_projects).Plan the roadmap: write yearly overviews with goal/now/target/checklist (
set_overview), tick checklist items (set_check), and set quarterly milestones (upsert_milestone); read it all back withget_roadmap.Run periods: open any quarter (
open_period, or implicitly viacreate_task), close a quarter with a retrospective (close_period), and read past retrospectives (get_retrospective).Track tasks: create tasks with titles, one-line
contentnotes, tags, anddepends_onlinks (create_task); edit fields and branch (update_task); and move status through todo/in_progress/done/blocked/cancelled with proof-of-donecheckor cancellationreason(transition_task).Query and resume: get a full project snapshot with open tasks and recent completions (
get_status), list tasks by period/status/tags/recency (list_tasks), fetch a single task (get_task), and search text across all projects (search_tasks).Audit and validate: review recent mutations and callers (
recent_activity), and check stored data against the schema and rules (validate).Get guidance: read the full usage guide as Markdown (
help).
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@FronyBoardList tasks for project DLY that are blocked."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
FronyBoard
An MCP server that gives AI agents (Claude Code and friends) a first-class project tracker.
Where Jira is an issue tracker for humans behind a web UI, FronyBoard replaces each part with something an agent can use natively:
Jira | FronyBoard |
Database | One SQLite file in a dedicated data directory |
Records | JSON documents (roadmap, period) + Markdown |
API | MCP tools |
Workflow engine | Schema + rule validation, run as a gate before every write |
State transition | An MCP tool call ( |
The schema and operating rules were extracted from a real product's management system (31 tasks shipped through it), then generalized.
Install
Requires uv. One line registers FronyBoard in Claude Code;
uvx fetches the package from PyPI on first use and caches it:
claude mcp add FronyBoard -- uvx fronyboardAny MCP client that can launch a stdio command works the same way — the command is
uvx fronyboard. It is also listed in the
MCP Registry as io.github.Cafelatte1/fronyboard.
From a clone, point at the checkout instead (this needs git):
git clone https://github.com/Cafelatte1/fronyboard
claude mcp add FronyBoard -- uv run --directory <path-to-clone>\backend fronyboardThis is the local (stdio) mode: the client starts the server as a child process and
talks to it over a pipe. No HTTP, no network, no credentials — web.py and
fauth.py are never called. Data is written to %LOCALAPPDATA%\Frony\FronyBoard\data
(~/.Frony/FronyBoard/data where LOCALAPPDATA is unset); set AIRA_DATA_DIR to
relocate it. Logs (JSON Lines, one line per MCP tool call plus server events) go to
the sibling logs folder — FRONYBOARD_LOG_DIR overrides.
To share one FronyBoard between several machines, or to use it from the Claude and ChatGPT apps, run it as an HTTP server instead — see docs/self-hosting.md.
Related MCP server: Knowledge Base MCP Server
Project setup
Connecting the MCP server gives every session the tools and the general workflow
(delivered as server instructions). What it cannot know is which FronyBoard project
a codebase belongs to — declare that in the codebase itself by adding this section
to its CLAUDE.md (create the file if the project has none):
## FronyBoard
This project is tracked by FronyBoard (project key: DLY).
Manage tasks through the FronyBoard MCP tools, following the FronyBoard server instructions.Replace DLY with the project's key (register one first with create_project).
The section is also the opt-in signal: a codebase without it is treated as not
FronyBoard-managed.
Model
fronyboard.db
├── projects one row per project (key e.g. DLY): the roadmap record —
│ yearly overview (goal / now / target / checklist) + quarterly milestones
└── periods one row per opened period (e.g. 2026Q3): tasks ({KEY}-001, ...)
+ `result` (retrospective, written when the period closes)A project is two kinds of records — the roadmap, and one record per period. Both are
JSON documents; the schema and the rules that guard it are in
backend/src/fronyboard/validation.py.
Task ids are a project-global sequence (
DLY-042) — they keep counting across periods and are never reused. They are the only link between FronyBoard and a codebase: use them in branch names (feat/DLY-042/short-desc) and record the branch on the task.A task is a title (v0.33.0, AIR-086) plus status, tags,
depends_on, branch and two one-line notes of at most 300 characters each. Agents read titles and status; the 25-line body nobody read, and the month/week slots that only existed to schedule it, are gone. Time ismeta.completed_at.The two notes answer different questions at different moments (v0.38.0, AIR-090).
contentis written at create time and says why the task exists — the pressure behind it, or the scope deliberately left out. The approach chosen is not part of it (AIR-092): agents wrote it here and again in the commit, so it lives in the commit only.checkis required bytransition_task(status="done")and says what proves it done — the command and its output, or an observable a reader can go and see. One free note asked before the work can only restate the plan: in a 12-session benchmark every task an agent wrote paraphrased its own title, because the note was fixed at create time andupdate_taskwas never called. Reopening a task drops itscheck; nothing is proven any more.Reference chain:
period → roadmap milestone(the quarter). That is the only one, and the milestone is optional (v0.40.0, AIR-095): a period without one is valid, and its tasks are checked like any other's.Statuses — milestones:
planned | active | done; tasks:todo | in_progress | done | blocked | cancelled.cancelledis the soft delete — there is no hard delete. Cancelling requires a reason, keeps the record (and its id) forever, and hides the task from queries by default (list_taskstakesinclude_cancelled).blocked= may resume,cancelled= will not happen; transitioning a cancelled task restores it.Carry-over: a task that outlives its period is not moved — recreate it in the next period under a new id and note the mapping in the closing retrospective.
get_statusis the whole resume — the overview, each period's open tasks, andrecent_done: the ten most recently finished tasks with theircontent, theircheckand when they completed. What is already built is what a cold session needs most, and nobody makes a second call to find it (AIR-090). It is still a record of claims: the board says what an agent reported, the code is the evidence.depends_onon a task lists the earlier tasks it builds on (other projects allowed). It points backwards only — there is no forward index, because storing one direction and deriving the other read as inverted often enough to be worth dropping (v0.36.0, AIR-089). The field wasfollowsuntil v0.37.0; the boot migration renames it. It is a pointer, not a lock:list_tasksandget_statusflag the entries not yet done aswaiting_on, and nothing is ever blocked.Timestamps (
meta.created_at/updated_at/started_at/completed_at) are stamped by the server in naive UTC —started_aton the firstin_progresstransition,completed_atondone(and removed again if the task leavesdone). Agents never write them.The
resultfield closes a period — the rest of the file holds only current state, so the "why it turned out this way" lives there: judgment and reasons, not counts. Its presence is what marks a period closed.
Tools
Area | Tools |
Projects |
|
Roadmap |
|
Periods |
|
Planning |
|
Queries |
|
Guide |
|
update_task and transition_task derive the project from the task id prefix
(DLY-042 → DLY), so their key parameter is optional. Re-calling
close_period on a closed period rewrites its retrospective.
Typical flow:
create_project
→ create_task (opens the current quarter)
→ transition_task in_progress (with branch) → ... → transition_task done
→ close_period (retrospective)Planning is optional, not a prerequisite. create_task opens the current quarter by
itself (in FRONYBOARD_TZ, else the server's zone); open_period opens any other
quarter, with or without a milestone. set_overview and upsert_milestone add the
year's and the quarter's goals whenever there are some. A milestone added to an open
quarter starts active; closing the quarter marks it done.
Every mutation is validated before anything is written; invalid changes are rejected
with the full error list. close_period refuses while tasks are still todo or
in_progress. Writes are serialized per project, so concurrent clients cannot
collide on ids or lose updates.
Self-hosting
The same package also runs as an always-on HTTP server (fronyboard serve): MCP over
streamable HTTP for every machine on your network, a read-only web dashboard for
humans, API keys per device, and OAuth for the hosted Claude / ChatGPT apps.
Authentication is delegated to FronyAuth,
a separate service. None of it is needed for the stdio install above.
To see the dashboard on your own machine without any of that, run fronyboard serve --local
(loopback only, no login) and open http://127.0.0.1:8642.
docs/self-hosting.md covers the setup;
docs/operations.md is the day-2 runbook.
Development
uv run --directory backend pytest # backend
cd frontend; npm test # dashboardThe repo is a monorepo. backend/src/fronyboard/ — store.py (SQLite, data root),
validation.py (schema gate), service.py (operations), auth.py (bearer
middleware) + fauth.py (FronyAuth client), log.py, web.py (JSON API + static
serving), server.py (MCP tool surface + CLI). frontend/ — the dashboard (React +
Vite), built to static files that the backend serves; its build output
frontend/dist is committed so a server needs no Node toolchain.
The three docs under docs/ cover what the code cannot tell you — running this on your own machines:
docs/self-hosting.md — running FronyBoard as a shared server: clients, dashboard, hosted apps, deploy
docs/operations.md — home server runbook
Available Tools
20 toolsclose_periodA
Use it when a quarter's work is over and the user wants it closed with a retrospective.
Close a period (YYYYQn) and record its retrospective — call when its work is over.
Refuses while any task is still todo or in_progress. Stores `result_markdown` as the
period's `result` and marks its milestone, if it has one, done.
The retrospective is written in the user's language, stays under ~30 lines and holds
judgment and reasons only — summary vs goal, what landed and what did not, carried-over tasks
(old id -> new id), lessons.
Calling it again on a closed period rewrites the retrospective and changes nothing else.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| period | Yes | ||
| result_markdown | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so: precondition (no todo/in_progress tasks), side effects (stores result_markdown as the period's result, marks the milestone done), and re-invocation semantics ('rewrites the retrospective and changes nothing else'). Idempotency and mutation scope are both disclosed, which is unusual and valuable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the trigger, then precondition, then effects, then re-call behavior — the ordering is sensible. The first and second paragraphs restate the same 'quarter's work is over' idea, a small redundancy that could be merged.
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?
No output schema and no annotations, so the description has to be self-sufficient, and it nearly is: preconditions, side effects, and idempotency are all present. It leaves the `key` argument and any indication of what the call returns undefined, which an agent may need for an unfamiliar mutation 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 0%, so the description must compensate. It explains period's YYYYQn format, and constrains result_markdown's language, length (~30 lines), and content (summary vs goal, lessons, carried-over task old id -> new id), including where it is stored. The `key` parameter is left entirely undefined, which keeps it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource plus the key artifact it produces: 'Close a period (YYYYQn) and record its retrospective.' The period-key format and retrospective recording make it unmistakably distinct from sibling open_period and from get_retrospective.
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?
Gives a clear triggering condition ('when a quarter's work is over and the user wants it closed with a retrospective') and an explicit refusal condition ('refuses while any task is still todo or in_progress'). It never names open_period as the counterpart to use when the period isn't ready to close, so the routing back to alternatives is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_projectA
Use it when the user wants a codebase tracked here (register a project, set up a board).
Register a new project — once per codebase, before any planning happens.
`key` is the task-id prefix (2-5 uppercase letters, e.g. DLY); `description` is one
line saying what the project is, in the user's language (shown on the dashboard cards);
`repo` is where its code lives (owner/name or a URL). Status starts as active.
A fresh project takes tasks at once: create_task opens the current quarter. The plan
(set_overview, upsert_milestone) is optional and written with the user.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| name | No | ||
| repo | No | ||
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden; it does disclose useful state facts (status starts as active, the project accepts tasks immediately, create_task opens the current quarter). It omits duplicate-key behavior, required permissions, and whether `key` is immutable — meaningful gaps for a create operation.
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?
Front-loaded with the trigger sentence, then the operation, then per-parameter notes — good ordering with no filler sentences. The closing paragraph on optional planning is mildly tangential but earns its place by preventing premature set_overview/upsert_milestone calls.
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?
No output schema and no annotations, so the description is the only source of truth; it covers behavior and most parameters but leaves `name` unexplained (unclear how it differs from `description`) and says nothing about what is returned or what happens on a key collision.
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 0%, so the description must compensate, and it does for three of four parameters: `key` gets format rules and an example (2-5 uppercase letters, DLY), `description` gets length, language, and where it renders, and `repo` gets accepted formats (owner/name or URL). Only `name` is left entirely undefined.
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?
States a specific verb and resource ('Register a new project') plus a scope qualifier ('once per codebase, before any planning happens') that separates it from update_project and list_projects. An agent can identify the operation and its one-shot nature without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with an explicit trigger ('Use it when the user wants a codebase tracked here') and adds a strong constraint ('once per codebase, before any planning happens') that implies when not to call it. It also names the follow-on siblings (create_task, set_overview, upsert_milestone), but never says what to do if the project already exists (e.g., route to update_project).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_taskA
Use it when you start a piece of work or the user asks to add one (add a task, new to-do).
Create a task — one issue/branch-sized unit of work — with status todo.
The id is assigned from the project-global sequence and never reused. `period` is
YYYYQn: the current quarter (in the server's time zone) opens by itself if it is not
open yet, and the answer then carries `opened`; any other quarter must already be open
(open_period). Nothing else — no overview, no milestone — has to exist first.
`title` is a short English imperative ("Add multi-select status filter") — it is what
every reader sees, so it has to say the whole thing.
`content` is optional: one line, at most 300 characters, English. It answers **why this
task exists** — the pressure that made it necessary, or the scope you deliberately left
out. It is written now, before the work, so it cannot describe the approach or the
result: the approach you choose, and why, goes in the commit; what proves the work done
is `check`, which transition_task takes when you finish. Do not restate the title here:
a note that only rephrases it tells the next agent nothing. Line breaks are folded into
spaces; a longer text is rejected, not cut.
`tags` are free-form labels ("frontend", "bug", "infra"): up to 8 per task, 24
characters each, no commas. Reuse the wording already in use on the project
(list_tasks shows it) instead of coining a new spelling for the same thing.
`depends_on` lists the task ids this one builds on — the *earlier* work whose result it
needs, or the task that handed it this scope. Full ids, other projects allowed. It
points backwards only: there is no forward list, so a task never has to be updated
because a later one appeared. It is a pointer, not a lock — nothing is blocked, and
`list_tasks` / `get_status` merely flag the entries not yet done as `waiting_on`.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| tags | No | ||
| title | Yes | ||
| period | Yes | ||
| content | No | ||
| depends_on | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and discloses important behavior: ids are project-global and never reused, the current quarter opens automatically and returns `opened`, other quarters must already be open, and depends_on is a pointer rather than a lock. It does not describe permissions/auth requirements or the full response shape, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loads purpose and usage, then organizes parameter semantics into clear paragraphs. Most sentences earn their place by adding constraints or routing guidance, though some of the content/title prose is more verbose than strictly necessary.
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 annotations, no output schema, and 0% schema coverage, the description is largely complete: it explains creation scope, side effects, period handling, and most parameter semantics. The missing `key` semantics and incomplete return-value detail keep it from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does richly for period, title, content, tags, and depends_on, including syntax and constraints. However, the required `key` parameter is never explained anywhere, leaving a clear gap for one of the three required inputs.
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 gives a specific verb and resource ("Create a task"), scopes the unit of work ("one issue/branch-sized unit of work") and status ("todo"), and distinguishes creation from later lifecycle steps by referencing transition_task. An agent can tell this is the creation tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It opens with a clear trigger ("when you start a piece of work or the user asks to add one") and routes related actions: finishing uses transition_task, other quarters use open_period, and list_tasks/get_status expose tags and waiting_on. It does not explicitly say when to use update_task instead for existing tasks, so it stops short of full when/when-not/alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_retrospectiveA
Use it when the user asks how a past quarter went (last quarter's retrospective).
Read a closed period's (YYYYQn) retrospective — the `result` markdown close_period
wrote. Errors while the period is still open; get_status says which ones are closed.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| period | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description does useful work by disclosing that the read errors while the period is still open and that the returned content is the `result` markdown created by close_period. It does not cover authentication, rate limits, or the exact error shape, but the key behavioral traits are present.
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 short sentences, front-loaded with the primary trigger, followed by the resource semantics and the error/alternative condition. There is no redundant wording.
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 two-parameter read tool with no output schema or annotations, the description covers the trigger, period format, returned content, open-period error behavior, and an alternative for checking closed periods. The missing explanation of `key` is the notable remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, but it only clarifies the `period` parameter's YYYYQn format. The required `key` parameter is never explained, leaving an agent unsure what identifier must be supplied.
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?
States a specific verb (Read) and resource (a closed period's retrospective), including the format (YYYYQn) and that the content is the `result` markdown written by close_period. This clearly distinguishes it from siblings such as get_status and close_period.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use it when the user asks how a past quarter went, and limits it to closed periods. It also names get_status as the way to determine which periods are closed, providing a clear alternative for related context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_roadmapA
Use it when the user asks for the plan (roadmap, this year's goals, quarter goals).
Read a project's plan as written: yearly overviews (goal, now, target, checklist),
quarterly milestones, and the names of its periods.
Goals only, no counts — get_status for progress and the current period, list_tasks for
the tasks themselves. Timestamps (`meta`) are left out unless `include_meta` is set.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| include_meta | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden: it frames the tool as a read ('Read a project's plan as written'), discloses that results are goals only and exclude counts, and states a concrete output-modifying behavior ('Timestamps (meta) are left out unless include_meta is set'). It stops short of explicitly asserting it is non-mutating or mentioning any permission/access requirements.
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?
Front-loaded with the usage trigger, then scope, then exclusions, then the meta caveat — every sentence carries information. Slight tightening is possible ('as written', 'the names of its periods' is a touch vague), but there is no padding.
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 two-parameter read-only tool with no output schema, the description covers purpose, content shape, sibling routing, and the one optional flag. The single material gap is that the required `key` parameter's meaning and source are never explained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description is the only source of parameter meaning. It explains the effect of include_meta precisely, but never explains what `key` is (presumably a project identifier) or how to obtain it, leaving the required parameter undocumented.
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?
States a specific verb and resource ('Read a project's plan as written') and enumerates exactly what is returned: yearly overviews (goal, now, target, checklist), quarterly milestones, period names. This is clearly distinguishable from get_status (progress/counts) and list_tasks (tasks), so an agent can pick it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with an explicit trigger ('Use it when the user asks for the plan (roadmap, this year's goals, quarter goals)') and then names two alternatives with their conditions ('get_status for progress and the current period, list_tasks for the tasks themselves'). Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_statusA
Use it first when you start on a project, and when the user asks where it stands (progress, what's left, what's in progress).
The resume: everything an agent needs to pick a project up cold, in one call. The
latest year's overview (goal / now / target / checklist); per period its milestone goal
and status (a period without a milestone has no goal and reports active while open, done
once closed), task counts by status, whether it is closed, and `open_tasks` — every
todo / blocked / in_progress task with its title, tags, branch, one-line content and
`waiting_on`; and `recent_done` — the ten most recently finished tasks across every period, newest
first, each with its content, its `check` and when it completed. Closed periods are
included.
`recent_done` is what the project already has, in the words of whoever built it, and
`check` is what they said proves it. Both are claims: confirm against the code before
building on one. Older finished work and cancelled tasks are list_tasks; the plan as
written is get_roadmap.
Call it once at the start of a session; there is nothing to poll for afterwards.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it explains what is included in the resume, that closed periods are included, and that recent_done/check are claims to verify. It stops short of explicitly stating read-only behavior, permissions, or side effects, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the usage condition and the main value proposition, then details the return payload. It is somewhat long, but the detail is mostly earned because there is no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex status tool with no output schema, the description does an unusually complete job describing the returned overview, per-period data, open_tasks, and recent_done. The remaining gap is the undocumented required `key` parameter and lack of explicit read-only confirmation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description never explains the sole required parameter `key`. The surrounding text implies it identifies a project, but it does not say the expected format or where to obtain it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it returns a project's status/resume snapshot for picking work up cold. It clearly distinguishes itself from list_tasks and get_roadmap, so an agent can identify the right tool without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: call first when starting a project and when the user asks where things stand. It also names alternatives for older/cancelled work and for the plan, and warns not to poll after the initial call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_taskA
Use it when you know a task id and need the whole record (task details).
Read one task in full by id (DLY-042) — the project comes from the prefix, so no key
is needed. Returns the record with its period. Use this instead of list_tasks whenever
you already know the id; search_tasks when you only know a word from it. The record also
carries `waiting_on` when it applies.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the behavioral burden. It clearly frames the operation as a read and discloses useful return details such as the record's period and `waiting_on` when applicable, though it does not discuss permissions, rate limits, or not-found behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The usage guidance is front-loaded and the description is appropriately short for a one-parameter read tool. There is minor redundancy between the opening usage sentence and the subsequent "Read one task in full by id" sentence, but no significant 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?
Given the low complexity, one required parameter, no output schema, and no annotations, the description covers purpose, usage, id format, and key return details. It does not fully document the record shape or error behavior, but it is sufficient for an agent to call the tool 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?
With 0% schema description coverage, the description compensates by explaining the id format via the `DLY-042` example and clarifying that the project is derived from the prefix, so no separate project key is needed. It could be slightly more explicit that the single required parameter is `task_id`, but the semantics are clear.
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 gives a specific verb and resource: "Read one task in full by id" and "get the whole record (task details)." It also distinguishes this tool from siblings by naming list_tasks and search_tasks and the conditions that separate them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool: "when you know a task id and need the whole record." It also names alternatives: use list_tasks when you already know the id is not the need, and search_tasks when you only know a word from it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
helpA
Use it for questions about FronyBoard itself — what it is for, which tool to call when, and how a session works with it — and read it once before your first other call in a conversation. Returns the whole guide as Markdown text.
To read or change what is recorded, call the working tools directly: get_status,
create_task, transition_task, list_tasks, search_tasks.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the return format ('the whole guide as Markdown text') and calls all other tools 'working tools' for data access, which implies that this tool only reads information. It doesn't explicitly say there are no side effects or that the output is large, which would help an agent decide whether to read the full output.
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 main purpose is stated first, followed by the return format, and then the guidance on alternatives, which is separated for clarity. Every sentence adds useful information, and no sentence is wasted.
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?
No output schema exists, so the description must explain what is returned, and it does so by saying the return value is the whole guide as Markdown text. Combined with the usage guidance and the explicit routing to sibling tools, the description is nearly complete; only the size or structure of the guide is left unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters, so there is no risk of misuse. The 100% schema coverage is trivially satisfied by an empty object, so there are no parameter semantics to add.
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?
States a specific verb and resource: it answers questions about FronyBoard itself (what it is for, which tool to call when, how sessions work). This is clearly different from the working tools listed. It falls short of 5 only because 'help' is still a broad label and the description doesn't quite pin down the scope of the guide.
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?
Gives an explicit usage rule ('read it once before your first other call in a conversation') and explicitly states a use case to avoid: for reading or changing recorded data, call get_status, create_task, transition_task, list_tasks, or search_tasks instead. Both when to use it and when to use alternatives are stated outright.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsA
Use it when the user asks which projects are tracked (project list, which boards exist).
List every project (key, name, description, repo, status, meta) — how to find out
which keys exist. Archived ones are left out unless `include_archived` is set.
Each entry carries a `summary`: its open periods, task counts by status and
`last_activity` (the newest task update). No milestones or task detail: get_roadmap
for the plan, get_status for per-period progress, list_tasks for the tasks.
| Name | Required | Description | Default |
|---|---|---|---|
| include_archived | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden well: it discloses returned fields, archived filtering, summary contents, and explicitly excludes milestones and task detail. It does not mention pagination, ordering, or access constraints, but for a read-only listing tool the core behavior is clearly described.
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 front-loaded with the usage condition, then the listing behavior and parameter effect, then return-value details and sibling guidance. Each sentence adds distinct information, and the structure makes it easy to scan without unnecessary repetition.
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 there is no output schema and only one parameter, the description is complete: it explains what is returned, what summary data accompanies each project, what is excluded, and when to use sibling tools instead. An agent can invoke and interpret this tool correctly from the description alone.
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 has 0% description coverage, so the description must explain the only parameter. It does so directly: archived projects are omitted unless include_archived is set, which gives the parameter clear semantic meaning beyond the schema's bare boolean title.
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 gives a specific verb and resource ('List every project') and explicitly states the user scenario it serves: when the user asks which projects are tracked. It also distinguishes the tool from siblings by saying it returns project identity fields and summary counts rather than roadmaps or task detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use it ('when the user asks which projects are tracked') and names alternatives for adjacent needs: get_roadmap for the plan, get_status for per-period progress, and list_tasks for tasks. It also clarifies archived-project behavior via the include_archived parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tasksA
Use it when the user asks for finished, cancelled or tagged work, or a past quarter's (done work, tasks by tag).
List one project's tasks, optionally narrowed by period, status, tags or recency.
get_status already lists the open ones; use this for done or cancelled tasks, a closed
period, or a tag cut. get_task when you know the id, search_tasks for text across
projects.
`period` is YYYYQn (all periods, closed ones included, when omitted), `status` is one of
todo | in_progress | done | blocked | cancelled. `tags` narrows to the tasks carrying
*all* of the given labels; pass one tag to match on it alone, and call again per tag
when you want the union. `updated_since` keeps tasks touched after a duration ("24h",
"7d") or ISO timestamp. A row carries `waiting_on` (the ids from its `depends_on` not yet
done) only when there are any. Cancelled tasks are excluded unless `include_cancelled`
is set or `status` is 'cancelled'.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| tags | No | ||
| period | No | ||
| status | No | ||
| updated_since | No | ||
| include_cancelled | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and does well: it discloses the default that cancelled tasks are excluded unless include_cancelled is set or status='cancelled', that omitting period includes closed periods, and that rows carry `waiting_on` only when non-empty. It does not state read-only/safety or result size/ordering limits, which keeps it short of a 5 for an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with intent, then routing, then parameter semantics – a logical order with dense, non-repetitive sentences. It is longer than strictly necessary (the tags union advice sits in the same block as core semantics), but no sentence is filler.
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 six-parameter filtered-list tool with no annotations and no output schema, the description covers triggering intent, alternatives, every parameter's format and filter interaction, default exclusion behavior, and the one non-obvious output field (`waiting_on`). Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, yet the description documents every parameter: `period` as YYYYQn with omitted-means-all-periods semantics, `status` with its full enum (todo | in_progress | done | blocked | cancelled), `tags` AND-semantics plus the per-tag union advice, `updated_since` accepting durations like '24h'/'7d' or ISO timestamps, and `include_cancelled` interacting with status. This more than compensates for the empty 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?
States the specific verb and resource ('List one project's tasks') plus its narrowing dimensions, and explicitly distinguishes itself from get_status ('already lists the open ones'), get_task (by id) and search_tasks (cross-project text). An agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The opening sentence gives the triggering user intent ('finished, cancelled or tagged work, or a past quarter's'), and the alternatives section names when to use get_status, get_task and search_tasks instead. Both when-to-use and when-not-to-use are explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_periodA
Use it only to file work under a quarter other than the current one (open next quarter).
Open a quarter's period (YYYYQn, e.g. 2026Q3) other than the current one — create_task
opens the current quarter by itself, so this is only for filing work under another
quarter. No milestone is needed; if the quarter has a planned one, it flips to active.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| period | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses that no milestone is needed and that a planned milestone flips to active, but it does not cover permissions, idempotency, or what happens if the period is already open.
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 constraint is front-loaded and understandable, but the first and second sentences repeat the same 'other than the current quarter' and 'create_task opens current quarter' points. It could be tightened without losing meaning.
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 explains the operation and its quarter-scoping well enough for the period parameter. However, because no output schema or annotations exist and the required key parameter is undocumented, an agent still lacks key invocation context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must document both parameters. It explains the period format and meaning with an example, but the required key parameter is not described at all, leaving a critical gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource (open a quarter's period) and clearly scopes it to quarters other than the current one. It distinguishes the tool from create_task by explaining that create_task opens the current quarter automatically.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: only for filing work under another quarter, with a concrete format example. It also names the alternative behavior of create_task, making the selection between the two clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recent_activityA
Use it when the user asks what changed recently or who did it.
What changed recently and who did it: the tool calls recorded in tools.jsonl,
newest first — `ts`, `tool`, `caller` (key:<name> / session:<user> / oauth:… / stdio / local),
`project`, `task` and `args` (argument names; prose fields appear as `<name>_len`);
`ok: false` marks a rejected call. This is the mutation history; task records
themselves keep only timestamps.
`since` is a duration ("24h" default, "7d", "90m") or an ISO timestamp; `key` narrows
to one project; `limit` caps the rows (default 50) while `count` reports the total.
Read-only calls are dropped unless `writes_only=False`.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | ||
| limit | No | ||
| since | No | ||
| writes_only | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: newest-first ordering, the exact returned fields, `ok: false` semantics for rejected calls, the fact that read-only calls are dropped unless writes_only=False, and that task records keep only timestamps. Defaults for since/limit are stated outright.
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?
Front-loaded with the usage trigger, then return shape, then parameter semantics — every sentence adds information. The middle block is dense and mixes return-field documentation with parameter documentation, and the unexplained `count` reference costs a point.
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?
No output schema exists, and the description fully documents the return shape, field meanings, ordering, and the write-filtering behavior. Nothing an agent needs in order to call and interpret this tool is missing.
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 0%, so the description must compensate, and it does: `since` accepts a duration ('24h' default, '7d', '90m') or an ISO timestamp, `key` narrows to one project, `limit` caps rows (default 50), and `writes_only=False` restores read-only calls. Only the stray mention of `count` (which is not a declared parameter) introduces minor 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?
Names a specific resource (the call log in tools.jsonl) and what it answers: what changed recently and who did it. It explicitly distinguishes itself from task records ('task records themselves keep only timestamps'), so an agent can tell this apart from get_task/list_tasks in the sibling set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use it when the user asks what changed recently or who did it' gives a clear triggering condition, and 'This is the mutation history' clarifies the boundary against task-record tools. It stops short of naming an explicit alternative or a when-not-to-use case, so a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_tasksA
Use it when the user remembers a word from a task but not its id or project (find a task).
Find tasks by text across all projects, with the dashboard's rules: case-insensitive
substring over project key, task id, title and content (not branch or tags); a
matching project key returns all of its tasks. Closed periods are included; cancelled
tasks only with `include_cancelled` (or `status='cancelled'`).
Hits are compact, ordered by project, then in_progress -> blocked -> todo
-> done -> cancelled, then id; `match` says which field hit; a task's one-line `content`
is included when it has one. `key` narrows to one project, `limit` (default 20) caps the
hits while `count` still reports the total. Follow up with get_task for the full record.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | ||
| limit | No | ||
| query | Yes | ||
| status | No | ||
| include_cancelled | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses the matching rules (case-insensitive substring over project key, task id, title, content; excludes branch/tags), the project-key shortcut, inclusion of closed periods, cancelled-task gating, result ordering, the `match` field and compact hit shape. This is unusually rich behavioral disclosure for a search tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the use case, then moves to matching semantics, inclusion rules, and result shape in a logical order. It is dense but every clause carries information; only the long parenthetical matching sentence is slightly overloaded.
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 5-parameter search tool with no output schema and no annotations, it covers the essential behavior: matching, ordering, returned fields (`match`, `content`, `count`), and follow-up guidance. It omits permissions/auth expectations and error or empty-result behavior, which are minor for a read search.
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 0%, so the description must compensate, and it largely does: it explains `query` as text search, `key` as a project narrowing filter, `limit` (default 20) as a hit cap, `include_cancelled`, and `status='cancelled'`. The `status` parameter's full accepted value set is only implied by the ordering list, so a small gap remains.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource — find tasks by text — and frames the exact user situation ('remembers a word from a task but not its id or project'). It clearly distinguishes itself from get_task, which it names as the follow-up for full records.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete trigger ('when the user remembers a word from a task but not its id or project') and routes to get_task for full details. It does not explicitly contrast with list_tasks or state when a plain listing is preferable, which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_checkA
Use it when one item of the year's checklist is done or undone (tick off a checklist item).
Tick or untick one item of a year's overview checklist: `index` is its 0-based
position in get_roadmap's `checklist`, `done` the new state. Returns the updated
overview. To add, remove or reword items use set_overview.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| done | No | ||
| year | Yes | ||
| index | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It usefully discloses that the tool returns the updated overview and that 'done' is the new state, but says nothing about permissions, idempotency, or what happens with an out-of-range index.
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?
Front-loaded with the usage condition, then the mechanics, then the alternative. Minor redundancy: 'tick off a checklist item' in parentheses restates the preceding clause.
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 no-annotation mutation tool with no output schema and 0% schema coverage, key gaps remain: the 'key' parameter is undefined and no failure modes are described. The reference to get_roadmap's checklist for index derivation is a helpful compensating detail.
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 0%, so the description must compensate. It explains 'index' (0-based position in get_roadmap's checklist) and 'done' (new state) well, but leaves 'key' completely undocumented and 'year' only implied by 'a year's checklist.'
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?
States a specific verb and resource: 'tick or untick one item of a year's overview checklist.' It also explicitly contrasts with set_overview for add/remove/reword, so an agent can distinguish it from siblings without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives both the trigger condition ('when one item of the year's checklist is done or undone') and the exclusion with a named alternative ('To add, remove or reword items use set_overview'). This is explicit when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_overviewA
Use it when the user sets or rewrites a year's plan (this year's goals, yearly plan).
Create or replace a year's overview: the one-line yearly `goal`, plus the three
blocks the dashboard shows for the current year — `now` (what is being worked on),
`target` (what that work is meant to reach) and `checklist` (the concrete steps to get
there, ticked off as they land). A year needs an overview before upsert_milestone will
add a quarter to it.
`year` is YYYY. All prose here is in the user's language. `now` and `target` are one
short line each. `checklist` items are strings (not done yet) or {text, done} maps,
in display order. Calling it again
replaces the whole overview — resend the checklist to keep it; use set_check to tick a
single item. Quarterly goals belong in upsert_milestone, not here.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| now | No | ||
| goal | Yes | ||
| year | Yes | ||
| target | No | ||
| checklist | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does disclose the key destructive trait: calling it again replaces the whole overview, so the checklist must be resent to keep it. It also notes the prerequisite for upsert_milestone, but it does not describe authentication needs or the response/error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the usage trigger, then supplies the replacement semantics and parameter formats. Every sentence adds actionable information, and the formatting makes the key warnings easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with six parameters, no annotations, and no output schema, the description covers purpose, alternatives, destructive replacement behavior, prerequisite ordering, and most parameter formats. The unexplained required `key` parameter and absent return-value context are the remaining gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains year as YYYY, goal as the one-line yearly goal, now and target as one short line each, and checklist as strings or {text, done} maps in display order — but it never explains the required `key` parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: create or replace a year's overview with goal, now, target, and checklist. It explicitly distinguishes this from sibling tools by saying quarterly goals belong in upsert_milestone and single checklist ticks belong in set_check.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger — when the user sets or rewrites a year's plan — and names the alternatives for adjacent operations: set_check for ticking one item and upsert_milestone for quarterly goals. It also states the prerequisite that a year needs an overview before upsert_milestone can add a quarter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transition_taskA
Use it when work starts, finishes, stalls or is dropped (start, finish, block or cancel a task).
Move a task to a new status: todo | in_progress | done | blocked | cancelled. The
only tool that changes status — title, content and tags are update_task.
`task_id` is the full id, e.g. DLY-042; the project is derived from that prefix, so
`key` may be omitted (if given it must match). Call when work starts (in_progress,
ideally with the branch name) and when it finishes (done); the server stamps
started_at and completed_at itself.
`done` requires `check`: one line, at most 300 characters, saying **what proves the work
done** — the command you ran and what it printed ("uv run pytest -q: 96 passed"), or the
observable a reader can go and see ("GET /healthz returns 200 on the deployed host").
You are the only one who can write it; by the next session the run is gone and all that
is left is your word. A restatement of the title proves nothing, so do not write one.
get_status shows it beside the finished task, and reopening a task drops it.
`cancelled` is the soft delete — there is no hard one: the record is kept but hidden
from queries by default, and `reason` is required. Use blocked for work that may
resume, cancelled for work that will not happen. Transitioning a cancelled task to
any other status restores it.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | ||
| check | No | ||
| branch | No | ||
| reason | No | ||
| status | Yes | ||
| task_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does: it discloses that the server stamps started_at/completed_at, that cancelled is a soft delete whose record is kept but hidden from queries, that reason is mandatory for cancellation, and that transitioning a cancelled task restores it. These are exactly the non-obvious side effects an agent needs.
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 front-loaded — the when-to-use and status list come first, then parameter guidance, then the two status-specific rules. It is a bit long, and the check paragraph leans on motivational prose ('all that is left is your word') that restates the same constraint twice, costing a point.
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?
No annotations, no output schema, and six parameters — the description still covers the status set, the auto-stamped timestamps, the soft-delete and restore lifecycle, the check requirement and where the check surfaces (get_status). Nothing an agent needs to invoke this correctly is left to guesswork.
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 0% and there are 6 parameters, yet the description explains each: task_id format (DLY-042) with project derived from the prefix, why key is usually omissible and must match if supplied, the 300-character one-line contract for check, and branch. Critically, the enum of valid statuses exists nowhere in the schema and is only supplied here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('move a task to a new status') and enumerates the five valid statuses. It explicitly carves itself out from siblings: 'The only tool that changes status — title, content and tags are update_task,' so an agent can route without opening another schema.
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?
Gives explicit triggering events ('when work starts, finishes, stalls or is dropped') and names alternatives (update_task for other fields, set_check, get_status). It also resolves the hardest ambiguity in this domain: 'Use blocked for work that may resume, cancelled for work that will not happen.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_projectA
Use it when the user renames, re-describes, pauses or archives a project.
Update a project's own fields — pass at least one of name, description, repo, status.
The key (and with it the task id prefix) never changes, and nothing here touches the
roadmap, periods or tasks. `name` and `description` follow create_project's language rule.
`status`: active | paused | archived. paused only changes the badge; archived hides the
project from list_projects and refuses every other mutation until it is set back to
active. Archived is as far as removal goes — there is no hard delete.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| name | No | ||
| repo | No | ||
| status | No | ||
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it explains the key (and task id prefix) is immutable, that paused only changes a badge, that archived hides the project from list_projects and blocks every other mutation until reverted, and that there is no hard delete — exactly the side-effect details an agent needs.
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?
Front-loaded with the usage trigger, then the constraint, then per-field semantics. Short declarative sentences, no filler, and the most consequential fact (archived blocks mutations) is stated plainly.
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 five-parameter mutation tool with no annotations and no output schema, this covers triggers, preconditions, field semantics and irreversibility. The only real omission is what repo accepts or how it is validated.
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 0%, so the description must compensate and largely does: it enumerates the permissible status values with their semantics, marks key as immutable, and points name/description at create_project's language rule. The repo parameter is only listed, never explained, leaving one gap.
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?
States a specific verb and resource ('Update a project's own fields') and immediately bounds the scope by naming what it does not touch (roadmap, periods, tasks), which separates it from update_task, upsert_milestone and set_overview.
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 opening sentence gives concrete triggers: renames, re-describes, pauses or archives. It also enforces a precondition ('pass at least one of name, description, repo, status'). It stops short of naming an alternative tool for cases like hard removal, though it does say no hard delete exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_taskA
Use it when a task's title, note, branch, tags or links change (edit a task).
Update a task's fields — everything except status, which is transition_task.
`branch` records the working branch name; `content` replaces the one-line note
(same rule as create_task: one line, at most 300 characters). `check` corrects the
proof recorded at completion and is only accepted on a task that is already done.
`tags` replaces the whole label list — pass the tags the task should end up with,
not just the new ones. `depends_on` likewise replaces the whole predecessor list.
Omitted fields are left as they are. To remove an optional field pass an empty value:
`content=""`, `branch=""`, `tags=[]`, `depends_on=[]`, `check=""` (title cannot be removed).
`task_id` is the full id including the project prefix, e.g. DLY-042 — the project
is derived from that prefix, so `key` may be omitted (if given it must match).
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | ||
| tags | No | ||
| check | No | ||
| title | No | ||
| branch | No | ||
| content | No | ||
| task_id | Yes | ||
| depends_on | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does so: list fields replace wholesale rather than append, omitted fields are preserved, empty values remove optional fields, title cannot be removed, and `check` is only accepted on an already-done task. These are exactly the mutation semantics that cause silent data loss if unknown.
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?
Front-loaded with the trigger and the scope exclusion in the first two lines, then grouped by concern (replace semantics, empty-value removal, id format). Slightly long and repeats the create_task content rule, but every sentence carries information an agent needs to avoid corrupting data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an eight-parameter mutation tool with no annotations and no output schema, this covers inputs thoroughly. The remaining gap is the return side – it never says whether the call returns the updated task or how failures (unknown id, mismatched key, check on an unfinished task) surface.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description compensates for all eight parameters: branch, content (with length/one-line constraint), check, tags, depends_on, title, and both task_id/key including the DLY-042 prefix format and the derive-project-from-prefix rule that makes `key` optional.
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?
States a specific verb (update) and resource (a task's fields) and immediately scopes it: 'everything except status, which is transition_task.' An agent can distinguish this from transition_task and create_task without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with an explicit trigger ('Use it when a task's title, note, branch, tags or links change') and names the excluded case with the correct alternative (status goes to transition_task). It also defers to create_task for the shared one-line/300-char content rule, giving an implicit routing map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upsert_milestoneA
Use it when the user sets or changes a quarter's goal (quarter goal, milestone).
Create or update a quarterly milestone — a year's goal for one quarter.
`year` is YYYY (its overview must exist), `quarter` is Q1-Q4, `goal` is one line in the
user's language (a new milestone needs one), `status` is planned | active | done
(opening the period flips planned to active, close_period sets done; a milestone added to
a quarter already open starts active).
Omitted fields keep their current value. A milestone is optional — tasks never need one.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| goal | No | ||
| year | Yes | ||
| status | No | ||
| quarter | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral load and does well: it discloses upsert semantics ('Omitted fields keep their current value'), the status lifecycle and automatic transitions (opening the period flips planned to active, close_period sets done, new milestones in an open quarter start active), and a validation rule (a new milestone needs a goal). It says nothing about permissions or failure modes when the year overview is missing, which is the remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the when-to-use sentence followed by the one-line definition, then parameter detail — a sensible order. There is mild redundancy between the trigger sentence and 'Create or update a quarterly milestone', but the status-lifecycle parenthetical is dense, useful information rather than padding.
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 5-parameter mutation tool with no annotations and no output schema, the description covers nearly everything an agent needs: intent, upsert defaults, lifecycle side effects, and most parameter formats. The unexplained required `key` parameter is the one substantive hole.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate and largely does: it defines year format (YYYY with an existing overview), quarter values (Q1-Q4), goal format (one line, user's language, required for creation) and the status enum (planned | active | done) with its transition rules. However, the required `key` parameter is never explained, leaving an agent to guess its meaning and format.
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?
States a specific verb and resource — 'Create or update a quarterly milestone — a year's goal for one quarter' — and the leading trigger sentence anchors it to the user intent ('sets or changes a quarter's goal'). It is clearly distinguishable from siblings like open_period and close_period, which only affect the milestone's status.
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?
Gives an explicit usage trigger ('when the user sets or changes a quarter's goal') plus a when-not/optionality note ('A milestone is optional — tasks never need one') and a prerequisite ('its overview must exist'). It stops short of naming an alternative tool for the goal-setting case, but no sibling actually competes for that job.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validateA
Use it only after the store was edited outside these tools (check the data).
Check a project's stored data against the FronyBoard schema and rules, returning errors and warnings.
Rarely needed on its own — every mutation runs this same gate and refuses to write when it fails. Use it after the store was edited outside these tools.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden well: it discloses that the tool returns errors and warnings, that it is a non-writing check, and that its logic is duplicated inside every mutation's write gate. It does not describe the shape or severity of the errors/warnings or whether the check has side effects on the store, leaving a modest gap.
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 core content is well front-loaded, but the instruction 'use it only after the store was edited outside these tools' appears twice (opening and closing), wasting space, and the parenthetical '(check the data)' is redundant with the main sentence.
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 one-parameter, no-output-schema, no-annotation tool, the description covers purpose, when to use it, and roughly what it returns (errors and warnings). The remaining gap is the meaning/format of 'key' and the exact return structure, which is a minor omission given the tool's simplicity.
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 0% for the single 'key' parameter, so the description must compensate. It only obliquely implies that key identifies the project ('a project's stored data') without stating format, scope, or whether it accepts an ID versus a slug.
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?
States a specific verb+resource: checks a project's stored data against the FronyBoard schema and rules, returning errors and warnings. It also distinguishes itself from the sibling mutation tools by explaining that every mutation already runs this same gate. The only gap is that it never ties the 'key' parameter to a project explicitly, though 'a project's stored data' implies it.
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?
Gives an explicit when-to-use ('only after the store was edited outside these tools') and an explicit when-not ('rarely needed on its own'), naming the alternative behavior (mutations run the same gate and refuse to write). Nothing about tool selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.41.0- Added
help
19 tool updates
- First observed
close_period - First observed
create_project - First observed
create_task - First observed
get_retrospective - First observed
get_roadmap - First observed
get_status - First observed
get_task - First observed
list_projects - First observed
list_tasks - First observed
open_period - First observed
recent_activity - First observed
search_tasks - First observed
set_check - First observed
set_overview - First observed
transition_task - First observed
update_project - First observed
update_task - First observed
upsert_milestone - First observed
validate
TDQS
Scored across 20 tools
Tools have clearly distinct purposes and descriptions explicitly guide when to use each (e.g., 'use this instead of list_tasks'). The volume of task-retrieval tools (get_task, list_tasks, search_tasks, get_status) could cause hesitation without reading the detailed cross-references, but boundaries are well-drawn.
Mostly consistent verb_noun pattern (get_, create_, update_, list_, set_, open_/close_, upsert_, transition_). Minor deviations like 'help', 'validate', and 'recent_activity' are clear and acceptable as utility or read verbs.
20 tools is on the heavy side for a project/task management server (16–25 feels heavy per the rubric). While each tool serves a purpose, some could be consolidated (e.g., set_overview and set_check, open_period and close_period).
Strong lifecycle coverage: projects (create/update/list/archive), tasks (create/get/update/transition/list/search), roadmaps (overview/milestone/check), periods (open/close), retrospectives, validation, and activity. Minor gaps like no explicit get_project or list_periods, but workarounds via list_projects and get_status exist.
Maintenance
Related MCP Connectors
Project management shared by people and AI agents, with persistent project state through MCP.
Project management MCP for AI agents with safe task reads and writes.
Persistent memory, knowledge graph, task management and more for AI agents via MCP.
Minimal issue tracker: projects, objectives and trackable plans, written by agents over MCP.
Related MCP Servers
- AlicenseAqualityDmaintenanceA local Model Context Protocol server providing backend tools for AI agents to manage projects and tasks with persistent storage in SQLite, enabling structured tracking of project tasks with dependencies, priorities, and statuses.126 npm25GPL 3.0
- AlicenseNot gradedqualityDmaintenanceManages projects, requirements, and knowledge entries with full-text search via SQLite FTS5. Provides 19 MCP tools for AI assistants to create, update, search, and delete project data.MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage and query SQLite databases through MCP tools, supporting CRUD operations, schema management, and saved views.4 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables deterministic, SQLite-backed task and todo tracking across multiple project scopes via MCP tools, allowing agents to add, update, list, complete, and delete tasks without hand-editing text files.2 npmMIT