Just Claude Things
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Just Claude ThingsList my tasks for today"
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.
Just Claude Things
An MCP server that lets Claude read and write your Things 3 tasks on macOS via AppleScript.
Requirements
macOS
Things 3 installed and running
Node.js 18+
When first used, macOS will prompt you to grant Automation permissions (System Settings → Privacy & Security → Automation)
Related MCP server: Things MCP
Quick Start
Claude Desktop
Add to your ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"things3": {
"command": "npx",
"args": ["-y", "things3-mcp"]
}
}
}Claude Code
claude mcp add things3 -- npx -y things3-mcpAvailable Tools
Read
get_todos
List todos with optional filters.
{ "status": "today" }
{ "tag": "work", "status": "anytime" }
{ "search": "meeting notes" }
{ "projectId": "ABC123" }Parameter | Type | Description |
| string | Filter by list: |
| string | Filter by project ID |
| string | Filter by area ID |
| string | Filter by tag name |
| string | Search todo titles and notes |
get_todo
Get a single todo by ID with full details.
{ "id": "ABC123" }get_projects
List all projects with status, area, and tags. No parameters.
get_areas
List all areas. No parameters.
get_tags
List all tags. No parameters.
Write
create_todo
Create a new todo.
{
"title": "Review PR #42",
"notes": "Check the error handling changes",
"when": "today",
"tags": ["work"],
"checklistItems": ["Read the diff", "Run tests locally", "Leave review"]
}Parameter | Type | Description |
| string | Required. Title of the todo |
| string | Notes/description |
| string |
|
| string | Deadline date ( |
| string[] | Tag names to apply |
| string | Project ID to add this todo to |
| string | Heading within the project |
| string[] | Checklist items |
create_project
Create a new project.
{
"title": "Q2 Planning",
"notes": "Quarterly goals and milestones",
"tags": ["work"],
"when": "2025-04-01",
"deadline": "2025-06-30"
}Parameter | Type | Description |
| string | Required. Title of the project |
| string | Notes/description |
| string | Area ID to assign to |
| string[] | Tag names |
| string |
|
| string | Deadline date ( |
update_todo
Update an existing todo by ID.
{
"id": "ABC123",
"when": "tomorrow",
"tags": ["urgent"]
}Parameter | Type | Description |
| string | Required. Todo ID |
| string | New title |
| string | New notes (appended to existing) |
| string |
|
| string | New deadline ( |
| string[] | Tags to add |
complete_todo
Mark a todo as complete.
{ "id": "ABC123" }delete_todo
Move a todo to Trash (recoverable from Things 3 Trash).
{ "id": "ABC123" }License
MIT
Available Tools
10 toolsthings3_complete_todoComplete Things 3 TodoAIdempotent
Mark a todo as complete in Things 3.
Args:
id: The unique ID of the todo to complete (required)
Returns: { success, id, name }
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The unique ID of the todo to complete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool is idempotent and not destructive, so the safety profile is clear. The description adds no extra behavioral context beyond stating the action, such as side effects or permissions.
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 extremely concise: two sentences for the action and one for Args, plus a Returns note. Every sentence is necessary and front-loaded with the core purpose.
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 action and rich annotations, the description is mostly complete. It includes the return shape {success, id, name}, which compensates for the lack of an output schema. Missing details like what 'success' indicates or the state change after completion are minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description's parameter info ('The unique ID of the todo to complete (required)') largely mirrors the schema. It adds no additional meaning or context beyond what the schema already provides.
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 'Mark as complete' with clear resource 'todo in Things 3'. It clearly distinguishes from sibling tools like things3_create_todo, things3_update_todo, and things3_delete_todo.
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 use when a todo needs to be marked complete, but it does not provide explicit guidance on when not to use or suggest alternatives (e.g., using update_todo for partial completion). No prerequisites or context are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
things3_create_projectCreate Things 3 ProjectA
Create a new project in Things 3.
Args:
title: Title of the project (required)
notes: Markdown notes/description
areaId: ID of the area to assign this project to (get IDs from things3_get_areas)
tags: Array of tag names to apply (tags must already exist in Things 3)
when: Schedule — "today", "evening", "tomorrow", "someday", or YYYY-MM-DD
deadline: Deadline date in YYYY-MM-DD format
Returns: { id, name } of the created project
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Tag names to apply | |
| when | No | Schedule: "today", "evening", "tomorrow", "someday", or YYYY-MM-DD | |
| notes | No | Notes/description for the project | |
| title | Yes | Title of the project | |
| areaId | No | ID of the area to assign this project to | |
| deadline | No | Deadline date in YYYY-MM-DD format |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations show no destructive or read-only hints. Description adds return format ({id, name}) and a key precondition (tags must already exist), enhancing transparency beyond annotations.
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?
Concise docstring with clear purpose, structured Args, and Returns line. No wasted words; front-loaded with the action.
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?
Covers all parameters, return value, and a key precondition (tags existence). No output schema, so return info is helpful. Could mention error handling but adequate for a simple creation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds practical guidance: examples for 'when' values and directs user to things3_get_areas for areaId, going beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description explicitly states 'Create a new project in Things 3', specifying the verb and resource. It clearly distinguishes from sibling tools like things3_create_todo, which creates a todo instead.
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?
Context is clear: this tool is for creating projects, while siblings handle todos. No explicit 'when not to use' but the grouping makes usage obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
things3_create_todoCreate Things 3 TodoA
Create a new todo in Things 3.
Supports title, notes, scheduling, deadline, tags, project assignment, heading placement, and checklist items.
Args:
title: Title of the todo (required)
notes: Markdown notes/description
when: Schedule — "today", "evening", "tomorrow", "someday", or a date (YYYY-MM-DD)
deadline: Deadline date in YYYY-MM-DD format
tags: Array of tag names to apply (tags must already exist in Things 3)
projectId: ID of the project to add this todo to (get IDs from things3_get_projects)
heading: Heading within the project to place this todo under (requires projectId)
checklistItems: Array of checklist item strings
Returns: { id, name } of the created todo
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Tag names to apply | |
| when | No | Schedule: "today", "evening", "tomorrow", "someday", or YYYY-MM-DD | |
| notes | No | Notes/description for the todo | |
| title | Yes | Title of the todo | |
| heading | No | Heading within the project to place this todo under | |
| deadline | No | Deadline date in YYYY-MM-DD format | |
| projectId | No | ID of the project to add this todo to | |
| checklistItems | No | Checklist items to add to the todo |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false (write operation) and destructiveHint=false (not destructive), which aligns with creation. The description adds that it returns {id, name}, but does not elaborate on side effects like idempotency or notifications. Given the tool's nature, this is 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 concise and well-structured: a summary sentence, a list of arguments with brief explanations, and a return note. Every sentence adds value without redundancy.
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 8 parameters and no output schema, the description covers all parameters, explains return type ({id, name}), and provides usage hints (e.g., 'tags must already exist'). No gaps remain for an AI agent to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds significant value by detailing the 'when' format (today, evening, YYYY-MM-DD), requiring tags to exist, projectId from get_projects, heading requiring projectId, and checklistItems as strings. This goes beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it creates a new todo in Things 3, lists supported features (title, notes, scheduling, etc.), and distinguishes it from sibling tools like complete, delete, update. The verb 'create' and resource 'todo' are specific.
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 the tool (to create a todo) and provides context via sibling tool names. However, it does not explicitly state when not to use it or compare with alternatives. It is clear enough for an AI agent given the sibling context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
things3_delete_todoDelete Things 3 TodoADestructive
Move a todo to the Trash in Things 3.
This does NOT permanently delete it — the todo can be recovered from Trash inside Things 3.
Args:
id: The unique ID of the todo to trash (required)
Returns: { success, id, name }
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The unique ID of the todo to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true, signaling mutation. The description adds value by clarifying the exact nature of the destruction (move to Trash, not permanent delete) and the return format, going beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: three sentences plus an args/returns list. Every sentence adds essential information, and the key behavioral note (non-permanent) 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 simple tool with one required parameter and no output schema, the description covers purpose, behavior, parameter details, and return format comprehensively. No additional information 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 coverage is 100% with the 'id' parameter description matching the tool's args section. The description does not add new semantics beyond what the schema already provides, so a baseline score of 3 is appropriate.
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 verb 'Move to the Trash' and the resource 'a todo in Things 3'. It distinguishes from sibling tools like things3_complete_todo and things3_update_todo by specifying the action (trashing versus completing or updating).
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 explains that the todo is not permanently deleted and can be recovered from Trash, providing context for when this tool is appropriate. While it does not explicitly compare to alternatives, the intent is clear given sibling tool names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
things3_get_areasList Things 3 AreasARead-onlyIdempotent
List all areas of responsibility in Things 3.
Returns area IDs, names, and tags. Use area IDs to filter todos or assign projects to an area.
Returns: Array of { id, name, tags }
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, non-destructive. Description adds specific return fields and how IDs are used, enhancing beyond annotations. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences: purpose, return fields, usage. No redundancy or fluff.
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?
Even without output schema, description fully explains return structure ('Array of { id, name, tags }') and practical usage. Complete for a list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters (0 required). Schema coverage is 100%, so description needs no additional parameter info. Baseline 4 for zero 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?
Clearly states 'List all areas of responsibility in Things 3' and specifies return data (IDs, names, tags). Distinguishes from sibling tools like things3_get_projects and things3_get_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?
Provides context on when to use the results ('Use area IDs to filter todos or assign projects to an area'), but does not explicitly exclude other scenarios or mention alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
things3_get_projectsList Things 3 ProjectsARead-onlyIdempotent
List all projects in Things 3 with pagination.
Returns projects with their status, area, tags, and dates. Use the returned project IDs to filter todos or assign new todos to a project.
Args:
limit: Max results to return (default 50, max 200)
offset: Number of results to skip for pagination (default 0)
Returns: { items: Project[], total_available, offset, limit, has_more }
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return (default 50) | |
| offset | No | Number of results to skip for pagination |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds behavioral context such as returning fields (status, area, tags, dates) and pagination details, which are not covered by annotations. No contradictions.
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 concise, front-loaded with the main purpose, followed by usage advice, parameter details, and return format. Every sentence adds value with no redundancy.
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 list tool with no output schema, the description adequately explains the return format and pagination. However, it could be more explicit about the fields within a Project object, but the given fields (status, area, tags, dates) provide sufficient context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with both parameters described. The description adds value by explaining the response structure and suggesting how to use the returned IDs, which goes beyond the schema definitions.
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 'List all projects in Things 3 with pagination,' specifying the verb 'List' and the resource 'projects.' It distinguishes from sibling tools like things3_get_areas and things3_get_tags by explicitly focusing on projects.
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?
Provides guidance to use returned project IDs for filtering todos or assigning new todos, but does not explicitly state when to use this tool over siblings or when not to use it. Lacks alternatives or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
things3_get_tagsList Things 3 TagsARead-onlyIdempotent
List all tags defined in Things 3.
Returns tag IDs and names. Use tag names to filter todos or apply tags when creating/updating todos.
Returns: Array of { id, name }
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and destructiveHint=false; the description adds that it returns IDs and names and how tags are used, providing context beyond the annotations.
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 three concise sentences, each serving a purpose: stating the function, explaining usage, and specifying the return format. No 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 tool's simplicity (0 parameters, read-only list), the description fully covers the purpose, usage, and return format, meeting the needs for agent selection and 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?
There are no parameters in the input schema, so no additional parameter info is needed. The description adds value by explaining the return format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and resource 'tags' within 'Things 3', distinguishing it from sibling tools like things3_get_projects or things3_get_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?
It explains that tag names can be used to filter todos or apply tags when creating/updating todos, but does not explicitly mention when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
things3_get_todoGet Things 3 TodoARead-onlyIdempotent
Get a single todo by its ID from Things 3.
Returns full details including title, notes, checklist items, due date, tags, project, and area.
Args:
id: The unique Things 3 todo ID
Returns: Todo object with all fields
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The unique ID of the todo in Things 3 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds value by listing the returned fields (title, notes, checklist items, etc.), providing useful behavioral context beyond annotations.
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?
Extremely concise: one sentence for purpose, one for return details, one for args, one for returns. All sentences are necessary and 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 the tool's simplicity (1 param, no nested objects, rich annotations), the description fully covers purpose, input, and output expectations. No gaps identified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with the 'id' parameter already described. The description adds minimal extra detail ('The unique Things 3 todo ID'), not exceeding the schema's 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 clearly states 'Get a single todo by its ID', specifying the verb and resource. It distinguishes from the sibling 'things3_get_todos' which retrieves multiple 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?
Implicit usage context is clear: use when you need a specific todo by ID. No explicit when-not or alternatives, but the sibling set makes it evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
things3_get_todosList Things 3 TodosARead-onlyIdempotent
List todos from Things 3 with optional filters and pagination.
Returns todos matching the specified criteria. Use "status" to filter by list (inbox, today, upcoming, anytime, someday, logbook). Combine with projectId, areaId, tag, or search filters to narrow results.
Args:
status: Filter by Things 3 list name
projectId: Filter by project ID (get IDs from things3_get_projects)
areaId: Filter by area ID (get IDs from things3_get_areas)
tag: Filter by tag name (get names from things3_get_tags)
search: Case-insensitive substring match against title and notes
limit: Max results to return (default 50, max 200)
offset: Number of results to skip for pagination (default 0)
Returns: { items: Todo[], total_available, offset, limit, has_more }
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Filter by tag name | |
| limit | No | Max results to return (default 50) | |
| areaId | No | Filter by area ID | |
| offset | No | Number of results to skip for pagination | |
| search | No | Case-insensitive substring match against title and notes | |
| status | No | Filter by Things 3 list | |
| projectId | No | Filter by project ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds pagination behavior (default limit, max, offset, has_more) and search semantics (case-insensitive substring). No contradictions.
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?
Concise yet informative. Opens with a clear summary, then a paragraph on usage, followed by a structured list of parameters. Every sentence adds necessary detail without redundancy.
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 7 optional parameters and no output schema, the description covers all key aspects: filtering, pagination, return format, and how to get related IDs. It fully equips an agent to use the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds value by explaining how to obtain IDs from related tools (things3_get_projects, etc.) and clarifying search is case-insensitive substring. This helps an agent use parameters correctly.
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 'List todos from Things 3' with optional filters and pagination. It distinguishes from sibling tools like things3_get_todo (single todo) and things3_create_todo, etc.
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?
Provides clear guidance on when to use each filter and references sibling tools for getting IDs (things3_get_projects, things3_get_areas, things3_get_tags). Does not explicitly state when not to use this tool, but that is implied by sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
things3_update_todoUpdate Things 3 TodoAIdempotent
Update an existing todo in Things 3 by ID.
Only provided fields are updated; omitted fields are left unchanged. Note: tags specified in addTags are added to existing tags, not replaced.
Args:
id: The unique ID of the todo to update (required)
title: New title
notes: New notes (replaces existing notes via URL scheme — append manually if needed)
when: Reschedule — "today", "evening", "tomorrow", "someday", or YYYY-MM-DD
deadline: New deadline in YYYY-MM-DD format
addTags: Tag names to add to the todo
completed: Set to true to mark complete, false to mark incomplete
Returns: { success, id, name }
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The unique ID of the todo to update | |
| when | No | Reschedule: "today", "evening", "tomorrow", "someday", or YYYY-MM-DD | |
| notes | No | New notes (replaces existing) | |
| title | No | New title | |
| addTags | No | Tag names to add to the todo | |
| deadline | No | New deadline in YYYY-MM-DD format | |
| completed | No | Set true to complete, false to uncomplete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate idempotentHint=true and destructiveHint=false, which the description supports by describing partial, non-destructive updates. The description adds useful behavioral details: notes replacement behavior, tag appending, and a note about URL scheme. No contradiction.
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 concise, well-structured with a clear purpose sentence followed by bullet-point arguments. No unnecessary words; every sentence adds value.
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 7 parameters and no output schema, the description covers update semantics, partial update behavior, tag behavior, and return format ({ success, id, name }). It is complete for its complexity.
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 schema descriptions (100% coverage), but the description adds extra meaning: for notes it warns about replacement, for addTags it clarifies appending behavior, and for completed it specifies boolean behavior.
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 'Update an existing todo in Things 3 by ID,' specifying the verb (update) and resource (todo). It distinguishes from siblings like things3_create_todo and things3_complete_todo by its focus on updating existing items.
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 explains that only provided fields are updated and omitted fields are left unchanged, giving clear usage context. It also notes tag behavior. However, it does not explicitly compare to alternatives like things3_complete_todo, so it loses one point.
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.
10 tool updates
v1.0.0- First observed
things3_complete_todo - First observed
things3_create_project - First observed
things3_create_todo - First observed
things3_delete_todo - First observed
things3_get_areas - First observed
things3_get_projects - First observed
things3_get_tags - First observed
things3_get_todo - First observed
things3_get_todos - First observed
things3_update_todo
TDQS
Scored across 10 tools
Each tool targets a distinct operation on clearly separate entities (todos, projects, areas, tags). No two tools perform the same function, and the slight overlap between complete_todo and update_todo with completed=true is mitigated by the dedicated convenience tool.
All tools follow a strict `things3_<verb>_<noun>` pattern. Verbs are consistently in imperative form (create, get, update, delete, complete), and nouns are singular or plural appropriately. No mixing of styles or irregular names.
With 10 tools covering the basic lifecycle of tasks and supporting entities, the count is well-scoped for a task management MCP server. It provides enough functionality without being bloated or too sparse.
Core CRUD for todos is complete, and project/area/tag retrieval is present. However, there is no update_project, delete_project, or get_single_project endpoint, and the update_todo lacks a projectId parameter, creating minor gaps for project management workflows.
Maintenance
Related MCP Connectors
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
- mcpOAuthnet.todoist
Official Todoist MCP server for AI assistants to manage tasks, projects, and workflows.
Related MCP Servers
- AlicenseAqualityCmaintenanceAn MCP server that allows AI assistants like Claude Code, Claude Desktop, and Cursor to interact with Things.app on macOS, enabling task creation, updates, viewing, scheduling, and organization through natural language.616 npm3MIT
- AlicenseAqualityDmaintenanceAn MCP server for Things 3 on macOS that enables AI assistants to create, read, update, and manage tasks and projects. It utilizes the Things URL scheme for write operations and AppleScript for querying data from the app.157 npm2MIT
- AlicenseBqualityCmaintenanceMCP server that gives AI agents read/write access to your Things3 tasks via the Things API.321Apache 2.0
- AlicenseAqualityDmaintenanceAn MCP server that connects Claude Desktop to Apple Reminders on macOS via AppleScript.57 npmMIT