Releases: ebowman/mcp-server-things
v1.4.4 - Fix Things 3 freezes from SQLite lock contention
Fixed
- Upgraded things.py to v1.0.0 to fix SQLite lock contention with Things 3
- things.py 0.x held open SQLite connections via the
things3module, blocking Things 3's WAL commits during cloud sync - things.py 1.0.0 uses read-only connections with proper cleanup via
weakref.finalize() - Resolves intermittent Things 3 UI freezes caused by
btreeInvokeBusyHandlerblocking on sync commits
- things.py 0.x held open SQLite connections via the
v1.4.3 - Fix Claude API JSON schema error
Fixed
- Fixed Claude API JSON schema error - Removed
Uniontypes from tool return annotations- Claude API rejects schemas with
oneOf/allOf/anyOfat top level - FastMCP generates
oneOffromUnion[...]return type annotations - Changed 5 tools (
get_inbox,get_today,get_upcoming,get_anytime,get_someday) fromUnion[List[Dict], Dict]toDict[str, Any] - These functions already wrap responses via
context_manager.optimize_response(), so the type annotation now matches actual behavior
- Claude API rejects schemas with
Full Changelog: v1.4.2...v1.4.3
v1.4.2 - Consolidated get_upcoming API
Changes
- Consolidated
get_upcomingAPI - Added optionaldaysparameterget_upcoming()- Returns items from Things 3's Upcoming list (unchanged)get_upcoming(days=30)- Returns todos due/activating within 30 days (new)- Removed redundant
get_upcoming_in_daystool - useget_upcoming(days=N)instead - Simpler, more intuitive API with one tool instead of two
Fixed
- Fixed validation error -
get_upcoming(days=30)now works correctly- Previously failed with "Unexpected keyword argument" error
🤖 Generated with Claude Code
v1.4.1 - Checklist API Improvement
Changed
- Checklist API improvement - Changed checklist parameters from newline-delimited strings to List[str]
add_todo(checklist_items=...)now acceptsList[str]instead ofstradd_checklist_items(items=...)now acceptsList[str]instead ofstrprepend_checklist_items(items=...)now acceptsList[str]instead ofstrreplace_checklist_items(items=...)now acceptsList[str]instead ofstr- More idiomatic API design - pass lists directly instead of manually joining with newlines
- Internal conversion to URL scheme format happens transparently
Documentation
- Updated CLAUDE.md with List[str] examples for all checklist operations
- Updated test examples to use list format
Full Changelog: v1.4.0...v1.4.1
v1.4.0 - Full Checklist Support
🎉 What's New in v1.4.0
✨ Full Checklist Support
This release adds complete checklist item support via the Things 3 URL scheme, removing a major limitation from previous versions.
New Features
- Automatic checklist creation -
add_todo()now creates checklists when you provide thechecklist_itemsparameter - Checklist management tools:
add_checklist_items()- Append items to existing checklistsprepend_checklist_items()- Add items to the beginningreplace_checklist_items()- Replace or clear all items
- Smart hybrid approach - Server automatically chooses the best method (URL scheme for checklists, AppleScript otherwise)
Usage Example
```python
Create todo with checklist
add_todo(
title="Grocery Shopping",
checklist_items="Milk\nBread\nEggs\nButter",
when="today"
)
Manage existing checklist
add_checklist_items(todo_id="abc123", items="Cheese\nYogurt")
```
📝 Changes
- Removed previous limitation: Checklists were not supported via AppleScript
- Enhanced documentation with comprehensive checklist examples
- Updated architecture docs with hybrid approach details
🐛 Bug Fixes
- Fixed unit tests to accommodate URL scheme auth token behavior
📊 Regression Test Results
- ✅ All 27 MCP tools tested and passing
- ✅ Full checklist CRUD operations verified
- ✅ 596 unit tests passing
- ✅ Zero regressions detected
Full Changelog: v1.3.2...v1.4.0
v1.3.2 - Critical Bug Fixes
Fixed
-
CRITICAL: Project initial todos not retrieved - Fixed parser consuming multiple records as single field value
- AppleScript parser now correctly handles "missing value" in date fields
- Prevents field bleeding when date values are missing
- All initial todos now properly returned by get_todos(project_uuid=...)
-
HIGH: Summary mode empty preview - Fixed preview showing null IDs and empty names
- Updated to check both uuid/id and title/name dictionary keys
- Summary mode now displays actual todo/project information
- Backwards compatible with different data schemas
Details
Two critical bugs were discovered and fixed during comprehensive regression testing. Both issues affected core functionality and have been verified through the MCP server.
v1.3.1 - Bug fixes and test infrastructure
Fixed
- Bug fix: NoneType error in mode='standard' - Fixed crash when notes field is None
- Added null check before len() operation in context_manager.py
- Affected get_todos() and other operations using standard response mode
- Bug fix: Date field formatting - Fixed §COLON§ markers and field bleeding in dates
- Added comma escaping to AppleScript date formatting
- Prevents date values from breaking field boundaries
- Affects creation_date, modification_date, activation_date, due_date fields
Changed
- Documentation: add_project todos parameter - Corrected CLAUDE.md to reflect that todos parameter works correctly
- Removed incorrect "Known Limitation" entry
- Added usage examples and best practices
Added
- Test infrastructure - Added comprehensive integration and unit test suites
- 17 integration tests with automatic cleanup mechanism
- 27 new unit tests for date utilities and edge cases
- Test fixtures and shared test data
- Integration test documentation and verification tools
Installation
Install via pip:
```bash
pip install mcp-server-things==1.3.1
```
Or upgrade:
```bash
pip install --upgrade mcp-server-things
```
Full Changelog: v1.3.0...v1.3.1
v1.3.0 - State Machine Parser & Performance Improvements
🎉 Things 3 MCP Server v1.3.0
Major release with new state machine parser, performance optimizations, and important bug fixes.
🔧 Changed
- NEW: State machine AppleScript parser - Default parser changed from legacy string manipulation to state machine (BREAKING: fixes bugs)
- New state machine parser is now the default (
use_new_applescript_parser=True) - Legacy parser deprecated with warning messages
- Set
use_new_applescript_parser=Falseto temporarily use legacy parser - Legacy parser will be removed in v2.0.0
- New state machine parser is now the default (
🐛 Fixed
- Bug fix: completion_date parsing - New parser correctly handles completion_date with commas
- Legacy parser left §COMMA§ placeholders (bug)
- New parser correctly parses dates: "Monday, January 15, 2024 at 2:30:00 PM"
- Bug fix: cancellation_date parsing - New parser correctly handles cancellation_date with commas
- Same §COMMA§ placeholder bug fixed
- Dates now properly parsed to ISO format
- Bug fix: Date validation - Added validation for when/deadline parameters across all operations
- Validates dates before sending to AppleScript, preventing silent failures
- Supports relative dates (today, tomorrow, someday) and absolute dates (YYYY-MM-DD)
- Applied to add_todo, update_todo, bulk_update_todos, add_project, update_project
- Bug fix: Status parameter normalization - Handle MCP passing string "None" for status parameter
- MCP clients may pass status="None" as a string instead of null
- Now correctly normalizes to None for get_todos and other operations
- Bug fix: Parameter sanitization - Filter out None values from sanitized parameters
- Prevents None values from being included in validated parameter dictionaries
- Improves reliability of bulk operations and tag handling
✨ Added
- Feature flag: use_new_applescript_parser - Configuration option to control parser selection
- Default: true (new state machine parser)
- Set to false for legacy behavior (deprecated)
- State machine parser implementation - Clean room implementation with proper state machine
- Handles quoted strings with commas and colons correctly
- Handles nested lists with braces properly
- Intelligent date field parsing
- No placeholder workarounds needed
- Comprehensive parser tests - 62 new test cases added
- 44 unit tests for state machine parser
- 18 integration tests comparing old vs new parsers
- All tests validate parser equivalence
- Performance: Optimized search operations - 10-100x faster using things.py instead of AppleScript
- get_due_in_days now uses database queries for instant results
- get_activating_in_days optimized with direct database access
- search_advanced now searches entire database including project todos (previously limited to lists only)
⚠️ Deprecated
- Legacy string manipulation parser - Will be removed in v2.0.0
- Warning logged on initialization if legacy parser is used
- Known bugs: completion_date and cancellation_date field parsing
- Recommend setting `use_new_applescript_parser=True`
📦 Installation
```bash
pip install mcp-server-things==1.3.0
```
🔗 Links
v1.2.7 - Release Process Documentation
Removed
- THINGS_MCP_SERVER_VERSION environment variable - Removed unused configuration option
- Version is now automatically managed from package metadata (
__version__in__init__.py) - No need for manual version configuration
- Updated README.md to remove this configuration example
- Version is now automatically managed from package metadata (
Documentation
- Release process - Added comprehensive release process documentation to CLAUDE.md
- Step-by-step guide for version updates across all files
- Git tagging and GitHub release creation instructions
- PyPI publishing workflow
- Release checklist to ensure consistency
- Version consistency notes explaining where versions live
v1.2.6 - Version Reporting Fix
Fixed
- Version reporting - Server now correctly reports actual package version (was hardcoded to "2.0")
- Added
__version__variable tosrc/things_mcp/__init__.py - Updated
get_server_capabilities()to use dynamic__version__instead of hardcoded string - When AI asks "what version is running?", it now correctly reports 1.2.6 instead of 2.0
- Version is automatically synced with pyproject.toml
- Added
Added
- Version management - Single source of truth for version number
__version__in package init.py- Imported by server.py for runtime reporting
- Ensures pyproject.toml and runtime version always match