{"id":27852025,"url":"https://github.com/freestylefly/mcp-server-weread","last_synced_at":"2025-05-04T03:01:58.621Z","repository":{"id":288471044,"uuid":"965114376","full_name":"freestylefly/mcp-server-weread","owner":"freestylefly","description":"微信读书MCP","archived":false,"fork":false,"pushed_at":"2025-04-12T12:54:05.000Z","size":3297,"stargazers_count":248,"open_issues_count":3,"forks_count":21,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-25T19:57:24.089Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/freestylefly.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-04-12T12:51:14.000Z","updated_at":"2025-04-25T17:49:42.000Z","dependencies_parsed_at":"2025-04-18T08:29:11.954Z","dependency_job_id":"3e8ac462-eb3a-4acc-a39a-78a59c52b9eb","html_url":"https://github.com/freestylefly/mcp-server-weread","commit_stats":null,"previous_names":["freestylefly/mcp-server-weread"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freestylefly%2Fmcp-server-weread","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freestylefly%2Fmcp-server-weread/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freestylefly%2Fmcp-server-weread/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freestylefly%2Fmcp-server-weread/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/freestylefly","download_url":"https://codeload.github.com/freestylefly/mcp-server-weread/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252280890,"owners_count":21723055,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-05-04T03:01:56.790Z","updated_at":"2025-05-04T03:01:58.594Z","avatar_url":"https://github.com/freestylefly.png","language":"TypeScript","funding_links":[],"categories":["📚 Projects (1974 total)","📦 Other","Art \u0026 Culture","JavaScript","Note-Taking and Knowledge Bases","カテゴリ","📱 Social Media \u0026 Content Platforms"],"sub_categories":["MCP Servers","How to Submit","📝 \u003ca name=\"content--media\"\u003e\u003c/a\u003eコンテンツ・メディア"],"readme":"# 微信读书 MCP 服务器\n\n微信读书MCP服务器是一个桥接微信读书数据和Claude Desktop的轻量级服务器，使您可以在Claude中无缝访问微信读书的笔记和阅读数据。\n\n## 安装和使用\n\n### 环境准备\n\n1. 确保您的系统已安装 Node.js (v16+)\n2. 克隆本仓库：`git clone https://github.com/yourusername/mcp-server-weread.git`\n3. 进入项目目录：`cd mcp-server-weread`\n4. 安装依赖：`npm install`（下载慢可以用：npm install --registry=https://registry.npmmirror.com）\n\n### 获取微信读书Cookie\n\n1. 在浏览器中登录微信读书网页版: https://weread.qq.com/\n2. 打开浏览器开发者工具（F12或右键检查）\n3. 切换到\"应用程序\"或\"Application\"标签\n4. 在左侧\"存储\"下找到\"Cookies\"\n5. 选择\"https://weread.qq.com\"\n6. 找到并复制所有cookie（可以全选然后复制所有值）\n\n### 配置环境变量\n\n1. 在项目根目录下，编辑`.env`文件\n2. 设置微信读书Cookie：`WEREAD_COOKIE=你复制的cookie值`\n\n### 启动服务器\n\n1. 编译代码：`npm run build`\n2. 启动服务器：`node build/index.js`\n\n### 在MCP客户端中配置\n\n以Cursor AI为例，在`~/.cursor/mcp.json`文件中添加：\n\n```json\n{\n  \"mcpServers\": {\n    \"mcp-server-weread\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/mcp-server-weread/build/index.js\"],\n      \"env\": {\n        \"WEREAD_COOKIE\": \"你的微信读书cookie\"\n      }\n    }\n  }\n}\n```\n\n替换`/path/to/mcp-server-weread`为实际安装路径，并设置正确的cookie值。\n\n## 支持的功能\n\n服务器提供以下工具：\n\n1. **get_bookshelf** - 获取用户的完整书架信息\n2. **get_notebooks** - 获取带有笔记的书籍列表\n3. **get_book_notes** - 获取特定书籍的所有笔记内容\n4. **get_book_info** - 获取书籍的详细信息\n5. **search_notes** - 搜索所有笔记中包含特定关键词的内容\n6. **get_recent_reads** - 获取用户最近阅读的书籍和相关数据\n\n## 使用示例\n\n在支持MCP的AI客户端（如Claude Desktop）中，您可以：\n\n1. 请求：\"帮我查看我的书架上有哪些书\"\n2. 请求：\"我想看看《思考，快与慢》这本书的笔记\"\n3. 请求：\"帮我找一下我笔记中关于'认知偏差'的内容\"\n4. 请求：\"获取我最近读过的书籍\"\n\n---\n\n# 微信读书 MCP 服务器设计方案\n\n## 产品定位与目标\n\n**产品名称**: WeRead MCP Server\n\n**产品定位**: 作为微信读书与Claude Desktop之间的桥梁，实现阅读笔记与AI深度交互的轻量级服务器。\n\n**核心目标**:\n1. 实现微信读书数据的实时获取与格式化\n2. 通过MCP协议与Claude Desktop无缝集成\n3. 支持基于读书笔记的深度对话与知识提取\n4. 构建完整的\"输入-整理-沉淀\"知识工作流\n\n**价值主张**:\n- 将碎片化的阅读笔记转化为系统化的知识体系\n- 通过AI辅助深化对阅读内容的理解与应用\n- 减少知识管理的复杂性，实现轻量级知识沉淀\n- 提升阅读效率与阅读质量\n\n## 系统架构\n\n```\n+---------------+      +-----------------+      +------------------+\n|               |      |                 |      |                  |\n| 微信读书服务器 | \u003c--\u003e | WeRead MCP 服务器 | \u003c--\u003e | Claude Desktop |\n|               |      |                 |      |                  |\n+---------------+      +-----------------+      +------------------+\n```\n\n### 特点\n- 轻量级设计：无本地数据库，实时API调用\n- 按需获取数据：仅在用户请求时调用相关API\n- 无状态服务：不维护复杂的会话状态\n- 安全性：通过环境变量管理Cookie，避免明文存储\n\n## 功能与使用场景\n\n### 核心功能\n\n1. **书籍与笔记浏览**\n   - 获取用户书架信息\n   - 获取带笔记的书籍列表\n   - 获取特定书籍的详细信息\n\n2. **笔记内容获取与处理**\n   - 获取特定书籍的所有笔记（划线、评论）\n   - 按章节组织笔记内容\n   - 基于关键词搜索笔记内容\n\n3. **阅读数据获取**\n   - 获取最近阅读记录\n   - 获取阅读进度信息\n\n4. **AI 辅助分析**\n   - 通过Claude分析笔记内容\n   - 提取关键观点与见解\n   - 关联不同书籍的相关概念\n\n### 使用场景\n\n#### 场景一：深度阅读分析与讨论\n\n1. **开始对话**：用户打开Claude Desktop，开始一个新对话\n2. **选择书籍**：用户请求：\"帮我查看我最近在读的书籍\"\n3. **获取笔记**：用户说：\"我想讨论《思考快与慢》这本书的笔记\"\n4. **深入讨论**：Claude展示笔记后，用户可以请求：\"帮我分析这些笔记中关于认知偏差的主要观点\"\n5. **关联思考**：用户可以进一步请求：\"将这些观点与我在《超越智商》一书中的笔记做对比\"\n\n#### 场景二：主题式笔记整合\n\n1. **主题搜索**：用户说：\"查找我所有笔记中关于'领导力'的内容\"\n2. **跨书整合**：系统找到多本书中的相关笔记后，用户可以请求：\"帮我整合这些不同来源的观点，找出共同点和差异\"\n3. **知识地图**：用户说：\"基于这些笔记，帮我构建一个领导力的知识框架\"\n\n#### 场景三：写作与创作辅助\n\n1. **素材收集**：用户说：\"我正在写关于'团队建设'的文章，找出我所有相关的读书笔记\"\n2. **结构梳理**：获取笔记后，用户可以说：\"帮我将这些素材组织成一个逻辑清晰的文章大纲\"\n3. **内容扩展**：用户说：\"基于这个大纲和我的笔记，帮我扩展第二部分的内容\"\n\n## MCP Tools 实现清单\n\n### 1. 获取书架工具 (get_bookshelf)\n\n**功能**: 获取用户的完整书架信息\n\n**参数**: 无\n\n**返回**: 格式化的书籍列表，包括书名、作者等基本信息\n\n**实现逻辑**:\n```python\ndef get_bookshelf():\n    \"\"\"获取用户的完整书架信息\"\"\"\n    # 直接调用WeReadApi中的get_bookshelf方法\n    weread_api = WeReadApi()\n    bookshelf_data = weread_api.get_bookshelf()\n    \n    # 处理返回数据，提取有用信息\n    books = []\n    if \"books\" in bookshelf_data:\n        for book in bookshelf_data[\"books\"]:\n            books.append({\n                \"bookId\": book.get(\"bookId\", \"\"),\n                \"title\": book.get(\"title\", \"\"),\n                \"author\": book.get(\"author\", \"\"),\n                \"cover\": book.get(\"cover\", \"\"),\n                \"category\": book.get(\"category\", \"\"),\n                \"finished\": book.get(\"finished\", False),\n                \"updateTime\": book.get(\"updateTime\", 0)\n            })\n    \n    return {\"books\": books}\n```\n\n### 2. 获取笔记本列表工具 (get_notebooks)\n\n**功能**: 获取所有带有笔记的书籍列表\n\n**参数**: 无\n\n**返回**: 带有笔记的书籍列表，按排序顺序\n\n**实现逻辑**:\n```python\ndef get_notebooks():\n    \"\"\"获取所有带有笔记的书籍列表\"\"\"\n    # 直接调用WeReadApi中的get_notebooklist方法\n    weread_api = WeReadApi()\n    notebooks = weread_api.get_notebooklist()\n    \n    # 处理返回数据，提取有用信息\n    formatted_notebooks = []\n    for notebook in notebooks:\n        formatted_notebooks.append({\n            \"bookId\": notebook.get(\"bookId\", \"\"),\n            \"title\": notebook.get(\"title\", \"\"),\n            \"author\": notebook.get(\"author\", \"\"),\n            \"cover\": notebook.get(\"cover\", \"\"),\n            \"noteCount\": notebook.get(\"noteCount\", 0),\n            \"sort\": notebook.get(\"sort\", 0),\n            \"bookUrl\": weread_api.get_url(notebook.get(\"bookId\", \"\"))\n        })\n    \n    return {\"notebooks\": formatted_notebooks}\n```\n\n### 3. 获取书籍笔记工具 (get_book_notes)\n\n**功能**: 获取特定书籍的所有笔记内容\n\n**参数**: bookId (字符串) - 书籍ID\n\n**返回**: 按章节组织的笔记内容，包括划线和评论\n\n**实现逻辑**:\n```python\ndef get_book_notes(bookId):\n    \"\"\"获取特定书籍的所有笔记内容\"\"\"\n    weread_api = WeReadApi()\n    \n    # 1. 获取章节信息\n    chapter_info = weread_api.get_chapter_info(bookId)\n    \n    # 2. 获取划线(书签)\n    bookmarks = weread_api.get_bookmark_list(bookId) or []\n    \n    # 3. 获取评论/感想\n    reviews = weread_api.get_review_list(bookId) or []\n    \n    # 4. 获取书籍基本信息\n    book_info = weread_api.get_bookinfo(bookId) or {}\n    \n    # 处理章节信息\n    chapters = {}\n    for uid, chapter in chapter_info.items():\n        chapters[uid] = {\n            \"title\": chapter.get(\"title\", \"\"),\n            \"level\": chapter.get(\"level\", 0),\n            \"chapterIdx\": chapter.get(\"chapterIdx\", 0)\n        }\n    \n    # 处理划线和评论数据，按章节组织\n    organized_notes = {}\n    \n    # 添加划线\n    for bookmark in bookmarks:\n        chapter_uid = str(bookmark.get(\"chapterUid\", \"\"))\n        if chapter_uid not in organized_notes:\n            organized_notes[chapter_uid] = {\n                \"chapterTitle\": chapters.get(chapter_uid, {}).get(\"title\", \"未知章节\"),\n                \"chapterLevel\": chapters.get(chapter_uid, {}).get(\"level\", 0),\n                \"highlights\": [],\n                \"reviews\": []\n            }\n        \n        organized_notes[chapter_uid][\"highlights\"].append({\n            \"text\": bookmark.get(\"markText\", \"\"),\n            \"createTime\": bookmark.get(\"createTime\", 0),\n            \"style\": bookmark.get(\"style\", 0)\n        })\n    \n    # 添加评论\n    for review in reviews:\n        chapter_uid = str(review.get(\"chapterUid\", \"\"))\n        if chapter_uid not in organized_notes:\n            organized_notes[chapter_uid] = {\n                \"chapterTitle\": chapters.get(chapter_uid, {}).get(\"title\", \"未知章节\"),\n                \"chapterLevel\": chapters.get(chapter_uid, {}).get(\"level\", 0),\n                \"highlights\": [],\n                \"reviews\": []\n            }\n        \n        organized_notes[chapter_uid][\"reviews\"].append({\n            \"content\": review.get(\"content\", \"\"),\n            \"createTime\": review.get(\"createTime\", 0),\n            \"type\": review.get(\"type\", 0)\n        })\n    \n    # 组织最终返回数据\n    return {\n        \"bookInfo\": {\n            \"bookId\": bookId,\n            \"title\": book_info.get(\"title\", \"\"),\n            \"author\": book_info.get(\"author\", \"\"),\n            \"cover\": book_info.get(\"cover\", \"\"),\n            \"url\": weread_api.get_url(bookId)\n        },\n        \"notes\": organized_notes\n    }\n```\n\n### 4. 获取书籍详情工具 (get_book_info)\n\n**功能**: 获取书籍的详细信息\n\n**参数**: bookId (字符串) - 书籍ID\n\n**返回**: 书籍的详细信息，包括标题、作者、简介等\n\n**实现逻辑**:\n```python\ndef get_book_info(bookId):\n    \"\"\"获取书籍的详细信息\"\"\"\n    weread_api = WeReadApi()\n    book_info = weread_api.get_bookinfo(bookId)\n    \n    # 处理并返回整理后的书籍信息\n    formatted_info = {\n        \"bookId\": bookId,\n        \"title\": book_info.get(\"title\", \"\"),\n        \"author\": book_info.get(\"author\", \"\"),\n        \"cover\": book_info.get(\"cover\", \"\"),\n        \"intro\": book_info.get(\"intro\", \"\"),\n        \"category\": book_info.get(\"category\", \"\"),\n        \"publisher\": book_info.get(\"publisher\", \"\"),\n        \"publishTime\": book_info.get(\"publishTime\", \"\"),\n        \"isbn\": book_info.get(\"isbn\", \"\"),\n        \"bookScore\": book_info.get(\"newRating\", {}).get(\"score\", 0),\n        \"url\": weread_api.get_url(bookId)\n    }\n    \n    return formatted_info\n```\n\n### 5. 搜索笔记工具 (search_notes)\n\n**功能**: 搜索所有笔记中包含特定关键词的内容\n\n**参数**: keyword (字符串) - 搜索关键词\n\n**返回**: 匹配关键词的笔记列表，包括来源书籍和内容\n\n**实现逻辑**:\n```python\ndef search_notes(keyword):\n    \"\"\"搜索所有笔记中包含特定关键词的内容\"\"\"\n    weread_api = WeReadApi()\n    \n    # 1. 获取所有有笔记的书籍\n    notebooks = weread_api.get_notebooklist()\n    \n    # 2. 遍历每本书的笔记，查找匹配关键词的内容\n    search_results = []\n    \n    for notebook in notebooks:\n        bookId = notebook.get(\"bookId\", \"\")\n        book_title = notebook.get(\"title\", \"\")\n        \n        # 获取划线\n        bookmarks = weread_api.get_bookmark_list(bookId) or []\n        # 获取评论\n        reviews = weread_api.get_review_list(bookId) or []\n        \n        # 搜索划线内容\n        for bookmark in bookmarks:\n            mark_text = bookmark.get(\"markText\", \"\")\n            if keyword.lower() in mark_text.lower():\n                search_results.append({\n                    \"bookId\": bookId,\n                    \"bookTitle\": book_title,\n                    \"chapterUid\": bookmark.get(\"chapterUid\", \"\"),\n                    \"type\": \"highlight\",\n                    \"content\": mark_text,\n                    \"createTime\": bookmark.get(\"createTime\", 0)\n                })\n        \n        # 搜索评论内容\n        for review in reviews:\n            review_content = review.get(\"content\", \"\")\n            if keyword.lower() in review_content.lower():\n                search_results.append({\n                    \"bookId\": bookId,\n                    \"bookTitle\": book_title,\n                    \"chapterUid\": review.get(\"chapterUid\", \"\"),\n                    \"type\": \"review\",\n                    \"content\": review_content,\n                    \"createTime\": review.get(\"createTime\", 0)\n                })\n    \n    # 按时间排序\n    search_results.sort(key=lambda x: x[\"createTime\"], reverse=True)\n    \n    return {\"results\": search_results, \"keyword\": keyword, \"count\": len(search_results)}\n```\n\n### 6. 最近阅读工具 (get_recent_reads)\n\n**功能**: 获取用户最近阅读的书籍和相关数据\n\n**参数**: 无\n\n**返回**: 最近阅读的书籍列表，包括阅读进度和时间信息\n\n**实现逻辑**:\n```python\ndef get_recent_reads():\n    \"\"\"获取用户最近阅读的书籍和相关数据\"\"\"\n    weread_api = WeReadApi()\n    \n    # 获取阅读历史数据\n    history_data = weread_api.get_api_data()\n    \n    # 提取并格式化最近阅读数据\n    recent_books = []\n    \n    if \"recentBooks\" in history_data:\n        for book in history_data[\"recentBooks\"]:\n            # 获取每本书的阅读信息\n            read_info = weread_api.get_read_info(book[\"bookId\"])\n            \n            recent_books.append({\n                \"bookId\": book.get(\"bookId\", \"\"),\n                \"title\": book.get(\"title\", \"\"),\n                \"author\": book.get(\"author\", \"\"),\n                \"cover\": book.get(\"cover\", \"\"),\n                \"readingTime\": read_info.get(\"readingTime\", 0),  # 阅读时长(秒)\n                \"progress\": read_info.get(\"progress\", 0),        # 阅读进度(%)\n                \"lastReadingDate\": read_info.get(\"lastReadingDate\", 0),\n                \"noteCount\": read_info.get(\"noteCount\", 0),\n                \"url\": weread_api.get_url(book.get(\"bookId\", \"\"))\n            })\n    \n    return {\"recentBooks\": recent_books}\n```\n\n## 技术实现注意事项\n\n1. **环境变量管理**\n   - 使用.env文件或系统环境变量管理敏感信息(Cookie)\n   - 支持Cookie Cloud服务获取最新Cookie\n\n2. **错误处理**\n   - 完善的异常处理机制，特别是API调用失败情况\n   - Cookie过期提醒与自动刷新机制\n\n3. **性能优化**\n   - 控制API调用频率，避免触发限制\n   - 考虑短期缓存机制，减少重复调用\n\n4. **MCP协议适配**\n   - 确保工具输入输出符合Claude Desktop的MCP规范\n   - 提供清晰的工具描述和使用示例\n\n## 后续拓展方向\n\n1. **增加笔记导出功能**\n   - 支持Markdown、JSON等多种格式导出\n   - 便于知识沉淀与分享\n\n2. **添加笔记统计分析**\n   - 提供阅读与笔记行为的数据可视化\n   - 帮助用户了解自己的阅读模式\n\n3. **个性化推荐**\n   - 基于用户阅读历史和笔记内容推荐相关书籍或文章\n   - 帮助用户拓展知识网络\n\n4. **知识图谱构建**\n   - 自动构建用户阅读内容的知识关联网络\n   - 可视化展示不同概念和书籍之间的联系\n\n5. **多平台整合**\n   - 接入其他阅读平台的数据(如Kindle、豆瓣等)\n   - 构建统一的阅读笔记管理系统","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffreestylefly%2Fmcp-server-weread","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffreestylefly%2Fmcp-server-weread","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffreestylefly%2Fmcp-server-weread/lists"}