@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
JavaScript
;
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,
};
}
},
};