Enables AI assistants to interact with Gmail through OAuth2 authentication, providing tools for listing emails, searching messages, reading email content, creating drafts, and sending emails with safety-first draft mode by default.
Uses Google Cloud Console for OAuth2 credential setup and Gmail API access configuration to enable Gmail integration.
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., "@Gmail MCP Serversearch for emails from Amazon in the last week"
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.
π§ Gmail MCP Server
A powerful MCP (Model Context Protocol) server that enables AI assistants to interact with Gmail through OAuth2 authentication with safety-first design. Built with TypeScript and designed for seamless integration with Claude Desktop and other MCP-compatible clients.
π Table of Contents
β¨ Features
π‘οΈ Safety First - Draft-only mode by default prevents accidental email sends
π Smart Drafts - Create drafts for new emails and replies with custom content
π¬ List Emails - Retrieve recent emails with advanced filtering options
π Get Email Details - Fetch complete email content including attachments info
π Search Emails - Use Gmail's powerful search syntax to find specific emails
βοΈ Send Emails - Direct sending (disabled by default, enable with caution)
π Secure OAuth2 - Industry-standard authentication with refresh token support
π― Type-Safe - Full TypeScript implementation with strict typing
π High Performance - Optimized with parallel processing and smart caching
π Prerequisites
Before you begin, ensure you have:
Node.js 18.0 or higher
npm or yarn package manager
Google Account with Gmail enabled
Google Cloud Console access
Claude Desktop (optional, for integration)
π¦ Installation
Clone the repository:
git clone https://github.com/JaviEzpeleta/gmail-mcp-server.git
cd gmail-mcp-serverInstall dependencies:
npm installCreate environment file:
cp .env.example .envπ‘οΈ Security Note: By default, direct email sending is disabled for safety. The server will create drafts instead, which you can review and send manually from Gmail.
βοΈ Configuration
1. Google Cloud Console Setup
Create or select a project:
Go to Google Cloud Console
Click on the project dropdown and select "New Project"
Give your project a name (e.g., "Gmail MCP Server")
Click "Create"
Enable Gmail API:
In the sidebar, navigate to APIs & Services β Library
Search for "Gmail API"
Click on Gmail API from the results
Click Enable
Wait for the API to be enabled (usually takes a few seconds)
2. Create OAuth2 Credentials
Configure OAuth consent screen:
Go to APIs & Services β OAuth consent screen
Select "External" user type (unless you have a Google Workspace account)
Fill in the required fields:
App name: "Gmail MCP Server"
User support email: Your email
Developer contact: Your email
Add scopes:
https://www.googleapis.com/auth/gmail.readonlyhttps://www.googleapis.com/auth/gmail.sendhttps://www.googleapis.com/auth/gmail.modify
Add test users (important!):
Add your Gmail address and any other accounts you want to use
Save and continue through all steps
Create OAuth client:
Go to APIs & Services β Credentials
Click + CREATE CREDENTIALS β OAuth client ID
Application type: Web application β οΈ (NOT Desktop app)
Name: "Gmail MCP Web Client"
Configure Authorized redirect URIs:
Click + ADD URI
Add:
http://localhost:8765/oauth2callback(default port)If you plan to use a custom port, add:
http://localhost:YOUR_PORT/oauth2callback
Click Create
Download the credentials (you'll see a download button or JSON option)
Save the
client_idandclient_secretfrom the downloaded file
β οΈ Important: Desktop app type doesn't allow custom redirect URIs, but we need
localhost:PORT/oauth2callbackfor the OAuth flow to work. That's why we use Web application instead.
3. Generate Refresh Token
Add credentials to .env:
GMAIL_CLIENT_ID=your_client_id_here
GMAIL_CLIENT_SECRET=your_client_secret_here
GMAIL_REFRESH_TOKEN=
# Security: Keep this false unless you need direct sending
GMAIL_ALLOW_DIRECT_SEND=false
# OAuth setup port (must match the redirect URI you configured above)
OAUTH_REDIRECT_PORT=8765π‘ Port Configuration: The
OAUTH_REDIRECT_PORTmust match the port you configured in the Google Cloud Console redirect URI. If you usedhttp://localhost:8765/oauth2callback, keep it as 8765. If you used a different port, update this value accordingly.
Run the setup script:
npm run setup
# or
npm run dev src/get-refresh-token-desktop.tsAuthorize the application:
A browser window will open automatically
Sign in with your Google account
Grant all requested permissions
You'll be redirected to a success page
Save the refresh token:
The terminal will display your refresh token
Copy the complete
GMAIL_REFRESH_TOKENvalueAdd it to your
.envfile
π Usage
Standalone Server
Build the project:
npm run buildStart the server:
npm startThe server will start and listen for MCP commands via stdio.
Claude Desktop Integration
Build the project first:
npm run buildLocate Claude Desktop config:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
Edit the configuration file:
{
"mcpServers": {
"gmail": {
"command": "node",
"args": ["/absolute/path/to/gmail-mcp-server/dist/index.js"],
"env": {
"GMAIL_CLIENT_ID": "your_client_id",
"GMAIL_CLIENT_SECRET": "your_client_secret",
"GMAIL_REFRESH_TOKEN": "your_refresh_token",
"GMAIL_ALLOW_DIRECT_SEND": "false"
}
}
}
}Restart Claude Desktop
Verify the connection:
Open Claude Desktop
Look for the π icon indicating MCP connection
Try: "List my recent emails"
π οΈ Available Tools
π‘οΈ Safety Notice: Tools marked with π‘οΈ create drafts by default for your safety. Direct sending tools marked with π¨ are disabled by default.
π¬ list_emails
List recent emails with optional filtering.
Parameters:
maxResults(number, 1-100): Maximum emails to return (default: 10)query(string): Gmail search query (e.g., "is:unread")includeSpamTrash(boolean): Include SPAM/TRASH folders (default: false)
Example:
List my 5 most recent unread emailsπ get_email_details
Get complete details and content of a specific email.
Parameters:
emailId(string, required): The email ID to retrieveformat(string): Level of detail - "full", "minimal", or "metadata" (default: "full")
Example:
Get the full content of email ID 18abc123defπ‘οΈ create_draft
Create an email draft with optional CC/BCC recipients (recommended for AI assistants).
Parameters:
to(string, required): Recipient email addresssubject(string, required): Email subjectbody(string, required): Email body (plain text or HTML)cc(string): CC recipients (comma-separated)bcc(string): BCC recipients (comma-separated)
Example:
Create a draft email to john@example.com with subject "Meeting Tomorrow" and body "Let's meet at 10 AM"π¨ send_email (Disabled by Default)
Send an email directly with optional CC/BCC recipients.
β οΈ Security Warning: This tool is disabled by default. Set GMAIL_ALLOW_DIRECT_SEND=true to enable.
Parameters:
to(string, required): Recipient email addresssubject(string, required): Email subjectbody(string, required): Email body (plain text or HTML)cc(string): CC recipients (comma-separated)bcc(string): BCC recipients (comma-separated)
Example:
Send an email to john@example.com with subject "Meeting Tomorrow" and body "Let's meet at 10 AM"π search_emails
Search emails using Gmail's advanced search syntax.
Parameters:
query(string, required): Gmail search querymaxResults(number, 1-100): Maximum results (default: 10)includeSpamTrash(boolean): Include SPAM/TRASH (default: false)
Example Gmail search queries:
from:user@example.com- Emails from a specific sendersubject:"important meeting"- Emails with exact phrase in subjecthas:attachment- Emails with attachmentsis:unread- Unread emailsnewer_than:2d- Emails from last 2 dayslabel:work- Emails with specific label
π‘οΈ find_and_draft_reply
Find the latest email from a sender and create a draft reply with optional custom content.
Parameters:
senderName(string, required): Sender name or email addressreplyBody(string, optional): Custom reply content (template used if not provided)
Example:
Create a draft reply to the latest email from John Smith saying "Thanks for your message. I'll get back to you soon."π Examples
Basic Usage Examples
List recent emails:
Show me my 10 most recent emailsSearch for specific emails:
Search for emails from alice@example.com with attachmentsCreate a draft email:
Create a draft email to bob@example.com saying "Thanks for your help!"Create a draft reply:
Draft a reply to the latest email from support@company.comAdvanced Usage Examples
Complex search:
Find all unread emails from the last week with "invoice" in the subjectDraft with CC:
Create a draft email to team@company.com with CC to manager@company.com about the project updateGet email details:
Show me the full content of the most recent email from my bossπ§ Troubleshooting
Common Issues and Solutions
β Error: Missing required environment variables
Solution: Ensure all required environment variables are set in your .env file:
GMAIL_CLIENT_IDGMAIL_CLIENT_SECRETGMAIL_REFRESH_TOKENGMAIL_ALLOW_DIRECT_SEND(optional, defaults tofalse)OAUTH_REDIRECT_PORT(optional, defaults to8765)
β Error: redirect_uri_mismatch
Problem: OAuth setup fails with "The redirect URI in the request does not match the ones authorized for the OAuth client."
Solution:
Go to Google Cloud Console β APIs & Services β Credentials
Click on your OAuth client
In "Authorized redirect URIs", ensure you have:
http://localhost:8765/oauth2callbackIf using a custom port, add:
http://localhost:YOUR_PORT/oauth2callbackMake sure your
.envfile has the matchingOAUTH_REDIRECT_PORT=8765Important: OAuth client must be Web application type, not Desktop app
This error commonly occurs when following old documentation that suggests using "Desktop app" type, which doesn't support custom redirect URIs.
π‘οΈ Security: Direct email sending is disabled
This is normal and safe behavior. By default, the server creates drafts instead of sending emails directly.
Solutions:
Recommended: Use
create_drafttool instead ofsend_emailAlternative: Set
GMAIL_ALLOW_DIRECT_SEND=truein your.envfile (not recommended for AI assistants)
β Error 403: access_denied
Solution:
Go to Google Cloud Console β OAuth consent screen
Add your email as a test user
Re-run the token generation process
β Error: invalid_grant
Solution: Your refresh token has expired or is invalid
Delete the old refresh token from
.envRun
npm run setupagainComplete the authorization flow
Update
.envwith the new token
β Gmail API not enabled
Solution:
Go to Google Cloud Console
Navigate to APIs & Services β Library
Search for "Gmail API"
Click Enable
β Claude Desktop doesn't show the MCP server
Solution:
Verify the config file path is correct
Ensure all paths in the config are absolute paths
Check that the built files exist in
dist/Restart Claude Desktop completely
Check Claude Desktop logs for errors
β Rate limit exceeded
Solution:
Gmail API has quotas (250 quota units per user per second)
Implement exponential backoff for retries
Reduce the number of parallel requests
π Security Guidelines
Draft-First Approach
This server implements a safety-first design to prevent accidental email sends:
Default behavior: Creates drafts that require manual review
Protection:
send_emailtool is disabled by defaultUser control: Explicit environment variable required for direct sending
Recommended Usage
β Safe for AI assistants:
create_draft- Creates email draftsfind_and_draft_reply- Creates reply draftslist_emails,search_emails,get_email_details- Read-only operations
β οΈ Use with caution:
send_email- Only enable if you fully trust the AI assistant and understand the risks
Best Practices
Keep
GMAIL_ALLOW_DIRECT_SEND=falseunless absolutely necessaryReview all drafts before sending manually from Gmail
Test thoroughly in a safe environment before production use
Monitor usage and check for unexpected behavior
π¨ Development
Available Scripts
# Development with hot reload
npm run dev
# Build TypeScript to JavaScript
npm run build
# Start production server
npm start
# Generate OAuth refresh token
npm run setup
# Run tests
npm test
# Lint code
npm run lint
Project Structure
gmail-mcp-server/
βββ src/
β βββ index.ts # Main server implementation
β βββ get-refresh-token-desktop.ts # OAuth setup utility
βββ dist/ # Compiled JavaScript (generated)
βββ examples/ # Usage examples
βββ docs/ # Additional documentation
βββ .env.example # Environment variables template
βββ tsconfig.json # TypeScript configuration
βββ package.json # Project dependencies
βββ README.md # This fileTesting
Test the connection and basic functionality:
# Test Gmail connection
npm run dev test-gmail-connection.ts
# Test with MCP client
npm run dev test-list-emails.jsπ€ Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Fork the repository
Create your feature branch (
git checkout -b feature/AmazingFeature)Commit your changes (
git commit -m 'Add some AmazingFeature')Push to the branch (
git push origin feature/AmazingFeature)Open a Pull Request
π License
This project is licensed under the MIT License - see the LICENSE file for details.
π Acknowledgments
Google Gmail API for email functionality
Model Context Protocol for the MCP specification
Anthropic for Claude and MCP development
π Support
For issues, questions, or suggestions:
Open an issue on GitHub
Check existing issues for solutions
Read the Gmail API documentation
Made with β€οΈ by Javi Ezpeleta
This server cannot be installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.