Forge-delegate
我打造了 forge-delegate,一個 MCP 伺服器,讓 Claude Code、Codex 或 opencode 把編碼任務交給另一個模型處理。例如撰寫測試、跨檔案重新命名、修正 lint 錯誤、樣板程式碼,或通讀一個大型程式碼庫來回答一個問題。另一個模型會透過 opencode 以完整代理的形式執行。它會自行讀取檔案並進行編輯。你的主要代理只會收到一份簡短摘要,因此它的上下文保持精簡,能專注於決策。透過 ask_model 取得第二意見。你的代理也可以直接向另一個模型提問,沒有代理迴圈,也沒有檔案存取權限,並快速取得回答。當你想讓另一個模型在你代理做出決定前,檢查某個設計決策、某個錯誤理論或某段棘手的程式碼時,這很有用。每個模型都有自己的盲點,而不同的模型往往能捕捉到你漏掉的地方。你的代理會視需要附上上下文來撰寫問題,然後自行權衡答案。只要告訴它類似「問問 DeepSeek 怎麼想」或「向 Kimi 取得第二意見」,並指名任何你已在 opencode 登入的供應商。任何 opencode 支援的供應商皆可。forge-delegate 不持有自己的 API 金鑰。它使用你在 opencode 中設定好的任何內容。因此 DeepSeek、Kimi、OpenAI、Gemini、OpenRouter、自訂的 OpenAI 相容端點,以及透過 Ollama 執行的本機模型都能運作。用 opencode auth login <provider> 登入一次,該供應商的模型就能用來委派。opencode 也附帶不需要帳號的免費模型。你可以設定預設模型、為不同類型的任務儲存預設組合、隨時變更其中任一項,並在背景平行執行多個委派。設定:npx -y forge-delegate setup 它會引導你挑選預設模型,以及要註冊哪些代理。注意事項:- 預設情況下,MCP 指示與技能會引導你的代理使用便宜或免費的模型。它會堅守你的預設模型,不會自行切換到較貴的模型。如果你想要更強的模型,將它設為預設或直接要求它。- 被委派的代理預設可以在不詢問的情況下編輯檔案並執行命令。你可以關閉此行為,但只應指向你信任的儲存庫。- 較小的模型會犯更多錯誤,因此請審查回傳的結果。- 我主要在 Mac 上搭配 Claude Code 使用它。Codex 與 Windows 應該可以運作,但實際使用經驗較少,歡迎回報問題。MIT 授權:https://github.com/MuhamadBarzani/forge-delegate 歡迎提供意見,尤其是關於它擅長處理哪些任務,以及在哪裡有所不足。
文件
forge-delegate
MCP server that delegates coding work from your primary agent (Claude Code, Codex, or opencode) to other AI models, so your main agent's context stays small. The high-volume typing happens in another model's context, usually a cheaper or free one, and only a summary comes back. Full agentic delegation via opencode for real work; direct API calls for second opinions.
Your main agent (the expensive one) keeps architecture, critical logic, and hard decisions. The cheap model grinds through the high-volume, low-risk work (boilerplate, repetitive edits, tests, lint/type fixes) and reports back.
┌──────────────────┐ MCP (stdio) ┌──────────────────┐ opencode run ┌──────────────────┐
│ Claude / Codex / │ ──────────────► │ forge-delegate │ ───────────────► │ opencode + cheap │
│ opencode (primary)│ │ (this server) │ --model cheap │ model │
└──────────────────┘ ◄────────────── └──────────────────┘ ◄─────────────── └──────────────────┘
result: text + session + token usage
Quick start
Web configurator — pick model/targets/scope and get a ready-to-paste command (https://muhamadbarzani.github.io/forge-delegate/). The model picker is backed by the live models.dev catalog — searchable, with free/cheap filters and real prices, so you're picking from actual available models rather than guessing.
npx (recommended — works everywhere, no bash needed):
npx -y forge-delegate setup --model "opencode/deepseek-v4.1-flash-free" --targets "claude,codex,opencode"
That's it — npx bootstraps the package, and setup registers the MCP server with the agents
you chose, sets your default model, and installs a small launcher that keeps the server up to
date. Works on Windows (cmd/PowerShell), macOS, and Linux — no bash needed.
Run setup without flags and it walks you through the choices interactively (defaults in
[brackets], Enter accepts). For the default model it lists every model your opencode can run
and you pick one by number or name; pass any of the flags to skip that prompt. In an automated/non-terminal
run it just uses sensible defaults.
GitHub Pages: enable it with Settings → Pages → Deploy from a branch →
main//docs. The configurator lives atdocs/index.html.install.sh'sFORGE_DELEGATE_REPOdefault (and the raw URL inside it) matters only if you self-host the fallback installer.Working on a checkout yourself?
node cli.mjs setupdoes the same thing.
setup will:
- Register the MCP server with each agent you chose (
--targets claude,codex,opencode). - Set your default model (
--model) so calls can omitmodel. - Install the auto-update launcher (published installs; skipped for a git checkout).
- For Codex, raise the MCP timeouts (
startup_timeout_sec,tool_timeout_sec) above Codex's 10s/60s defaults so inline delegations aren't cut off.
Routing and cost-policy guidance is injected by the MCP server itself into the agent's context
via MCP instructions — no memory-file (CLAUDE.md/AGENTS.md) editing needed.
Then restart your agent and confirm the server is connected: /mcp in Claude Code,
codex mcp, or opencode.
What you need
- Node.js ≥ 18 and opencode v2 or newer installed (the installer can fetch opencode for you).
v2 removed the CLI flags older versions relied on for working directories and variants, and an
unknown flag makes
opencode runprint help and exit successfully — so a pre-v2 binary fails silently. The server checks at startup and warns instead. - Free
opencode/*models (e.g.opencode/deepseek-v4.1-flash-free) need no auth — zero setup. - Any other provider (deepseek, openai, google, ollama, …) must be logged into your
opencode first — that's a step you do in your own opencode, not something forge-delegate
handles:
opencode auth login <provider>. forge-delegate reuses your opencode's credentials and never stores API keys. (Ollama needs no key, just the Ollama app running.)
Windows
Use the npx route — no bash needed (works in cmd/PowerShell). All three targets, including
native Windows Codex CLI, are supported.
Scope
--scope | Claude Code | Codex | opencode |
|---|---|---|---|
user (default) | ~/.claude.json — all projects | ~/.codex/config.toml — all projects | ~/.config/opencode/opencode.json — all projects |
project | .mcp.json in the project (needs one-time approval) | .codex/config.toml in the project (loads for trusted projects only) | opencode.json in the project |
Try it free — zero signup
opencode ships free no-auth models under opencode/:
npx -y forge-delegate setup --model "opencode/deepseek-v4.1-flash-free" --targets "claude,codex"
Other free options: opencode/mimo-v2.6-flash-free, opencode/nemotron-3.5-lightning-free. Free tiers are
rate-limited; switch anytime with forge-delegate config set --model <m>.
Tools
| Tool | What it does | Context cost |
|---|---|---|
ask_model | Second opinion from another model (direct API, no file access) | Small |
delegate | Model works autonomously via opencode's own tool loop — inline by default; background:true returns a job id to poll via check_delegation | Tiny→Medium |
check_delegation | Poll a background job (or list all with no id) | Tiny |
list_models | List local/keyless, direct-API, and agentic models | Small |
get_delegate_config | Read current configuration (default model, directory, autoApprove, profiles) | Tiny |
set_delegate_config | Change configuration at runtime — no reinstall | Tiny |
delegate is the context-saver: the external model gets its own tool loop executed by
opencode locally. File contents never touch your main agent's context. Fast tasks return
inline; long ones are auto-backgrounded by Claude Code (past ~2 min). Other hosts wait for an
inline call, so the agent is told to pass background:true there for anything long.
Each delegation's result ends with the tokens it used and, when the provider reports prices,
its cost. forge-delegate stats totals both per model.
When to delegate
| ✅ Delegate — high volume, low risk | ⛔ Keep on the primary agent |
|---|---|
| Tests for well-specified behavior | Architecture, system design, choosing abstractions |
| Boilerplate & scaffolding (CRUD, DTOs, fixtures, mocks) | Security-sensitive code (auth, crypto, secrets, permissions) |
| Mechanical edits across many files (renames, prop propagation, imports) | Concurrency, performance-critical paths, subtle correctness |
| Lint / formatting / type-error fixes | Ambiguous / underspecified requirements needing judgment |
| Docstrings, comments, README / changelog sections | Public API / interface design, breaking changes |
| Straightforward data transforms / migrations with a clear spec | Debugging unknown root causes |
| Obvious glue code / format conversions | Anything costly or hard to detect if wrong |
Full guide: docs/DELEGATION.md
The delegate-work skill
Setup also installs the skill for Claude Code (~/.claude/skills/delegate-work/, or
<project>/.claude/skills/ under --scope project) and for Codex (~/.agents/skills/delegate-work/,
or <project>/.agents/skills/). Skip it with --no-skill.
It exists because MCP server instructions are injected once at session start and
get buried as the context fills — by turn 30 they lose to whatever is in front of the
model. A skill description is re-matched against every user turn, so the delegation
triggers ("write tests for", "rename X everywhere", "fix the lint errors") stay live
for the whole session instead of decaying.
Configuration
Stored in ~/.forge-delegate/config.json, read fresh on every call — change it anytime without
reinstalling. Four ways:
- From your agent via the MCP tools
get_delegate_config/set_delegate_config. - Terminal CLI:
forge-delegate config get,forge-delegate config set --model <m> --timeout <s> --dir <path> --autoApprove false,forge-delegate config path. setupflags:--model,--targets,--scope,--project-dir.- Edit the file directly.
| Field | Description | Default |
|---|---|---|
defaultModel | provider/model used when a call omits model | unset |
defaultAgent | opencode agent used for delegations | unset |
defaultVariant | default reasoning-effort variant | unset |
autoApprove | auto-approve permissions so headless delegations don't block | true |
timeoutMs | per-delegation timeout | 900000 (env FORGE_OPENCODE_TIMEOUT) |
defaultDirectory | default working directory for delegations | unset (server cwd) |
profiles | named presets { name: { model, agent, variant, autoApprove, directory } } | {} |
Every delegation tool also accepts per-call model, directory, agent, autoApprove, and
profile overrides. Per-call values beat profile values beat config defaults.
Models
- opencode provider — free no-auth models (
opencode/deepseek-v4.1-flash-free, ...) plus anything you have logged in viaopencode auth login <provider>. - Direct API from opencode logins —
provider/modelfor OpenAI-compatible providers. - Custom providers — OpenAI-compatible providers defined in
opencode.json(@ai-sdk/openai-compatible+baseURL), callable asprovider/model. - Ollama (local) —
ollama:llama3,local:qwen2.5-coder, no key needed.
Safety notes
autoApprove: trueruns delegations non-interactively with tool permissions granted — point them at repositories you trust and review the diffs. SetautoApprove: falseto require manual approval.- This server never stores API keys — provider auth lives in opencode's own auth store.
- Usage is logged to
~/.forge-delegate/usage.jsonl; seeforge-delegate stats.
CLI
forge-delegate --version Print the installed version
forge-delegate setup Register with Claude Code / Codex / opencode
forge-delegate serve Start the MCP server (used internally)
forge-delegate config get | set | path
forge-delegate status Show version, update mode, opencode logins, usage
forge-delegate stats Show detailed usage statistics
setup on a published install writes ~/.forge-delegate/launcher.mjs and registers that path
instead of npx. The launcher keeps a private install under ~/.forge-delegate/pkg, asks npm
for the newest release at most every 6 hours, and installs newer same-major versions
automatically. Installs use npm install --ignore-scripts, go through a staging directory, and
fall back to the last good version if anything fails. A new version lands on the next agent
start; the download itself happens in the background so startup is never delayed.
Disable automatic updates with FORGE_AUTO_UPDATE=0. A major release (2.0.0) is never
installed automatically — re-run npx -y forge-delegate setup to take it deliberately.
The launcher is also the CLI entry point: node ~/.forge-delegate/launcher.mjs status reports
the running version and update mode, and --version prints the version.
npx installs configured by hand are not covered by the launcher: npx keeps its cached copy
forever, so clear it with rm -rf ~/.npm/_npx and restart. Running
npx -y forge-delegate@latest setup migrates an npx install to the launcher; @latest gets its
own npx cache slot, and if it still starts an old version, clear the cache first.
Publishing (npm)
The primary install is npx -y forge-delegate setup, so the package must be on npm. Checklist:
npm run prepublishOnly— syntax-checks all entry files (runs automatically on publish).npm pack --dry-run— confirm the tarball contains onlylauncher.mjs,cli.mjs,server.mjs,lib.mjs,install.sh,docs/,skills/,README.md(via thefilesfield), notnode_modules.- Bump
versioninpackage.json(and the rootversioninpackage-lock.json). npm login && npm publish— thebinfield makesnpx forge-delegate …work.
Also make sure the GitHub repo exists at MuhamadBarzani/forge-delegate with Pages enabled on
/docs (configurator) — the raw.githubusercontent.com install URL and the configurator's
hardcoded URL point there.
License
MIT