Atlas / MCP servers / michaeljboscia / triumvirate

triumvirateCAUTION

mcp/michaeljboscia/triumvirate

Five AI agents. One coordination layer. No relay server. Plus a trust layer that checks whether the review actually happened.

Verdict
CAUTION
Grade
F
Trust score
55 /100
Exposed tools
16 16r · 0w · 0d
Transport
streamable-http
License
NOASSERTION
Stars
1
01

Overview

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

[](https://github.com/michaeljboscia/triumvirate/actions) [](https://github.com/michaeljboscia/triumvirate/releases) [](LICENSE)

Five AI agents. One daemon. A methodology for building software with all of them at once, and a trust layer that checks whether they actually did the work.

Claude, Codex, Antigravity (the Gemini seat), Grok and DeepSeek, each with different strengths, working on the same codebase, coordinated by a single Rust daemon, visible in real time from inside your editor.

The hard part of multi-agent development is not dispatch. It is knowing whether a peer that said "looks good" read anything at all. Triumvirate answers that mechanically: a review that opened no files is rejected, a reviewer that skimmed one line is rejected, and code can be validated by a different agent that writes the tests without ever seeing the implementation.

Quick Start

git clone https://github.com/michaeljboscia/triumvirate
cd triumvirate
bash scripts/install.sh

That's it. One binary. No Docker. No NATS. No cloud services. Register it in Claude Code:

# Add to ~/.claude.json under mcpServers:
"triumvirate": { "command": "~/.local/bin/triumvirate", "args": ["mcp"] }
Do NOT point this at `daemon/target/release/triumvirate`. target/ is Cargo's disposable build directory: cargo clean, a toolchain change or any disk cleaner wipes it. When that happened here on 2026-07-23, every new MCP session in every repo failed with ENOENT while already-running processes kept working, because Unix keeps a deleted binary alive for an open file descriptor. A total outage disguised as "broken everywhere except here". scripts/install.sh builds into target/ and then i
Read from source at commit 5b75f04ee349OBSERVED · 2026-10-11
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.

claude-code
claude mcp add pantheon -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "pantheon": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ]
    }
  }
}
03

Exposed tools (16)

16 read · 0 write · 0 destructive.

ToolRiskDescription
ask_agentread
ask_sessionread
daemon_healthread
dismiss_sessionread
dispatch_codexread
dispatch_codex_worktreeread
fleet_cancelread
fleet_spawnread
fleet_statusread
get_task_outputread
get_task_statusread
pingread
query_antigravityread
query_geminiread
review_agentread
spawn_sessionread
04

Trust audit

CAUTIONgrade F · trust 55/100 Install with care. The audit found things worth knowing before you trust its output.

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

What the source does

Filesystem
declared (15 observation(s))
Network
declared (6 observation(s))
Shell
none-observed
Dependencies
not all pinned
Secrets in source
found

Findings (25)

MEDIUMInventory / provenance · inv.binary · CWE-1104
pantheon/src-tauri/icons/icon.icns
icon.icns
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
archive/daemon-v1/crates/agentd/src/main.rs:157
"triumvirate-agentd ready — dashboard at http://127.0.0.1:{}",
MEDIUMObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
daemon/crates/triumvirate/src/agy.rs:1389
"éresource_exhaustedβ is an identifier",
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
daemon/crates/triumvirate/src/main.rs:5330
let token = "status-daemon-token-123";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
daemon/crates/triumvirate/src/main.rs:5755
let token = "mcp-daemon-token-123";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
daemon/crates/triumvirate/src/main.rs:5910
let token = "mcp-memory-daemon-token-123";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
daemon/crates/triumvirate/src/main.rs:6055
let token = "mcp-scratchpad-daemon-token-123";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
daemon/crates/triumvirate/src/main.rs:6188
let token = "mcp-fallback-daemon-token-123";
MEDIUMAuth / authz · mcp.remote_no_auth · CWE-287, CWE-862
streamable-http
Why it matters. a network transport with no auth environment variable found
Fix. require a token
LOWInventory / provenance · inv.hidden_file · CWE-1104
.gitmodules
.gitmodules
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.goatrodeo.events.log
.goatrodeo.events.log
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
archive/daemon-v1/crates/agentd/build.rs:5
let frontend_dir = Path::new("../../frontend");
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
archive/daemon-v1/crates/agentd/build.rs:8
println!("cargo:rerun-if-changed=../../frontend/src");
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
archive/daemon-v1/crates/agentd/build.rs:9
println!("cargo:rerun-if-changed=../../frontend/package.json");
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
archive/daemon-v1/crates/agentd/build.rs:10
println!("cargo:rerun-if-changed=../../frontend/package-lock.json");
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
archive/daemon-v1/crates/agentd/build.rs:11
println!("cargo:rerun-if-changed=../../frontend/vite.config.ts");
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
docs/pantheon/gcp-test-plan/REVIEW-PROGRESS.md:597
**G6-C4. Four egress paths are unaddressed:** IPv6 (no `::/0` denial), the metadata server at `169.254.169.254`
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
docs/pantheon/gcp-test-plan/review-raw/gate-6-unit-1.md:23
**6. Step 1 does not apply firewall rules at all in this range.** It provisions with `--no-address` (92-105), **but no deny/allow egress rules are created or attached.** Unaddressed paths: **IPv6** (n
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
archive/README-v1.md:9
# Dashboard at http://127.0.0.1:8080
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
archive/README-v1.md:77
Open `http://127.0.0.1:8080` in your browser.
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
archive/daemon-v1/BUILD.md:18
cargo run            # Boot daemon, dashboard at http://127.0.0.1:8080
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
archive/daemon-v1/README.md:40
- `TRIUMVIRATE_URL` can override the default `http://127.0.0.1:8080`.
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
daemon/crates/agent-adapter/tests/fixtures/grok-streaming-20260830.jsonl:36
{"type":"usage","usage":{"input_tokens":66559,"output_tokens":39,"cache_read_input_tokens":512,"cache_creation_input_tokens":0,"reasoning_tokens":34},"signature":"UlrgMZF1iBLUtNZn5paL3Q3AxoqM6bxx/zSl4
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
daemon/crates/agent-adapter/tests/fixtures/grok-streaming-lean-20260830.jsonl:35
{"type":"usage","usage":{"input_tokens":57474,"output_tokens":31,"cache_read_input_tokens":256,"cache_creation_input_tokens":0,"reasoning_tokens":30},"signature":"KZNO7heqObAmpApMsem/pnCZsCxI/Me3Yd1Et
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
daemon/crates/agent-adapter/tests/fixtures/grok-streaming-tools-20260830.jsonl:45
{"type":"usage","usage":{"input_tokens":1357,"output_tokens":61,"cache_read_input_tokens":11648,"cache_creation_input_tokens":0,"reasoning_tokens":30},"signature":"yvPCYL6zxTRJPxEfaPpe9LIpckX5dGuKg8OF

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 5b75f04ee349full audit observations/trust-audit/mcp-server/michaeljboscia__triumvirate.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-115b75f04ee349CAUTIONF55first audit
06

Questions

What is the triumvirate MCP server?

Five AI agents. One coordination layer. No relay server. Plus a trust layer that checks whether the review actually happened.

What tools does triumvirate expose?

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

Is triumvirate safe to connect to an agent?

With care. The audit graded it F (55/100) and found 25 things worth knowing before you trust this server, listed below with the exact line each was found on.

What credentials does triumvirate need?

No credential environment variables were found in its source, so it appears to need none.

How does triumvirate run?

It speaks streamable-http, so it runs as a service you connect to over the network. It is published on npm as pantheon at 0.1.0.

How current is this page?

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

Advertisement