A Simple MCP server for Gmail with support for all basic operations with oauth2.0.
This MCP server integrates with Gmail APIs to list, delete, summarize, and send emails and labels.
gcp-oauth-keys.json and place into the root of the repo.npm install from the root directory to install all required dependencies.npm run build from the root repo directory.node dist/mcp.js auth1 hr so relogin if get any error like Error: No refresh token is set.gmail-server-credentials.jsonsettings.jsonTo use this server in VS Code, add the following to your settings.json:
{
"mcpServers": {
"gmail-mcp-server": {
"type": "stdio",
"command": "node",
"args": ["<absolute path to dist/mcp.js>"],
"env": {
"GMAIL_OAUTH_PATH": "<absolute path to gmail-server-credentials.json>",
"ENABLE_RAG": "false" // mark as true if want to use rag
}
}
}
}
claude_desktop_config.jsonTo use this server in Claude Desktop, add the following to your claude_desktop_config.json:
{
"mcpServers": {
"gmail-mcp-server": {
"type": "stdio",
"command": "node",
"args": ["<absolute path to dist/mcp.js>"],
"env": {
"GMAIL_OAUTH_PATH": "<absolute path to gmail-server-credentials.json>",
"ENABLE_RAG": "false" // mark as true if want to use rag
}
}
}
}
Replace the placeholders (<absolute path ...>) with the actual full paths on your system for clarity and reliability.
GMAIL_OAUTH_PATH: Absolute path to your Gmail OAuth credentials JSON file (e.g., gmail-server-credentials.json).ENABLE_RAG: Set to true to enable Retrieval-Augmented Generation (RAG) features; otherwise, set to false.get-gmail-profile: Get Gmail profile details based on userId
userId: The user Gmail ID (string, required)send-email: Send an email to a given email address (supports attachments and HTML)
to: Recipient email address (string, required)subject: Email subject (string, required)body: Email body (string, required)isHtml: Send as HTML email (boolean, optional, default: false)attachments: Array of attachments (base64 encoded, optional)
filename: Attachment filename (string, required)mimeType: MIME type (string, required)content: Base64 encoded content (string, required)create-label: Create a new Gmail label
name: Label name (string, required)delete-email: Delete an email by message ID
messageId: ID of the email message (string, required)summarize-top-k-emails: Summarize the top k emails in the inbox
k: Number of top emails to summarize (number, required)get-unread-emails: Get unread emails from the inbox
maxResults: Maximum number of unread emails to fetch (number, optional, default: 10)global-search-emails: Search emails by subject, sender/recipient, time range, keyword, and label
subject: Subject to search for (string, optional)sender: Sender email address (string, optional)recipient: Recipient email address (string, optional)after: Start date (YYYY/MM/DD) (string, optional)before: End date (YYYY/MM/DD) (string, optional)keyword: Keyword in body/snippet (string, optional)label: Gmail label to filter by (string, optional)maxResults: Maximum results (number, optional, default: 10)list-gmail-labels: List all Gmail labels for the authenticated user
delete-gmail-label: Delete an gmail label by label ID
labelId: ID of the label (string, required)vector-search-emails: Semantic search for emails using vector embeddings (RAG)
query: The search query (string, required)k: Number of top results to return (number, optional, default: 10)To enable semantic search and RAG features:
Run Chroma DB locally
Start a local Chroma DB instance for embedding storage and retrieval. You can use Docker:
docker run -v ./chroma-data:/data -p 8000:8000 chromadb/chroma
./chroma-data) to the container's /data directory, ensuring your Chroma DB data persists even if the container is stopped or removed.-v option, your data will be lost when the container is deleted.Or follow the Chroma DB documentation for other setup options.
Reference:
Indexing emails for embeddings
global-search-emailssummarize-top-k-emailsget-unread-emailsPerforming vector search
vector-search-emails tool to semantically search your indexed emails using natural language queries.Note:
Below is a simplified Mermaid flowchart for how RAG is used to embed, index, and search emails:
flowchart TD
User[User] --> LLM["LLM (calls MCP tools)"]
LLM --> Query["User submits semantic<br/>search query<br/><b>(Triggered from LLM)</b>"]
%% Query Flow
Query --> CheckIndexed{"Emails already<br/>indexed?"}
CheckIndexed -- No --> Fetch["Fetch emails<br/>from Gmail API"]
Fetch --> Embed["Generate embeddings<br/>using xenova"]
Embed --> Index["Index embeddings<br/>in Chroma DB"]
Index --> Searchable["Emails are now<br/>searchable semantically"]
Searchable --> QEmbed["Generate embedding<br/>for query"]
CheckIndexed -- Yes --> QEmbed
QEmbed --> QSearch["Query Chroma DB<br/>for similar emails"]
QSearch --> Result["Return matching emails"]
vector-search-emails, the query is embedded and compared to indexed emails to find the most relevant matches.