Skip to main content
Glama

Tasketier

build release license

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:

The capture box with "Call the dentist @fri @15:30 ! #health" typed and the parsed due, priority and tag shown below

? or F1 shows every mark:

The capture box with the inline syntax help unfolded

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 list window with the Today view: the priority mark and the alarm bell in front of each title, the tags under it, the due day on the right and a pencil at the end of each row

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:

The alarm clock: an orange body with a SNOOZE bar, a dark display with the due time in seven-segment digits and the task title, and the buttons Done, 5 min, 15 min, 1 h, Disarm

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.ps1

Verify: .\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:

  1. Copies TasketierApp.exe (the tray app) and tasketier.exe (the CLI and MCP server) into C:\Program Files\Tasketier.

  2. Adds that folder to PATH.

  3. Offers a start-with-Windows task.

  4. 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

Ctrl+Alt+A, type, Enter. Esc cancels. The focus returns to the previous window. When you click elsewhere, an empty box closes, and a box with text stays on top until you press Enter or Esc.

Open the list

Ctrl+Alt+L, or a left click on the tray icon

Complete

The checkbox, or Space on the selected row

Plan for today without a date

The star (☆ becomes ★). The task stays in Today until it is done or unstarred.

Edit

The pencil at the end of the row, F2, or a double-click on the title. The row becomes one edit field with the whole line in inline syntax. Enter saves, Esc cancels.

Delete

Del. Ctrl+Z brings the task back.

Undo

Ctrl+Z. The app keeps the last 20 changes of the session, captures included.

Filter

Type in the filter box (Ctrl+F). The filter matches the title or a #tag.

Alarm

@alarm on a task with a time: an orange digital clock in the corner 3 minutes before, with Done, Snooze 5 / 15 / 60 min and Disarm. It beeps until you answer it. The SNOOZE bar, Esc and a close without an answer (for example Alt+F4) snooze 1 minute. Only Disarm acknowledges. A snooze is stored with the task, so it also comes back after a restart. @alarmN sets N minutes, for example @alarm5 or @alarm15. Settings changes the default lead. The tray app must run. When the app starts more than one hour after a due time, it does not show that alarm.

Help

? or F1 in the capture box or the list. Also in the tray menu.

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@tasketier

The 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 the mcp server (ModelContextProtocol 2.3.0).

  • plugin/ — the Claude Code plugin. .claude-plugin/marketplace.json at 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.exe and the CLI is tasketier.exe. Both live in one folder, and Windows file names ignore case, so both cannot be Tasketier.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\Tasketier with elevation, because the .NET runtime bootstrap needs elevation. The plugin's .mcp.json finds 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 tools
add_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.

NameRequiredDescriptionDefault
textYesThe task text, for example 'Call the dentist @fri @15:30 ! #health'.

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
idYesThe task id from list_tasks, search_tasks or add_task.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
idYesThe task id.

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.'

NameRequiredDescriptionDefault
idYesThe task id from list_tasks, search_tasks or add_task.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
viewNoOne of: today, upcoming, inbox, done, all. Default today.today
filterNoOnly tasks whose title or tag contains this text (case-insensitive). Empty for all.

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
idYesThe task id.
plannedNoTrue to plan the task for today, false to unplan it. Default true.

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
idYesThe task id from list_tasks, search_tasks or add_task.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
textYesThe text to look for.

TDQS

A3.5/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
idYesThe task id.
textYesThe whole new task line, for example 'Call the dentist @mon ! #health'.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 3 tool updatesv0.1.1
    • Changedcomplete_task1 field changed
      • changedInput schema / properties / id / description
        Previous value: -"The task id from list_tasks or add_task."New value: +"The task id from list_tasks, search_tasks or add_task."
    • Changedget_task1 field changed
      • changedInput schema / properties / id / description
        Previous value: -"The task id."New value: +"The task id from list_tasks, search_tasks or add_task."
    • Changedreopen_task1 field changed
      • changedInput schema / properties / id / description
        Previous value: -"The task id."New value: +"The task id from list_tasks, search_tasks or add_task."
  2. 9 tool updatesv0.1.0
    • First observedadd_task
    • First observedcomplete_task
    • First observeddelete_task
    • First observedget_task
    • First observedlist_tasks
    • First observedplan_today
    • First observedreopen_task
    • First observedsearch_tasks
    • First observedupdate_task

TDQS

A4.2/5.0

Scored across 9 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers