mail-index
Local-first, read-only MCP server for recall over your Gmail: search, contacts, threads, digests.
Connector by unsoldgroup · GitHub account verified by the MCP Registry
Install
Works with Claude Code, Codex, VS Code, Cursor, Windsurf, Claude Desktop. Read the repository before you give any tool access to your data.
npx agentmarket install connector/unsoldgroup-mail-index
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this server can do and what it asks for, from its tool list, install config and code. Checked Oct 25, 2026.
- Tools
- 16 read · 10 write · 2 delete · 9 not yet classified
- Secrets
- None asked for
- Install scripts
- None found
- Runs as
- Node.js package
Tools by what they do 37
Read from the source code; the running server may list different tools.
Read 16 · Look things up without changing anything.
backfill_bodiesfind_personget_contactget_messageget_message_attachmentget_threadgraph_communitiesinterest_getlist_contactslist_threadsrefresh_inboxrelay_menu_status
Show 4 more tools
searchsettings_getsetup_statussync_status
Write 10 · Create, change, send or run things.
archive_messageinterest_setmodify_labelssave_domain_categorysave_summarysettings_setsync_nowtrigger_rule_listtrigger_rule_savewebhook_consumer_register
Delete 2 · Delete, drop, revoke or wipe things.
trigger_rule_deletewebhook_consumer_delete
Not yet classified 9 · We could not tell from the name and description.
cadencecatch_updigest_sourcesdomains_to_categorizegraph_neighborsinterest_proposelist_labeledonboardingsetup_instructions
Network hosts it talks to 9
accounts.google.com· found in codegithub.com· found in codegmail.googleapis.com· found in codegoogleapis.com· found in codemail.google.com· found in codeoauth2.googleapis.com· found in codeopenidconnect.googleapis.com· found in codeschema.tauri.app· found in codeunsold.group· found in code
Files it touches
/dev/null- Your home directory (~)
~/.config/gws-acct-a~/.config/gws-acct-b
Tools (37)
Read from the source code; the running server may differ. Descriptions are the server’s own words; hidden characters are shown as [U+…].
archive_messageOPT-IN WRITE — MUTATES the mailbox. Archive one message (remove its INBOX label), given its <account:message-id> ref. Requires a gmail.modify grant; the default read-only install refuses with the exact re-auth command. Use only when the user explicitly asked to archive.
backfill_bodiesFetch the missing bodies inside the retention window now, instead of waiting for the hourly sweep. Use after changing the window or finishing onboarding. Returns how many messages are still header-only.
cadenceInbound frequency per sender BRAND (registrable domain): volume, distinct senders, first/last seen, messages-per-month — over the whole index or since a time (30d, 1mo, ISO). Pass "category" to scope to one entity category you assigned via save_domain_category (e.g. all "expedition-operator" senders at once). Deterministic — use this instead of hand-writing SQL over senders.
catch_upThe "what did I miss" briefing since a time (30d, 2w, 12h, 1mo, or ISO): new mail from curated-important contacts, new replies in your threads, and interest-keyword hits. Compact rows + a body command handback. If the index is stale it returns now and spawns a background sync.
digest_sourcesNewsletter/list senders ranked by engagement + interest, with unread/unsummarized issue counts — the digest routine worklist. Stale index returns now and spawns a background sync.
domains_to_categorizePROPOSE domains with back-and-forth contacts (Correspondents) plus sample senders/subjects as context, so you can assign an entity category. Then save_domain_category.
find_personFuzzy contact resolution from a vague hint (name fragment, handle, or domain). Ranks Correspondents (people you have written to) first. The entry point for "who was that contact from last spring?".
get_contactOne contact by address: stats, curation, recent threads. A near-miss returns ranked candidates rather than nothing.
get_messageOne message by <account:id>. level: "summary" (default — agent summary or snippet), "body" (distilled body; inline-enriches a still-meta row once, the only provider fetch), or "meta". Bodies are opt-in.
get_message_attachmentread-onlyList or download attachments for one indexed message. Pass ref only to list filenames, MIME types, sizes, and provider ids. Pass attachment as an exact filename or id to receive the raw file as an embedded MCP resource plus base64 metadata. Read-only; bytes are fetched once and never persisted.
get_threadA thread by <account:thread-id>: metadata, its messages (compact, snippet-first), and the thread summary if present.
graph_communitiesDetected social circles (Louvain communities) with top members by centrality. Returns a build command handback when no graph exists yet.
graph_neighborsCo-recipiency neighbours of a contact, ranked by shared threads. On a miss, returns ranked near-miss contacts so the answer is never empty.
interest_getRead back the curated interest profile: curated contacts/domains + keywords.
interest_proposeThe curation SEED: a ranked shortlist of top contacts + domains by engagement, each with a suggested action (important/muted/none). Present it, take fuzzy edits, then interest_set.
Show 22 more tools
interest_setPersist the curation disposition: contact/domain curation labels (important/muted/blocked, or null to clear) and freeform interest keywords (replaces the set). This profile drives which bodies get enriched.
list_contactsRanked contacts. sort: engagement (default) | volume | recency | community. filter: "correspondent" (people you have written to) | important | muted | blocked.
list_labeledMessages carrying a Gmail label, newest-first (label membership, not full-text). Use label "INBOX" to answer "what is in my inbox right now" — INBOX membership is reconciled on every sync, so it reflects the mailbox now (archived mail is dropped). "UNREAD" answers "what is unread", "STARRED" what is starred; any user label filters to it. Compact, snippet-first like search.
list_threadsConversations by contact (address) OR by query (FTS). Compact thread shapes.
modify_labelsOPT-IN WRITE — MUTATES the mailbox. Add and/or remove Gmail labels on one message (system ids like STARRED/UNREAD, or existing user-label NAMES; creating new labels is not supported). Requires a gmail.modify grant; the default read-only install refuses with the exact re-auth command. Use only when the user explicitly asked to change labels.
onboardingThe guided first run. Call with no arguments to get the next question plus its options; present it to the user, then call again with `step` and their `answer`. Walks: accounts → retention window → interests → backfill. Returns step:"done" when there is nothing left to ask.
refresh_inboxAnswer "what is in my inbox right now" with live-accurate membership. Reconciles INBOX against the live mailbox (archived mail drops, new inbox mail is pulled) THEN returns the current inbox — prefer this over list_labeled INBOX whenever freshness matters. One bounded provider round-trip (inbox-sized); degrades to the indexed inbox (refreshed=false) when no creds are wired.
relay_menu_statusMenu Statusread-onlyRead-only menu/status payload for local MCP relay hosts: compact state, SF Symbol names, detail rows, and quick actions expressed as ordinary MCP tool calls. Safe for frequent polling; it never starts syncs.
save_domain_categoryPERSIST an entity category you assigned to a domain (open vocabulary: client, vendor, travel operator, finance, publisher, …). Used as a filter/grouping axis.
save_summaryPersist your summary of a message or thread (provenance-marked, FTS-indexed). level: "message" (default) or "thread". For bulk/non-curated mail this makes the body eligible for demotion after a grace window.
searchRanked fuzzy full-text recall over the indexed mail (subject/sender/snippet/body/summaries), porter-stemmed so word forms match (refund≈refunds). Snippet-first and compact (each row already has sender/subject/date) — open a full body with get_message only when you need details. Recall, not lookup: a half-remembered phrase still surfaces ranked neighbours. Use it for things like "what did I buy / order / pay for", receipts, invoices, order confirmations, bookings, travel, "find the email about X", "the message from the recruiter", a confirmation/booking number, etc. For aggregating purchases, s…
settings_getRead this mailbox's working-set policy: how many months of mail keep full bodies, and whether older bodies are evicted.
settings_setChange the working-set policy. body_window_months: months of mail that keep full bodies (0 = no window, interest profile only). retention: "window" evicts bodies past the window (re-fetchable on demand), "off" keeps everything. Omitted fields are left unchanged.
setup_instructionsSETUP MODE (no config yet). Return the exact steps + commands to finish onboarding mail-index, flagging the human steps (browser OAuth consent; manual install when Homebrew is unavailable). The server is advisory only — run `mail-index setup --account <email>` in your shell, then restart the server.
setup_statusSETUP MODE (no config yet). Report what is installed / authenticated / configured for mail-index — read-only observation (PATH + filesystem). Tells you whether onboarding is complete and the server can be restarted into full recall mode.
sync_nowSync NowQuick action for relay/menu hosts. Starts a detached incremental sync for one account, or all configured/indexed accounts when omitted, and returns immediately with the equivalent CLI command handback.
sync_statusSync Statusread-onlyPer-account freshness (index_as_of), whether a sync is running, message counts, and the meta/full/summary-only body-ladder split.
trigger_rule_deleteDelete a Trigger rule from this remote Deployment.
trigger_rule_listList Trigger rules on this remote Deployment.
trigger_rule_saveCreate or update a remote Deployment Trigger rule.
webhook_consumer_deleteDelete a signed-webhook consumer from this remote Deployment.
webhook_consumer_registerRegister a signed-webhook consumer for Trigger rule deliveries.
Compare and alternatives
Featured in
Signals
- Stars
- 4
- Forks
- 1
- Open issues
- 12
- Last commit
- Oct 12, 2026 (16 days ago)
- Last release
- Aug 5, 2026 (2 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- Registry name
io.github.unsoldgroup/mail-index- Version
- 1.5.1
- Auth
- No auth
- Packages
- npm mail-index
- License
- MIT
- Repository
- github.com/unsoldgroup/mail-index
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
Cite this page
mail-index MCP server. Agent Mart. https://agentmart.dev/connectors/unsoldgroup-mail-index (last updated 2026-10-24)