Skip to content

v0.3.0

Latest

Choose a tag to compare

@github-actions github-actions released this 28 Aug 13:17
· 14 commits to main since this release
099289e

What's new

  • One process, two attach points. The container runs serve: sync,
    index, a Unix socket at /index/mcp.sock for local clients, and the HTTP
    listener only when PUBLIC_URL is set. Local clients attach with
    docker exec -i your-mail-mcp your-mail-mcp stdio, which bridges
    stdin/stdout to that socket. With no socket, stdio runs the daemon
    in-process for the life of the session and exits when the client closes
    stdin, so docker run -i --rm ghcr.io/wildsurfer/your-mail-mcp alone
    answers tools/list.
  • Fresh mail first. Each account gets a second mbsync channel,
    <name>-recent, that mirrors INBOX only, capped at 1000 messages. Today's
    mail is searchable within minutes while the full history fills at the
    provider's pace. Query tools say when an account's mirror is still
    incomplete and how many messages are indexed so far, and status reports
    whether the full mirror has completed. The recent channel stops once it
    has.
  • refresh is the scheduled pass. It syncs every folder of one account
    or all of them, waits up to 20 seconds, joins a pass that is already
    running instead of starting a second one, resets the sync ticker so a
    manual refresh is not followed by a scheduled one moments later, and names
    the accounts it skipped because they are in backoff.
  • A cut-off sync is not a failure. An mbsync run stopped by
    SYNC_TIMEOUT resumes on the next pass and no longer counts toward
    backoff, so a multi-day first mirror of a large Gmail account keeps its
    cadence.
  • Attachments without a listener. With no PUBLIC_URL there is no URL
    to sign, so a binary part larger than 5MB is saved under
    /index/attachments/ and the tool returns the path to docker cp.
  • Starts with no accounts. A missing or empty accounts file no longer
    stops the process; status says what to mount. An account name may not
    end in -recent. The OAuth server is built before any goroutine contacts
    a provider, so a set PUBLIC_URL with a missing OAUTH_PASSPHRASE exits
    at once.
  • Docs. The README walks one path: quick start on your machine, then
    your phone through Tailscale, with the alternatives folded. The accounts
    file, environment variables, provider notes and troubleshooting moved to
    docs/reference.md; the VPS install and hardening to docs/server.md.
  • Registry. The MCP registry entry now lists a stdio package alongside
    the streamable HTTP one.

Upgrade notes

The image starts in stdio mode when it is given no command, so a compose
file without a command: line gets a container that reads end of input and
exits at once, over and over. Add command: serve to the service before you
pull this image; the compose.yaml in the repository has it.

Two directories appear by themselves after the upgrade: <name>-recent/ in
the mail volume for each account, and mcp.sock plus attachments/ in the
index volume. The first sync after the upgrade pulls up to 1000 INBOX
messages per account again for the recent channel. The accounts file, the
environment variables and the tools are otherwise unchanged. Full text in
docs/upgrading.md.