jons-mcp-reminders

jonmmease/jons-mcp-reminders

3.3

If you are the rightful owner of jons-mcp-reminders and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to dayong@mcphub.com.

An MCP server for managing macOS Reminders via EventKit.

Tools
16
Resources
0
Prompts
0

MCP Server for macOS Reminders

An MCP server for managing macOS Reminders via EventKit.

This FastMCP server provides native access to the macOS Reminders app through the Model Context Protocol (MCP), enabling AI assistants to create, read, update, and delete reminders and lists.

Requirements

  • macOS 14.0+ (Sonoma or later)
  • Python 3.10+

Installation

# Clone the repository
git clone <your-repo-url>
cd jons-mcp-reminders

# Install with uv
uv pip install -e .

Permissions

On first run, the server will request access to Reminders. You must grant this permission in:

System Settings > Privacy & Security > Reminders

The Terminal app (or your Python environment) must have permission to access Reminders.

Running the Server

uv run jons-mcp-reminders

Adding to Claude Code

# Register the MCP server with Claude Code
claude mcp add jons-mcp-reminders -- uv run --project /path/to/jons-mcp-reminders jons-mcp-reminders

Adding to Claude Desktop

Add this to your Claude Desktop config file (~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "jons-mcp-reminders": {
      "command": "uv",
      "args": [
        "run",
        "--project",
        "/path/to/jons-mcp-reminders",
        "jons-mcp-reminders"
      ]
    }
  }
}

Replace /path/to/jons-mcp-reminders with the actual path to this repository.

Available Tools

List Management (5 tools)

ToolDescription
list_reminder_listsGet all reminder lists
get_reminder_listGet a specific list by ID
create_reminder_listCreate a new list with optional hex color
update_reminder_listUpdate list title/color
delete_reminder_listDelete a list (and all its reminders)

Reminder CRUD (7 tools)

ToolDescription
get_remindersGet reminders with filters (list, completion, due date)
get_reminderGet single reminder by ID
create_reminderCreate with title, notes, URL, due date, priority, location
update_reminderUpdate any reminder fields including location
complete_reminderToggle completion status
delete_reminderDelete a reminder
move_reminderMove reminder to different list

Batch Operations (3 tools)

ToolDescription
complete_remindersBatch complete multiple reminders
delete_remindersBatch delete multiple reminders
add_remindersQuick-add multiple reminders by title

Search (1 tool)

ToolDescription
search_remindersSearch reminders by title/notes (case-insensitive)

Priority Values

PriorityValueReminders App
NONE0No flag
HIGH1!!!
MEDIUM5!!
LOW9!

Location-Based Reminders

You can create reminders that trigger based on arriving at or leaving a location. The create_reminder and update_reminder tools accept a location parameter with the following fields:

FieldTypeDescription
titlestringDisplay name for the location (e.g., "Home", "Office")
latitudefloatLatitude coordinate (-90 to 90)
longitudefloatLongitude coordinate (-180 to 180)
radiusfloatGeofence radius in meters (default: 100, max: 10000)
proximitystringWhen to trigger: "enter" (arriving) or "leave" (departing)

Example: Create reminder with location

await create_reminder(
    title="Buy groceries",
    location={
        "title": "Whole Foods",
        "latitude": 37.7749,
        "longitude": -122.4194,
        "radius": 100.0,
        "proximity": "enter"
    }
)

Example: Remove location from reminder

await update_reminder(reminder_id, clear_location=True)

Note: Location-based reminders require Location Services to be enabled on the device for the triggers to activate.

Known Limitations

  1. Sections not supported: EventKit does not expose sections/headers within reminder lists (e.g., "Frozen", "Produce" in a Grocery list). This is a UI-only feature with no public API.

  2. Color shifting: Colors may shift slightly (~30 units per RGB channel) due to iCloud color space conversion when syncing. This is expected behavior.

  3. Exchange calendars: Reminder IDs on Exchange accounts may change after initial sync. iCloud calendars have stable IDs.

Development

Setup

# Install with dev dependencies
uv pip install -e ".[dev]"

Running Tests

# Run all tests
uv run pytest

# Run integration tests (requires Reminders access)
uv run pytest tests/test_integration.py -v

# Run with coverage
uv run pytest --cov=src

Code Quality

# Type check
uv run mypy src/jons_mcp_reminders

# Format code
uv run black src tests

# Lint code
uv run ruff check src tests

Project Structure

jons-mcp-reminders/
├── src/
│   └── jons_mcp_reminders/
│       ├── __init__.py          # Package exports
│       ├── constants.py         # Configuration constants
│       ├── exceptions.py        # Custom exceptions
│       ├── models.py            # Pydantic models
│       ├── converters.py        # EventKit <-> Python conversions
│       ├── store.py             # ReminderStore singleton
│       ├── server.py            # FastMCP server setup
│       └── tools/
│           ├── __init__.py      # Tool exports
│           ├── lists.py         # List management tools
│           ├── reminders.py     # Reminder CRUD tools
│           ├── batch.py         # Batch operation tools
│           └── search.py        # Search tool
├── tests/
│   ├── conftest.py              # Test fixtures
│   └── test_integration.py      # Integration tests
├── pyproject.toml               # Project configuration
├── CLAUDE.md                    # AI assistant guidance
└── README.md                    # This file

License

MIT