evernote-mcp-server
Provides tools for managing notes, notebooks, tags, search, AI features, and account operations for Evernote.
Click on "Install 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., "@evernote-mcp-serversearch my notes about project ideas"
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.
evernote-unofficial-api
Unofficial Evernote API client & MCP server, reverse-engineered from the Evernote Web App (Ion v11.10.1). Full CRUD, semantic search, AI features, and 22 MCP tools for Claude Desktop / Claude Code.
MCP Server — Quick Start
# 1. Install
npm install
# 2. Authenticate (opens browser — only needed once)
npx tsx src/mcp-auth.ts
# 3. Start the MCP server
npx tsx src/mcp-server.tsClaude Desktop Integration
Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"evernote": {
"command": "npx",
"args": ["tsx", "src/mcp-server.ts"],
"cwd": "/path/to/evernote-api"
}
}
}Claude Code Integration
claude mcp add evernote -- npx tsx src/mcp-server.ts22 MCP Tools Available
Category | Tools |
Notes |
|
Notebooks |
|
Tags |
|
Search |
|
AI |
|
Account |
|
Shortcuts |
|
Utils |
|
Related MCP server: MCP Notepad Server
TypeScript API — Quick Start
# Install dependencies
npm install
# Run the example (opens browser for OAuth2 login)
npx tsx src/example.tsOn first run, your browser will open for login via Evernote's official OAuth2 PKCE flow. After authenticating, tokens are cached at ~/.evernote-api/tokens.json and reused automatically.
Usage
import { authenticate, EvernoteClient, textToENML, markdownToENML } from "./src/index.js";
// Authenticate (opens browser on first run, uses cached tokens after)
const tokens = await authenticate();
const client = new EvernoteClient(tokens);
// Get user info
const user = await client.getUser();
// Create a note from plain text
await client.createNote({
title: "My Note",
content: textToENML("Hello from the API!"),
});
// Create a note from Markdown
await client.createNote({
title: "Meeting Notes",
content: markdownToENML("# Heading\n\n- Item 1\n- Item 2"),
});
// Semantic (AI) search
const results = await client.searchSemantic({
query: "meeting notes from last week",
maxResults: 10,
});
// AI Summarize
const summary = await client.aiSummarize({
content: "Long text...",
style: "bullet", // bullet | email | meeting | paragraph | twitter
});
// AI Rephrase
const rephrased = await client.aiRephrase({
content: "Make this sound better",
style: "formal", // concise | formal | friendly | funny | engaging | empathetic
});
// Export notes
await client.exportNotes(["noteId1", "noteId2"]);
// Raw request to any endpoint
await client.raw("GET", "/v1/some/endpoint", undefined, { param: "value" });Available Methods
Notes
createNote(params)— Create a new noteupdateNote(params)— Update an existing notedeleteNote(noteId)— Delete (trash) a noteexportNotes(noteIds)— Export notesrequestNoteAccess(noteId)— Request access to a shared notescheduleReminder(noteId, time)— Schedule a reminder
Notebooks
createNotebook(params)— Create a notebookdeleteNotebook(notebookId)— Delete a notebook
Tags
createTag(params)— Create a tagupdateTag(tagId, params)— Update a tag
Search
searchSemantic(params)— AI-powered semantic searchsemanticAnswer(query)— Get AI answer from your notesrelatedNotesOrAnswer(query)— Related notes or AI answer
AI Features
aiSummarize(params)— Summarize textaiRephrase(params)— Rephrase textaiSuggestTags(noteGuid)— Get tag suggestions for a noteaiSuggestTitle(noteGuid)— Get title suggestion for a noteaiCopilot(prompt)— AI copilot interactionaiDetectText(content)— Detect AI-generated text
User & Account
getUser()— Get current user profilegetUsage()— Get usage statisticsgetDevices()— List connected devicesgetBilling()— Get billing infogetPayments()— Get payment history
Shortcuts
createShortcut(shortcut)— Create a shortcutupdateShortcut(id, update)— Update a shortcutdeleteShortcut(id)— Delete a shortcut
Utilities
richLink(url)— Generate rich link previewocrBusinessCard(imageData)— OCR a business cardgetThumbnailUrl(noteId)— Get note thumbnail URLgetUserPhotoUrl(size)— Get user photo URL
ENML Helpers
import { textToENML, markdownToENML, wrapInENML, checklistToENML, enmlToText } from "./src/index.js";
// Plain text → ENML
textToENML("Hello\n\nWorld");
// Markdown → ENML
markdownToENML("# Title\n\n**Bold** and *italic*");
// Raw HTML → ENML
wrapInENML("<p>Custom <b>HTML</b></p>");
// Checklist → ENML
checklistToENML([
{ text: "Buy groceries", done: true },
{ text: "Clean house", done: false },
]);
// ENML → plain text
enmlToText("<en-note><p>Hello</p></en-note>");Architecture
Your Code → EvernoteClient → api.evernote.com (REST /v1/*)
→ api.evernote.com/command (NSync mutations)
→ www.evernote.com/shard/{s}/notestore (Thrift, advanced)Auth tokens are obtained via OAuth2 PKCE against accounts.evernote.com — the same flow the official web client uses.
Production / Dokploy (Docker)
Important: This MCP server uses stdio transport. To use it remotely, your agents must run on the same host/container or you must add a proxy layer (e.g., mcp‑proxy / stdio bridge). If your agents already run in the VPS, you can deploy this container and point them to the command inside it.
1) Build the image
docker build -t evernote-mcp-server:latest .2) Prepare tokens (one‑time)
You need a valid token file. Run auth once on a machine with a browser:
# Option A: locally (recommended)
EVERNOTE_TOKEN_PATH=./tokens.json npx tsx src/mcp-auth.ts
# Then upload tokens.json to the serverOr run inside a container and mount /data:
docker run --rm -it -v $PWD/data:/data -e EVERNOTE_TOKEN_PATH=/data/tokens.json evernote-mcp-server:latest node dist/mcp-auth.js3) Run in production
docker run -d \
--name evernote-mcp-server \
-e EVERNOTE_TOKEN_PATH=/data/tokens.json \
-v /opt/evernote-mcp:/data \
evernote-mcp-server:latestDokploy settings (suggested)
Image:
evernote-mcp-server:latestEnv:
EVERNOTE_TOKEN_PATH=/data/tokens.jsonVolume:
/opt/evernote-mcp:/dataPort: none (stdio server)
MCP Proxy (stdio → HTTP/SSE)
If you need remote access (HTTP/SSE), use the proxy. This exposes the stdio MCP server over HTTP.
Local run
# Build first
npm run build
# Run proxy (both SSE + streamable HTTP)
npm run proxy
# Or explicitly choose SSE / stream
npm run proxy:sse
npm run proxy:streamDocker (proxy)
Build with the proxy Dockerfile:
docker build -f Dockerfile.proxy -t evernote-mcp-proxy:latest .Run:
docker run -d \
--name evernote-mcp-proxy \
-e EVERNOTE_TOKEN_PATH=/data/tokens.json \
-e MCP_PROXY_PORT=8080 \
-e MCP_PROXY_API_KEY=YOUR_SECRET \
-v /opt/evernote-mcp:/data \
-p 8080:8080 \
evernote-mcp-proxy:latestDokploy (proxy) settings
Dockerfile:
Dockerfile.proxyEnv:
EVERNOTE_TOKEN_PATH=/data/tokens.jsonMCP_PROXY_PORT=8080MCP_PROXY_API_KEY=...(recommended)
Volume:
/opt/evernote-mcp:/dataPort:
8080
Disclaimer
This is an unofficial client based on reverse engineering the Evernote web application. It is not affiliated with, endorsed by, or supported by Evernote Corporation. Use at your own risk. The internal API may change without notice.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/imsebarz/evernote-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server