1. 为什么程序员需要 Claude Code Obsidian 这套组合先说结论Claude Code 是 Anthropic 出的终端 AI 编码代理Obsidian 是基于本地 Markdown 的知识库工具两者通过 Local REST API 和 TaoToken 统一 Key 打通后你就能在终端里用自然语言把「今天踩的坑、读的源码、临时想法」直接写进 Obsidian也能让 Claude 读着你的历史笔记回答问题。适合谁适合笔记散落在 Notion、印象笔记、本地 md 各处、每次查东西都要重新搜索的程序员。我自己的痛点是Stack Overflow 收藏夹 300 条、GitHub Issues 星标 200 个、本地 md 文件散在三个目录真正需要的时候一个都想不起来。后来我把 Obsidian 当存储层、Claude Code 当检索和写入层用 TaoToken 统一 Key 走模型通道才算把「记录→提问→回写」这条链路跑通。这篇文章交付三样东西一份可直接复制的~/.claude/settings.json配置片段、Obsidian Local REST API 的 Base URL 填写位置、以及一次从终端提问到笔记回写的完整验证动作。全程不需要 IDE不需要图形界面一个终端就够。需要提前说明的是Claude Code 本身是终端编码代理不是知识管理工具。本文是通过CLAUDE.md指令 Bash 脚本 MCP 集成三种方式把它扩展成知识管理助手。这个定位要清楚否则后面配置会走偏。2. TaoToken 统一 Key 接入 Claude Code 的前置准备2.1 为什么需要 TaoTokenClaude Code 默认走 Anthropic 官方 OAuth 登录适合 Pro/Max/Team 账户。但在 CI/CD、多模型切换、或者想用统一 Key 管理多个项目的场景下直接配ANTHROPIC_BASE_URL和ANTHROPIC_AUTH_TOKEN更灵活。TaoToken 提供的就是这样一个统一 API 通道官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 端点是 https://taotoken.net/api 。它的作用是你只需要维护一个 Key就能在 Claude Code、Cline、Codex 等多个客户端里复用同一套模型通道不用每个工具单独配一遍。2.2 获取 API Key打开 https://taotoken.net/api-keys 登录后创建一个新 Key复制保存。这个 Key 后面要写进环境变量不要硬编码到脚本里。2.3 确认 Claude Code 已安装如果你还没装 Claude CodemacOS / Linux 用官方脚本curl -fsSL https://claude.ai/install.sh | shWindows PowerShell管理员权限irm https://claude.ai/install.ps1 | iex或者用 npm需要 Node.js 18npm install -g anthropic-ai/claude-code验证claude --version2.4 安装 Obsidian 与 Local REST API 插件Obsidian 从官网下载安装即可。装完后打开「设置 → 社区插件 → 关闭安全模式」搜索并安装Local REST API。在插件设置里启用 HTTPS端口保持27124点击Generate new API key复制保存可选勾选Enable non-encrypted (HTTP) server用于本地调试验证 API 是否正常把YOUR_TOKEN换成实际 tokencurl -sk -H Authorization: Bearer YOUR_TOKEN \ https://127.0.0.1:27124/vault/ | python3 -m json.tool返回文件列表 JSON 就说明通了。3. 可复制的 settings.json 与 CLAUDE.md 配置3.1 环境变量写入 shell 配置把下面这段加到~/.zshrc或~/.bashrc# TaoToken 统一 Key export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_AUTH_TOKENsk-你的TaoToken密钥 # Obsidian 集成 export OBSIDIAN_API_TOKEN你的Obsidian插件token export OBSIDIAN_VAULT_PATH$HOME/Documents/Obsidian Vault export OBSIDIAN_API_PORT27124生效source ~/.zshrc3.2 ~/.claude/settings.json 完整片段这是 Claude Code 实际读取的配置文件路径必须是~/.claude/settings.jsonJSON 格式{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: sk-你的TaoToken密钥, OBSIDIAN_API_PORT: 27124 }, permissions: { allow: [ Bash(~/.claude/scripts/*) ] } }注意三点ANTHROPIC_BASE_URL结尾不要带/v1TaoToken 的 API 根路径就是https://taotoken.net/apiANTHROPIC_AUTH_TOKEN就是你在 api-keys 页面拿到的 Keypermissions.allow里放行脚本目录避免每次调用都弹确认。3.3 用户级 CLAUDE.md 指令创建~/.claude/CLAUDE.md让 Claude Code 在所有项目里都知道怎么操作 Obsidian# 用户全局指令 ## Obsidian 笔记操作 当用户要求保存笔记、记录想法或整理信息时使用以下工具 ### 写入笔记 调用脚本~/.claude/scripts/obsidian-write.sh 文件名 内容 脚本会将笔记保存到 Obsidian Vault 的 00-Inbox/ 目录。 ### 笔记格式规范 - 所有笔记必须包含 YAML frontmatterdate、tags、type、status: inbox、source: claude - 技术笔记包含背景、核心内容、代码示例、相关链接 - Bug 记录包含问题描述、根本原因、解决方案、防止复现措施 ### 文件命名规范 格式{类型}-{简短描述}-{YYYYMMDD}.md 示例tech-react18-concurrent-mode-20260420.md3.4 Obsidian 目录结构建议按 PARA 方法组织Obsidian Vault/ ├── 00-Inbox/ # Claude 自动写入区 ├── 01-Notes/ # 日常笔记 ├── 02-Knowledge/ # 沉淀后的技术知识 ├── 03-Projects/ # 项目相关 ├── 04-Areas/ # 长期关注领域 ├── 05-Archives/ # 已完成/过期 ├── 06-Attachments/ # 图片、PDF └── Templates/ # 笔记模板Claude 写入统一落到00-Inbox/人工整理后再移到对应目录避免 AI 误分类导致混乱。4. 验证请求从终端提问到笔记回写4.1 写入脚本 obsidian-write.sh创建~/.claude/scripts/obsidian-write.sh#!/usr/bin/env bash set -euo pipefail if [ $# -lt 2 ]; then echo 用法: $0 文件名 内容 2 exit 1 fi FILENAME$1 CONTENT$2 API_TOKEN${OBSIDIAN_API_TOKEN:-} API_PORT${OBSIDIAN_API_PORT:-27124} API_BASEhttps://127.0.0.1:${API_PORT} INBOX_DIR00-Inbox if [ -z $API_TOKEN ]; then echo 错误: OBSIDIAN_API_TOKEN 未设置 2 exit 1 fi if [[ ! $FILENAME ~ [0-9]{8}\.md$ ]]; then DATE$(date %Y%m%d) BASENAME${FILENAME%.md} FILENAME${BASENAME}-${DATE}.md fi TARGET_PATH${INBOX_DIR}/${FILENAME} ENCODED_PATH$(python3 -c import urllib.parse; print(urllib.parse.quote($TARGET_PATH, safe/))) HTTP_CODE$(curl -sk -o /dev/null -w %{http_code} \ -X PUT ${API_BASE}/vault/${ENCODED_PATH} \ -H Authorization: Bearer ${API_TOKEN} \ -H Content-Type: text/markdown; charsetUTF-8 \ --data-binary ${CONTENT}) if [[ $HTTP_CODE 200 || $HTTP_CODE 204 ]]; then echo 笔记已保存: ${TARGET_PATH} else echo 保存失败 (HTTP ${HTTP_CODE}) 2 exit 1 fi赋权chmod x ~/.claude/scripts/obsidian-write.sh4.2 读取脚本 obsidian-read.sh#!/usr/bin/env bash set -euo pipefail FILE_PATH${1:-} API_TOKEN${OBSIDIAN_API_TOKEN:-} API_PORT${OBSIDIAN_API_PORT:-27124} if [ -z $FILE_PATH ] || [ -z $API_TOKEN ]; then echo 用法: $0 文件路径 2 exit 1 fi ENCODED$(python3 -c import urllib.parse; print(urllib.parse.quote($FILE_PATH, safe/))) curl -sk -H Authorization: Bearer ${API_TOKEN} \ https://127.0.0.1:${API_PORT}/vault/${ENCODED}4.3 一次完整验证先手动测脚本~/.claude/scripts/obsidian-write.sh test-hello # 测试笔记 这是一条测试。终端应输出笔记已保存: 00-Inbox/test-hello-20260420.md打开 Obsidian 就能看到。然后在终端启动 Claude Codeclaude输入请记录笔记今天学习了 React 18 的 Concurrent Mode核心概念包括 Suspense 边界、useTransition Hook、自动批处理。Claude 会调用obsidian-write.sh生成带 frontmatter 的笔记写入00-Inbox/。终端输出类似笔记已保存: 00-Inbox/tech-react18-concurrent-mode-20260420.md打开 Obsidian 确认内容这就是「笔记→提问→回写」闭环跑通的标志。4.4 读取验证再让 Claude 读回来读取笔记 00-Inbox/tech-react18-concurrent-mode-20260420.mdClaude 会调用obsidian-read.sh并展示内容。如果这一步能正常返回说明双向通道都通了。5. 本篇常见报错排查5.1 401 Unauthorized响应体{error: Unauthorized, code: 40101}原因通常是 Obsidian 插件里重新生成了 API Key但环境变量没更新。解决export OBSIDIAN_API_TOKENnew_token echo $OBSIDIAN_API_TOKEN如果 Claude Code 报 401 且指向 TaoToken检查ANTHROPIC_AUTH_TOKEN是否和 api-keys 页面一致注意不要带多余空格。5.2 local proxy failed / Connection Refusedcurl: (7) Failed to connect to 127.0.0.1 port 27124排查顺序Obsidian 是否在运行插件只在 Obsidian 打开时工作插件设置里 Local REST API 是否启用端口是否被占用lsof -i :271245.3 reading choices 报错如果 Claude Code 返回reading choices相关错误通常是模型响应格式异常。检查ANTHROPIC_BASE_URL是否写成了https://taotoken.net/api/v1正确写法是https://taotoken.net/api不要带/v1。5.4 OAuth 冲突如果你之前用 OAuth 登录过 Claude Code环境变量可能不生效。清理旧凭证rm -rf ~/.claude/credentials.json然后重新启动claude让它读取settings.json里的ANTHROPIC_AUTH_TOKEN。5.5 中文文件名 404URL 编码问题。脚本里已经用 Python 的urllib.parse.quote处理如果还有问题手动验证python3 -c import urllib.parse; print(urllib.parse.quote(00-Inbox/测试笔记.md, safe/))预期输出00-Inbox/%E6%B5%8B%E8%AF%95%E7%AC%94%E8%AE%B0.md。5.6 Claude 找不到脚本CLAUDE.md里必须用绝对路径不能用~或相对路径正确/Users/yourname/.claude/scripts/obsidian-write.sh 错误~/.claude/scripts/obsidian-write.sh5.7 Codex auth.json 场景如果你同时用 Codex~/.codex/auth.json里也要配三件套{ OPENAI_BASE_URL: https://taotoken.net/api, OPENAI_API_KEY: sk-你的TaoToken密钥, OPENAI_MODEL: gpt-4o }Base URL、Key、Model ID 三者缺一不可否则会报模型不存在。6. 长期编码与 Agent 场景的 CTA跑通上面这套之后你手里其实已经有了一个能读笔记、能写笔记、能调模型的终端 Agent。接下来最自然的延伸是把它用在长期编码任务上让 Claude Code 读着你的项目笔记和历史 Bug 记录直接改代码、跑测试、回写变更说明。如果你打算把 TaoToken 作为长期编码和 Agent 的统一通道建议直接开 Coding Plan比按量付费更适合高频调用场景https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcoding_plan想先验证模型对话效果可以在模型对话页面试几条 prompthttps://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentmodel_chat需要管理多个项目的 Key去控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentconsole接入文档和参数说明在这里https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdocClaude Code 专用接入说明https://taotoken.net/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentclaudecode最后分享一个我踩过的坑定时任务里launchd不读~/.zshrc环境变量必须在 plist 的EnvironmentVariables里写死否则脚本跑起来 token 是空的日志里只会看到 401排查半天才发现是环境变量没继承。