UNPKG

@aot-tech/gmail-mcp-server

Version:

Gmail MCP Server with Bearer Token Authentication - A Model Context Protocol server for Gmail access

81 lines (80 loc) 3.36 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.searchEmailsTool = void 0; const email_schemas_1 = require("../validation/email-schemas"); const api_1 = require("../gmail-sdk/api"); const email_1 = require("../utils/email"); const index_1 = require("../config/index"); exports.searchEmailsTool = { name: 'gmail_search_emails', description: 'Search emails using Gmail search syntax', parameters: { type: 'object', properties: { query: { type: 'string', description: 'Gmail search query (e.g., "from:example@gmail.com", "has:attachment", "after:2024/01/01")', }, maxResults: { type: 'number', description: 'Maximum number of results to return (1-500, default: 10)', minimum: 1, maximum: 500, default: 10, }, }, required: ['query'], }, handler: async (args) => { try { const { query, maxResults } = email_schemas_1.SearchEmailsSchema.parse(args); const result = await (0, api_1.searchEmails)(query, maxResults); const messages = result.messages || []; if (messages.length === 0) { return { content: [ { type: 'text', text: 'No emails found matching your search criteria.', }, ], }; } const messagesToShow = messages.slice(0, index_1.config.constants.maxEmailsToShow); const messageIds = messagesToShow.map(msg => msg.id); const emailDetails = await (0, api_1.getMultipleEmailDetails)(messageIds); const messageDetails = emailDetails.map(detail => { if (detail.error) { return `• ID: ${detail.id} (${detail.error})`; } const headers = detail.details.payload?.headers || []; const from = (0, email_1.extractHeaderValue)(headers, 'From') || 'Unknown'; const subject = (0, email_1.extractHeaderValue)(headers, 'Subject') || 'No Subject'; const date = (0, email_1.extractHeaderValue)(headers, 'Date') || 'Unknown Date'; return (0, email_1.formatSearchResult)(detail.id, from, subject, date); }); const totalResults = result.resultSizeEstimate || messages.length; const showing = Math.min(index_1.config.constants.maxEmailsToShow, messages.length); return { content: [ { type: 'text', text: `Found ${totalResults} emails (showing first ${showing}):\n\n${messageDetails.join('\n\n')}`, }, ], }; } catch (error) { const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred'; return { content: [ { type: 'text', text: `Error searching emails: ${errorMessage}`, }, ], isError: true, }; } }, };