Skip to main content
Glama
SachinPandey22

Gmail MCP Local Server

README.md
# Gmail MCP Local Server

A local MCP (Model Context Protocol) server that gives Claude the ability to send emails, manage drafts, and search Gmail — capabilities missing from Anthropic's built-in Gmail connector.

---

## What is MCP and how does this work?

MCP is a protocol that lets Claude call real-world tools. When you register an MCP server, Claude Desktop launches it as a background subprocess and routes tool calls to it over stdin/stdout.

```
You talk to Claude
       │
       ▼
Claude decides which tool to use
       │
       ▼
MCP server executes the action
(send email, search messages, etc.)
       │
       ▼
Real world effect happens
```

You never run this script manually. Claude Desktop starts and stops it automatically.

---

## Tools

| Tool | Description |
|------|-------------|
| `gmail_send_email` | Compose and immediately send an email |
| `gmail_send_draft` | Send an existing draft by its draft ID |
| `gmail_create_draft` | Save a composed email as a draft without sending |
| `gmail_list_drafts` | List saved drafts with subject and recipient info |
| `gmail_search_messages` | Search messages using Gmail query syntax |
| `gmail_read_message` | Read the full decoded body of a message |

---

## Setup

### 1. Install dependencies

```bash
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
```

### 2. Google Cloud setup

You need a `credentials.json` from Google Cloud Console. This is your app's identity card with Google.

1. Go to [console.cloud.google.com](https://console.cloud.google.com)
2. Create a project
3. Go to **APIs & Services → Library** → enable **Gmail API**
4. Go to **APIs & Services → OAuth consent screen**
   - Choose **External** → fill in app name and your email
   - Under **Test users**, add your Gmail address
5. Go to **APIs & Services → Credentials → Create Credentials → OAuth 2.0 Client ID**
   - Application type: **Desktop app**
   - Download the JSON and save it as `credentials.json` in this folder

Copy `.env.example` to `.env` and fill in your values (these match what's inside `credentials.json`):

```bash
cp .env.example .env
```

### 3. Register with Claude Desktop

Open `~/Library/Application Support/Claude/claude_desktop_config.json` and add:

```json
{
  "mcpServers": {
    "gmail": {
      "command": "/FULL/PATH/TO/gmail_mcp/venv/bin/python3",
      "args": ["/FULL/PATH/TO/gmail_mcp/gmail_mcp.py"]
    }
  }
}
```

Restart Claude Desktop.

---

## First-run OAuth (one time only)

The first time Claude uses a Gmail tool, a browser window will open asking you to sign in with Google and grant access. After you approve:

- A `token.json` file is saved in this folder
- All future runs reuse this token silently
- The token auto-refreshes when it expires — no action needed

**Why the test user step matters:** Google blocks OAuth for apps in "Testing" mode unless your email is explicitly listed as a test user. That's the `403: access_denied` error if skipped.

---

## How Claude Desktop manages the server

```
Claude Desktop starts
       │
       │  spawns subprocess automatically
       ▼
gmail_mcp.py runs in background
       │
       │  reads token.json for auth
       ▼
Gmail API (Google's servers)
```

- No manual start needed — Claude Desktop handles it
- The server only runs while Claude Desktop is open
- If you use a scheduler, it only fires while Claude Desktop is running on your machine

---

## Security

- `token.json` contains a live OAuth refresh token — full Gmail access. Keep it private.
- `credentials.json` contains your app's client secret. Keep it private.
- Neither file is committed to git (covered by `.gitignore`)
- If your token is compromised, revoke it at [myaccount.google.com/permissions](https://myaccount.google.com/permissions) and delete `token.json` to force re-auth

---

## What else can you build with MCP?

MCP works with any API. Some ideas:

- **Google Calendar** — create and read events
- **Notion** — read/write pages and databases
- **Slack** — send messages, read channels
- **GitHub** — open issues, create PRs
- **Google Sheets** — read/write spreadsheet data
- **SMS / WhatsApp** — send messages via Twilio
- **Local filesystem** — read/write files in specific folders
- **Databases** — query SQLite or Postgres

The pattern is always the same: write a Python file with `@mcp.tool()` functions, register it in `claude_desktop_config.json`, and Claude can act in the real world through it.