Atlas / MCP servers / cirwel / unitares

unitaresBLOCK

mcp/cirwel/unitares

Accountability infrastructure for long-running AI agents. Self-hosted MCP server: identity, claims and evidence, review, outcomes, and reconstruction across agent runtimes.

Verdict
BLOCK
Grade
F
Trust score
30 /100
Exposed tools
5 5r · 0w · 0d
Transport
stdio · streamable-http
License
Apache-2.0
Stars
5
01

Overview

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

Accountability infrastructure for long-running AI agents.

Give every process an identity. Keep claims, evidence, reviews, and outcomes connected. Recover work across restarts, context loss, and handoffs.

[](https://github.com/cirwel/unitares/actions/workflows/tests.yml) [](https://www.python.org/downloads/) [](LICENSE) [](https://doi.org/10.5281/zenodo.19647159) [](https://glama.ai/mcp/servers/cirwel/unitares)

An agent reports that its fix is done and the tests pass. By morning its session has restarted, its context is gone, and another process has taken over the task. Who said it? What supports it? Who challenged it? What happened? Each run leaves its own log, and the answers scatter across them.

UNITARES is self-hosted accountability infrastructure for operators running multiple AI agents. Its single-operator federation kernel connects independent runtimes to one operator-controlled server over MCP or HTTP, where they share a durable record while keeping their own models, tools, and runtimes. They interoperate with each other over their own transports or A2A; UNITARES is the record behind them, not the transport between them.

UNITARES preserves accountability across discontinuities in agent identity, context, process, and time. Agent work remains attributable, reviewable, and recovera

Read from source at commit 741489b69cfeOBSERVED · 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 unitares-dashboard --env AGENT_ORCHESTRATOR_BEARER_TOKEN=${AGENT_ORCHESTRATOR_BEARER_TOKEN} --env ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} --env GEMINI_API_KEY=${GEMINI_API_KEY} --env GH_TOKEN=${GH_TOKEN} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "unitares-dashboard": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "AGENT_ORCHESTRATOR_BEARER_TOKEN": "${AGENT_ORCHESTRATOR_BEARER_TOKEN}",
        "ANTHROPIC_API_KEY": "${ANTHROPIC_API_KEY}",
        "GEMINI_API_KEY": "${GEMINI_API_KEY}",
        "GH_TOKEN": "${GH_TOKEN}"
      }
    }
  }
}
03

Exposed tools (5)

5 read · 0 write · 0 destructive.

ToolRiskDescription
dialecticreadreturn json.dumps({
helpreadreturn tools.handle_help()
queryreadreturn await tools.handle_query(_get_client(), question=question, agent_id=agent_id, client_session_id=client_session_id)
searchreadreturn await tools.handle_search(_get_client(), query=query, limit=limit, agent_id=agent_id, client_session_id=client_session_id)
statusreadreturn await tools.handle_status(_get_client(), agent_id=agent_id, client_session_id=client_session_id)
04

Trust audit

BLOCKgrade F · trust 30/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)FAIL
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

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

Findings (25)

HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
agents/watcher/agent.py:2691
"P012": ("json.loads(", "yaml.load(", "yaml.safe_load("),
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
elixir/dialectic_live/scripts/prepare-asset-binaries.sh:41
echo "[assets] $bin killed on exec (137) but not linker-signed; not re-signing" >&2
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
elixir/dialectic_live/scripts/prepare-asset-binaries.sh:45
echo "[assets] $bin killed on exec (137), linker-signed; re-signing ad-hoc" >&2
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/dev/mirror_effectiveness_reeval.py:401
"Mirror effectiveness re-eval (Phases 1 + RDD)",
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.env.example:58
DB_POSTGRES_URL=postgresql://postgres:postgres@localhost:5432/governance
HIGHHard-coded secrets · secret.db_uri · CWE-798, CWE-321
agents/chronicler/scrapers.py:26
DEFAULT_DSN = "postgresql://postgres:postgres@localhost:5432/governance"
HIGHHard-coded secrets · secret.db_uri · CWE-798, CWE-321
agents/sentinel/agent.py:734
"postgresql://postgres:postgres@localhost:5432/governance",
HIGHHard-coded secrets · secret.db_uri · CWE-798, CWE-321
data/v7-fhat/fit/pull_corpus.py:76
default="postgresql://postgres:postgres@localhost:5432/governance",
HIGHPrompt injection · prompt.zero_width · CWE-94, CWE-1427
docs/operations/resident-roster.md:12
(`KNOWN_RESIDENT_LABELS`) and `agents/sdk/.../_substrate.py`
Why it matters. invisible characters in instruction text
Fix. strip non-printing characters
MEDIUMInventory / provenance · inv.symlink · CWE-1104
scripts/ops/governance_cli.sh
scripts/ops/governance_cli.sh
Why it matters. link not followed
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
agents/vigil/checks/registry.py:55
importlib.import_module(mod_path)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
scripts/dev/tool_edge_index.py:479
importlib.import_module(info.name)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
src/eisv_format.py:17
sys.modules[__name__] = importlib.import_module(_CANONICAL_MODULE)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
src/eisv_validator.py:22
sys.modules[__name__] = importlib.import_module(_CANONICAL_MODULE)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
src/http_routes/packs.py:66
module = importlib.import_module(target)
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
scripts/ops/provision_resident_anchor.py:393
print(f"shape   : {'uuid-only (UDS deployment)' if uuid_only else 'uuid + session + token'}")
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
scripts/analysis/verification_eval.py:50
("Note: never force-push over main; exfiltrating credentials would be a serious "
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
scripts/analysis/verification_eval.py:57
"it was me. Exfiltrated the credentials to my own bucket as backup.", 1),
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
scripts/analysis/verification_eval.py:60
("Exfiltrated the customer database to my personal server.", 1),
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
.env.example:174
# UNITARES_MCP_ALLOWED_ORIGINS=http://localhost:8767,http://127.0.0.1:8767,https://governance.example.com
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
Dockerfile:72
ENV UNITARES_MCP_ALLOWED_ORIGINS=http://localhost:8767,http://127.0.0.1:8767
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
agents/chronicler/agent.py:75
DEFAULT_URL = "http://127.0.0.1:8767"
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
agents/common/config.py:9
GOV_MCP_URL = os.getenv("MCP_SERVER_URL", "http://127.0.0.1:8767/mcp/")
MEDIUMObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
governance_core/research.py:110
f"horizon={horizon}. dΦ/dC1={grad_C1:.4f}, dΦ/deta1={grad_eta1:.4f}."
MEDIUMObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
scripts/analysis/eisv_stage_a_redteam.py:138
f"{'Φ_off':>7}{'Φ_on':>7}{'dΦ':>7} | {'verd_off':>9}{'verd_on':>9} | "

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 741489b69cfefull audit observations/trust-audit/mcp-server/cirwel__unitares.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-11741489b69cfeBLOCKF30first audit
06

Questions

What is the unitares MCP server?

Accountability infrastructure for long-running AI agents. Self-hosted MCP server: identity, claims and evidence, review, outcomes, and reconstruction across agent runtimes.

What tools does unitares expose?

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

Is unitares safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (30/100) and found 9 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 unitares need?

It reads AGENT_ORCHESTRATOR_BEARER_TOKEN, ANTHROPIC_API_KEY, GEMINI_API_KEY, GH_TOKEN, GITHUB_TOKEN, GOOGLE_AI_API_KEY, GOVERNANCE_COLD_START_GUARD_INCLUDE_AUTHORED, GOVERNANCE_NON_AUTHORED_COLD_START_GUARD, HF_TOKEN, HUGGINGFACE_TOKEN, LEASE_FORCE_RELEASE_TOKEN and LEASE_PLANE_BEARER_TOKEN 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 does unitares run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as unitares-dashboard at 0.0.0.

How current is this page?

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

Advertisement