apple-journal-mcp
Allows reading Apple Journal entries on macOS, including recent entries, date-range listings, search, entry details with photos, locations, links, audio transcripts, journal lists, and journal statistics.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@apple-journal-mcpshow me what I journaled about over the past week"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 |
| Last N days including today, full text. |
| Date range, full text. |
| One entry with photos, locations, links, audio transcripts |
| Case-insensitive substring search over titles and text |
| Journals with entry counts |
| Entry, word, attachment counts and a per-year histogram |
| 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,statsanddoctor. It refuses anything else, and refuses--live,--accept-risk,--forceand--hardeven on read commands.Every tool carries the MCP
readOnlyHintannotation, so clients can tell that it does not modify anything.Inputs are validated before journal-cli sees them. Dates must be real
YYYY-MM-DDdates, 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-cliuv:
brew install uv
Install
git clone https://github.com/Ls-Dai/apple-journal-mcp.git
cd apple-journal-mcp
uv syncFind 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 pathSmoke 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:
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.
Quit Claude completely (⌘Q) and reopen it.
Ask Claude to run the
doctortool.
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-mcpClaude 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 |
| Absolute path to |
| Read a different |
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-journalClaude Desktop / claude.ai: zip the
skills/apple-journalfolder and upload it as a custom skill in Claude's settings.
Troubleshooting
Symptom | Fix |
| Set |
| 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 |
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 |
|
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 .githooksuv 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 integrationSee 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
Available Tools
7 toolsdoctorARead-only
Check that journal-cli is installed and can read the Journal store.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_statsCRead-only
Entry, word, attachment and per-year counts (plain text).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_entriesBRead-only
Entries in a date range with full text, as JSON.
Dates are YYYY-MM-DD in local time, and both ends are inclusive.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| since | Yes | ||
| until | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_journalsCRead-only
All journals with entry counts, as JSON.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_entriesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_entriesBRead-only
Case-insensitive substring search over entry titles and text, as JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_entryBRead-only
One entry with its assets: photos, locations, links, audio transcripts.
| Name | Required | Description | Default |
|---|---|---|---|
| entry_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
7 tool updates
v0.1.0- First observed
doctor - First observed
journal_stats - First observed
list_entries - First observed
list_journals - First observed
recent_entries - First observed
search_entries - First observed
show_entry
TDQS
Scored across 7 tools
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.
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.
Seven tools is well-scoped for a focused journal-reading server. Each tool targets a distinct retrieval or diagnostic task without obvious filler.
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
Related MCP Connectors
Private journal MCP server to search, analyze, and create Dabble Me entries securely via OAuth.
Search, read, and write your Apple Notes from ChatGPT/Claude via a local Mac agent + MCP relay.
Search your Glasp web and Kindle highlights, notes, and AI memories from any MCP client. Read-only.
Read-only MCP access to authorized Vocci sessions, notes, files, and memory search.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceRead-only MCP server for Day One journal on macOS, enabling search and browsing of entries, photos, and metadata.2-
- AlicenseNot gradedqualityBmaintenanceEnables 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
- FlicenseNot gradedqualityBmaintenanceEnables AI clients to read and search macOS Messages history through a read-only MCP interface.-
- AlicenseAqualityCmaintenanceLets MCP clients search iMessages, read Apple Notes including checklist state, and look up Contacts on macOS.12MIT