OctoBus 本地智能体网关
本地运行的单二进制网关,让 AI 智能体安全、可控地调用企业批准的 API、工具与服务。
按维度查看评分与理由
证据显示:默认绑定 127.0.0.1、capset 方法级暴露(select-method)与按 capset 令牌校验体现最小权限设计(2);但 capset 默认无需令牌、无对智能体调用的人类审批工作流(1)。访问日志 NDJSON、目录协议元数据、数据目录布局说明使数据流透明(2);令牌仅存哈希、secrets 支持文件描述符传递、日志明确排除请求体与凭证(2)。go.mod 依赖全部固定版本,CI 含公开痕迹扫描与静态二进制校验,未见已知严重漏洞(2)。外部影响可控但 Docker 默认监听 0.0.0.0、远程暴露需用户自行做网络控制,扣 1 分(2)。实例支持 stop/restart/delete 但未见服务包版本回滚机制(1)。SECURITY.md 提供联系渠道与响应时限,npm 发布带 provenance(2)。
README 描述与 CI、SDK 测试、示例相互一致,模型(service/instance/capset)自洽(2)。但运行强依赖 node/npm/protoc/git/npm registry 与 GitHub 生态,任何一环不可用即阻断导入与运行,且 Docker 与源码路径并存易造成环境漂移(1)。SDK 测试覆盖参数冲突与缺失参数的明确错误信息(2)。
面向企业智能体 API 网关场景,提供 long-running/on-demand 双模式与计算器示例(2)。能力边界说明充分:流式方法仅限 gRPC、按需模式限制 start/stop、新增方法不自动暴露(2)。MCP 工具命名规则与 --mcp-tool 冲突处理体现触发精度(2)。支持多平台 npm 可选依赖、Docker amd64/arm64、--addr/OCTOBUS_ADDR 环境变量(2)。
README 结构清晰:概述、安装、工作流、协议调用、开发、架构目录(3)。npm/npx/Docker/源码三种安装路径与外部依赖、GOPROXY 故障提示齐全(3)。schema 版本化、npm 包命名一致(2)。有示例与冒烟脚本但无 FAQ(2)。流式限制等部分限制有说明,但无集中的已知限制章节(2)。GPL-3.0 全文在库(3)。CI 采用 semver 标签校验,但未见 CHANGELOG 文件(1)。SECURITY.md 明确责任邮箱与 3 个工作日响应(2)。
输出可用性好:同一方法可通过 gRPC/Connect/MCP 调用,目录返回协议级元数据并提供 OpenAPI(2)。相对直接暴露 API 的方案,capset 模型提供明确边际价值(2)。单二进制 + SQLite + 可选 Docker,部署成本低(2)。
README 的声明(静态二进制、CI 门禁、e2e、npm provenance)可在 ci.yml、SDK 测试中找到对应实现(2)。README、workflow、测试三方相互印证(2)。README 使用限定性措辞(如 'roughly as follows')区分事实与近似描述,未发现夸大声明(2)。本评审未执行任何运行验证,置信度保持 low。
- capset 默认无需访问令牌;接入智能体前务必先添加令牌,否则 Connect RPC/MCP/gRPC/反射均公开可访问。
- 远程暴露(--addr 0.0.0.0 或 Docker 端口映射)时网络访问控制完全由用户负责,建议置于外层 TLS 代理与认证之后。
- 静态评审未执行任何运行验证;功能正确性与测试可复现性未评分。
- 服务包来自 npm/Git 等外部源时,其代码在本机以 Node 子进程运行,应只导入受信任的包。
- 未见 CHANGELOG,升级前请自行核对标签与提交差异。
这个 Agent 能做什么,适合哪些场景?
OctoBus 是长亭科技开源的一个本地运行的单二进制网关(Go 编写的 `octobus` 程序),用于管理可插拔的 Node.js 服务包,并按 capset(能力集)将包内 gRPC 能力暴露给客户端或智能体。守护进程默认监听 `127.0.0.1:9000`,同一端口分发本地管理 API、gRPC、Connect RPC、MCP 流式 HTTP 与 gRPC reflection。核心模型由四层组成:service(含 service.、proto 和 gRPC 实现的 Node.js 服务包)、instance(带独立配置与工作目录的运行实例)、capset(面向智能体或场景的确定性能力集合)、method binding(capset 内实际暴露的 gRPC 方法)。服务包默认以 long-running 模式由守护进程托管为常驻 Node.js gRPC 子进程,也可声明 on-demand 模式按请求启动一次性 `invoke` 子进程。状态存储在 SQLite 中,访问日志以 NDJSON 写入 data 目录下 0600 权限的 access.log,且不记录请求体、密钥或业务元数据。项目以 GPL-3.0 许可发布,可通过 npm、Docker 或源码构建部署。
OctoBus 的守护进程启动本地控制面与数据面,并通过 octobus CLI 管理服务、实例和 capset。导入服务包(octobus service import calculator ./examples/calculator-js)时,它获取并解包 npm/本地目录/Git/HTTP 归档来源,用 protoc 编译 proto 描述符,准备运行目录;service. 支持多种来源并可用 //service-dir 选择包内服务根,--recursive 可批量导入多服务包。创建实例(instance create)后,long-running 模式启动常驻 Node.js gRPC 子进程并做健康检查,on-demand 模式则每请求启动一个 invoke 子进程,通过 stdin/stdout 传递 protobuf 线格式。创建 capset 并 capset add-instance 后,方法可通过三种协议调用:gRPC(保留原方法路径,用 x-octobus-capset/x-octobus-instance 元数据路由,支持四种流式)、Connect RPC(POST /capsets/{id}/connect/{instance}/{service}/{method},仅 unary)、MCP 流式 HTTP(POST /capsets/{capset_id}/mcp,工具名默认为 {service}__{instance}__{method})。capset 可通过 add-token 管理访问令牌(仅存哈希,不存明文),未配置令牌时端点默认公开。配套 SDK @chaitin-ai/octobus-sdk 的 runServiceMain 处理 --runtime serve/invoke/dev 等运行时协议,OpenAPI 端点输出方法级 schema,octobus logs 按 capset/实例/服务过滤查看访问日志。
- 企业平台工程师需要让内部 AI 智能体调用 GitLab 等内部 API,但不希望智能体直接持有系统凭证——可用 capset + 令牌按智能体粒度授权方法子集
- 团队已有一批 Node.js 实现的内部工具脚本,想通过统一 gRPC/Connect/MCP 接口暴露给不同客户端——可将其封装为 OctoBus 服务包导入
- 开发者在本地为 Claude 等 MCP 客户端提供受控工具集——通过
POST /capsets/{id}/mcp流式 HTTP 端点接入 - 安全团队要求所有智能体工具调用有审计记录——access.log 以 NDJSON 记录协议、capset、方法、状态码、耗时等且不含敏感数据
- 运维希望低频工具不占用常驻资源——将服务包声明为 on-demand 模式,按请求启动一次性进程
- 需要多套不同权限的工具目录给不同智能体场景——为每个 capset 用 select-method 精确控制暴露的方法集合
这个 Agent 有哪些优点和局限?
- 单端口多协议:同一
127.0.0.1:9000同时提供 gRPC(含四种流式)、Connect RPC、MCP 流式 HTTP、OpenAPI 和 gRPC reflection,客户端选型灵活 - capset 提供确定性、可枚举的能力授权模型,配合 select-method 可精确到方法级控制智能体可见的工具,且支持按 capset 限定的 gRPC reflection(仅返回已暴露方法的描述符闭包)
- 本地默认绑定 127.0.0.1,令牌仅存校验哈希不存明文,访问日志明确排除请求体、密钥与业务元数据,安全边界清晰
- on-demand 运行模式支持一次性进程调用,适合低频或资源敏感的工具,无需常驻进程
- 提供官方 TypeScript SDK(@chaitin-ai/octobus-sdk)、long-running 与 on-demand 两个完整示例、e2e 测试与 CI,工程化程度高
- 服务包必须是 Node.js 实现(依赖 node/npm),其他语言的后端服务无法直接作为 OctoBus 服务包托管
- 正常服务导入流程强依赖本地工具链:node、npm、protoc、git 必须在 PATH 中,Docker 镜像之外的环境部署有一定门槛
- 默认将 gRPC、Connect RPC、MCP、reflection 在未配置令牌时全部公开可达,若绑定到 0.0.0.0 需自行承担网络访问控制(README 明确说明责任在使用者)
- 流式方法仅支持 gRPC 且仅限 long-running 服务,Connect RPC、MCP 与 on-demand 路径均不支持流式
- 守护进程重启后仅恢复 enabled 且 long-running 的实例,on-demand 实例不支持 start/stop/restart 等持久运行时控制,运维模型需适配
如何安装或部署这个 Agent?
三种方式:
- npm 安装(主包通过平台特定的可选依赖拉取对应的原生 Go 二进制):
bash
npm install -g @chaitin-ai/octobus
octobus serve或免全局安装:npx @chaitin-ai/octobus serve
- Docker:
bash
docker run --rm \
-p 9000:9000 \
-v octobus-data:/var/lib/octobus \
ghcr.io/chaitin/octobus:latest容器默认监听 0.0.0.0:9000,状态存储于 /var/lib/octobus。
- 源码构建(需要 Go 1.26.1 与 Task):
bash
task build
./bin/octobus serve --data-dir .octobus --addr 127.0.0.1:9000正常运行服务导入与实例启动还需在 PATH 中备有 node、npm、protoc 和 git。可用环境变量 OCTOBUS_DATA_DIR、OCTOBUS_ADDR 覆盖默认配置。
如何使用这个 Agent?
- 启动守护进程后确认 CLI 可连接:
./bin/octobus status。 - 导入示例服务包:
./bin/octobus service import calculator ./examples/calculator-js(来源支持本地目录、tgz/tar.gz/zip 归档、npm:、HTTPS Git,可加//service-dir选择服务根)。 - 创建并启动实例:
bash
./bin/octobus instance create calculator-test \
--service calculator \
--config- '{"label":"primary"}' \
--secret- '{"apiToken":"dev-token"}'- 创建 capset 并挂载实例:
bash
./bin/octobus capset create dev --name DevAgent
./bin/octobus capset add-instance dev calculator-test
./bin/octobus catalog dev --all --- 调用(Connect RPC 示例):
bash
curl -X POST \
http://127.0.0.1:9000/capsets/dev/connect/calculator-test/calculator.v1.CalculatorService/Add \
-H 'Content-Type: application/' \
-d '{"left":20,"right":22}'MCP 调用:POST /capsets/dev/mcp,JSON-RPC 方法为 tools/list / tools/call。gRPC 调用通过 grpcurl 加 x-octobus-capset/x-octobus-instance 元数据路由。可选:capset add-token dev local --token-stdin 启用 Bearer 令牌鉴权(gRPC/reflection 用同名 metadata);octobus logs --follow 实时查看访问日志。
这个 Agent 与同类方案有什么区别?
README 未直接点名竞品,但从定位看,它与 MCP 服务器框架(如 FastMCP 等)存在交集:典型 MCP 服务器通常直接在应用进程中注册工具,而 OctoBus 以独立守护进程托管 Node.js 服务包,通过 capset 提供方法级授权、令牌、访问日志与 gRPC/Connect/MCP 多协议暴露,适合需要企业级工具治理的场景;代价是必须以 Node.js 编写服务并接受守护进程+SQLite 的运行模型。
常见问题
没有配置令牌时端点是否公开?
Authorization: Bearer <token>(gRPC/reflection 用同名 metadata)。令牌仅持久化校验哈希,不存明文。我的工具不是 Node.js 写的,能用吗?
service. + proto + package. bin 入口),需要 node/npm 运行。其他语言的工具需要先用 Node.js 封装一层。部署后占用哪些资源、状态存哪里?
.octobus)存放 SQLite 数据库(octobus.db)、服务工件与运行时、实例配置/密钥/日志。守护进程重启时会从 SQLite 恢复 enabled 的 long-running 实例并重启子进程。流式调用支持吗?
暴露到远端安全吗?
--addr 0.0.0.0:9000 或 Docker 映射暴露到网络,README 明确说明网络访问控制由使用者负责,建议配合外层 TLS 代理(客户端用 https://host:port 形式连接)。