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 auth
1 hr
so relogin if get any error like Error: No refresh token is set.
gmail-server-credentials.json
settings.json
To 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.json
To 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-emails
summarize-top-k-emails
get-unread-emails
Performing 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.