Skip to main content
Glama
everlog-mcp

everlog-mcp

by jlconlin

everlog-mcp

A read-only MCP server for the Everlog journal app on macOS. It lets an MCP client (Claude Code, Claude Desktop, ...) search and read your journal entries, tags, photos and statistics straight from Everlog's local database. It never writes to or copies Everlog's data.

Tools

Tool

Purpose

list_journals

Journals with entry count, first/last date, hidden flag

list_tags

Tag paths (Parent/Child) with entry counts

search_entries

Full-text (FTS5) search plus journal / tag (incl. descendants) / date / bookmarked filters, paging, sorting

get_entry

Full markdown text, metadata, location, weather, AI summary, attachments; optional inline photos

get_attachment_image

An image attachment as a resized JPEG

on_this_day

Entries from earlier years on the same month/day

journal_stats

Entries and words per year or month

Dates are Everlog's own local days (America/Denver), YYYY-MM-DD.

Related MCP server: message-container

Install / run

Requires macOS, Python 3.13 and uv.

uv run everlog-mcp          # speaks MCP over stdio
uv run pytest -q            # tests (synthetic data only)

Configuration (environment variable):

  • EVERLOG_DIR - Everlog data directory. Default: ~/Library/Group Containers/group.hummingbird.

Register with a client (examples; not done for you)

claude mcp add everlog -- uv --directory /path/to/Everlog-mcp run everlog-mcp

Claude Desktop (claude_desktop_config.json):

{
  "mcpServers": {
    "everlog": {
      "command": "uv",
      "args": ["--directory", "/path/to/Everlog-mcp", "run", "everlog-mcp"]
    }
  }
}

macOS permission

Everlog's data lives in a Group Container. The app that launches the server (Claude Desktop, your terminal, ...) may need Full Disk Access or the "access data from other apps" permission in System Settings > Privacy & Security. If the database cannot be opened, tools return an error explaining this.

Privacy

Whatever the tools return (entry text, summaries, photos, locations) is sent to your MCP client's model provider as part of the conversation. Only connect this server to clients and models you are comfortable sharing your journal with. The server itself makes no network connections and logs only counts/timings to stderr.

How it works / data-format notes

  • Everlog stores Core Data SQLite files Hummingbird.sqlite (entries, journals, tags, places, weather, AI summaries) and AttachmentData.sqlite (attachment bytes), in WAL mode. Both are opened with mode=ro (never immutable, so recent WAL content is visible).

  • At first use the server builds an in-memory SQLite FTS5 index (porter stemming) of entry text plus audio transcriptions, and re-checks PRAGMA data_version before every call; if Everlog committed changes, the index is rebuilt (about a second for ~10k entries).

  • ZTEXT is the real markdown (ZCONTENT is a placeholder). Columns named ZENCRYPTED* actually hold plaintext and are preferred over their unprefixed twins. Trashed entries are excluded.

  • Timestamps are Core Data epoch (Unix + 978307200). Day filtering uses ZYEARMONTHDAYID (Everlog's own America/Denver day bucket). Coordinates of 0/0 mean "none".

  • Attachments are referenced in text as ![attachment](<32-hex id>). Blob bytes in ZATTACHMENTDATA.ZDATA start with 0x01 (inline bytes) or 0x02 (ASCII UUID of a file under .AttachmentData_SUPPORT/_EXTERNAL_DATA/). When several rows share an identifier the largest payload is used.

  • Images are converted to JPEG (quality 80, longest side <= 1568 px by default) with macOS /usr/bin/sips, which also handles HEIC.

  • Weather: temperature in deg C, pressure converted from Pa to hPa, humidity 0 means "no data".

License

MIT

Available Tools

7 tools
get_attachment_imageA
Read-onlyIdempotent

Return an image attachment as JPEG, shrunk so its longest side is at most max_size pixels (default 1568). attachment_id is the id from get_entry's attachments list (the 8-char prefix in placeholders also works if unambiguous). Errors if the attachment is not an image or its bytes are missing.

Inputs: attachment_id (required), max_size.

get_entryA
Read-onlyIdempotent

Get one entry in full: markdown text (attachments shown as placeholders such as [image a1b2c3d4], [audio a1b2c3d4 2:31]) plus date, modified time, journal, tags, location/coordinates/timezone, weather, bookmarked/pinned, word_count, the Everlog AI summary (if any) and an attachments list (attachment_id, type, size/duration, transcription). With include_images=true, up to max_images photos are returned as images after the entry.

Inputs: entry_id (required), max_images, include_images.

journal_statsA
Read-onlyIdempotent

Writing statistics: entries and total words per year (or month, 'YYYY-MM'), plus totals. Optionally restricted to one journal and/or an inclusive YYYY-MM-DD date range.

Inputs: journal, end_date, group_by, start_date. Returns: object

list_journalsA
Read-onlyIdempotent

List all journals with entry_count, first_date, last_date (YYYY-MM-DD) and a hidden flag. Trashed entries are excluded. Use the names with the journal filter of other tools.

Inputs: no named parameters. Returns: result

list_tagsA
Read-onlyIdempotent

List all tags (hierarchical tags appear as 'Parent/Child') with entry_count, most used first. A tag filter on a parent also matches its descendants.

Inputs: no named parameters. Returns: result

on_this_dayB
Read-onlyIdempotent

Entries written on the same month/day in earlier years, newest first, with years_ago. date: YYYY-MM-DD reference day (default: today in America/Denver); only years before it are included. Same result shape as search_entries.

Inputs: date, limit, journal. Returns: object

search_entriesA
Read-onlyIdempotent

Search and browse journal entries. Returns total match count and a page of results, each with entry_id, date, journal, title, tags, word_count and a snippet (matches wrapped in «»).

query: full-text (SQLite FTS5): words are ANDed; "exact phrase"; prefix*; OR; NOT; stemmed. Invalid syntax falls back to matching all words. Omit to filter without text search. journal: journal name (case-insensitive). tag: tag path; also matches child tags. start_date / end_date: inclusive YYYY-MM-DD bounds on the entry's local day. sort: relevance (default with query) | newest (default without) | oldest. limit: 1-100 (default 20); offset for paging. Fetch full text with get_entry.

Inputs: tag, sort, limit, query, +5 more. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.9/5.0

    Scored across 7 tools

    Disambiguation5/5

    Each tool targets a distinct resource or operation: journal/tag listing, entry search, full-entry fetch, attachment retrieval, date-based recall, and aggregates. The only near-neighbors (search_entries vs on_this_day) are clearly separated by the 'same month/day in prior years' semantics.

    Naming Consistency4/5

    Five of seven names follow a clean verb_noun pattern (list_journals, list_tags, search_entries, get_entry, get_attachment_image). on_this_day and journal_stats break the pattern but are readable and unambiguous, so this is a minor deviation rather than a problem.

    Tool Count5/5

    Seven tools is well-scoped for a journaling server: metadata lists, search, fetch, attachment access, a recall view, and stats. No tool appears redundant or filler.

    Completeness3/5

    The surface is purely read-only and covers browsing, retrieval, and stats well, but there is no way to create, update, delete, or tag entries. Agents can read the journal completely but cannot write to it, which is a notable lifecycle gap.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      Not graded
      quality
      D
      maintenance
      Read-only MCP server for Day One journal on macOS, enabling search and browsing of entries, photos, and metadata.
      2
      -
    • F
      license
      Not graded
      quality
      B
      maintenance
      Enables AI clients to read and search macOS Messages history through a read-only MCP interface.
      -
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables MCP-compatible clients to query a local MoneyWiz SQLite database through a permanently read-only, local-first interface with Decimal-safe per-currency results for accounts, transactions, categories, payees, tags, budgets, scheduled transactions, and cashflow summaries.
      MIT