Skip to main content
Glama
Ls-Dai

apple-journal-mcp

by Ls-Dai

apple-journal-mcp

A read-only MCP server that lets Claude (or any MCP client) read your Apple Journal entries on macOS: recent entries, date ranges, search, photos, locations, links, and audio transcripts.

It is a thin wrapper around journal-cli, which reads Journal's local data store through a temporary snapshot, so the live store is never opened.

Tools

Tool

What it does

recent_entries(days=7, limit=200)

Last N days including today, full text. days=1 is today only

list_entries(since, until="", limit=200)

Date range, full text. YYYY-MM-DD, local time, both ends inclusive

show_entry(entry_id)

One entry with photos, locations, links, audio transcripts

search_entries(query, limit=50)

Case-insensitive substring search over titles and text

list_journals()

Journals with entry counts

journal_stats()

Entry, word, attachment counts and a per-year histogram

doctor()

Checks the install and Full Disk Access

Entry JSON has id, uuid, date (YYYY-MM-DD HH:MM:SS, local time), title, text, chars, bookmarked, draft and synced. show_entry adds assets, where each asset has a type (photo, video, livePhoto, multiPinMap, link, audio, drawing, …), files[].path, and type-specific fields: places[] for locations, url/link_title for links, and duration/transcript for audio.

Read-only by design

A journal is yours to write. This server lets Claude read, find and reflect on what you wrote, and it never writes for you. The guards below keep it that way:

  • The server only runs the read commands list, show, search, journals, stats and doctor. It refuses anything else, and refuses --live, --accept-risk, --force and --hard even on read commands.

  • Every tool carries the MCP readOnlyHint annotation, so clients can tell that it does not modify anything.

  • Inputs are validated before journal-cli sees them. Dates must be real YYYY-MM-DD dates, limits must be positive, and search queries cannot start with -- (journal-cli would read those as options).

Related MCP server: Mac Local Mail MCP

Requirements

  • A Mac where Apple Journal is set up, so its entries are in this Mac's local store

  • journal-cli: brew install omarshahine/tap/journal-cli

  • uv: brew install uv

Install

git clone https://github.com/Ls-Dai/apple-journal-mcp.git
cd apple-journal-mcp
uv sync

Find the absolute paths you'll need for the config:

which uv journal-cli   # e.g. /opt/homebrew/bin/uv, /opt/homebrew/bin/journal-cli
pwd                    # the repo path

Smoke test from Terminal (Terminal needs Full Disk Access for this step):

uv run python -c "from apple_journal_mcp import server; print(server.doctor())"

You should see Read N entries. All good.

Configure

Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json and add the server under mcpServers, using the absolute paths from above:

{
  "mcpServers": {
    "apple-journal": {
      "command": "/opt/homebrew/bin/uv",
      "args": ["run", "--directory", "/Users/you/Development/apple-journal-mcp", "apple-journal-mcp"],
      "env": { "JOURNAL_CLI": "/opt/homebrew/bin/journal-cli" }
    }
  }
}

Then:

  1. Grant Full Disk Access to Claude.app in System Settings → Privacy & Security → Full Disk Access. macOS checks the app that launched the process, so granting it to Terminal is not enough.

  2. Quit Claude completely (⌘Q) and reopen it.

  3. Ask Claude to run the doctor tool.

Claude Desktop launches servers with a minimal PATH, which is why the config uses absolute paths. Without JOURNAL_CLI, the server also looks in /opt/homebrew/bin, /usr/local/bin, ~/.homebrew/bin, ~/.npm-global/bin and ~/.local/bin.

Claude Code

claude mcp add apple-journal --scope user \
  -e JOURNAL_CLI=/opt/homebrew/bin/journal-cli \
  -- uv run --directory /Users/you/Development/apple-journal-mcp apple-journal-mcp

Claude Code runs inside your terminal, so the terminal app (Terminal, iTerm2, Ghostty, …) needs Full Disk Access. Check with claude mcp list, or /mcp inside a session.

Without cloning

uv can run the server straight from GitHub:

"apple-journal": {
  "command": "/opt/homebrew/bin/uvx",
  "args": ["--from", "git+https://github.com/Ls-Dai/apple-journal-mcp", "apple-journal-mcp"],
  "env": { "JOURNAL_CLI": "/opt/homebrew/bin/journal-cli" }
}

Other MCP clients

This is a standard stdio server. The command is uv, the args are run --directory /path/to/apple-journal-mcp apple-journal-mcp, and JOURNAL_CLI is optional. Whatever app launches it needs Full Disk Access.

Environment variables

Variable

Purpose

JOURNAL_CLI

Absolute path to journal-cli. Checked before PATH and the usual install locations

JOURNAL_DB

Read a different moments.sqlite, such as a sandbox copy from journal-cli sandbox --dir DIR. Passed through to journal-cli

Agent skill (optional)

skills/apple-journal/SKILL.md teaches Claude how to use these tools well: picking date ranges, searching effectively, reading assets, and handling journal content with care.

  • Claude Code: ln -s "$PWD/skills/apple-journal" ~/.claude/skills/apple-journal

  • Claude Desktop / claude.ai: zip the skills/apple-journal folder and upload it as a custom skill in Claude's settings.

Troubleshooting

Symptom

Fix

journal-cli not found

Set JOURNAL_CLI to the output of which journal-cli

PERMISSION DENIED / permission errors

Grant Full Disk Access to the app that launches the server (Claude.app or your terminal), then quit and reopen it

Server missing in Claude Desktop

Check ~/Library/Logs/Claude/mcp-server-apple-journal.log, and that the JSON is valid

Fewer entries than expected

Dates are local time. Make sure Journal has synced to this Mac; entries with no title and no text are skipped

Interactive testing

npx @modelcontextprotocol/inspector uv run --directory /path/to/apple-journal-mcp apple-journal-mcp

Development

main only changes through pull requests: work on a branch, then open a PR. Git hooks in .githooks/ refuse commits on main and pushes to it. Enable them once per clone:

git config core.hooksPath .githooks
uv sync                    # installs pytest and ruff too
uv run pytest              # unit tests; never call a real journal-cli
uv run ruff check . && uv run ruff format --check .

Integration tests run the real journal-cli against a synthetic store built by the CLI repo's tests/make-fixture.sh. That store contains no personal data, and your real journal is never opened:

JOURNAL_CLI_SRC=~/Development/apple-journal-cli uv run pytest -m integration

See CLAUDE.md for architecture notes and journal-cli quirks.

Credits

journal-cli by Omar Shahine does the hard part of decoding Journal's private Core Data store.

License

MIT

Available Tools

7 tools
doctorA
Read-only

Check that journal-cli is installed and can read the Journal store.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety and locality are covered. The description adds that the check targets local installation and store readability, but says nothing about whether it reports warnings vs. errors or how partial failures are surfaced (though an output schema exists).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler. Every clause contributes: what is checked (install) and what capability is validated (store read).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be explained, and annotations cover the read-only profile. What the check verifies is stated; only the expected follow-up on failure is left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so there is no parameter semantics to document; this is the baseline for a no-arg tool. The description correctly implies the probe needs no inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb ('Check') and two concrete things verified: that journal-cli is installed and that it can read the Journal store. It is clearly not an entry/data-listing tool like its siblings, though it never names or contrasts with them explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: an agent can infer this is a pre-flight/troubleshooting check, but the description never states when to call it (e.g., before other tools, or after a failure) or what to do if the check fails.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

journal_statsC
Read-only

Entry, word, attachment and per-year counts (plain text).

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. Beyond that the description only adds '(plain text)', which is a thin output-format hint and says nothing about what corpus is counted, whether counts are global or filtered, or cost/performance characteristics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is a single short fragment with no waste, but it is telegraphic to the point of ambiguity — a leading verb such as 'Returns counts of...' would cost two words and remove the guesswork.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and with zero parameters the surface area is small. Still, the scope of the counts (all entries across all journals, unfiltered) is never stated, which is the one thing an agent needs to choose this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4; there is no parameter semantics to document and the description does not mislead about inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description enumerates the aggregate counts returned (entry, word, attachment, per-year), which distinguishes it from the listing siblings like list_entries and recent_entries. However, it is a bare noun phrase with no verb or resource name, so the agent must infer that this is a statistics/summary tool rather than a formatter.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to call this versus alternatives such as list_entries or search_entries, nor any mention of scope (all journals? one journal?). The agent is left to infer usage entirely from the field list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_entriesB
Read-only

Entries in a date range with full text, as JSON.

Dates are YYYY-MM-DD in local time, and both ends are inclusive.

NameRequiredDescriptionDefault
limitNo
sinceYes
untilNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuine context beyond that — local-time interpretation of dates and inclusive bounds on both ends — but says nothing about the default limit of 200 or whether results are truncated, which materially affects how an agent interprets a response.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with what is returned and followed by the date semantics that would otherwise cause errors. Nothing is wasted, though the terseness comes at the cost of the limit and sibling-routing information noted elsewhere.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the date conventions are well covered. The gaps are the undocumented limit/truncation behavior and the absence of any disambiguation from recent_entries and search_entries, which matters for a tool with four similar siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the burden: it does clarify the format and inclusive semantics for since/until, which is real added meaning. However, the limit parameter is never mentioned in either the schema or the description, leaving one of three parameters entirely opaque.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the resource (entries) and the scoping mechanism (a date range) plus the return shape (full text, JSON), which is enough to know what the tool does. It does not differentiate itself from close siblings like recent_entries or search_entries, leaving the agent to infer which one fits.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The date-range framing implies the usage context — pull entries bounded by since/until — but there is no explicit when-to-use, no exclusion, and no named alternative. An agent choosing between this, recent_entries, and search_entries gets no routing help from the description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_journalsC
Read-only

All journals with entry counts, as JSON.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, and an output schema exists, so the safety and return-shape burden is covered elsewhere. The description adds only 'with entry counts, as JSON,' which restates what the output schema provides; it says nothing about ordering, whether journals with zero entries appear, or cost of the call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence with the scope ('All journals') and the payload ('entry counts') front-loaded. It is efficient rather than padded, though it is terse to the point of under-specification.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-param read tool with annotations and an output schema, the description is minimally sufficient. Missing ordering information and any hint of how it relates to journal_stats, which matters given how similar the sibling names are.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so the baseline is 4. 'All journals' usefully confirms there is no filtering or pagination knob to supply, which is the only semantic an agent needs here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names the resource (journals) and what is returned (entry counts, JSON), so an agent knows it enumerates journals. But the verb is implicit and it doesn't distinguish itself from journal_stats, the sibling most likely to be confused with it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance and no alternatives named, despite six siblings including journal_stats and list_entries. The agent must infer from the name alone that this is the unfiltered enumeration.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

recent_entriesA
Read-only

Entries from the last N days (inclusive of today), with full text, as JSON.

days=1 is today only; days=7 is today plus the six days before it.

NameRequiredDescriptionDefault
daysNo
limitNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds that results come back as JSON with full entry text and that the window is inclusive of today, but it is silent on the default limit (200) and any truncation behavior, which is the main behavioral risk for a list tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with what is returned, followed by the one clarification an agent actually needs. No filler and no repetition of schema or annotation content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-shape explanation is not required, and the days window is fully specified. However, for a list-style tool defaulting to 200 items, the absence of any mention of limit or truncation leaves a real gap that could cause silent under-retrieval.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden. It handles days well with a concrete inclusive-window example, but says nothing about limit, leaving one of two parameters completely undefined in both schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the resource (entries) and its scope (last N days, inclusive of today, full text, JSON), which is a specific and checkable definition. It does not explicitly contrast with list_entries or search_entries, so the agent must infer that this is the time-windowed variant.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The days semantics ('days=1 is today only; days=7 is today plus the six days before it') imply the intended use case of retrieving recent activity, but there is no explicit statement of when to pick this over list_entries or search_entries. Usage is inferable rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_entriesB
Read-only

Case-insensitive substring search over entry titles and text, as JSON.

NameRequiredDescriptionDefault
limitNo
queryYes

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real value by specifying case-insensitive substring matching over both titles and text, but says nothing about result ordering, truncation, or what happens when more than the limit matches.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One dense, front-loaded sentence with no filler. The trailing 'as JSON' is mildly redundant given an output schema already exists, which is the only wasted token.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema covers return values, so that omission is fine. But for a two-parameter tool with zero schema descriptions, the undescribed limit and the absence of any sibling routing leave meaningful gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden. It fully explains the required query parameter's matching behavior, but the limit parameter is never mentioned — no meaning, default, or maximum — leaving half the surface undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (substring search over entry titles and text) plus the matching semantics (case-insensitive substring), which is enough to tell it apart from list_entries and recent_entries. It does not name a sibling explicitly, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use or when-not-to-use guidance. Nothing tells the agent to prefer this over list_entries or recent_entries when browsing rather than searching, or whether it should fall back to show_entry for a known id.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_entryB
Read-only

One entry with its assets: photos, locations, links, audio transcripts.

NameRequiredDescriptionDefault
entry_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already establishes that this is a safe read operation, so the description's main added value is disclosing what is returned: assets such as photos, locations, links, and audio transcripts. It does not mention behavior for missing entries or permission constraints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single compact sentence with the key resource and return composition front-loaded. It is efficient, though slightly telegraphic rather than fully structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description needn't explain return values exhaustively, and annotations cover the safety profile. However, it omits the meaning of entry_id and any routing guidance relative to sibling lookup tools, leaving clear gaps for a simple but parameterized read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description does not explain the required entry_id parameter at all. Unlike a zero-parameter tool, this description must compensate for the undocumented identifier, and it does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource and scope: a single entry plus its associated assets. The singular 'One entry' helps distinguish it from sibling tools like list_entries and search_entries, though the verb is only implied by the tool name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus list_entries, recent_entries, or search_entries. The single-entry scope is implied, but exclusions and prerequisites are absent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 7 tool updatesv0.1.0
    • First observeddoctor
    • First observedjournal_stats
    • First observedlist_entries
    • First observedlist_journals
    • First observedrecent_entries
    • First observedsearch_entries
    • First observedshow_entry

TDQS

B3.4/5.0

Scored across 7 tools

Disambiguation4/5

recent_entries and list_entries overlap because both return full-text entries over a date window; descriptions distinguish them, but an agent may still deliberate between them. Other tools are clearly distinct: show_entry for assets, search_entries for text search, list_journals/journal_stats for metadata, and doctor for setup.

Naming Consistency4/5

All names use snake_case, and most are verb_noun (list_entries, show_entry, search_entries, list_journals). recent_entries and journal_stats are noun phrases, and doctor is a bare noun, but the pattern remains readable.

Tool Count5/5

Seven tools is well-scoped for a focused journal-reading server. Each tool targets a distinct retrieval or diagnostic task without obvious filler.

Completeness4/5

The surface covers recent/range listing, single-entry details with assets, search, journal listing, stats, and a health check. As a read-only journal access toolset it is solid, though entry listing lacks a journal filter and there is no export or write operation (likely intentional).

Maintenance

ActivityMaintained
ResponsivenessNo 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
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables MCP clients to search, read, and inspect Apple Mail on macOS, including conversations and attachments. It can create new, reply, reply-all, or forward drafts, but cannot send or modify existing messages.
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables AI clients to read and search macOS Messages history through a read-only MCP interface.
    -