| name | gmail-multi-inbox |
| description | Set up and maintain Gmail Multiple Inboxes with auto-discovered sender filters. Scans the user's Gmail to discover senders, suggests inbox categories, generates a Google Apps Script that creates labels and filters. Use this skill for: organizing Gmail, setting up multiple inboxes, managing Gmail labels and filters, categorizing email senders, updating inbox filters with new senders, or unsubscribing from noisy emails. Trigger phrases: "Gmail sections", "inbox categories", "email organization", "sender filters", "multiple inboxes", "clean up my inbox".
|
Gmail Multi-Inbox Setup & Maintenance
Overview
Gmail's Multiple Inboxes displays up to 5 custom sections alongside the main inbox. Each section shows emails matching a search query. This skill uses a label + filter approach: label-based sections get Gmail filters that auto-label incoming mail by sender domain. The output is always a Google Apps Script the user pastes into script.google.com.
The generated script is idempotent — safe to re-run after adding or removing senders. When senders are removed from the lists, setupAll() automatically deletes the corresponding Gmail filters.
Prerequisites
This skill requires a Gmail MCP connector (e.g. search_gmail_messages) to scan the user's inbox. Gmail does not have an official MCP server — the user must have a third-party Gmail connector configured. If no Gmail connector is available, the skill can still work in a limited way: skip the scanning steps and let the user provide sender domains manually, or import from an existing script.
Configuration
The skill stores its current configuration in assets/config.json inside this skill's directory. This file tracks:
- The section definitions (name, query, label)
- The sender domains assigned to each label
- Timestamp of last scan
Always read assets/config.json before starting. If it exists, this is a returning user — go to Update Mode. If it doesn't exist, check if the user has an existing script (see Import Existing Script). Otherwise, this is a new user — go to Initial Setup.
Import Existing Script
If the user already has a Gmail Multi-Inbox Apps Script (set up manually or from a previous run before config tracking existed), ask them to paste it. Parse the script to extract:
- Sender arrays — find all
var xxxSenders = [...] declarations, extract the domain lists and map each to its label name
- Labels — find all
createLabelIfNeeded('...') calls to identify the label names
- Section config — find the
__MULTI_INBOX_CONFIG__ comment block or any section query/name comments
Build assets/config.json from the parsed data and confirm the reconstructed config with the user before proceeding to Update Mode.
Initial Setup (New Users)
Step 1: Scan Gmail
Search the user's Gmail history using search_gmail_messages to build a comprehensive picture of who emails them. Run multiple queries and merge the results — the goal is to discover all non-personal sender domains.
Broad sweep (most important — do this first):
newer_than:6m — all emails from the last 6 months. Paginate through results to collect as many senders as possible.
newer_than:1m — recent emails, captures current high-frequency senders
Category-based (catches things the broad sweep may paginate past):
category:promotions — marketing, newsletters
category:updates — notifications, shipping, orders
category:social — social media notifications
category:forums — mailing lists, digests
Signal-based:
unsubscribe — anything with an unsubscribe link (broad, catches most automated mail)
from:noreply OR from:no-reply OR from:notifications OR from:info@ — automated senders
Localized subject searches (adapt based on user's language):
subject:order OR subject:invoice OR subject:receipt OR subject:shipping OR subject:confirmation
- Czech:
subject:objednávka OR subject:faktura OR subject:potvrzení OR subject:doručení
Aggregate results: collect all sender addresses, extract domains, group by domain, count frequency. Ignore generic providers (gmail.com, outlook.com, yahoo.com, hotmail.com, icloud.com, seznam.cz, etc.) — these are personal contacts, not automated senders.
Step 2: Suggest Categories
Based on the scan results, propose up to 5 sections. Start with these defaults and adjust based on what the scan actually found:
| # | Name | Query | Label | Description |
|---|
| 1 | Important | (is:starred OR is:important) | (none — query-based) | Starred and important emails |
| 2 | Work | label:work in:inbox | work | Emails from the user's company domain |
| 3 | Newsletters | label:newsletter in:inbox | newsletter | Subscriptions, digests, marketing |
| 4 | Orders | label:orders in:inbox | orders | E-shops, shipping, travel, invoices |
| 5 | (available) | | | Suggest based on scan or leave empty |
Present the proposed sections with the discovered sender domains grouped under each category. Ask the user to:
- Confirm, rename, or remove sections
- Move misclassified domains between categories
- Add missing domains
- Name the work label after their actual company if applicable
- Choose label colors (suggest distinct, visually clear defaults). Only Gmail's predefined colors are allowed — see the list in Important Notes
For section 1 (Important): this is query-based, no label or filters needed.
Step 3: Generate the Apps Script
Read the template from scripts/gmail-multi-inbox-template.js in this skill's directory.
Fill in the placeholders:
__SENDER_ARRAYS__ — one var array per label-based section with the confirmed sender domains
__LABEL_CONFIGS__ — createLabelIfNeeded('labelname', { backgroundColor: '#hex', textColor: '#hex' }) calls for each label-based section. The color object is optional — if the section has a color in the config, pass it; otherwise omit the second argument. Only Gmail's predefined hex colors are allowed (see template comments).
__STALE_FILTER_CLEANUP__ — a removeStaleFilters([...]) call listing all managed label/sender pairs. This lets the script detect and delete Gmail filters whose sender was removed from the lists. Example:
removeStaleFilters([
{ senders: workSenders, label: 'work' },
{ senders: newsletterSenders, label: 'newsletter' }
]);
__FILTER_CREATION__ — for each label-based section: loop over its sender array calling createFilterIfNeeded(sender, label). Do NOT include retroLabel calls here — those go in __RETRO_LABEL__.
__RETRO_LABEL__ — for each label-based section: call retroLabel(senderArray, label). If the section has matchToAndCc in the config, pass it as { matchToAndCc: [...] }. This is placed inside the separate retroLabelAll() function.
__MULTI_INBOX_CONFIG__ — comment block listing each section's query and name for the user to enter in Gmail Settings
Save the generated script as assets/gmail-multi-inbox-setup.js inside this skill's directory.
Step 4: Save Configuration
Write assets/config.json with the full configuration:
{
"sections": [
{ "name": "Important", "query": "(is:starred OR is:important)", "label": null },
{ "name": "Work", "query": "label:work in:inbox", "label": "work", "senders": ["companydomain.com"], "matchToAndCc": ["companydomain.com"], "color": { "backgroundColor": "#4a86e8", "textColor": "#ffffff" } },
{ "name": "Newsletters", "query": "label:newsletter in:inbox", "label": "newsletter", "senders": ["substack.com", "beehiiv.com"], "color": { "backgroundColor": "#fad165", "textColor": "#000000" } },
{ "name": "Orders", "query": "label:orders in:inbox", "label": "orders", "senders": ["amazon.com", "ups.com"], "color": { "backgroundColor": "#16a766", "textColor": "#ffffff" } }
],
"lastScan": "2026-02-18"
}
Step 5: Provide Setup Instructions
Tell the user:
Part A — Run the script:
- Go to script.google.com → New project → paste the script
- In the sidebar, click + next to "Services" and enable Gmail API
- Run
setupAll() and authorize when prompted — this creates labels, updates filters, and retro-labels existing emails
Part B — Configure Multiple Inboxes manually:
The Gmail API does not expose Multiple Inboxes settings, so this part must be done by hand in Gmail.
-
In Gmail: Settings (⚙️) → See all settings → Inbox tab
-
Set Inbox type to Multiple Inboxes
-
For each section, enter the Search query and Section name exactly as listed in the script's header comment. Present these to the user in a clear table, e.g.:
| Section | Search query | Section name |
|---|
| 1 | is:starred OR is:important | Starred / Important |
| 2 | label:work in:inbox | Work |
| 3 | label:newsletter in:inbox | Newsletters |
| 4 | label:orders in:inbox | Orders |
| 5 | (leave empty) | |
-
Set Multiple Inbox position to "Right of inbox" (recommended)
-
Click Save Changes
Always present the full table with the actual section values from the config — do not just say "see the script header".
Update Mode (Returning Users)
When assets/config.json exists:
- Show the user their current configuration (sections + sender counts)
- Ask what they want to do: scan for new senders, add specific senders manually, remove senders, modify sections, or get unsubscribe suggestions
- If scanning: re-run the Gmail searches from Step 1, compare against existing sender lists, and present only new domains not yet in the config
- Let the user confirm which new domains to add and to which categories
- Before generating the script, compare the new sender lists against the previous
assets/config.json. If any senders were removed, explicitly list them with their section names and ask the user to confirm. The generated script will delete the corresponding Gmail filters when run — make sure the user understands this. Do NOT generate the script until the user confirms the removals.
- Regenerate the Apps Script with the updated sender lists and save to
assets/gmail-multi-inbox-setup.js
- Update
assets/config.json
- User pastes the updated script and re-runs
setupAll() (this handles filters and retro-labeling in one go)
- If any section queries or names changed, remind the user to update their Multiple Inboxes settings manually in Gmail (see Step 5, Part B from Initial Setup). Present the updated table of sections.
Unsubscribe Suggestions
When the user asks for inbox cleanup or unsubscribe suggestions:
Step 1: Identify noisy senders
Search Gmail for senders that pollute the inbox. Focus on:
- High volume, low engagement — many emails, most unread. Compare
from:domain.com (total) vs is:unread from:domain.com (unread) to estimate open rate.
- Never replied to —
from:domain.com -in:sent has the same count as from:domain.com, meaning the user never interacts with this sender.
- Promotional / transactional noise — marketing emails, "we miss you" campaigns, loyalty programs, app notifications that duplicate push/in-app notifications (e.g. social media activity digests, app usage summaries, "someone liked your post").
- Redundant notifications — emails that duplicate information available elsewhere: order status (check the app), shipping updates (carrier app), calendar reminders, password change confirmations, login alerts from low-risk services.
Use broad queries to discover candidates:
unsubscribe newer_than:6m — anything with an unsubscribe link in the last 6 months (widest net)
category:promotions — marketing and newsletters
category:updates — transactional notifications
category:social — social media digests and notifications
from:noreply OR from:no-reply OR from:notifications — automated senders
subject:newsletter OR subject:digest OR subject:weekly OR subject:monthly
Then for each discovered domain, measure engagement:
- Total emails:
from:domain.com newer_than:6m
- Unread emails:
is:unread from:domain.com newer_than:6m
- Any replies: compare count of
from:domain.com vs from:domain.com -in:sent
Exclude senders already managed in the config (they're already categorized).
Step 2: Present recommendations
Group the noisy senders into tiers:
- Unsubscribe — high volume, never read, no value (e.g. marketing from a store you bought from once, app notification digests)
- Consider unsubscribing — moderate volume, rarely read, value is questionable or available elsewhere
- Keep but categorize — useful but noisy — suggest adding to a section in the multi-inbox config instead
For each sender, show:
- Sender domain and example "From" name
- Email count (last 6 months)
- Estimated open rate (read vs total)
- Why it's flagged (e.g. "94 emails, 2% opened", "duplicates push notifications")
Step 3: Act on user choices
- Unsubscribe: the action is manual — provide the sender info so the user can unsubscribe themselves. Do NOT generate script code to delete or archive emails without explicit user approval.
- Categorize: add the sender to the appropriate section in the config and regenerate the script.
- Block: explain how to block in Gmail (three dots → Block "sender"). This is also manual.
Important Notes
- The Gmail API cannot configure Multiple Inboxes settings. The script handles labels, filters, and retroactive labeling. The user must always configure section queries, names, and position manually in Gmail Settings → Inbox → Multiple Inboxes. Always present the full configuration table after generating or updating the script.
- Emails in labeled sections also appear in the main inbox — sections are views, not separate inboxes. Adding
in:inbox to section queries ensures archived mail doesn't appear in sections.
from:domain.com matches any @domain.com address and subdomains.
- One filter per sender domain (no complex boolean logic in a single Gmail filter).
- Check the user's email for language clues and adapt search queries accordingly.
- Label colors must use Gmail's predefined hex values. Arbitrary colors will be rejected by the API. Allowed background colors (pair with
#000000 or #ffffff text for contrast):
- Reds:
#fb4c2f, #e66550, #cc3a21, #ac2b16, #822111, #f6c5be, #efa093
- Oranges:
#ffad47, #ffbc6b, #eaa041, #cf8933, #a46a21, #ffe6c7, #ffd6a2
- Yellows:
#fad165, #fcda83, #f2c960, #d5ae49, #aa8831, #fef1d1, #fce8b3
- Greens:
#16a766, #44b984, #149e60, #0b804b, #076239, #b9e4d0, #89d3b2, #43d692, #68dfa9, #3dc789, #2a9c68, #1a764d, #c6f3de, #a0eac9
- Blues:
#4a86e8, #6d9eeb, #3c78d8, #285bac, #1c4587, #c9daf8, #a4c2f4
- Purples:
#a479e2, #b694e8, #8e63ce, #653e9b, #41236d, #e4d7f5, #d0bcf1
- Pinks:
#f691b3, #f7a7c0, #e07798, #b65775, #83334c, #fcdee8, #fbc8d9
- Grays:
#000000, #434343, #666666, #999999, #cccccc, #efefef, #f3f3f3, #ffffff