{
  "markdown": "# Apple Reminders for Claude\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![macOS 11+](https://img.shields.io/badge/macOS-11%2B-informational)](https://support.apple.com/macos)\n[![Notarized](https://img.shields.io/badge/Apple-Notarized-success)](https://support.apple.com/en-us/HT202491)\n[![MCPB manifest](https://img.shields.io/badge/MCPB-0.3-000)](https://github.com/anthropics/mcpb)\n\nFast, native Apple Reminders access for Claude — works in **Claude Desktop**, **Claude Cowork**, and **Claude Code** (CLI). One signed Swift/EventKit binary, three distribution packages.\n\nReminder IDs are stable across sessions. A full CRUD round-trip takes under a second on a database with 300+ reminders. Umlauts, accents, CJK characters and emoji pass through unchanged.\n\n**Published by [high5 ventures GmbH](https://h5ventures.de)** — signed with `Developer ID Application: high5 ventures GmbH` and notarized by Apple.\n\n---\n\n## Quick start\n\nYou need a Mac running macOS 11 or later, and Claude Desktop.\n\n1. Download **`apple-reminders.mcpb`** from the [latest release](https://github.com/high5-ventures/apple-reminders-for-claude/releases/latest).\n2. Double-click it. Claude Desktop opens an install dialog — click **Install**.\n3. Ask Claude something like **\"What's on my reminders for today?\"**\n\nmacOS asks for Reminders access on that first question. Allow it, and Claude can read and change your reminders.\n\nNo configuration is needed: the bundle contains the server and the signed binary, and Claude Desktop sets the paths on install.\n\nUpdating is the same three steps with the newer `.mcpb`.\n\n> Not using Claude Desktop? See [Installation](#installation) for Claude Code and other MCP clients.\n\n---\n\n## Contents\n\n- [Description](#description)\n- [Features](#features)\n- [Usage examples](#usage-examples)\n- [Installation](#installation)\n- [Configuration](#configuration)\n- [MCP tools](#mcp-tools)\n- [Privacy policy](#privacy-policy)\n- [Troubleshooting](#troubleshooting)\n- [Support](#support)\n- [Architecture](#architecture)\n- [License](#license)\n\n---\n\n## Description\n\nApple Reminders for Claude gives Claude full CRUD access to your macOS Reminders app. It wraps Apple's native **EventKit** framework in a signed Swift binary that returns stable UUIDs and structured JSON, and ships three ways:\n\n| Target | Artifact | Where to get it |\n|---|---|---|\n| **Claude Desktop / Cowork** | `.mcpb` bundle | [Releases](https://github.com/high5-ventures/apple-reminders-for-claude/releases) |\n| **Claude Code** (CLI) | Plugin with skill | `/plugin marketplace add` against this repository |\n| **Any MCP client** | npm package | `npm install -g @high5ventures/apple-reminders-mcp` |\n\nAll three ship the same binary and the same 13 tools, so behaviour does not differ between them.\n\n## Features\n\n- **13 MCP tools** covering the full reminder lifecycle: list lists, list reminders (open/completed/all), full-text search, today/overdue/scheduled smart queries, CRUD on individual reminders.\n- **Native EventKit** — not AppleScript, not reverse-engineered SQLite scraping.\n- **Stable UUIDs** — reminder IDs survive across sessions, unlike AppleScript URIs or CLI positional indexes.\n- **Tool safety annotations** — every tool declares `readOnlyHint` / `destructiveHint` so Claude clients can auto-run queries but prompt for mutations.\n- **Language-neutral** — the skill matches on intent, not keywords. Works identically in German, French, Spanish, Japanese, etc.\n- **Speed** — full CRUD smoke-test completes in under 1 s on 300+ reminders across 10 lists.\n- **Signed + notarized** — no Gatekeeper warnings; deployable via MDM.\n- **100% local** — no network I/O. See [PRIVACY.md](PRIVACY.md).\n\n## Usage examples\n\nIn Claude Desktop and Cowork the tools appear under **Apple Reminders**; in Claude Code the skill loads when you mention reminders. The examples below show the tool calls behind each answer.\n\n### Example 1 — \"What's on my plate today?\"\n\n> **You:** Was habe ich heute zu tun?\n>\n> **Claude** (invokes `get_today`):\n> ```json\n> { \"status\": \"ok\", \"data\": { \"reminders\": [\n>   { \"id\": \"A1B2…\", \"name\": \"Zahnarzt-Termin bestätigen\", \"list\": \"Persönlich\", \"due_date\": \"2026-04-14T10:00:00\" },\n>   { \"id\": \"C3D4…\", \"name\": \"Rechnung #2026-0412 prüfen\", \"list\": \"Arbeit\", \"due_date\": \"2026-04-14T14:00:00\" }\n> ] } }\n> ```\n> **Claude:** Du hast heute zwei offene Erinnerungen: den Zahnarzt-Termin um 10:00 (Persönlich) und die Rechnungs-Prüfung um 14:00 (Arbeit).\n\n### Example 2 — \"Add a reminder to the groceries list\"\n\n> **You:** Remind me to buy oat milk tomorrow at 6pm.\n>\n> **Claude** (invokes `create_reminder`):\n> ```json\n> { \"list\": \"Groceries\", \"title\": \"Buy oat milk\", \"dueDate\": \"2026-04-15T18:00:00\" }\n> ```\n> **Response:**\n> ```json\n> { \"status\": \"ok\", \"data\": { \"reminder\": { \"id\": \"E5F6…\", \"name\": \"Buy oat milk\", \"due_date\": \"2026-04-15T18:00:00\" } } }\n> ```\n> **Claude:** Done — added \"Buy oat milk\" to Groceries for tomorrow at 18:00.\n\n### Example 3 — \"Clean up what's overdue\"\n\n> **You:** Show me everything that's overdue, then mark the Slack-DM one as done.\n>\n> **Claude** (invokes `get_overdue`):\n> ```json\n> { \"status\": \"ok\", \"data\": { \"reminders\": [\n>   { \"id\": \"G7H8…\", \"name\": \"Reply to Alex in Slack DM\", \"list\": \"Work\", \"due_date\": \"2026-04-12T17:00:00\" },\n>   { \"id\": \"I9J0…\", \"name\": \"Review PR #482\", \"list\": \"Work\", \"due_date\": \"2026-04-13T12:00:00\" }\n> ] } }\n> ```\n> **Claude** (invokes `complete_reminder` with `id: \"G7H8…\"`):\n> ```json\n> { \"status\": \"ok\", \"data\": { \"reminder\": { \"id\": \"G7H8…\", \"completed\": true, \"completion_date\": \"2026-04-14T18:22:01\" } } }\n> ```\n> **Claude:** Two overdue items: Slack reply (now marked done) and PR #482 review (still open).\n\n## Installation\n\n### Claude Desktop / Cowork\n\nDownload `apple-reminders.mcpb` from [Releases](https://github.com/high5-ventures/apple-reminders-for-claude/releases) and double-click it. Claude Desktop shows an install dialog; click **Install**, then grant Reminders access in the macOS privacy prompt on the first tool call.\n\n**Updating works exactly the same way** — download the newer `.mcpb` and double-click it.\n\nThis is how the extension is installed. The two sections below cover other MCP clients; on a Mac with Claude Desktop you do not need them.\n\n### Claude Code (CLI)\n\n```shell\n/plugin marketplace add high5-ventures/apple-reminders-for-claude\n```\n\nReload Claude Code before the next step; the plugin is not visible until the marketplace has been picked up.\n\n```shell\n/plugin install apple-reminders@high5-apple-reminders-for-claude\n```\n\nThis path offers new versions automatically, but does not install them; you still confirm each update.\n\n### Any other MCP client (Cursor, Zed, …)\n\n```shell\nnpm install -g @high5ventures/apple-reminders-mcp\n```\n\nThen add it to your client's MCP configuration:\n\n```json\n{\n  \"mcpServers\": {\n    \"apple-reminders\": {\n      \"command\": \"apple-reminders-mcp\"\n    }\n  }\n}\n```\n\nOr skip the global install and let the client fetch it on demand:\n\n```json\n{\n  \"mcpServers\": {\n    \"apple-reminders\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@high5ventures/apple-reminders-mcp\"]\n    }\n  }\n}\n```\n\nThe location of that file differs per client.\n\n### Build from source\n\n```shell\ngit clone https://github.com/high5-ventures/apple-reminders-for-claude.git\ncd apple-reminders-for-claude\n./build.sh\n```\n\nProduces `dist/reminders-eventkit` (binary), `dist/skill/` (Claude Code skill), and `dist/apple-reminders.mcpb` (Claude Desktop bundle). Builds are unsigned; see [CONTRIBUTING.md](CONTRIBUTING.md) for the signed release workflow.\n\nRequirements for building: macOS 11+, Xcode Command Line Tools, Node.js 18+.\n\n## Configuration\n\nNo configuration is required for normal use. The extension runs with these defaults:\n\n| Setting | Default | Notes |\n|---|---|---|\n| Reminders permission | prompted on first use | Revocable in **System Settings → Privacy & Security → Reminders** |\n| Binary timeout (Node wrapper) | 30 s | Hardcoded ceiling; well under any MCP client timeout |\n| Response payload cap | 16 MB | Covers databases with thousands of reminders |\n\nIf you use the npm-distributed server with a non-standard MCP client, set `REMINDERS_BINARY` to the absolute path of the `reminders-eventkit` binary:\n\n```shell\nexport REMINDERS_BINARY=/absolute/path/to/reminders-eventkit\n```\n\nThe `.mcpb` and Claude Code plugin installations set this variable automatically.\n\n## MCP tools\n\nAll 13 tools return a stable JSON envelope — `{ \"status\": \"ok\", \"data\": ... }` on success, `{ \"status\": \"error\", \"code\": \"...\", \"message\": \"...\" }` on failure.\n\n| Tool | Annotation | Purpose |\n|---|---|---|\n| `get_lists` | read-only | List all reminder lists with open/completed counts |\n| `get_list_info` | read-only | Metadata for one list by name |\n| `list_reminders` | read-only | List reminders in a list (open/completed/all) |\n| `search_reminders` | read-only | Full-text search across all lists |\n| `get_today` | read-only | Reminders due today |\n| `get_overdue` | read-only | Overdue open reminders |\n| `get_scheduled` | read-only | All open reminders with a due date |\n| `get_reminder` | read-only | Fetch one reminder by ID |\n| `create_reminder` | additive | Create a new reminder |\n| `update_reminder` | destructive, idempotent | Update an existing reminder |\n| `complete_reminder` | destructive, idempotent | Mark as completed |\n| `uncomplete_reminder` | destructive, idempotent | Unmark completed |\n| `delete_reminder` | destructive, idempotent | Permanently delete |\n\n\"Destructive\" here follows the MCP specification: it means the operation mutates existing state irreversibly from the user's point of view. Claude clients use these hints to decide when to prompt for confirmation.\n\n## Privacy policy\n\nThis extension is **100% local at runtime** — no data leaves your Mac via this extension. high5 ventures GmbH operates no server and collects no telemetry. The only network activity is the one-time download of the signed Swift binary from GitHub Releases during install (verified by Apple Developer ID signature, refuses to install on mismatch).\n\nRead the full policy: [PRIVACY.md](PRIVACY.md).\n\n## Troubleshooting\n\n**`PERMISSION_DENIED`** — you (or a device policy) turned Reminders access off. Re-enable it in **System Settings → Privacy & Security → Reminders**, then retry.\n\n**`PERMISSION_UNAVAILABLE`** — macOS refused the request without showing a dialog, so the privacy pane stays empty and there is nothing to switch on. Granting permissions or running `tccutil reset` does not help, because no entry exists to grant or reset.\n\nmacOS attributes a privacy request to the process it holds *responsible*, normally the application that launched the server. If that application declares no Reminders usage description, the request is refused before it reaches EventKit. Since v1.0.4 the binary takes that responsibility itself, so the prompt no longer depends on the host. If the error persists, check the attribution:\n\n```shell\nlog show --last 3m --predicate 'process == \"tccd\"' --info --debug | grep -i reminder\n```\n\nThe `AttributionChain` line should name `reminders-eventkit` as `responsible`. If it names the host application instead, the self-attribution did not take effect — please include that log line when opening an issue.\n\n**Binary quarantined on first launch** — releases are signed and notarized, so this should not occur. To verify:\n\n```shell\nBIN=~/Library/Application\\ Support/Claude/Claude\\ Extensions/local.mcpb.high5-ventures-gmbh.apple-reminders/bin/reminders-eventkit\ncodesign --verify --verbose \"$BIN\"\nspctl --assess --type execute \"$BIN\"\n```\n\nIf either fails, the copy may have been tampered with; re-download from [Releases](https://github.com/high5-ventures/apple-reminders-for-claude/releases).\n\n**\"List not found\" or \"Multiple lists with that name\"** — reminder lists are matched by exact name. Use `get_lists` first to see available names. For duplicates, the error response includes a `candidates` array with stable `calendar_identifier`s; re-call with `id:<calendar_identifier>` as the list argument.\n\n**Flagged reminders return empty** — EventKit does not expose the `flagged` attribute. The Claude Code skill ships an AppleScript fallback (`skills/apple-reminders/scripts/get_flagged.applescript`) for users who need this query. The `.mcpb` bundle does not include this fallback because Claude Desktop does not have shell access.\n\n**Still stuck?** Open an issue → [Support](#support).\n\n## Support\n\n- **Bug reports & feature requests:** <https://github.com/high5-ventures/apple-reminders-for-claude/issues>\n- **Security vulnerabilities:** `info@h5ventures.de` — see [SECURITY.md](SECURITY.md)\n- **General contact:** `info@h5ventures.de`\n\n## Architecture\n\n```\nClaude Desktop / Cowork           Claude Code CLI                Any MCP client (Cursor, Zed, …)\n        │                                │                                   │\n        │  (stdio MCP)                   │  (Bash via plugin)                │  (stdio MCP)\n        ▼                                ▼                                   ▼\n    Node wrapper                 reminders-eventkit                    Node wrapper\n   (server/index.js)            (Swift binary, direct)               (npm @high5ventures/…)\n        │                                │                                   │\n        ▼                                │                                   ▼\n reminders-eventkit                      │                          reminders-eventkit\n(same Swift binary)                      │                        (downloaded on install)\n        │                                │                                   │\n        └────────────────────────────────┴───────────────────────────────────┘\n                                         │\n                                         ▼\n                            Apple EventKit framework\n                                         │\n                                         ▼\n                            macOS Reminders database\n```\n\nOne Swift source → one binary → three distribution paths. See [CONTRIBUTING.md](CONTRIBUTING.md) for build internals.\n\n## License\n\nCopyright © 2026 high5 ventures GmbH. Released under the **MIT License** — see [LICENSE](LICENSE).\n\nThis project is not affiliated with or endorsed by Apple Inc. or Anthropic PBC.\n\n\"Apple\" and \"Reminders\" are trademarks of Apple Inc. \"Claude\" is a trademark of Anthropic PBC.\n",
  "bytes": 14447,
  "sha": "d54833e2ad0d78536fe2d6df4107532c2bb7949cd50946af521c04bbba706dcf",
  "repo_slug": "high5-ventures/apple-reminders-for-claude",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/plg_high5_ventures_apple_reminders_for_claud_6a103eb4/readme"
}