Skip to main content
Glama
README.md
# apple-reminders-mcp

An MCP server that connects Claude Desktop to Apple Reminders on macOS via AppleScript.

## Prerequisites

- macOS
- [Node.js](https://nodejs.org) 18+
- [Claude Desktop](https://claude.ai/download)

## Installation

**1. Add to Claude Desktop config**

Open `~/Library/Application Support/Claude/claude_desktop_config.json` and add:

```json
{
  "mcpServers": {
    "apple-reminders": {
      "command": "npx",
      "args": ["-y", "@kamk95/apple-reminders-mcp"]
    }
  }
}
```

**2. Restart Claude Desktop**

The first time a reminder tool is used, macOS will prompt you to grant Reminders access — click Allow.

---

### Manual install (alternative)

If you prefer to run from source:

```bash
git clone https://github.com/kamrenkennedy/apple-reminders-mcp.git
cd apple-reminders-mcp
npm install
```

Then use this config instead:

```json
{
  "mcpServers": {
    "apple-reminders": {
      "command": "node",
      "args": ["/absolute/path/to/apple-reminders-mcp/index.js"]
    }
  }
}
```

---

## Tools

### `list_reminders`
List reminders across all lists or a specific one.

| Parameter | Type | Description |
|---|---|---|
| `list_name` | string | Filter to a specific list (optional) |
| `include_completed` | boolean | Include completed reminders (default: false) |

### `create_reminder`
Create a new reminder.

| Parameter | Type | Description |
|---|---|---|
| `name` | string | **Required.** Title of the reminder |
| `list_name` | string | Destination list (default: Reminders) — created if it doesn't exist |
| `due_date` | string | Due date in `YYYY-MM-DD` format |
| `due_time` | string | Due time in `HH:MM` 24-hour format — requires `due_date` |
| `priority` | string | `none` / `low` / `medium` / `high` / `urgent` |
| `notes` | string | Body/notes text |
| `tags` | string[] | Tags to attach |

### `complete_reminder`
Mark a reminder as completed.

| Parameter | Type | Description |
|---|---|---|
| `name` | string | **Required.** Exact name of the reminder |
| `list_name` | string | Narrow search to this list (optional) |

### `delete_reminder`
Permanently delete a reminder.

| Parameter | Type | Description |
|---|---|---|
| `name` | string | **Required.** Exact name of the reminder |
| `list_name` | string | Narrow search to this list (optional) |

### `update_reminder`
Update any fields on an existing reminder. Only provided fields are changed.
If you update `notes` or `tags` individually, the other is preserved automatically.

| Parameter | Type | Description |
|---|---|---|
| `name` | string | **Required.** Current name of the reminder |
| `list_name` | string | Current list to narrow the search |
| `new_name` | string | Rename the reminder |
| `new_list_name` | string | Move reminder to this list |
| `due_date` | string | New due date in `YYYY-MM-DD` format |
| `due_time` | string | New due time in `HH:MM` 24-hour format |
| `clear_due_date` | boolean | Remove the due date entirely |
| `priority` | string | `none` / `low` / `medium` / `high` / `urgent` |
| `notes` | string | Replace notes text |
| `tags` | string[] | Replace tags |

---

## Notes

- **Tags** are stored inside the reminder's notes field as `[tags: tag1, tag2]` since the native Reminders tags API is not accessible via AppleScript. They round-trip correctly through all tools.
- Reminders are matched by exact name. If you have duplicates across lists, pass `list_name` to disambiguate.

TDQS

A3.7/5.0

Scored across 5 tools

Disambiguation5/5

Each tool addresses a distinct action on reminders: create, list, complete, update, and delete. There is no overlap or ambiguity between them.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern (e.g., create_reminder, delete_reminder), with verbs clearly indicating the operation.

Tool Count5/5

With 5 tools, the set is well-scoped for managing reminders, covering core operations without unnecessary bloat.

Completeness4/5

CRUD operations are present along with a completion action. Missing a 'get single reminder' tool is a minor gap, but the set is largely complete for its domain.

Maintenance

ActivityInactive
ResponsivenessNo issues