
1. 为什么你的 AI Agent 读不到 Obsidian 收藏夹先说一个我踩过的坑。我在 Obsidian 里存了大概两千多篇 Markdown来源很杂B 站视频字幕、公众号长文、小红书图文拆解、X 上的推文串、播客转录稿。平时用 Claude Code 写方案最想要的能力就是让它直接翻我的收藏夹回答“我之前存过哪些关于 MCP 记忆方案的内容帮我列出来源”。结果它一本正经地告诉我我无法访问你的本地文件。问题不在模型而在链路。AI Agent 默认只能看到你粘贴进对话的内容它没有“手”去翻你的 Vault 目录。Obsidian 本身是个本地 Markdown 编辑器它也不会主动把内容喂给 Agent。中间缺的那一环就是 MCP Server。MCPModel Context Protocol你可以理解成给 AI Agent 装的一个“标准插头”。Agent 这边认这个插头协议工具这边只要实现一个 MCP Server就能把自己的能力暴露出去。Chubby Skills 做的事情就是把 Obsidian 知识库包装成一个 MCP Server对外提供搜索、读取、语义检索、重建索引这些工具方法。Agent 调用这些方法就等于直接读你的收藏夹。这篇要交付的东西很具体从零跑通一次可复现的读取流程。包括 Chubby Skills 的安装自检、Obsidian 库路径怎么挂载、MCP Server 的配置片段怎么写、Agent 读取收藏夹后返回结构化摘要怎么验证。适合已经在用 Obsidian 做知识沉淀、同时又在用 Claude Code 或 Cursor 的人。如果你只是想把内容存起来不打算让 AI 用那这篇的价值会打折。核心检索词先摆出来Chubby Skills 是一个把中文全渠道内容采集进本地知识库、并附带知识库 MCP Server 的开源工具。它解决的是“收藏了但 AI 用不上”这个断层。下面按链路一步步来。2. TaoToken 前置给 Agent 和采集加工准备模型通道在接 MCP 之前有个容易被忽略的前置Chubby Skills 的采集加工--enrich和语义检索embedding都需要模型能力。摘要、要点、标签、领域分类这些是调 LLM 做的语义检索要么走 OpenAI 兼容的 embedding 接口要么走本地模型。如果你只做关键词搜索确实可以零模型跑通但“读透收藏夹”这个目标里结构化摘要基本绕不开模型。我自己的做法是把模型通道统一到一个兼容 OpenAI 协议的网关上这样采集加工和 embedding 用同一套 Base URL 和 Key配置少、排障也简单。TaoToken 就是这类网关官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 。注意 API 地址不带 UTM 参数配置里填的就是这个。你需要准备三样东西这也是后面所有配置的“三件套”第一是 Base URL。填https://taotoken.net/api注意有些客户端要求以/v1结尾具体看客户端提示如果报 404 就补上/v1再试。第二是 API Key。去控制台创建入口在 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 创建完在 API Keys 页面复制入口是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。Key 只显示一次复制后先存到密码管理器。第三是 Model ID。这个要和你实际用的模型对上。采集加工用对话模型embedding 用嵌入模型。Model ID 写错是最常见的 401 和 404 来源别凭记忆写去模型列表里复制。环境变量在 PowerShell 里这样设注意 Windows 下python3要写成python$env:OPENAI_API_KEYsk-你的key $env:OPENAI_BASE_URLhttps://taotoken.net/api $env:OPENAI_EMBEDDING_MODEL你的embedding模型ID $env:DEEPSEEK_API_KEYsk-你的key $env:VAULT_DIRD:/AI/ObsidianVault这里有个细节Chubby Skills 的--enrich默认读DEEPSEEK_API_KEY而 embedding 走OPENAI_API_KEY和OPENAI_BASE_URL。如果你想让两者都走同一个网关就把DEEPSEEK_API_KEY也设成网关的 Key同时确认代码里 DeepSeek 的 base_url 也指向网关。实测下来最省事的办法是先把OPENAI_*这套配好跑通 embedding 和语义检索再单独处理 enrich 的模型指向。如果你打算长期跑采集 Agent 检索这套流水线模型调用量会持续产生可以考虑 Coding Plan入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 适合这种长期编码和 Agent 场景。只是想先验证模型通不通用模型对话页面测一下就行入口是 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。前置准备到这里就够了。记住三件套Base URL、Key、Model ID后面 MCP 配置和 embedding 配置都会用到。3. 可复制配置MCP Server 挂载 Obsidian 库这一节是全文最核心的部分配置片段可以直接抄但路径要换成你自己的。先确认 Chubby Skills 已经克隆到本地假设在D:/dev/chubbyskills。MCP Server 的入口脚本是knowledge-base-management/scripts/mcp_server.py。Obsidian 库假设在D:/AI/ObsidianVault。第一步装 MCP 依赖python -m pip install mcp第二步确认 MCP Server 能单独启动。先设好库路径再直接跑一次$env:VAULT_DIR D:/AI/ObsidianVault python D:/dev/chubbyskills/knowledge-base-management/scripts/mcp_server.py如果它没有立刻报错退出而是挂起等待输入说明 Server 本身没问题。按 CtrlC 退出接下来交给客户端托管。第三步写 Claude Code 的 MCP 配置。文件位置通常在~/.claude/mcp.jsonWindows 下就是C:/Users/你的用户名/.claude/mcp.json。配置片段如下{ mcpServers: { chubby-kb: { command: python, args: [ D:/dev/chubbyskills/knowledge-base-management/scripts/mcp_server.py ], env: { VAULT_DIR: D:/AI/ObsidianVault, OPENAI_API_KEY: sk-你的key, OPENAI_BASE_URL: https://taotoken.net/api, OPENAI_EMBEDDING_MODEL: 你的embedding模型ID } } } }三个关键点必须说清楚。第一Windows 下 JSON 里的路径统一用正斜杠/不要写单反斜杠\否则会被当成转义字符报路径找不到。第二command写python而不是python3。第三env里把VAULT_DIR和模型三件套都带上这样 MCP Server 启动时就拿到了完整上下文不用依赖系统级环境变量。第四步Cursor 的配置。打开Settings → MCP → Add new server填同样的三样command 是pythonargs 是 mcp_server.py 的绝对路径env 里放VAULT_DIR和模型变量。Cursor 的界面会把这些字段拆成表单填完保存即可。如果你用的是 Codex配置落在auth.json同级的 MCP 配置里思路一样Base URL 填https://taotoken.net/apiKey 填网关 KeyModel ID 填对话模型 ID再把 MCP Server 的启动命令挂上去。三件套缺一不可尤其是 Model ID写错会直接 401 或 404。配置写完后MCP Server 对外暴露的工具方法大致是这几个search_vault做关键词全文搜索semantic_search_vault做语义检索read_kb_note读笔记全文list_recent_notes列最近笔记reindex_vault重建索引vault_index_stats出统计。Agent 就是靠调这些方法读你的收藏夹。一个提醒MCP Server 读的是本地 Markdown不要把它指向生产数据库或敏感目录。Obsidian 库本身就是个人知识资产权限控制靠你自己别把整个磁盘根目录挂进去。4. 验证请求让 Agent 返回结构化摘要配置写完不算跑通必须验证一次完整读取。这一步的目标是Agent 调用 MCP 工具检索到收藏夹里的内容读取原文返回带来源的结构化摘要。先做本地索引确保库里有东西可查。假设你已经用 Chubby Skills 采集过一些内容进 Vaultpython D:/dev/chubbyskills/tools/vault_index.py index D:/AI/ObsidianVault python D:/dev/chubbyskills/tools/vault_index.py statsstats会告诉你索引了多少篇、多少词。如果数字是 0说明库路径不对或者还没采集内容先回去补采集。然后做一次语义检索确认 embedding 通道通python D:/dev/chubbyskills/tools/vault_index.py semantic MCP 记忆方案 --provider openai如果这里报 401多半是 Key 或 Base URL 的问题报reading choices之类的解析错误通常是返回体不是预期的 JSON 结构检查 Base URL 是否要补/v1。这一步通了MCP 里的semantic_search_vault才有意义。接下来在 Claude Code 里发起验证请求。重启 Claude Code 让它加载新的 MCP 配置然后直接问用 chubby-kb 检索我知识库里关于 MCP 记忆方案的内容读取最相关的两篇返回结构化摘要每条都要带来源文件路径。预期返回应该长这样先列出命中的笔记路径然后每篇给出标题、平台、核心要点三到五条、原文链接。如果 Agent 只返回“我找到了相关内容”却不给路径说明它没真正调read_kb_note只是调了搜索。这时候明确要求它“读取全文并引用文件路径”。项目自带一个 demo 可以离线验证整条链路python D:/dev/chubbyskills/tools/mcp_workflow_demo.py它会用 fixtures 里的示例 vault 走一遍“检索 → 读取原文 → 带来源回答”。这个 demo 能跑通说明 MCP 链路本身没问题剩下的就是你自己的库路径和模型配置。我实测下来验证成功的标志有三个Agent 能说出你库里真实存在的文件名摘要里的要点和原文对得上来源路径点开确实是你 Obsidian 里的那篇。三个都满足才算真正“读透”了收藏夹。5. 常见报错排查401、local proxy failed、reading choices这一节按真实报错来对都是我在配置过程中撞到的。401 Unauthorized。最常见。原因通常是 Key 没设、Key 过期、或者 Base URL 和 Key 不匹配。排查顺序先确认OPENAI_API_KEY在 MCP 配置的env里真的写进去了而不是只设在系统环境变量里再确认OPENAI_BASE_URL是https://taotoken.net/api如果客户端要求/v1就补上最后确认 Model ID 是真实存在的写错模型名有时也会返回 401 而不是 404。三件套逐个核对别跳。local proxy failed。这个报错一般出现在客户端尝试走本地代理但代理没起来的时候。如果你没有配任何本地代理检查客户端设置里是不是残留了代理配置清掉即可。MCP Server 本身是本地进程不需要经过任何代理配置里不要画蛇添足加 proxy 字段。reading choices 相关解析错误。典型表现是客户端报无法解析返回体或者提示读取 choices 字段失败。根因是接口返回的不是标准 OpenAI 格式。两个方向一是 Base URL 少了/v1导致请求打到了错误的路径二是 Model ID 填成了 embedding 模型却用来做对话返回结构对不上。把 Base URL 补全、Model ID 换成对话模型基本能解决。OAuth 相关报错。有些客户端在 MCP 配置里会尝试走 OAuth 流程但本地 MCP Server 是 stdio 模式不需要 OAuth。如果看到 OAuth 报错检查是不是把 MCP Server 配成了远程 HTTP 类型。本地脚本应该用commandargs的 stdio 方式不要填 URL。VAULT_DIR 找不到。PowerShell 里先验证$env:VAULT_DIR Test-Path $env:VAULT_DIR如果Test-Path返回 False说明路径写错了。Windows 下统一用D:/AI/ObsidianVault这种正斜杠写法别写D:\AI\ObsidianVault反斜杠在 JSON 里会被转义。索引为空导致检索无结果。MCP 配好了但 Agent 说什么都查不到先跑vault_index.py stats。索引为 0 就重建vault_index.py index D:/AI/ObsidianVault。注意索引和 MCP Server 读的是同一个VAULT_DIR两边路径必须一致。enrich 阶段模型调用失败。--enrich默认读DEEPSEEK_API_KEY如果你只配了OPENAI_*这里会失败。要么补上DEEPSEEK_API_KEY要么改代码里的 base_url 指向同一个网关。别混着配一半。排障的核心思路就一条把链路拆成“模型通道”和“MCP 通道”两段分别验证。模型通道用vault_index.py semantic验MCP 通道用mcp_workflow_demo.py验。哪段报错修哪段不要一起改。6. 把这条链路用起来从采集到 Agent 检索配置跑通之后日常使用其实很顺。完整链路是看到内容 → Chubby Skills 采集为 Markdown → 入 Obsidian → 建索引 → MCP 给 Agent 检索。你只需要维护好采集和索引两个动作。采集单条内容python D:/dev/chubbyskills/tools/chubby_ingest.py https://www.bilibili.com/video/BVxxxxxxxx --vault D:/AI/ObsidianVault/00_Inbox批量采集就把链接放进inbox/links.txt然后python D:/dev/chubbyskills/tools/chubby.py init python D:/dev/chubbyskills/tools/chubby.py run python D:/dev/chubbyskills/tools/chubby.py status --latest采集完重建索引Agent 那边就能立刻检索到新内容。这个顺序别搞反先采集再索引最后问 Agent。索引不更新Agent 读到的还是旧快照。关于模型通道如果你只是偶尔采集、偶尔问 Agent按量用就行。如果这套流水线要长期跑采集加工和 Agent 检索都会持续消耗模型调用Coding Plan 会更合适入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 配置遇到不确定的字段去这里对。API Key 管理在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content Key 轮换和权限都在这里。最后说个实用技巧。MCP 检索的质量很大程度取决于你笔记的 frontmatter。Chubby Skills 采集出来的 Markdown 自带title、platform、source、tags这些字段Agent 读取时能直接拿到来源信息。如果你手动往 Vault 里放笔记尽量把tags和source补上语义检索命中率会明显高一些。另外vault_curator.py archive默认是 dry-run确认归档规则符合预期再加--apply别一上来就让它动你的文件。链路跑通一次之后你会发现 Agent 回答问题时开始引用你自己存过的内容那种感觉和让它凭空生成完全不一样。