Skip to content

Releases: ebowman/mcp-server-things

v1.4.4 - Fix Things 3 freezes from SQLite lock contention

25 Feb 14:46

Choose a tag to compare

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 things3 module, 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 btreeInvokeBusyHandler blocking on sync commits

v1.4.3 - Fix Claude API JSON schema error

02 Feb 14:17

Choose a tag to compare

Fixed

  • Fixed Claude API JSON schema error - Removed Union types from tool return annotations
    • Claude API rejects schemas with oneOf/allOf/anyOf at top level
    • FastMCP generates oneOf from Union[...] return type annotations
    • Changed 5 tools (get_inbox, get_today, get_upcoming, get_anytime, get_someday) from Union[List[Dict], Dict] to Dict[str, Any]
    • These functions already wrap responses via context_manager.optimize_response(), so the type annotation now matches actual behavior

Full Changelog: v1.4.2...v1.4.3

v1.4.2 - Consolidated get_upcoming API

22 Dec 19:04

Choose a tag to compare

Changes

  • Consolidated get_upcoming API - Added optional days parameter
    • get_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_days tool - use get_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

04 Oct 22:00

Choose a tag to compare

Changed

  • Checklist API improvement - Changed checklist parameters from newline-delimited strings to List[str]
    • add_todo(checklist_items=...) now accepts List[str] instead of str
    • add_checklist_items(items=...) now accepts List[str] instead of str
    • prepend_checklist_items(items=...) now accepts List[str] instead of str
    • replace_checklist_items(items=...) now accepts List[str] instead of str
    • 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

04 Oct 20:32

Choose a tag to compare

🎉 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 the checklist_items parameter
  • Checklist management tools:
    • add_checklist_items() - Append items to existing checklists
    • prepend_checklist_items() - Add items to the beginning
    • replace_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

03 Oct 22:23

Choose a tag to compare

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

03 Oct 21:16

Choose a tag to compare

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

02 Oct 22:35

Choose a tag to compare

🎉 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=False to temporarily use legacy parser
    • Legacy parser will be removed in v2.0.0

🐛 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

01 Oct 13:34

Choose a tag to compare

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

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

01 Oct 12:58

Choose a tag to compare

Fixed

  • Version reporting - Server now correctly reports actual package version (was hardcoded to "2.0")
    • Added __version__ variable to src/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

  • 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