Scoped Apple Calendar and Reminders access for AI agents, with per-client grants and approvals
Runs on your machine from its package; the steps are below.

At most: creates or changes data: records, files, settings.
Odel charges nothing per call. The publisher may charge for its own service.
Runs locally
This server runs on your machine over stdio, but its source registry didn't list a distribution package. Check the source repository for setup instructions.
Give AI agents your calendar. Not all of it.
A free, open-source Mac menu bar app that lets Claude, ChatGPT, Cursor and your scripts use only the calendars and reminder lists you choose, and asks you before they change anything.
Download for Mac · Get started · Agent setups · Changelog
Works with Claude Code, Claude Desktop, Codex and Cursor (tested live), and any other MCP client, with ready-made setups for VS Code (Copilot), Gemini CLI, Zed, Cline, JetBrains AI Assistant and Devin Desktop. claude.ai and ChatGPT can connect through Remote Access, which is experimental.
Once an agent is connected, ask in plain words. It can act only inside the calendars and lists you gave it.
| You ask | The agent uses |
|---|---|
| "What's on my Work calendar this week, and where are my free hours?" | read_events |
| "Move Thursday's design review to Friday at 3, same length." | read_events, then update_event (which asks you first) |
| "Remind me to renew my passport next Monday at 9." | create_reminder in the list you granted |
| "Block 9:30–10:30 every weekday for focus time." | create_event with a repeat rule |
Twelve tools cover events and reminders, with every field Calendar supports: time zones, repeats, alerts, locations, notes and links. Each agent sees only the tools its access allows. The MCP guide has the full reference.
Install. Download EKBridge.dmg, open it and drag EK Bridge to Applications. If you open it from the disk image or Downloads instead, it offers to move itself there. Or use Homebrew:
brew install --cask bereciartua/tap/ek-bridge
Open the app. It opens on a setup with three steps; later, you'll find it in the menu bar.
That's it: ask your agent one of the questions above. Setups for every agent and troubleshooting are in the MCP guide.
EK Bridge needs macOS 14 or later, on Apple silicon or Intel. It's notarized by Apple and keeps itself up to date (you click to install each update). Release notes and checksums are on Releases. Upgrading from EventKit Bridge, its earlier name? See Setup. EK Bridge is a personal project in public preview, with best-effort support.
EK Bridge is the only app that holds your Calendar and Reminders permission. Your agents talk to it, never to your calendars directly, and it checks every request against what you allowed.
Every agent has its own key and its own access: Read, Create, Edit and Delete for each calendar, plus Complete for each reminder list. Share Work, keep Family to yourself.
By default, before an agent writes anything, a small panel shows every field it wants to set. Click Allow or Deny, or let one agent work for 15 minutes. A request you don't answer is refused after 45 seconds. For a script you trust, you can turn asking off.
When an agent tries to add, change, complete or delete on a calendar it can read but lacks that one action, EK Bridge asks you in the same panel: Claude Code can't add reminders to Groceries. Allow Once, Always Allow (which saves just that action) or Not Now. It never asks about calendars the agent can't see, and at most once an hour for the same thing.
Activity says what each agent changed, by name (Moved “Design review”), and explains every refusal in plain words. EK Bridge stores only the item's ID and looks the name up when you open the row, with Show in Calendar. Pause an agent's connection to refuse its requests while keeping its setup, Remove it to cut it off for good, or pause all of EK Bridge from the menu bar. Optional notifications tell you when a change wasn't made because nobody answered.
127.0.0.1. No account, no analytics, no server of ours.What it doesn't protect against: another program running as your macOS user can read the same key files. Access settings separate the agents you connect; they aren't a defense against malware already on your Mac. Details are in Security boundary.
Yes. EK Bridge is open source under the Apache License 2.0, with no account or trial.
EK Bridge itself sends nothing anywhere; Privacy lists every connection it makes. What an agent reads through it goes to that agent and its AI provider, under their terms, so grant Read only where the agent needs it.
For AI agents, yes by default. You can turn asking off per connection, for example for a script you trust, or allow one agent's changes for 15 minutes at a time. See Ask before changes.
The accounts that appear in the Calendar and Reminders apps, such as iCloud, Google, Exchange, CalDAV and On My Mac. The live tests so far ran on iCloud; see Testing.
Yes, through Remote Access, which forwards cloud agents to your Mac through a tunnel you run, such as Tailscale Funnel. It's off by default and experimental, and your Mac has to be awake and online. See From cloud agents.
Yes, with the bridge-client command-line tool. Each script gets its own key and its own access, like an agent. See From scripts.
Most give agents broad access to many apps, with one switch per app or service. EK Bridge does only Calendar and Reminders, but per calendar, per agent, with approvals, an activity log and revocation. If you trust an agent with everything, you may not need it.
No. EK Bridge is an independent open-source project built on Apple's public EventKit framework. It isn't affiliated with or endorsed by Apple.
Something else? Ask in Discussions.
Scripts and tools without MCP use bridge-client, which signs each request with the connection's own key.
Add a connection with Connects from ▸ Command line, choose its access and Save.
Install the tool from Settings ▸ Advanced ▸ Install Command-Line Tool. It links bridge-client into ~/.local/bin; if your shell can't find it, add that folder to your PATH. (Homebrew already linked it into its own bin.)
Send a test request. The connection's page has it ready to copy:
bridge-client scope_status --client "Morning briefing"
Until the tool is installed, the copied command uses the app's full path, /Applications/EKBridge.app/Contents/MacOS/bridge-client, so it works as pasted. bridge-client --help lists every command and the access it needs. Errors say what's wrong and how to fix it, with a distinct exit code for each kind of problem. See A safe first CLI check and the API and CLI reference.
Cloud agents run on their vendor's servers and can't reach 127.0.0.1. Remote Access (its own page in the sidebar, with a guided setup; off by default) opens a second loopback port, 47616, for a tunnel you run, such as Tailscale Funnel; the app shows the commands and tests the result. Each connection also needs Allow cloud access.
Remote Access has offline tests, but hasn't yet been tested live with every cloud agent and tunnel. Turn it on only while you need it, and keep its URL private; its path is the secret. See Use from cloud agents.
| Goal | Guide |
|---|---|
| Install, build from source, signing and macOS access | Setup |
| Add a connection and use the app | User guide |
| Connect an AI agent over MCP, or a cloud agent through Remote Access; tool reference | MCP guide |
| Call the CLI and understand command parameters | API and CLI reference |
| Understand processes, file storage, and security limits | Architecture and threat model |
| See what was tested and diagnose failures | Testing and troubleshooting |
| Contribute, or maintain and release | Contributing, Maintaining |
The app has no analytics, telemetry or crash reporting, and no account. Your calendars, reminders, connections and Activity stay on your Mac. These are every network connection it makes:
| Connection | When |
|---|---|
MCP server, listening on 127.0.0.1:47615 | Only while EK Bridge is on and a connection has MCP access (Settings ▸ Advanced ▸ Local MCP server turns it off). Loopback only: other computers can't connect. |
Remote Access, listening on 127.0.0.1:47616 | Only while Remote Access is on (off by default). Loopback only; a tunnel you run forwards cloud agents to it. |
| One HTTPS request to your Remote Access address | Only when the Remote Access guide tests the tunnel, or you click Test on the Remote Access page. |
| One HTTPS request for a cloud agent's client metadata | Only while you pair an OAuth cloud agent (claude.ai, ChatGPT), to the address that agent gives. Private and local addresses are refused. |
bridge-mcp connecting to 127.0.0.1 | When an agent on your Mac starts it, to reach the MCP server. |
One HTTPS request to GitHub for appcast.xml, the list of the latest version | Once a day while Settings ▸ General ▸ Check for updates automatically is on (on in downloaded copies; a copy built from source never checks), and when you choose Check for Updates…. GitHub sees your IP address and the app's version; nothing else is sent. |
| Downloading an update from GitHub | Only after you click Install Update in the update window. The app checks the download's EdDSA signature and that it's signed by the same developer before installing it. |
On disk, besides connections and Activity, EK Bridge keeps the names, accounts and colours of the calendars and lists you've given access to (collection-labels.json), so it can still name one that becomes unavailable. Activity keeps an item's EventKit ID for each change (not its title), and looks the item up when you open the row; EK Bridge never stores item titles or contents.
Notifications are shown by macOS. One about a change that wasn't made can include the item's title, which macOS may show on the lock screen depending on your settings; turn each kind on or off in Settings ▸ General ▸ Notifications.
What an agent reads through EK Bridge goes to that agent and its AI provider, under their privacy terms, so grant only what each agent needs. Tunnels other than Tailscale Funnel can read Remote Access traffic at their edge.
127.0.0.1:47615, never on a network interface. Every request needs the connection's own 256-bit token, kept in a mode-0600 file; the registry stores only its SHA-256 hash, and the recommended agent setups read the file instead of putting the token in the agent's config. Requests with a foreign Host, any Origin (web pages), or tunnel forwarding headers are refused, and repeated failed sign-ins are locked out. See the threat review.127.0.0.1:47616 for a tunnel you run; every path except a 128-bit secret path gets 404, and only connections with Allow cloud access can use it, with a separate remote token or an OAuth connection you approved on the Mac. Local tokens don't work through it, and its credentials don't work on the local port. See the Remote Access threat review.These controls do not isolate another process running as the same macOS user. Such a process can access the credential, token or policy files. A grant is therefore a boundary between the connections in this app's protocol, not a defense against a compromised user account.
Report vulnerabilities privately, as described in SECURITY.md.
The short version is above. The complete list, with what EventKit doesn't allow:
list_collections, read_events, get_event, create_event, update_event, delete_event, read_reminders, get_reminder, create_reminder, update_reminder, complete_reminder, delete_reminder) with ISO 8601 times. Each agent sees only the tools its grants allow. Ask before changes can require your approval for every write, per connection, and shows every field that would change.The support matrix and testing record distinguish implemented behavior from provider-specific observations and untested cases.
You need macOS 14 or later, Xcode or the Xcode Command Line Tools, and Python 3. Building and the offline tests don't install the app or ask for access:
sh test.sh
sh build.sh
The build creates build/EKBridge.app, with the MCP launcher bridge-mcp and the command-line client bridge-client inside it (build/bridge-client links to it). It signs the app ad hoc by default, which macOS treats as a new app each time; for lasting Calendar and Reminders access, sign with a stable identity as described in Setup.
EVENTKIT_ARCHS="arm64 x86_64" sh build.sh builds a universal app.sh ui_test.sh runs the window and behavior tests, and sh ui_snapshots.sh writes screenshots of every screen; both use fake data.release.sh (Developer ID signing, notarization, a DMG and a zip), by hand or by the release workflow; see Maintaining.To contribute, see Contributing.
Quit the app from its menu bar menu.
Remove its Calendar and Reminders access. The first command reads the app's bundle ID, so run these before you delete the app:
bundle_id=$(defaults read /Applications/EKBridge.app/Contents/Info CFBundleIdentifier)
tccutil reset Calendar "$bundle_id"
tccutil reset Reminders "$bundle_id"
Delete the app from Applications, and its data: ~/Library/Application Support/EKBridge (connections, keys, tokens, Activity and the write journal). If you upgraded from EventKit Bridge, also delete the EventKitBridge link next to it. Settings and the updater's downloads are in ~/Library/Preferences/io.github.bereciartua.ekbridge.plist and ~/Library/Caches/io.github.bereciartua.ekbridge.
If you installed the command-line tool, delete ~/.local/bin/bridge-client.
Remove the server from your agents' configs (for example claude mcp remove ek-bridge), and stop any tunnel you ran for Remote Access.
Installed with Homebrew? Do steps 1, 2 and 5, and brew uninstall --cask ek-bridge removes the app and its bridge-client link; with --zap it also moves the data and settings in step 3 to the Trash.
EK Bridge is in public preview, with best-effort support.
See testing and open checks and the changelog.
EK Bridge is licensed under the Apache License 2.0; see NOTICE. The license doesn't grant rights to the project's name or icon. Apple, Mac and macOS are trademarks of Apple Inc. This project is not affiliated with or endorsed by Apple.
EK Bridge is made by Martin Bereciartua.