A Gmail Workspace Add-on that watches your Gmail for new messages and sends an alert when one matches a rule you describe in plain English. Rules are evaluated by Google Gemini.
Everything runs inside your Google account — no machine to keep running, no extra accounts to create.
Status: private pre-launch testing. emAIl Sentinel is currently in private testing with a closed group of users. It is not yet listed on the Google Workspace Marketplace for general availability, and public sign-ups are not being accepted. The plan structure, pricing, and features documented below describe the product at launch; during private testing, access is invitation-only and free of charge. At launch, the Service will be offered to United States users only (see
legal/TERMS.md§ 2). EU/UK availability is deferred. Seelegal/TERMS.md§ 1.1 for the governing pre-launch provision. For inquiries, contact support@jjjjjenterprises.com.
- What it does
- How it works
- Plans and pricing
- Repository layout
- Prerequisites
- Install with
clasp - Install via the Apps Script editor (no CLI)
- First-run configuration
- Writing rules
- Gemini pricing and model tiers
- Alert channels
- Privacy and storage
- Troubleshooting
- Why an Add-on instead of a Chrome extension?
- Legal
When a new email arrives in a watched Gmail label, emAIl Sentinel asks Gemini whether it matches one of your rules. If it does, it fires the alerts you configured for that rule:
- SMS via your configured provider (bring your own — six quick-start presets plus a generic webhook for any other provider), to named recipients you define in Settings.
- Google Chat, Google Calendar, Google Sheets, Google Tasks, or Google Docs — all within your own Google account, no extra sign-up needed.
- External integrations — Microsoft Teams, Asana, any custom Model Context Protocol endpoint over HTTPS, or any HTTPS webhook (Slack incoming webhooks, Discord, n8n / Zapier / Make scenarios, custom internal APIs).
Rules are plain English. No regex, no code:
"If I get an email from any address at tma.com that has a PDF attachment that looks like an invoice or purchase order."
┌──────────────────────────────────────────────────────────────┐
│ Apps Script time-driven trigger (chosen to divide pollMin) │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ runMailCheck() │ │
│ │ • For each enabled rule's labels: │ │
│ │ – GmailApp.search() → recent messages │ │
│ │ – Diff against per-label seen-ID set │ │
│ │ – New messages × matching rules: │ │
│ │ → Gemini: does this match the rule? │ │
│ │ → If YES: Gemini formats the alert message │ │
│ │ → SMS / Chat / Cal / Sheets / Tasks / MCP server │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ Add-on UI (Cards) — Rules, Settings, Activity log, Help │
└──────────────────────────────────────────────────────────────┘
All state lives in PropertiesService.getUserProperties():
| Key | Contents |
|---|---|
mailsentinel.settings |
Gemini key, model, poll interval, business hours, SMS config, alert channel IDs |
mailsentinel.rules |
JSON array of rule objects |
mailsentinel.seen |
Per-label list of recently-seen Gmail message IDs |
mailsentinel.log |
Ring buffer of the last ~60 activity log lines |
UserProperties is private to the running user and per-script — nobody but you (and the add-on running in your account) can read it.
emAIl Sentinel is offered on a freemium model. It is designed for individuals, professionals, consultants, and small teams where each member installs the add-on in their own Google account.
| Feature | Free | Pro |
|---|---|---|
| Price | Free | $4.99/month or $39/year |
| Active rules | Up to 3 | Unlimited |
| Minimum automatic scan interval | Every 3 hours | Every 1 hour |
| Manual on-demand check (Scan email now) | ✅ | ✅ |
| Alert channels — Google Calendar, Sheets, Tasks, Docs | ✅ | ✅ |
| Alert channels — SMS (any provider — 6 quick-start presets plus generic webhook) | ✅ | ✅ |
| Alert channels — Google Chat webhook | — | ✅ |
| Alert channels — External integrations (MCP servers, Asana REST, generic HTTPS webhooks for Slack/Discord/n8n/etc.) | — | ✅ |
| AI-assisted alert content (Help me write the alert text) | ✅ | ✅ |
| AI-assisted rule writing (Help me write the rule text) | — | ✅ |
| Activity log retention | 30 days | Unlimited |
| Support | GitHub Issues + Community Discussions | GitHub Issues + Community Discussions |
Founding-member lifetime tier — $79 one-time for the first 500 buyers, then this tier is retired.
About scan cadence: Google Workspace enforces a 1-hour minimum on time-based triggers in any Workspace add-on, regardless of plan or pricing — this is a Google platform limit, not a tier policy. Pro scans at the platform floor (every 1 hour); Free scans every 3 hours. Both plans support Scan email now on the home card (also available from the universal "⋮" menu) to run an immediate scan at any time, bypassing the cadence entirely.
Why we don't poll faster (and why that's a feature, not a limitation): It's technically possible to bypass the 1-hour Workspace limit by running our own backend that scans Gmail every minute and pushes results back into the add-on. We deliberately don't. Doing so would require storing your Gmail OAuth refresh tokens on our servers, routing every email's content through our infrastructure, and reading each message outside your own Google account. emAIl Sentinel runs entirely inside your own Google account: your email content never reaches our servers — we never see, store, or process it. The only places your email data ever goes are (1) the Google Gemini API, called with your own API key, and (2) the alert channels you configure (your SMS provider, your Calendar, your Sheets, your MCP server, etc.). The 1-hour scan-interval floor is the price of that privacy-first architecture, and we think it's worth paying.
Upgrading is done from the home card. Downgrading keeps all your rules intact; Chat and MCP channels are silently disabled and the scan interval is clamped back to the Free 3-hour minimum until you re-upgrade.
Enterprise-wide or centralized deployments across a Workspace domain are not supported; see TERMS.md §2 for the exact scope.
email_sentinel/
├── appsscript.json # Add-on manifest (scopes, triggers, link prefixes)
├── .clasp.json # clasp project config — paste your scriptId here
├── .claspignore # Limits clasp push to .gs / .html / appsscript.json
├── .gitignore
│
├── Code.gs # Entry points: onHomepage, universal actions, onUninstall
├── Cards.gs # All CardService UI (home, rules, editor, settings, log, help)
├── MailWatcher.gs # Time-driven trigger handler — polls Gmail, dispatches matches
├── RuleEvaluator.gs # Gemini REST calls (rule evaluation + alert formatting)
├── AlertDispatcher.gs # Alert dispatch: BYO SMS (presets + generic webhook), Chat, Calendar, Sheets, Tasks, Docs, MCP
├── McpServers.gs # MCP server CRUD + JSON-RPC 2.0 tool dispatch
├── RulesManager.gs # CRUD for rules in UserProperties
├── SettingsManager.gs # CRUD for settings; business-hours helpers
├── ActivityLog.gs # Ring-buffered activity log with batch-write support
│
├── README.md # You are here
├── LICENSE # Proprietary software license
│
├── images/ # Add-on icons and card banner
│ ├── ES_128.png # 128×128 icon
│ ├── ES_32.png # 32×32 icon
│ └── ES_Banner.png # card banner
│
├── legal/ # Legal source documents (markdown)
│ │ # The HTML versions of these docs are generated
│ │ # into the sibling repo ../jjjjjenterprises.com/
│ │ # under emailsentinel/legal/ — this repo is the
│ │ # source of truth.
│ ├── TERMS.md # Terms of Service
│ ├── PRIVACY.md # Privacy Policy (required for Google Workspace Marketplace)
│ └── DISCLAIMER.md # Warranty disclaimer, AI accuracy, no-reliance notice
│
├── docs/ # Developer and launch documentation
│ ├── pre_launch_todo.md # Pre-launch tracker
│ ├── marketplace_checklist.txt # Google Workspace Marketplace listing guide
│ ├── rebuild_prompt.txt # Reference: how to rebuild the project from scratch
│ ├── icon_prompts.txt # Image-generation prompts for icon/banner
│ ├── trademark_filing_guide.pdf
│ └── oauth_verification/ # OAuth verification video + submission answers
│
├── scripts/ # Standalone helper scripts (not part of the add-on)
│ └── FoundingMemberMonitor.gs # Daily watcher for founding-member sales count
│
└── testing/ # End-to-end test plan and Playwright automation
├── README.md
├── e2e_test_plan.md # Canonical checklist
├── run_free_e2e_tests.sh # Launch Chrome + run Free-tier suite
├── run_pro_e2e_tests.sh # Wrapper that sets TEST_TIER=pro
├── reset_e2e_chrome.sh
├── new_manual_run.sh
├── archive_run.js # Produces annotated per-run reports
├── diagnose.js # Iframe introspector for debugging selector drift
└── playwright/ # Playwright project (copy e2e.config.env.example → e2e.config.env)
There is no build step, no requirements.txt, no installer. The whole thing is JavaScript that runs on Google's servers.
- A Google account (personal Gmail or Google Workspace).
- A free Gemini API key from aistudio.google.com/app/apikey.
- (Optional) An SMS provider account for SMS alerts — see Alert channels for the six supported providers.
- For the
claspinstall path: Node.js 18+ andnpm.
clasp is Google's CLI for pushing local Apps Script files into a project.
# 1. Install clasp once, globally
npm install -g @google/clasp
# 2. Log in to your Google account in the browser that pops up
clasp login
# 3. From this directory, create a new Apps Script project
clasp create --type standalone --title "emAIl Sentinel" --rootDir .
# ↑ this writes a real scriptId into .clasp.json
# 4. Push all the .gs / .html / appsscript.json files
clasp push
# 5. Open the project in the browser to install the add-on
clasp openInside the Apps Script editor:
- Click Deploy ▸ Test deployments.
- Click Install under "Test the latest code".
- Choose Gmail as the host.
- Approve the OAuth consent screen.
- Open Gmail in another tab — the emAIl Sentinel icon appears in the right-hand add-on rail.
If you'd rather not install clasp:
- Go to script.google.com → New project.
- In the file tree on the left, create a file for each
.gsand.htmlin this repo and paste in its contents. Replace the auto-createdCode.gswith this repo'sCode.gs. - Click the gear ▸ Project Settings ▸ check Show appsscript.json ▸ then open
appsscript.jsonand replace its contents with this repo'sappsscript.json. - Deploy ▸ Test deployments ▸ Install as in step 5 of the
claspflow above.
After installation, open Gmail and click the emAIl Sentinel icon in the right rail.
- Settings ▸ Gemini API key — paste your key. Click Test Gemini to confirm it works.
- Settings ▸ Scan schedule — pick how often to check. The dropdown offers whole-hour intervals (
1 hour,2 hours,3 hours,4 hours,6 hours,8 hours,12 hours,24 hours). Free shows3 hoursand longer; Pro adds1 hourand2 hoursat the top. The 60-minute limit is a Google Workspace add-on platform limit and cannot be bypassed. Use Scan email now for an immediate scan anytime regardless of plan. - Settings ▸ SMS provider (optional) — choose a provider and fill in credentials. Click SMS setup guide for a comparison. Then add named SMS recipients (e.g. "On-call", "CFO") below the provider fields — rules pick recipients by name, not raw phone numbers.
- Settings ▸ External integrations (optional) — add Microsoft Teams, Asana (REST or MCP V2), any custom MCP endpoint (Cloudflare Worker, self-hosted bridge, etc.), or any HTTPS webhook URL (Slack incoming, Discord, n8n / Zapier, custom internal APIs).
- Settings ▸ Save settings.
- Rules ▸ + New rule — give it a name, list one or more Gmail labels (e.g.
INBOX), describe the match in plain English, and tick the channels you want (SMS recipients, Chat spaces, MCP servers, Calendar, Sheets, Tasks). Click Help me write the rule text or Help me write the alert text to have Gemini draft a starting point. Or click Starter rules on the home card to create 5 pre-built rules (urgent emails, invoices, shipping updates, security alerts, and subscription renewals) — they are created disabled so you can tick channels and enable them at your own pace. - Back on the home card, pick a scan interval from the Scan email every dropdown (defaults to your tier minimum — every 3 hours on Free, every 1 hour on Pro), then click Start scheduled scans. This installs a time-driven trigger that runs in the background even when Gmail is closed and saves the chosen interval into Settings.
The first check for any new label is treated as a baseline (no alerts) so you don't get a flood of notifications for existing mail. Alerts start with the next new message.
Rules are evaluated by Gemini against:
- the sender,
- the subject,
- the first 2,000 characters of the body,
- and the filenames of any attachments.
Attachment contents are not read.
Good examples:
"Any email from anyone @example.com that has a PDF attachment that looks like an invoice or purchase order.""Subject contains URGENT or CRITICAL.""Email from boss@example.com asking for a status update.""Automated notification about a server being down or an alert being triggered."
Each rule also has an Alert message content field — plain-English instructions Gemini uses to compose the alert message itself. The default produces a date / sender / subject / summary / action items block; override it per rule when you want something different (a one-liner, a bullet list, …). The Help me write the rule text and Help me write the alert text buttons in the rule editor let Gemini draft either field for you based on the rule name, labels, and the channels you've ticked.
Every rule works with every channel — just enable the ones you want in the rule editor. Here are real-world examples showing which channels make sense for each use case.
| Use case | Rule | Alert format | Channels |
|---|---|---|---|
| Server down | "Any automated email about a server outage, service degradation, or critical alert from our monitoring system." | "One line: service name, severity, and what's affected." | SMS to the on-call engineer |
| Wire transfer | "Email from the bank confirming a wire transfer, ACH payment, or large transaction over $10,000." | "Amount, sender/recipient, and date only." | SMS to the CFO |
| Security alert | "Any email about a failed login attempt, password reset request, or suspicious activity on any of our accounts." | "Which account, what happened, and when." | SMS to security team |
| Use case | Rule | Alert format | Channels |
|---|---|---|---|
| Sales lead | "Any email from a new contact (not in our company domain) that mentions pricing, demo, trial, or buying." | "Company name, contact name, what they're interested in, and their email." | Chat → "Sales Leads" space |
| Support escalation | "Any email with subject containing ESCALATION, P1, or CRITICAL from a customer." | "Customer name, issue summary, and severity." | Chat → "Support Escalations" |
| Shipping notification | "Email from FedEx, UPS, USPS, or DHL with a tracking number or delivery confirmation." | "Carrier, tracking number, and expected delivery date." | Chat → "Office Operations" space |
| Use case | Rule | Alert format | Channels |
|---|---|---|---|
| Meeting request | "Any email asking me to schedule a meeting, call, or demo." | "Who's asking, what they want to meet about, and any suggested times." | Calendar event |
| Deadline reminder | "Any email that mentions a deadline, due date, or 'by end of day/week'." | "What's due, when, and who's asking." | Calendar event |
| Travel itinerary | "Emails from airlines, hotels, or booking services with a confirmation or itinerary." | "Confirmation number, dates, and location." | Calendar event + Sheets log |
| Use case | Rule | Alert format | Channels |
|---|---|---|---|
| Compliance log | "Any email from a regulatory body, auditor, or containing 'compliance', 'audit', or 'regulation'." | "Date, sender, subject, and a one-sentence summary." | Sheets log |
| Expense tracking | "Emails containing receipts, invoices, or payment confirmations." | "Vendor, amount, date, and category." | Sheets log |
| Hiring pipeline | "Any email from job candidates or recruiting platforms." | "Candidate name, position applied for, and current stage." | Sheets log + Chat → "Hiring" space |
| Use case | Rule | Alert format | Channels |
|---|---|---|---|
| Action item catcher | "Any email that explicitly asks me to do something, review something, or approve something." | "What's being asked, by whom, and any deadline." | Task |
| Contract review | "Email with an attachment that looks like a contract, NDA, agreement, or legal document." | "From whom, document type, and any stated deadline." | Task |
| Follow-up needed | "Any email where someone says 'let me know', 'please confirm', 'get back to me', or 'awaiting your response'." | "Who's waiting, what they need, and when they sent it." | Task |
The real power is mixing channels:
- Critical vendor issue: Rule: "Email from any @example.com address marked urgent or mentioning an outage." → SMS (instant phone buzz) + Chat "Client Escalations" (team sees it) + Calendar event (blocks your time) + Sheets (audit trail)
- New hire onboarding: Rule: "Email from HR containing 'new hire', 'onboarding', or 'start date'." → Task (to-do list) + Sheets (track all new hires) + Chat "People Ops" (team visibility)
- Legal filing deadline: Rule: "Email from outside counsel or the court mentioning a filing deadline or hearing date." → Calendar event (date on your calendar) + Task (action item) + SMS (don't miss it) + Sheets (matter log)
emAIl Sentinel calls the Gemini API twice per new email per active rule: once to evaluate whether the email matches, and once to format the alert message. Already-seen messages are skipped entirely.
| Model | Speed | Free quota | Paid input cost | Paid output cost | Best for |
|---|---|---|---|---|---|
| Gemini 2.5 Flash (default) | Fast | 1,500 req/day · 1M tokens/day | ~$0.075 / 1M tokens | ~$0.30 / 1M tokens | Most users — best balance of speed, cost, and accuracy |
| Gemini 2.5 Flash Lite | Fastest | 1,500 req/day · 1M tokens/day | ~$0.04 / 1M tokens | ~$0.15 / 1M tokens | Simple rules at very high volume; slightly less capable |
| Gemini 2.5 Pro | Slower | 50 req/day | ~$1.25 / 1M tokens | ~$5.00 / 1M tokens | Complex or nuanced rules where accuracy is critical; not suited for high email volume |
| Gemini 2.0 Flash 001 | Fast | 1,500 req/day · 1M tokens/day | ~$0.075 / 1M tokens | ~$0.30 / 1M tokens | Stable previous-generation Flash — fallback if 2.5 Flash behaviour changes |
Verify current prices at ai.google.dev/pricing. Prices shown are as of April 2026 and may change.
A key from aistudio.google.com/app/apikey is free — no credit card required. Flash model free limits reset daily at midnight Pacific Time:
- Flash models: 1,500 requests/day and 1,000,000 tokens/day
- Pro models: 50 requests/day
When you hit a limit, Gemini returns HTTP 429 and emAIl Sentinel logs "Gemini quota exceeded" in the Activity Log. Scanning resumes automatically the next day — you are never charged on a free key.
Gemini calls per day ≈ new emails/day × active rules × 2
Each call consumes roughly 600–1,500 tokens depending on email length and the complexity of your alert format prompt.
| Scenario | New emails/day | Active rules | API calls/day | Tokens/day (est.) | Free tier? |
|---|---|---|---|---|---|
| Light personal | 20 | 1 | 40 | ~50K | Well within |
| Typical personal | 50 | 3 | 300 | ~375K | Well within |
| Power user | 100 | 5 | 1,000 | ~1.25M | At / over limit — consider billing |
| Small business | 200 | 10 | 4,000 | ~5M | Needs paid tier |
| High volume | 500 | 20 | 20,000 | ~25M | Needs paid tier |
If you regularly hit the free limit:
- Go to aistudio.google.com → select your API key → Enable billing.
- Link a Google Cloud project that has a billing account attached.
- The same API key continues to work in emAIl Sentinel — no settings change needed.
Example monthly cost (Flash model, paid tier):
| Usage | Input tokens/mo | Input cost | Output tokens/mo | Output cost | Monthly total |
|---|---|---|---|---|---|
| Typical personal (50 emails/day × 3 rules) | ~7M | ~$0.53 | ~1M | ~$0.30 | ~$0.83 |
| Power user (100 emails/day × 5 rules) | ~23M | ~$1.73 | ~4M | ~$1.20 | ~$2.93 |
| Small business (200 emails/day × 10 rules) | ~90M | ~$6.75 | ~14M | ~$4.20 | ~$10.95 |
These are rough upper bounds. Emails that don't match a rule still cost one evaluation call; alerts that fire cost a second (formatting) call. Most rules match only a small fraction of emails, so real costs are typically lower.
- Enable Business hours — restricts checks to your configured time window (supports overnight windows too).
- Lower Max email age (Settings ▸ Scan schedule) — default is 30 days; reducing it skips older messages entirely so they never hit Gemini.
- Watch specific labels (e.g.
Vendors/Invoices) instead of INBOX — only emails in that label are evaluated against the rule. - Combine conditions — one rule "Invoice OR purchase order from any vendor" is cheaper than two separate rules.
- Keep alert format prompts short — concise format instructions produce shorter output responses and lower output-token costs.
- Raise the scan interval — pick a longer interval in the Scan schedule dropdown (e.g. every 6 or 12 hours) instead of the tier minimum to reduce Gemini calls proportionally when email arrives in bursts.
Google Workspace does not provide a first-party SMS API. emAIl Sentinel supports any SMS provider you want — ships with six quick-start presets (below) and a generic webhook for everything else. Click SMS setup guide in the add-on Settings for a comparison table with sign-up links and step-by-step instructions.
| Provider | Phone # needed? | Free trial? | Auth method |
|---|---|---|---|
| Textbelt | No | 1 free/day (key: textbelt) |
API key |
| Telnyx | Yes | Free credits | Bearer token |
| Plivo | Yes | $10 free credit | Basic auth |
| Twilio | Yes | $15 free credit | Basic auth |
| ClickSend | No | Free trial credits | Basic auth |
| Vonage | No | Free credits (no CC) | API key + secret |
| Generic webhook | (your choice) | N/A | (your choice) |
Prices vary by provider and change over time. Current per-SMS and phone-number costs are shown in the in-app SMS setup guide and on each provider's website. Use the sign-up links in Settings to verify current rates before committing.
How to choose:
- Quickest start (no sign-up): Textbelt with the free key
textbelt— 1 free SMS/day, no account needed. - Cheapest at scale: Telnyx or Plivo (both sub-cent per US SMS, require you to rent a number).
- No phone number to manage: Textbelt, ClickSend, or Vonage send from a shared/system number.
- Most popular / best docs: Twilio.
- Already have an SMS gateway or want to use an unlisted provider: Generic webhook POSTs
{"to": "+15551234567", "body": "..."}to any HTTPS URL you configure.
Phone numbers in SMS recipients should be in E.164 format: +15551234567.
SMS recipients are managed in one place — Settings ▸ SMS recipients — as named entries (e.g. On-call = +15551234567). Rules pick recipients by name via checkboxes, so you don't paste phone numbers into each rule.
After configuring a provider in Settings, click Send test SMS to verify it works.
A2P 10DLC compliance: SMS providers (especially Twilio) require A2P 10DLC (Application-to-Person 10-Digit Long Code) registration for US phone numbers. After buying a number from your provider, register a campaign in their console (typically under A2P 10DLC or Messaging → Campaigns). The app provides guidance if registration is missing — you'll see an error directing you to complete the registration before SMS can be sent.
These use your existing Google account — no third-party sign-up, no cost.
| Channel | What it does | How to set up |
|---|---|---|
| Google Chat | Posts to a Google Chat Space via webhook — the direct equivalent of Teams webhooks. Requires a Google Workspace paid account (webhooks are not available on free Gmail accounts). Pro plan only. | Create a Space at chat.google.com. Open the space, click the space name in the top header bar ▸ Apps & integrations ▸ Webhooks ▸ create one. In Settings ▸ Google alert channels, click "Add Chat space", enter the space name, and paste the webhook URL. Select the space name in each rule. |
| Google Calendar | Creates a 15-minute calendar event with the alert details. Phone/desktop notifications fire automatically if you have calendar notifications on. | (Optional) Enter a calendar ID in Settings, or leave blank for your primary calendar. In the rule editor, check "Create a Google Calendar event on match." |
| Google Sheets | Appends a row (timestamp, rule, from, subject, received, message) to a spreadsheet. Both date columns are written in the user's local timezone (yyyy-MM-dd h:mm:ss AM/PM TZ) — never UTC/Zulu. Great for audit trails, searching past alerts, sharing with a team. |
(Optional) Enter a spreadsheet ID in Settings, or leave blank — emAIl Sentinel auto-creates one called "emAIl Sentinel — Alert Log" on the first alert. In the rule editor, check "Log to Google Sheets on match." |
| Google Tasks | Creates a task in Google Tasks with the alert subject and details. Shows in the Gmail sidebar and the Google Tasks app. | Leave the Tasks list ID blank for "My Tasks" (the default list). In the rule editor, check "Create a Google Task on match." |
Each Google channel is enabled per rule via a checkbox in the rule editor, so you can have some rules post to Chat and others log to Sheets, or combine all four.
emAIl Sentinel can call any endpoint that speaks the Model Context Protocol (JSON-RPC 2.0 over HTTPS), and additionally offers a direct Asana REST path for the simplest Asana-task-creation case. Configure entries once in Settings ▸ External integrations and then tick them per rule.
| Type | What it does | Tool name (preset) |
|---|---|---|
| Custom (recommended starting point) | Any HTTPS MCP server — Cloudflare Worker, self-hosted bridge to Slack, your own internal tools. The Help card has a 40-line Cloudflare Worker walkthrough that gets you a working endpoint in about 15 minutes. | (you define, e.g. log_alert) |
| Microsoft Teams | Sends a Teams chat or channel message via a Microsoft Graph MCP server. Requires Entra ID app registration + OAuth (admin consent often required in enterprise tenants). | send_message |
| Asana (REST API — easier) | Direct Asana REST task creation — strictly speaking not MCP, but the simplest way to create Asana tasks. PAT-based, no OAuth flow. | (unused — direct REST) |
| Asana (MCP V2 — requires OAuth) | Creates a task via the official Asana MCP V2 gateway. Requires OAuth-issued access tokens (PATs are rejected). | asana_create_task |
For each server you configure:
- Endpoint — the MCP server's HTTPS URL
- Auth token — the
Authorizationheader value (e.g.Bearer sk-…) - Tool name — the MCP tool to call (preset by type; overrideable)
- Tool args template — JSON with
{{message}},{{subject}},{{from}},{{rule}}placeholders that emAIl Sentinel fills in at dispatch time
Click Load defaults when editing a server to populate the tool name and args template for the selected type.
| What | Where it lives |
|---|---|
| Your Gemini API key, SMS provider credentials, Chat webhook URLs, rules, seen-mail baseline, activity log | PropertiesService.getUserProperties() — per-user, per-script, private |
| Email contents (sender, subject, body excerpt, attachment names) | Sent to Gemini for evaluation; included in alert messages sent via the channels you enable. |
| Google Calendar events, Sheets rows, Tasks | Created in your own Google account |
| Google Chat messages | Posted to your own Chat Spaces via webhook URLs you configure |
Nothing is stored on any third-party server. The add-on has no backend. The Google-native channels (Calendar, Sheets, Tasks, Chat) all stay within your Google account.
| Symptom | Fix |
|---|---|
| "No Gemini API key configured" in the activity log | Settings ▸ Gemini API key — paste a key, then Test Gemini |
| "Label '…' fetch failed" | Make sure the label exists in Gmail with that exact name (case-insensitive). For nested labels use the full path with /, e.g. Vendors/Invoices |
| Alerts firing for old mail right after install | Settings ▸ Reset baseline — the next run will re-baseline every label |
| SMS "HTTP 401" or auth error | Re-check your provider credentials in Settings ▸ SMS provider; both key fields must be saved |
| SMS "invalid from number" or delivery failure | Ensure the From number is provisioned on your provider account and the To number is in E.164 format (+15551234567) |
| MCP target system (Asana/Slack/Teams/etc.) not populated, but no error in the activity log | The dispatcher now surfaces tool-level MCP errors as MCP alert to "<name>" FAILED: MCP "<name>" tool error: <detail>. If you used to see no log line at all, push the latest code — earlier versions silently swallowed errors when the MCP server returned a Streamable-HTTP text/event-stream response (e.g. Asana V2 at https://mcp.asana.com/v2/mcp). Common detail texts: Project not found (bad project_id), Forbidden (PAT lacks workspace access), Required field missing (args template missing a required field). |
MCP Authorization header rejected |
Asana V2 / Slack / Teams expect the literal Bearer <token> (capital B, single space, then PAT). Pasting just the token without Bearer produces an HTTP 401 in the activity log |
| Activity log times look "off" by several hours | Activity-log timestamps are now in 12-hour AM/PM in your local timezone (taken from your primary Google Calendar). If your Calendar's timezone is wrong, fix it in calendar.google.com ▸ Time zone — emAIl Sentinel inherits that setting on the next run |
Sheets row Timestamp / Received columns show …Z UTC strings |
You're on an older deployment. Push the latest code — both columns now render as yyyy-MM-dd h:mm:ss AM/PM TZ in your local Calendar timezone |
| "Manage add-on" opens the Apps Script editor source code | This is identity-aware. As the add-on owner / developer, Google routes "Manage add-on" to the Apps Script editor. End users who installed the add-on from the Workspace Marketplace get the standard consumer dialog (uninstall, view permissions, manage data access) instead. To preview the consumer experience, install the published Marketplace listing on a separate Google account that doesn't own the script |
| Trigger doesn't seem to be running | Apps Script editor ▸ Triggers (left rail clock icon) — confirm runMailCheck is listed. If not, return to the home card and click Start scheduled scans again |
| Want to see exactly what the trigger did | Activity log card — newest entries first |
You can also peek at the trigger execution history in the Apps Script editor under Executions (left rail).
- Community Discussions — usage questions, rule-writing tips, sharing setups for SMS / Chat / MCP. Browse what other users are doing.
- GitHub Issues — bugs and feature requests; the developer monitors these directly.
Both are linked from inside the add-on: Help card → support links, and the kebab "⋮" menu → Community discussions. The home card also has a Community button next to Help.
A Chrome extension only runs while a Chrome tab is open. emAIl Sentinel needs to scan Gmail continuously in the background — the right primitive for that is an Apps Script time-driven trigger, which runs server-side on Google's infrastructure whether or not you have Gmail open. A Workspace Add-on bundles that trigger together with a Gmail-rail UI for managing rules and settings.
If you'd rather have an in-Gmail browser-only experience too, the same .gs files can also be deployed as a Gmail Add-on web app through Google Workspace Marketplace; the manifest is already compatible.
Copyright (c) 2026 JJJJJ Enterprises, LLC. All rights reserved.
| Document | Description |
|---|---|
| LICENSE | Proprietary software license |
| TERMS.md | Terms of Service |
| PRIVACY.md | Privacy Policy (required for Google Workspace Marketplace) |
| DISCLAIMER.md | Warranty disclaimer, AI accuracy, no-reliance notice |
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND. See DISCLAIMER.md and Section 9 of the Terms of Service for details.
Google, Gmail, Google Workspace, Google Chat, Google Calendar, Google Sheets, Google Tasks, and Gemini are trademarks of Google LLC. This project is not affiliated with or endorsed by Google.
