Atlas / MCP servers / zzoretich / UniDeX-Agent-Harness

UniDeX-Agent-HarnessBLOCK

mcp/zzoretich/unidex-agent-harness

UniDeX Agent Harness: a second brain and supervised Chief of Staff for Claude Code and Codex CLI, with persistent memory, recall and session capture, plus proposals you approve before anything changes. Lives in a plain-Markdown vault, with the UniDeX macOS app as its live dashboard.

Verdict
BLOCK
Grade
F
Trust score
25 /100
Exposed tools
44 42r · 2w · 0d
Transport
stdio
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.

A second brain for Claude Code and Codex CLI, and a macOS app that renders it. Persistent memory · recall · session capture · a named Chief of Staff · a live monitor of it all.

Quick start · Prerequisites · Installation · Screenshots · First session · Chief of Staff · Commands · How it works · Docs

Claude Code and Codex CLI forget everything between sessions. UniDeX gives them a vault they can read from on every prompt and write back to at the end of every session, then puts a dashboard on to

Read from source at commit 5fa102102840OBSERVED · 2026-10-08
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 agenticos-workbench --env ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} --env APPLE_KEYCHAIN_PROFILE=${APPLE_KEYCHAIN_PROFILE} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "agenticos-workbench": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "ANTHROPIC_API_KEY": "${ANTHROPIC_API_KEY}",
        "APPLE_KEYCHAIN_PROFILE": "${APPLE_KEYCHAIN_PROFILE}"
      }
    }
  }
}
03

Exposed tools (44)

42 read · 2 write · 0 destructive.

ToolRiskDescription
DefaultreadClaude Code
ExplorereadFind the status bar code
FablereadThe latest Fable
GPT-AstrareadFrontier intelligence.
GPT-LunareadFast and affordable.
GPT-OldreadOlder.
GPT-SolreadWorkhorse.
GPT-Tide-2readThe previous generation.
GPT-Tide-3readThe newest tide model.
HaikureadThe latest Haiku
OpusreadThe latest Opus
SonnetreadThe latest Sonnet
areadfirst line second line
brief_readread
code-reviewreadReview the current diff
compactreadCompact the conversation
deploywriteShip the app
docs_researcherreadChecks APIs
docxreadWord documents
explorerreadExplores
feedback_rulesread
graph_neighborsread
graph_overviewread
graph_pathread
graph_queryread
imagegenreadImages
memory_listread
memory_readread
memory_searchread
my-modelreadCustom model id
pattern_listread
plannerreadPlans
pr_explorerreadMaps code paths
recallread
reviewreadReview the open changes
reviewerreadReviews diffs
routine_listread
session_listread
session_recallread
snapshot_readread
tide-reportwriteWrite the tide report
triagereadTriage issues
wrapreadSession end
wrap_sessionread
04

Trust audit

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

LayerWhat it checksResult
L0Provenance & inventoryFAIL
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 (13 observation(s))
Network
declared (10 observation(s))
Shell
declared (10 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (25)

CRITICALPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
codex-plugin/skills/wrap/SKILL.md:44
2. **In-session extraction.** Use the `wrap` skill: review this conversation and call the `wrap_session` tool of the `agenticos` MCP server (`mcp__agenticos__wrap_session`) exactly once with `facts`,
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
CRITICALPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
plugin/commands/wrap.md:9
2. **In-session extraction.** Use the `wrap` skill: review this conversation and call the `wrap_session` tool of the `agenticos` MCP server (`mcp__plugin_agenticos_agenticos__wrap_session`) exactly on
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
HIGHInventory / provenance · inv.suspicious_name · CWE-1104
app/scripts/make-payload.mjs
make-payload.mjs
Why it matters. member named after an attack tool
Fix. remove or justify
HIGHInventory / provenance · inv.suspicious_name · CWE-1104
app/src/main/setup/payload.ts
payload.ts
Why it matters. member named after an attack tool
Fix. remove or justify
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
brain/scripts/lib/host-routines.js:130
out = exec(sqlite3, ['-readonly', '-json', db, CODEX_SQL], { encoding: 'utf8', timeout: 5000, stdio: ['ignore', 'pipe', 'pipe'] });
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
brain/scripts/sdk/lib/codex-cli.js:291
exec(bin, ['login', 'status'], { timeout: opts.timeoutMs || 10000, env: headlessEnv(), encoding: 'utf8' }, (err, stdout, stderr) => {
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
cli/cost-cmd.js:45
const r = bin ? exec(bin, ['--version'], { encoding: 'utf8' }) || {} : { error: new Error('AOS_PYTHON_BIN is empty') };
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
cli/graph-cmd.js:69
const r = exec(bin, ['--version'], { encoding: 'utf8', timeout: 30000, stdio: ['ignore', 'pipe', 'pipe'] });
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
cli/graph-cmd.js:161
const r = exec(uv, args, {
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
app/scripts/smoke-packaged.mjs:115
const browser = await until(() => chromium.connectOverCDP(`http://127.0.0.1:${port}`, { timeout: 2_000 }), 30_000, 500);
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
app/scripts/smoke-packaged.mjs:249
const b2 = await until(() => chromium.connectOverCDP(`http://127.0.0.1:${port2}`, { timeout: 2_000 }), 30_000, 500);
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
app/src/main/policy/setup.ts:26
export const OLLAMA_URL = "http://127.0.0.1:11434";
MEDIUMObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
brain/scripts/cost-budget.js:181
process.stdout.write(`  ${r.ts}  real $${r.realUsd}  Δreal $${r.realDelta ?? '—'}  Δanalyzer $${r.tgRawDelta ?? '—'}  derived ${r.derivedCalibration ?? '—'}\n`);
MEDIUMPrompt injection · prompt.conditional_escalation · CWE-94, CWE-1427
codex-plugin/skills/persona-sitrep/SKILL.md:19
2. Otherwise — or whenever the user says "refresh sitrep" — run the Rebuild below.
MEDIUMPrompt injection · prompt.conditional_escalation · CWE-94, CWE-1427
plugin/skills/persona-sitrep/SKILL.md:16
2. Otherwise — or whenever the user says "refresh sitrep" — run the Rebuild below.
LOWInventory / provenance · inv.hidden_file · CWE-1104
.gitleaks.toml
.gitleaks.toml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
brain/scripts/test/fixtures/empty/.keep
.keep
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
vault-template/.graphifyignore
.graphifyignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
brain/scripts/collectors/workspaces.js:200
return crypto.createHash('sha1').update(JSON.stringify(stable)).digest('hex').slice(0, 16);
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
brain/scripts/embed-vault.js:73
const hash = crypto.createHash('sha1').update(raw).digest('hex');
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
brain/scripts/lib/markers.js:13
const VAULT_KEY = crypto.createHash('sha1').update(PATHS.VAULT).digest('hex').slice(0, 8);
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
brain/scripts/statusline.js:137
const gitCacheFile = (dir, tmp) => path.join(tmp, `aos-sl-git-${crypto.createHash('sha1').update(dir).digest('hex').slice(0, 16)}.json`);
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
extras/cost/analyze_transcript.py:382
return hashlib.sha1(joined.encode("utf-8")).hexdigest()
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
app/tests/unit/main-policy.test.ts:40
for (const p of ["/etc/passwd", `${HOME}/.ssh/config`, `${HOME}/Documents/x.md`, `${VAULT}-other/x.md`, `${VAULT}/../x`, "relative/x", "", `${VAULT}/a\0b`,
Why it matters. touches a credential store
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
app/tests/unit/main-policy.test.ts:61
for (const p of [`${HOME}/.codex/auth.json`, `${HOME}/.claude/.credentials.json`, `${VAULT}/workspaces/app/.env`, `${VAULT}/.env.local`, `${VAULT}/certs/server.pem`, `${VAULT}/id_ed25519`])
Why it matters. touches a credential store

Gates applied: critical_finding, no_behavioural_pass, undeclared_transfer.

Audited 2026-10-08 · audit v0.4.1 · source sha 5fa102102840full audit observations/trust-audit/mcp-server/zzoretich__unidex-agent-harness.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-085fa102102840BLOCKF25first audit
06

Questions

What is the UniDeX-Agent-Harness MCP server?

UniDeX Agent Harness: a second brain and supervised Chief of Staff for Claude Code and Codex CLI, with persistent memory, recall and session capture, plus proposals you approve before anything changes. Lives in a plain-Markdown vault, with the UniDeX macOS app as its live dashboard.

What tools does UniDeX-Agent-Harness expose?

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

Is UniDeX-Agent-Harness safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (25/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 UniDeX-Agent-Harness need?

It reads ANTHROPIC_API_KEY and APPLE_KEYCHAIN_PROFILE 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 UniDeX-Agent-Harness run?

It speaks stdio, so it runs as a local process your client starts. It is published on npm as agenticos-workbench at 1.4.0.

How current is this page?

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

Advertisement