@verygoodplugins/mcp-evernote
v1.1.0
Published
MCP server for Evernote integration with note management and synchronization
Readme
MCP Evernote Server
A Model Context Protocol (MCP) server that provides seamless integration with Evernote for note management, organization, and knowledge capture. Works with both Claude Code and Claude Desktop.
Version: 1.0.0
Release Date: August 29th, 2025
Installation Requirements
For Claude Desktop Users:
- OAuth Authentication Required: Yes, run the auth command once (prompts for API keys)
- Repository Download: No, you can use npx directly from npm
- API Credentials: The auth script will prompt you for your Evernote API keys
- Simple Setup: Just one command to authenticate and configure
For Claude Code Users:
- OAuth Authentication: Handled automatically via
/mcpcommand - Repository Download: Not required
- Setup: Single command installation
Current Status
✅ Working Features
- 🔐 OAuth Authentication - Interactive setup for Claude Desktop, automatic for Claude Code
- 📝 Note Operations
- Create notes with plain text or markdown content
- Read and retrieve note contents
- Update existing notes
- Delete notes
- Automatic Markdown ↔ ENML conversion (GFM + local attachments)
- 📚 Notebook Management
- List all notebooks
- Create new notebooks
- Organize with stacks
- 🏷️ Tag System
- List all tags
- Create new tags
- Hierarchical tag support
- 🔍 Advanced Search - Full Evernote search syntax support
- 👤 User Info - Get account details and quota usage
- 🤖 Smart Setup - Interactive credential prompts and environment detection
Quick Start
Installation Methods
Option 1: Using NPX (No Installation Required)
The simplest way - no need to install anything globally:
# For Claude Desktop - Run authentication
npx -p @verygoodplugins/mcp-evernote mcp-evernote-auth
# For Claude Code - Just add the server
claude mcp add evernote "npx @verygoodplugins/mcp-evernote"Option 2: Global Installation
Install once, use anywhere:
# Install globally
npm install -g @verygoodplugins/mcp-evernote
# For Claude Desktop - Run authentication
mcp-evernote-auth
# For Claude Code - Add the server
claude mcp add evernote "mcp-evernote"Option 3: Local Development
For contributing or customization:
# Clone and install
git clone https://github.com/verygoodplugins/mcp-evernote.git
cd mcp-evernote
npm install
# Run setup wizard
npm run setupConfiguration
1. Get Evernote API Credentials
- Visit Evernote Developers
- Create a new application
- Copy your Consumer Key and Consumer Secret
2. Authentication Options
Interactive Setup (Recommended)
The auth script will prompt you for credentials if not found:
# Run authentication - prompts for API keys if needed
npx -p @verygoodplugins/mcp-evernote mcp-evernote-authEnvironment Variables (Optional)
For automation, you can set credentials via environment variables:
# Create .env file (optional)
EVERNOTE_CONSUMER_KEY=your-consumer-key
EVERNOTE_CONSUMER_SECRET=your-consumer-secret
EVERNOTE_ENVIRONMENT=production # or 'sandbox'
OAUTH_CALLBACK_PORT=3000 # Default: 30003. Configure Your Client
Quick Setup (Using NPX)
claude mcp add evernote "npx @verygoodplugins/mcp-evernote" \
--env EVERNOTE_CONSUMER_KEY=your-key \
--env EVERNOTE_CONSUMER_SECRET=your-secretOAuth Authentication
- In Claude Code, type
/mcp - Select "Evernote"
- Choose "Authenticate"
- Follow the browser OAuth flow
- Tokens are stored and refreshed automatically by Claude Code
Note: Claude Code handles OAuth automatically - no manual token management needed!
Step 1: Authenticate
Using NPX (no installation required):
npx -p @verygoodplugins/mcp-evernote mcp-evernote-authThe auth script will:
- Prompt for your API credentials (if not in environment)
- Optionally save credentials for future use
- Open your browser for OAuth authentication
- Save the token to
.evernote-token.json - Display the configuration to add to Claude Desktop
Or if installed globally:
mcp-evernote-authStep 2: Add to Configuration
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"evernote": {
"command": "npx",
"args": ["@verygoodplugins/mcp-evernote"],
"env": {
"EVERNOTE_CONSUMER_KEY": "your-consumer-key",
"EVERNOTE_CONSUMER_SECRET": "your-consumer-secret",
"EVERNOTE_ENVIRONMENT": "production"
}
}
}
}Or if installed globally:
{
"mcpServers": {
"evernote": {
"command": "mcp-evernote",
"env": {
"EVERNOTE_CONSUMER_KEY": "your-consumer-key",
"EVERNOTE_CONSUMER_SECRET": "your-consumer-secret"
}
}
}
}Authentication Methods
1. Claude Code (Automatic)
Claude Code handles OAuth automatically via the /mcp command. Tokens are managed by Claude Code.
2. Claude Desktop (Manual)
Run npx -p @verygoodplugins/mcp-evernote mcp-evernote-auth to authenticate via browser. Token saved to .evernote-token.json.
3. Environment Variables (CI/CD)
EVERNOTE_ACCESS_TOKEN=your-token
EVERNOTE_NOTESTORE_URL=your-notestore-url4. Direct Token (Advanced)
{
"env": {
"EVERNOTE_ACCESS_TOKEN": "your-access-token",
"EVERNOTE_NOTESTORE_URL": "your-notestore-url"
}
}Available Tools
Markdown Support
This server automatically converts between Markdown and Evernote's ENML format:
- Create/update: Markdown input is rendered to ENML-safe HTML inside
<en-note>.- GFM task lists
- [ ]map to Evernote checkboxes<en-todo/>. - Checked tasks
- [x]map to<en-todo checked="true"/>.
- GFM task lists
- Local Markdown images/files (
orfile://...) are uploaded as Evernote resources automatically.
- Local Markdown images/files (
- Existing attachments are preserved by referencing
evernote-resource:<hash>in Markdown.
- Existing attachments are preserved by referencing
- Remote
http(s)images remain links (download locally if you want them embedded).
- Remote
- Common Markdown elements (headings, lists, code blocks, tables, emphasis, links) are preserved.
- Retrieve: ENML content is converted back to Markdown (GFM), including task lists and attachments.
- Embedded images become
and other files become[file](evernote-resource:<hash>)so you can round-trip them safely.
- Embedded images become
Limitations:
- Remote URLs are not fetched automatically; save them locally and reference the file to embed.
- Keep the
evernote-resource:<hash>references in Markdown if you want existing attachments to survive edits. - Some exotic HTML not supported by ENML will be sanitized/removed.
Note Operations
evernote_create_note
Create a new note in Evernote.
Parameters:
title(required): Note titlecontent(required): Note content (plain text or markdown)notebookName(optional): Target notebook nametags(optional): Array of tag names
Example:
Create a note titled "Meeting Notes" with content "Discussed Q4 planning" in notebook "Work" with tags ["meetings", "planning"]evernote_search_notes
Search for notes using Evernote's search syntax.
Parameters:
query(required): Search querynotebookName(optional): Limit to specific notebookmaxResults(optional): Maximum results (default: 20, max: 100)
Example:
Search for notes containing "project roadmap" in the "Work" notebookevernote_get_note
Retrieve a specific note by GUID.
Parameters:
guid(required): Note GUIDincludeContent(optional): Include note content (default: true)
Returned Markdown represents embedded resources with
evernote-resource:<hash>URLs. Leave those references intact so attachments stay linked when you edit the note.
evernote_update_note
Update an existing note.
Parameters:
guid(required): Note GUIDtitle(optional): New titlecontent(optional): New contenttags(optional): New tags (replaces existing)
evernote_delete_note
Delete a note.
Parameters:
guid(required): Note GUID
Notebook Operations
evernote_list_notebooks
List all notebooks in your account.
evernote_create_notebook
Create a new notebook.
Parameters:
name(required): Notebook namestack(optional): Stack name for organization
Tag Operations
evernote_list_tags
List all tags in your account.
evernote_create_tag
Create a new tag.
Parameters:
name(required): Tag nameparentTagName(optional): Parent tag for hierarchy
Account Operations
evernote_get_user_info
Get current user information and quota usage.
evernote_revoke_auth
Revoke stored authentication token.
Search Syntax
Evernote supports advanced search operators:
intitle:keyword- Search in titlesnotebook:name- Search in specific notebooktag:tagname- Search by tagcreated:20240101- Search by creation dateupdated:day-1- Recently updated notesresource:image/*- Notes with imagestodo:true- Notes with checkboxes-tag:archive- Exclude archived notes
Integration with Claude Automation Hub
This MCP server works seamlessly with the Claude Automation Hub for workflow automation:
// Example workflow tool
export default {
name: 'capture-idea',
description: 'Capture an idea to Evernote',
handler: async ({ idea, category }) => {
// The MCP server handles the Evernote integration
return {
tool: 'evernote_create_note',
args: {
title: `Idea: ${new Date().toISOString().split('T')[0]}`,
content: idea,
notebookName: 'Ideas',
tags: [category, 'automated']
}
};
}
};Memory Service Integration
To enable synchronization with MCP memory service:
- Set the memory service URL in your environment:
MCP_MEMORY_SERVICE_URL=http://localhost:8765- Use the sync tools to persist important notes to memory:
Sync my "Important Concepts" notebook to memory for long-term retentionTroubleshooting
Authentication Issues
"Authentication required" error in Claude Desktop
This means you haven't authenticated yet. Run the authentication script:
npx -p @verygoodplugins/mcp-evernote mcp-evernote-authOr if installed globally:
mcp-evernote-authOAuth callback fails
If the OAuth callback doesn't work:
- Make sure port 3000 is available (or set
OAUTH_CALLBACK_PORTin.env) - Check your firewall settings
- Try using a different browser
Token expired
If your token expires:
- Delete
.evernote-token.json - Run
npx -p @verygoodplugins/mcp-evernote mcp-evernote-authagain - Restart Claude Desktop
Connection Errors
- Verify your API credentials are correct
- Check if you're using the right environment (sandbox vs production)
- Ensure your firewall allows the OAuth callback port
Rate Limiting
Evernote API has rate limits. If you encounter limits:
- Reduce the frequency of requests
- Use batch operations where possible
- Implement caching for frequently accessed data
Development
Building from Source
npm install
npm run buildRunning in Development Mode
npm run devTesting
npm testLinting
npm run lint
npm run formatSecurity
- OAuth tokens are stored locally in
.evernote-token.json - Never commit token files to version control
- Use environment variables for sensitive configuration
- Tokens expire after one year by default
Contributing
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
License
GPL-3.0 - See LICENSE file for details.
Support
- Issues: GitHub Issues
Acknowledgments
- Built with Model Context Protocol SDK
- Powered by Evernote API
- Part of the Very Good Plugins ecosystem
Roadmap
Near Term
- [ ] Tag Management - Add/remove tags from existing notes
- [x] ENML ↔ Markdown Converter - Bidirectional conversion between Evernote's ENML format and Markdown
- [ ] Real-time Sync Hooks - Detect changes made via Evernote desktop/mobile apps
- [ ] Database Monitoring - Watch Evernote DB service for live updates
Future Enhancements
- [ ] Web clipper functionality
- [ ] Rich text editing support
- [ ] File attachment handling
- [ ] Shared notebook support
- [ ] Business account features
- [ ] Template system
- [ ] Bulk operations
- [ ] Export/Import tools
- [ ] Advanced filtering options
- [ ] Reminder management
