黑曜岩远程mcp
自托管 主控程序 无头黑曜石金库服务器。它允许远程AI客户端通过HTTPS对保险库进行读写访问 无需在同一台机器上运行Obsidian桌面应用程序。
它直接从磁盘上的vault文件工作,不需要黑曜石应用程序或同步服务。这适用于服务器环境:家庭服务器、NAS机箱、VPS和其他设置,其中您的保险库位于磁盘上,您希望通过Claude.ai等应用程序的远程MCP端点公开它。
安全性和范围
远程MCP是对保险库的强大访问——使用HTTPS,并考虑服务监听的位置。
内置保护措施:
- OAuth 2.1+PKCE 可选
MCP_CLIENT_SECRET论代币交换 - 固定不记名代币 (
MCP_STATIC_BEARER_TOKEN)对于跳过浏览器身份验证的客户端 - CORS分配 (
CORS_ALLOWED_ORIGINS)适用于基于浏览器的客户端 - Vault路径沙盒 --针对vault根目录验证的所有路径
.mcpignore阻止MCP访问的特定路径VAULT_READ_ONLY阻止所有写入的模式
它包括什么
服务器当前公开了这些工具:
| 工具 | 说明 |
|---|---|
vault_context | 阅读由配置的vault指导说明 VAULT_CONTEXT_PATH,或回退到 AGENTS.md / CLAUDE.md |
vault_read | 完整注释文本(mode 完整、默认)或列出一个文件夹级别(mode list; path "" =保险库根) |
vault_outline | 全部 # 注释中的标题(每行一个);使用前 vault_read_section |
vault_read_section | 正文在一个标题下(heading =无文本 #不区分大小写 |
vault_frontmatter | 从笔记中读取YAML frontmatter;可选的 property 对于单个密钥 |
vault_links | 阅读外发维基链接和可选反向链接 |
vault_create | 创建新笔记 |
vault_update | 替换笔记的全部内容 |
vault_set_frontmatter_property | 在不重写注释体的情况下设置一个frontmatter属性 |
vault_edit | 在注释中添加、预置或替换精确的文本 |
vault_trash | 将笔记移动到 .trash |
vault_search_title | 按文件名查找笔记(部分或精确);返回路径 vault_read |
vault_search_content | 注释体中的正则表达式搜索;可选的 folder 查看大型保险库 |
vault_daily_note | 使用可配置的路径模板阅读或创建每日笔记 |
快速开始
运行时间。 服务器是TypeScript 包子。正常使用时没有单独的构建步骤:Bun运行 src/server.ts 直接。安装依赖项 bun install (Express、MCP SDK和一些库——请参阅 package.json).
磁盘上的保险库。 将服务器指向vault根目录 VAULT_PATH,或者不设置它并使用黑曜石 obsidian.json 发现(详细信息请参见 保险库路径 在......下面
git clone https://github.com/nweii/obsidian-remote-mcp.git
cd obsidian-remote-mcp
bun install
export VAULT_PATH=/absolute/path/to/your/vault
export MCP_CLIENT_ID=dev
bun run src/server.tsbun start 运行相同的入口点(package.json 将其映射到 bun run src/server.ts).
进程侦听端口 3456 默认情况下。MCP端点为 POST /mcp 在该港口;OAuth元数据在以下目录下提供 /.well-known/oauth-authorization-server.
要使服务器可从互联网访问(Claude.ai和其他远程客户端需要),请参阅 部署 在......下面
部署
码头工人
将此另存为 docker-compose.yml 在克隆的repo目录中:
services:
obsidian-remote-mcp:
image: oven/bun:1 # pre-built Bun runtime — no local Bun install needed
working_dir: /app
restart: unless-stopped
environment:
MCP_CLIENT_ID: your-client-id
MCP_CLIENT_SECRET: your-client-secret # optional
MCP_BASE_URL: https://mcp.example.com
VAULT_PATH: /vault # path inside the container (mapped by volumes below)
CORS_ALLOWED_ORIGINS: https://claude.ai
PORT: 3456
# TOKEN_STORE_PATH: /app/data/tokens.json # uncomment to persist OAuth sign-ins across restarts
volumes:
- ./:/app # mounts the repo into the container
- /path/to/your/vault:/vault # left = path on your machine, right = path inside container
# - ./data:/app/data # uncomment to persist TOKEN_STORE_PATH on the host
command: ["bun", "run", "src/server.ts"]
ports:
- "3456:3456" # host:container — access on http://localhost:3456docker compose up -d # start in background
docker compose logs -f # watch outputHTTPS和 MCP_BASE_URL
远程MCP和OAuth需要 超文本传输安全协议.使用反向代理(Caddy、nginx、Cloudflare Tunnel等)在应用程序前处理TLS,并公开一个公共URL,如 https://mcp.example.com.Set MCP_BASE_URL 在该源的服务器上 没有 这 /mcp 路径——它必须与用户在浏览器栏中看到的内容相匹配。
如果您使用Cloudflare Zero Trust,一个实用的模式是设置身份门 仅 上 /authorize,因此用户登录以批准访问 /.well-known/*, /oauth/token,以及 /mcp 保持与协议的联系。
环境变量
在服务器进程上设置这些(编写 environment:、Portainer、外壳 export等等):
MCP_CLIENT_ID=your-client-id
MCP_CLIENT_SECRET=your-client-secret # optional
MCP_BASE_URL=https://mcp.example.com
MCP_ALLOWED_REDIRECT_URIS=https://claude.ai/api/mcp/auth_callback # optional
VAULT_PATH=/path/to/your/vault # optional if obsidian.json is available
OBSIDIAN_VAULT_ID=personal # optional when obsidian.json contains multiple vaults
VAULT_DISPLAY_NAME=Personal # optional; defaults to the vault directory name
VAULT_CONTEXT_PATH=AGENTS.md # optional; defaults to AGENTS.md, then CLAUDE.md
DAILY_NOTE_PATH_TEMPLATE=Daily/{YYYY}-{MM}-{DD}.md
CORS_ALLOWED_ORIGINS=https://claude.ai # optional; defaults to *
TOKEN_STORE_PATH=./tokens.json # optional
MCP_STATIC_BEARER_TOKEN= # optional; fixed Bearer for /mcp (e.g. mcp-remote + Antigravity)
VAULT_READ_ONLY=true # optional
PORT=3456VAULT_PATH, VAULT_CONTEXT_PATH,以及 DAILY_NOTE_PATH_TEMPLATE 也记录在 保险库路径, Vault上下文注释,以及 每日笔记路径 在本自述的后面。
验证到 /mcp
每 POST /mcp 请求必须发送 Authorization: Bearer ….你可以提供 OAuth, 固定支座,或 两者;然后,每个客户端使用它支持的任何路径。
OAuth(浏览器)
适用于用户可以打开浏览器的客户端。服务器使用 OAuth 2.1:批准日期 /authorize,在以下位置交换短命代码 POST /oauth/token,然后将颁发的访问令牌发送到 Authorization 上 /mcp.
服务器: MCP_CLIENT_ID 是必需的。 MCP_CLIENT_SECRET 是可选的;如果在服务器上设置它,请在每个OAuth客户端中配置相同的值,以便它们在 POST /oauth/token。如果未设置,则该步骤不使用共享密钥——使用HTTPS并限制可以联系到的人 /authorize. MCP_BASE_URL 必须与公共网站来源匹配(否 /mcp). MCP_ALLOWED_REDIRECT_URIS 是一个可选的逗号分隔列表;默认情况下允许Claude的回调。
持续登录: TOKEN_STORE_PATH (默认值 ./tokens.json)在登录后存储OAuth颁发的令牌,以便客户端在服务器重启后幸存下来。
添加为Claude的远程MCP连接器 (仅限付费计划):使用您的基本URL /mcp 包括。在高级设置下,将OAuth客户端ID设置为 MCP_CLIENT_ID,可选地将OAuth客户端密钥发送给您的 MCP_CLIENT_SECRET (如果服务器配置了密钥,则在令牌交换时需要)。在服务器上,设置 MCP_BASE_URL 指向与连接器URL相同的源,没有 /mcp.
光标 mcp.json:
{
"mcpServers": {
"obsidian-vault": {
"url": "https://your-host/mcp",
"auth": {
"CLIENT_ID": "your-mcp-client-id",
"CLIENT_SECRET": "your-mcp-client-secret (optional)"
}
}
}
}游标使用重定向URI cursor://anysphere.cursor-mcp/oauth/callback。将其添加到 MCP_ALLOWED_REDIRECT_URIS 在服务器上(逗号与任何其他客户端分隔,例如Claude的回调)。
固定承载(非浏览器)
对于脚本,Antigravity+ mcp-remote,或任何无法运行浏览器流的客户端。不要同时设置这两个 auth 和 headers 在同一个mcp.json条目上——选择OAuth或固定承载。
集 MCP_STATIC_BEARER_TOKEN 在服务器上;客户端将该字符串发送为 Authorization: Bearer … 在每一个 /mcp 请求。此跳过 /authorize, POST /oauth/token, TOKEN_STORE_PATH 对于那个客户。
反重力 mcp_config.json:
"obsidian-vault": {
"serverUrl": "https://your-host/mcp",
"headers": {
"Authorization": "Bearer YOUR_MCP_STATIC_BEARER_TOKEN"
}
}光标 mcp.json:
{
"mcpServers": {
"obsidian-vault": {
"url": "https://your-host/mcp",
"headers": {
"Authorization": "Bearer YOUR_MCP_STATIC_BEARER_TOKEN"
}
}
}
}通过以下方式桥接stdio mcp-remote:
"obsidian-vault": {
"command": "bunx",
"args": ["-y", "mcp-remote", "https://your-host/mcp", "--transport", "http-only", "--header", "Authorization: Bearer YOUR_MCP_STATIC_BEARER_TOKEN"]
}跨域资源共享
CORS_ALLOWED_ORIGINS 限制哪些 浏览器来源 可以从JavaScript调用API。它与OAuth和 MCP_STATIC_BEARER_TOKEN默认值为 * (允许所有人)。要限制:
CORS_ALLOWED_ORIGINS=https://claude.ai
CORS_ALLOWED_ORIGINS=https://claude.ai,http://localhost:3000设置后,只有列出的来源才会得到反映 Access-Control-Allow-Origin;其他浏览器预检失败。
保险库路径
服务器按以下顺序解析vault根:
VAULT_PATH,如果已设置.config/obsidian/obsidian.json,从当前工作目录或包目录向上查找
如果 obsidian.json 包含多个Vault,集 OBSIDIAN_VAULT_ID 转到要使用的vault条目。
OAuth审批页面中使用的显示名称默认为解析的vault目录名称。你可以用以下命令覆盖它 VAULT_DISPLAY_NAME.
无头/未安装黑曜石
大多数用户只需设置 VAULT_PATH 跳过这个。如果您更喜欢在没有Obsidian的机器上自动发现路径,请自己创建配置文件:
mkdir -p ~/.config/obsidian~/.config/obsidian/obsidian.json:
{
"vaults": {
"personal": {
"path": "/home/user/vaults/personal"
}
}
}使用多个Vault,添加更多条目并设置 OBSIDIAN_VAULT_ID 到你想要的那个。使用绝对路径-- ~ 内部未膨胀 obsidian.json.
Vault上下文注释
vault_context 旨在帮助特工在开始写作之前了解你的保险库结构。默认情况下,它会查找 AGENTS.md 或 CLAUDE.md.
如果您的vault使用不同的引导文件,请设置 VAULT_CONTEXT_PATH 指向您希望工具读取的相对路径。
如果你不想维护一个,服务器仍然可以在没有它的情况下工作。
每日笔记路径
vault_daily_note 用途 DAILY_NOTE_PATH_TEMPLATE,默认为:
Daily/{YYYY}-{MM}-{DD}.md这只是一个方便的工具。许多保管库使用不同的每日笔记布局,因此您可能希望覆盖它。
支持的令牌:
{YYYY}:4位数年份{YY}:2位数年份{MM}:2位数月份{M}:没有零填充的月份{DD}:2位数日{D}:没有零填充的日子{MMM}:短月份名称,如Mar{MMMM}:完整月份名称,如March{dd}:简短的工作日名称,如Th{ddd}:简短的工作日名称,如Mon{dddd}:完整的工作日名称,如Monday
示例:
DAILY_NOTE_PATH_TEMPLATE=Daily/{YYYY}/{YYYY}-{MM}-{DD}.md
DAILY_NOTE_PATH_TEMPLATE=Journal/{YYYY}-{MM}-{DD}-{dddd}.md
DAILY_NOTE_PATH_TEMPLATE=Journal/{YYYY}/{MMM}/{D}-{ddd}.md备注
MCP和HTTP
GET /mcp回报405,不404,因此可流式传输的HTTP客户端知道服务器只接受MCPPOST.
Vault访问和工具默认值
- 所有vault路径都会根据解析的vault根进行验证,以防止目录遍历。
.mcpignore在vault根目录中,可以阻止所有MCP访问的路径。VAULT_READ_ONLY=true阻止所有写入操作。vault_search_title默认为limit=50;vault_search_content默认为limit=20.限值可调;0意味着没有限制。vault_frontmatter和vault_set_frontmatter_property让代理使用frontmatter属性,而无需读取或重写整个音符体。
测试
bun test