关于 MCP Evernote
MCP Evernote 是用于管理 Evernote 笔记、笔记本和标签的 MCP 服务,支持 OAuth 认证与 Markdown 到 ENML 的转换。面向在 Claude Code 或 Claude Desktop 中使用 Evernote 的用户。Evernote 已停止发放新的开发者 API 密钥,因此 README 提供了基于浏览器 Cookie 的认证方式。
主要功能
- 01创建、读取、更新和删除笔记
- 02Markdown 与 ENML 自动互转
- 03管理笔记本、堆栈与层级标签
- 04支持 Evernote 搜索语法
- 05轮询变更并发送 Webhook 通知
- 06提取附件文本
适用场景
- 01将 Claude 生成的内容保存为 Evernote 笔记
- 02按关键词或标签检索已有笔记
- 03整理笔记本与标签结构
MCP 相关
该项目是 MCP 服务,向 MCP 客户端提供 15 个工具,用于读写 Evernote 笔记、笔记本、标签和附件,并支持 get_resource 等参数化调用。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
MCP Evernote 服务器
一个 Model Context Protocol(MCP)服务,可与 Evernote 无缝集成,用于笔记管理、整理和知识捕获。兼容 Claude Code 和 Claude Desktop。
⚠️ 没有 API 密钥?使用浏览器 Cookie 身份验证
Evernote 已停止发放新的开发者 API 密钥。 如果你是新用户,无法获取 Consumer Key/Secret,请跳过标准 OAuth 设置,改用基于 Cookie 的身份验证方法,无需 API 密钥。
安装要求
Node.js
支持的 Node.js 版本:>=20.16.0 <21 或 >=22.3.0。 实际上,这意味着
Node 20.16+、22.3+、24 或更高版本;两个不支持的版本区间是 Node 21.x 和 Node
22.0–22.2。这并非随意设定的最低版本要求:它与 PDF 附件提取路径(pdf-parse 及其
传递依赖 pdfjs-dist)实际声明的 engines 范围一致,而且该范围确实是不连续的。
使用 node --version 检查版本。如果你使用的是 Node 18 或 21,或者 22.0–22.2,请在
安装前升级——Node 21 已于 2024 年 6 月结束生命周期,而 22.3+ 已取代早期的 22 补丁版本。
从 1.x 升级? 2.0.0 将 Node 最低版本要求从 18.18.0 提高,并更改了
evernote_get_resource的默认行为:现在返回提取后的文本,而不是二进制 数据。此外,工具从 27 个整合为 15 个——已弃用的旧名称仍可用作别名,因此现有调用仍可运行。请参阅 MIGRATION.md。
Claude Desktop 用户:
- 需要 OAuth 身份验证:是,运行一次身份验证命令(系统会提示输入 API 密钥)
- 下载代码库:不需要,可直接通过 npm 使用 npx
- API 凭据:身份验证脚本会提示你输入 Evernote API 密钥
- 简单设置:只需一条命令即可完成身份验证和配置
Claude Code 用户:
- OAuth 身份验证:通过
/mcp命令自动处理 - 下载代码库:不需要
- 设置:通过一条命令安装
当前状态
✅ 可用功能
- 🔐 OAuth 身份验证 - 为 Claude Desktop 提供交互式设置,为 Claude Code 自动处理
- 📝 笔记操作
- 使用纯文本或 Markdown 内容创建笔记
- 读取和获取笔记内容
- 更新现有笔记
- 删除笔记
- 自动进行 Markdown ↔ ENML 转换(GFM + 本地附件)
- 📚 笔记本管理
- 列出所有笔记本
- 创建新笔记本
- 使用笔记本组进行整理
- 🏷️ 标签系统
- 列出所有标签
- 创建新标签
- 支持层级标签
- 🔍 高级搜索 - 支持完整的 Evernote 搜索语法
- 👤 用户信息 - 获取账户详情和配额使用情况
- 🤖 智能设置 - 交互式凭据提示和环境检测
快速开始
安装方式
选项 1:使用 NPX(无需安装)
最简单的方式——无需全局安装任何内容:
# For Claude Desktop - Run authentication
npx -y -p @verygoodplugins/mcp-evernote mcp-evernote-auth
# For Claude Code - Just add the server
claude mcp add evernote "npx -y -p @verygoodplugins/mcp-evernote mcp-evernote"
变更通知
轮询变更
服务可以轮询 Evernote 以检查变更,并在创建、更新或删除笔记时发送 Webhook 通知。
配置
# Enable auto-start polling (default: false)
EVERNOTE_POLLING_ENABLED=true
# Poll interval in milliseconds (default: 3600000 = 1 hour, min: 900000 = 15 min)
EVERNOTE_POLL_INTERVAL=3600000
# Webhook URL to receive change notifications
EVERNOTE_WEBHOOK_URL=https://your-endpoint.com/webhooks/evernote
Webhook 负载
检测到变更时,会向你的 Webhook URL 发送 POST 请求:
{
"source": "mcp-evernote",
"timestamp": "2025-12-15T10:30:00.000Z",
"changes": [
{
"type": "note_created",
"guid": "abc123...",
"title": "My New Note",
"notebookGuid": "def456...",
"timestamp": "2025-12-15T10:29:55.000Z"
}
]
}
手动控制
使用 evernote_polling 工具控制轮询:
polling({action:"start"})- 手动开始轮询polling({action:"stop"})- 停止轮询polling({action:"poll"})- 立即检查变更polling({action:"status"})- 获取轮询配置和状态
Evernote Webhooks(实时)
如需实时通知,Evernote 支持 Webhooks,但需要手动注册:
-
发送邮件至
[email protected],并提供:- 您的 Consumer Key
- Webhook URL 端点
- 任意过滤条件(可选)
-
他们会配置您的 Webhook,使其在笔记创建或更新时接收 HTTP GET 请求。
选项 2:全局安装
安装一次,随处使用:
# 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"
选项 3:本地开发
用于贡献或自定义:
# Clone and install
git clone https://github.com/verygoodplugins/mcp-evernote.git
cd mcp-evernote
npm install
# Run setup wizard
npm run setup
配置
1. 获取 Evernote API 凭据
注意: Evernote 已停止向新的申请者发放开发者 API 密钥。如果您是新用户,请跳过本节,改用基于 Cookie 的身份验证方法。
- 访问 Evernote Developers
- 创建一个新应用
- 复制您的 Consumer Key 和 Consumer Secret
2. 身份验证选项
交互式设置(推荐)
如果未找到凭据,身份验证脚本会提示您输入:
# Run authentication - prompts for API keys if needed
npx -p @verygoodplugins/mcp-evernote mcp-evernote-auth
环境变量(可选)
如需自动化,您可以通过环境变量设置凭据:
# 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: 3000
# Polling configuration (optional)
EVERNOTE_POLLING_ENABLED=true # Auto-start polling
EVERNOTE_POLL_INTERVAL=3600000 # 1 hour (min: 900000 = 15 min)
EVERNOTE_WEBHOOK_URL=https://your-endpoint.com/webhooks/evernote # Webhook for change notifications
# Rate-limit transport (optional)
EVERNOTE_MAX_CONCURRENCY=3 # Max simultaneous NoteStore RPCs (default: 3)
EVERNOTE_RATE_LIMIT_AUTO_RETRY_SECONDS=15 # Auto-retry a rate-limited call once if the wait is <= this many seconds; 0 = off
EVERNOTE_MAX_RESPONSE_CHARS=60000 # Total note-body chars per multi-note response; bodies past this are dropped with truncated:true
# Note body cache (optional)
EVERNOTE_NOTE_CACHE_SIZE=200 # Max notes held in the USN-keyed body cache; 0 disables
EVERNOTE_NOTE_CACHE_SYNC_TTL_MS=30000 # How long a getSyncState result is trusted before re-checking for external edits
达到每小时速率限制时,工具错误会返回包含 error: "rate_limited"
和 retryAfterSeconds(Evernote 给出的精确退避时间窗口)的 JSON。限制并发
可以平缓突发请求,但无法恢复配额——配额按每个令牌的每小时调用
次数计算,因此持久有效的解决办法是减少调用次数并遵守退避时间。
重新读取相同笔记时,会从按 USN 索引的内存正文缓存中提供,而不是再次消耗
getNote 调用次数——这是解决重复读取笔记库触发每小时限制的直接办法。通过此服务编辑的
笔记会立即从缓存中移除;在其他位置所做的编辑会在
EVERNOTE_NOTE_CACHE_SYNC_TTL_MS 时间内通过同步状态探测发现。提取的 OCR /
附件文本始终实时重新读取,不会缓存。
3. 配置您的客户端
Claude Code 配置
快速设置(使用 NPX)
claude mcp add evernote "npx -y -p @verygoodplugins/mcp-evernote -c mcp-evernote" \
--env EVERNOTE_CONSUMER_KEY=your-key \
--env EVERNOTE_CONSUMER_SECRET=your-secret
OAuth 身份验证
- 在 Claude Code 中输入
/mcp - 选择 “Evernote”
- 选择 “Authenticate”
- 按照浏览器 OAuth 流程操作
- Claude Code 会自动存储并刷新令牌
注意: Claude Code 会自动处理 OAuth,无需手动管理令牌!
Claude Desktop 配置
第 1 步:身份验证
使用 NPX(无需安装):
npx -y -p @verygoodplugins/mcp-evernote mcp-evernote-auth
身份验证脚本会:
- 提示您输入 API 凭据(如果环境变量中没有)
- 打开浏览器进行 OAuth 身份验证
- 将兼容的令牌文件保存到
.evernote-token.json - 显示访问令牌,以便您改用
EVERNOTE_ACCESS_TOKEN
或者,如果已全局安装:
mcp-evernote-auth
第 2 步:添加到配置
macOS:~/Library/Application Support/Claude/claude_desktop_config.json
Windows:%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"evernote": {
"command": "npx",
"args": ["-y", "-p", "@verygoodplugins/mcp-evernote", "-c", "mcp-evernote"],
"env": {
"EVERNOTE_CONSUMER_KEY": "your-consumer-key",
"EVERNOTE_CONSUMER_SECRET": "your-consumer-secret",
"EVERNOTE_ACCESS_TOKEN": "your-access-token",
"EVERNOTE_ENVIRONMENT": "production"
}
}
}
}
或者,如果已全局安装:
{
"mcpServers": {
"evernote": {
"command": "mcp-evernote",
"env": {
"EVERNOTE_CONSUMER_KEY": "your-consumer-key",
"EVERNOTE_CONSUMER_SECRET": "your-consumer-secret"
}
}
}
}
基于 Cookie 的身份验证(无需 API 密钥)
由于 Evernote 已停止向新的申请者发放开发者 API 密钥,新用户可以使用 Evernote 网页界面中的 clipper-sso 浏览器 Cookie 进行身份验证。此 Cookie 的格式与开发者签发的访问令牌相同,可直接用作 EVERNOTE_ACCESS_TOKEN——无需 Consumer Key 或 Consumer Secret。
安全警告: 请像对待密码一样保护此值。任何拥有它的人都可以访问您的 Evernote 账户。切勿将其提交到 git、粘贴到聊天记录中或公开分享。
鸣谢: 由社区成员 @tdrayson 发现。(Issue #49)
步骤 1:提取 Cookie
- 在浏览器中登录 www.evernote.com
- 打开开发者工具:F12(Windows/Linux)或 Cmd+Option+I(Mac)
- 前往 Application 标签页 → Cookies →
www.evernote.com - 找到名为
clipper-sso的 Cookie - 复制其 Value,格式如下:
S=s101:U=XXX:XXXXX:C=XXXX:P=XXX:A=en-chrome-clipper-xauth-new:V=2:H=XXXXX
步骤 2:配置客户端
Claude Code:
claude mcp add evernote "npx -y -p @verygoodplugins/mcp-evernote -c mcp-evernote" \
--env EVERNOTE_ACCESS_TOKEN="S=s101:U=XXX:..."
Claude Desktop(macOS 上的 ~/Library/Application Support/Claude/claude_desktop_config.json,Windows 上的 %APPDATA%\Claude\claude_desktop_config.json):
{
"mcpServers": {
"evernote": {
"command": "npx",
"args": ["-y", "-p", "@verygoodplugins/mcp-evernote", "-c", "mcp-evernote"],
"env": {
"EVERNOTE_ACCESS_TOKEN": "S=s101:U=XXX:..."
}
}
}
}
注意: 使用 Cookie 令牌时,无需设置
EVERNOTE_NOTESTORE_URL——服务会在启动时自动获取。
注意事项
- 令牌过期:
clipper-sso令牌通常约一年后过期,或者在你通过浏览器主动退出 Evernote 时过期。令牌过期后,请重新登录 www.evernote.com,再次提取 Cookie,并更新EVERNOTE_ACCESS_TOKEN。 - 浏览器会话: Cookie 与浏览器登录会话绑定。退出 Evernote 网页应用会使令牌失效。
- 仅限生产环境: 此方法使用你的实时 Evernote 账户。该方法没有对应的沙盒环境。
身份验证方法
新用户推荐: 基于 Cookie 的身份验证(无需 API 密钥)。
1. Claude Code(自动)
Claude Code 会通过 /mcp 命令自动处理 OAuth。令牌由 Claude Code 管理。
2. Claude Desktop(手动)
运行 npx -y -p @verygoodplugins/mcp-evernote mcp-evernote-auth,通过浏览器进行身份验证。该脚本会保存 .evernote-token.json 以确保兼容性,并输出一个可设置为 EVERNOTE_ACCESS_TOKEN 的令牌。
3. 环境变量(CI/CD)
EVERNOTE_ACCESS_TOKEN=your-token
EVERNOTE_NOTESTORE_URL=your-notestore-url
EVERNOTE_ALLOWED_FILE_ROOTS=/Users/you/Documents:/Users/you/Projects
4. 直接使用令牌(高级)
{
"env": {
"EVERNOTE_ACCESS_TOKEN": "your-access-token",
"EVERNOTE_NOTESTORE_URL": "your-notestore-url"
}
}
可用工具
该服务提供 15 个工具(由 27 个合并而来)。已弃用的工具名称仍可作为别名使用,也可以通过 EVERNOTE_LEGACY_TOOLS=true
重新列出——完整的新旧名称映射请参阅 MIGRATION.md。主要变化:
get_resource({guid, as}) 可按指定格式(text/binary/recognition/metadata)呈现附件;
传入 name/guid 时,list_notebooks/list_tags 会返回单个实体;
update_note 使用 replacements[] 进行补丁式编辑;polling 和 connection 工具则根据 action 分派操作。
Markdown 支持
该服务会自动在 Markdown 与 Evernote 的 ENML 格式之间进行转换:
- 创建/更新:Markdown 输入会被渲染为
<en-note>中符合 ENML 的 HTML。- GFM 任务列表
- [ ]会转换为 Evernote 复选框<en-todo/>。 - 已勾选的任务
- [x]会转换为<en-todo checked="true"/>。
- GFM 任务列表
-
- 本地 Markdown 图片/文件(
或file://...)会自动上传为 Evernote 资源。
- 本地 Markdown 图片/文件(
-
- 通过在 Markdown 中引用
evernote-resource:<hash>,可保留现有附件。
- 通过在 Markdown 中引用
-
- 远程
http(s)图片仍会作为链接保留(如需将其嵌入,请先下载到本地)。
- 远程
-
- 常见 Markdown 元素(标题、列表、代码块、表格、强调、链接)均会保留。
- 获取:ENML 内容会转换回 Markdown(GFM),包括任务列表和附件。
- 嵌入的图片会转换为
,其他文件会转换为[file](evernote-resource:<hash>),以便安全地往返转换。
- 嵌入的图片会转换为
限制:
- 不会自动获取远程 URL;请先将文件保存到本地,再引用该文件以将其嵌入。
- 如果希望在编辑后保留现有附件,请在 Markdown 中保留
evernote-resource:<hash>引用。 - ENML 不支持的一些特殊 HTML 会被清理或移除。
笔记操作
evernote_create_note
在 Evernote 中创建新笔记。
参数:
title(必填):笔记标题content(必填):笔记内容(纯文本或 Markdown)notebookName(可选):目标笔记本名称tags(可选):标签名称数组
示例:
Create a note titled "Meeting Notes" with content "Discussed Q4 planning" in notebook "Work" with tags ["meetings", "planning"]
evernote_search_notes
使用 Evernote 的搜索语法搜索笔记。返回笔记元数据以及 totalNotes;使用 offset/nextOffset 翻页。
参数:
query(必填):搜索查询(使用"*"匹配所有笔记)notebookName(可选):仅搜索指定笔记本maxResults(可选):每页结果数(默认值:20,最大值:100;当includeContent为 true 时上限为 25)offset(可选):结果分页偏移量(默认值:0)includeContent(可选):在content中包含每条笔记的完整正文,每条笔记调用一次 API(默认值:false)format(可选):当includeContent为 true 时的正文呈现格式——markdown(默认值)、text或enmlincludePreview(可选):为每条笔记包含约 300 个字符的纯文本预览(当includeContent为 true 时忽略)
将整个笔记本导出为文本(无需专用工具):设置 query: "*"、notebookName 和 includeContent,并使用 offset 翻页,直到 hasMore 为 false。
示例:
Search for notes containing "project roadmap" in the "Work" notebook
evernote_get_note
检索一条笔记(完整详情)或最多 25 条笔记(以正文为主)。
**参数:**必须且只能提供 guid 或 guids 之一。
guid:单条笔记的 GUID——完整详情,包括 PDF/图片 OCR 附件文本guids:最多包含 25 个 GUID 的数组——仅返回元数据和content(不含附件文本;需要附件文本时请使用单个guid)。返回{ notes, failed?, aborted? };若批处理中途触发速率限制,则停止并返回部分结果以及可供恢复的剩余 GUID。format(可选):正文呈现格式——markdown(默认值)、text或enmlincludeContent(可选):包含笔记内容(默认值:true)includeAttachmentText(可选,仅适用于单条笔记):提取 PDF/OCR 附件文本(默认值:true)
返回的 Markdown 使用
evernote-resource:<hash>URL 表示嵌入资源。编辑笔记时请保留这些引用,以便附件仍保持链接。
evernote_update_note
更新现有笔记。支持两种互斥模式:
完整更新模式参数:
guid(必填):笔记 GUIDtitle(可选):新标题content(可选):新内容(支持 Markdown)notebookName(可选):将笔记移至此笔记本tags(可选):新标签(替换现有标签)
补丁模式参数(替代旧版 evernote_patch_note):
replacements(可选):{find, replace, replaceAll?}数组,用于查找并替换 笔记正文中的内容,同时保留标题、标签、笔记本和附件。不能与上述完整更新字段同时使用。
evernote_delete_note
删除笔记。
参数:
guid(必填):笔记 GUID
笔记本操作
evernote_list_notebooks
列出账户中的所有笔记本;也可以传入某个笔记本的 name 或 guid,获取其完整详情(整合旧版 evernote_get_notebook)。
evernote_create_notebook
创建新笔记本。
参数:
name(必填):笔记本名称stack(可选):用于整理的堆栈名称
evernote_update_notebook
重命名笔记本或将其移至其他堆栈。
参数:
guid(必填):笔记本 GUIDname(可选):新笔记本名称stack(可选):堆栈名称——传入空字符串可将其从所属堆栈中移除
标签操作
evernote_list_tags
列出账户中的所有标签;也可以传入某个标签的 name 或 guid,获取其完整详情(整合旧版 evernote_get_tag)。
evernote_create_tag
创建新标签。
参数:
name(必填):标签名称parentTagName(可选):用于构建层级结构的父标签
evernote_update_tag
重命名标签或更改其父级。
参数:
guid(必填):标签 GUIDname(可选):新标签名称parentTagName(可选):父标签名称 — 传入空字符串可移除父级
附件与资源
evernote_get_resource
读取一个附件,并通过四种视图之一呈现。
⚠️ 2.0.0 中的重大变更。 此工具过去默认返回 base64 二进制数据。 现在默认返回提取的文本。传入
as: "binary"可获取旧版行为。
参数:
guid(必填):资源 GUID(来自笔记的resources[],通过evernote_get_note获取)as(可选,默认值为"text"):附件的呈现方式"text"— 提取的文本。PDF 会先提取文本层内容;对于扫描文档,则回退到 Evernote 的 OCR 数据;图像使用 OCR。"binary"— base64 编码的文件内容。"recognition"— 原始 Evernote OCR 识别数据。"metadata"— 文件名、MIME 类型、大小、哈希值和hasRecognition。
includeData(可选,已弃用):true会映射为as:"binary",false会映射为as:"metadata"。
没有单独的工具可用于列出笔记的附件 — evernote_get_note
会在 resources[] 中返回这些附件。
示例:
Get the text of the PDF attached to that invoice note
evernote_add_resource_to_note
将本地文件附加到现有笔记。
参数:
noteGuid(必填):目标笔记 GUIDfilePath(必填):本地文件路径。必须位于允许的根目录下 — 参见EVERNOTE_ALLOWED_FILE_ROOTS(默认为你的主目录和 当前工作目录)。filename(可选):覆盖附件的显示名称
连接与账户
evernote_connection
管理 Evernote 连接和账户。根据 action 分派
(替代旧版的 health_check、get_user_info、reconnect、revoke_auth):
action:"status"— 健康状态/诊断检查(服务端 + 身份验证状态)。传入verbose:true可获取详细诊断信息。action:"user"— 当前用户信息和配额使用情况。action:"reconnect"— 强制重新连接(适用于出现“未连接”错误时)。action:"revoke"— 撤销已存储的身份验证令牌。
示例:
Check Evernote connection health with verbose details
轮询操作
evernote_polling
管理用于检测变更的后台轮询(检测到的变更会发送到
已配置的 webhook)。根据 action 分派(替代旧版的 start_polling、
stop_polling、poll_now、polling_status):
action:"start"— 按已配置的间隔开始轮询。action:"stop"— 停止轮询。action:"poll"— 立即检查变更;返回检测到的变更。action:"status"— 当前轮询配置和状态(运行状态、间隔、 webhook URL、上次轮询时间、错误计数)。
示例:
Start polling for Evernote changes
搜索语法
Evernote 支持高级搜索运算符:
intitle:keyword- 在标题中搜索notebook:name- 在指定笔记本中搜索tag:tagname- 按标签搜索created:20240101- 按创建日期搜索updated:day-1- 搜索最近更新的笔记resource:image/*- 搜索包含图像的笔记todo:true- 搜索带复选框的笔记-tag:archive- 排除已归档的笔记
与 Claude Automation Hub 集成
此 MCP 服务可与 Claude Automation Hub 无缝协作,实现工作流自动化:
// 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']
}
};
}
};
内存服务集成
如需启用与 MCP 内存服务的同步:
- 在环境中设置内存服务 URL:
MCP_MEMORY_SERVICE_URL=http://localhost:8765
- 使用同步工具将重要笔记持久化到内存中:
Sync my "Important Concepts" notebook to memory for long-term retention
连接恢复能力
该服务包含连接问题的自动恢复机制:
自动功能
- 自动重试:连接失败后会在 30 秒后自动重试
- 令牌验证:主动检测过期的令牌
- 平稳降级:服务在故障期间仍会保持运行
- 清晰的错误消息:针对连接问题提供可采取行动的反馈
“未连接”错误
如果你看到“未连接”错误,服务通常会自动恢复。你也可以:
-
尝试使用重新连接工具(最快):
Reconnect to Evernote -
检查服务运行状况:
Check Evernote connection health with verbose details -
如有需要,重新进行身份验证:
- Claude Code:
/mcp→ Evernote → Authenticate - Claude Desktop:
npx -p @verygoodplugins/mcp-evernote mcp-evernote-auth
- Claude Code:
有关连接问题和恢复的详细信息,请参阅 CONNECTION_TROUBLESHOOTING.md。
故障排除
身份验证问题
Claude Desktop 中出现“需要身份验证”错误
这表示你尚未完成身份验证。运行身份验证脚本:
npx -p @verygoodplugins/mcp-evernote mcp-evernote-auth
或者,如果已全局安装:
mcp-evernote-auth
OAuth 回调失败
如果 OAuth 回调无法正常工作:
- 确保端口 3000 可用(或在
.env中设置OAUTH_CALLBACK_PORT) - 检查防火墙设置
- 尝试使用其他浏览器
令牌已过期
如果令牌过期,服务现在会自动检测到并提示你重新进行身份验证:
- 在 Claude Code 中:使用
/mcp命令重新进行身份验证 - 在 Claude Desktop 中:运行
npx -p @verygoodplugins/mcp-evernote mcp-evernote-auth
或者使用重新连接工具立即强制重试:
Reconnect to Evernote
连接错误
服务现在可以自动处理大多数连接错误:
- 临时故障:30 秒后自动重试
- 令牌过期:显示清晰的错误消息和重新进行身份验证的说明
- 网络问题:服务保持运行并重试
如果问题仍然存在:
- 检查 API 凭据是否正确
- 确认使用了正确的环境(沙盒或生产环境)
- 查看 CONNECTION_TROUBLESHOOTING.md 获取详细说明
速率限制
Evernote API 有速率限制。如果遇到限制:
- 降低请求频率
- 尽可能使用批量操作
- 为频繁访问的数据实现缓存
开发
从源代码构建
npm install
npm run build
在开发模式下运行
npm run dev
测试
npm test
代码检查
npm run lint
npm run format
安全
- 查找令牌时,优先使用
EVERNOTE_ACCESS_TOKEN,其次是 Claude Code OAuth 环境变量,最后是.evernote-token.json - 切勿将令牌文件提交到版本控制中
- 使用环境变量存储敏感配置
- 本地文件附件仅限于
EVERNOTE_ALLOWED_FILE_ROOTS指定的路径;默认情况下,该路径包括你的主目录和当前工作目录 - 令牌默认在一年后过期
贡献
欢迎贡献!请:
- Fork 此仓库
- 创建功能分支
- 进行更改
- 如适用,添加测试
- 向
main提交拉取请求
许可证
GPL-3.0 - 详情请参阅 LICENSE 文件。
支持
致谢
- 使用 Model Context Protocol SDK 构建
- 由 Evernote API 提供支持
- 属于 Very Good Plugins 生态系统
路线图
近期计划
- 标签管理 - 为现有笔记添加或移除标签
- ENML ↔ Markdown 转换器 - 在 Evernote 的 ENML 格式与 Markdown 之间进行双向转换
- 实时同步钩子 - 检测通过 Evernote 桌面版或移动应用进行的更改
- 数据库监控 - 监视 Evernote DB 服务以获取实时更新
未来增强
- 网页剪藏工具功能
- 富文本编辑支持
- 文件附件处理
- 共享笔记本支持
- 商业账户功能
- 模板系统
- 批量操作
- 导出/导入工具
- 高级筛选选项
- 提醒管理
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。