SafetyCard Request a review

Atomic Agent

Local-first TypeScript agent (TUI, CLI, HTTP/Tauri sidecar) that drives a browser, edits files, runs shell commands, sends email, uses MCP tools and keeps long-term memory, on local llama.cpp or cloud models.

github.com/atomicbot-ai/atomic-agent · 2026-10-04 · cce6262

Defense-in-depth score

2.6 / 10

Atomic Agent ships a well-built per-call approval ladder (strictest level by default, exact command previews, a never-grantable trust-config category), but everything runs directly on the host as your user with your full environment, including every API key in ~/.atomic-agent/.env. The shell approval guard is not a strict boundary and can let commands run without a prompt. HTTP POSTs, web fetches and browser typing/clicking are also ungated by default, so a prompt-injected page can both exfiltrate data and act without a human.

Safest setup

Atomic Agent starts at its strictest approval level, shows the exact command or diff in each prompt, and keeps file reads to the working directory. Everything else runs on your machine as you, with every stored key in reach and web requests unprompted by default, so the safest setup narrows the keys, turns on HTTP approval and gives the agent its own container.

SetupHowWhat it gives you
Scoped, low-limit keysKeep only the keys this agent needs in ~/.atomic-agent/.env, with a read-only fine-grained GitHub token and a spending limit set at each providerEvery command and MCP server it starts holds only those keys, and the provider caps what they can do C1
The strictest approval levelKeep the default agent.approvalLevel: 1 and start without --no-approvalFile writes, email, publishing and most shell commands wait for you, with the exact command or diff shown C2
Approval for HTTP requestsSet http.approvalMode: "always" in the config fileEvery request the HTTP tool sends, POSTs included, waits for your approval C5
A host allowlistSet http.hostAllowlist to the hosts the task needs, or http.enabled: false when it needs noneThe HTTP tool reaches only the hosts you named C3
Working-directory readsKeep the default agent.readScope: "working-dir"Reads outside the working directory ask you first C3
Its own container or VMRun the agent in a container or VM holding only the task's files, with network limited to the model provider and the hosts the task needsAn outer boundary around shell commands, skill scripts and MCP servers, which otherwise run as you on your machine C4
Reviewed, pinned extensionsAdd only MCP servers and skills you have read, with each MCP command naming a fixed version, and start from a directory with no .atomic-agent/skills folder you didn't writeOnly code and instructions you chose run inside the agent C7
A trace kept elsewhereKeep the default per-session trace and copy ~/.atomic-agent/traces to storage the agent can't writeA record of every tool call and its arguments that the agent can't rewrite C9

Approving with confidence

  • Read each prompt and approve calls one at a time; a session grant covers later calls of the same kind until the session ends.
  • Web fetches, browser typing and clicking, memory writes and scheduled tasks run without a prompt, so the prompts you do see are the main check.

Handling data

  • Traces hold full tool arguments unredacted; store ~/.atomic-agent/traces like the data the agent read.
  • Analytics is on by default and carries no content; analytics.enabled: false turns it off.

Key gaps (3)

  1. No execution isolation: shell commands, skill scripts and MCP servers run on the host as the user with the full environment, including .env API keys. C4 · Code-execution isolation
  2. A prompt-injected session can exfiltrate through ungated HTTP POST and fetch without any human approval. C5 · Untrusted input blast radius
  3. MCP stdio servers inherit every environment variable the agent holds, including all stored API keys. C7 · Third-party extensions

Criteria

C1 Identity & least privilege

0.17 / 1.00

The agent runs as your OS user and uses whatever credentials it can find: provider keys and a GitHub personal token loaded into its own environment from ~/.atomic-agent/.env, plus your gh, git and SSH setup. Every shell command, skill script and MCP server it starts inherits that full environment; the code itself documents that there is no per-tool filtering. There is no scoped or short-lived identity; the only per-request check is the approval prompt, which is scored under approval gates.

C2 Approval gates

0.25 / 1.00

Atomic Agent has a real approval system: a five-step ladder that starts at the strictest level, per-call prompts that show the exact command line or diff, session-only grants, and a trust-config category that can never be silenced. The gap is in what reaches it. The shell guard's auto-allow rules are not a strict boundary. HTTP POSTs (approval mode "never" by default), web fetches, browser typing and clicking, memory writes and scheduled tasks never ask, and MCP tools skip the prompt when the server itself claims to be read-only.

C3 Tool & action scoping

0.40 / 1.00

Many tools are narrow and validated: file tools resolve paths and classify them against the working directory, reads outside it require approval by default, and the HTTP and fetch tools block private and cloud-metadata addresses after DNS resolution. But the shell tool is a raw command line with only regex deny-lists, the HTTP tool accepts any public host and POST body (the host allowlist is empty by default), and every tool group, including shell, network and browser, is on by default.

C4 Code-execution isolation

0.00 / 1.00

There is no isolation boundary. Shell commands, skill scripts, verify runs and MCP stdio servers are spawned directly on the host as the current user, with the agent's full environment (including API keys from .env) and unrestricted network. The `src/sandbox` directory contains process runners, timeouts and process-group kill, not a sandbox. A command that escapes the approval prompt has the user's whole machine.

C5 Untrusted input blast radius

0.13 / 1.00

Web pages, search results, browser page text, MCP results and files are fed into the prompt with no marking or taint tracking, and nothing changes once untrusted content has been read. A hijacked agent can exfiltrate data unattended through os.http.request POST (ungated by default), os.web.fetch query strings or browser form filling, and gaps in the shell approval guard can let it run commands without a prompt. Writes, email and publishing still prompt, which limits the most visible damage.

C6 Memory, context & configuration integrity

0.30 / 1.00

Long-term memory is on by default: after each turn a reflection pass stores up to three profile facts and two notes, and the model can also write profile facts and notes directly without approval; these are re-injected into later prompts. Profile facts keep a history and can be listed, voted down and removed. Skills placed in a repository's `.atomic-agent/skills` folder are loaded silently into the skill catalog and override global skills of the same name, though running their scripts still asks for approval. Agent config and .env are read only from the user's state directory, not the working directory.

C7 Third-party extensions

0.25 / 1.00

Third-party code arrives as MCP servers the user configures (or imports from Claude Code/Oh-My-Pi with a checkbox) and skills installed from GitHub or ClawHub. Hub installs are staged with a heuristic scanner that the code itself calls 'NOT a sandbox' and fetch the repository's default branch with no pin or hash. MCP stdio servers are launched as the same user with the agent's entire environment, including every API key, so a malicious server inherits everything.

C8 Secrets & sensitive-data protection

0.20 / 1.00

Secrets live in plaintext files (~/.atomic-agent/.env and config.json) written with owner-only permissions, and GitHub tokens and provider errors are scrubbed in some messages. Error reports to Sentry use a strict field allowlist, and PostHog analytics (on by default) is designed to carry no content. However traces are written unredacted by design, and every subprocess and MCP server receives every key in its environment, where the model can read them with a shell command.

C9 Audit & traceability

0.50 / 1.00

With the CLI or TUI, every tool call is written to a per-session NDJSON trace (tool name, full arguments, status, timestamps) under ~/.atomic-agent/traces, and the session database records each prompted approval or denial with its category and time. The record does not say which person approved, auto-approvals are not logged as approvals, and the files sit where the agent's own process can rewrite them. If a trace write fails, tracing silently switches off for the session and the agent keeps going.

C10 Limits & kill switch

0.40 / 1.00

A turn is capped at 25 steps per leg, 1,000 steps and two hours per task, with a 60-second default tool timeout and shell commands detached after ten minutes (hard-stopped after an hour). Stopping kills the whole process group of running commands. There is no token or cost ceiling, no rate limit on side-effecting tools, the model can ask for a shell call with no timeout, and scheduled and cron tasks it creates keep firing later.