CircuitBLOCK
Computer use-like MCP for webapps and electron apps, to enable AI agents to test their changes
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
a11e352a2a3fOBSERVED · 2026-10-08Connect
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 circuit-web --env DOTENV_KEY=${DOTENV_KEY} --env LOG_TOKENS=${LOG_TOKENS} -- npx -y @snowfort/[email protected]{
"mcpServers": {
"circuit-web": {
"command": "npx",
"args": [
"-y",
"@snowfort/[email protected]"
],
"env": {
"DOTENV_KEY": "${DOTENV_KEY}",
"LOG_TOKENS": "${LOG_TOKENS}"
}
}
}
}Exposed tools (48)
41 read · 7 write · 0 destructive.
| Tool | Risk | Description |
|---|---|---|
add_locator_handler | write | Add automatic handler for modals/overlays |
app_launch | read | Launch new Electron app instance. For Electron Forge projects, use startScript to auto-start webpack dev server |
back | read | Navigate back in window history |
browser_console_messages | read | Get all console messages from the session |
browser_generate_playwright_test | read | Generate Playwright test code from recorded actions |
browser_handle_dialog | read | Handle browser dialogs (alert, confirm, prompt) |
browser_launch | read | Launch a new browser session |
browser_navigate | read | Navigate to a URL in an existing browser session |
browser_network_requests | read | Get all network requests from the session |
browser_resize | read | Resize browser window viewport |
browser_tab_close | read | Close a tab by ID |
browser_tab_list | read | List all open tabs |
browser_tab_new | read | Open a new tab |
browser_tab_select | read | Select a tab by ID |
click | read | Click on an element identified by a CSS selector |
click_by_role | read | Click on an element by its accessibility role |
click_by_text | read | Click on an element containing specific text |
click_nth | read | Click on the nth element matching a selector |
close | read | Close a session |
collect-user-info | read | A tool that collects user information through elicitation |
content | read | Get the HTML content of the current window |
drag | read | Drag an element to a target location |
evaluate | write | Execute JavaScript in the page or application context |
forward | read | Navigate forward in window history |
fs_read_file | read | Read content from a file |
fs_write_file | write | Write content to a file |
get_weather | read | |
get_windows | read | List windows with type identification (main/devtools/other) and titles |
greet | read | A simple greeting tool |
hover | read | Hover over an element identified by a CSS selector |
ipc_invoke | write | Invoke an IPC method in the Electron application |
key | read | Press a keyboard key |
keyboard_press | read | Press a key or key combination |
keyboard_type | read | Type text using keyboard events with optional delay |
list-files | read | |
multi-greet | read | A tool that sends different greetings with delays between them |
pdf | write | Save the current page as a PDF |
refresh | read | Refresh the current window |
screenshot | read | Take a screenshot of the current page or window |
select | read | Select an option from a dropdown |
smart_click | read | Smart click that automatically handles refs (e1, e2...), text, or CSS selectors |
snapshot | read | Get accessibility tree snapshot with element references for AI targeting |
start-notification-stream | write | Starts sending periodic notifications |
text_content | read | Get the visible text content of the current window |
type | read | Type text into an element identified by a CSS selector |
upload | write | Upload a file to an input element |
wait_for_load_state | read | Wait for the page to reach a specific load state |
wait_for_selector | read | Wait for an element to appear on the page |
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.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | WARN |
| L1 | Static analysis of the code | FAIL |
| L2 | Instruction surface (what it tells the agent) | FAIL |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (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)
atob( ... eval(
atob( ... }eval(
var makeValidate = new Function(
var makeValidate = new Function(
var deprecatedfn = new Function('fn', 'log', 'deprecate', 'message', 'site','return function (' + args + ') {' +curl -o ./googlechromebeta.dmg -k https://dl.google.com/chrome/mac/universal/beta/googlechromebeta.dmg
curl -o ./googlechrome.dmg -k https://dl.google.com/chrome/mac/universal/stable/GGRO/googlechrome.dmg
rejectUnauthorized: false
request ~ requests
# MIT License
fsevents.node
fsevents.node
snowfort-circuit-electron-0.0.6.tgz
node_modules/.pnpm/@[email protected]/node_modules/content-type
node_modules/.pnpm/@[email protected]/node_modules/raw-body
node_modules/.pnpm/@[email protected]/node_modules/zod
node_modules/.pnpm/@[email protected]/node_modules/ajv
node_modules/.pnpm/@[email protected]/node_modules/content-type
* console.log(myURL.password);
`,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:`,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:"chars": "€پ‚ƒ„...†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—کTMڑ›œں ،¢£¤¥¦§ ̈©ھ«¬® ̄°±23 ́μ¶· ̧1؛»1⁄41⁄23⁄4؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûüے"
"chars": "«»...“”�•‘’� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาําิีึืฺุู–—฿เแโใไๅๆ็่้๊๋์ํTM๏๐๑๒๓๔๕๖๗๘๙®©����"
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.
a11e352a2a3ffull audit observations/trust-audit/mcp-server/snowfort-ai__circuit-1.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-08 | a11e352a2a3f | BLOCK | F | 28 | first audit |
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.