Forge-delegate
Allows Google models authenticated in opencode to be used as delegation or second-opinion targets.
Enables delegating coding tasks to local Ollama models without API keys, using models such as ollama:llama3 or local:qwen2.5-coder.
Enables delegation and second-opinion requests to OpenAI models through opencode logins or direct API access, returning model output with usage and cost details.
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 usageQuick 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
| Claude Code | Codex | opencode |
|
|
|
|
|
|
|
|
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>.
Related MCP server: GPT Proxy MCP Server
Tools
Tool | What it does | Context cost |
| Second opinion from another model (direct API, no file access) | Small |
| Model works autonomously via opencode's own tool loop — inline by default; | Tiny→Medium |
| Poll a background job (or list all with no id) | Tiny |
| List local/keyless, direct-API, and agentic models | Small |
| Read current configuration (default model, directory, autoApprove, profiles) | Tiny |
| 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 |
| provider/model used when a call omits | unset |
| opencode agent used for delegations | unset |
| default reasoning-effort variant | unset |
| auto-approve permissions so headless delegations don't block |
|
| per-delegation timeout |
|
| default working directory for delegations | unset (server cwd) |
| named presets |
|
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 statisticssetup 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
Available Tools
6 toolsask_modelA
Get a second opinion from a different model — on a design, an approach, or a tricky snippet — or ask one when the user requests it. Sends a one-shot prompt over a direct API call and returns the raw response. The model has no file access and cannot take actions; for anything touching files use delegate. Don't use it for syntax or API details you already know: a cheap model is usually less reliable than you on those. Omit model to use the configured default.
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | provider/model or ollama:<name>, e.g. deepseek/deepseek-v4-flash, ollama:llama3. Omit to use the configured default; don't pick a premium tier | |
| prompt | Yes | The full question. The model has seen none of this conversation, so include the code and context it needs | |
| system | No | Optional system prompt, e.g. a role or an answer format |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and discloses key constraints: it is a one-shot direct API call, returns a raw response, the model has no file access and cannot take actions. It also warns that a cheap model may be less reliable than the agent itself. It does not cover cost, rate limits, timeout, or error behavior, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a compact paragraph with no wasted sentences. It front-loads the purpose, then adds behavioral constraints, exclusions, and the default-model note in a logical order.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple three-parameter tool, no annotations, and no output schema, the description covers what the tool does, what it returns (raw response), and its key limitations. It is nearly complete, though it does not address failure modes or cost/timeout behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters including the model format and default behavior. The description restates the default-model behavior but adds no meaningful parameter semantics beyond what the schema provides; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: it gets a second opinion from a different model via a one-shot prompt. It explicitly contrasts itself with the sibling `delegate` for file-touching tasks, so an agent can distinguish them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use conditions (second opinion on design/approach/snippet, or when the user requests it) and explicit when-not-to-use guidance (don't ask for syntax/API details you already know). It names the alternative tool (`delegate`) for file-related work and explains how to use the default model.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_delegationA
Check a delegation started with background:true. Returns RUNNING, DONE or TIMED OUT, the elapsed time, the session id, and the last 8,000 characters of the agent's output. Each poll costs context, so wait between polls instead of checking in a tight loop. Call with no id to list all jobs.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Job id returned by delegate with background:true. Omit to list all jobs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the disclosure burden and does well: it names the three terminal statuses, the elapsed-time and session-id returns, the 8,000-character output truncation, and the context cost of each poll. It stops short of stating auth requirements or backing-store behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each doing distinct work: payload contents, polling discipline, and the id-omitted mode. No filler, and the core return contract is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description compensates by explaining exactly what comes back (status, elapsed, session id, truncated output) and how to poll responsibly. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter's description already says 'Omit to list all jobs'. The description repeats that hint but adds no format or validation detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (check) on a specific resource (a delegation started with background:true). It clearly distinguishes itself from the sibling delegate tool by framing itself as the poller, not the starter, and notes the no-id listing mode.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete operational guidance: wait between polls instead of tight-looping, and omit the id to list all jobs. It doesn't explicitly name a sibling alternative for starting a job, but the when/how is well covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delegateA
Hand a coding task to another AI model running as a full agent via local opencode: it reads the project, explores, and writes the code in its own tool loop, none of which enters your context. Use it instead of writing the code yourself for: tests for code that already exists; a mechanical refactor (rename, signature change, import rewrite, API migration); lint/type/build errors (paste the error output); boilerplate or scaffolding (CRUD endpoints, config, schemas, adapters, fixtures); a port between languages or frameworks; the same edit repeated across 3 or more files; reading a large file or directory to answer one narrow question; the survey half of an audit. Runs inline by default and returns when done; Claude Code backgrounds calls past 2 minutes, other hosts wait. Pass background:true to get a job id at once, then poll check_delegation. Pass continue_session (returned by a previous delegation) to keep the same agent session instead of re-exploring. Name file paths in task; never paste their contents. model/directory/agent/autoApprove default from config — omit them. Review what comes back before reporting it done.
| Name | Required | Description | Default |
|---|---|---|---|
| task | Yes | Self-contained instructions: the goal, the file paths to read or change, constraints, and how to check the result (e.g. which tests to run). The agent has not seen this conversation | |
| agent | No | opencode agent to use (defaults to config defaultAgent) | |
| files | No | Paths to attach to the agent's prompt (inline only; ignored with background:true). Rarely needed: the agent reads paths named in task itself | |
| model | No | provider/model, e.g. opencode/deepseek-v4.1-flash-free. Omit to use the configured default; don't raise it to a premium tier — split the task instead | |
| profile | No | Named preset from config profiles (see get_delegate_config) that sets model, agent, variant, directory and autoApprove together | |
| directory | No | Absolute path of the project to work in (defaults to config defaultDirectory, else the server's working directory) | |
| background | No | Run detached and return a job id immediately; poll check_delegation (default false) | |
| autoApprove | No | Let the agent edit files and run commands without asking (defaults to config autoApprove, true). When false nobody is there to approve, so actions that need approval can stall or be refused | |
| continue_session | No | Session id from a previous delegation's result, to continue in that agent session |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full burden and does well on several fronts: context isolation, inline-vs-background execution, the 2-minute host-specific timeout, and job-id polling. It is weaker on the mutation side — it never says the agent will edit files in the working tree or that those edits are not reversible, and the approval risk is only implied by 'Review what comes back before reporting it done'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then trigger conditions, then runtime behavior, then invocation tips. Despite its length, every clause is a distinct decision input — no restatement of the name or filler prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter, no-output-schema delegation tool this is thorough: it covers what the remote agent does with your repo, how the call returns (inline vs job id), how to resume a session, and which params to leave alone. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real operational guidance: 'Name file paths in task; never paste their contents', 'model/directory/agent/autoApprove default from config — omit them', and that continue_session came from a previous delegation's result. It supplies decision rules the schema alone does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Hand a coding task to another AI model running as a full agent') and immediately characterizes the mechanism ('reads the project, explores, and writes the code in its own tool loop, none of which enters your context'). This distinguishes it cleanly from ask_model and from doing the work in-context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Enumerates eight concrete trigger conditions ('tests for code that already exists', 'mechanical refactor', 'lint/type/build errors', 'same edit repeated across 3 or more files'), and explicitly says to use it 'instead of writing the code yourself'. It also routes to siblings: poll check_delegation for background jobs, use continue_session rather than re-exploring, and omit config-defaulted params.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_delegate_configA
Read the current forge-delegate configuration: defaultModel, defaultAgent, defaultVariant, autoApprove, timeoutMs, defaultDirectory, and named profiles — plus the installed version and whether it updates automatically. Call this to see what will be used when a model/directory is omitted, or when the user asks which version is running.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it does signal a side-effect-free read and discloses the shape of what comes back (config keys, version, auto-update status). It doesn't mention auth requirements, failure modes, or whether secrets are redacted, which would round it out.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the returned field list front-loaded and the usage triggers appended. The field enumeration is long but earns its place because there is no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, annotations, or parameters, the description is the sole carrier of information — and it fully covers what is returned plus when to reach for it. Nothing an agent needs in order to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is nothing to disambiguate; baseline applies. The description spends its words on return values instead, which is the right allocation here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Read') plus a named resource ('forge-delegate configuration'), followed by an enumeration of exactly which keys are returned. The read framing cleanly separates it from the write counterpart set_delegate_config without needing to name it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names two triggering situations: checking what defaults will be applied when a model/directory is omitted, and answering version questions. It doesn't explicitly exclude or route to siblings like set_delegate_config, but the read-only framing makes the boundary obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_modelsA
List the models available for delegation: local/keyless ones, direct-API models from opencode logins, and agentic models from the local opencode installation. Call it when the user asks what's available or wants to change the default model, not before an ordinary delegation — those use the configured default.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden, and it does useful work: it names the model source categories and clarifies that ordinary delegation resolves via the configured default, so the agent understands this call is informational rather than part of the delegation path. It stops short of describing the return shape (names vs. identifiers), which matters because the stated use case includes changing the default model.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both load-bearing: the first defines what is listed, the second routes usage. The trigger and the exclusion are front-loaded before the explanatory clause, so an agent can act on the first read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-param listing tool with no output schema, the description covers what is enumerated and when to call it, which is nearly everything an agent needs. The one gap is that with no output schema, nothing states whether the returned models come back as display names or as identifiers accepted by set_delegate_config — relevant given the 'change the default model' use case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there are no semantics to explain and the baseline of 4 applies. The description correctly refrains from inventing parameter guidance where none exists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the models available for delegation') and then enumerates the three model categories returned (local/keyless, direct-API from opencode logins, agentic from the local install). This lets an agent distinguish it from ask_model and delegate without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit positive trigger ('when the user asks what's available or wants to change the default model') and an explicit negative one ('not before an ordinary delegation'), plus the reason those cases differ. This is exactly the when/when-not/alternative structure the top score requires.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_delegate_configA
Change forge-delegate configuration at runtime — no reinstall. Only change settings when the user asks; never raise defaultModel to a premium tier on your own. Pass any subset of {defaultModel, defaultAgent, defaultVariant, autoApprove, timeoutMs, defaultDirectory, profiles}. Set a field to null to clear it. To edit a profile, pass the whole profiles object (e.g. profiles: {tests: {model: "..."}}); set a profile to null to delete it. Only provided keys change; others are preserved.
| Name | Required | Description | Default |
|---|---|---|---|
| profiles | No | The whole profiles object: { name: { model, agent, variant, autoApprove, directory } }. A profile set to null is deleted | |
| timeoutMs | No | Per-delegation timeout in milliseconds (default 900000, 15 minutes) | |
| autoApprove | No | Let delegated agents edit files and run commands without asking | |
| defaultAgent | No | opencode agent used when a call omits agent | |
| defaultModel | No | provider/model used when a call omits model | |
| defaultVariant | No | Reasoning-effort variant, sent to opencode as provider/model#variant | |
| defaultDirectory | No | Absolute project path used when a call omits directory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses merge semantics ('Only provided keys change; others are preserved'), deletion via null, and whole-object replacement for profiles. It does not say whether changes are persisted across restarts or what confirmation the call returns, which matters for a runtime mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then constraints, then the parameter set, then merge/clear rules. Every sentence conveys an operational rule; nothing is padding despite the density.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool with a nested object and no output schema, the description covers behavior and mutation semantics well. Missing are the persistence/scope of changes and any auth or permission requirement, which an agent would want before altering global delegation config.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds semantics the schema does not: null clears a field, profiles must be passed whole and a null profile deletes it, and unspecified keys are preserved. That is real added meaning for the trickiest parameters (profiles, nullable defaults).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Change forge-delegate configuration at runtime') with a useful qualifier ('no reinstall'). It implicitly contrasts with the reader sibling get_delegate_config, but never names it, so the differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage policy: 'Only change settings when the user asks; never raise defaultModel to a premium tier on your own' tells the agent when not to act and what not to escalate. It lacks a pointer to get_delegate_config for reading current values before mutating, which is the obvious companion step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v1.2.4- First observed
ask_model - First observed
check_delegation - First observed
delegate - First observed
get_delegate_config - First observed
list_models - First observed
set_delegate_config
TDQS
Scored across 6 tools
Each tool has a sharply bounded purpose: ask_model is a stateless one-shot API call, delegate is a full agentic loop with file access, and the descriptions explicitly steer the agent between them ('for anything touching files use delegate'). Config read/write (get_delegate_config vs set_delegate_config), model discovery, and job polling are all cleanly separated.
Five of six names follow a clear verb_noun snake_case pattern (ask_model, list_models, set_delegate_config, get_delegate_config, check_delegation). The exception is the bare verb 'delegate', which breaks the pattern but is still unambiguous.
Six tools is well-scoped for a delegation server: one dispatch path, one async-poll path, one second-opinion path, and read/write config plus model listing. Nothing looks redundant or padded.
The lifecycle is largely covered — configure, discover models, delegate (inline or background), poll, and consult a second model. The notable gap is the inability to cancel or kill a running background job, so a runaway delegation can only be waited out.
Maintenance
Related MCP Connectors
MCP server for OpenAI API (chat completions, image generation, embeddings) via AceDataCloud
Hosted X Ads MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Hosted OpenAI Ads MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
MCP server for AI dialogue using various LLM models via AceDataCloud
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server that allows Claude Code to interact with the OpenAI Codex CLI.71 npm21MIT
- AlicenseBqualityDmaintenanceMCP server that proxies GPT API calls for Claude Code, supporting multiple GPT models with both standard and streaming responses.2MIT
- AlicenseAqualityBmaintenanceMCP server for opencode that queries GitHub Copilot models via a persistent opencode server, requiring no API keys.2200 npm1MIT
- FlicenseNot gradedqualityDmaintenanceMCP server that lets Claude Code offload simple tasks like code explanation, writing tests, and adding comments to a local Ollama model, saving Claude API tokens.-