things-mcp
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., "@things-mcp Show 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.
things-mcp
A Model Context Protocol server for Things 3 on macOS. It lets Claude (Claude Code and Claude Desktop) read and write your tasks.
How it works — the reliable combination:
Operation | Mechanism | Why |
Reads (todos, projects, areas, tags, search) | Read-only SQLite via | Fast, complete, works on large libraries. Read-only cannot corrupt the database. |
Writes (create / update / complete) | Official | Cultured Code's sanctioned write path. Never touches the DB directly. |
This split is deliberate: Things' own guidance warns that writing to its database can cause data loss, so this server never does. Reads open the DB read-only; every mutation goes through the URL scheme.
Read backends: SQLite vs AppleScript
Reads have two backends. By default the server auto-selects: SQLite if it can reach the database (Full Disk Access granted), otherwise AppleScript.
SQLite (default when FDA granted) | AppleScript (fallback) | |
Full Disk Access | Required | Not needed (uses Automation permission, auto-prompted) |
Things must be running | No | Yes |
Speed | Instant | Fast for most views; a few seconds for large all-todo lists |
Field coverage | Complete | Core fields (no checklist items, no per-item project/area) |
Why this matters for Claude Desktop: granting Full Disk Access to Claude.app does not always propagate to the process it spawns, so SQLite can stay blocked. The AppleScript backend sidesteps that entirely — set THINGS_MCP_BACKEND=applescript (below) and you only need the one-click Automation prompt.
Configuration (env vars)
THINGS_MCP_BACKEND—auto(default) ·sqlite·applescript.THINGS_AUTH_TOKEN— the Things URL token for updates/complete/cancel. Only needed on the AppleScript backend (where the token can't be read from the DB). Copy it from Things → Settings → General → Enable Things URLs → Manage.THINGSDB— override the database path (rarely needed; it's auto-discovered).
Related MCP server: Things MCP
Requirements
macOS (Things is Mac/iOS only; this server must run on the same Mac as Things).
Things 3, opened at least once so its database exists.
Python ≥ 3.11 and
uv.
Setup — do this first (it's the #1 reason task servers "don't work")
1. Grant Full Disk Access (required for reads)
The Things database lives in a macOS-protected container. Without Full Disk Access, macOS blocks all reads with Operation not permitted — and naive servers silently report "no tasks found" instead of explaining why.
Grant it to the app that launches this server:
Claude Code → your terminal app (Terminal, iTerm2, etc.).
Claude Desktop →
Claude.app.
System Settings → Privacy & Security → Full Disk Access → enable that app, then fully quit and reopen it.
2. Enable Things URLs (required for writes)
Things → Settings → General → Enable Things URLs. This lets the server create and update items, and provides the auth token (read automatically — you never paste it).
Install
No clone required — uv builds and runs it straight from GitHub.
Claude Code
claude mcp add -s user things -- uvx --from git+https://github.com/than/things-mcp things-mcp(-s user makes it available in every project. Drop it to scope the server to the current project only.)
Claude Desktop
Recommended: the AppleScript backend — no Full Disk Access needed, just one Automation click. (On Desktop, Full Disk Access granted to Claude.app often does not reach the process it spawns, so SQLite can stay blocked.)
Copy your token: Things → Settings → General → Enable Things URLs → Manage → copy the token.
Edit
~/Library/Application Support/Claude/claude_desktop_config.jsonand add thethingsserver (paste your token):{ "mcpServers": { "things": { "command": "uvx", "args": ["--from", "git+https://github.com/than/things-mcp", "things-mcp"], "env": { "THINGS_MCP_BACKEND": "applescript", "THINGS_AUTH_TOKEN": "paste-token-here" } } } }Quit Claude Desktop (⌘Q) and reopen.
Ask it "show my Things today" → click Allow on the "uvx wants to control Things" prompt.
Prefer fast SQLite instead? Drop the env block, grant Full Disk Access to Claude.app (and, if reads still fail, to the uvx/interpreter binary), then relaunch.
Local checkout (development)
If you've cloned the repo and want to run your working copy:
claude mcp add -s user things -- uv run --directory /ABSOLUTE/PATH/things-mcp things-mcpVerify
Ask Claude to run the doctor tool. All three checks should pass:
database_found— the Things DB was located.database_readable— Full Disk Access is granted (no TCC block).things_urls_enabled— the auth token is available.
Any failure comes with the exact fix.
Tools
Reads
Tool | Description |
| To-dos in the Inbox |
| To-dos scheduled for Today (plus overdue) |
| Scheduled future to-dos |
| To-dos in Anytime |
| To-dos in Someday |
| Completed / canceled to-dos |
| To-dos filtered by project / area / tag / status / deadline |
| Projects (optionally by area) |
| All areas |
| All tag titles |
| Search to-dos/projects by title and notes |
| Fetch one item by uuid (with checklist items) |
| Items created within an offset like |
Writes
Tool | Description |
| Create a to-do (title, notes, when, deadline, tags, checklist, list, heading) |
| Create a project, optionally pre-filled with to-dos |
| Update a to-do by id |
| Update a project by id |
| Mark a to-do complete |
| Mark a to-do canceled |
Diagnostics
Tool | Description |
| Preflight: DB found? readable (Full Disk Access)? Things URLs enabled? |
Known limitations (v1)
Creating areas or tags isn't supported — the URL scheme can't create them (only AppleScript can). Areas and tags are read-only; you can apply existing tags when adding/updating.
Write confirmation is best-effort. The URL scheme doesn't return the new item's ID, so after an
addthe server reads the list back and tries to match by title. If it can't confirm, it says so rather than inventing an ID.macOS only, by nature.
Development
uv sync
uv run pytest # full suite runs against a vendored fixture DB — no live Things neededRead tests run against a Things-schema fixture database vendored from things.py (see tests/fixtures/README.md).
Credits
Reading is powered by
things.py(MIT).Built against Cultured Code's official docs: URL scheme, JSON command, AppleScript, AI tools & safe integration.
License
MIT — see LICENSE.
Available Tools
8 toolsadd_projectC
Create a project, optionally pre-filled with to-dos.
Inputs: title (required), area, tags, when, +3 more.
add_todoC
Create a to-do. when: today/tomorrow/evening/anytime/someday/yyyy-mm-dd.
Inputs: title (required), list, tags, when, +4 more.
cancel_todoC
Mark a to-do canceled.
Inputs: id (required).
doctorB
Preflight: DB found? readable (Full Disk Access)? Things URLs enabled?
Inputs: no named parameters.
get_itemB
Fetch a single to-do/project/area by uuid (with checklist items).
Inputs: uuid (required).
list_inboxC
To-dos in the Inbox.
Inputs: no named parameters.
list_recentC
Items created within an offset like '3d', '1w', '1y'.
Inputs: offset (required).
update_projectC
Update an existing project by id (requires Things URLs enabled).
Inputs: id (required), tags, when, notes, +4 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 8 tools
Each tool targets a distinct aspect—list_recent for time-based retrieval, list_inbox for inbox, get_item for individual items, cancel_todo for state change, add_todo/add_project for creation, update_project for project updates, and doctor for diagnostics—no overlap in purpose.
Most tools follow a verb_noun pattern (list_recent, cancel_todo, add_todo, etc.), but 'doctor' is a noun and breaks the convention, creating a minor inconsistency.
With 8 tools, the server covers core operations for a task management system without being overwhelming; each tool serves a clear role.
Missing some lifecycle operations: no way to delete items, update to-dos beyond canceling, or list all projects explicitly. Core create/read/cancel is covered, but update and delete are limited.
Maintenance
Related MCP Connectors
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Official Todoist MCP server. Manage tasks and projects. Hosted, no API key needed.
Simple, fast todo app: manage tasks, projects and tags from Claude and other MCP clients.
Zotero MCP server for Claude and ChatGPT: search, citations, safe writes, PDF passages and pages.
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.632 npm3MIT
- AlicenseAqualityCmaintenanceAn 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.1515 npm2MIT
- AlicenseBqualityDmaintenanceMCP server that gives AI agents read/write access to your Things3 tasks via the Things API.321Apache 2.0
- AlicenseNot gradedqualityDmaintenanceA CLI MCP server for Things 3, enabling programmatic access to todos and projects with filtering by due date.4Apache 2.0