Evernote Local
FreeNot checkedRead your Evernote v10+ notes from Claude (Desktop or Code) without an API key — local MCP server + CLI for macOS. Includes image OCR, PDF text extraction, and
About
Read your Evernote v10+ notes from Claude (Desktop or Code) without an API key — local MCP server + CLI for macOS. Includes image OCR, PDF text extraction, and inline image viewing.
README
Read your Evernote notes from Claude (Desktop or Code) without an API key — built for the period when Evernote API key issuance is suspended, and useful any time you'd rather not depend on the cloud API.
This is a local-only, read-only bridge that talks directly to the Evernote desktop app's on-disk data store on macOS. It exposes notes, notebooks, attachments, OCR'd text from images, extracted PDF text, and links — both as a CLI you can pipe into anything, and as an MCP server that plugs straight into Claude Desktop or Claude Code.
Why this exists
Evernote's official Developer API is currently not accepting new key requests:
"Evernote API Key requests are temporarily suspended while we complete some maintenance on the platform. Our team is actively working on this, but we don't have a specific timeline for when the service will be reinstated." — Evernote Support, May 2026
Existing community projects (e.g. verygoodplugins/mcp-evernote) all need that key. AppleScript was the obvious workaround, but Evernote v10/11 stripped almost the entire AppleScript surface — only version reliably works.
So this project takes a different path: it reads the local Conduit graph SQLite database that the Evernote desktop app keeps on disk, plus the Yjs CRDT blobs that hold note bodies, plus the resource cache that holds attachments. No API, no scraping, no AppleScript, no auth. When the official API reopens, the same tool surface (list_notebooks / list_notes / get_note / weekly_review) maps cleanly onto it.
What it can do
- List notebooks and notes — filter by notebook, date window, etc.
- Fetch a note's body — best-effort plain-text extraction from the Yjs CRDT blob.
- Surface attachments — filename, mime type, size, local path, downloaded flag.
- OCR'd image text — Evernote pre-computes OCR on screenshots/photos and stores it in
AttachmentSearchText. We pull it directly. No cloud OCR call needed. - PDF text extraction — first 20K characters of any PDF attachment, via pypdf.
- Inline small text files —
text/plain,markdown,csv,json, etc. under 200 KB are inlined as text. - View images — the
view_imageMCP tool returns image bytes inline so Claude can actually see screenshots and diagrams. - URL extraction — every
https?://URL across the note body, snippet, OCR text, and PDF text gets surfaced as a cleanurls[]array, which Claude can then choose to fetch with its web tools. - Weekly review bundle — a single
weekly_reviewcall dumps everything updated in the last N days as one JSON payload, designed to drop into a Claude conversation alongside calendar / task-manager data.
Requirements
- macOS (the path layout is macOS-specific; the underlying SQLite + Yjs format is the same on other platforms but the lookup paths would need to be adapted)
- The Evernote desktop app installed and signed in (tested against v11.13.2)
- Python 3.10 or later
Install
git clone https://github.com/nord342/evernote-local-mcp.git
cd evernote-local-mcp
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
That's it — no config, no token, no environment variables. The CLI auto-detects which Evernote account is active by picking the most recently modified RemoteGraph.sql under ~/Library/Containers/com.evernote.Evernote/....
CLI usage
# every notebook in your active account
.venv/bin/python evernote_local.py list-notebooks
# 50 most recently updated notes
.venv/bin/python evernote_local.py list-notes --limit 50
# notes touched in the last 7 days, in a specific notebook
.venv/bin/python evernote_local.py list-notes --since-days 7 --notebook "Daily Notes"
# full content + attachments + URLs for one note
.venv/bin/python evernote_local.py get-note <note-id>
# attachment metadata + on-disk path
.venv/bin/python evernote_local.py get-attachment <attachment-id>
# weekly review bundle (default 7 days)
.venv/bin/python evernote_local.py weekly-review --days 7
All commands print JSON to stdout. Pipe into jq, redirect to a file, feed to anything.
Wire into Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json and add an entry under mcpServers:
{
"mcpServers": {
"evernote-local": {
"command": "/absolute/path/to/evernote-local-mcp/.venv/bin/python",
"args": ["/absolute/path/to/evernote-local-mcp/mcp_server.py"]
}
}
}
Quit and relaunch Claude Desktop. You'll see six new tools available.
Wire into Claude Code
claude mcp add evernote-local \
/absolute/path/to/evernote-local-mcp/.venv/bin/python \
/absolute/path/to/evernote-local-mcp/mcp_server.py
MCP tools
| Tool | What it does |
|---|---|
list_notebooks |
Every notebook in the active account. |
list_notes(since_days?, notebook?, limit?) |
Notes by recency, optionally filtered. Metadata + snippet only. |
get_note(note_id) |
One note: body text, attachments (with OCR/PDF text), URLs. |
get_attachment(attachment_id) |
Attachment metadata + local file path. |
view_image(attachment_id) |
Returns image bytes inline so Claude can analyze screenshots/diagrams visually. |
weekly_review(days=7) |
Bundle of every note updated in the last N days, full content + attachments + URLs. |
Example: a real weekly review
Once wired up, you can just ask:
"Do my weekly review — pull this week's Evernote notes, my Google Calendar, and my Asana tasks and tell me what to focus on next week."
Claude calls weekly_review, gets a JSON payload of everything you've written in the last 7 days, cross-references it with whatever calendar/task MCP servers you have configured, and gives you a synthesis. For attachments, it sees the OCR/PDF text by default and can call view_image on screenshots that look interesting.
How it works
~/Library/Containers/com.evernote.Evernote/Data/Library/Application Support/Evernote/
├── conduit-storage/... # SQLite "graph" DB (notes, notebooks, attachments table)
│ └── UDB-User<id>+RemoteGraph.sql
├── conduit-fs/... # Yjs CRDT note bodies
│ └── <profile>/rte/Note/internal_rteDoc/<3>/<3>/<note-id>.dat
└── resource-cache/User<id>/<note-id>/<data-hash> # actual attachment bytes
- The SQLite DB is copied to
/tmpbefore reading, so it won't fight the live Evernote app for the lock. - The Yjs binary isn't decoded — text is pulled with a printable-ASCII regex and then de-noised against a token list. Imperfect (some
customNoteStyle/ heading-style names leak through) but readable enough for summarization. - Image OCR text comes free from Evernote's own
AttachmentSearchTexttable. - Attachment file paths are resolved by joining the user id (parsed from the DB filename) with the note id and the
dataHashcolumn. - The
Attachmenttable schema differs across Evernote versions — code handles bothAttachment(newer,filename/dataHash) andNodes_Attachment(older,label/data_hash) transparently.
Limitations / known issues
- macOS only. Linux/Windows have similar storage layouts but the paths and sandbox locations differ — pull requests welcome.
- Read-only. No create/edit/delete. By design — that's the kind of thing the official API is right for once it reopens.
- Local-only. If a note exists in your account but you've never opened it on this Mac, only its metadata + snippet are guaranteed to be present. Mark notebooks "available offline" in Evernote to force-sync the bodies and attachments.
- Yjs text extraction is heuristic. Don't expect pristine prose. Expect some style/heading tokens. Good enough for an LLM summarizer, not good enough to display verbatim to a human.
- PDF text only — no PDF images. Mostly-image PDFs (scans without OCR) won't yield useful text.
- No encrypted-note support. Same as the API.
Roadmap
If the official Evernote API reopens, the cleanest evolution is:
- Add an
EVERNOTE_API_TOKENenv var. - Implement the same six tools against the Evernote SDK.
- Auto-prefer API when a token is set, fall back to local DB otherwise.
The tool surface is intentionally small and stable so this swap doesn't break any consumers.
License
MIT — see LICENSE.
Installing Evernote Local
This server has no published package — it is built from source. Open the repository and follow its README.
▸ github.com/nord342/evernote-local-mcpFAQ
Is Evernote Local MCP free?
Yes, Evernote Local MCP is free — one-click install via Unyly at no cost.
Does Evernote Local need an API key?
No, Evernote Local runs without API keys or environment variables.
Is Evernote Local hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install Evernote Local in Claude Desktop, Claude Code or Cursor?
Open Evernote Local on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
GitHub
PRs, issues, code search, CI status
by GitHubFilesystem
Secure file operations with configurable access controls.
Memory
Knowledge graph-based persistent memory system.
Template MCP Server
A CLI tool to create a new Model Context Protocol server project with TypeScript support, dual transport options, and an extensible structure
by mcpdotdirectAmap Maps Mcp Server
MCP server for using the AMap Maps API
by duxiaohuiSupabase
Database, auth and storage
by SupabaseEverything
Reference / test server with prompts, resources, and tools.
Git
Tools to read, search, and manipulate Git repositories.
Sequential Thinking
Dynamic and reflective problem-solving through thought sequences.
Time
Time and timezone conversion capabilities.
Compare Evernote Local with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All development MCPs
