Skip to main content
Glama

list_threads

Retrieve email conversation threads from a Gmail mailbox with filtering options for search queries, labels, and result limits.

Instructions

List threads in the user's mailbox

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
maxResultsNoMaximum number of threads to return
pageTokenNoPage token to retrieve a specific page of results
qNoOnly return threads matching the specified query
labelIdsNoOnly return threads with labels that match all of the specified label IDs
includeSpamTrashNoInclude threads from SPAM and TRASH in the results
includeBodyHtmlNoWhether to include the parsed HTML in the return for each body, excluded by default because they can be excessively large

Implementation Reference

  • Full implementation of the 'list_threads' tool, including registration, input schema, and handler function. The handler calls the Gmail API to list threads, optionally decodes and processes message payloads (filtering headers, decoding base64 bodies), and formats the response.
    server.tool("list_threads", "List threads in the user's mailbox", { maxResults: z.number().optional().describe("Maximum number of threads to return"), pageToken: z.string().optional().describe("Page token to retrieve a specific page of results"), q: z.string().optional().describe("Only return threads matching the specified query"), labelIds: z.array(z.string()).optional().describe("Only return threads with labels that match all of the specified label IDs"), includeSpamTrash: z.boolean().optional().describe("Include threads from SPAM and TRASH in the results"), includeBodyHtml: z.boolean().optional().describe("Whether to include the parsed HTML in the return for each body, excluded by default because they can be excessively large"), }, async (params) => { return handleTool(config, async (gmail: gmail_v1.Gmail) => { const { data } = await gmail.users.threads.list({ userId: 'me', ...params }) if (data.threads) { data.threads = data.threads.map(thread => { if (thread.messages) { thread.messages = thread.messages.map(message => { if (message.payload) { message.payload = processMessagePart( message.payload, params.includeBodyHtml ) } return message }) } return thread }) } return formatResponse(data) }) } )
  • Input schema (Zod) for the list_threads tool parameters.
    { maxResults: z.number().optional().describe("Maximum number of threads to return"), pageToken: z.string().optional().describe("Page token to retrieve a specific page of results"), q: z.string().optional().describe("Only return threads matching the specified query"), labelIds: z.array(z.string()).optional().describe("Only return threads with labels that match all of the specified label IDs"), includeSpamTrash: z.boolean().optional().describe("Include threads from SPAM and TRASH in the results"), includeBodyHtml: z.boolean().optional().describe("Whether to include the parsed HTML in the return for each body, excluded by default because they can be excessively large"), },
  • Helper function used by list_threads to recursively process message parts: decode base64 bodies (unless HTML and not requested), filter headers to specific list, used to clean up responses.
    const processMessagePart = (messagePart: MessagePart, includeBodyHtml = false): MessagePart => { if ((messagePart.mimeType !== 'text/html' || includeBodyHtml) && messagePart.body) { messagePart.body = decodedBody(messagePart.body) } if (messagePart.parts) { messagePart.parts = messagePart.parts.map(part => processMessagePart(part, includeBodyHtml)) } if (messagePart.headers) { messagePart.headers = messagePart.headers.filter(header => RESPONSE_HEADERS_LIST.includes(header.name || '')) } return messagePart }
  • Shared helper invoked by list_threads handler: handles OAuth2 client creation/validation, Gmail client setup, executes the API call, catches errors.
    const handleTool = async (queryConfig: Record<string, any> | undefined, apiCall: (gmail: gmail_v1.Gmail) => Promise<any>) => { try { const oauth2Client = queryConfig ? createOAuth2Client(queryConfig) : defaultOAuth2Client if (!oauth2Client) throw new Error('OAuth2 client could not be created, please check your credentials') const credentialsAreValid = await validateCredentials(oauth2Client) if (!credentialsAreValid) throw new Error('OAuth2 credentials are invalid, please re-authenticate') const gmailClient = queryConfig ? google.gmail({ version: 'v1', auth: oauth2Client }) : defaultGmailClient if (!gmailClient) throw new Error('Gmail client could not be created, please check your credentials') const result = await apiCall(gmailClient) return result } catch (error: any) { return `Tool execution failed: ${error.message}` } }

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/HitmanLy007/gmail-mcp'

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