黑曜石云MCP

在云中部署具有同步支持的黑曜石MCP服务器。在任何设备(包括手机)上从Claude.ai访问您的保险库。
这是什么?
此存储库提供基础设施即代码来部署基于云的 黑曜石 实例与a 主控程序 (模型上下文协议)服务器。这使得像克劳德这样的人工智能助手可以在任何地方读写你的黑曜石金库。
问题: Obsidian在本地运行,因此当您在移动设备上或使用基于云的AI界面(如Claude.AI)时,AI助手无法访问您的保险库。
解决方案: 在启用同步的情况下在云中运行Obsidian,并通过OAuth保护的MCP服务器公开它。
建筑
该系统由两个主要部分组成:a Hetzner云服务器 运行Obsidian和MCP服务器,以及 Cloudflare工作人员 处理OAuth身份验证。
graph LR
subgraph "Hetzner Server (Docker Compose)"
direction TB
C["Caddy
:80, :443
Auto HTTPS"]
M["MCP Server
:3000 (internal)
Token Introspection"]
O["Obsidian
:27123 (internal)
:3001 (GUI)"]
C --> M --> O
end
subgraph "Cloudflare"
W["Worker
OAuth + Introspect"]
end
subgraph "External"
GH["GitHub OAuth"]
LE["Let's Encrypt"]
SYNC["Obsidian Sync"]
end
W --> GH
C --> LE
O --> SYNC
M -.->|"Token Introspection"| W详细组件视图
graph TB
subgraph "User Devices"
claude["Claude.ai
(any device)"]
browser["Browser
(initial setup)"]
end
subgraph "Cloudflare Edge"
worker["Cloudflare Worker
OAuth Provider"]
kv["KV Store
(tokens, clients)"]
do["Durable Object
(session state)"]
worker --- kv
worker --- do
end
subgraph github["GitHub"]
gh_oauth["GitHub OAuth"]
end
subgraph "Hetzner Cloud Server"
caddy["Caddy
Automatic HTTPS"]
mcp["MCP Server
(Token Introspection)"]
obsidian["Obsidian
+ Sync + Local REST API"]
gui["KasmVNC Web GUI
:3001"]
caddy -->|":443 → :3000"| mcp
mcp -->|"REST API :27123"| obsidian
obsidian --- gui
end
claude -->|"1. MCP Request"| caddy
caddy -->|"2. 401 + Resource Metadata"| claude
claude -->|"3. OAuth Flow"| worker
worker -->|"4. GitHub Login"| gh_oauth
gh_oauth -->|"5. Token"| worker
worker -->|"6. Access Token"| claude
claude -->|"7. MCP + Bearer Token"| caddy
mcp -->|"8. Validate Token"| worker
browser -->|"One-time setup"| gui
style worker fill:#f59e0b,color:#000
style mcp fill:#7c3aed,color:#fff
style obsidian fill:#7c3aed,color:#fff
style caddy fill:#22c55e,color:#000身份验证流程(RFC 7662令牌自检)
MCP服务器和OAuth服务器位于不同的主机上。Claude.ai通过以下方式发现OAuth服务器 受保护资源元数据(RFC 9728),然后通过Cloudflare上的GitHub OAuth进行身份验证。Hetzner MCP服务器通过调用Cloudflare的自检端点来验证令牌。
sequenceDiagram
participant C as Claude.ai
participant H as Hetzner
(MCP Server)
participant CF as Cloudflare
(OAuth Provider)
participant GH as GitHub
(Identity)
Note over C: User adds MCP connector
C->>H: POST /mcp (no token)
H-->>C: 401 Unauthorized
C->>H: GET /.well-known/oauth-protected-resource
H-->>C: {"authorization_servers": ["cloudflare-worker-url"]}
C->>CF: GET /.well-known/oauth-authorization-server
CF-->>C: {endpoints...}
C->>CF: POST /register (Dynamic Client Registration)
CF-->>C: {client_id, client_secret}
C->>CF: GET /authorize (+ PKCE)
CF->>GH: GitHub OAuth redirect
GH-->>CF: Authorization code
Note over CF: Verify email ∈ whitelist
CF-->>C: Authorization code
C->>CF: POST /token (code + code_verifier)
CF-->>C: Access token (opaque)
Note over C: MCP connection established
C->>H: POST /mcp + Bearer token
H->>CF: POST /introspect (token)
CF-->>H: {"active": true, "sub": "..."}
H-->>C: MCP response (tools, resources)重要限制
部署后需要手动执行步骤。 基础设施部署、HTTPS和OAuth是完全自动化的,但有两件事需要通过Web GUI手动设置:
- 黑曜石同步登录 --Obsidian Sync没有无头CLI身份验证。您必须通过Web GUI登录一次。
- 本地REST API插件 --MCP服务器通过以下方式与Obsidian通信 本地REST API 社区插件。您必须手动安装和配置它:
- 打开黑曜石设置(在Web GUI中) - 首选 社区插件 → 浏览→ 搜索 “本地REST API” - 安装并启用插件 - 首选 设置→ 本地REST API: - 启用 “绑定到所有网络接口” (Docker网络需要) - 复制 API密钥 如插件设置所示 - 跑吧 “配置API密钥” 带有复制密钥的GitHub工作流
完成这两个步骤后,Sync和MCP服务器会自动运行。
先决条件
- Hetzner云帐户 — 在这里注册
- 黑曜石同步许可证 — 拿过来
- GitHub账号 --对于OAuth身份提供者
- Cloudflare帐户 — 在这里注册 (免费版作品)
- 域名 --对于HTTPS(子域工作。,
mcp.yourdomain.com) - SSH密钥对 --用于服务器访问
快速开始
步骤1:Cloudflare Worker设置
Cloudflare Worker充当Claude.ai的OAuth提供者。
- 创建GitHub OAuth应用程序:
- 首选 - 授权回调URL: https://.workers.dev/callback - 注意 客户端ID 和 客户端密钥
- 部署Worker:
cd cloudflare-mcp-server
npm install
npx wrangler login
# Create KV namespace
npx wrangler kv namespace create OAUTH_KV
# Update wrangler.jsonc with the KV namespace ID
# Set secrets
npx wrangler secret put GITHUB_CLIENT_ID
npx wrangler secret put GITHUB_CLIENT_SECRET
npx wrangler secret put COOKIE_ENCRYPTION_KEY # openssl rand -base64 32
# Deploy
npx wrangler deploy- 更新GitHub OAuth应用程序 带有已部署工作URL的回调URL。
步骤2:DNS设置
创建一条A记录,将您的域指向您的服务器IP:
| 类型 | 名称 | 值 |
|---|---|---|
A. mcp | `` |
(部署后您将获得IP,然后更新DNS。)
第三步:GitHub的秘密
将这些秘密添加到您的分叉存储库中:
| 机密 | 描述 |
|---|---|
HCLOUD_TOKEN | Hetzner Cloud API代币 |
SSH_PUBLIC_KEY | 您的SSH公钥 |
SSH_PRIVATE_KEY | 您的SSH私钥 |
VNC_PASSWORD | Web GUI访问密码 |
步骤4:部署Hetzner服务器
- 首选 行动 → 部署基础设施 → 运行工作流
- 输入您的域名(例如。,
mcp.yourdomain.com) - 等待3-5分钟进行部署+SSL证书
步骤5:配置黑曜石
- 更新DNS 使用工作流输出中的服务器IP
- 打开Web GUI:
https://:3001
- 用户名: admin - 密码:您的 VNC_PASSWORD
- 登录黑曜石同步 在GUI中
- 安装并配置“本地REST API”插件:
- 首选 设置→ 社区插件→ 浏览 - 搜索 “本地REST API” 并安装它 - 启用插件 - 首选 设置→ 本地REST API: - 启用 “绑定到所有网络接口” - 复制 API密钥
- 运行“配置API密钥”工作流程 使用复制的密钥
步骤6:配置Claude.ai
在Claude.ai设置中,添加自定义MCP连接器:
| 字段 | 值 |
|---|---|
| 服务器URL | https://mcp.yourdomain.com/mcp |
Claude.ai将自动:
- 通过受保护的资源元数据发现OAuth服务器
- 将您重定向到GitHub进行登录
- 身份验证成功后建立MCP连接
步骤7:禁用Web GUI
初始设置后,禁用Web GUI以提高安全性:
- 首选 行动 → 切换Web GUI访问 → 禁用
电子邮件白名单
访问受到GitHub电子邮件的限制。允许的电子邮件配置在:
cloudflare-mcp-server/src/github-handler.tsconst ALLOWED_EMAILS = new Set(["your-email@example.com"]);组件
Hetzner服务器
| 集装箱 | 用途 | 港口 |
|---|---|---|
| 卡迪 | 反向代理,自动HTTPS | 80,443(公共) |
| MCP服务器 | 黑曜石MCP与代币内省 | 3000(内部) |
| 黑曜石 | 带同步+本地REST API的Vault | 27123(内部),3001(GUI) |
Cloudflare工作人员
| 终点 | 目的 |
|---|---|
/.well-known/oauth-authorization-server | OAuth发现(RFC 8414) |
/.well-known/oauth-protected-resource | 资源元数据(RFC 9728) |
/authorize | OAuth授权 |
/callback | GitHub OAuth回调 |
/token | 代币兑换 |
/register | 动态客户端注册(RFC 7591) |
/introspect | 令牌自检(RFC 7662) |
MCP服务器环境
| 变量 | 描述 |
|---|---|
MCP_AUTH_MODE | introspection --通过远程端点验证令牌 |
TOKEN_INTROSPECTION_URL | Cloudflare的URL /introspect 端点 |
OBSIDIAN_API_KEY | 本地REST API插件密钥 |
OBSIDIAN_BASE_URL | 内部黑曜石URL(http://obsidian:27123) |
MCP_TRANSPORT_TYPE | http --可流式HTTP传输 |
GitHub工作流
| 工作流 | 描述 |
|---|---|
| 部署基础设施 | 使用黑曜石+MCP+Cady创建Hetzner服务器 |
| 配置API密钥 | 在服务器上设置REST API密钥 |
| 切换Web GUI访问 | 通过启用/禁用GUI端口 DOCKER-USER iptables链 |
| 更新Docker镜像 | 提取最新图像并重新启动容器 |
| 破坏基础设施 | 删除所有Hetzner资源(键入“DESTROY”进行确认) |
配置
| 变量 | 描述 | 默认值 |
|---|---|---|
server_type | Hetzner服务器类型 | cx23 |
server_location | 服务器位置 | nbg1 |
enable_ipv4 | 启用IPv4(每月+0.50欧元) | true |
服务器类型
| 类型 | 规格 | 月成本 |
|---|---|---|
cx23 | 2个vCPU,4 GB RAM | 约3.56欧元 |
cx33 | 4个vCPU,8 GB内存 | ~5.94欧元 |
成本
| 组件 | 每月成本 |
|---|---|
| Hetzner cx23服务器 | ~3.56欧元 |
| IPv4地址 | 0.50欧元 |
| Cloudflare Worker | 免费层 |
| 域名 | ~ 1欧元(如果需要) |
| 黑曜石同步 | 4-8美元 |
| 总计 | ~ 8-12欧元/月 |
安全
认证
| 图层 | 方法 | 详细信息 |
|---|---|---|
| MCP服务器 | OAuth 2.1 | 通过Cloudflare Worker,通过RFC 7662自检验证令牌 |
| OAuth身份 | GitHub OAuth | 电子邮件白名单限制访问 |
| Web GUI | 基本身份验证 | 用户名: admin,密码: VNC_PASSWORD |
| GUI防火墙 | iptables | DOCKER-USER链块端口3001禁用时 |
超文本传输安全协议
- 自动证书 通过Let’s Encrypt
- 自动续订 由Caddy处理
- 无人工干预 必需的
网络
- MCP仅通过HTTPS --通过Caddy的443端口
- 仅限REST API内部 --端口27123未暴露在外
- Web GUI受限 --不需要时可以禁用
- 防火墙规则 --仅打开必要的端口(22、80、443)
故障排除
SSL证书无效:
- 确保DNS A记录指向正确的IP
- 等待5分钟以获得证书
- 检查球童日志:
docker logs caddy
MCP服务器返回401:
- 令牌自检可能失败
- 检查MCP日志:
docker logs obsidian-mcp - 验证Cloudflare Worker是否已部署,以及
/introspect端点工作
OAuth重定向错误:
- 验证GitHub OAuth应用程序回调URL是否与工作URL匹配
- 在中检查电子邮件白名单
github-handler.ts
Web GUI无法访问:
- 检查DOCKER-USER iptables规则是否被阻塞:
iptables -L DOCKER-USER -n - 使用“启用”运行切换Web GUI工作流
清理
要摧毁所有基础设施:
# Via GitHub Actions (recommended)
# Actions → Destroy Infrastructure → type "DESTROY"
# Or via Terraform
cd terraform
terraform destroy存储库结构
obsidian-cloud-mcp/
├── cloudflare-mcp-server/ # Cloudflare Worker (OAuth + Introspection)
│ ├── src/
│ │ ├── index.ts # MCP proxy + OAuthProvider
│ │ ├── github-handler.ts # GitHub OAuth + email whitelist + /introspect
│ │ ├── utils.ts # OAuth helpers
│ │ └── workers-oauth-utils.ts # CSRF, state management
│ └── wrangler.jsonc # Cloudflare config
├── docker/ # Docker Compose for Hetzner
│ ├── docker-compose.yml
│ ├── Caddyfile
│ └── .env.example
├── mcp-server/ # MCP server Dockerfile
│ └── Dockerfile
├── scripts/
│ ├── cloud-init.yml # Server provisioning
│ ├── setup-mcp.sh # Manual setup alternative
│ └── health-check.sh # Health monitoring
├── .github/workflows/
│ ├── deploy.yml # Deploy Hetzner infrastructure
│ ├── configure-api-key.yml # Set Obsidian API key
│ ├── toggle-gui.yml # Enable/disable Web GUI
│ ├── update.yml # Update Docker images
│ └── destroy.yml # Destroy infrastructure
└── terraform/ # Hetzner IaC许可证
Apache 2.0——请参阅 许可证
