icloud-mcp
MCP server for iCloud integration, providing tools for managing calendars, contacts, and email.
README
iCloud MCP Server
MCP (Model Context Protocol) server for iCloud integration, providing tools for managing calendars (CalDAV), contacts (CardDAV), and email (IMAP/SMTP).
Features
- Stateless Architecture: No state stored between requests
- Full CRUD Operations: Complete management of calendars, contacts, and email
- Flexible Authentication: Via headers or environment variables
- Multiple Transports: stdio (local) or Streamable HTTP (server)
- Docker Support: Easy deployment with Docker and Docker Compose
Supported Operations
Calendar Tools (CalDAV)
calendar_list_calendars- List all calendarscalendar_list_events- List events with date filteringcalendar_create_event- Create new eventcalendar_update_event- Update existing eventcalendar_delete_event- Delete eventcalendar_search_events- Search events by text
Contacts Tools (CardDAV)
contacts_list- List all contactscontacts_get- Get specific contactcontacts_create- Create new contact (name, phones, emails, addresses, organization, title)contacts_update- Update existing contactcontacts_delete- Delete contactcontacts_search- Search contacts by text
Email Tools (IMAP/SMTP)
email_list_folders- List mail foldersemail_list_messages- List messages in folderemail_get_message- Get full message detailsemail_get_messages- Get multiple messages at once (bulk fetch)email_search- Search messages by textemail_send- Send email via SMTPemail_move- Move message to folderemail_delete- Delete or trash messageemail_mark_read- Mark message as reademail_mark_unread- Mark message as unread
Installation
Prerequisites
- Python 3.10 - 3.12 (Python 3.13+ not yet supported due to dependency compatibility)
- iCloud account with App-Specific Password (Generate here)
Local Installation
# Clone repository
git clone <repository-url>
cd icloud-mcp
# Create virtual environment with Python 3.10-3.12
python3.12 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install package in editable mode
pip install -e .
# Configure environment
cp .env.example .env
# Edit .env with your credentials
Docker Installation
# Clone repository
git clone <repository-url>
cd icloud-mcp
# Configure environment
cp .env.example .env
# Edit .env with your credentials
# Build and run with Docker Compose
docker-compose up -d
Configuration
Environment Variables
Create a .env file with the following variables:
# iCloud Credentials (fallback if not in headers)
ICLOUD_EMAIL=your-email@icloud.com
ICLOUD_APP_SPECIFIC_PASSWORD=xxxx-xxxx-xxxx-xxxx
# iCloud Servers (optional, defaults to standard iCloud servers)
CALDAV_SERVER=https://caldav.icloud.com
CARDDAV_SERVER=https://contacts.icloud.com
IMAP_SERVER=imap.mail.me.com
SMTP_SERVER=smtp.mail.me.com
# Server Configuration
MCP_SERVER_PORT=8000
IMAP_PORT=993
SMTP_PORT=587
Authentication
The server supports two authentication methods (checked in order):
-
Request Headers (recommended for multi-user scenarios):
X-Apple-Email: iCloud email addressX-Apple-App-Specific-Password: App-specific password
-
Environment Variables (fallback):
ICLOUD_EMAILICLOUD_APP_SPECIFIC_PASSWORD
If credentials are not found in either location, the server returns a 401 error.
Usage
Local Usage (stdio transport)
# Using Python directly
python run.py
# Or using the module
python -m icloud_mcp.server
Server Usage (Streamable HTTP transport)
# Using Python
python run.py --http --port 8000
# Using Docker Compose
docker-compose up
The server will be available at http://localhost:8000/mcp.
Integration with Claude Desktop
This method allows Claude Desktop to directly launch the MCP server as a subprocess.
Step 1: Install dependencies locally:
pip install -e .
Step 2: Create a .env file with your credentials:
cp .env.example .env
# Edit .env and add your iCloud credentials
Step 3: Find your Claude Desktop configuration file:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json
Step 4: Add this configuration (replace the path):
{
"mcpServers": {
"icloud": {
"command": "python",
"args": ["/absolute/path/to/icloud-mcp/run.py"],
"network": {
"enabled": true,
"allowedDomains": [
"caldav.icloud.com",
"contacts.icloud.com",
"*.contacts.icloud.com",
"imap.mail.me.com",
"smtp.mail.me.com"
]
}
}
}
}
Important: Replace /absolute/path/to/icloud-mcp/ with the actual full path to your project directory.
Example on macOS:
{
"mcpServers": {
"icloud": {
"command": "python",
"args": ["/Users/username/Projects/icloud-mcp/run.py"],
"network": {
"enabled": true,
"allowedDomains": [
"caldav.icloud.com",
"contacts.icloud.com",
"*.contacts.icloud.com",
"imap.mail.me.com",
"smtp.mail.me.com"
]
}
}
}
}
Note: The network.allowedDomains configuration is required for contacts to work properly, as the server needs to access iCloud's CardDAV servers.
Step 5: Restart Claude Desktop completely (Quit and reopen)
Verification
After restarting Claude Desktop:
- Open Claude Desktop application
- Look for the šØ (tools/hammer) icon in the bottom-right corner
- You should see "icloud" server listed with green status
- Try commands like:
- "List my calendars"
- "Show my contacts"
- "Get my unread emails"
Troubleshooting
Server doesn't appear:
- Check JSON syntax in config file (use a JSON validator)
- View logs: Help ā Show Logs in Claude Desktop
- Verify the path to
run.pyis absolute (not relative) - Ensure Python is in your PATH
- Check that you're using Python 3.10-3.12 (not 3.13+)
401 Authentication errors:
- Ensure you're using an App-Specific Password, not your regular Apple password
- Generate one at: https://appleid.apple.com/account/manage
- Check
.envfile has correct credentials
Contacts not working (empty results or errors):
- Ensure you've added the
network.allowedDomainsconfiguration to Claude Desktop config - The domains
contacts.icloud.comand*.contacts.icloud.commust be in the allowed list - Restart Claude Desktop after updating the config
Tools fail with 500 errors:
- Check server logs for details
- Verify iCloud credentials are valid
- Ensure network connectivity to iCloud servers
Architecture
Stateless Design
The server is fully stateless:
- No sessions or state stored between requests
- Each request contains all necessary authentication information
- Connections to iCloud services are created per-request and closed immediately
- Perfect for horizontal scaling and serverless deployments
Technical Implementation
- Transport: Streamable HTTP protocol with
/mcpendpoint - Calendar (CalDAV): Uses
caldavlibrary for standard CalDAV operations - Contacts (CardDAV): Direct HTTP/WebDAV implementation using
requestswith proper RFC 6352 CardDAV protocol - Email (IMAP/SMTP): Uses
imapclientfor IMAP and standardsmtplibfor SMTP - Authentication: Headers via
get_http_headers()with environment variable fallback
Security Considerations
- Always use HTTPS in production when using HTTP transport
- Store App-Specific Passwords securely (use secret management tools)
- Consider using header-based authentication for multi-user scenarios
- Never commit
.envfile to version control - Network access is restricted to allowed iCloud domains only
Development
Project Structure
icloud-mcp/
āāā src/
ā āāā icloud_mcp/
ā āāā __init__.py
ā āāā config.py # Configuration management
ā āāā auth.py # Authentication handling
ā āāā calendar.py # CalDAV tools
ā āāā contacts.py # CardDAV tools (direct HTTP/WebDAV)
ā āāā email.py # IMAP/SMTP tools
ā āāā server.py # FastMCP server and tool registration
āāā .env.example # Example environment configuration
āāā .gitignore
āāā Dockerfile
āāā docker-compose.yml
āāā pyproject.toml # Python project configuration and dependencies
āāā run.py # Entry point script
āāā README.md
Running Tests
# Install development dependencies
pip install -e ".[dev]"
# Run tests (when added)
pytest
Code Formatting
# Format code
black src/
# Lint code
ruff check src/
License
MIT License - See LICENSE file for details
Contributing
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Make your changes
- Submit a pull request
Support
For issues and questions:
- Open an issue on GitHub
- Check existing issues for solutions
- Review iCloud API documentation
Acknowledgments
Built with:
- FastMCP - MCP server framework
- caldav - CalDAV library for calendar operations
- requests - HTTP library for CardDAV operations
- IMAPClient - IMAP library
- vobject - vCard/iCalendar parsing
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.