Atlas / MCP servers / hotragn / husk

huskBLOCK

mcp/hotragn/husk

Husk gives your AI chat a real computer of its own: files, a browser, and somewhere to run code. It can build things, look stuff up online and keep your work between chats. Turn a chat you already had into a bot that does the job again tomorrow. Free and open source; there is no paid tier.

Verdict
BLOCK
Grade
F
Trust score
41 /100
Exposed tools
38 28r · 8w · 2d
Transport
stdio
License
Apache-2.0
Stars
0
01

Overview

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

Your AI chat gets a computer. A terminal, files and a browser it can actually use, and a workspace that keeps what it finds for next time.

Husk gives your AI chat named local workspaces. Save public web sources, ask your AI for a cited brief, comparison, or action list, then review and download the result. Reopen the same workspace in your next chat. No Husk account, Docker, terminal, or additional model API key is needed for this starter flow.

For coding and automation, Husk also provides optional computer tools: a shell, files, and a browser. Existing MCP and CLI computer workflows remain available.

[!NOTE] 0.2.0 public preview. Download the unsigned desktop extension from the GitHub prerelease. It has passed automated checks; installation and first-task completion inside Claude Desktop still need beta testing. See the one-day delivery and launch checklist.

Start with a workspace

Download husk-0.2.0.mcpb from the public preview. Install it in C

Read from source at commit 4d58b80f842bOBSERVED · 2026-10-12
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 (npm)
claude mcp add mcp -- npx -y @husk-ai/[email protected]
03

Exposed tools (38)

28 read · 8 write · 2 destructive. Blast radius: 2 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
askerreadasks
botreadruns in C:\\Users\\bob
boxreaduses the machine
brokenreadbroken
browsereadLoad a web page from inside your own computer and return its title, readable text and links.
browser_clickreadClick the element with this ref, then return a fresh snapshot of whatever the page became.
browser_gotoreadOpen a URL in a real Chromium running inside your computer and wait for it to load.
browser_hoverwriteMove the pointer over an element, for menus that only appear on hover.
browser_navigatereadGo back, go forward, or reload the current page.
browser_screenshotwriteSave a PNG of the current page into your computer and return its path.
browser_scrollreadScroll the page, or bring one element into view. The snapshot lists the whole document,
browser_selectreadChoose an option in a dropdown (a native <select>). Clicking one does nothing useful --
browser_snapshotreadList what is on the current page: every element you can read or act on, each with a
browser_statusreadWhether this computer already has a browser, without installing one, and whether this
browser_tabsreadList the open tabs, or switch to one. A link that opens in a new tab lands somewhere you
browser_typereadType text into the field with this ref, replacing whatever is already there.
browser_uploadwriteAttach files to a file input. The paths are paths inside your computer, so write or
browser_wait_forreadWait until some text or a CSS selector appears on the page (or disappears, with gone).
chattyreadchatty
computer_inforeadDescribe the computer: os, kernel, arch, user, CPU count, memory, disk, working directory
counterreadcounts
deletedestructiveDelete a file, or a directory when recursive is true. There is no undo.
dockerreada container per computer
edit_filewriteReplace an exact string in a file. oldString must appear exactly once unless replaceAll is true.
expose_portwritePublish a port from inside the computer to the host so a human can open it in a browser.
fetch_urlreadFetch a web page or API response and return it as readable text. HTML is stripped down to its prose.
http_requestreadMake an arbitrary HTTP request and return status, headers and body. Use this for APIs that need a method,
leakyreadleaks
list_dirwriteList a directory on the computer. Set recursive to walk subdirectories, bounded by limit.
localreada guarded working directory on this machine
movewriteMove or rename a file or directory on the computer.
probereadprobe
read_filereadRead a text file from the computer. Supply startLine/endLine (1-based, inclusive) to read part of a large file.
release-botreadCuts releases
search_filesreadSearch file contents for a regular expression. Uses ripgrep when the computer has it and falls back to a
shellwriteRun a shell command on the Linux computer. Returns exit code, stdout and stderr.
web_searchreadSearch the web (via ${creds.backend}) and return titles, URLs and snippets. Follow up with fetch_url to read a result.
write_filedestructiveCreate or overwrite a text file on the computer. Parent directories are created.
04

Trust audit

BLOCKgrade F · trust 41/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)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (8 observation(s))
Network
declared (10 observation(s))
Shell
declared (3 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
apps/console/src/panels/TerminalPanel.tsx:396
line with <code>exec(tty: true)</code> in <code>{ready?.workdir ?? active?.workdir ?? '/work'}</code>. The{' '}
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
packages/core/src/types/computer.ts:157
exec(req: ExecRequest): Promise<ExecResult>;
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
packages/sdk/src/client.ts:131
exec(id: string, req: ExecRequestBody, opts: CallOptions = {}): Promise<ExecResult> {
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHNetwork egress · net.metadata_ip · CWE-200, CWE-319
apps/console/src/panels/BrowserPanel.tsx:782
Two of those refusals are not worth undoing lightly. <code>169.254.169.254</code> is the cloud metadata
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
MEDIUMInventory / provenance · inv.binary · CWE-1104
packages/server/src/triggers/cron.ts
cron.ts
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.binary · CWE-1104
packages/sessions/src/scaffold.ts
scaffold.ts
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.binary · CWE-1104
sandbox/Dockerfile.node
Dockerfile.node
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
apps/console/src/panels/DisconnectedScreen.tsx:82
placeholder="http://127.0.0.1:7377"
MEDIUMHard-coded secrets · secret.anthropic · CWE-798, CWE-321
packages/agent/src/loop.test.ts:452
return 'export ANTHROPIC_API_KEY=sk-ant-abcdefghijklmnopqrstuvwxyz012345';
MEDIUMHard-coded secrets · secret.anthropic · CWE-798, CWE-321
packages/agent/src/loop.test.ts:459
expect(JSON.stringify(router.requests[1]?.messages)).not.toContain('sk-ant-abcdefghijklmnopqrstuvwxyz012345');
MEDIUMHard-coded secrets · secret.anthropic · CWE-798, CWE-321
packages/agent/src/loop.test.ts:468
return 'sk-ant-abcdefghijklmnopqrstuvwxyz012345';
MEDIUMHard-coded secrets · secret.anthropic · CWE-798, CWE-321
packages/agent/src/redact-events.test.ts:12
const KEY = 'sk-ant-api03-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';
MEDIUMHard-coded secrets · secret.anthropic · CWE-798, CWE-321
packages/core/src/audit.test.ts:28
const out = summariseArgs({ command: 'export TOKEN=sk-ant-api03-REALLOOKINGSECRETVALUE' });
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
packages/models/src/router.test.ts:438
const anthropic = new AnthropicProvider({ apiKey: 'sk-ant-test-key-value-long-enough', fetch: hangingFetch });
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
apps/docs/content/security/secrets.mdx:91
-----BEGIN RSA PRIVATE KEY-----...  ->  [redacted private key]
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
delete, write_file
Why it matters. 2 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.binary · CWE-1104
apps/docs/src/components/Search.tsx
Search.tsx
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.binary · CWE-1104
packages/sessions/src/importers/gemini.test.ts
gemini.test.ts
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.hidden_file · CWE-1104
apps/console/.oxlintrc.json
.oxlintrc.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/browser/src/page-expressions.test.ts:23
return new Function(`return ${expression}`)() as T;
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
packages/cli/src/lib/spec-labels.test.ts:33
husk.ssh.key: /keys/id_ed25519
Why it matters. touches a credential store
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
packages/cli/src/lib/spec-labels.test.ts:40
expect(settings?.keyPath).toBe('/keys/id_ed25519');
Why it matters. touches a credential store
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
packages/core/src/spec.test.ts:36
labels: { 'husk.ssh': 'deploy@build-box:2222', 'husk.ssh.key': '/keys/id_ed25519' },
Why it matters. touches a credential store
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
packages/core/src/spec.test.ts:41
'husk.ssh.key': '/keys/id_ed25519',
Why it matters. touches a credential store
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
packages/runtime/src/policy.test.ts:64
for (const bad of ['/etc/passwd', '/', '/home/me/.ssh/id_rsa', '/proc/self/environ']) {
Why it matters. touches a credential store

Gates applied: no_behavioural_pass.

Audited 2026-10-12 · audit v0.4.1 · source sha 4d58b80f842bfull audit observations/trust-audit/mcp-server/hotragn__husk.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-124d58b80f842bBLOCKF41first audit
06

Questions

What is the husk MCP server?

Husk gives your AI chat a real computer of its own: files, a browser, and somewhere to run code. It can build things, look stuff up online and keep your work between chats. Turn a chat you already had into a bot that does the job again tomorrow. Free and open source; there is no paid tier.

What tools does husk expose?

38 in total: 28 read-only, 8 that write, and 2 that can delete or overwrite (delete, write_file). Every one is listed on this page with its risk.

Is husk safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (41/100) and found 4 critical or high issues in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 2 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does husk need?

It reads HUSK_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 husk run?

It speaks stdio, so it runs as a local process your client starts. It is published on npm as @husk-ai/workspaces at 0.2.0.

How current is this page?

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

Advertisement