ucode-agentBLOCK
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.
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
8a7e259e2088OBSERVED · 2026-10-11Connect
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 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]{
"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}"
}
}
}
}Exposed tools (29)
16 read · 13 write · 0 destructive.
| Tool | Risk | Description |
|---|---|---|
Oneshot | read | a tasks app |
Tide | read | a tasks app |
add_block | write | Add a ready-made, polished piece of an app, copied in as an ordinary source file |
batch_write | write | Create or replace several files in one call. Use this to lay out a whole |
change_look | read | Change how ucode itself looks in the terminal - only when the user asks about ucode, not about an app. |
change_terminal | read | Change the terminal window ucode is running in - its background, text colour, cursor, font, font size, or |
create_app | write | Start a new app AND write it, in one call. Pass |
delegate | write | Build independent parts in parallel. Up to 3 workers run at once, each with the |
deploy | write | Put an app online on Vercel and get its live link - use it when the user asks to deploy, |
echo | read | Echo |
edit_file | write | Replace one exact piece of text in a file. old_string must match the file |
edit_files | write | Exact replacements across several files in one call - the fastest way to make |
find_symbol | read | Find where a function, component, class or type is declared. Use this instead of |
glob | read | Find files by name pattern, most recently changed first. Understands **, *, ? |
grep | read | Search inside files with a regular expression. Returns file:line: text for |
list_dir | read | List what is in one directory, with file sizes. |
load_skill | read | Load the full instructions for one of the skills listed in your system prompt. |
look_at_app | read | Open the running app in a real browser at a phone width (375px) and a desktop width |
multi_edit | write | Several exact replacements in one file, applied in order, each seeing the |
outline | read | The shape of the code without reading all of it: what each file declares, and the |
read_file | read | Read one text file - for two or more, use read_files instead. Comes back as numbered lines — the numbers are for you to |
read_files | read | Read several text files in one call. Use this whenever you need more than one |
rename_symbol | write | Rename a function, component, variable, prop or type everywhere it appears as |
run_command | write | Run a shell command and get back its output and exit code. It runs without |
run_commands | write | Run several shell commands at once, up to max_parallel at a time. Good for |
type_of | read | Ask the TypeScript this project has installed what something actually is: the exact |
update_plan | write | Keep a short checklist the user can see, for work with three or more steps. |
web_search | read | Search the web and get back titles, links and summaries. For anything the |
write_file | write | Create a file, or replace all of its contents. For a change to part of an |
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.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | FAIL |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (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)
let askedToVerify = false;
return await fn(`http://127.0.0.1:${server.address().port}`);const match = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/.exec(text.replace(/^/, ''));
settings = JSON.parse(jsonrepair(text.replace(/^/, '')));
const clean = line.replace(/^/, ''); // strip a BOM on the first line
new Function(js); // parses as a classic script
new Function(js);
const hash = createHash('sha1').update(JSON.stringify(value));const id = createHash('sha1').update(this.cwd.toLowerCase()).digest('hex').slice(0, 16);const hash = (s) => createHash('sha1').update(String(s)).digest('hex').slice(0, 16);const hash = createHash('sha1').update(String(lockText ?? '')).digest('hex').slice(0, 12);return JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8')).version;import { checkHtml } from '../../src/core/htmlcheck.js';import { Screen } from '../../src/ui/screen.js';} from '../../src/ui/theme.js';
import { bannerSweep, SWEEP_MS } from '../../src/ui/activity.js';const client = new OpenAI({ apiKey: 'x', baseURL: `http://127.0.0.1:${server.address().port}`, maxRetries: 0 });process.env.UCODE_BASE_URL = `http://127.0.0.1:${server.address().port}`;@babel/parser, chalk, dotenv, jsonrepair, marked, marked-terminal, openai, playwright-core
class-variance-authority, clsx, cmdk, cn, date-fns, lucide-react, next-themes, radix-ui
Gates applied: no_behavioural_pass.
8a7e259e2088full audit observations/trust-audit/mcp-server/sppideey__ucode-agent.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-11 | 8a7e259e2088 | BLOCK | D | 69 | first audit |
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.