[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6K6BFV808FDC5FBQE5PDYBM":3,"skill-same:01M6K6BFV808FDC5FBQE5PDYBM":60},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":27,"linkOnly":28,"markdownContent":29,"markdownBody":30,"frontMatter":31,"refName":37,"commitSha":38,"skillDirectory":39,"forksCount":40,"repositoryHtmlUrl":41,"repositoryHomepageUrl":42,"ownerHtmlUrl":43,"ownerBlogUrl":6,"ownerDescription":44,"updatedAt":45,"install":46,"resources":59},"01M6K6BFV808FDC5FBQE5PDYBM","commit",null,"Create a git commit with a summary of changes","Windy3f3f3f3f\u002Fclaude-code-from-scratch","Windy3f3f3f3f","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F101924422?v=4","01M6K6A7WF1MGJSVH56PAG50NH","Di Wang","01M6K6A813C44VWKE2DM5GEY4Q",2829,"MIT","https:\u002F\u002Fgithub.com\u002FWindy3f3f3f3f\u002Fclaude-code-from-scratch\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fcommit\u002FSKILL.md",[],[5,19,20,21,22,23,24,25,26],"git commit","create","git","summary","with","true","inline","changes","2026-11-10 10:12:30",false,"---\nname: gmail-automation\ndescription: \"Automate Gmail tasks via Rube MCP (Composio): send\u002Freply, search, labels, drafts, attachments. Always search tools first for current schemas.\"\nrequires:\n  mcp: [rube]\n---\n\n# Gmail Automation via Rube MCP\n\nAutomate Gmail operations through Composio's Gmail toolkit via Rube MCP.\n\n## Prerequisites\n\n- Rube MCP must be connected (RUBE_SEARCH_TOOLS available)\n- Active Gmail connection via `RUBE_MANAGE_CONNECTIONS` with toolkit `gmail`\n- Always call `RUBE_SEARCH_TOOLS` first to get current tool schemas\n\n## Setup\n\n**Get Rube MCP**: Add `https:\u002F\u002Frube.app\u002Fmcp` as an MCP server in your client configuration. No API keys needed — just add the endpoint and it works.\n\n\n1. Verify Rube MCP is available by confirming `RUBE_SEARCH_TOOLS` responds\n2. Call `RUBE_MANAGE_CONNECTIONS` with toolkit `gmail`\n3. If connection is not ACTIVE, follow the returned auth link to complete Google OAuth\n4. Confirm connection status shows ACTIVE before running any workflows\n\n## Core Workflows\n\n### 1. Send an Email\n\n**When to use**: User wants to compose and send a new email\n\n**Tool sequence**:\n1. `GMAIL_SEARCH_PEOPLE` - Resolve contact name to email address [Optional]\n2. `GMAIL_SEND_EMAIL` - Send the email [Required]\n\n**Key parameters**:\n- `recipient_email`: Email address or 'me' for self\n- `subject`: Email subject line\n- `body`: Email content (plain text or HTML)\n- `is_html`: Must be `true` if body contains HTML markup\n- `cc`\u002F`bcc`: Arrays of email addresses\n- `attachment`: Object with `{s3key, mimetype, name}` from prior download\n\n**Pitfalls**:\n- At least one of `recipient_email`, `cc`, or `bcc` required\n- At least one of `subject` or `body` required\n- Attachment `mimetype` MUST contain '\u002F' (e.g., 'application\u002Fpdf', not 'pdf')\n- Total message size limit ~25MB after base64 encoding\n- Use `from_email` only for verified aliases in Gmail 'Send mail as' settings\n\n### 2. Reply to a Thread\n\n**When to use**: User wants to reply to an existing email conversation\n\n**Tool sequence**:\n1. `GMAIL_FETCH_EMAILS` - Find the email\u002Fthread to reply to [Prerequisite]\n2. `GMAIL_REPLY_TO_THREAD` - Send reply within the thread [Required]\n\n**Key parameters**:\n- `thread_id`: Hex string from FETCH_EMAILS (e.g., '169eefc8138e68ca')\n- `message_body`: Reply content\n- `recipient_email`: Reply recipient\n- `is_html`: Set `true` for HTML content\n\n**Pitfalls**:\n- `thread_id` must be hex string; prefixes like 'msg-f:' are auto-stripped\n- Legacy Gmail web UI IDs (e.g., 'FMfcgz...') are NOT supported\n- Subject is inherited from original thread; setting it creates a new thread instead\n- Do NOT include subject parameter to stay within thread\n\n### 3. Search and Filter Emails\n\n**When to use**: User wants to find specific emails by sender, subject, date, label, etc.\n\n**Tool sequence**:\n1. `GMAIL_FETCH_EMAILS` - Search with Gmail query syntax [Required]\n2. `GMAIL_FETCH_MESSAGE_BY_MESSAGE_ID` - Get full message details for selected results [Optional]\n\n**Key parameters**:\n- `query`: Gmail search syntax (from:, to:, subject:, is:unread, has:attachment, after:YYYY\u002FMM\u002FDD, before:YYYY\u002FMM\u002FDD)\n- `max_results`: 1-500 messages per page\n- `label_ids`: System IDs like 'INBOX', 'UNREAD'\n- `include_payload`: Set `true` to get full message content\n- `ids_only`: Set `true` for just message IDs\n- `page_token`: For pagination (from `nextPageToken`)\n\n**Pitfalls**:\n- Returns max ~500 per page; follow `nextPageToken` via `page_token` until absent\n- `resultSizeEstimate` is approximate, not exact count\n- Use 'is:' for states (is:unread, is:snoozed, is:starred)\n- Use 'label:' ONLY for user-created labels\n- Common mistake: 'label:snoozed' is WRONG — use 'is:snoozed'\n- `include_payload=true` on broad searches creates huge responses; default to metadata\n- Custom labels require label ID (e.g., 'Label_123'), NOT label name\n\n### 4. Manage Labels\n\n**When to use**: User wants to create, modify, or organize labels\n\n**Tool sequence**:\n1. `GMAIL_LIST_LABELS` - List all labels to find IDs and detect conflicts [Required]\n2. `GMAIL_CREATE_LABEL` - Create a new label [Optional]\n3. `GMAIL_PATCH_LABEL` - Rename or change label colors\u002Fvisibility [Optional]\n4. `GMAIL_DELETE_LABEL` - Delete a user-created label (irreversible) [Optional]\n\n**Key parameters**:\n- `label_name`: Max 225 chars, no commas, '\u002F' for nesting (e.g., 'Work\u002FProjects')\n- `background_color`\u002F`text_color`: Hex values from Gmail's predefined palette\n- `id`: Label ID for PATCH\u002FDELETE operations\n\n**Pitfalls**:\n- 400\u002F409 error if name is blank, duplicate, or reserved (INBOX, SPAM, CATEGORY_*)\n- Color specs must use Gmail's predefined palette of 102 hex values\n- DELETE is permanent and removes label from all messages\n- Cannot delete system labels (INBOX, SENT, DRAFT, etc.)\n\n### 5. Apply\u002FRemove Labels on Messages\n\n**When to use**: User wants to label, archive, or mark emails as read\u002Funread\n\n**Tool sequence**:\n1. `GMAIL_LIST_LABELS` - Get label IDs for custom labels [Prerequisite]\n2. `GMAIL_FETCH_EMAILS` - Find target messages [Prerequisite]\n3. `GMAIL_BATCH_MODIFY_MESSAGES` - Bulk add\u002Fremove labels (up to 1000 messages) [Required]\n4. `GMAIL_ADD_LABEL_TO_EMAIL` - Single-message label changes [Fallback]\n\n**Key parameters**:\n- `messageIds`: Array of message IDs (max 1000)\n- `addLabelIds`: Array of label IDs to add\n- `removeLabelIds`: Array of label IDs to remove\n- `message_id`: 15-16 char hex string for single operations\n\n**Pitfalls**:\n- Max 1000 messageIds per BATCH call; chunk larger sets\n- Use 'CATEGORY_UPDATES' not 'UPDATES'; full prefix required for category labels\n- SENT, DRAFT, CHAT are immutable — cannot be added\u002Fremoved\n- To mark as read: REMOVE 'UNREAD'. To archive: REMOVE 'INBOX'\n- `message_id` must be 15-16 char hex, NOT UUIDs or web UI IDs\n\n### 6. Handle Drafts and Attachments\n\n**When to use**: User wants to create, edit, or send email drafts, possibly with attachments\n\n**Tool sequence**:\n1. `GMAIL_CREATE_EMAIL_DRAFT` - Create a new draft [Required]\n2. `GMAIL_UPDATE_DRAFT` - Edit draft content [Optional]\n3. `GMAIL_LIST_DRAFTS` - List existing drafts [Optional]\n4. `GMAIL_SEND_DRAFT` - Send a draft (requires explicit user approval) [Optional]\n5. `GMAIL_GET_ATTACHMENT` - Download attachment from existing message [Optional]\n\n**Key parameters**:\n- `recipient_email`: Draft recipient\n- `subject`: Draft subject (omit for reply drafts to stay in thread)\n- `body`: Draft content\n- `is_html`: Set `true` for HTML content\n- `attachment`: Object with `{s3key, mimetype, name}`\n- `thread_id`: For reply drafts (leave subject empty to stay in thread)\n\n**Pitfalls**:\n- Response includes `data.id` (draft_id) AND `data.message.id`; use `data.id` for draft operations\n- Setting subject on a thread reply draft creates a NEW thread instead\n- Attachment capped at ~25MB; base64 overhead can push near-limit files over\n- UPDATE_DRAFT replaces entire content, not patches; include all fields you want to keep\n- HTTP 429 on bulk draft creation; use exponential backoff\n\n## Common Patterns\n\n### ID Resolution\n\n**Label name → Label ID**:\n```\n1. Call GMAIL_LIST_LABELS\n2. Find label by name in response\n3. Extract id field (e.g., 'Label_123')\n```\n\n**Contact name → Email**:\n```\n1. Call GMAIL_SEARCH_PEOPLE with query=contact_name\n2. Extract emailAddresses from response\n```\n\n**Thread ID from search**:\n```\n1. Call GMAIL_FETCH_EMAILS or GMAIL_LIST_THREADS\n2. Extract threadId (15-16 char hex string)\n```\n\n### Pagination\n\n- Set `max_results` up to 500 per page\n- Check response for `nextPageToken`\n- Pass token as `page_token` in next request\n- Continue until `nextPageToken` is absent or empty string\n- `resultSizeEstimate` is approximate, not exact\n\n### Gmail Query Syntax\n\n**Operators**:\n- `from:sender@example.com` - Emails from sender\n- `to:recipient@example.com` - Emails to recipient\n- `subject:\"exact phrase\"` - Subject contains exact phrase\n- `is:unread` - Unread messages\n- `is:starred` - Starred messages\n- `is:snoozed` - Snoozed messages\n- `has:attachment` - Has attachments\n- `after:2024\u002F01\u002F01` - After date (YYYY\u002FMM\u002FDD)\n- `before:2024\u002F12\u002F31` - Before date\n- `label:custom_label` - User-created label (use label ID)\n- `in:sent` - In sent folder\n- `category:primary` - Primary category\n\n**Combinators**:\n- `AND` - Both conditions (default)\n- `OR` - Either condition\n- `NOT` - Exclude condition\n- `()` - Group conditions\n\n**Examples**:\n- `from:boss@company.com is:unread` - Unread emails from boss\n- `subject:invoice has:attachment after:2024\u002F01\u002F01` - Invoices with attachments this year\n- `(from:alice OR from:bob) is:starred` - Starred emails from Alice or Bob\n\n## Known Pitfalls\n\n**ID Formats**:\n- Custom label operations require label IDs (e.g., 'Label_123'), not display names\n- Always call LIST_LABELS first to resolve names to IDs\n- Message IDs are 15-16 char hex strings\n- Do NOT use UUIDs, web UI IDs, or 'thread-f:' prefixes\n\n**Query Syntax**:\n- Use 'is:' for states (unread, snoozed, starred)\n- Use 'label:' ONLY for user-created labels\n- System labels use 'is:' or 'in:' (e.g., 'is:sent', 'in:inbox')\n\n**Rate Limits**:\n- BATCH_MODIFY_MESSAGES max 1000 messages per call\n- Heavy use triggers 403\u002F429 rate limits\n- Implement exponential backoff for bulk operations\n\n**Response Parsing**:\n- Response data may be nested under `data_preview` or `data.messages`\n- Parse defensively with fallbacks\n- Timestamp `messageTimestamp` uses RFC3339 with 'Z' suffix\n- Normalize to '+00:00' for parsing if needed\n\n**Attachments**:\n- Attachment `s3key` from prior download may expire\n- Use promptly after retrieval\n- Mimetype must include '\u002F' separator\n\n## Quick Reference\n\n| Task | Tool Slug | Key Params |\n|------|-----------|------------|\n| Send email | GMAIL_SEND_EMAIL | recipient_email, subject, body, is_html |\n| Reply to thread | GMAIL_REPLY_TO_THREAD | thread_id, message_body, recipient_email |\n| Search emails | GMAIL_FETCH_EMAILS | query, max_results, label_ids, page_token |\n| Get message details | GMAIL_FETCH_MESSAGE_BY_MESSAGE_ID | message_id |\n| List labels | GMAIL_LIST_LABELS | (none) |\n| Create label | GMAIL_CREATE_LABEL | label_name, background_color, text_color |\n| Modify labels bulk | GMAIL_BATCH_MODIFY_MESSAGES | messageIds, addLabelIds, removeLabelIds |\n| Create draft | GMAIL_CREATE_EMAIL_DRAFT | recipient_email, subject, body, thread_id |\n| Send draft | GMAIL_SEND_DRAFT | draft_id |\n| Get attachment | GMAIL_GET_ATTACHMENT | message_id, attachment_id |\n| Search contacts | GMAIL_SEARCH_PEOPLE | query |\n| Get profile | GMAIL_GET_PROFILE | (none) |","# Gmail Automation via Rube MCP\n\nAutomate Gmail operations through Composio's Gmail toolkit via Rube MCP.\n\n## Prerequisites\n\n- Rube MCP must be connected (RUBE_SEARCH_TOOLS available)\n- Active Gmail connection via `RUBE_MANAGE_CONNECTIONS` with toolkit `gmail`\n- Always call `RUBE_SEARCH_TOOLS` first to get current tool schemas\n\n## Setup\n\n**Get Rube MCP**: Add `https:\u002F\u002Frube.app\u002Fmcp` as an MCP server in your client configuration. No API keys needed — just add the endpoint and it works.\n\n\n1. Verify Rube MCP is available by confirming `RUBE_SEARCH_TOOLS` responds\n2. Call `RUBE_MANAGE_CONNECTIONS` with toolkit `gmail`\n3. If connection is not ACTIVE, follow the returned auth link to complete Google OAuth\n4. Confirm connection status shows ACTIVE before running any workflows\n\n## Core Workflows\n\n### 1. Send an Email\n\n**When to use**: User wants to compose and send a new email\n\n**Tool sequence**:\n1. `GMAIL_SEARCH_PEOPLE` - Resolve contact name to email address [Optional]\n2. `GMAIL_SEND_EMAIL` - Send the email [Required]\n\n**Key parameters**:\n- `recipient_email`: Email address or 'me' for self\n- `subject`: Email subject line\n- `body`: Email content (plain text or HTML)\n- `is_html`: Must be `true` if body contains HTML markup\n- `cc`\u002F`bcc`: Arrays of email addresses\n- `attachment`: Object with `{s3key, mimetype, name}` from prior download\n\n**Pitfalls**:\n- At least one of `recipient_email`, `cc`, or `bcc` required\n- At least one of `subject` or `body` required\n- Attachment `mimetype` MUST contain '\u002F' (e.g., 'application\u002Fpdf', not 'pdf')\n- Total message size limit ~25MB after base64 encoding\n- Use `from_email` only for verified aliases in Gmail 'Send mail as' settings\n\n### 2. Reply to a Thread\n\n**When to use**: User wants to reply to an existing email conversation\n\n**Tool sequence**:\n1. `GMAIL_FETCH_EMAILS` - Find the email\u002Fthread to reply to [Prerequisite]\n2. `GMAIL_REPLY_TO_THREAD` - Send reply within the thread [Required]\n\n**Key parameters**:\n- `thread_id`: Hex string from FETCH_EMAILS (e.g., '169eefc8138e68ca')\n- `message_body`: Reply content\n- `recipient_email`: Reply recipient\n- `is_html`: Set `true` for HTML content\n\n**Pitfalls**:\n- `thread_id` must be hex string; prefixes like 'msg-f:' are auto-stripped\n- Legacy Gmail web UI IDs (e.g., 'FMfcgz...') are NOT supported\n- Subject is inherited from original thread; setting it creates a new thread instead\n- Do NOT include subject parameter to stay within thread\n\n### 3. Search and Filter Emails\n\n**When to use**: User wants to find specific emails by sender, subject, date, label, etc.\n\n**Tool sequence**:\n1. `GMAIL_FETCH_EMAILS` - Search with Gmail query syntax [Required]\n2. `GMAIL_FETCH_MESSAGE_BY_MESSAGE_ID` - Get full message details for selected results [Optional]\n\n**Key parameters**:\n- `query`: Gmail search syntax (from:, to:, subject:, is:unread, has:attachment, after:YYYY\u002FMM\u002FDD, before:YYYY\u002FMM\u002FDD)\n- `max_results`: 1-500 messages per page\n- `label_ids`: System IDs like 'INBOX', 'UNREAD'\n- `include_payload`: Set `true` to get full message content\n- `ids_only`: Set `true` for just message IDs\n- `page_token`: For pagination (from `nextPageToken`)\n\n**Pitfalls**:\n- Returns max ~500 per page; follow `nextPageToken` via `page_token` until absent\n- `resultSizeEstimate` is approximate, not exact count\n- Use 'is:' for states (is:unread, is:snoozed, is:starred)\n- Use 'label:' ONLY for user-created labels\n- Common mistake: 'label:snoozed' is WRONG — use 'is:snoozed'\n- `include_payload=true` on broad searches creates huge responses; default to metadata\n- Custom labels require label ID (e.g., 'Label_123'), NOT label name\n\n### 4. Manage Labels\n\n**When to use**: User wants to create, modify, or organize labels\n\n**Tool sequence**:\n1. `GMAIL_LIST_LABELS` - List all labels to find IDs and detect conflicts [Required]\n2. `GMAIL_CREATE_LABEL` - Create a new label [Optional]\n3. `GMAIL_PATCH_LABEL` - Rename or change label colors\u002Fvisibility [Optional]\n4. `GMAIL_DELETE_LABEL` - Delete a user-created label (irreversible) [Optional]\n\n**Key parameters**:\n- `label_name`: Max 225 chars, no commas, '\u002F' for nesting (e.g., 'Work\u002FProjects')\n- `background_color`\u002F`text_color`: Hex values from Gmail's predefined palette\n- `id`: Label ID for PATCH\u002FDELETE operations\n\n**Pitfalls**:\n- 400\u002F409 error if name is blank, duplicate, or reserved (INBOX, SPAM, CATEGORY_*)\n- Color specs must use Gmail's predefined palette of 102 hex values\n- DELETE is permanent and removes label from all messages\n- Cannot delete system labels (INBOX, SENT, DRAFT, etc.)\n\n### 5. Apply\u002FRemove Labels on Messages\n\n**When to use**: User wants to label, archive, or mark emails as read\u002Funread\n\n**Tool sequence**:\n1. `GMAIL_LIST_LABELS` - Get label IDs for custom labels [Prerequisite]\n2. `GMAIL_FETCH_EMAILS` - Find target messages [Prerequisite]\n3. `GMAIL_BATCH_MODIFY_MESSAGES` - Bulk add\u002Fremove labels (up to 1000 messages) [Required]\n4. `GMAIL_ADD_LABEL_TO_EMAIL` - Single-message label changes [Fallback]\n\n**Key parameters**:\n- `messageIds`: Array of message IDs (max 1000)\n- `addLabelIds`: Array of label IDs to add\n- `removeLabelIds`: Array of label IDs to remove\n- `message_id`: 15-16 char hex string for single operations\n\n**Pitfalls**:\n- Max 1000 messageIds per BATCH call; chunk larger sets\n- Use 'CATEGORY_UPDATES' not 'UPDATES'; full prefix required for category labels\n- SENT, DRAFT, CHAT are immutable — cannot be added\u002Fremoved\n- To mark as read: REMOVE 'UNREAD'. To archive: REMOVE 'INBOX'\n- `message_id` must be 15-16 char hex, NOT UUIDs or web UI IDs\n\n### 6. Handle Drafts and Attachments\n\n**When to use**: User wants to create, edit, or send email drafts, possibly with attachments\n\n**Tool sequence**:\n1. `GMAIL_CREATE_EMAIL_DRAFT` - Create a new draft [Required]\n2. `GMAIL_UPDATE_DRAFT` - Edit draft content [Optional]\n3. `GMAIL_LIST_DRAFTS` - List existing drafts [Optional]\n4. `GMAIL_SEND_DRAFT` - Send a draft (requires explicit user approval) [Optional]\n5. `GMAIL_GET_ATTACHMENT` - Download attachment from existing message [Optional]\n\n**Key parameters**:\n- `recipient_email`: Draft recipient\n- `subject`: Draft subject (omit for reply drafts to stay in thread)\n- `body`: Draft content\n- `is_html`: Set `true` for HTML content\n- `attachment`: Object with `{s3key, mimetype, name}`\n- `thread_id`: For reply drafts (leave subject empty to stay in thread)\n\n**Pitfalls**:\n- Response includes `data.id` (draft_id) AND `data.message.id`; use `data.id` for draft operations\n- Setting subject on a thread reply draft creates a NEW thread instead\n- Attachment capped at ~25MB; base64 overhead can push near-limit files over\n- UPDATE_DRAFT replaces entire content, not patches; include all fields you want to keep\n- HTTP 429 on bulk draft creation; use exponential backoff\n\n## Common Patterns\n\n### ID Resolution\n\n**Label name → Label ID**:\n```\n1. Call GMAIL_LIST_LABELS\n2. Find label by name in response\n3. Extract id field (e.g., 'Label_123')\n```\n\n**Contact name → Email**:\n```\n1. Call GMAIL_SEARCH_PEOPLE with query=contact_name\n2. Extract emailAddresses from response\n```\n\n**Thread ID from search**:\n```\n1. Call GMAIL_FETCH_EMAILS or GMAIL_LIST_THREADS\n2. Extract threadId (15-16 char hex string)\n```\n\n### Pagination\n\n- Set `max_results` up to 500 per page\n- Check response for `nextPageToken`\n- Pass token as `page_token` in next request\n- Continue until `nextPageToken` is absent or empty string\n- `resultSizeEstimate` is approximate, not exact\n\n### Gmail Query Syntax\n\n**Operators**:\n- `from:sender@example.com` - Emails from sender\n- `to:recipient@example.com` - Emails to recipient\n- `subject:\"exact phrase\"` - Subject contains exact phrase\n- `is:unread` - Unread messages\n- `is:starred` - Starred messages\n- `is:snoozed` - Snoozed messages\n- `has:attachment` - Has attachments\n- `after:2024\u002F01\u002F01` - After date (YYYY\u002FMM\u002FDD)\n- `before:2024\u002F12\u002F31` - Before date\n- `label:custom_label` - User-created label (use label ID)\n- `in:sent` - In sent folder\n- `category:primary` - Primary category\n\n**Combinators**:\n- `AND` - Both conditions (default)\n- `OR` - Either condition\n- `NOT` - Exclude condition\n- `()` - Group conditions\n\n**Examples**:\n- `from:boss@company.com is:unread` - Unread emails from boss\n- `subject:invoice has:attachment after:2024\u002F01\u002F01` - Invoices with attachments this year\n- `(from:alice OR from:bob) is:starred` - Starred emails from Alice or Bob\n\n## Known Pitfalls\n\n**ID Formats**:\n- Custom label operations require label IDs (e.g., 'Label_123'), not display names\n- Always call LIST_LABELS first to resolve names to IDs\n- Message IDs are 15-16 char hex strings\n- Do NOT use UUIDs, web UI IDs, or 'thread-f:' prefixes\n\n**Query Syntax**:\n- Use 'is:' for states (unread, snoozed, starred)\n- Use 'label:' ONLY for user-created labels\n- System labels use 'is:' or 'in:' (e.g., 'is:sent', 'in:inbox')\n\n**Rate Limits**:\n- BATCH_MODIFY_MESSAGES max 1000 messages per call\n- Heavy use triggers 403\u002F429 rate limits\n- Implement exponential backoff for bulk operations\n\n**Response Parsing**:\n- Response data may be nested under `data_preview` or `data.messages`\n- Parse defensively with fallbacks\n- Timestamp `messageTimestamp` uses RFC3339 with 'Z' suffix\n- Normalize to '+00:00' for parsing if needed\n\n**Attachments**:\n- Attachment `s3key` from prior download may expire\n- Use promptly after retrieval\n- Mimetype must include '\u002F' separator\n\n## Quick Reference\n\n| Task | Tool Slug | Key Params |\n|------|-----------|------------|\n| Send email | GMAIL_SEND_EMAIL | recipient_email, subject, body, is_html |\n| Reply to thread | GMAIL_REPLY_TO_THREAD | thread_id, message_body, recipient_email |\n| Search emails | GMAIL_FETCH_EMAILS | query, max_results, label_ids, page_token |\n| Get message details | GMAIL_FETCH_MESSAGE_BY_MESSAGE_ID | message_id |\n| List labels | GMAIL_LIST_LABELS | (none) |\n| Create label | GMAIL_CREATE_LABEL | label_name, background_color, text_color |\n| Modify labels bulk | GMAIL_BATCH_MODIFY_MESSAGES | messageIds, addLabelIds, removeLabelIds |\n| Create draft | GMAIL_CREATE_EMAIL_DRAFT | recipient_email, subject, body, thread_id |\n| Send draft | GMAIL_SEND_DRAFT | draft_id |\n| Get attachment | GMAIL_GET_ATTACHMENT | message_id, attachment_id |\n| Search contacts | GMAIL_SEARCH_PEOPLE | query |\n| Get profile | GMAIL_GET_PROFILE | (none) |",{"name":32,"requires":33,"description":36},"gmail-automation",{"mcp":34},[35],"rube","Automate Gmail tasks via Rube MCP (Composio): send\u002Freply, search, labels, drafts, attachments. Always search tools first for current schemas.","main","19cb723d8d900aae5836bc8fae501515c7e072e8",".claude\u002Fskills\u002Fcommit",560,"https:\u002F\u002Fgithub.com\u002FWindy3f3f3f3f\u002Fclaude-code-from-scratch","https:\u002F\u002Fwindy3f3f3f3f.github.io\u002Fclaude-code-from-scratch\u002F#\u002F","https:\u002F\u002Fgithub.com\u002FWindy3f3f3f3f","I'm Windy","2026-11-09 13:43:12",{"source":8,"skillName":32,"commands":47,"prompt":57,"zipAvailable":58},[48,51,54],{"tool":49,"command":50},"npx","npx skills add Windy3f3f3f3f\u002Fclaude-code-from-scratch --skill gmail-automation",{"tool":52,"command":53},"bunx","bunx skills add Windy3f3f3f3f\u002Fclaude-code-from-scratch --skill gmail-automation",{"tool":55,"command":56},"pnpm","pnpm dlx skills add Windy3f3f3f3f\u002Fclaude-code-from-scratch --skill gmail-automation","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FWindy3f3f3f3f\u002Fclaude-code-from-scratch\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fcommit\u002FSKILL.md",true,[],[61,73,78],{"skillNo":62,"name":63,"nameZh":6,"description":64,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":65,"categories":66,"keywords":67,"publishedAt":27},"01M6K6CPX5ND7ZE0VYREZ3121E","greet","Generate a creative greeting for the user","https:\u002F\u002Fgithub.com\u002FWindy3f3f3f3f\u002Fclaude-code-from-scratch\u002Fblob\u002Fmain\u002Ftest\u002Fskills\u002Fgreet\u002FSKILL.md",[],[63,25,68,24,69,70,71,72],"for","greeting","creative","user","generate",{"skillNo":74,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":77,"publishedAt":27},"01M6K6C6RSGZX5VQ8ZFYCPF3M6","https:\u002F\u002Fgithub.com\u002FWindy3f3f3f3f\u002Fclaude-code-from-scratch\u002Fblob\u002Fmain\u002Ftest\u002Fskills\u002Fcommit\u002FSKILL.md",[],[5,22,26,25,24,23,21,20,19],{"skillNo":79,"name":63,"nameZh":6,"description":64,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":80,"categories":81,"keywords":82,"publishedAt":27},"01M6K6BP8QE0Q57ZNWPR1X7VY3","https:\u002F\u002Fgithub.com\u002FWindy3f3f3f3f\u002Fclaude-code-from-scratch\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fgreet\u002FSKILL.md",[],[63,72,25,68,24,69,70,71]]