# MCP Gmail Server A Model Context Protocol (MCP) server that provides Gmail access for LLMs, powered by the [MCP Python SDK](https://github.com/modelcontextprotocol/python-sdk). ## Features - Expose Gmail messages as MCP resources - Provide tools for composing, sending, and managing emails - OAuth 2.0 authentication with Google's Gmail API ## Prerequisites - Python 3.10+ - Gmail account with API access - [uv](https://github.com/astral-sh/uv) for Python package management (recommended) ## Setup ### 1. Install dependencies Install project dependencies (uv automatically creates and manages a virtual environment) ```bash uv sync ``` ### 2. Configure Gmail OAuth credentials There's unfortunately a lot of steps required to use the Gmail API. I've attempted to capture all of the required steps (as of March 28, 2025) but things may change. #### Google Cloud Setup 1. **Create a Google Cloud Project** - Go to [Google Cloud Console](https://console.cloud.google.com/) - Click on the project dropdown at the top of the page - Click "New Project" - Enter a project name (e.g., "MCP Gmail Integration") - Click "Create" - Wait for the project to be created and select it from the dropdown 2. **Enable the Gmail API** - In your Google Cloud project, go to the navigation menu (≡) - Select "APIs & Services" > "Library" - Search for "Gmail API" - Click on the Gmail API card - Click "Enable" 3. **Configure OAuth Consent Screen** - Go to "APIs & Services" > "OAuth consent screen" - You will likely see something like "Google Auth Platform not configured yet" - Click on "Get started" - Fill in the required application information: - App name: "MCP Gmail Integration" - User support email: Your email address - Fill in the required audience information: - Choose "External" user type (unless you have a Google Workspace organization) - Fill in the required contact information: - Your email address - Click "Save and Continue" - Click "Create" 4. **Create OAuth Credentials** - Go to "APIs & Services" > "Credentials" - Click "Create Credentials" > "OAuth client ID" - Choose "Desktop app" as the application type - Enter a name (e.g., "MCP Gmail Desktop Client") - Click "Create" - Click "Download JSON" for the credentials you just created - Save the file as `credentials.json` in your project root directory 5. **Add scopes** - Go to "APIs & Services" > "OAuth consent screen" - Go to the "Data Access" tab - Click "Add or remove scopes" - Search for the Gmail API - Select the scope for `.../auth/gmail.modify` which grants permission to "Read, compose, and send emails from your Gmail account" - Click update - Click save Verify that you've set up your OAuth configuration correctly by running a simple test script. ```bash uv run python scripts/test_gmail_setup.py ``` You should be able to see usage metrics at https://console.cloud.google.com/apis/api/gmail.googleapis.com/metrics ### 3. Run the server Development mode: ```bash uv run mcp dev mcp_gmail/server.py ``` This will spin up an MCP Inspector application that you can use to interact with the MCP server. Or install for use with Claude Desktop: ```bash uv run mcp install \ --with-editable . --name gmail \ --env-var MCP_GMAIL_CREDENTIALS_PATH=$(pwd)/credentials.json \ --env-var MCP_GMAIL_TOKEN_PATH=$(pwd)/token.json \ mcp_gmail/server.py ``` > [!NOTE] > If you encounter an error like `Error: spawn uv ENOENT` when spinning up Claude Desktop and initializing the MCP server, you may need to update your `claude_desktop_config.json` to provide the **absolute** path to `uv`. Go to Claude Desktop -> Settings -> Developer -> Edit Config. > > ```json > { > "mcpServers": { > "gmail": { > "command": "~/.local/bin/uv", > } > } > } > ``` ## Development ### Linting and Testing Run linting and formatting: ```bash # Format code uv run ruff format . # Lint code with auto-fixes where possible uv run ruff check --fix . # Run tests uv run pytest tests/ ``` ### Pre-commit Hooks This project uses pre-commit hooks to ensure code quality. The hooks automatically run before each commit to verify code formatting and linting standards. Install the pre-commit hooks: ```bash pre-commit install ``` Run pre-commit manually on all files: ```bash pre-commit run --all-files ``` ## Usage Once running, you can connect to the MCP server using any MCP client or via Claude Desktop. ### Available Resources - `gmail://messages/{message_id}` - Access email messages - `gmail://threads/{thread_id}` - Access email threads ### Available Tools - `compose_email` - Create a new email draft - `send_email` - Send an email - `search_emails` - Search for emails with specific filters (from, to, subject, dates, etc.) - `query_emails` - Search for emails using raw Gmail query syntax - `get_emails` - Retrieve multiple email messages by their IDs - `list_available_labels` - Get all available Gmail labels - `mark_message_read` - Mark a message as read - `add_label_to_message` - Add a label to a message - `remove_label_from_message` - Remove a label from a message ## Environment Variables You can configure the server using environment variables: - `MCP_GMAIL_CREDENTIALS_PATH`: Path to the OAuth credentials JSON file (default: "credentials.json") - `MCP_GMAIL_TOKEN_PATH`: Path to store the OAuth token (default: "token.json") - `MCP_GMAIL_MAX_RESULTS`: Default maximum results for search queries (default: 10) ## License MIT