Local CLI
The most private path: zero infrastructure, fully on-device. The brain (Qwen2.5 / Ollama) and tools (stdio MCP) all run locally. Nothing leaves the box.
// run it anywhere
Start on the local CLI — zero infra, fully on-device. Scale out by wrapping orchestrator.run behind a thin service. Keep the model local even when hosted, so the privacy story holds.
The most private path: zero infrastructure, fully on-device. The brain (Qwen2.5 / Ollama) and tools (stdio MCP) all run locally. Nothing leaves the box.
Wrap orchestrator.run behind a thin service — a run_agent
MCP server for Claude Code, or an HTTP/SSE gateway for Telegram/Slack. Put
auth, rate-limits, and a per-tenant allowlist at the edge. Keep the
model local even when hosted; cloud secrets stay in tachibot-mcp.
All requests require Authorization: Bearer <token>. The async-job + SSE shape survives disconnects — resume replay via Last-Event-ID.
export GATEWAY_TOKEN="change-me" GATEWAY_PORT=8787 export TACHIBOT_CMD="npx -y tachibot-mcp" npm run build && node dist/frontends/gateway.js
| Method & path | Response | Purpose |
|---|---|---|
POST /runs{task, maxIterations?} |
202 {run_id} |
Start a run (async job). |
GET /runs/:id |
state + result | Poll run state and final result. |
GET /runs/:id/events |
SSE | Stream step / assistant / tool-result / final / error / heartbeat. |
DELETE /runs/:id |
cancel | Cooperative abort (Ctrl-C semantics). |
A long-running daemon reuses the gateway and lets thin clients attach mid-run.
Last-Event-ID.POST /tasks), recurring schedules, per-task drivers via TACHI_DRIVER, outcome notifications, and durable run logs — read the Standalone page →
Let OpenClaw delegate tasks to tachi-agent over the gateway's HTTP/SSE API. Run the
gateway with a GATEWAY_TOKEN, then use the bundled GatewayClient:
import { GatewayClient } from "tachi-agent"; const tachi = new GatewayClient({ baseUrl: "http://127.0.0.1:8787", token: process.env.TACHI_GATEWAY_TOKEN!, }); const answer = await tachi.runAndWait("research X");
See docs/openclaw-bridge.md for plugin / skill wiring.
Default brain is Qwen2.5 on 127.0.0.1 (no SSRF); tools run over local
stdio. tachi-agent holds no cloud keys — the council's provider keys
live in tachibot-mcp.
MCP server commands come only from config / env (*_CMD), never from a
user or model message — no command injection. The allow list keeps
dangerous tools out unless granted.
Telegram / Slack / HTTP authenticate at the edge — allowed user-ids, app tokens, localhost-only MCP. The task string is data; the agent can only call allowlisted tools, never arbitrary shell.
Search and tool results may carry injection. Mitigate with a bounded allowlist (no shell / file-write by default), treat tool output as untrusted data, and gate any write tool behind approval (roadmap).