Skip to main content
Glama
searchEmails.js3.58 kB
import { google } from "googleapis"; export function createSearchEmailsTool() { return async (args) => { try { const config = { clientId: process.env.GMAIL_CLIENT_ID, clientSecret: process.env.GMAIL_CLIENT_SECRET, refreshToken: process.env.GMAIL_REFRESH_TOKEN, accessToken: process.env.GMAIL_ACCESS_TOKEN, }; if (!config.clientId || !config.clientSecret || !config.refreshToken) { throw new Error("Gmail configuration missing. Please set GMAIL_CLIENT_ID, GMAIL_CLIENT_SECRET, and GMAIL_REFRESH_TOKEN"); } const oauth2Client = new google.auth.OAuth2(config.clientId, config.clientSecret); oauth2Client.setCredentials({ refresh_token: config.refreshToken, access_token: config.accessToken, }); const gmail = google.gmail({ version: "v1", auth: oauth2Client }); // Build search query let searchQuery = args.query; if (args.folder !== "INBOX") { searchQuery += ` in:${args.folder}`; } const messagesResponse = await gmail.users.messages.list({ userId: "me", q: searchQuery, maxResults: args.limit, }); const messages = messagesResponse.data.messages || []; const emails = []; for (const message of messages) { if (!message.id) continue; const messageDetail = await gmail.users.messages.get({ userId: "me", id: message.id, }); const payload = messageDetail.data.payload; if (!payload?.headers) continue; const headers = payload.headers.reduce((acc, header) => { acc[header.name.toLowerCase()] = header.value; return acc; }, {}); emails.push({ id: message.id, from: headers.from || "", to: headers.to || "", subject: headers.subject || "", snippet: messageDetail.data.snippet || "", date: headers.date || "", }); } const resultText = emails.length > 0 ? `🔍 Found ${emails.length} email(s) matching "${args.query}":\n\n` + emails.map((email, index) => `${index + 1}. **${email.subject}**\n` + ` From: ${email.from}\n` + ` Date: ${email.date}\n` + ` Snippet: ${email.snippet}\n` + ` Message ID: ${email.id}\n` + ` ---\n`).join("\n") : `🔍 No emails found matching "${args.query}" in ${args.folder}`; return { content: [ { type: "text", text: resultText, }, ], }; } catch (error) { const errorMessage = error instanceof Error ? error.message : "Unknown error occurred"; return { content: [ { type: "text", text: `❌ Failed to search emails: ${errorMessage}`, }, ], }; } }; }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/tianpeijun/email-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server