mcp-personal
mcp-personal
MCP server exposing Gmail, Outlook and Mercadona tools for Cursor and LangChain.
Installation
npm installCopy environment variables and fill in your credentials:
cp .env.example .env
# Edit .env with your Google and/or Microsoft app credentialsCredentials
Gmail
Go to Google Cloud Console.
Create or select a project, then enable the Gmail API.
Under APIs & Services → Credentials, create an OAuth 2.0 Client ID (Desktop app or Web application; if Web, set redirect URI to
http://localhost:3333/oauth2callbackor the value you use forGOOGLE_REDIRECT_URIso it does not clash with the MCP server port).Put the Client ID and Client Secret in
.envasGOOGLE_CLIENT_IDandGOOGLE_CLIENT_SECRET.
Outlook
Go to Azure Portal → App registrations → New registration.
Set supported account types and redirect URI as needed. For device code flow, no redirect is required.
Under Certificates & secrets, create a client secret if your app type needs it (e.g. confidential client).
Under API permissions, add Microsoft Graph → Delegated:
Mail.Read,Mail.Send,User.Read,offline_access.Put Application (client) ID and Directory (tenant) ID in
.envasAZURE_CLIENT_IDandAZURE_TENANT_ID. AddAZURE_CLIENT_SECRETif applicable.
Auth scripts (generate token files)
Run once (or when tokens expire) to write gmail-tokens.json and/or outlook-tokens.json in the project root. These files are gitignored.
npm run gmail:auth
npm run outlook:authRun the server
# Development
npm run dev
# Production (build first)
npm run build
npm startServer listens on http://0.0.0.0:3000 by default (override with PORT in .env). MCP endpoint: POST http://localhost:3000/mcp.
Configure MCP in Cursor
Open Cursor Settings → MCP (or edit your MCP config file).
Add a Streamable HTTP (or HTTP) MCP server with:
URL:
http://localhost:3000/mcp(or your deployed URL).Headers (if you set
MCP_API_KEYin.env):Authorization: Bearer <your MCP_API_KEY value>
Example config (structure may vary by Cursor version):
{
"mcpServers": {
"mcp-personal": {
"url": "http://localhost:3000/mcp",
"headers": {
"Authorization": "Bearer YOUR_MCP_API_KEY"
}
}
}
}If you do not set MCP_API_KEY, omit the Authorization header.
Tools
Tool | Description |
| Echo back a message (test tool). |
| List Gmail messages (maxResults, optional labelIds). |
| Get a single Gmail message by ID. |
| Send an email via Gmail (to, subject, body). |
| List Outlook messages (maxResults, optional folder). |
| Get a single Outlook message by ID. |
| Send an email via Outlook (to, subject, body). |
| Search Mercadona products (query). Returns name, price, link. Experimental; site may change. |
Environment variables (reference)
Variable | Description |
| Server port (default 3000). |
| Optional API key; if set, clients must send |
| Gmail OAuth client ID. |
| Gmail OAuth client secret. |
| OAuth redirect URI (e.g. |
| Azure app (client) ID. |
| Azure tenant ID (often |
| Azure client secret if required by app type. |
| Optional path to Gmail tokens file (default: project root |
| Optional path to Outlook tokens file (default: project root |
Token files gmail-tokens.json and outlook-tokens.json are created by the auth scripts and must not be committed.
Mercadona: The mercadona_search tool uses Playwright. On first use you may need to install browsers: npx playwright install chromium.