Tasketier
Tasketier
What: A task tool for Windows that keeps all data on the PC. A global hotkey opens a one-line
box. You type the task with inline marks (@tomorrow, @15:30, !, #tag) and press Enter. A
list window shows Inbox, Today, Upcoming, Done and All. A tray icon keeps the app running.
tasketier.exe gives the same store a command line and an MCP server. A Claude Code plugin in
this repo tells an LLM how to use it.
Why: Tasks that come to mind during the day get lost, because writing them down takes too much attention. Capture must take less than two seconds from any window. The daily look-through must show what is due, what is planned for today and what is done. An LLM must be able to add and query tasks from a running session.
Status: working. Capture box, list window with the five views, inline edit, plan star, undo,
alarms, settings, help, tray, autostart, CLI, MCP server, plugin, installer. Every gate of
scripts/verify.ps1 passes.
Screenshots
The capture box opens from any window with Ctrl+Alt+A. The line below the text shows what the
parser read from it, before you press Enter:

? or F1 shows every mark:

The list window, Today view. Overdue tasks come first, in red. Then the tasks due today. Then the task planned for today, with the star. The marks stand in front of the title, the tags under it:

The alarm: a digital clock in the corner of the screen that beeps and rattles until you answer it.
Done completes the task, the three middle buttons snooze, Disarm acknowledges. The SNOOZE bar on
top and Esc snooze one minute:

Related MCP server: TickTick MCP CLI
How to run
dotnet build Tasketier.slnx
dotnet test Tasketier.slnx
dotnet run --project src\Tasketier.App # tray, hotkeys, the list window
dotnet run --project src\Tasketier.App -- --capture # the capture box
dotnet run --project src\Tasketier.App -- --tray # icon only, as at Windows start-up
dotnet run --project src\Tasketier.App -- --data D:\t # another data folder; runs beside the normal instance
dotnet run --project src\Tasketier.Cli -- add "Buy milk @tomorrow #home"
dotnet run --project src\Tasketier.Cli -- list --view today
dotnet run --project src\Tasketier.Cli -- mcp # the MCP server on stdin/stdout
.\scripts\verify.ps1
.\build-installer.ps1Verify: .\scripts\verify.ps1 runs four gates. Build with warnings as errors (analyzers, code
style, nullable). Unit tests with coverage. The dotnet format check. Cyclomatic complexity
(lizard, limit 9). The script exits non-zero on any FAIL or NOT VERIFIED.
Prerequisites: Windows 11 (the installed app runs on Windows 10 1607 or later). .NET SDK
10.0.400 (net10.0 and net10.0-windows). git. lizard (pip install lizard==1.17.31) for the
complexity gate. Inno Setup 7 (C:\Program Files\Inno Setup 7) for the installer. nuget.config
clears the machine-level feeds, so the build is the same on every machine.
Install
.\build-installer.ps1 writes out\installer\Tasketier-Setup-<version>.exe. The installer:
Copies
TasketierApp.exe(the tray app) andtasketier.exe(the CLI and MCP server) intoC:\Program Files\Tasketier.Adds that folder to PATH.
Offers a start-with-Windows task.
Downloads the .NET Desktop Runtime 10.0 from Microsoft when it is missing. The installer checks the SHA-256 of the download.
Tasks and settings live in %LOCALAPPDATA%\Tasketier. An uninstall keeps them.
The Releases page has the installer of each version. CI (.github/workflows/build.yml) runs
scripts/verify.ps1 and build-installer.ps1 on every push and keeps the installer as an
artifact. A tag v1.2.3 makes the release with the installer and its SHA-256.
Use
Action | How |
Add a task from anywhere |
|
Open the list |
|
Complete | The checkbox, or |
Plan for today without a date | The star ( |
Edit | The pencil at the end of the row, |
Delete |
|
Undo |
|
Filter | Type in the filter box ( |
Alarm |
|
Help |
|
Settings | Tray menu: both hotkeys, the alarm lead, the data folder, start with Windows (the per-user Run entry in the registry, which the installer also writes) |
You can change both hotkeys in Settings. When another program holds a chord, the tray shows a
message, and that hotkey stays off until you change it. The defaults avoid chords that common
tools hold, such as Ctrl+Alt+Space and Ctrl+Alt+T.
Inline syntax: Words are the title. #tag adds a tag. ! is high priority, !! is urgent.
Both also work as a suffix: Pay rent!!. @today, @tomorrow, @mon to @sun, @2026-11-03,
@+3d and @+2w set the due day. A weekday means the next such day after today. @15:30
sets the time. Without a day, the time means today. @none removes the date. @alarm sets an
alarm at the default lead before the due time (3 minutes unless Settings changes it). @alarmN
sets one N minutes before, for N from 0 to 1440. An alarm needs a time. An unknown @ mark is an
error. The box shows it before you press Enter.
Views: Today shows overdue tasks first, in red, then tasks due today, then tasks planned for today. Upcoming shows tasks due after today, by day. Inbox shows tasks with no date that are not planned. Done shows tasks completed in the last 30 days. All shows every task: the open ones first, in the same order as Today and Upcoming, then the done ones, newest first.
Command line: tasketier add|list|show|done|undone|edit|delete|plan|unplan|search|mcp|version.
--json prints records for scripts. --data <folder> points at a different tasks.json.
tasketier help shows all commands.
LLM access (MCP and plugin)
tasketier mcp is an MCP server on stdin and stdout. Its tools are add_task, list_tasks,
get_task, complete_task, reopen_task, update_task, delete_task, plan_today and
search_tasks. Each tool returns the changed records as JSON. A failed call returns its message.
The Claude Code plugin in plugin\ contains a skill and the server registration. The skill says
which tool to use for which request, the inline syntax and the working rules. The registration
starts ${ProgramFiles}\Tasketier\tasketier.exe mcp. To install the plugin in Claude Code:
/plugin marketplace add meet-brad-ch/Tasketier # or a local clone: /plugin marketplace add C:\Apps\Projects\Tasketier
/plugin install tasketier@tasketierThe app, the CLI and the server share one file under a cross-process lock. The app reloads when the file changes. A task that Claude adds appears in the list at once.
Storage
The tasks are one JSON file: %LOCALAPPDATA%\Tasketier\tasks.json. You can move the folder in
Settings, for example to a synced folder. Each write goes to a temporary file first and then
replaces the real file in one step. The first write of each day copies the previous file to
backups\tasks-<date>.json. A damaged file causes an error that names the file. The app never
replaces a damaged file. There is no network access and no telemetry.
Layout
src/Tasketier.Core/— a library without UI code: task model, inline-syntax parser, JSON store (mutex, atomic replace, daily backup, file watcher), view queries, alarm scheduler, service, undo, settings.src/Tasketier.App/— WPF (TasketierApp.exe): capture window, list window, alarm card, help window, settings window, tray icon, global hotkeys, instance signals, autostart.src/Tasketier.Cli/— console (tasketier.exe): the commands and themcpserver (ModelContextProtocol2.3.0).plugin/— the Claude Code plugin..claude-plugin/marketplace.jsonat the root lists it.tests/Tasketier.Core.Tests/,tests/Tasketier.Cli.Tests/— xUnit. The CLI tests start the real exe as an MCP server and drive it with the SDK client.installer/Tasketier.iss,build-installer.ps1— the Inno Setup installer.scripts/verify.ps1— the quality gates.tools/make_icon.py— draws the icon.tools/make_alarm_sound.py— writes the alarm beeps.tools/shoot_windows.ps1— takes the README screenshots from a seeded data folder (see its header).docs/img/— the README screenshots.
Design
WPF on .NET 10. One framework-dependent exe for the app, one for the CLI. The installer bootstraps the runtime.
The app is
TasketierApp.exeand the CLI istasketier.exe. Both live in one folder, and Windows file names ignore case, so both cannot beTasketier.exe.One JSON file, not a database: a person can read it, there is no dependency, and the store holds some hundreds of tasks at most. A cross-process mutex keeps the app, the CLI and the MCP server from writing at the same time.
LLM access is a stdio MCP server and a CLI in one exe over the shared store, not an HTTP server inside the app. It works when the app does not run, and the WPF app stays free of ASP.NET Core.
The installer writes to
C:\Program Files\Tasketierwith elevation, because the .NET runtime bootstrap needs elevation. The plugin's.mcp.jsonfinds the server through${ProgramFiles}.All text follows Simplified Technical English (ASD-STE100): short sentences, active voice, one meaning per word.
Keep this file honest. It is the only project document that is committed. LOG.md is gitignored,
so anything that must survive a fresh clone belongs here, not in the log.
Available Tools
9 toolsadd_taskA
Add a task from one line of text. Inline syntax: words are the title. #tag adds a tag. ! means high priority, !! means urgent. @today, @tomorrow, a weekday like @fri (the next Friday after today), @2026-11-03 or @+3d set the due day. @15:30 sets the due time, today when no day is given. @none removes the date. @alarm sets an alarm at the user's default lead before the due time (3 minutes unless Settings changes it). @alarmN sets one N minutes before (N from 0 to 1440). An alarm needs a due time. The desktop app shows it. Returns the stored task, with its id.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The task text, for example 'Call the dentist @fri @15:30 ! #health'. |
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 substantial work: it discloses that the task is persisted and returned with its id, that alarms fire at a default 3-minute lead (configurable), that alarms require a due time, and that the desktop app surfaces them. It omits error behavior for malformed syntax, tag auto-creation, and duplicate handling, keeping it below 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?
Front-loaded with the one-sentence purpose, then a compact token-by-token syntax list where nearly every clause carries a distinct rule. It is dense but not padded; the only slack is that token rules are comma-joined rather than separated, which slightly slows scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with no output schema, the description covers input syntax exhaustively and states the return value ('the stored task, with its id'). Remaining gaps are failure modes and side effects on tags, which are minor for a create operation of this shape.
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?
Although schema coverage is already 100%, the description goes far beyond the schema's one-line example by fully specifying the inline mini-language: #tag, !/!! priority, the full set of due-day forms, @15:30 time semantics, @none, and @alarmN's 0–1440 range. An agent can construct a valid argument purely from this prose.
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 ('Add a task') and immediately defines the input medium ('from one line of text'). The create-vs-complete-vs-update distinction is obvious from the verb, but the description never names or contrasts any sibling tool, so it lands at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the verb — you call this when a new task must be created — but there is no explicit 'use this instead of update_task when...' guidance, no statement about prerequisites, and no mention of how to handle text that references an existing task. Adequate but inferential.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
complete_taskA
Mark a task done now. This clears its snooze, and a done task does not ring its alarm. The task moves to the done view of list_tasks. A task that is already done gets a new completion time. To undo, use reopen_task. An unknown id fails with 'There is no task with id N.' Returns the task.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The task id from list_tasks, search_tasks or add_task. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full load and does: it discloses snooze clearing, that a done task won't ring its alarm, where the task moves, idempotent re-completion behavior, and the exact error for an unknown id. That is unusually complete for a mutation tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five short sentences, every one load-bearing: effect, side effect, state transition, idempotency, error, undo route, return shape. The primary action is front-loaded.
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 mutation with no annotations and no output schema, the description covers side effects, resulting state, repeat invocation, error behavior, and even the return value ('Returns the task'). Nothing an agent needs 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 coverage is 100% on the single id param, so the baseline is 3; the description adds value by specifying the failure mode for an unknown id, including the exact error text. It doesn't restate id provenance, but the schema already does.
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?
Opens with a specific verb+resource ('Mark a task done now') and implicitly distinguishes itself from delete_task and reopen_task through the stated effects. An agent can tell what this does without reading 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?
Explicitly routes the undo case to reopen_task, which is the key alternative. It doesn't address when to prefer delete_task over completing, but the primary sibling decision is covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_taskA
Delete a task. There is no undo. Returns the removed task.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The task id. |
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 disclose the critical trait: "There is no undo," which is exactly the destructive-behavior warning an agent needs. It also states the return value ("Returns the removed task"), though it omits permission requirements and side effects such as whether subtasks cascade.
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, zero waste, with the destructive warning front-loaded right after the purpose. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with no output schema, the description covers purpose, irreversibility, and return value. Only minor gaps remain, such as permission needs or cascade behavior, which are not essential to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (id) and schema description coverage is 100%, so the schema already documents it fully. The description adds no format or constraint detail beyond the schema, which is the expected baseline 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 ("Delete a task") that is unambiguous and clearly distinct from siblings like complete_task or update_task. It does not explicitly name or contrast with an alternative, but the operation is self-evidently different from the other task tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus alternatives such as complete_task or update_task, nor any prerequisites or exclusions. The agent must infer that this is the hard-removal path from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_taskA
Get one task by id and change nothing. Returns the task as JSON. Fields without a value are not in the JSON. Use it when you know the id. To find tasks by text, use search_tasks. To see a view such as today or inbox, use list_tasks. An unknown id fails with 'There is no task with id N.'
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The task id from list_tasks, search_tasks or add_task. |
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 declares read-only semantics ('change nothing'), the serialization format, the omission rule for empty fields, and the exact failure message for an unknown id. That is more behavioral disclosure than most read tools provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with purpose and effect, then routing, then the error case. Every sentence adds information; nothing repeats the schema or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with no annotations and no output schema, the description covers purpose, return shape, field-omission behavior, error semantics, and sibling routing. Nothing an agent needs 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 coverage is 100% and the schema already explains where the id comes from (list_tasks, search_tasks, add_task). The description only adds the trivial 'use it when you know the id', so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get one task by id') plus the explicit non-effect ('change nothing'), which separates it from every mutating sibling. The return contract ('Returns the task as JSON') is stated up front.
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 the positive trigger ('Use it when you know the id') and names both alternatives with their selecting conditions: search_tasks for text lookup, list_tasks for views like today or inbox. No inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tasksA
List the tasks of one view, in the view's order. The views: 'today' = overdue first, then due today, then planned for today. 'upcoming' = due after today. 'inbox' = no date and not planned. 'done' = completed in the last 30 days. 'all' = every task: open ones first (overdue, then by due day, undated last), then done ones, newest first. Returns a JSON array of tasks.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | One of: today, upcoming, inbox, done, all. Default today. | today |
| filter | No | Only tasks whose title or tag contains this text (case-insensitive). Empty for all. |
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 well: it discloses the ordering contract for every view, the 30-day window for 'done', the open-before-done ordering for 'all', and that the return is a JSON array. It does not mention pagination, result limits, or auth requirements, which is the remaining gap for a read tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by the view enumeration and the return type. Dense but nearly every clause earns its place; the enumeration of five views makes it long, though that length is functional rather than redundant.
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, zero-required listing tool with no output schema, the description covers purpose, all parameter values, ordering, and return shape. Only pagination/volume behavior and the exact task object shape are unaddressed, which are minor for this complexity level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description adds genuine meaning beyond the schema: the schema only lists valid view strings, while the description explains what each view actually contains and how it is ordered. Filter semantics (title or tag, case-insensitive) are already in the schema and are not duplicated.
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?
Opens with a specific verb and resource ("List the tasks of one view, in the view's order") and then defines each view value precisely. It does not explicitly name a sibling such as search_tasks, but the 'view'-based framing is distinct enough that an agent can separate it from the other task tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The per-view definitions effectively tell the agent which view to pick for which need (overdue work → 'today', future work → 'upcoming', undated → 'inbox', recent history → 'done', everything → 'all'). What's missing is guidance on when to use this tool versus search_tasks or get_task, but the usage context for the parameters is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_todayA
Put a task into the Today view without a due date (planned = true), or remove it from Today (planned = false). Returns the task.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The task id. | |
| planned | No | True to plan the task for today, false to unplan it. Default true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses that planning does not set a due date and that the task is returned, but it omits safety profile (idempotency), error behavior for a missing or nonexistent id, and permission requirements for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both front-loaded and free of waste: the toggle semantics come first, followed by the return value. Nothing redundant against the name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only 2 parameters, no nested objects, and no output schema, the description covers the core contract including the return value. Missing error-handling and permission context keeps it just short of complete for a mutation tool with no annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so a baseline of 3 applies, but the description adds meaning beyond the schema by clarifying that planning is decoupled from due dates and framing planned as a toggle between addition and removal from the Today view. The 'id' parameter is left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: toggling a task's membership in the Today view via planned=true/false, and returns the task. It implicitly distinguishes itself from the generic update_task sibling by naming the specific 'planned' semantics, though no sibling is named directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use each direction (plan vs unplan) through the planned flag, but gives no guidance on alternatives such as update_task or add_task, nor any prerequisites or exclusions. A capable agent can infer usage, but the routing information is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reopen_taskA
Reopen a done task, so it is open again. Only the done state changes: the title, tags, priority, due day, plan and alarm stay. A task that is already open does not change. To mark a task done, use complete_task. An unknown id fails with 'There is no task with id N.' Returns the task.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The task id from list_tasks, search_tasks or add_task. |
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 scopes the mutation to the done flag only, enumerates the preserved fields (title, tags, priority, due day, plan, alarm), states idempotency for open tasks, and quotes the exact error for an unknown id. That is mutation scope, side effects, and failure mode all in one short paragraph.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four compact sentences, front-loaded with the action and its effect, followed by what is preserved, the no-op case, the alternative, and the error. Every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with no output schema, the description covers the state transition, preserved state, idempotency, error contract, and return value ('Returns the task'). Nothing an agent needs in order 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 coverage is 100% and the single parameter already documents its provenance via a sibling tool, so the baseline is 3. The description adds only the failure behavior for an unknown id, not any new semantics for the id argument itself.
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 ('Reopen a done task') plus the resulting state ('so it is open again'), which is more precise than the bare name. It explicitly distinguishes itself from the sibling complete_task, so an agent can route between them without opening a 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 the trigger condition (task is done), the no-op condition (already open), and names the inverse tool ('To mark a task done, use complete_task'). Both when-to-use and the alternative are spelled out, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_tasksA
Find every task, open or done, whose title or tag contains the text. The match ignores case. Open tasks come first. Returns a JSON array of tasks.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The text to look for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full behavioral burden. It usefully discloses case-insensitive matching, ordering (open tasks first), and the return shape (JSON array), but says nothing about pagination, result caps, or whether it is a safe read-only operation — gaps that matter for an unbounded 'every task' search.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, each carrying one distinct fact — scope, matching rule, ordering, return type — with the most important information first. Nothing is redundant or padded.
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 read tool with no output schema, the description covers matching behavior, ordering, and return type, which is enough to call it correctly. It omits any mention of result limits or pagination, a minor but real gap for a search that claims to find 'every task'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is documented as 'The text to look for.' The description adds genuinely new semantics: the text is matched against title OR tag, and the match ignores case. That is meaning the schema does not provide.
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 ('Find every task') and narrows scope to title/tag text matching, which distinguishes it semantically from list_tasks. It does not explicitly name list_tasks or get_task as alternatives, so differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no sentence telling the agent when to search versus when to use list_tasks or get_task, and no exclusions. The text-match framing implies the use case (you have a substring, not an ID), but the agent must infer the routing decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_taskA
Replace the title, the tags, the priority, the due day, the due time and the alarm of a task from one line of text. Parts that are not in the text are cleared. The plan for today and the done state stay. Inline syntax: words are the title. #tag adds a tag. ! means high priority, !! means urgent. @today, @tomorrow, a weekday like @fri (the next Friday after today), @2026-11-03 or @+3d set the due day. @15:30 sets the due time, today when no day is given. @none removes the date. @alarm sets an alarm at the user's default lead before the due time (3 minutes unless Settings changes it). @alarmN sets one N minutes before (N from 0 to 1440). An alarm needs a due time. The desktop app shows it. Returns the task.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The task id. | |
| text | Yes | The whole new task line, for example 'Call the dentist @mon ! #health'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden and does well: it discloses that missing fields are cleared, today's plan and done state are preserved, alarms require a due time, and alarms appear in the desktop app. It leaves some operational gaps around permissions, invalid task IDs, invalid text, and 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 replacement behavior and clearing semantics, then lists the inline syntax rules in a compact sequence. Although it is long, every sentence appears to earn its place given the complexity of the text grammar.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description must carry the behavior, and it largely does: mutation semantics, field clearing, preservation rules, alarm prerequisites, and return are covered. It still lacks error cases, permission requirements, and details about the returned task shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds substantial meaning beyond the schema for the text parameter: words become the title, #tag adds tags, ! and !! set priority, date forms set due days, @15:30 sets due time, @none clears dates, and @alarm sets alarm lead times. The id parameter is left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: replace a task's title, tags, priority, due date/time and alarm from one line of text. It also clarifies scope by saying unspecified parts are cleared while today's plan and done state stay, which distinguishes it from add_task and complete_task/reopen_task.
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?
Clearly implies this should be used when replacing multiple task fields from a one-line text, and warns that missing parts are cleared. It also implicitly excludes completion tools by stating the done state stays, but it does not explicitly name alternatives such as add_task or complete_task.
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.
3 tool updates
v0.1.1- Changed
complete_task1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"The task id from list_tasks or add_task."New value: +"The task id from list_tasks, search_tasks or add_task."
- Changed
get_task1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"The task id."New value: +"The task id from list_tasks, search_tasks or add_task."
- Changed
reopen_task1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"The task id."New value: +"The task id from list_tasks, search_tasks or add_task."
9 tool updates
v0.1.0- First observed
add_task - First observed
complete_task - First observed
delete_task - First observed
get_task - First observed
list_tasks - First observed
plan_today - First observed
reopen_task - First observed
search_tasks - First observed
update_task
TDQS
Scored across 9 tools
Each tool has a clearly distinct purpose: add/get/update/delete cover CRUD, complete/reopen handle done state, list/search retrieve tasks differently, and plan_today manages the Today view. The inverse pairs and retrieval tools are explicitly cross-referenced in descriptions, leaving little room for misselection.
All tool names follow a consistent snake_case verb_noun pattern: complete_task, delete_task, reopen_task, get_task, add_task, list_tasks, plan_today, search_tasks, update_task. The only minor variation is plural 'tasks' in list/search, which is natural and still predictable.
Nine tools is well-scoped for a task manager, covering creation, retrieval, updates, deletion, completion lifecycle, search, and planning without redundant operations. Each tool earns its place.
The surface covers full task lifecycle: add, get, list, search, update, delete, complete, reopen, and plan for today. Inline syntax handles tags, priority, due dates, times, and alarms, so no obvious CRUD or workflow gaps remain.
Maintenance
Related MCP Connectors
Local-first task manager: create, edit, and complete tasks, projects, and checklists via MCP.
Simple, fast todo app: manage tasks, projects and tags from Claude and other MCP clients.
A finishing tool, not a to-do list: file tasks, read today's plan, and work dispatched queues.
Brain dump, routines, task planning, focus, and instant thought retrieval
Related MCP Servers
- AlicenseAqualityDmaintenanceA task management and productivity tool that enables creating, updating, filtering, and organizing todos with tags, priorities, and due dates, all stored locally in JSON format.76 npmMIT
- AlicenseCqualityDmaintenanceAgent-friendly CLI and MCP server for TickTick and Dida365 task management APIs, enabling project and task management with stable JSON output and OAuth authentication.171MIT
- FlicenseNot gradedqualityDmaintenanceA privacy-first, local-first MCP server that provides 15 ADHD/second-brain tools for capturing, prioritizing, and resurfacing tasks with context from calendar, mail, and messages.1-
- AlicenseBqualityCmaintenanceTask planning and tracking for AI agents with project-based organization and Obsidian-compatible markdown storage.136 npmMIT