Atlas / MCP servers / bulls-work / bullswarm

bullswarmBLOCK

mcp/bulls-work/bullswarm

Use every coding-agent plan you pay for. Routes tasks across Claude Code, Codex and Grok by spare quota, runs multi-agent workflows, and checks the results.

Verdict
BLOCK
Grade
F
Trust score
56 /100
Exposed tools
5 4r · 1w · 0d
Transport
—
License
MIT
Stars
2
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Route work across your coding-agent subscriptions, spend quota before it expires, and verify what comes back.

The problem

You pay for more than one coding agent: a Claude plan or two, Codex, Grok, maybe another.

Every one of them meters you on a clock — five-hour windows, weekly caps, monthly allowances — and unused quota is simply gone when the window resets.

So one plan runs dry mid-task while the others sit idle. You switch tools by hand just to spend what you already paid for. And the agent that wrote the code is usually the one that decides it is done.

What Bullswarm does

Bullswarm turns the agent CLIs already signed in on your machine into one fleet that your main agent can command.

flowchart LR
you([You]) -->|goal| main["Your main agentClaude Code · Codex · Grok+ /bullswarm skill"]
main -->|"bullswarm run · workflow goal"| bs{{"Bullswarmpace router + workflow kernel"}}
bs --> c["claude -p"]
bs --> x["codex exec"]
bs --> g["grok -p"]
bs --> o["contributed providers"]
c & x & g & o -->|output| v["independent verification"]
v -->|"verdict + evidence"| main
  • Spends quota by pace. Each task goes to the plan with the most spare quota for how far its window has run, so a plan that is behind, or about to reset with quota left, gets used first.
  • Picks models for you. Tasks come in three lanes (analyze,
Read from source at commit 8929e1ef80fbOBSERVED · 2026-10-11
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add bullswarm --env FAKE_KEY=${FAKE_KEY} --env GIT_AUTHOR_EMAIL=${GIT_AUTHOR_EMAIL} --env GIT_AUTHOR_NAME=${GIT_AUTHOR_NAME} --env OPENROUTER_API_KEY=${OPENROUTER_API_KEY} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "bullswarm": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "FAKE_KEY": "${FAKE_KEY}",
        "GIT_AUTHOR_EMAIL": "${GIT_AUTHOR_EMAIL}",
        "GIT_AUTHOR_NAME": "${GIT_AUTHOR_NAME}",
        "OPENROUTER_API_KEY": "${OPENROUTER_API_KEY}"
      }
    }
  }
}
03

Exposed tools (5)

4 read · 1 write · 0 destructive.

ToolRiskDescription
bullswarm_healthreadRe-judge saved offload outputs against their verdicts; report verify-gate failures. Run after every offload round.
bullswarm_poolsreadShow the meter state and pace position of each pool.
bullswarm_runwriteOffload a task to the best available coding-agent pool as a one-step workflow, routed by quota pace and judged by facts. Returns a verdict: ok=true means read outFile; ok=false means the why field names the failure and failureKind its kind; runId names the recorded run.
retired-autonomous-v1readAutonomous goal-driven workflow generated by Bullswarm.
routereadSwitch bullswarm auto-routing of subagents on or off for this session, when the person asks. Off keeps every subagent in-session; on sends general-purpose subagents to the pool with spare quota. Report the resulting state.
04

Trust audit

BLOCKgrade F · trust 56/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryWARN
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (5 observation(s))
Network
declared (5 observation(s))
Shell
declared (10 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
scripts/issue-watcher/watch.mjs:338
const r = exec(cfg, cfg.gh, args, { timeout: GIT_TIMEOUT_MS });
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
scripts/issue-watcher/watch.mjs:350
const cloned = exec(cfg, cfg.gh, ['repo', 'clone', repo, 'repo'], { cwd: cfg.dir, timeout: 30 * 60_000 });
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
scripts/issue-watcher/watch.mjs:353
const fetched = exec(cfg, 'git', ['-C', cfg.repoDir, 'fetch', '--prune', 'origin']);
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
scripts/issue-watcher/watch.mjs:355
const checked = exec(cfg, 'git', ['-C', cfg.repoDir, 'checkout', '-q', '--detach', 'origin/main']);
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
scripts/issue-watcher/watch.mjs:368
const r = exec(cfg, cfg.bullswarm, args, { env: workerEnv(cfg), timeout: DISPATCH_TIMEOUT_MS });
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
MEDIUMInventory / provenance · inv.symlink · CWE-1104
docs-site/docs
docs-site/docs
Why it matters. link not followed
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
src/workflow/cli-launch.js:41
else if (!opts.quiet) console.log(`workflow ${token} paused; nothing new starts until: ${paused.next}`);
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
src/workflow/cli-run-verbs.js:215
else console.log(`✓ pause withdrawn for ${token}; its running kernel continues`);
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/provider-cli.test.js:235
const secret = 'sk-probe-secret-value-123456';
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/retention.test.js:219
pid: process.pid, identity: processIdentity(process.pid), token: 'kernel-started-after-plan',
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/workflow/dispatch-snapshot.js:106
return createHash('sha1').update(bytes).digest('hex');
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/workflow/evidence-runner.js:400
return createHash('sha1').update(bytes).digest('hex');
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
tests/workflow-evidence-runner.test.js:432
const sha1 = (text) => createHash('sha1').update(text).digest('hex');
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
tests/workflow-proof-labels.test.js:212
assert.equal(createHash('sha1').update(lines.join('\n')).digest('hex'), HOME_351_SUMMARIES_SHA1);
LOWInformation disclosure · disclose.log_secret · CWE-209, CWE-532
tests/provider-cli.test.js:238
`console.log(process.env.FAKE_KEY === ${JSON.stringify(secret)} ? 'PONG' : 'no key');\n`);
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
providers/contrib/command-code/provider.mjs:19
import { MeterError } from '../../../src/provider-kit.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
providers/contrib/command-code/provider.mjs:20
import { retryAfterMsFromHeaders } from '../../../src/meters/framework.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
providers/contrib/command-code/provider.mjs:24
} from '../../../src/lib/transcripts/command-code.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
providers/contrib/opencode/provider.mjs:9
} from '../../../src/lib/transcripts/opencode.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/lib/epoch-benchmarks.js:18
const BUNDLED_DATAPACK = fileURLToPath(new URL('../../data/epoch-benchmarks.json', import.meta.url));
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/provider-kit.test.js:119
const base = `http://127.0.0.1:${server.address().port}`;
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
tests/fixtures/stream/grok-capture.jsonl:56
{"type":"usage","usage":{"input_tokens":41198,"output_tokens":141,"cache_read_input_tokens":640,"cache_creation_input_tokens":0,"reasoning_tokens":33},"signature":"/PSpj5LqmZqpprtwDhJ6JxyBUPtpwTMAqylJ
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
tests/fixtures/stream/grok-capture.jsonl:84
{"type":"usage","usage":{"input_tokens":44482,"output_tokens":124,"cache_read_input_tokens":640,"cache_creation_input_tokens":0,"reasoning_tokens":123},"signature":"dQFvGxv5SuT1YUNRr9gwkiSw8OtKhBw4XNj
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
tests/fixtures/transcripts/claude-session.jsonl:3
{"parentUuid":"d897395a-b80a-47ab-9f28-4c42bb8e4301","isSidechain":false,"message":{"model":"claude-opus-5","id":"msg_011Cf9f8NCjVKUhooCRPzeGb","type":"message","role":"assistant","content":[{"type":"
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
docs-site/package.json
vitepress
Why it matters. 1 dependency range(s) float
Fix. pin exact versions or ship a lockfile

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 8929e1ef80fbfull audit observations/trust-audit/mcp-server/bulls-work__bullswarm.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-118929e1ef80fbBLOCKF56first audit
06

Questions

What is the bullswarm MCP server?

Use every coding-agent plan you pay for. Routes tasks across Claude Code, Codex and Grok by spare quota, runs multi-agent workflows, and checks the results.

What tools does bullswarm expose?

5 in total: 4 read-only, 1 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is bullswarm safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (56/100) and found 5 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does bullswarm need?

It reads FAKE_KEY, GIT_AUTHOR_EMAIL, GIT_AUTHOR_NAME and OPENROUTER_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How current is this page?

The grade is for one exact copy of the source (8929e1ef80fb), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement