Atlas / MCP servers / sppideey / ucode-agent

ucode-agentBLOCK

mcp/sppideey/ucode-agent

Free, open-source AI coding agent for your terminal. Builds whole apps in about a minute on Google Gemini's free tier, edits real code, checks and fixes its own work, with undo, MCP and a headless mode.

Verdict
BLOCK
Grade
D
Trust score
69 /100
Exposed tools
29 16r · 13w · 0d
Transport
—
License
AGPL-3.0
Stars
2
01

Overview

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

A free, open-source AI coding agent for your terminal. Builds whole apps in about a minute on Google Gemini's free tier — then opens them and clicks through to check its own work.

[](https://www.npmjs.com/package/ucode-agent) [](https://www.npmjs.com/package/ucode-agent) [](https://github.com/sppideey/ucode-agent/actions/workflows/test.yml) [](LICENSE) [](https://nodejs.org) [](https://github.com/sppideey/ucode-agent/stargazers)

npm i -g ucode-agent     # Node 22 or newer
ucode login YOUR_KEY     # a free key from aistudio.google.com/apikey
ucode                    # in any project folder

A coding agent that lives in your terminal, like Claude Code or Codex CLI — but free: it runs on Gemini's free tier, or on Ollama with no internet at all. It reads your code, edits it, runs your commands, checks its own work, and keeps every conversation on disk. If it helps you, a ⭐ helps other people find it.

At a glance

Read from source at commit 8a7e259e2088OBSERVED · 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 __APP_SLUG__ --env GEMINI_API_KEY=${GEMINI_API_KEY} --env GOOGLE_API_KEY=${GOOGLE_API_KEY} --env TAVILY_API_KEY=${TAVILY_API_KEY} --env UCODE_API_KEY=${UCODE_API_KEY} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "__APP_SLUG__": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "GEMINI_API_KEY": "${GEMINI_API_KEY}",
        "GOOGLE_API_KEY": "${GOOGLE_API_KEY}",
        "TAVILY_API_KEY": "${TAVILY_API_KEY}",
        "UCODE_API_KEY": "${UCODE_API_KEY}"
      }
    }
  }
}
03

Exposed tools (29)

16 read · 13 write · 0 destructive.

ToolRiskDescription
Oneshotreada tasks app
Tidereada tasks app
add_blockwriteAdd a ready-made, polished piece of an app, copied in as an ordinary source file
batch_writewriteCreate or replace several files in one call. Use this to lay out a whole
change_lookreadChange how ucode itself looks in the terminal - only when the user asks about ucode, not about an app.
change_terminalreadChange the terminal window ucode is running in - its background, text colour, cursor, font, font size, or
create_appwriteStart a new app AND write it, in one call. Pass
delegatewriteBuild independent parts in parallel. Up to 3 workers run at once, each with the
deploywritePut an app online on Vercel and get its live link - use it when the user asks to deploy,
echoreadEcho
edit_filewriteReplace one exact piece of text in a file. old_string must match the file
edit_fileswriteExact replacements across several files in one call - the fastest way to make
find_symbolreadFind where a function, component, class or type is declared. Use this instead of
globreadFind files by name pattern, most recently changed first. Understands **, *, ?
grepreadSearch inside files with a regular expression. Returns file:line: text for
list_dirreadList what is in one directory, with file sizes.
load_skillreadLoad the full instructions for one of the skills listed in your system prompt.
look_at_appreadOpen the running app in a real browser at a phone width (375px) and a desktop width
multi_editwriteSeveral exact replacements in one file, applied in order, each seeing the
outlinereadThe shape of the code without reading all of it: what each file declares, and the
read_filereadRead one text file - for two or more, use read_files instead. Comes back as numbered lines — the numbers are for you to
read_filesreadRead several text files in one call. Use this whenever you need more than one
rename_symbolwriteRename a function, component, variable, prop or type everywhere it appears as
run_commandwriteRun a shell command and get back its output and exit code. It runs without
run_commandswriteRun several shell commands at once, up to max_parallel at a time. Good for
type_ofreadAsk the TypeScript this project has installed what something actually is: the exact
update_planwriteKeep a short checklist the user can see, for work with three or more steps.
web_searchreadSearch the web and get back titles, links and summaries. For anything the
write_filewriteCreate a file, or replace all of its contents. For a change to part of an
04

Trust audit

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

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

Findings (20)

HIGHNetwork egress · net.tls_off · CWE-200, CWE-319
src/core/loop.js:1599
let askedToVerify = false;
Why it matters. certificate verification is disabled
Fix. leave verification on
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
src/tools/browser.js:471
return await fn(`http://127.0.0.1:${server.address().port}`);
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
src/core/skills.js:50
const match = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/.exec(text.replace(/^/, ''));
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
src/core/terminal.js:190
settings = JSON.parse(jsonrepair(text.replace(/^/, '')));
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
src/ui/plain.js:61
const clean = line.replace(/^/, ''); // strip a BOM on the first line
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
test/more/openable.js:33
new Function(js); // parses as a classic script
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
test/more/openable.js:47
new Function(js);
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/core/settings.js:99
const hash = createHash('sha1').update(JSON.stringify(value));
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/core/snapshot.js:58
const id = createHash('sha1').update(this.cwd.toLowerCase()).digest('hex').slice(0, 16);
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/core/stuck.js:38
const hash = (s) => createHash('sha1').update(String(s)).digest('hex').slice(0, 16);
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/tools/cache.js:39
const hash = createHash('sha1').update(String(lockText ?? '')).digest('hex').slice(0, 12);
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/core/version.js:13
return JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8')).version;
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
test/evals/run.js:18
import { checkHtml } from '../../src/core/htmlcheck.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
test/more/appeal.js:5
import { Screen } from '../../src/ui/screen.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
test/more/appeal.js:8
} from '../../src/ui/theme.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
test/more/appeal.js:9
import { bannerSweep, SWEEP_MS } from '../../src/ui/activity.js';
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
test/more/google.js:24
const client = new OpenAI({ apiKey: 'x', baseURL: `http://127.0.0.1:${server.address().port}`, maxRetries: 0 });
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
test/run.js:1545
process.env.UCODE_BASE_URL = `http://127.0.0.1:${server.address().port}`;
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@babel/parser, chalk, dotenv, jsonrepair, marked, marked-terminal, openai, playwright-core
Why it matters. 10 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
templates/next-shadcn/package.json
class-variance-authority, clsx, cmdk, cn, date-fns, lucide-react, next-themes, radix-ui
Why it matters. 21 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 8a7e259e2088full audit observations/trust-audit/mcp-server/sppideey__ucode-agent.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-118a7e259e2088BLOCKD69first audit
06

Questions

What is the ucode-agent MCP server?

Free, open-source AI coding agent for your terminal. Builds whole apps in about a minute on Google Gemini's free tier, edits real code, checks and fixes its own work, with undo, MCP and a headless mode.

What tools does ucode-agent expose?

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

Is ucode-agent safe to connect to an agent?

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

What credentials does ucode-agent need?

It reads GEMINI_API_KEY, GOOGLE_API_KEY, TAVILY_API_KEY, UCODE_API_KEY, UCODE_DEBUG_KEYS, UCODE_FOLD_TOKENS, UCODE_MAX_CONTEXT_TOKENS and VERCEL_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 current is this page?

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

Advertisement