Apple Calendar MCP
Provides read and write access to Apple Calendar for an Apple Account, enabling tools to manage calendars, events, availability, and invitations.
Allows remote read and write access to one iCloud Calendar account, including listing calendars, searching and managing events, checking availability, and responding to invitations.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Apple Calendar MCPWhat's on my calendar for tomorrow?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Apple Calendar MCP
Apple Calendar MCP gives an AI client remote read and write access to one iCloud Calendar account. It runs as a stateless TypeScript Worker on Cloudflare and does not require an Apple device to stay online.
One deployment connects to one Apple Account. This is not a multi-user calendar service.
Before you deploy
You need:
A Cloudflare account.
An Apple Account with two-factor authentication.
An MCP client that supports remote HTTPS servers and OAuth.
Your IANA time zone name, such as
America/New_York.
Open the Apple and Cloudflare setup pages yourself. An agent can guide you and verify the result, but it should not receive or enter your passwords.
Never paste your Apple Account password, Apple app-specific password, or approval password into chat, source control, logs, or issues.
Related MCP server: calendar-app-mcp
Create an Apple app-specific password
Open account.apple.com and sign in.
Select Sign-In and Security > App-Specific Passwords.
Select Generate an app-specific password.
Give it a clear label, such as
Apple Calendar MCP.Keep the generated value on the Apple page until Cloudflare asks for it.
Apple requires two-factor authentication for app-specific passwords. You can have up to 25 active passwords. You can revoke one or all of them. Changing or resetting your main Apple Account password revokes all app-specific passwords. See Apple's app-specific password instructions.
The Apple app-specific password is broader than the Calendar permissions that this MCP shows to clients. The Worker limits itself to allowlisted iCloud CalDAV hosts, but Apple does not issue a Calendar-only app-specific password.
Deploy to Cloudflare
Select Deploy to Cloudflare at the top of this page.
Sign in to Cloudflare and follow the deployment form.
Enter the three secret values when Cloudflare asks for them:
ICLOUD_USERNAME: the full email address used for your Apple Account and iCloud Calendar.ICLOUD_APP_PASSWORD: the app-specific password that Apple generated. Preserve it exactly.APPROVAL_PASSWORD: a separate, unique password that protects new MCP client approvals. Do not reuse either Apple password.
Wait for the Worker deployment to finish.
Open Workers & Pages, select the Worker, then select Settings and find Variables and Secrets.
Change
CALENDAR_TIME_ZONEfromUTCto your IANA time zone name, then deploy the setting.Copy the endpoint in this form:
https://<worker-name>.<account-subdomain>.workers.dev/mcp.
Cloudflare stores the three secret values as encrypted Worker secrets. The deployment form does not write them to the generated repository or to a local .dev.vars file.
If you skipped a secret or need to replace one, open Workers & Pages, select the Worker, select Settings, find Variables and Secrets, add or edit the value as a Secret, and select Deploy.
Cloudflare automatically provisions the OAUTH_KV namespace. Do not add a KV ID to wrangler.jsonc.
Connect an MCP client
Add the deployed
/mcpendpoint as a custom remote MCP server or app.Select Connect. Your client should discover OAuth and open the Apple Calendar MCP approval page.
Confirm the client name and requested permission.
Enter
APPROVAL_PASSWORDand select Allow and return. Select Cancel if the page asks for more access than you want.Wait for the client to report that the connection is complete. Close the browser tab if it remains open after completion.
Refresh or rescan the client's tools. Clients can cache tool catalogs after a connection or server update.
For Claude, see Use custom connectors with remote MCP. For ChatGPT, see Developer mode and full MCP connectors.
The approval page offers two permissions:
Read calendars and events grants
calendar:readand exposes seven read tools.Read and edit calendars and events grants
calendar:read calendar:writeand adds four mutation tools.
Changing permission requires authorization again and a tool-catalog refresh. A server update does not add write tools to an existing read-only grant.
Write actions involving attendees or invitations can send email or notifications to other people.
Verify the connection
Verify read access first:
Call
calendar_get_profile. Confirm the Apple Account identity and time zone.Call
calendar_list_calendars. Confirm that the expected calendar names appear.If you approved read-only access, confirm that the client does not show mutation tools.
Deployment, secret entry, OAuth connection, and a successful calendar read are separate states. A successful calendar read proves that the Apple credential works.
To verify write access, first create an empty temporary calendar in Apple Calendar. Ask the agent to run this bounded test only after you confirm:
Create one future event with a unique title, no attendees, no recurrence, and no alerts.
Read the event and keep its current ETag.
Change only its title by using that ETag.
Read the event again and use the returned ETag to delete it.
Confirm that the event is absent.
If cleanup fails, record the exact calendar, title, and time so that you can remove the event yourself. Do not test writes on your default calendar.
You can also give an agent the bounded procedure in Set up Apple Calendar MCP with an agent.
Tools
Tool | Scope | Purpose |
|
| Return the configured iCloud account identity and default time zone. |
|
| List visible calendars, effective time zones, and opaque IDs. |
|
| Search a bounded time range across calendars. |
|
| List a bounded time range from one calendar. |
|
| Read full event details and the current ETag. |
|
| Read up to 20 events with per-event errors. |
|
| Return merged busy windows without event details. |
|
| Create timed, all-day, recurring, invited, located, or alerted events. |
|
| Change one occurrence, this and later occurrences, or an entire series. |
|
| Delete one occurrence, this and later occurrences, or an entire series. |
|
| Accept, decline, or tentatively accept an invitation. |
Update, delete, and invitation-response tools require the latest ETag. Recurring occurrence changes also require the original recurrenceId returned by a search.
Timed inputs use RFC 3339 timestamps with Z or an explicit offset. Clients can omit timeZone; creation uses the calendar's published IANA time zone, then CALENDAR_TIME_ZONE. Timed outputs include UTC and local values.
location is the visible Calendar field. structuredLocation can add a title, address, latitude, longitude, and radius. Verified coordinates enable Apple Calendar's map preview. Do not guess coordinates.
description maps to Calendar Notes. url maps to the event URL field. The MCP preserves unsupported attachments and alarm types during unrelated changes, but it does not upload, download, or modify attachments. It does not import raw ICS.
Use a custom domain
The default workers.dev endpoint needs no hostname configuration. A custom domain requires one explicit allowlist setting:
Open the Worker in Cloudflare.
Select Settings > Domains & Routes > Add > Custom Domain and add the hostname.
Under Variables and Secrets, add
MCP_HOSTNAMEas a plain-text variable. Enter only the hostname, such ascalendar.example.com. Do not includehttps://, a path, a port, or credentials.Deploy the setting.
Connect clients again at
https://<custom-host>/mcpand complete authorization again.
The hostname is part of the OAuth identity. Tokens issued for workers.dev do not move to the custom origin.
Add Cloudflare Access
The built-in approval password is the default authorization guard. Cloudflare Access is optional defense in depth.
If you add Access, protect only <hostname>/authorize. Leave /mcp, /.well-known/*, /oauth/token, and /oauth/register reachable by MCP clients. After you verify that Access protects /authorize, add EXTERNAL_AUTHORIZATION=true as a plain-text Worker variable.
SetEXTERNAL_AUTHORIZATION=true only after an outside guard protects /authorize. The setting declares that the outside guard is active.
Security
The Worker receives your Apple username and app-specific password at runtime. You trust your Cloudflare account, the deployed source, Apple, and every connected MCP client. Restrict access to your Cloudflare account and connect only clients you trust.
APPROVAL_PASSWORD protects new approvals. The approval route fails closed unless this password is configured or EXTERNAL_AUTHORIZATION declares a verified outside guard. Anyone who passes the guard can authorize a client against the configured Apple account.
RotatingAPPROVAL_PASSWORD does not revoke OAuth tokens that were already issued.
Cloudflare's OAuth provider stores access tokens, refresh tokens, authorization codes, and registered client secrets by hash. It encrypts authorization properties. Client names and grant metadata remain visible in storage, so they must not contain secrets. See the provider's KV storage and cleanup documentation.
The Worker sends Apple credentials only over HTTPS to allowlisted iCloud CalDAV hosts. Tool arguments cannot choose an upstream host. Errors redact credential-like values. The Worker does not log tool arguments or event payloads.
Tool results can include titles, notes, locations, attendees, and URLs. MCP clients can retain this data under their own product and workspace policies.
Write access covers event creation, changes, deletion, and invitation responses. ETags prevent overwriting a newer event, but they cannot make an unintended write harmless. Unrelated updates preserve unsupported Apple properties when possible.
Deploy from this canonical repository or from a fork whose changes you reviewed. A remote MCP server can change its tool catalog when its owner deploys new code.
Revoke or rotate access
Goal | Action | Result |
Stop one client | Disconnect or remove it in that client's settings. Use its revoke flow when available. | The client stops using its connection. |
Stop new approvals | Rotate | Existing OAuth tokens are unaffected. |
Stop all Apple access immediately | Disable the Worker and revoke its app-specific password at account.apple.com. | Calendar calls fail until you configure a new app-specific password. |
Rotate normally | Create a new Apple app-specific password, replace | You verify the replacement before revocation and avoid downtime. |
Recover after an Apple Account password reset | Create a new app-specific password and replace the Worker secret. | Apple already revoked the old app-specific password. |
If you suspect compromise, revoke the old Apple app-specific password first. Then replace it and verify access. This causes a short outage.
Troubleshooting
A
401or iCloud password rejection usually means that the app-specific password is missing or revoked. Create or replace it in Apple and Cloudflare. Do not paste it into chat.Missing write tools usually mean that the client has a read-only grant or a cached tool catalog. Refresh tools, then disconnect and authorize again if needed.
A custom domain that rejects
/mcpusually has a missing or invalidMCP_HOSTNAME. Set the exact hostname and redeploy.An approval page that fails closed has neither
APPROVAL_PASSWORDnor a declared external guard. Add the approval secret unless you have already verified Cloudflare Access on/authorize.
Develop locally
bun install
cp .dev.vars.example .dev.vars
bun run test
bun run typecheck
bun run cloudflare:checkKeep .dev.vars local. Deploy with bun run deploy.
License
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables users to view and create events in their iCloud Calendar using natural language through supported LLMs. It integrates with Apple's infrastructure via app-specific passwords to provide secure calendar management.1
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to access and interact with macOS Calendar.app events and reminders, including viewing, searching, and filtering calendar data.2MIT
- AlicenseNot gradedqualityBmaintenanceEnables calendar management with iCloud through CalDAV, allowing users to list, create, update, and delete events via a standardized API.27MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to access iCloud Calendar, Reminders, and Mail with configurable scope and read-only modes.1MIT
Related MCP Connectors
Calendar API for AI agents: events, availability, Google/Microsoft setup, scheduling, and iCal.
Hosted Google Calendar MCP server for AI agents. No self-hosting or Google Cloud setup.
Connects ChatGPT to your Apple Calendar via a local Mac agent + Vercel relay
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/nweii/apple-calendar-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server