create_filter
Create Gmail filters by specifying criteria (sender, subject, size, etc.) and actions (label, forward). Automate email organization.
Instructions
Creates a filter
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| criteria | Yes | Filter criteria | |
| action | Yes | Actions to perform on messages matching the criteria |
Implementation Reference
- src/index.ts:1012-1038 (handler)The 'create_filter' tool handler. It takes 'criteria' and 'action' parameters, and calls gmail.users.settings.filters.create to create a filter in Gmail.
server.tool("create_filter", "Creates a filter", { criteria: z.object({ from: z.string().optional().describe("The sender's display name or email address"), to: z.string().optional().describe("The recipient's display name or email address"), subject: z.string().optional().describe("Case-insensitive phrase in the message's subject"), query: z.string().optional().describe("A Gmail search query that specifies the filter's criteria"), negatedQuery: z.string().optional().describe("A Gmail search query that specifies criteria the message must not match"), hasAttachment: z.boolean().optional().describe("Whether the message has any attachment"), excludeChats: z.boolean().optional().describe("Whether the response should exclude chats"), size: z.number().optional().describe("The size of the entire RFC822 message in bytes"), sizeComparison: z.enum(['smaller', 'larger']).optional().describe("How the message size in bytes should be in relation to the size field") }).describe("Filter criteria"), action: z.object({ addLabelIds: z.array(z.string()).optional().describe("List of labels to add to messages"), removeLabelIds: z.array(z.string()).optional().describe("List of labels to remove from messages"), forward: z.string().optional().describe("Email address that the message should be forwarded to") }).describe("Actions to perform on messages matching the criteria") }, async (params) => { return handleTool(config, async (gmail: gmail_v1.Gmail) => { const { data } = await gmail.users.settings.filters.create({ userId: 'me', requestBody: params }) return formatResponse(data) }) } ) - src/index.ts:1014-1031 (schema)The Zod schema for 'create_filter' input validation, defining 'criteria' (from, to, subject, query, negatedQuery, hasAttachment, excludeChats, size, sizeComparison) and 'action' (addLabelIds, removeLabelIds, forward) objects.
{ criteria: z.object({ from: z.string().optional().describe("The sender's display name or email address"), to: z.string().optional().describe("The recipient's display name or email address"), subject: z.string().optional().describe("Case-insensitive phrase in the message's subject"), query: z.string().optional().describe("A Gmail search query that specifies the filter's criteria"), negatedQuery: z.string().optional().describe("A Gmail search query that specifies criteria the message must not match"), hasAttachment: z.boolean().optional().describe("Whether the message has any attachment"), excludeChats: z.boolean().optional().describe("Whether the response should exclude chats"), size: z.number().optional().describe("The size of the entire RFC822 message in bytes"), sizeComparison: z.enum(['smaller', 'larger']).optional().describe("How the message size in bytes should be in relation to the size field") }).describe("Filter criteria"), action: z.object({ addLabelIds: z.array(z.string()).optional().describe("List of labels to add to messages"), removeLabelIds: z.array(z.string()).optional().describe("List of labels to remove from messages"), forward: z.string().optional().describe("Email address that the message should be forwarded to") }).describe("Actions to perform on messages matching the criteria") }, - src/index.ts:1012-1038 (registration)The tool is registered via server.tool("create_filter", ...) inside createServer() function.
server.tool("create_filter", "Creates a filter", { criteria: z.object({ from: z.string().optional().describe("The sender's display name or email address"), to: z.string().optional().describe("The recipient's display name or email address"), subject: z.string().optional().describe("Case-insensitive phrase in the message's subject"), query: z.string().optional().describe("A Gmail search query that specifies the filter's criteria"), negatedQuery: z.string().optional().describe("A Gmail search query that specifies criteria the message must not match"), hasAttachment: z.boolean().optional().describe("Whether the message has any attachment"), excludeChats: z.boolean().optional().describe("Whether the response should exclude chats"), size: z.number().optional().describe("The size of the entire RFC822 message in bytes"), sizeComparison: z.enum(['smaller', 'larger']).optional().describe("How the message size in bytes should be in relation to the size field") }).describe("Filter criteria"), action: z.object({ addLabelIds: z.array(z.string()).optional().describe("List of labels to add to messages"), removeLabelIds: z.array(z.string()).optional().describe("List of labels to remove from messages"), forward: z.string().optional().describe("Email address that the message should be forwarded to") }).describe("Actions to perform on messages matching the criteria") }, async (params) => { return handleTool(config, async (gmail: gmail_v1.Gmail) => { const { data } = await gmail.users.settings.filters.create({ userId: 'me', requestBody: params }) return formatResponse(data) }) } ) - src/index.ts:120-123 (helper)The handleTool wrapper function used by create_filter to authenticate and execute the Gmail API call.
const findHeader = (headers: MessagePartHeader[] | undefined, name: string) => { if (!headers || !Array.isArray(headers) || !name) return undefined return headers.find(h => h?.name?.toLowerCase() === name.toLowerCase())?.value ?? undefined } - src/index.ts:48-48 (helper)The formatResponse helper used by create_filter to format the API response.
const formatResponse = (response: any) => ({ content: [{ type: "text", text: JSON.stringify(response) }] })