mcp-fleet-worker
Spawn headless OpenCode workers on cheap models to delegate expensive tool-using tasks to a fleet of parallel workers with isolated git worktrees.
README
@alexgenovese/mcp-fleet-worker
Spawn headless OpenCode workers on cheap models — delegate expensive tool-using tasks to a fleet of parallel workers with isolated git worktrees. Optional Brick routing selects the optimal model per task automatically.
MCP Activation Keywords
Le seguenti keyword attivano questo MCP in Claude Code / OpenCode:
| Keyword | Azione |
|---|---|
fleet-worker |
Attivazione generica |
delegate to GLM |
Usa regolo/glm5.2-beta come worker |
spawn a GLM worker |
Idem |
cheap parallel agent |
Spawn worker su modello economico |
grunt worker |
Worker per task ripetitivi |
offload to glm |
Delega task a GLM |
z.ai worker |
Worker su endpoint z.ai |
GLM-5.2 worker |
Worker su glm5.2 |
sonnet worker |
Worker Sonnet |
haiku worker |
Worker Haiku |
cheap coding agent |
Worker economico generico |
fan out workers |
Spawn multipli in parallelo |
non-Anthropic model in OpenCode |
Worker su modello non-Anthropic |
ANTHROPIC_BASE_URL worker |
Worker su endpoint custom |
fleet-worker list models |
fleet_worker_list_models |
fleet-worker spawn |
fleet_worker_spawn |
fleet-worker collect |
fleet_worker_collect |
fleet-worker status |
fleet_worker_status |
fleet-worker cancel |
fleet_worker_cancel |
Aggiungi al tuo .claude/hooks/PreToolUse o usa direttamente i tool MCP via Claude Code.
What Is This?
mcp-fleet-worker is an MCP server that lets you spawn headless OpenCode workers on any model configured in your opencode.json — from local Ollama models to cheap remote providers like GLM via z.ai.
Each worker runs in an isolated git worktree with its own CLAUDE_CONFIG_DIR, so multiple workers run side-by-side without conflicting. Workers are treated as disposable "grunt agents": a powerful orchestrator (Opus) fans out tasks, collects results, and lands the completed branches.
Why?
- Cost optimization: run cheap models (GLM-5.2, Haiku, Sonnet) for routine coding tasks, reserve Opus for orchestration
- Parallel execution: spawn N workers simultaneously, each in its own worktree
- Isolation: each worker gets a fresh git branch + scratch directory
- Fleet-ops ready: designed to pair with fleet-ops for test-gated landing
Technology Stack
| Technology | Version | Purpose |
|---|---|---|
| Node.js | >= 18 | Runtime |
| TypeScript | 5.3 | Language |
| @modelcontextprotocol/sdk | ^1.0.0 | MCP server framework |
| zod | ^3.23.0 | Runtime schema validation |
| git worktree | system | Worker isolation |
| OpenCode | any | Spawned agent process |
| Brick (optional) | SR1 | Smart model routing via Regolo API |
Architecture
┌─────────────────────────────────┐
│ Claude Code (Opus) │
│ (orchestrator / caller) │
└──────────┬──────────────────────┘
│ MCP (stdio)
┌──────────▼──────────────────────┐
│ mcp-fleet-worker server │
│ │
│ ┌─ fleet_worker_spawn │
│ ├─ fleet_worker_collect │
│ ├─ fleet_worker_status │
│ ├─ fleet_worker_list_models │
│ └─ fleet_worker_cancel │
└──────────┬──────────────────────┘
│
┌──────────▼──────────────────────┐
│ Git Worktree (.fleet-work/) │
│ │
│ worker-1/ ← branch `fleet/id1` │
│ worker-2/ ← branch `fleet/id2` │
│ ... │
└──────────┬──────────────────────┘
│
┌──────────▼──────────────────────┐
│ ~/.fleet-worker/scratch/<id>/ │
│ (CLAUDE_CONFIG_DIR per worker) │
└─────────────────────────────────┘
Flow
- Caller sends a prompt + optional model to
fleet_worker_spawn - Server creates an isolated git worktree (
.fleet-work/<id>/) with a dedicated branch (fleet/<id>) - Server spawns
opencode run -m <model> --agent coder --auto --dir <worktree> --format json "<prompt>" - Caller polls
fleet_worker_collector waits for completion - Worker finishes → output is captured →
fleet_worker_cancelcleans up worktree + scratch dir
Getting Started
Prerequisites
- Node.js >= 18
- npm or pnpm
- OpenCode installed (the
opencodeCLI in PATH) - A git repository to use as the worker base directory
Installation
# Clone
git clone https://github.com/alexgenovese/mcp-fleet-worker.git
cd mcp-fleet-worker
# Install deps
npm install
# Build
npm run build
# Test
node dist/index.js
Configuration
Add to your opencode.json (or to your MCP hub config):
{
"mcpServers": {
"mcp-fleet-worker": {
"command": "node",
"args": ["/path/to/mcp-fleet-worker/dist/index.js"],
"env": {
"FLEET_WORKER_BASE_DIR": "/path/to/your/git/repo",
"FLEET_WORKER_DEFAULT_MODEL": "regolo/glm5.2-beta",
"FLEET_WORKER_BRICK_URL": "https://api.regolo.ai",
"FLEET_WORKER_BRICK_API_KEY": "your-regolo-api-key",
"OPENCODE_PATH": "opencode"
}
}
}
}
Environment Variables:
| Variable | Default | Description |
|---|---|---|
FLEET_WORKER_BASE_DIR |
process.cwd() |
Git repo for worktree isolation |
FLEET_WORKER_DEFAULT_MODEL |
regolo/gemma4-31b |
Fallback model when routing is off/unavailable |
FLEET_WORKER_BRICK_URL |
(empty) | Brick API URL (Regolo). When set, enables smart routing |
FLEET_WORKER_BRICK_API_KEY |
(empty) | API key for Brick (Regolo API key) |
OPENCODE_PATH |
opencode |
Path to opencode binary |
XDG_CONFIG_HOME |
unset for worker | Stripped so worker uses fresh config |
Brick Smart Routing (Optional)
When FLEET_WORKER_BRICK_URL and FLEET_WORKER_BRICK_API_KEY are set, fleet_worker_spawn without an explicit model parameter will call Brick's /v1/routing/test endpoint to select the optimal model based on:
- Capability — 6 dimensions (coding, math_reasoning, creative_synthesis, instruction_following, planning_agentic, world_knowledge)
- Complexity — easy / medium / hard
- Cost — penalizes expensive models for simple tasks
How It Works
fleet_worker_spawn(prompt="fix typo in README.md")
↓
Brick analyzes prompt → complexity: easy, capability: {instruction_following: 0.9}
↓
Brick selects: ollama/qwen3:4b (cheapest capable model)
↓
Worker spawns on ollama/qwen3:4b
↓
fleet_worker_status shows: routed=true, costSavings=95%
When Routing Kicks In
| Call | Behavior |
|---|---|
fleet_worker_spawn(prompt="...", model="regolo/glm5.2-beta") |
Explicit model → no routing, use specified model |
fleet_worker_spawn(prompt="...") + Brick configured |
Brick routes automatically |
fleet_worker_spawn(prompt="...") + Brick not configured |
Falls back to FLEET_WORKER_DEFAULT_MODEL |
Cost Savings Tracking
Every routed worker records its costSavings percentage (estimated vs. using the fallback model). This appears in:
fleet_worker_spawnresponse (routing.costSavings)fleet_worker_statusoutput (per-workercostSavings)fleet_worker_collectresult (routing.costSavings)
See USE_CASES.md for detailed cost-saving scenarios for developers and CTOs.
Project Structure
mcp-fleet-worker/
├── src/
│ ├── index.ts # MCP server entry point
│ ├── types.ts # WorkerSpec, WorkerProcess, WorkerStatus
│ ├── lib/
│ │ ├── models.ts # opencode.json parser (JSONC-aware)
│ │ ├── router.ts # Brick routing client (Regolo API)
│ │ ├── worktree.ts # Git worktree create/remove/cleanup
│ │ ├── config.ts # Scratch directory (~/.fleet-worker/)
│ │ ├── id.ts # Short UUID generator (8 chars)
│ │ └── worker-manager.ts # Spawn/track/kill opencode children
│ └── tools/
│ └── register.ts # 5 MCP tool handlers
├── dist/ # Compiled JavaScript
├── package.json
├── tsconfig.json
└── README.md
Key Features
1. Multi-Model Support
Reads all providers and models from opencode.json — Ollama, GLM, custom OpenAI-compatible endpoints. Use fleet_worker_list_models to see what's available.
2. Git Worktree Isolation
Each worker runs in a dedicated git worktree (git worktree add -b fleet/<id>), so multiple workers can modify the same repo simultaneously without merge conflicts at runtime.
3. Background Execution
Workers spawn as child processes with captured stdout/stderr. Collect results async via fleet_worker_collect.
4. Cleanup
fleet_worker_cancel with cleanup: true removes:
- The worktree directory (
.fleet-work/<id>/) - The local git branch (
fleet/<id>) - The scratch config dir (
~/.fleet-worker/scratch/<id>/)
5. JSONC Parsing
Reads opencode.json even with comments (// and /* */) — no need to strip them manually.
MCP Tools
fleet_worker_list_models
List all available models grouped by provider, with context window and cost info.
fleet_worker_spawn
Spawn a headless worker on any model.
| Parameter | Type | Default | Description |
|---|---|---|---|
prompt |
string | required | Task prompt for the worker |
model |
string | env/FALLBACK | provider/model-id format |
agent |
string | coder |
OpenCode agent type |
worktree |
string | FLEET_WORKER_BASE_DIR |
Git repo path |
branch |
string | fleet/<id> |
Git branch name |
maxTurns |
number | 50 | Max interaction turns |
timeout |
number | 300 | Timeout in seconds |
fleet_worker_collect
Get a worker's result.
| Parameter | Type | Default | Description |
|---|---|---|---|
workerId |
string | required | Worker ID from spawn |
wait |
boolean | false | Block until completion |
timeout |
number | 30 | Max wait in seconds |
fleet_worker_status
List all workers with status, model, branch, elapsed time.
fleet_worker_cancel
Stop and clean up a worker.
| Parameter | Type | Default | Description |
|---|---|---|---|
workerId |
string | required | Worker ID to cancel |
cleanup |
boolean | true | Remove worktree + scratch |
Development Workflow
- Install →
npm install - Build →
npm run build - Watch →
npm run dev(tsc --watch) - Test locally →
node dist/index.js(then connect with MCP inspector or Claude Desktop)
To test with the MCP inspector:
npx @modelcontextprotocol/inspector node dist/index.js
Testing
# Type check
npx tsc --noEmit
# Build
npm run build
# Quick smoke test (list models)
node -e "
import('./dist/index.js').then(() => console.log('Server loads OK'))
"
License
MIT © Alex Geno
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.