🚀 Herald
Herald 是一个自托管的 MCP 服务器,它使用 Anthropic 的官方 Custom Connectors 协议,将 Claude Chat 与 Claude Code 连接起来。让你可以直接在手机上编写代码,真正实现随时随地进行代码开发。
🚀 快速开始
前提条件
安装
curl -fsSL https://raw.githubusercontent.com/btouchard/herald/main/install.sh | sh
或者从源代码构建(需要 Go 1.26+)
git clone https://github.com/btouchard/herald.git
cd herald && make build
配置
mkdir -p ~/.config/herald
cp configs/herald.example.yaml ~/.config/herald/herald.yaml
运行
herald serve
编辑 ~/.config/herald/herald.yaml,添加你的域名和项目:
server:
host: "127.0.0.1"
port: 8420
public_url: "https://herald.yourdomain.com"
auth:
client_id: "herald-claude-chat"
projects:
my-api:
path: "/home/you/projects/my-api"
description: "Main backend API"
default: true
allowed_tools:
- "Read"
- "Write"
- "Edit"
- "Bash(git *)"
- "Bash(go *)"
- "Bash(make *)"
git:
auto_branch: true
branch_prefix: "herald/"
然后从 Claude Chat 进行连接:
- Claude Chat → 设置 → 自定义连接器
- 添加连接器:
https://herald.yourdomain.com/mcp
- 通过 OAuth 进行身份验证
- 完成 —— Claude Chat 现在有 10 个新工具来控制你的工作站
使用 ngrok 快速开始(无需反向代理)
如果你没有域名或反向代理,可以使用 ngrok 通过 HTTPS 立即暴露 Herald:
获取 ngrok 认证令牌
在 ngrok.com 上注册(免费计划即可),并从 仪表盘 获取认证令牌。
在配置中启用隧道
编辑 ~/.config/herald/herald.yaml:
tunnel:
enabled: true
provider: "ngrok"
authtoken: "2abc..."
运行 Herald
herald serve
使用横幅中显示的 ngrok URL 从 Claude Chat 进行连接。就是这么简单 —— 无需 Traefik、Caddy 或 DNS 设置。
注意:ngrok 隧道是可选的。如果你已经有反向代理(Traefik/Caddy),将 tunnel.enabled 设置为 false,并像往常一样使用你的域名。
完整配置参考
server:
host: "127.0.0.1"
port: 8420
public_url: "https://herald.yourdomain.com"
log_level: "info"
log_file: ""
auth:
client_id: "herald-claude-chat"
access_token_ttl: 1h
refresh_token_ttl: 720h
redirect_uris:
- "https://claude.ai/oauth/callback"
- "https://claude.ai/api/oauth/callback"
- "https://claude.ai/api/mcp/auth_callback"
database:
path: "~/.config/herald/herald.db"
retention_days: 90
execution:
claude_path: "claude"
model: "claude-sonnet-4-5-20250929"
default_timeout: 30m
max_timeout: 2h
work_dir: "~/.config/herald/work"
max_concurrent: 3
max_prompt_size: 102400
max_output_size: 1048576
env:
CLAUDE_CODE_ENTRYPOINT: "herald"
CLAUDE_CODE_DISABLE_AUTO_UPDATE: "1"
projects:
my-api:
path: "/home/you/projects/my-api"
description: "Main backend API"
default: true
allowed_tools:
- "Read"
- "Write"
- "Edit"
- "Bash(git *)"
- "Bash(go *)"
- "Bash(make *)"
max_concurrent_tasks: 1
git:
auto_branch: true
auto_stash: true
auto_commit: true
branch_prefix: "herald/"
tunnel:
enabled: false
provider: "ngrok"
authtoken: ""
rate_limit:
requests_per_minute: 200
burst: 100
✨ 主要特性
核心特性
- 原生 MCP 桥接 —— 使用 Anthropic 的官方自定义连接器协议,不是黑客手段,不是包装器,也不是代理。
- 异步任务执行 —— 启动任务、检查进度、获取结果。Claude Code 在后台运行,你可以同时做其他事情。
- Git 分支隔离 —— 每个任务在自己的分支上运行,主分支保持不变。
- 会话恢复 —— 支持多轮 Claude Code 对话,可从上次中断的地方继续。
- 双向桥接 —— Claude Code 可以通过
herald_push 将会话上下文推送到 Herald,以便在其他设备上进行远程监控和继续操作。
多项目支持
- 多个项目 —— 可以根据需要配置任意数量的项目,每个项目都有自己的设置。
- 按项目限制工具使用 —— 精确控制 Claude Code 可以使用的工具,每个项目都有完整的沙箱环境。
操作特性
- MCP 推送通知 —— Herald 通过 MCP 服务器通知直接将任务更新推送到 Claude Chat,无需轮询。
- SQLite 持久化 —— 任务在服务器重启后仍然存在,拥有完整的历史记录,并且可以完全搜索。
工程特性
- 单二进制文件 —— 一个约 15MB 的 Go 可执行文件,无需 Docker、运行时或 node_modules。
- 零 CGO —— 纯 Go 实现,可交叉编译到 Linux、macOS、Windows、ARM 等平台。
- 6 个依赖项 —— chi、mcp-go、modernc/sqlite、uuid、yaml、testify,这就是整个依赖树。
💻 使用示例
基础用法
你可以在沙发上,用手机打开 Claude Chat 并输入:
"Refactor the auth middleware in my-api to use JWT instead of session cookies. Run the tests."
四分钟后,任务完成。分支创建、代码重构、测试通过、更改提交,所有工作都由你的工作站完成,你甚至不需要打开笔记本电脑。
高级用法
正向流程:Claude Chat → Herald → Claude Code
You (Claude Chat) Herald Claude Code
───────────────── ────── ───────────
"Refactor auth..." ──► start_task
→ creates branch
→ spawns Claude Code ──► reads codebase
refactors code
runs tests
commits changes
◄── task_id: herald-a1b2c3d4
"How's it going?" ──► check_task
◄── ✅ Completed (4m 12s)
4 files changed (+127/-23)
"Show me the diff" ──► get_diff
◄── auth/middleware.go
+func ValidateJWT(...)
-func CheckSession(...)
反向流程:Claude Code → Herald
如果你在终端中工作,想在手机上继续,可以让 Claude Code 将会话推送到 Herald:
You (terminal) Claude Code Herald
────────────── ─────────── ──────
"Push this to Herald" ──► herald_push
→ session_id, summary,
files, branch ──► linked task created
🔗 visible in list_tasks
You (phone, later) Claude Chat Herald
────────────────── ─────────── ──────
"What sessions are list_tasks
waiting for me?" ──► (status: linked) ──► 🔗 herald-a1b2c3d4
my-api / feat/auth
"Resume that session" ──► start_task
(session_id) ──► picks up where you left off
📚 详细文档
MCP 工具
Herald 通过 MCP 协议自动向 Claude Chat 暴露 10 个工具:
| 工具 |
功能 |
start_task |
启动一个 Claude Code 任务,立即返回一个 ID,支持优先级、超时、会话恢复和 Git 分支选项。 |
check_task |
检查任务状态和进度,可选择包含最近的输出。 |
get_result |
获取已完成任务的完整结果(summary、full 或 json)。 |
list_tasks |
列出任务,并可根据状态、项目、时间范围进行过滤。 |
cancel_task |
取消正在运行或排队的任务,可选择恢复 Git 更改。 |
get_diff |
获取任务分支或未提交更改的 Git 差异。 |
list_projects |
列出配置的项目及其 Git 状态。 |
read_file |
从项目中读取文件(路径安全,无法跳出项目根目录)。 |
herald_push |
将 Claude Code 会话推送到 Herald,以便在其他设备上进行远程监控和继续操作。 |
get_logs |
查看日志和活动历史记录。 |
🔧 技术细节
架构
Claude Chat (mobile/web)
→ HTTPS (MCP Streamable HTTP + OAuth 2.1)
→ Traefik / Caddy (TLS termination)
→ Herald (Go binary, port 8420)
├── MCP Handler (/mcp)
├── OAuth 2.1 Server (PKCE, token rotation)
├── Task Manager (goroutine pool, priority queue)
├── Executor Registry (pluggable backends, default: Claude Code)
├── SQLite (persistence)
└── MCP Notifications (server push via SSE)
设计原则:单二进制文件(所有内容编译到一个 Go 可执行文件中)、异步优先(每个任务是一个 goroutine)、无状态 MCP 与有状态后端、故障安全(Herald 崩溃不会终止正在运行的 Claude Code 进程)。
技术栈
| 组件 |
选择 |
原因 |
| 语言 |
Go 1.26 |
单二进制文件、交叉编译、goroutine |
| MCP |
mcp-go |
可流式 HTTP,官方协议支持 |
| 路由器 |
chi |
轻量级,与标准库兼容 |
| 数据库 |
modernc.org/sqlite |
纯 Go,零 CGO |
| 日志记录 |
log/slog |
Go 标准库,结构化 |
| 配置 |
gopkg.in/yaml.v3 |
标准 YAML |
6 个直接依赖项,无 ORM,无日志框架,无构建工具链。
安全机制
Herald 将 Claude Code 暴露到网络中,因此安全至关重要:
| 层面 |
保护措施 |
| 网络 |
仅绑定到 127.0.0.1,通过内置的 ngrok 隧道或反向代理(Traefik/Caddy)实现 HTTPS。 |
| 认证 |
使用 OAuth 2.1 与 PKCE,每个请求都需要有效的 Bearer 令牌。 |
| 令牌 |
访问令牌有效期为 1 小时,刷新令牌有效期为 30 天,每次使用时轮换。 |
| 文件系统 |
所有文件操作都有路径遍历保护,阻止符号链接逃逸。 |
| 执行 |
按项目限制工具使用,不使用 --dangerously-skip-permissions。 |
| 速率限制 |
每个令牌每分钟 200 个请求(可配置)。 |
| 超时 |
每个任务都有截止时间(默认 30 分钟),防止进程失控。 |
| 提示信息 |
原封不动地传递给 Claude Code,无注入、无增强、无重写。 |
| 审计 |
每个操作都记录时间戳和身份信息。 |
📄 许可证
本项目采用 AGPL-3.0 许可证。由 Benjamin Touchard 开发。
如果你觉得 Herald 节省了你的时间,请在 GitHub 上给项目点个星,这有助于其他人发现该项目。
路线图
| 版本 |
状态 |
重点 |
| v0.1 |
✅ 已完成 |
核心 MCP 服务器、异步任务、Git 集成、OAuth 2.1、SQLite |
| v0.2 |
🚧 进行中 |
共享内存 —— Claude Chat 和 Claude Code 之间的双向上下文 |
| v0.3 |
🚀 未来 |
稳定 API、插件系统 |
如果你有想法,请 提交一个 issue,我们会根据用户需求进行开发。
贡献
Herald 处于早期 alpha 阶段,这是塑造项目的最佳时机。
git clone https://github.com/btouchard/herald.git
cd herald
make build && make test
git checkout -b feat/your-feature
make lint && make test
提交信息遵循 Conventional Commits 规范(feat:、fix:、refactor:、docs:)。
无论是修复 bug、添加新的通知后端还是改进文档,所有贡献都非常欢迎。
为什么选择 Herald?
| 比较项 |
Herald |
复制粘贴工作流 |
其他工具 |
| 官方协议 |
MCP 自定义连接器 |
无 |
自定义 API,不稳定 |
| 代码本地存储 |
始终 |
是 |
取决于具体工具 |
| 支持手机使用 |
原生支持 |
否 |
很少支持 |
| 自托管 |
100% |
无 |
通常是 SaaS |
| 依赖项 |
6 个 |
无 |
50 - 200+ |
| 设置时间 |
约 5 分钟 |
无 |
30 分钟以上 |
| 需要 CGO |
否 |
无 |
通常需要 |
Herald 使用 Anthropic 为其自身集成构建的相同协议,无需逆向工程、非官方 API 或可能在下次更新时失效的黑客手段。