Releases: csitte/mailwarden
Releases · csitte/mailwarden
Release list
v0.1.2 — reliable is:unread search
Fixed
searchnow re-verifies read-state/category predicates against each hit''s live labels. Gmail''sthreads.listindex silently dropsis:unreadin some operator combinations (e.g.category:updates is:unread -in:inboxreturned read mail too). The query''s unambiguous predicates —is:unread/is:read,is:starred/is:unstarred,is:important,in:inbox/in:trash/in:spam,category:…, each with negation — are checked against the thread''s true labels and index false positives dropped.OR/parenthesised/braced queries disable the post-filter so boolean logic is untouched;label:NAMEis not resolved here.
Changed
- With a label post-filter active,
searchscans a full candidate page (≤100) and stops oncemaxResultsthreads genuinely match, somaxResultsstays meaningful.
Added
- Pure helpers
deriveLabelFilters/threadMatchesFilters+ 12 vitest cases (suite now 30 tests).
v0.1.1 — bug fixes + tests
Fixed
- Attachment detection in
search— fetch threads withfullformat (notmetadata, which omitspayload.parts, so detection always returned false). - Inline images no longer counted as attachments —
collectAttachmentsfilters onContent-Disposition/Content-ID/X-Attachment-Id. sweep_snoozedcould miss threads when >100 shared a due date (pagination loss).modify_labelsresolves human-readable names → label ids (STARRED,ToDo,MCP/Snoozed); unknown names created (add) or skipped (remove).- Body decoding uses
base64url— content with-/_no longer corrupted. - Security: override
uuidto^11.1.1(GHSA-w5hq-g745-h8pq); esbuild + vitest 4.1.9 bump.
Added
- vitest test suite.
Changed
- Refactor toward testability (pure
collectBodies/collectAttachments/parseMessage, injectable API client).
v0.1.0 — initial release
Initial release of mailwarden — a native Gmail MCP server talking straight to the live Gmail API (no synced snapshot).
Added
- Read/find:
search,get_thread,list_labels - Mailbox actions:
modify_labels,archive,mark_read,mark_unread,trash,untrash download_attachment— save an attachment to a local path- Snooze (no native Gmail equivalent):
snooze,unsnooze,list_snoozed,sweep_snoozedvia datedMCP/Snoozed/<YYYY-MM-DD>labels; sweep on demand,mailwarden --sweep, or hourly withMAILWARDEN_AUTO_SWEEP=1 - Transports: stdio (local) + Streamable HTTP (VPS / claude.ai connector); OAuth scope
gmail.modify