The Things MCP server enables AI assistants to fully manage Tasks and Projects in Things 3 on macOS, supporting creation, reading, updating, and automation.
Write Operations
add-todo— Create to-dos with title, notes, scheduled date, deadline, tags, checklist items, and project/area assignment (supports multiple at once)add-project— Create projects with initial to-dos, notes, dates, tags, and area assignmentupdate-todo— Modify a to-do's title, notes, dates, tags, checklist, status (complete/canceled), or list assignment (requires auth token)update-project— Update a project's title, notes, dates, tags, area, or status (requires auth token)add-json— Create complex nested structures (projects with headings, to-dos, checklist items) using Things' JSON command format
Read Operations
get-todos— Retrieve to-dos by built-in list (Inbox, Today, Upcoming, Someday, etc.), project, area, or tagget-todo-by-id/get-project-by-id— Fetch a specific to-do or project by IDget-projects/get-areas/get-tags— List all projects, areas, or tagssearch-todos— Search to-dos by title or notes contentget-recent-todos— Get recently modified to-dos within a configurable number of days
Navigation & Search
show— Open Things to a specific list, project, area, tag, or individual to-dosearch— Open the Things search screen with an optional query
Automation
reschedule-distant-todos— Automatically move far-future tasks out of the Today list, with configurable threshold/buffer days and adryRunpreview mode (requires auth token)
Requirements: macOS, Things 3 (with URL Scheme enabled), Node.js >= 18. Compatible with Claude Desktop, Cursor, Codex, and Gemini CLI.
Enables management of the Things 3 task manager on macOS, allowing for the creation, retrieval, and modification of to-dos, projects, areas, and tags through AppleScript and URL schemes.
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., "@Things MCPAdd 'Review project proposal' to my Today list with a reminder at 4pm"
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.
Things App MCP
An MCP (Model Context Protocol) server for Things 3 on macOS. Enables AI assistants like Claude to create, read, update, and manage your tasks directly in Things.
Features
Write Operations (Things URL Scheme)
Tool | Description |
| Create a new to-do with title, notes, dates, tags, checklist, project/area assignment |
| Create a new project with to-dos, notes, dates, tags, area assignment |
| Update an existing to-do (requires auth-token) |
| Update an existing project (requires auth-token) |
| Navigate to a list, project, area, tag, or specific to-do |
| Open the Things search screen |
| Create complex structures via the Things JSON command |
Read Operations (AppleScript/JXA)
Tool | Description |
| Get to-dos from a list (Inbox, Today, etc.), project, area, or by tag |
| Get a specific to-do by its ID |
| Get all projects |
| Get a specific project by its ID |
| Get all areas |
| Get all tags |
| Search to-dos by title/notes content |
| Get recently modified to-dos |
Automation (Batch Operations)
Tool | Description |
| Move distant-deadline to-dos out of Today. Finds items whose deadline is far away and reschedules their start date to a few days before the deadline, keeping your Today list focused on what matters now. Requires auth-token. |
Key behaviors of reschedule-distant-todos:
Items explicitly scheduled for today (
activationDate= today) are always preservedUses a single JSON batch update for atomic, reliable rescheduling
daysThreshold(default: 7) controls how many days away a deadline must be to qualifybufferDays(default: 3) controls how many days before the deadline to set the new start dateSupports
dryRunmode to preview changes without applying themAnnotated with
destructiveHint: trueso MCP clients can prompt for user confirmation
Requirements
macOS (required for AppleScript/JXA and
opencommand)Things 3 installed
Node.js >= 18
Things URL Scheme enabled (Things > Settings > General > Enable Things URLs)
Installation
# Clone and build
git clone <repository-url>
cd things-app-mcp
npm install
npm run buildOr install globally:
npm install -g things-app-mcpConfiguration
Claude Desktop
Add to your Claude Desktop configuration file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"things": {
"command": "npx",
"args": ["-y", "things-app-mcp@latest"]
}
}
}Cursor
Add to your Cursor MCP settings (.cursor/mcp.json):
{
"mcpServers": {
"things": {
"command": "npx",
"args": ["-y", "things-app-mcp@latest"]
}
}
}Codex
Add to ~/.codex/config.toml:
[mcp_servers.things]
command = "npx"
args = ["-y", "things-app-mcp@latest"]
startup_timeout_sec = 20
tool_timeout_sec = 120Gemini CLI
Run the following command to register the MCP server:
gemini mcp add things npx -y things-app-mcp@latestAuth Token Configuration
To use update-todo, update-project, and reschedule-distant-todos, you need your Things auth-token.
Option 1: Environment Variable (Recommended)
Set the THINGS_AUTH_TOKEN environment variable in your MCP client configuration. This avoids needing to pass the token with every request.
Claude Desktop:
{
"mcpServers": {
"things": {
"command": "npx",
"args": ["-y", "things-app-mcp@latest"],
"env": {
"THINGS_AUTH_TOKEN": "your-token-here"
}
}
}
}Codex (~/.codex/config.toml):
[mcp_servers.things]
command = "npx"
args = ["-y", "things-app-mcp@latest"]
startup_timeout_sec = 20
tool_timeout_sec = 120
[mcp_servers.things.env]
THINGS_AUTH_TOKEN = "your-token-here"Gemini CLI: Set the environment variable in your shell configuration or pass it when running:
export THINGS_AUTH_TOKEN="your-token-here"Option 2: Parameter
If the environment variable is not set, you must pass the token as the authToken parameter when calling update tools:
Open Things on Mac
Go to Things > Settings > General > Enable Things URLs > Manage
Copy your authorization token
Pass it as the
authTokenparameter when calling update tools
Usage Examples
Adding a To-Do
"Add a to-do called 'Buy groceries' scheduled for today with tags 'Errand'"The AI will call add-todo with:
{
"title": "Buy groceries",
"when": "today",
"tags": "Errand"
}Creating a Project with To-Dos
"Create a project called 'Launch Website' in the Work area with to-dos: Design mockups, Build frontend, Deploy"The AI will call add-project with:
{
"title": "Launch Website",
"area": "Work",
"todos": "Design mockups\nBuild frontend\nDeploy"
}Complex Project via JSON
"Create a vacation planning project with headings for Travel, Accommodation, and Activities"The AI will call add-json with structured JSON data containing nested headings and to-dos.
Reading To-Dos
"What's on my Today list?"The AI will call get-todos with { "list": "Today" } and return the structured data.
Updating a To-Do
"Mark the 'Buy groceries' todo as complete"The AI will first search/get the to-do to find its ID, then call update-todo with the auth-token.
Cleaning Up Today
"My Today list is too cluttered. Move everything that isn't due soon to later."The AI will call reschedule-distant-todos with { "dryRun": true } first to preview, then apply:
{
"daysThreshold": 7,
"bufferDays": 3,
"dryRun": false
}Items with deadlines 7+ days away will be rescheduled to 3 days before their deadline. Items you explicitly set to today are always preserved.
Previewing Reschedule Changes
"Show me which todos would be moved out of Today without actually changing anything"The AI will call reschedule-distant-todos with { "dryRun": true } and return a list of what would change.
Things URL Scheme Reference
This MCP server implements the full Things URL Scheme v2:
Date Formats
Format | Example | Description |
Named |
| Built-in schedule options |
Date |
| Specific date |
Date + Time |
| Date with reminder |
Natural language |
| English natural language (parsed by Things) |
Built-in List IDs (for show tool)
inbox, today, anytime, upcoming, someday, logbook, tomorrow, deadlines, repeating, all-projects, logged-projects
JSON Command Object Types
Type | Description |
| A task with title, notes, when, deadline, tags, checklist-items |
| A project with title, notes, items (to-dos and headings) |
| A section heading within a project |
| A checklist item within a to-do |
Architecture
things-app-mcp/
src/
index.ts # MCP server entry point with all tool registrations
things-url.ts # Things URL scheme builder (URL construction)
applescript.ts # AppleScript/JXA executor (read operations)
scripts/
test-client.js # Basic MCP server connectivity test
test-all-tools.js # Integration tests for all 16 tools
test-unit.js # Unit tests for logic, URL builders, and edge cases (122 tests)
dist/ # Compiled JavaScript output
package.json
tsconfig.jsonHow It Works
Write operations construct
things:///URLs and open them via macOSopencommand. Things processes the URL and creates/updates items accordingly.Read operations use JXA (JavaScript for Automation) scripts executed via
osascriptto query the Things database directly and return structured JSON data.
Development
# Install dependencies
npm install
# Build
npm run build
# Watch mode
npm run dev
# Run directly
npm startTesting
See TESTING.md for full details.
# Unit tests (date utilities, URL builders, reschedule logic, edge cases)
# Runs anywhere - no macOS or Things 3 required
node scripts/test-unit.js
# Integration tests (all 16 tools via MCP protocol)
# Requires macOS + Things 3 for full coverage
npm run test:tools
# With write operations enabled
THINGS_MCP_TEST_ALLOW_WRITES=1 npm run test:tools
# Full suite with auth token
THINGS_AUTH_TOKEN=your-token \
THINGS_MCP_TEST_TODO_ID=some-id \
THINGS_MCP_TEST_PROJECT_ID=some-id \
npm run test:toolsLicense
MIT
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.