The Things App MCP server enables AI assistants to fully manage tasks and projects in Things 3 on macOS, supporting both read and write operations.
Write Operations (via Things URL Scheme)
Create to-dos: Add tasks with title, notes, scheduling dates, deadlines, tags, checklist items, and project/area assignment
Create projects: Add projects with title, notes, dates, tags, area assignment, and initial to-dos
Update to-dos/projects: Modify existing items including status (complete/cancel), title, notes, dates, tags, and assignments (requires auth token)
Add via JSON: Create complex nested structures (projects with headings and to-dos) using the Things JSON command
Navigate/Show: Open a specific list, project, area, tag, or to-do in Things
Search UI: Open the Things search screen with an optional pre-filled query
Read Operations (via AppleScript/JXA)
Get to-dos: Retrieve tasks from built-in lists (Inbox, Today, Upcoming, etc.), projects, areas, or by tag
Get by ID: Fetch a specific to-do or project by its unique ID
Get projects/areas/tags: Retrieve all projects, areas, or tags
Search to-dos: Find tasks by matching text in titles or notes
Get recent to-dos: Retrieve tasks modified within a configurable number of days
Notes:
macOS only
Update operations require an authentication token (configurable via environment variable or parameter)
Compatible with Claude Desktop, Cursor, Codex, Gemini CLI, and other AI tools
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 App MCPAdd a task to buy groceries tomorrow with the tag 'Shopping'"
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.