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 为什么需要 TaoToken
Claude Code 默认走 Anthropic 官方 OAuth 登录,适合 Pro/Max/Team 账户。但在 CI/CD、多模型切换、或者想用统一 Key 管理多个项目的场景下,直接配ANTHROPIC_BASE_URL和ANTHROPIC_AUTH_TOKEN更灵活。TaoToken 提供的就是这样一个统一 API 通道,官网在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_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 Code,macOS / Linux 用官方脚本:
curl -fsSL https://claude.ai/install.sh | shWindows PowerShell(管理员权限):
irm https://claude.ai/install.ps1 | iex或者用 npm(需要 Node.js 18+):
npm 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换成实际 token):
curl -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_URL="https://taotoken.net/api" export ANTHROPIC_AUTH_TOKEN="sk-你的TaoToken密钥" # Obsidian 集成 export OBSIDIAN_API_TOKEN="你的Obsidian插件token" export OBSIDIAN_VAULT_PATH="$HOME/Documents/Obsidian Vault" export OBSIDIAN_API_PORT="27124"生效:
source ~/.zshrc3.2 ~/.claude/settings.json 完整片段
这是 Claude Code 实际读取的配置文件,路径必须是~/.claude/settings.json,JSON 格式:
{ "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结尾不要带/v1,TaoToken 的 API 根路径就是https://taotoken.net/api;ANTHROPIC_AUTH_TOKEN就是你在 api-keys 页面拿到的 Key;permissions.allow里放行脚本目录,避免每次调用都弹确认。
3.3 用户级 CLAUDE.md 指令
创建~/.claude/CLAUDE.md,让 Claude Code 在所有项目里都知道怎么操作 Obsidian:
# 用户全局指令 ## Obsidian 笔记操作 当用户要求保存笔记、记录想法或整理信息时,使用以下工具: ### 写入笔记 调用脚本:`~/.claude/scripts/obsidian-write.sh "<文件名>" "<内容>"` 脚本会将笔记保存到 Obsidian Vault 的 `00-Inbox/` 目录。 ### 笔记格式规范 - 所有笔记必须包含 YAML frontmatter(date、tags、type、status: inbox、source: claude) - 技术笔记包含:背景、核心内容、代码示例、相关链接 - Bug 记录包含:问题描述、根本原因、解决方案、防止复现措施 ### 文件命名规范 格式:`{类型}-{简短描述}-{YYYYMMDD}.md` 示例:`tech-react18-concurrent-mode-20260420.md`3.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_BASE="https://127.0.0.1:${API_PORT}" INBOX_DIR="00-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; charset=UTF-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 Code:
claude输入:
请记录笔记:今天学习了 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_TOKEN="new_token" echo $OBSIDIAN_API_TOKEN如果 Claude Code 报 401 且指向 TaoToken,检查ANTHROPIC_AUTH_TOKEN是否和 api-keys 页面一致,注意不要带多余空格。
5.2 local proxy failed / Connection Refused
curl: (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 中文文件名 404
URL 编码问题。脚本里已经用 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.sh`5.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_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=coding_plan
想先验证模型对话效果,可以在模型对话页面试几条 prompt:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=model_chat
需要管理多个项目的 Key,去控制台:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=console
接入文档和参数说明在这里:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=doc
Claude Code 专用接入说明:https://taotoken.net/ClaudeCodeAnthropic?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=claudecode
最后分享一个我踩过的坑:定时任务里launchd不读~/.zshrc,环境变量必须在 plist 的EnvironmentVariables里写死,否则脚本跑起来 token 是空的,日志里只会看到 401,排查半天才发现是环境变量没继承。