{"server":{"$schema":"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json","name":"io.github.chrischall/apple-icloud-mcp","description":"Unofficial: Apple Music, iCloud Calendar/Contacts/Mail, Apple Maps and WeatherKit, no Mac needed","repository":{"url":"https://github.com/chrischall/apple-icloud-mcp","source":"github"},"version":"0.2.0","packages":[{"registryType":"npm","identifier":"apple-icloud-mcp","version":"0.2.0","transport":{"type":"stdio"},"environmentVariables":[{"description":"Your Apple Developer Team ID (10 characters). Needed for Apple Music (official API), Apple Maps and WeatherKit.","format":"string","name":"APPLE_TEAM_ID"},{"description":"Key ID of a private key created in Certificates, Identifiers & Profiles → Keys with Media Services (MusicKit), MapKit JS and/or WeatherKit enabled.","format":"string","name":"APPLE_KEY_ID"},{"description":"Contents of that key's .p8 file (PEM; one-line values with \\n escapes and base64 are accepted).","format":"string","isSecret":true,"name":"APPLE_PRIVATE_KEY"},{"description":"Local installs only: a path to the .p8 file instead of APPLE_PRIVATE_KEY.","format":"string","name":"APPLE_PRIVATE_KEY_PATH"},{"description":"Optional per-service override of APPLE_KEY_ID for Apple Music (pair with APPLE_MUSIC_PRIVATE_KEY).","format":"string","name":"APPLE_MUSIC_KEY_ID"},{"description":"Optional per-service override of APPLE_PRIVATE_KEY for Apple Music.","format":"string","isSecret":true,"name":"APPLE_MUSIC_PRIVATE_KEY"},{"description":"Optional per-service override of APPLE_KEY_ID for Apple Maps.","format":"string","name":"APPLE_MAPS_KEY_ID"},{"description":"Optional per-service override of APPLE_PRIVATE_KEY for Apple Maps.","format":"string","isSecret":true,"name":"APPLE_MAPS_PRIVATE_KEY"},{"description":"Optional per-service override of APPLE_KEY_ID for WeatherKit.","format":"string","name":"APPLE_WEATHERKIT_KEY_ID"},{"description":"Optional per-service override of APPLE_PRIVATE_KEY for WeatherKit.","format":"string","isSecret":true,"name":"APPLE_WEATHERKIT_PRIVATE_KEY"},{"description":"WeatherKit only: the Services ID registered for WeatherKit (e.g. com.example.weather).","format":"string","name":"APPLE_WEATHERKIT_SERVICE_ID"},{"description":"Optional: a pre-minted Apple Music developer token (JWT) instead of signing one from the key above.","format":"string","isSecret":true,"name":"APPLE_MUSIC_DEVELOPER_TOKEN"},{"description":"Music User Token for your library (official API), from a one-time MusicKit sign-in: `npx apple-icloud-mcp music-auth`. Without the Apple Developer key, ask the owner for a developer token (music-auth --print-developer-token) and run it with APPLE_MUSIC_DEVELOPER_TOKEN set. Lasts ~6 months.","format":"string","isSecret":true,"name":"APPLE_MUSIC_USER_TOKEN"},{"description":"Opt-in web-player mode (no developer account needed; unlocks rename/delete/remove/reorder): the media-user-token cookie from a signed-in music.apple.com tab.","format":"string","isSecret":true,"name":"APPLE_MUSIC_WEB_USER_TOKEN"},{"description":"Optional override for the web-player developer token (normally read automatically from music.apple.com).","format":"string","isSecret":true,"name":"APPLE_MUSIC_WEB_DEVELOPER_TOKEN"},{"description":"Two-letter Apple Music storefront (e.g. us, gb). Default: your account's storefront, else us.","format":"string","name":"APPLE_MUSIC_STOREFRONT"},{"description":"Your Apple ID email, for iCloud Calendar, Contacts and Mail.","format":"string","name":"ICLOUD_USERNAME"},{"description":"An app-specific password from appleid.apple.com → Sign-In and Security → App-Specific Passwords (NOT your Apple ID password).","format":"string","isSecret":true,"name":"ICLOUD_APP_PASSWORD"},{"description":"Your @icloud.com address, only if your Apple ID email is not an iCloud address (needed for Mail).","format":"string","name":"ICLOUD_MAIL_ADDRESS"},{"description":"Calendar new events go to when none is named (default: the first writable event calendar).","format":"string","name":"ICLOUD_DEFAULT_CALENDAR"},{"description":"\"none\" = read-only tools; \"additive\" = also create/append, never modify, delete or send; \"all\" = everything (default). Unrecognized values fail closed to \"none\".","format":"string","name":"APPLE_WRITE_MODE"},{"description":"Comma-separated services to enable (music, calendar, contacts, mail, maps, weather, itunes). Default: all.","format":"string","name":"APPLE_SERVICES"},{"description":"IANA time zone (e.g. America/New_York) for displayed times and for dates you give without an offset. Set this on a hosted server, which runs in UTC.","format":"string","name":"DISPLAY_TZ"},{"description":"\"metric\" (default) or \"imperial\" units for weather (Maps distances always show both).","format":"string","name":"APPLE_UNITS"},{"description":"Set to false to write nothing under $MCP_DATA_DIR/.apple-icloud-mcp: no web-player token or iCloud discovery cache, and the rejected-password latch and spent confirmation tokens then last only as long as the process.","format":"string","name":"APPLE_STATE_CACHE"},{"description":"Per-request timeout in milliseconds (default 30000).","format":"string","name":"APPLE_REQUEST_TIMEOUT_MS"},{"description":"Set to 1 to log every upstream request line to stderr (credentials redacted).","format":"string","name":"APPLE_DEBUG_LOG"},{"description":"How confirm-gated writes (send mail, deletes, removing tracks, invitations) behave on a client with no prompt, like claude.ai: \"ask-user\" (default: preview + confirmToken, the model must get your OK), \"auto\", or \"refuse\". Unknown values mean refuse.","format":"string","name":"MCP_CONFIRM_MODE"},{"description":"Lifetime of a confirmToken in seconds (default 600).","format":"string","name":"MCP_CONFIRM_TTL_SECONDS"},{"description":"Signing key for confirmTokens. Random per process by default; set it so a token issued just before a restart or redeploy still works (spent tokens are recorded on disk, so none can be replayed).","format":"string","isSecret":true,"name":"MCP_CONFIRM_SECRET"}]}]},"_meta":{"io.modelcontextprotocol.registry/official":{"status":"active","statusChangedAt":"2026-09-28T05:12:16.18021Z","publishedAt":"2026-09-28T05:12:16.18021Z","updatedAt":"2026-09-28T05:12:16.18021Z","isLatest":true}}}
