A production-ready Model Context Protocol (MCP) server for Things 3, enabling AI assistants and automation platforms to interact with your task management system through natural language.
β οΈ Important: Review the Privacy Notice and Terms of Use before installation.
This MCP server provides seamless integration between Things 3 and AI assistants like Claude Desktop, allowing you to manage tasks, projects, and areas using natural language. Built with the modern FastMCP framework, it includes production-ready reliability features like intelligent caching, rate limiting, circuit breakers, and comprehensive error handling.
- π£οΈ Natural Language Interface: Create and manage tasks conversationally through AI assistants
- π Smart Insights: Analyze productivity patterns and project status with AI-powered queries
- β‘ Production-Ready: Built-in caching, rate limiting, and automatic retry logic
- π Privacy-First: All operations are local-only; your task data never leaves your Mac
- π Seamless Integration: Works directly with your existing Things 3 database
- macOS (required - uses AppleScript and macOS
opencommand) - Things 3 for macOS with scripting permissions enabled
- Python 3.12+
- uv package manager (recommended) or standard Python tooling
Note: Docker is not supported due to macOS VM limitations preventing access to host-level AppleScript and URL scheme handlers.
- List Access: Inbox, Today, Upcoming, Anytime, Someday, Logbook, and Trash
- Task Management: Create, update, search, and organize todos with full metadata
- Project & Area Management: Organize tasks into projects and areas with nesting support
- Tag Operations: Create, assign, and filter by tags (auto-creates missing tags)
- Checklist Support: Include checklist items in task creation
- Advanced Search: Filter by status, dates, tags, areas, and custom queries
- Intelligent Caching: Configurable TTL-based caching for read operations
- Circuit Breaker: Automatic failure detection and recovery
- Rate Limiting: Prevents API abuse and throttles operations safely
- Dead Letter Queue: Tracks failed operations for debugging (
things_dlq.json) - Retry Logic: Exponential backoff with jitter for transient failures
- Structured Logging: Privacy-aware logging with sensitive data redaction
- FastMCP Framework: Modern, type-safe MCP implementation
- Rich Metadata: Assistants receive instructions, capabilities, and limitations
- HTTP Transport: RESTful interface on
http://127.0.0.1:8009(configurable) - Tool Annotations: Optimization hints for read-only, idempotent, and destructive operations
-
Review Privacy & Terms Confirm you've read the Privacy Notice and Terms of Use.
-
Install uv (recommended)
pipx install uv # or: pip install uv -
Clone and Install
git clone https://github.com/CaseyRo/things-fastmcp.git cd things-fastmcp uv pip install -e .
The helper script will bootstrap a virtual environment automatically if you skip this step.
-
Configure Authentication
python configure_token.py
Follow the prompts to set up your Things 3 authentication token.
Option 1: Production Mode (recommended)
uv run server- Binds to
http://127.0.0.1:8009by default (localhost-only) - Uses Rich for colorful terminal output
- Auto-manages virtual environment and dependencies
Option 2: Development Mode
uv run devSame as production mode but with development-friendly settings.
Option 3: Manual Development Mode (with auto-reload)
mcp dev src/things_mcp/things_fast_server.pyUses the MCP development helper for automatic reloading on file changes.
Environment Variables:
# Bind to all interfaces (β οΈ exposes server to network)
export THINGS_FASTMCP_HOST=0.0.0.0
# Use custom port
export THINGS_FASTMCP_PORT=9000Using .env File:
Create a .env file in the project root for easy configuration:
# Copy the example file
cp .env.example .env
# Edit .env with your preferred settings
THINGS_FASTMCP_HOST=127.0.0.1
THINGS_FASTMCP_PORT=8009Environment Variable Override:
# Override configuration when running
THINGS_FASTMCP_HOST=0.0.0.0 THINGS_FASTMCP_PORT=9000 uv run serverThe server exposes 19 tools organized into logical groups:
get-inbox- Retrieve items in Inboxget-today- Get tasks due todayget-upcoming- View upcoming scheduled tasksget-anytime- List Anytime tasksget-someday- List Someday/Maybe itemsget-logbook- Access completed items (configurable period)get-trash- View deleted items
get-todos- List all todos (optionally filtered by project)add-todo- Create new tasks with full metadataupdate-todo- Modify existing tasks
get-projects- List all projectsget-areas- List all areasadd-project- Create new projectsupdate-project- Modify existing projects
get-tags- List all tagsget-tagged-items- Filter items by tag
search-todos- Search by title or notessearch-advanced- Multi-criteria filteringsearch-items- Open search in Things appshow-item- Display specific item or list in Things
get-recent- Recently created itemsget-cache-stats- Cache performance metrics
Each tool includes detailed docstrings visible to AI assistants, with parameter descriptions and usage examples.
src/things_mcp/
βββ fast_server.py # FastMCP server with tool definitions
βββ handlers.py # Tool handlers with reliability features
βββ url_scheme.py # Things URL scheme builders
βββ applescript_bridge.py # AppleScript execution layer
βββ formatters.py # Output formatting
βββ cache.py # Caching decorator (@cached)
βββ utils.py # Circuit breaker, rate limiter, DLQ
βββ logging_config.py # Structured logging with redaction
βββ tag_handler.py # Automatic tag creation
Data Flow:
- MCP client β FastMCP server receives tool call
- Tool handler validates params and checks circuit breaker
- Read operations β things-py (SQLite) β cache β format response
- Write operations β URL scheme builder β macOS
opencommand β Things app - Errors β retry logic β circuit breaker β dead letter queue if needed
Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"things": {
"command": "uv run server"
}
}
}AI assistants automatically receive:
- Instructions: Available tools, limitations, and privacy reminders
- Website: Link to this repository for documentation
- Icon: OpenMoji notepad icon for easy recognition
mcp dev things_fast_server.pyEnables auto-reload on file changes using the MCP CLI development helper.
Before committing changes:
# Lint and format
ruff check .
ruff format .
# Run tests
pytest
# Check test coverage
pytest --cov=src/things_mcpSee openspec/project.md for:
- Code style guidelines
- Architecture patterns
- Type hints conventions
- Logging best practices
- Testing requirements
Server won't start:
- Verify Things 3 is installed and running
- Check Python version:
python --version(requires 3.12+) - Review logs for "Things app not available" messages
Operations failing:
- Check circuit breaker status in logs
- Review Dead Letter Queue:
cat things_dlq.json - Verify Things has automation permissions (System Preferences β Security & Privacy)
Performance issues:
- Check cache hit rate: Use
get-cache-statstool - Review rate limiter logs for throttling
- Increase cache TTL in
cache.pyfor slower-changing data
-
Enable Debug Logging Edit
src/things_mcp/logging_config.pyand setconsole_level="DEBUG" -
Monitor Dead Letter Queue Failed operations are logged to
things_dlq.jsonwith full context -
Check Circuit Breaker State Look for "Circuit breaker is open" messages in logs
-
Cache Performance Use the
get-cache-statsMCP tool to analyze hit rates and optimization opportunities -
Inspect AppleScript Execution Check logs for
osascriptsubprocess errors
Docker containers on macOS run in a lightweight VM that lacks access to host-level AppleScript and URL scheme handlers. The server requires direct macOS execution to interact with Things 3. Use uv run server directly on your Mac instead.
Breaking Change: Removed legacy MCP implementation.
If you're upgrading from 1.x:
- Update MCP client configs:
things_server.pyβthings_fast_server.py - All tool names and signatures remain unchanged
- You now get all reliability features automatically (caching, circuit breaker, retry logic)
See CHANGELOG.md for complete details.
Contributions are welcome! This project uses the OpenSpec workflow for spec-driven development.
Before contributing:
- Read openspec/project.md for project conventions
- Check existing issues and specs
- Follow the change proposal workflow for new features
- Run
ruff check .andpytestbefore submitting PRs
If you were previously using the bash script (./run_things_fastmcp.sh), here's how to migrate:
Old way:
./run_things_fastmcp.sh
./run_things_fastmcp.sh --host 0.0.0.0 --port 9000New way:
uv run server
THINGS_FASTMCP_HOST=0.0.0.0 THINGS_FASTMCP_PORT=9000 uv run serverBenefits of the new approach:
- β Simpler command syntax
- β Better dependency management with UV
- β
Configuration via
.envfiles - β No bash script maintenance overhead
MIT License - see LICENSE for details.
This project builds on the excellent work of:
- Harald LindstrΓΈm - Original things-mcp implementation
- Yaroslav Krempovych - FastMCP modernization
- Cultured Code - Things 3 app and things-py library
- Anthropic - Model Context Protocol specification and FastMCP framework
- Documentation: README.md
- Issues & Support: GitHub Issues
- Privacy Policy: PRIVACY.md
- Terms of Use: TERMS_OF_USE.md
- MCP Specification: Model Context Protocol
- Things 3 URL Scheme: Official Documentation