things3-mcp-server
This server provides an MCP interface to interact with the Things 3 macOS app via AppleScript, enabling an AI agent to read and manage tasks, projects, areas, and tags.
Read to-dos: Retrieve to-dos from Today, Inbox, or recently completed (Logbook) with a configurable look-back period. List to-dos within specific lists, areas, or projects, with status filtering (open, completed, canceled). Search by name substring and fetch single to-dos by ID.
Read structure: List all areas, projects (optionally filtered by area), and tag names.
Create to-dos: Create new to-dos with optional notes, area/project assignment, tags, scheduled date (
when), and deadline.Manage to-dos: Complete or cancel to-dos (cancel is reversible). Update to-dos by replacing or appending tags, rescheduling, changing deadline, or moving to another built-in list. Target to-dos by unique ID or name query, with support for exact matching.
Safety & integration: All commands use parameterized AppleScript to prevent injection. Requires Things 3 to be installed, running, and granted Automation permission.
Click on "Install 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., "@things3-mcp-serverlist my inbox items"
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.
things3-mcp-server
MCP server for Things 3 on macOS. Read and write to-dos, lists, areas and projects — so an agent can drive the same task workflows a human does in Things (triage Today, log completed work, file new tasks, reschedule).
Built for the KI-OS workflow: it replaces the ad-hoc AppleScript snippets used
for /review, the purchase-decision framework and the loop↔Things sync with a
proper tool surface.
How it works
All access goes through AppleScript (osascript), invoked with an
on run argv handler so user-provided values (task titles, notes, tags) are
passed as real arguments — never interpolated into the script, so there is no
injection risk. No external Python dependency beyond the MCP SDK; nothing reads
the Things SQLite database directly, which keeps writes safe and avoids schema
coupling.
Requires the Things 3 app to be installed and running. On first use macOS will ask to grant Automation permission to control Things 3 — approve it for the host process (Claude / your terminal).
Related MCP server: Things MCP
Tools
Tool | Kind | Purpose |
| read | To-dos in a list / area / project |
| read | Everything in the Today list |
| read | Everything in the Inbox |
| read | Recently completed to-dos (Logbook) |
| read | Find to-dos by name substring |
| read | A single to-do by id |
| read | All areas |
| read | Projects (optionally within an area) |
| read | All tag names |
| write | Create a to-do |
| write | Complete open to-do(s) by name or id |
| write | Cancel open to-do(s) — reversible, no delete |
| write | Update the first matching open to-do |
| write | Append tags without dropping existing ones |
Write tools accept either todo_id (exact, safest — e.g. an id from
create_todo) or a name query (exact=True for an exact match instead of a
substring).
Keeping list responses small
All list-returning read tools (list_todos, get_today, get_inbox,
get_completed, search_todos) accept three shaping arguments:
arg | effect |
| keep only to-dos carrying ANY of these tags (case-insensitive) |
| drop the |
| keep at most N to-dos, applied after the tag filter |
Defaults are unchanged ("", True, 0), so existing calls behave exactly as
before.
Why this exists — measured against a real Anytime list of 87 to-dos:
list_todos("list", "Anytime") 55,952 chars
+ include_notes=False 18,085 chars (-68 %)
+ tag="48h-Liste,Spontankauf" 4,047 chars (-93 %)Two to-dos were being looked for. Notes are the bulk of the payload, and they are
worth having — just not in an overview. Fetch them per to-do with get_todo().
The tag filter is also a correctness matter, not only a size one: a purchase decision is identified by its tag, not by its area, and a to-do filed in no area at all is the normal case for something captured quickly. Filtering by area silently misses those.
Removing a deadline
update_todo(deadline="none") removes an existing deadline. An empty string
leaves it untouched — those are different operations, and the distinction matters:
Things shows a to-do in Today whenever its deadline is due or overdue, regardless of when the to-do is scheduled. Rescheduling alone therefore does not get a to-do out of Today — a stale deadline from months ago keeps pulling it back, silently, and Today stops being a list of what is actually due today.
AppleScript has no missing value for this property (due date is typed date,
so assigning missing value fails with error -1700). The tool uses
delete due date of t instead, which does work — verified against the live app in
both directions: removing yields missing value, and setting an ISO date
afterwards still works.
Todo objects carry: id, name, status, tags, due (deadline, ISO),
when (scheduled/activation date, ISO), project, area, completion (ISO),
notes. Dates are YYYY-MM-DD strings; when accepts today, tomorrow,
anytime, someday or an ISO date.
Install
cd ~/workspace/things3-mcp-server
python3 -m venv .venv
.venv/bin/pip install -e .Register with Claude Code (user scope)
claude mcp add things3 --scope user -- \
~/workspace/things3-mcp-server/.venv/bin/things3-mcp-serverDesign note
The MCP stays a generic Things wrapper. Domain semantics — e.g. the ADHS
48h purchase-decision rule (48h-Liste tag, +2 days, then Spontankauf +7) —
live in the KI-OS skills, not here. update_todo(query, tags=..., move_to_list="Anytime")
is exactly the primitive the 48h→Spontankauf transition needs.
Scope / non-goals
The interactive "Einkäufe ADHS" Shortcut is deliberately not wrapped (it needs UI dialogs and stays manual).
No delete tool by design —
cancel_todo(reversible) covers "drop this task" (e.g. a rejected purchase decision); hard deletion is intentionally left out.
Maintainer
Schimmi — https://schimmilab.de Issues und Pull Requests willkommen.
Available Tools
14 toolsadd_tagsA
Append tags to the first matching OPEN to-do WITHOUT removing existing ones.
Unlike update_todo(tags=...) which replaces the whole tag set, this merges the given tags into the current ones (duplicates skipped).
| Name | Required | Description | Default |
|---|---|---|---|
| tags | Yes | Comma-separated tag names to add. | |
| exact | No | Require an exact name match instead of a substring match. | |
| query | No | Name substring (or exact name if exact=True). | |
| todo_id | No | Things id — takes precedence over query. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 meaningful work: it states that existing tags are preserved, duplicates are skipped, and matching is limited to open to-dos. It could still mention what happens when no match is found, but the core behavior is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two compact sentences with the most important behavior front-loaded and the sibling contrast in a supporting second sentence. Every phrase 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 tag-adding mutation with complete schema coverage and an output schema available, the description provides the missing model-level information: merge semantics, no removal, and open-todo scoping. No critical selection or invocation information 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 100%, so the four parameters are already documented well. The description adds semantic context about merging and duplicate-skipping, but it does not need to restate parameter syntax or selection rules.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Append') and a precise resource ('tags to the first matching OPEN to-do'), and immediately clarifies the non-replacing behavior. It also names update_todo, so an agent can distinguish this tool from its sibling that replaces tags.
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 contrasts this tool with update_todo(tags=...), telling the agent that adding/merging tags should use add_tags while replacing the whole tag set should use update_todo. That is a clear when/alternative rule rather than an implicit hint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_todoA
Mark open to-do(s) as canceled (reversible — prefer this over deleting).
Target by todo_id or query (same matching rules as complete_todo).
Useful e.g. for a rejected purchase decision. Returns canceled task names.
| Name | Required | Description | Default |
|---|---|---|---|
| exact | No | ||
| query | No | ||
| todo_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description takes on the full behavioral burden. It clearly states that cancellation is reversible, applies to open to-dos, and returns canceled task names. It could mention failure behavior or idempotency, but the key side-effect and reversibility are well disclosed.
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 tight and front-loaded: the core verb and resource appear first, followed by targeted matching guidance, a use case, and return behavior. Every sentence contributes, and there is no repetition of schema fields or annotation 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?
Given this is a mutation tool with no annotations and no schema-property descriptions, the description covers purpose, reversibility, targeting, and the returned output. Still, it fails to define 'exact' behavior and the conflict for what happens when both the 'todo_id' and 'query' are supplied. These are important gaps for reliable invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description names two parameters ('todo_id' and 'query') and says the matching rules are the same as complete_todo, which provides some meaning beyond the bare schema. With 0% schema-property coverage, though, the 'exact' parameter is not explained, and precedent behavior when both target args are supplied is left ambiguous. The description only partially compensates for the missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Mark open to-do(s) as canceled'. It also clarifies the semantic distinction from deleting by saying the operation is 'reversible' and should be preferred over deletion. This clearly differentiates it from other to-do state-change tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides practical guidance: use it when a decision is rejected, and prefer it over deleting. It also points to 'same matching rules as complete_todo' for targeting context. However, it does not explicitly cover when not to use it, such as when the task should be completed instead of canceled.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
complete_todoA
Mark open to-do(s) as completed.
Target by todo_id (exact, safest — e.g. an id returned from create_todo)
or by query (name match). With exact=False (default) every OPEN to-do
whose name contains query is completed; set exact=True to require an
exact name match. Returns the completed task names — check them.
| Name | Required | Description | Default |
|---|---|---|---|
| exact | No | ||
| query | No | ||
| todo_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the full burden. It discloses that only OPEN to-dos are affected, that query matching is substring by default and exact when exact=True, and that the completed item names are returned for verification. It does not specify behavior when both todo_id and query are supplied, but the core mutating behavior is clearly visible.
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 compact and well structured: action first, then targeting rules, then a return-value expectation. Every line adds useful information, and the line breaks make the parameter semantics easy to parse. No filler or repetition of schema-only facts.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main behavior well and an output schema exists, but it leaves important boundary cases implicit. Specifically, with all three parameters optional and no required parameters, it never states what happens if neither todo_id nor query is provided, and it does not define precedence when both are given. An agent calling the tool with defaults could unintentionally match every open to-do.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no parameter descriptions, so this is entirely compensated by the tool description. It explains todo_id as the exact and safest target, query as a name match, and exact as controlling contains vs. exact matching with a default of false. All three parameters receive meaningful explanation beyond their type/default.
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 opens with 'Mark open to-do(s) as completed', which names a specific action and resource. It also distinguishes the tool by explaining the two targeting modes, making it clear how this relates to sibling tools such as cancel_todo or update_todo without confusion.
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 decision guidance: use todo_id for exact and safest targeting, or query for name matching, and explains when to set exact=True versus False. It does not explicitly call out alternative sibling tools, but the parameter-selection guidance is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_todoB
Create a new Things 3 to-do.
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | Area to file the task in (must exist). Ignored if `project` set. | |
| tags | No | Comma-separated tag names (e.g. "48h-Liste,Wichtig"). | |
| when | No | Schedule — "today", "tomorrow", "anytime", "someday" or an ISO date "YYYY-MM-DD". | |
| notes | No | Optional notes body. | |
| title | Yes | Task title (required). | |
| project | No | Project to file the task in (must exist). Takes precedence over `area`. If neither is given the task lands in the Inbox. | |
| deadline | No | Deadline (due date) as ISO date "YYYY-MM-DD". |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 of behavioral disclosure. It only says a to-do is created, but it does not mention what happens in the system, whether the new to-do lands in the Inbox unless area/project is supplied, whether duplicate creates are possible, or what failure conditions matter.
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?
This is a single focused, front-loaded sentence with no filler or repeated information. It is appropriately sized for a tool whose parameter details are already handled by a thorough 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 create operation, the description plus a fully documented schema gives enough information to invoke the tool correctly. An output schema exists, so return-value explanation is not required. The main gap is usage context relative to sibling tools, which is not critical for successful invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across all 7 parameters, so the baseline is 3. The description itself adds no parameter-level nuance, but it does not need to because the schema already explains defaults, precedence, date formats, and tag syntax.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly uses a specific verb ('Create') and names the exact resource ('a new Things 3 to-do'). The word 'new' distinguishes it from sibling tools like update_todo, complete_todo, and cancel_todo without any need to inspect 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?
There is no explicit guidance on when to use this tool versus alternatives. It does not mention that updates should go to update_todo, completion to complete_todo, or cancellation to cancel_todo, so the agent must infer usage context from the tool name and schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_completedA
List to-dos completed within the last days days (from the Logbook).
Useful for syncing finished tasks back into other systems. days
defaults to 30.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Only return to-dos carrying ANY of these tags (comma-separated, case-insensitive). Empty = no tag filter. | |
| days | No | Look back this many days. | |
| limit | No | Return at most N to-dos (0 = all). Applied AFTER the tag filter. | |
| include_notes | No | False drops the `notes` field — notes dominate the payload. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the burden of behavioral disclosure. It is implicitly read-only ('List') and explains the Logbook scope and default lookback window, but it does not describe output ordering, tag filtering caveats, or other behavior beyond the core listing.
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 short sentences with no filler. The primary purpose is front-loaded, and each sentence serves a distinct role: defining the core list operation and stating its intended usage context.
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 a simple read tool with all parameters documented and an output schema present, the description is mostly complete. It could have explicitly differentiated itself from 'list_todos' or 'search_todos', but for the core operation it is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% parameter description coverage, so the baseline is 3. The only parameter-related mention in the description, the default of `days` to 30, duplicates what is already in the schema and adds no new information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List to-dos completed within the last `days` days') and identifies the resource (completed to-dos) and source (Logbook). It does not explicitly mention sibling tools, but the 'completed' filter makes its scope distinguishable from generic list/search siblings.
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 sentence 'Useful for syncing finished tasks back into other systems' gives clear usage context for the tool. There is no explicit when-not-to-use guidance or mention of alternatives, which prevents a higher score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_inboxA
List all to-dos currently in the Things 3 "Inbox" (unfiled tasks).
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Only return to-dos carrying ANY of these tags (comma-separated, case-insensitive). Empty = no tag filter. | |
| limit | No | Return at most N to-dos (0 = all). Applied AFTER the tag filter. | |
| include_notes | No | False drops the `notes` field — notes dominate the payload. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden of behavioral disclosure. It adds the meaningful 'unfiled tasks' semantic but does not state whether this is a purely read-only operation, how results are ordered, whether pagination occurs, or what happens when no to-dos are present. The description communicates the purpose but not the 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 a single, tightly-crafted sentence that front-loads the verb and object and includes a useful parenthetical explanation. There is no fluff, repetition, or extraneous 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?
Given the simple interface with three optional, self-documented parameters and an existing output schema, the brief description is almost sufficient. It clearly identifies the resource and scope, but it could be slightly more complete by explicitly positioning itself against count of siblings such as list_todos and search_todos.
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 100%, and all parameters (tag, limit, include_notes) are thoroughly described in the input schema. The tool description contributes no additional parameter-level meaning, so the schema is doing the heavy lifting. This meets the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List'), a precise resource ('all to-dos currently in the Things 3 Inbox'), and a clarifying parenthetical ('unfiled tasks') that distinguishes it from siblings like get_today, get_completed, and list_todos. It clearly identifies what the tool does and where its scope lies.
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 scoping phrase 'currently in the Inbox' implies when this tool should be used: whenever an agent needs unfiled or Inbox to-dos. However, it never explicitly names alternatives or defines when not to use it, leaving the selection guidance an unspecified baseline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_todayA
List all to-dos currently in the Things 3 "Today" list.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Only return to-dos carrying ANY of these tags (comma-separated, case-insensitive). Empty = no tag filter. Filter here rather than client-side: the tag, not the area, is what identifies e.g. a purchase decision, and a to-do filed in no area is the normal case. | |
| limit | No | Return at most N to-dos (0 = all). Applied AFTER the tag filter. | |
| include_notes | No | False drops the `notes` field. Notes dominate the payload (72 % of a real 95-to-do list) — leave them out for overviews and fetch them per to-do with get_todo() when you actually need them. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It clearly states that this is a read/list operation and that results are the currently-active Today list. It does not disclose ordering, pagination semantics, whether read-only guarantees exist, or how the Today list is defined beyond the name, so the transparency is only minimally adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single direct sentence that front-loads action, scope, and list. It contains no filler, repetition, or redundant restating of the tool name.
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 uncomplicated read-only getter with zero required parameters, a high-coverage schema, and an output schema present, the description gives an agent enough to invoke it correctly. The minor gap is the lack of any sibling-comparison or ordering/behavior notes, which keeps it just shy of fully self-contained.
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 100%, so the baseline is 3 even though the main description adds no parameter detail of its own. The schema entries themselves are notably rich (tag filtering semantics, filtering before limit, notes payload size), but that credit belongs to the schema coverage, not to the tool description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: "List all to-dos currently in the Things 3 'Today' list." It clearly identifies what is returned and scopes it to a particular list, which visually distinguishes it from siblings like list_todos, get_inbox, and get_completed.
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 main description gives no guidance about when to use this tool versus alternatives such as list_todos, search_todos, get_inbox, or get_completed. The only hint in the schema, suggesting get_todo() when notes are needed, is paramter-level advice and does not help an agent choose get_today among its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_todoA
Get a single to-do by its Things id. Returns null if it does not exist.
| Name | Required | Description | Default |
|---|---|---|---|
| todo_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly states the key sentinel behavior: 'Returns null if it does not exist.' With no annotations available to carry read-only safety hints, the use of 'Get' also signals a non-destructive operation. This is sufficient additional behavioral transparency for such a simple getter.
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 short, purposeful sentences: the first defines the action and target, the second clarifies the return behavior for a missing ID. There is no repetition or filler, and the key information is properly 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?
Given a single parameter, a simple resource type, an output schema already available, and a short clear description that covers the null behavior, the tool definition contains everything an agent needs to correctly select and invoke it. Sibling tools add surrounding context without complicating this interaction.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides only a string type with 0% description coverage. The description compensates by explaining that the parameter is the Things to-do ID, adding meaning beyond the bare schema. Yet it does not mention how that ID is obtained or what string format is expected, leaving some room for further clarity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies a specific action and resource: 'Get a single to-do by its Things id.' This distinguishes it from sibling list-based tools like list_todos, get_today, and search_todos, since it targets exactly one item based on an identifier.
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 strongly implies one should use this tool when a specific to-do ID is already known, and there is nothing about fetching collections. However, it does not explicitly state when not to use it or mention alternative tools such as list_todos or search_todos, so the usage guidance remains implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_areasA
List all Things 3 areas (id + name).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It does reveal that this is a list/read operation and specifies output contents, but it omits explicit reassurance about being read-only and does not mention response behavior like ordering, limits, or potential errors. This is adequate but not deeply transparent.
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 entire description is one short, front-loaded sentence. Every word contributes meaning: 'List', 'all', 'Things 3 areas', and the output format. There is zero redundancy or 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?
Given that the tool has no parameters and an output schema, the description is contextually complete. It states the single behavior, scope, and expected return contents. Nothing needed to invoke the tool 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?
The tool has zero parameters, so the baseline is 4. The description does not need to explain input semantics and it productively indicates what the output includes, id and name, which compensates for any lack of parameter detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and names the exact resource ('all Things 3 areas'), which clearly differentiates it from siblings like list_projects, list_tags, and list_todos. Adding the output fields (id + name) further removes ambiguity.
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 clearly states that this tool retrieves all areas, so an agent can infer it is the right choice when area-level data is needed. It gives clear context but does not explicitly mention when not to use it or name alternatives, though the resource distinction is obvious among the sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsA
List Things 3 projects (id, name, status, area).
If area is given, only projects within that area are returned.
| Name | Required | Description | Default |
|---|---|---|---|
| area | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must stand alone. It discloses that the tool returns project fields and that the area parameter filters results, but it does not clarify whether `area` matches by name or ID, or surface edge cases such as empty results or matching behavior. The list nature implies a read operation but that is not explicit.
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 deliberately concise: two sentences with the primary purpose and the conditional behavior. No filler, and the key information 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 tool with one optional parameter and an output schema, the description is mostly complete. The main missing piece is the precise semantics of the `area` parameter, but the overall tool usage remains clear and the output schema likely handles return-value documentation.
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 carries the burden. It does add meaning: providing `area` restricts results to projects within that area. However, it does not explain the expected format or source of the area value, leaving some ambiguity for the agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'List Things 3 projects' and enumerates the returned fields. This clearly distinguishes it from sibling tools like list_todos and list_areas, even without naming them explicitly.
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 establishes clear context: it lists projects and optionally filters by area. It does not explicitly name alternatives or say when not to use it, but the resource type and behavior make the intended use obvious among the siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tagsA
List all tag names defined in Things 3.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of disclosing behavior. The verb 'list' suggests a non-mutating read operation, but the description does not explicitly state read-only semantics, empty-result behavior, or any operational caveats.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that contains the action, the resource, and the scope with no filler or redundancy. It is appropriately front-loaded and easy to parse.
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 simple zero-parameter list operation, the description is nearly complete. An output schema exists, so return-shape details are not the description's responsibility, and the remaining gap is limited to explicit usage guidance or behavioral caveats.
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 zero parameters and an empty input schema, so there are no parameter semantics for the description to add. The baseline for a zero-parameter tool is 4, and the description correctly focuses on the result rather than parameters.
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 identifies a specific verb ('list') and a concrete resource ('all tag names defined in Things 3'), and clearly distinguishes it from siblings like list_todos, list_areas, and list_projects. The scope is explicit.
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 rather than explicitly stated: call this when you need the complete set of tag names. However, the description does not state when to prefer this tool over alternatives or include any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_todosB
List Things 3 to-dos within one scope.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Only return to-dos carrying ANY of these tags (comma-separated, case-insensitive). Empty = no tag filter. Filter here rather than client-side: the tag, not the area, is what identifies e.g. a purchase decision, and a to-do filed in no area is the normal case. | |
| limit | No | Return at most N to-dos (0 = all). Applied AFTER the tag filter. | |
| status | No | Filter — "open" (default), "completed", "canceled" or "any". | open |
| scope_name | Yes | Name of the list/area/project. Built-in lists include "Inbox", "Today", "Anytime", "Upcoming", "Someday", "Logbook". | |
| scope_type | Yes | One of "list", "area", "project". | |
| include_notes | No | False drops the `notes` field. Notes dominate the payload (72 % of a real 95-to-do list) — leave them out for overviews and fetch them per to-do with get_todo() when you actually need them. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bares the full responsibility for disclosing behavior. It only says 'list within one scope' and does not explain that it is read-only, that the default filter is 'open', whether results are ordered, or how severe the payload concerns are. This lack of behavioral disclosure can surprise an agent expecting all to-dos regardless of status.
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 an eight-word sentence that is front-loaded with the verb and resource. It contains no filler or repetition; given that the detailed parameter schema complements it, the not length is appropriate and every word is meaningful.
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 an output schema present, the description does not need to explain return shape, and the parameter schema covers field specifics. However, the description is very thin: it does not tell the agent when to pick this over search_todos, does not mention default status behavior, and leaves the read-only nature and notable payload risks (which are only described at the parameter level) hidden from the synopsis.
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 100%, with each of the 6 parameters having a clear description and (for the fields) a default value. The tool description adds nothing to the parameter semantics, but the rich schema already carries enough weight for this dimension.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('List') and resource ('Things 3 to-dos') with a scope constraint ('within one scope'), so it is far from a tautology. It communicates what the tool returns, though it does not explicitly distinguish it from sibling tools like get_today or search_todos.
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 phrase 'within one scope' implies that this tool is best when targeting a particular list/area/project, and the include_notes parameter description products to get_todo() for fetching notes. However, the tool description itself gives no explicit when-to-use guidance or cautions about when to prefer search_todos or other siblings, so the main guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_todosA
Search to-dos whose name contains query (case-insensitive).
By default only open to-dos are searched; set include_completed=True to also search the Logbook.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Only return to-dos carrying ANY of these tags (comma-separated, case-insensitive). Empty = no tag filter. | |
| limit | No | Return at most N to-dos (0 = all). Applied AFTER the tag filter. | |
| query | Yes | Name substring to search for. | |
| include_notes | No | False drops the `notes` field — notes dominate the payload. | |
| include_completed | No | Also search the Logbook. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the transparency burden. It discloses case-insensitive matching, the default open-only behavior, and how to include completed entries. It doesn't describe output ordering or potential edge cases, but for a read-only search operation these are minor gaps.
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 sentence, no filler. The first sentence states the core operation, and the second explains the important default behavior and how to alter it. The description is front-loaded and each word contributes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with a single required parameter, known defaults, and an output schema, this description is largely complete. Its main omission is explicit guidance about when to use a sibling tool instead, such as when a list without name matching is needed.
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 100%, so the baseline is 3. The description adds value beyond the schema by explicitly stating that matching is case-insensitive and by framing include_completed's behavior in the search flow. This goes beyond the individual parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description explicitly states 'Search to-dos whose name contains `query`' with a specific verb, resource, and matching rule, plus case-insensitivity. It also conveys the default open-only scope and the optional completed search, making the tool's purpose clear and distinct from siblings like list_todos or get_completed.
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 provides clear context: by default only open to-dos are searched, and include_completed=True switches to also search the Logbook. It gives a meaningful condition for how to broaden a search, though it does not explicitly contrast with sibling tools or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_todoA
Update the first matching OPEN to-do (by todo_id or name query).
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | If set, REPLACES the task's tags (comma-separated). Use add_tags to append without dropping existing tags. | |
| when | No | Reschedule — "today", "tomorrow", "anytime", "someday" or ISO date. | |
| exact | No | Require an exact name match instead of a substring match. | |
| query | No | Name substring (or exact name if exact=True) identifying the task. | |
| todo_id | No | Things id — takes precedence over query, matches exactly. | |
| deadline | No | New deadline (due date) as ISO date "YYYY-MM-DD". Pass "none" to REMOVE an existing deadline. An empty string leaves the deadline untouched — that is not the same thing. Removing matters because Things puts a to-do back into Today whenever its deadline is due or overdue, regardless of when it is scheduled: a stale deadline silently clogs Today. | |
| move_to_list | No | Move the task to a built-in list (e.g. "Anytime"). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden. It communicates the important first-match-only and OPEN-only behavior, but it does not mention the destructive effects such as replacing tags or removing deadlines, nor what happens when no task matches or when neither todo_id nor query is provided.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler. It places the most important behavior first: update, match kind, and state.
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 plus schema covers most invocation details, but the top-level guidance leaves a notable gap for a 7-parameter tool: it does not state that either todo_id or query must logically be supplied, nor does it explain the update behavior when no match is found or when multiple tasks match. The first-matching behavior partially helps, but edge-case expectations remain implicit.
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?
All 7 parameters have rich schema descriptions that explain matching, tags replacement, deadline removal, and rescheduling. The top-level description adds only the high-level clue that lookup is by todo_id or query, so the schema already does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('update') and the resource ('first matching OPEN to-do'), and identifies how the task is found (by todo_id or name query). It does not explicitly name sibling tools like complete_todo or cancel_todo to distinguish from them, so it stops short of full sibling differentiation.
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 it: update an existing open to-do rather than a completed one. It does not explicitly explain when to choose this over complete_todo, cancel_todo, or add_tags, although the schema's tags parameter does mention add_tags for the append case.
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. Dates show when Glama detected each change.
14 tool updates
v0.3.0- Changed
add_tags11 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / exact / descriptionAdded value: +"Require an exact name match instead of a substring match." - removed
Input schema / properties / exact / titleRemoved value: -"Exact" - added
Input schema / properties / query / descriptionAdded value: +"Name substring (or exact name if exact=True)." - removed
Input schema / properties / query / titleRemoved value: -"Query" - added
Input schema / properties / tags / descriptionAdded value: +"Comma-separated tag names to add." - removed
Input schema / properties / tags / titleRemoved value: -"Tags" - added
Input schema / properties / todo_id / descriptionAdded value: +"Things id — takes precedence over query." - removed
Input schema / properties / todo_id / titleRemoved value: -"Todo Id" - removed
Input schema / titleRemoved value: -"add_tagsArguments" - removed
Output schema / titleRemoved value: -"add_tagsDictOutput"
- Changed
cancel_todo6 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / exact / titleRemoved value: -"Exact" - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / properties / todo_id / titleRemoved value: -"Todo Id" - removed
Input schema / titleRemoved value: -"cancel_todoArguments" - removed
Output schema / titleRemoved value: -"cancel_todoDictOutput"
- Changed
complete_todo6 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / exact / titleRemoved value: -"Exact" - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / properties / todo_id / titleRemoved value: -"Todo Id" - removed
Input schema / titleRemoved value: -"complete_todoArguments" - removed
Output schema / titleRemoved value: -"complete_todoDictOutput"
- Changed
create_todo17 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / area / descriptionAdded value: +"Area to file the task in (must exist). Ignored if `project` set." - removed
Input schema / properties / area / titleRemoved value: -"Area" - added
Input schema / properties / deadline / descriptionAdded value: +"Deadline (due date) as ISO date \"YYYY-MM-DD\"." - removed
Input schema / properties / deadline / titleRemoved value: -"Deadline" - added
Input schema / properties / notes / descriptionAdded value: +"Optional notes body." - removed
Input schema / properties / notes / titleRemoved value: -"Notes" - added
Input schema / properties / project / descriptionAdded value: +"Project to file the task in (must exist). Takes precedence\nover `area`. If neither is given the task lands in the Inbox." - removed
Input schema / properties / project / titleRemoved value: -"Project" - added
Input schema / properties / tags / descriptionAdded value: +"Comma-separated tag names (e.g. \"48h-Liste,Wichtig\")." - removed
Input schema / properties / tags / titleRemoved value: -"Tags" - added
Input schema / properties / title / descriptionAdded value: +"Task title (required)." - removed
Input schema / properties / title / titleRemoved value: -"Title" - added
Input schema / properties / when / descriptionAdded value: +"Schedule — \"today\", \"tomorrow\", \"anytime\", \"someday\" or an ISO\ndate \"YYYY-MM-DD\"." - removed
Input schema / properties / when / titleRemoved value: -"When" - removed
Input schema / titleRemoved value: -"create_todoArguments" - removed
Output schema / titleRemoved value: -"create_todoDictOutput"
- Changed
get_completed10 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / days / descriptionAdded value: +"Look back this many days." - removed
Input schema / properties / days / titleRemoved value: -"Days" - added
Input schema / properties / include_notesAdded value: +{ + "default": true, + "description": "False drops the `notes` field — notes dominate the payload.", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "default": 0, + "description": "Return at most N to-dos (0 = all). Applied AFTER the tag filter.", + "type": "integer" +} - added
Input schema / properties / tagAdded value: +{ + "default": "", + "description": "Only return to-dos carrying ANY of these tags (comma-separated,\ncase-insensitive). Empty = no tag filter.", + "type": "string" +} - removed
Input schema / titleRemoved value: -"get_completedArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"get_completedOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
get_inbox8 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / include_notesAdded value: +{ + "default": true, + "description": "False drops the `notes` field — notes dominate the payload.", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "default": 0, + "description": "Return at most N to-dos (0 = all). Applied AFTER the tag filter.", + "type": "integer" +} - added
Input schema / properties / tagAdded value: +{ + "default": "", + "description": "Only return to-dos carrying ANY of these tags (comma-separated,\ncase-insensitive). Empty = no tag filter.", + "type": "string" +} - removed
Input schema / titleRemoved value: -"get_inboxArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"get_inboxOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
get_today8 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / include_notesAdded value: +{ + "default": true, + "description": "False drops the `notes` field. Notes dominate the payload\n(72 % of a real 95-to-do list) — leave them out for overviews and\nfetch them per to-do with get_todo() when you actually need them.", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "default": 0, + "description": "Return at most N to-dos (0 = all). Applied AFTER the tag filter.", + "type": "integer" +} - added
Input schema / properties / tagAdded value: +{ + "default": "", + "description": "Only return to-dos carrying ANY of these tags (comma-separated,\ncase-insensitive). Empty = no tag filter. Filter here rather than\nclient-side: the tag, not the area, is what identifies e.g. a\npurchase decision, and a to-do filed in no area is the normal case.", + "type": "string" +} - removed
Input schema / titleRemoved value: -"get_todayArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"get_todayOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
get_todo6 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / todo_id / titleRemoved value: -"Todo Id" - removed
Input schema / titleRemoved value: -"get_todoArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"get_todoOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
list_areas5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / titleRemoved value: -"list_areasArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"list_areasOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
list_projects6 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / area / titleRemoved value: -"Area" - removed
Input schema / titleRemoved value: -"list_projectsArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"list_projectsOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
list_tags5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / titleRemoved value: -"list_tagsArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"list_tagsOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
list_todos14 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / include_notesAdded value: +{ + "default": true, + "description": "False drops the `notes` field. Notes dominate the payload\n(72 % of a real 95-to-do list) — leave them out for overviews and\nfetch them per to-do with get_todo() when you actually need them.", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "default": 0, + "description": "Return at most N to-dos (0 = all). Applied AFTER the tag filter.", + "type": "integer" +} - added
Input schema / properties / scope_name / descriptionAdded value: +"Name of the list/area/project. Built-in lists include\n\"Inbox\", \"Today\", \"Anytime\", \"Upcoming\", \"Someday\", \"Logbook\"." - removed
Input schema / properties / scope_name / titleRemoved value: -"Scope Name" - added
Input schema / properties / scope_type / descriptionAdded value: +"One of \"list\", \"area\", \"project\"." - removed
Input schema / properties / scope_type / titleRemoved value: -"Scope Type" - added
Input schema / properties / status / descriptionAdded value: +"Filter — \"open\" (default), \"completed\", \"canceled\" or \"any\"." - removed
Input schema / properties / status / titleRemoved value: -"Status" - added
Input schema / properties / tagAdded value: +{ + "default": "", + "description": "Only return to-dos carrying ANY of these tags (comma-separated,\ncase-insensitive). Empty = no tag filter. Filter here rather than\nclient-side: the tag, not the area, is what identifies e.g. a\npurchase decision, and a to-do filed in no area is the normal case.", + "type": "string" +} - removed
Input schema / titleRemoved value: -"list_todosArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"list_todosOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
search_todos12 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / include_completed / descriptionAdded value: +"Also search the Logbook." - removed
Input schema / properties / include_completed / titleRemoved value: -"Include Completed" - added
Input schema / properties / include_notesAdded value: +{ + "default": true, + "description": "False drops the `notes` field — notes dominate the payload.", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "default": 0, + "description": "Return at most N to-dos (0 = all). Applied AFTER the tag filter.", + "type": "integer" +} - added
Input schema / properties / query / descriptionAdded value: +"Name substring to search for." - removed
Input schema / properties / query / titleRemoved value: -"Query" - added
Input schema / properties / tagAdded value: +{ + "default": "", + "description": "Only return to-dos carrying ANY of these tags (comma-separated,\ncase-insensitive). Empty = no tag filter.", + "type": "string" +} - removed
Input schema / titleRemoved value: -"search_todosArguments" - removed
Output schema / properties / result / titleRemoved value: -"Result" - removed
Output schema / titleRemoved value: -"search_todosOutput" - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Changed
update_todo17 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / deadline / descriptionAdded value: +"New deadline (due date) as ISO date \"YYYY-MM-DD\".\nPass \"none\" to REMOVE an existing deadline. An empty string\nleaves the deadline untouched — that is not the same thing.\nRemoving matters because Things puts a to-do back into Today\nwhenever its deadline is due or overdue, regardless of when\nit is scheduled: a stale deadline silently clogs Today." - removed
Input schema / properties / deadline / titleRemoved value: -"Deadline" - added
Input schema / properties / exact / descriptionAdded value: +"Require an exact name match instead of a substring match." - removed
Input schema / properties / exact / titleRemoved value: -"Exact" - added
Input schema / properties / move_to_list / descriptionAdded value: +"Move the task to a built-in list (e.g. \"Anytime\")." - removed
Input schema / properties / move_to_list / titleRemoved value: -"Move To List" - added
Input schema / properties / query / descriptionAdded value: +"Name substring (or exact name if exact=True) identifying the task." - removed
Input schema / properties / query / titleRemoved value: -"Query" - added
Input schema / properties / tags / descriptionAdded value: +"If set, REPLACES the task's tags (comma-separated). Use add_tags\nto append without dropping existing tags." - removed
Input schema / properties / tags / titleRemoved value: -"Tags" - added
Input schema / properties / todo_id / descriptionAdded value: +"Things id — takes precedence over query, matches exactly." - removed
Input schema / properties / todo_id / titleRemoved value: -"Todo Id" - added
Input schema / properties / when / descriptionAdded value: +"Reschedule — \"today\", \"tomorrow\", \"anytime\", \"someday\" or ISO date." - removed
Input schema / properties / when / titleRemoved value: -"When" - removed
Input schema / titleRemoved value: -"update_todoArguments" - removed
Output schema / titleRemoved value: -"update_todoDictOutput"
14 tool updates
v0.2.1- First observed
add_tags - First observed
cancel_todo - First observed
complete_todo - First observed
create_todo - First observed
get_completed - First observed
get_inbox - First observed
get_today - First observed
get_todo - First observed
list_areas - First observed
list_projects - First observed
list_tags - First observed
list_todos - First observed
search_todos - First observed
update_todo
TDQS
There are five ways to retrieve to-do lists (list_todos, get_today, get_inbox, get_completed, search_todos), and list_todos is vague about what 'one scope' means, creating unclear boundaries. The update/complete/cancel/add_tags tools also share the same todo_id-or-query targeting pattern, which could lead an agent to pick the wrong mutating operation without careful reading.
Names uniformly use lowercase verb_noun patterns: list_*, get_*, search_*, create_*, update_*, complete_*, cancel_*, add_tags. The main deviation is that get_* mixes single-item lookup (get_todo) with list-returning operations (get_today, get_completed, get_inbox), so the verb prefix does not strictly predict the return shape, but the overall style is predictable.
14 tools is reasonable for a Things 3 server and stays within the expected range, covering to-do read/write plus area/project/tag lookup. The count is slightly inflated by the many overlapping read/list routes for to-dos, but each still has a concrete intended use.
The to-do lifecycle is well covered: create, read/list/search, update, complete, cancel, and tag management are all present. The main gaps are a lack of direct deletion (mitigated by cancel_todo) and write support for projects/areas/tags, but these are reasonable for a to-do-focused server.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Manage Superlist tasks and lists in plain language from any MCP-compatible AI agent.
Manage tasks, Focus Zone, notes, projects, and task history from compatible AI assistants.
AI-native task management: list, create, update and archive tasks with rich context for AI agents
1Create and manage MeisterTask projects, tasks, and notes from your AI assistant.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables LLMs to interact with Things 3 task manager on macOS via AppleScript, allowing users to list and create todos across different lists through natural language.30MIT
- AlicenseBqualityDmaintenanceEnables Claude to interact with Things 3 on macOS, allowing users to create, update, and manage to-dos and projects, list tasks, search items, and navigate through Things lists using natural language.202017ISC
- AlicenseBqualityDmaintenanceEnables Claude to interact with Things 3 task management, allowing creation, analysis, and management of tasks, projects, and tags via natural language.22MIT
- AlicenseBqualityDmaintenanceEnables Claude to interact with Things 3 task management, allowing natural language task creation, project analysis, and GTD workflow automation.2444MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Schimmilab/things3-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server