Skip to content
Agentmart
Submit a tool

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

IndexedMITLocal (stdio)★ 4
Write a review

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.

We use your email only for this newsletter. Privacy

About

Local-first, read-only MCP server for recall over your Gmail: search, contacts, threads, digests.

No 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_bodies
  • find_person
  • get_contact
  • get_message
  • get_message_attachment
  • get_thread
  • graph_communities
  • interest_get
  • list_contacts
  • list_threads
  • refresh_inbox
  • relay_menu_status
Show 4 more tools
  • search
  • settings_get
  • setup_status
  • sync_status

Write 10 · Create, change, send or run things.

  • archive_message
  • interest_set
  • modify_labels
  • save_domain_category
  • save_summary
  • settings_set
  • sync_now
  • trigger_rule_list
  • trigger_rule_save
  • webhook_consumer_register

Delete 2 · Delete, drop, revoke or wipe things.

  • trigger_rule_delete
  • webhook_consumer_delete

Not yet classified 9 · We could not tell from the name and description.

  • cadence
  • catch_up
  • digest_sources
  • domains_to_categorize
  • graph_neighbors
  • interest_propose
  • list_labeled
  • onboarding
  • setup_instructions

Network hosts it talks to 9

  • accounts.google.com · found in code
  • github.com · found in code
  • gmail.googleapis.com · found in code
  • googleapis.com · found in code
  • mail.google.com · found in code
  • oauth2.googleapis.com · found in code
  • openidconnect.googleapis.com · found in code
  • schema.tauri.app · found in code
  • unsold.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_message

    OPT-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_bodies

    Fetch 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.

  • cadence

    Inbound 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_up

    The "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_sources

    Newsletter/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_categorize

    PROPOSE 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_person

    Fuzzy 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_contact

    One contact by address: stats, curation, recent threads. A near-miss returns ranked candidates rather than nothing.

  • get_message

    One 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-only

    List 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_thread

    A thread by <account:thread-id>: metadata, its messages (compact, snippet-first), and the thread summary if present.

  • graph_communities

    Detected social circles (Louvain communities) with top members by centrality. Returns a build command handback when no graph exists yet.

  • graph_neighbors

    Co-recipiency neighbours of a contact, ranked by shared threads. On a miss, returns ranked near-miss contacts so the answer is never empty.

  • interest_get

    Read back the curated interest profile: curated contacts/domains + keywords.

  • interest_propose

    The 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_set

    Persist 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_contacts

    Ranked contacts. sort: engagement (default) | volume | recency | community. filter: "correspondent" (people you have written to) | important | muted | blocked.

  • list_labeled

    Messages 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_threads

    Conversations by contact (address) OR by query (FTS). Compact thread shapes.

  • modify_labels

    OPT-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.

  • onboarding

    The 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_inbox

    Answer "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-only

    Read-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_category

    PERSIST an entity category you assigned to a domain (open vocabulary: client, vendor, travel operator, finance, publisher, …). Used as a filter/grouping axis.

  • save_summary

    Persist 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.

  • search

    Ranked 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_get

    Read this mailbox's working-set policy: how many months of mail keep full bodies, and whether older bodies are evicted.

  • settings_set

    Change 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_instructions

    SETUP 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_status

    SETUP 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 Now

    Quick 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-only

    Per-account freshness (index_as_of), whether a sync is running, message counts, and the meta/full/summary-only body-ladder split.

  • trigger_rule_delete

    Delete a Trigger rule from this remote Deployment.

  • trigger_rule_list

    List Trigger rules on this remote Deployment.

  • trigger_rule_save

    Create or update a remote Deployment Trigger rule.

  • webhook_consumer_delete

    Delete a signed-webhook consumer from this remote Deployment.

  • webhook_consumer_register

    Register 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
    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)