Atlas / MCP servers / snowfort-ai / Circuit

CircuitBLOCK

mcp/snowfort-ai/circuit-1

Computer use-like MCP for webapps and electron apps, to enable AI agents to test their changes

Verdict
BLOCK
Grade
F
Trust score
28 /100
Exposed tools
48 41r · 7w · 0d
Transport
sse · stdio · streamable-http
License
NOASSERTION
Stars
60
01

Overview

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

[](https://opensource.org/licenses/Apache-2.0)

Circuit MCP is a comprehensive Model Context Protocol (MCP) server suite that enables AI coding agents to automate both web browsers and Electron desktop applications with unparalleled precision and flexibility.

🚀 Quick Start for AI Agents

MCP Configuration

Add to your AI agent's MCP configuration file:

Web Automation Only

{
"mcpServers": {
"circuit-web": {
"command": "npx",
"args": ["@snowfort/circuit-web@latest"]
}
}
}

Desktop Automation Only

{
"mcpServers": {
"circuit-electron": {
"command": "npx",
"args": ["@snowfort/circuit-electron@latest"]
}
}
}

Complete Dual-Engine Setup (Recommended)

{
"mcpServers": {
"circuit-web": {
"command": "npx",
"args": ["@snowfort/circuit-web@latest"]
},
"circuit-electron": {
"command": "npx",
"args": ["@snowfort/circuit-electron@latest"]
}
}
}

First Commands

Once configured, your AI agent can immediately start automating:

// Launch browser with optimized AI settings
browser_launch({
"compressScreenshots": true,
"screenshotQuality": 50
})
browser_navigate({"sessionId": "...", "url": "https://github.com"})
// Auto-snapshot included in response!

// Launch and control any Electron app
app_launch({"app": "/Applications/Visual Studio Code.app"})
click({"sessionId": "...", "selector": "button[title='New File']"})

✨ Features

🌐 Web Automation (29 Tools)

  • Cross-Browser Support: Chromium, Firefox, WebKit
  • 🎯 AI-Optimized Snapshots: Auto-snapshots with element references after every action
  • 📸 Smart Screenshot Compression: JPEG compression for faster AI workflows (configurable)
  • Complete Interaction Set: Click, type, hover, drag, scroll with au
Read from source at commit a11e352a2a3fOBSERVED · 2026-10-08
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 circuit-web --env DOTENV_KEY=${DOTENV_KEY} --env LOG_TOKENS=${LOG_TOKENS} -- npx -y @snowfort/[email protected]
claude-desktop
{
  "mcpServers": {
    "circuit-web": {
      "command": "npx",
      "args": [
        "-y",
        "@snowfort/[email protected]"
      ],
      "env": {
        "DOTENV_KEY": "${DOTENV_KEY}",
        "LOG_TOKENS": "${LOG_TOKENS}"
      }
    }
  }
}
03

Exposed tools (48)

41 read · 7 write · 0 destructive.

ToolRiskDescription
add_locator_handlerwriteAdd automatic handler for modals/overlays
app_launchreadLaunch new Electron app instance. For Electron Forge projects, use startScript to auto-start webpack dev server
backreadNavigate back in window history
browser_console_messagesreadGet all console messages from the session
browser_generate_playwright_testreadGenerate Playwright test code from recorded actions
browser_handle_dialogreadHandle browser dialogs (alert, confirm, prompt)
browser_launchreadLaunch a new browser session
browser_navigatereadNavigate to a URL in an existing browser session
browser_network_requestsreadGet all network requests from the session
browser_resizereadResize browser window viewport
browser_tab_closereadClose a tab by ID
browser_tab_listreadList all open tabs
browser_tab_newreadOpen a new tab
browser_tab_selectreadSelect a tab by ID
clickreadClick on an element identified by a CSS selector
click_by_rolereadClick on an element by its accessibility role
click_by_textreadClick on an element containing specific text
click_nthreadClick on the nth element matching a selector
closereadClose a session
collect-user-inforeadA tool that collects user information through elicitation
contentreadGet the HTML content of the current window
dragreadDrag an element to a target location
evaluatewriteExecute JavaScript in the page or application context
forwardreadNavigate forward in window history
fs_read_filereadRead content from a file
fs_write_filewriteWrite content to a file
get_weatherread
get_windowsreadList windows with type identification (main/devtools/other) and titles
greetreadA simple greeting tool
hoverreadHover over an element identified by a CSS selector
ipc_invokewriteInvoke an IPC method in the Electron application
keyreadPress a keyboard key
keyboard_pressreadPress a key or key combination
keyboard_typereadType text using keyboard events with optional delay
list-filesread
multi-greetreadA tool that sends different greetings with delays between them
pdfwriteSave the current page as a PDF
refreshreadRefresh the current window
screenshotreadTake a screenshot of the current page or window
selectreadSelect an option from a dropdown
smart_clickreadSmart click that automatically handles refs (e1, e2...), text, or CSS selectors
snapshotreadGet accessibility tree snapshot with element references for AI targeting
start-notification-streamwriteStarts sending periodic notifications
text_contentreadGet the visible text content of the current window
typereadType text into an element identified by a CSS selector
uploadwriteUpload a file to an input element
wait_for_load_statereadWait for the page to reach a specific load state
wait_for_selectorreadWait for an element to appear on the page
04

Trust audit

BLOCKgrade F · trust 28/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)FAIL
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (10 observation(s))
Network
declared (13 observation(s))
Shell
declared (11 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (25)

CRITICALObfuscation / stealth · obf.decode_then_exec · CWE-506, CWE-94
node_modules/.pnpm/[email protected]/node_modules/playwright-core/lib/generated/injectedScriptSource.js:24
atob( ...  eval(
Why it matters. decodes a payload and executes it
CRITICALObfuscation / stealth · obf.decode_then_exec · CWE-506, CWE-94
node_modules/.pnpm/[email protected]/node_modules/playwright-core/lib/vite/traceViewer/assets/defaultSettingsView-Cjl_e5YM.js:105
atob( ... }eval(
Why it matters. decodes a payload and executes it
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
node_modules/.pnpm/[email protected]/node_modules/ajv/dist/ajv.bundle.js:421
var makeValidate = new Function(
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
node_modules/.pnpm/[email protected]/node_modules/ajv/lib/compile/index.js:120
var makeValidate = new Function(
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
node_modules/.pnpm/[email protected]/node_modules/depd/index.js:425
var deprecatedfn = new Function('fn', 'log', 'deprecate', 'message', 'site',
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
node_modules/.pnpm/[email protected]/node_modules/depd/index.js:427
'return function (' + args + ') {' +
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHNetwork egress · net.tls_off · CWE-200, CWE-319
node_modules/.pnpm/[email protected]/node_modules/playwright-core/bin/reinstall_chrome_beta_mac.sh:7
curl -o ./googlechromebeta.dmg -k https://dl.google.com/chrome/mac/universal/beta/googlechromebeta.dmg
Why it matters. certificate verification is disabled
Fix. leave verification on
HIGHNetwork egress · net.tls_off · CWE-200, CWE-319
node_modules/.pnpm/[email protected]/node_modules/playwright-core/bin/reinstall_chrome_stable_mac.sh:7
curl -o ./googlechrome.dmg -k https://dl.google.com/chrome/mac/universal/stable/GGRO/googlechrome.dmg
Why it matters. certificate verification is disabled
Fix. leave verification on
HIGHNetwork egress · net.tls_off · CWE-200, CWE-319
node_modules/.pnpm/[email protected]/node_modules/playwright-core/lib/server/socksClientCertificatesInterceptor.js:75
rejectUnauthorized: false
Why it matters. certificate verification is disabled
Fix. leave verification on
HIGHSupply chain · supply.typosquat · CWE-829, CWE-1357
node_modules/.pnpm/[email protected]/node_modules/iconv-lite/package.json
request ~ requests
Why it matters. dependency name one edit from a popular package
Fix. verify the package; likely typosquat
HIGHPrompt injection · prompt.zero_width · CWE-94, CWE-1427
node_modules/.pnpm/[email protected][email protected]/node_modules/express-rate-limit/license.md:1
# MIT License
Why it matters. invisible characters in instruction text
Fix. strip non-printing characters
MEDIUMInventory / provenance · inv.binary · CWE-1104
node_modules/.pnpm/[email protected]/node_modules/fsevents/fsevents.node
fsevents.node
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
node_modules/.pnpm/[email protected]/node_modules/fsevents/fsevents.node
fsevents.node
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
snowfort-circuit-electron-0.0.6.tgz
snowfort-circuit-electron-0.0.6.tgz
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.symlink · CWE-1104
node_modules/.pnpm/@[email protected]/node_modules/content-type
node_modules/.pnpm/@[email protected]/node_modules/content-type
Why it matters. link not followed
MEDIUMInventory / provenance · inv.symlink · CWE-1104
node_modules/.pnpm/@[email protected]/node_modules/raw-body
node_modules/.pnpm/@[email protected]/node_modules/raw-body
Why it matters. link not followed
MEDIUMInventory / provenance · inv.symlink · CWE-1104
node_modules/.pnpm/@[email protected]/node_modules/zod
node_modules/.pnpm/@[email protected]/node_modules/zod
Why it matters. link not followed
MEDIUMInventory / provenance · inv.symlink · CWE-1104
node_modules/.pnpm/@[email protected]/node_modules/ajv
node_modules/.pnpm/@[email protected]/node_modules/ajv
Why it matters. link not followed
MEDIUMInventory / provenance · inv.symlink · CWE-1104
node_modules/.pnpm/@[email protected]/node_modules/content-type
node_modules/.pnpm/@[email protected]/node_modules/content-type
Why it matters. link not followed
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
node_modules/.pnpm/@[email protected]/node_modules/@types/node/url.d.ts:552
* console.log(myURL.password);
MEDIUMObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
node_modules/.pnpm/[email protected]/node_modules/tsx/dist/lexer-DQCqS3nf.mjs:3
`,Q.e()-1)}`),{idx:Q.e()});const U=[],t=[];for(;Q.ri();){const C=Q.is(),I=Q.ie(),D=Q.it(),i=Q.ai(),w=Q.id(),J=Q.ss(),K=Q.se();let o;Q.ip()&&(o=N(A.slice(w===-1?C-1:C,w===-1?I+1:I))),U.push({n:o,t:D,s:
MEDIUMObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
node_modules/.pnpm/[email protected]/node_modules/tsx/dist/lexer-DgIbo0BU.cjs:3
`,Q.e()-1)}`),{idx:Q.e()});const a=[],t=[];for(;Q.ri();){const C=Q.is(),I=Q.ie(),D=Q.it(),s=Q.ai(),w=Q.id(),J=Q.ss(),K=Q.se();let o;Q.ip()&&(o=N(A.slice(w===-1?C-1:C,w===-1?I+1:I))),a.push({n:o,t:D,s:
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
node_modules/.pnpm/[email protected]/node_modules/iconv-lite/encodings/sbcs-data-generated.js:100
"chars": "€پ‚ƒ„...†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—کTMڑ›œں ،¢£¤¥¦§ ̈©ھ«¬® ̄°±23 ́μ¶· ̧1؛»1⁄41⁄23⁄4؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûüے"
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
node_modules/.pnpm/[email protected]/node_modules/iconv-lite/encodings/sbcs-data-generated.js:373
"chars": "«»...“”�•‘’� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาําิีึืฺุู–—฿เแโใไๅๆ็่้๊๋์ํTM๏๐๑๒๓๔๕๖๗๘๙®©����"
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
node_modules/.pnpm/[email protected]/node_modules/playwright-core/lib/vite/recorder/assets/codeMirrorModule-DRsk21vu.js:24
outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);`;var v;_&&(v=i.ownerDocument.defaultView.scrollY),r.input.focus(),_&&i.ownerDocument.defaultVie

Gates applied: critical_finding, no_behavioural_pass.

Audited 2026-10-08 · audit v0.4.1 · source sha a11e352a2a3ffull audit observations/trust-audit/mcp-server/snowfort-ai__circuit-1.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-08a11e352a2a3fBLOCKF28first audit
06

Questions

What is the Circuit MCP server?

Computer use-like MCP for webapps and electron apps, to enable AI agents to test their changes

What tools does Circuit expose?

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

Is Circuit safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (28/100) and found 11 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 Circuit need?

It reads DOTENV_KEY and LOG_TOKENS 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 Circuit run?

It speaks sse, stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as @snowfort/circuit-web at 0.0.14.

How current is this page?

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

Advertisement