gmail-automation
Automate Gmail tasks via Rube MCP (Composio): send/reply, search, labels, drafts, attachments. Always search tools first for current schemas.
Install
npx skills add https://github.com/davepoon/buildwithclaude/tree/main/plugins/all-skills/skills/gmail-automation
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install davepoon-buildwithclaude@llmmart
git clone https://github.com/davepoon/buildwithclaude.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole davepoon/buildwithclaude collection as a plugin from our marketplace. Git is the plain clone.
Skill manifest
Gmail Automation via Rube MCP
Automate Gmail operations through Composio's Gmail toolkit via Rube MCP.
Toolkit docs: composio.dev/toolkits/gmail
Prerequisites
- Rube MCP must be connected (RUBE_SEARCH_TOOLS available)
- Active Gmail connection via
RUBE_MANAGE_CONNECTIONSwith toolkitgmail - Always call
RUBE_SEARCH_TOOLSfirst to get current tool schemas
Setup
Get Rube MCP: Add https://rube.app/mcp as an MCP server in your client configuration. No API keys needed — just add the endpoint and it works.
- Verify Rube MCP is available by confirming
RUBE_SEARCH_TOOLSresponds - Call
RUBE_MANAGE_CONNECTIONSwith toolkitgmail - If connection is not ACTIVE, follow the returned auth link to complete Google OAuth
- Confirm connection status shows ACTIVE before running any workflows
Core Workflows
1. Send an Email
When to use: User wants to compose and send a new email
Tool sequence:
GMAIL_SEARCH_PEOPLE- Resolve contact name to email address [Optional]GMAIL_SEND_EMAIL- Send the email [Required]
Key parameters:
recipient_email: Email address or 'me' for selfsubject: Email subject linebody: Email content (plain text or HTML)is_html: Must betrueif body contains HTML markupcc/bcc: Arrays of email addressesattachment: Object with{s3key, mimetype, name}from prior download
Pitfalls:
- At least one of
recipient_email,cc, orbccrequired - At least one of
subjectorbodyrequired - Attachment
mimetypeMUST contain '/' (e.g., 'application/pdf', not 'pdf') - Total message size limit ~25MB after base64 encoding
- Use
from_emailonly for verified aliases in Gmail 'Send mail as' settings
2. Reply to a Thread
When to use: User wants to reply to an existing email conversation
Tool sequence:
GMAIL_FETCH_EMAILS- Find the email/thread to reply to [Prerequisite]GMAIL_REPLY_TO_THREAD- Send reply within the thread [Required]
Key parameters:
thread_id: Hex string from FETCH_EMAILS (e.g., '169eefc8138e68ca')message_body: Reply contentrecipient_email: Reply recipientis_html: Settruefor HTML content
Pitfalls:
thread_idmust be hex string; prefixes like 'msg-f:' are auto-stripped- Legacy Gmail web UI IDs (e.g., 'FMfcgz...') are NOT supported
- Subject is inherited from original thread; setting it creates a new thread instead
- Do NOT include subject parameter to stay within thread
3. Search and Filter Emails
When to use: User wants to find specific emails by sender, subject, date, label, etc.
Tool sequence:
GMAIL_FETCH_EMAILS- Search with Gmail query syntax [Required]GMAIL_FETCH_MESSAGE_BY_MESSAGE_ID- Get full message details for selected results [Optional]
Key parameters:
query: Gmail search syntax (from:, to:, subject:, is:unread, has:attachment, after:YYYY/MM/DD, before:YYYY/MM/DD)max_results: 1-500 messages per pagelabel_ids: System IDs like 'INBOX', 'UNREAD'include_payload: Settrueto get full message contentids_only: Settruefor just message IDspage_token: For pagination (fromnextPageToken)
Pitfalls:
- Returns max ~500 per page; follow
nextPageTokenviapage_tokenuntil absent resultSizeEstimateis approximate, not exact count- Use 'is:' for states (is:unread, is:snoozed, is:starred)
- Use 'label:' ONLY for user-created labels
- Common mistake: 'label:snoozed' is WRONG — use 'is:snoozed'
include_payload=trueon broad searches creates huge responses; default to metadata- Custom labels require label ID (e.g., 'Label_123'), NOT label name
4. Manage Labels
When to use: User wants to create, modify, or organize labels
Tool sequence:
GMAIL_LIST_LABELS- List all labels to find IDs and detect conflicts [Required]GMAIL_CREATE_LABEL- Create a new label [Optional]GMAIL_PATCH_LABEL- Rename or change label colors/visibility [Optional]GMAIL_DELETE_LABEL- Delete a user-created label (irreversible) [Optional]
Key parameters:
label_name: Max 225 chars, no commas, '/' for nesting (e.g., 'Work/Projects')background_color/text_color: Hex values from Gmail's predefined paletteid: Label ID for PATCH/DELETE operations
Pitfalls:
- 400/409 error if name is blank, duplicate, or reserved (INBOX, SPAM, CATEGORY_*)
- Color specs must use Gmail's predefined palette of 102 hex values
- DELETE is permanent and removes label from all messages
- Cannot delete system labels (INBOX, SENT, DRAFT, etc.)
5. Apply/Remove Labels on Messages
When to use: User wants to label, archive, or mark emails as read/unread
Tool sequence:
GMAIL_LIST_LABELS- Get label IDs for custom labels [Prerequisite]GMAIL_FETCH_EMAILS- Find target messages [Prerequisite]GMAIL_BATCH_MODIFY_MESSAGES- Bulk add/remove labels (up to 1000 messages) [Required]GMAIL_ADD_LABEL_TO_EMAIL- Single-message label changes [Fallback]
Key parameters:
messageIds: Array of message IDs (max 1000)addLabelIds: Array of label IDs to addremoveLabelIds: Array of label IDs to removemessage_id: 15-16 char hex string for single operations
Pitfalls:
- Max 1000 messageIds per BATCH call; chunk larger sets
- Use 'CATEGORY_UPDATES' not 'UPDATES'; full prefix required for category labels
- SENT, DRAFT, CHAT are immutable — cannot be added/removed
- To mark as read: REMOVE 'UNREAD'. To archive: REMOVE 'INBOX'
message_idmust be 15-16 char hex, NOT UUIDs or web UI IDs
6. Handle Drafts and Attachments
When to use: User wants to create, edit, or send email drafts, possibly with attachments
Tool sequence:
GMAIL_CREATE_EMAIL_DRAFT- Create a new draft [Required]GMAIL_UPDATE_DRAFT- Edit draft content [Optional]GMAIL_LIST_DRAFTS- List existing drafts [Optional]GMAIL_SEND_DRAFT- Send a draft (requires explicit user approval) [Optional]GMAIL_GET_ATTACHMENT- Download attachment from existing message [Optional]
Key parameters:
recipient_email: Draft recipientsubject: Draft subject (omit for reply drafts to stay in thread)body: Draft contentis_html: Settruefor HTML contentattachment: Object with{s3key, mimetype, name}thread_id: For reply drafts (leave subject empty to stay in thread)
Pitfalls:
- Response includes
data.id(draft_id) ANDdata.message.id; usedata.idfor draft operations - Setting subject on a thread reply draft creates a NEW thread instead
- Attachment capped at ~25MB; base64 overhead can push near-limit files over
- UPDATE_DRAFT replaces entire content, not patches; include all fields you want to keep
- HTTP 429 on bulk draft creation; use exponential backoff
Common Patterns
ID Resolution
Label name → Label ID:
1. Call GMAIL_LIST_LABELS
2. Find label by name in response
3. Extract id field (e.g., 'Label_123')
Contact name → Email:
1. Call GMAIL_SEARCH_PEOPLE with query=contact_name
2. Extract emailAddresses from response
Thread ID from search:
1. Call GMAIL_FETCH_EMAILS or GMAIL_LIST_THREADS
2. Extract threadId (15-16 char hex string)
Pagination
- Set
max_resultsup to 500 per page - Check response for
nextPageToken - Pass token as
page_tokenin next request - Continue until
nextPageTokenis absent or empty string resultSizeEstimateis approximate, not exact
Gmail Query Syntax
Operators:
from:sender@example.com- Emails from senderto:recipient@example.com- Emails to recipientsubject:"exact phrase"- Subject contains exact phraseis:unread- Unread messagesis:starred- Starred messagesis:snoozed- Snoozed messageshas:attachment- Has attachmentsafter:2024/01/01- After date (YYYY/MM/DD)before:2024/12/31- Before datelabel:custom_label- User-created label (use label ID)in:sent- In sent foldercategory:primary- Primary category
Combinators:
AND- Both conditions (default)OR- Either conditionNOT- Exclude condition()- Group conditions
Examples:
from:boss@company.com is:unread- Unread emails from bosssubject:invoice has:attachment after:2024/01/01- Invoices with attachments this year(from:alice OR from:bob) is:starred- Starred emails from Alice or Bob
Known Pitfalls
ID Formats:
- Custom label operations require label IDs (e.g., 'Label_123'), not display names
- Always call LIST_LABELS first to resolve names to IDs
- Message IDs are 15-16 char hex strings
- Do NOT use UUIDs, web UI IDs, or 'thread-f:' prefixes
Query Syntax:
- Use 'is:' for states (unread, snoozed, starred)
- Use 'label:' ONLY for user-created labels
- System labels use 'is:' or 'in:' (e.g., 'is:sent', 'in:inbox')
Rate Limits:
- BATCH_MODIFY_MESSAGES max 1000 messages per call
- Heavy use triggers 403/429 rate limits
- Implement exponential backoff for bulk operations
Response Parsing:
- Response data may be nested under
data_previewordata.messages - Parse defensively with fallbacks
- Timestamp
messageTimestampuses RFC3339 with 'Z' suffix - Normalize to '+00:00' for parsing if needed
Attachments:
- Attachment
s3keyfrom prior download may expire - Use promptly after retrieval
- Mimetype must include '/' separator
Quick Reference
| Task | Tool Slug | Key Params | |------|-----------|------------| | Send email | GMAIL_SEND_EMAIL | recipient_email, subject, body, is_html | | Reply to thread | GMAIL_REPLY_TO_THREAD | thread_id, message_body, recipient_email | | Search emails | GMAIL_FETCH_EMAILS | query, max_results, label_ids, page_token | | Get message details | GMAIL_FETCH_MESSAGE_BY_MESSAGE_ID | message_id | | List labels | GMAIL_LIST_LABELS | (none) | | Create label | GMAIL_CREATE_LABEL | label_name, background_color, text_color | | Modify labels bulk | GMAIL_BATCH_MODIFY_MESSAGES | messageIds, addLabelIds, removeLabelIds | | Create draft | GMAIL_CREATE_EMAIL_DRAFT | recipient_email, subject, body, thread_id | | Send draft | GMAIL_SEND_DRAFT | draft_id | | Get attachment | GMAIL_GET_ATTACHMENT | message_id, attachment_id | | Search contacts | GMAIL_SEARCH_PEOPLE | query | | Get profile | GMAIL_GET_PROFILE | (none) |
Powered by Composio
Files (buildwithclaude)
-
SKILL.md 10.4 KB
--- name: gmail-automation description: "Automate Gmail tasks via Rube MCP (Composio): send/reply, search, labels, drafts, attachments. Always search tools first for current schemas." requires: mcp: [rube] category: email --- # Gmail Automation via Rube MCP Automate Gmail operations through Composio's Gmail toolkit via Rube MCP. **Toolkit docs**: [composio.dev/toolkits/gmail](https://composio.dev/toolkits/gmail) ## Prerequisites - Rube MCP must be connected (RUBE_SEARCH_TOOLS available) - Active Gmail connection via `RUBE_MANAGE_CONNECTIONS` with toolkit `gmail` - Always call `RUBE_SEARCH_TOOLS` first to get current tool schemas ## Setup **Get Rube MCP**: Add `https://rube.app/mcp` as an MCP server in your client configuration. No API keys needed — just add the endpoint and it works. 1. Verify Rube MCP is available by confirming `RUBE_SEARCH_TOOLS` responds 2. Call `RUBE_MANAGE_CONNECTIONS` with toolkit `gmail` 3. If connection is not ACTIVE, follow the returned auth link to complete Google OAuth 4. Confirm connection status shows ACTIVE before running any workflows ## Core Workflows ### 1. Send an Email **When to use**: User wants to compose and send a new email **Tool sequence**: 1. `GMAIL_SEARCH_PEOPLE` - Resolve contact name to email address [Optional] 2. `GMAIL_SEND_EMAIL` - Send the email [Required] **Key parameters**: - `recipient_email`: Email address or 'me' for self - `subject`: Email subject line - `body`: Email content (plain text or HTML) - `is_html`: Must be `true` if body contains HTML markup - `cc`/`bcc`: Arrays of email addresses - `attachment`: Object with `{s3key, mimetype, name}` from prior download **Pitfalls**: - At least one of `recipient_email`, `cc`, or `bcc` required - At least one of `subject` or `body` required - Attachment `mimetype` MUST contain '/' (e.g., 'application/pdf', not 'pdf') - Total message size limit ~25MB after base64 encoding - Use `from_email` only for verified aliases in Gmail 'Send mail as' settings ### 2. Reply to a Thread **When to use**: User wants to reply to an existing email conversation **Tool sequence**: 1. `GMAIL_FETCH_EMAILS` - Find the email/thread to reply to [Prerequisite] 2. `GMAIL_REPLY_TO_THREAD` - Send reply within the thread [Required] **Key parameters**: - `thread_id`: Hex string from FETCH_EMAILS (e.g., '169eefc8138e68ca') - `message_body`: Reply content - `recipient_email`: Reply recipient - `is_html`: Set `true` for HTML content **Pitfalls**: - `thread_id` must be hex string; prefixes like 'msg-f:' are auto-stripped - Legacy Gmail web UI IDs (e.g., 'FMfcgz...') are NOT supported - Subject is inherited from original thread; setting it creates a new thread instead - Do NOT include subject parameter to stay within thread ### 3. Search and Filter Emails **When to use**: User wants to find specific emails by sender, subject, date, label, etc. **Tool sequence**: 1. `GMAIL_FETCH_EMAILS` - Search with Gmail query syntax [Required] 2. `GMAIL_FETCH_MESSAGE_BY_MESSAGE_ID` - Get full message details for selected results [Optional] **Key parameters**: - `query`: Gmail search syntax (from:, to:, subject:, is:unread, has:attachment, after:YYYY/MM/DD, before:YYYY/MM/DD) - `max_results`: 1-500 messages per page - `label_ids`: System IDs like 'INBOX', 'UNREAD' - `include_payload`: Set `true` to get full message content - `ids_only`: Set `true` for just message IDs - `page_token`: For pagination (from `nextPageToken`) **Pitfalls**: - Returns max ~500 per page; follow `nextPageToken` via `page_token` until absent - `resultSizeEstimate` is approximate, not exact count - Use 'is:' for states (is:unread, is:snoozed, is:starred) - Use 'label:' ONLY for user-created labels - Common mistake: 'label:snoozed' is WRONG — use 'is:snoozed' - `include_payload=true` on broad searches creates huge responses; default to metadata - Custom labels require label ID (e.g., 'Label_123'), NOT label name ### 4. Manage Labels **When to use**: User wants to create, modify, or organize labels **Tool sequence**: 1. `GMAIL_LIST_LABELS` - List all labels to find IDs and detect conflicts [Required] 2. `GMAIL_CREATE_LABEL` - Create a new label [Optional] 3. `GMAIL_PATCH_LABEL` - Rename or change label colors/visibility [Optional] 4. `GMAIL_DELETE_LABEL` - Delete a user-created label (irreversible) [Optional] **Key parameters**: - `label_name`: Max 225 chars, no commas, '/' for nesting (e.g., 'Work/Projects') - `background_color`/`text_color`: Hex values from Gmail's predefined palette - `id`: Label ID for PATCH/DELETE operations **Pitfalls**: - 400/409 error if name is blank, duplicate, or reserved (INBOX, SPAM, CATEGORY_*) - Color specs must use Gmail's predefined palette of 102 hex values - DELETE is permanent and removes label from all messages - Cannot delete system labels (INBOX, SENT, DRAFT, etc.) ### 5. Apply/Remove Labels on Messages **When to use**: User wants to label, archive, or mark emails as read/unread **Tool sequence**: 1. `GMAIL_LIST_LABELS` - Get label IDs for custom labels [Prerequisite] 2. `GMAIL_FETCH_EMAILS` - Find target messages [Prerequisite] 3. `GMAIL_BATCH_MODIFY_MESSAGES` - Bulk add/remove labels (up to 1000 messages) [Required] 4. `GMAIL_ADD_LABEL_TO_EMAIL` - Single-message label changes [Fallback] **Key parameters**: - `messageIds`: Array of message IDs (max 1000) - `addLabelIds`: Array of label IDs to add - `removeLabelIds`: Array of label IDs to remove - `message_id`: 15-16 char hex string for single operations **Pitfalls**: - Max 1000 messageIds per BATCH call; chunk larger sets - Use 'CATEGORY_UPDATES' not 'UPDATES'; full prefix required for category labels - SENT, DRAFT, CHAT are immutable — cannot be added/removed - To mark as read: REMOVE 'UNREAD'. To archive: REMOVE 'INBOX' - `message_id` must be 15-16 char hex, NOT UUIDs or web UI IDs ### 6. Handle Drafts and Attachments **When to use**: User wants to create, edit, or send email drafts, possibly with attachments **Tool sequence**: 1. `GMAIL_CREATE_EMAIL_DRAFT` - Create a new draft [Required] 2. `GMAIL_UPDATE_DRAFT` - Edit draft content [Optional] 3. `GMAIL_LIST_DRAFTS` - List existing drafts [Optional] 4. `GMAIL_SEND_DRAFT` - Send a draft (requires explicit user approval) [Optional] 5. `GMAIL_GET_ATTACHMENT` - Download attachment from existing message [Optional] **Key parameters**: - `recipient_email`: Draft recipient - `subject`: Draft subject (omit for reply drafts to stay in thread) - `body`: Draft content - `is_html`: Set `true` for HTML content - `attachment`: Object with `{s3key, mimetype, name}` - `thread_id`: For reply drafts (leave subject empty to stay in thread) **Pitfalls**: - Response includes `data.id` (draft_id) AND `data.message.id`; use `data.id` for draft operations - Setting subject on a thread reply draft creates a NEW thread instead - Attachment capped at ~25MB; base64 overhead can push near-limit files over - UPDATE_DRAFT replaces entire content, not patches; include all fields you want to keep - HTTP 429 on bulk draft creation; use exponential backoff ## Common Patterns ### ID Resolution **Label name → Label ID**: ``` 1. Call GMAIL_LIST_LABELS 2. Find label by name in response 3. Extract id field (e.g., 'Label_123') ``` **Contact name → Email**: ``` 1. Call GMAIL_SEARCH_PEOPLE with query=contact_name 2. Extract emailAddresses from response ``` **Thread ID from search**: ``` 1. Call GMAIL_FETCH_EMAILS or GMAIL_LIST_THREADS 2. Extract threadId (15-16 char hex string) ``` ### Pagination - Set `max_results` up to 500 per page - Check response for `nextPageToken` - Pass token as `page_token` in next request - Continue until `nextPageToken` is absent or empty string - `resultSizeEstimate` is approximate, not exact ### Gmail Query Syntax **Operators**: - `from:sender@example.com` - Emails from sender - `to:recipient@example.com` - Emails to recipient - `subject:"exact phrase"` - Subject contains exact phrase - `is:unread` - Unread messages - `is:starred` - Starred messages - `is:snoozed` - Snoozed messages - `has:attachment` - Has attachments - `after:2024/01/01` - After date (YYYY/MM/DD) - `before:2024/12/31` - Before date - `label:custom_label` - User-created label (use label ID) - `in:sent` - In sent folder - `category:primary` - Primary category **Combinators**: - `AND` - Both conditions (default) - `OR` - Either condition - `NOT` - Exclude condition - `()` - Group conditions **Examples**: - `from:boss@company.com is:unread` - Unread emails from boss - `subject:invoice has:attachment after:2024/01/01` - Invoices with attachments this year - `(from:alice OR from:bob) is:starred` - Starred emails from Alice or Bob ## Known Pitfalls **ID Formats**: - Custom label operations require label IDs (e.g., 'Label_123'), not display names - Always call LIST_LABELS first to resolve names to IDs - Message IDs are 15-16 char hex strings - Do NOT use UUIDs, web UI IDs, or 'thread-f:' prefixes **Query Syntax**: - Use 'is:' for states (unread, snoozed, starred) - Use 'label:' ONLY for user-created labels - System labels use 'is:' or 'in:' (e.g., 'is:sent', 'in:inbox') **Rate Limits**: - BATCH_MODIFY_MESSAGES max 1000 messages per call - Heavy use triggers 403/429 rate limits - Implement exponential backoff for bulk operations **Response Parsing**: - Response data may be nested under `data_preview` or `data.messages` - Parse defensively with fallbacks - Timestamp `messageTimestamp` uses RFC3339 with 'Z' suffix - Normalize to '+00:00' for parsing if needed **Attachments**: - Attachment `s3key` from prior download may expire - Use promptly after retrieval - Mimetype must include '/' separator ## Quick Reference | Task | Tool Slug | Key Params | |------|-----------|------------| | Send email | GMAIL_SEND_EMAIL | recipient_email, subject, body, is_html | | Reply to thread | GMAIL_REPLY_TO_THREAD | thread_id, message_body, recipient_email | | Search emails | GMAIL_FETCH_EMAILS | query, max_results, label_ids, page_token | | Get message details | GMAIL_FETCH_MESSAGE_BY_MESSAGE_ID | message_id | | List labels | GMAIL_LIST_LABELS | (none) | | Create label | GMAIL_CREATE_LABEL | label_name, background_color, text_color | | Modify labels bulk | GMAIL_BATCH_MODIFY_MESSAGES | messageIds, addLabelIds, removeLabelIds | | Create draft | GMAIL_CREATE_EMAIL_DRAFT | recipient_email, subject, body, thread_id | | Send draft | GMAIL_SEND_DRAFT | draft_id | | Get attachment | GMAIL_GET_ATTACHMENT | message_id, attachment_id | | Search contacts | GMAIL_SEARCH_PEOPLE | query | | Get profile | GMAIL_GET_PROFILE | (none) | --- *Powered by [Composio](https://composio.dev)*
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.