things-mcp

things-mcp

An MCP server for Things 3 on macOS that enables reading and writing tasks, projects, and more via Claude, using read-only SQLite and the official Things URL scheme.

Category
访问服务器

README

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 things.py Fast, complete, works on large libraries. Read-only cannot corrupt the database.
Writes (create / update / complete) Official things:/// URL scheme 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).

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.)

  1. Copy your token: Things → Settings → General → Enable Things URLs → Manage → copy the token.

  2. Edit ~/Library/Application Support/Claude/claude_desktop_config.json and add the things server (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"
          }
        }
      }
    }
    
  3. Quit Claude Desktop (⌘Q) and reopen.

  4. 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-mcp

Verify

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
list_inbox To-dos in the Inbox
list_today To-dos scheduled for Today (plus overdue)
list_upcoming Scheduled future to-dos
list_anytime To-dos in Anytime
list_someday To-dos in Someday
list_logbook Completed / canceled to-dos
list_todos To-dos filtered by project / area / tag / status / deadline
list_projects Projects (optionally by area)
list_areas All areas
list_tags All tag titles
search Search to-dos/projects by title and notes
get_item Fetch one item by uuid (with checklist items)
list_recent Items created within an offset like 3d, 1w, 1y

Writes

Tool Description
add_todo Create a to-do (title, notes, when, deadline, tags, checklist, list, heading)
add_project Create a project, optionally pre-filled with to-dos
update_todo Update a to-do by id
update_project Update a project by id
complete_todo Mark a to-do complete
cancel_todo Mark a to-do canceled

Diagnostics

Tool Description
doctor 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 add the 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 needed

Read tests run against a Things-schema fixture database vendored from things.py (see tests/fixtures/README.md).

Credits

License

MIT — see LICENSE.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选