Snowfort Circuit MCP logo

Snowfort Circuit MCP

Organization
icefort-ai

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

Publishericefort-ai
Repositorycircuit-mcp
LanguageTypeScript
Forks
11
Stars
58
Available tools
0
Transport typestdio
Categories
LicenseNOASSERTION
Links
  • Connect tools to AI workflows

    Snowfort Circuit MCP exposes MCP capabilities that can be used by compatible AI clients and agents.

  • 0 available tools

    Browse the callable actions below, including names and descriptions when provided by the server.

  • Ready-to-copy setup

    Use the installation snippets to configure this server in your preferred MCP client.

  • Open source signals

    58 stars and 11 forks from the linked repository.

Circuit MCP - Computer use for webapps and electron apps

License

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

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

Desktop Automation Only

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

Complete Dual-Engine Setup (Recommended)

json
{
  "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:

javascript
// 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 auto-context
  • ๐Ÿ–ฑ๏ธ Multi-Tab Management: Create, switch, list, and close browser tabs
  • ๐Ÿ“Š Network & Console Monitoring: Real-time request tracking and console capture
  • Advanced Input: File uploads, dropdown selection, keyboard shortcuts
  • Content Extraction: HTML content, text content, accessibility trees with element refs
  • Visual Capture: Compressed screenshots, PDF generation
  • Navigation: History control, page reload, URL navigation
  • Dialog Handling: Automatic alert/confirm/prompt management
  • Browser Control: Viewport resizing, window management
  • ๐Ÿงช Test Generation: Auto-generate Playwright test code from recorded actions
  • JavaScript Execution: Run custom scripts in page context
  • Smart Waiting: Element appearance, network idle, page load states

๐Ÿ–ฅ๏ธ Desktop Automation (32 Tools)

  • ๐ŸŽฏ AI-Optimized Desktop Control: Launches and controls Electron apps with auto-snapshots
  • ๐Ÿ“ธ Smart Screenshot Compression: JPEG compression for faster AI workflows (configurable)
  • ๐Ÿ”ง Development Mode Support: Launch apps during development with auto-detection
  • Universal Electron Support: Any Electron application (packaged or development)
  • Multi-Window Management: Control multiple app windows simultaneously
  • IPC Communication: Direct inter-process communication with apps
  • Native File System: Read/write files directly
  • Enhanced Targeting: Role-based clicks, nth element selection, text-based targeting
  • Accessibility-First: Built-in accessibility tree navigation with element refs
  • State Management: Advanced page state waiting and monitoring
  • ๐Ÿ› Console & Network Monitoring: Capture application logs and network requests for debugging
  • All Web Tools: Every web automation tool works in desktop context

๐Ÿ”ง Architecture Benefits

  • ๐Ÿค– AI-First Design: Auto-snapshots, element references, and compressed images for optimal AI workflows
  • Runtime App Selection: Specify Electron apps at tool call time, not startup
  • Session Management: Multiple concurrent automation sessions with full isolation
  • Type Safety: Full TypeScript support with comprehensive type definitions
  • Error Handling: Robust error reporting and recovery
  • Performance Optimized: Efficient resource usage and fast execution

๐Ÿ“š Complete Tool Reference

๐ŸŒ Web Tools

ToolDescriptionKey Parameters
browser_launchLaunch browser with AI optimizationsbrowser, headed, viewport, compressScreenshots, screenshotQuality
browser_navigateNavigate to URL (includes auto-snapshot)sessionId, url
browser_resizeResize browser viewportsessionId, width, height
browser_handle_dialogSet dialog auto-responsesessionId, action, promptText
browser_tab_newCreate new browser tabsessionId
browser_tab_listList all open tabssessionId
browser_tab_selectSwitch to specific tabsessionId, tabId
browser_tab_closeClose specific tabsessionId, tabId
browser_network_requestsGet network request historysessionId
browser_console_messagesGet console message historysessionId
browser_generate_playwright_testGenerate test code from actionssessionId
clickClick element (includes auto-snapshot)sessionId, selector, windowId
typeType text (includes auto-snapshot)sessionId, selector, text, windowId
hoverHover over element (includes auto-snapshot)sessionId, selector, windowId
dragDrag element to targetsessionId, sourceSelector, targetSelector
keyPress keyboard key (includes auto-snapshot)sessionId, key, windowId
selectSelect dropdown optionsessionId, selector, value
uploadUpload file to inputsessionId, selector, filePath
backNavigate back in historysessionId
forwardNavigate forward in historysessionId
refreshReload current pagesessionId
screenshotTake compressed screenshotsessionId, path
snapshotGet accessibility tree with element refssessionId
pdfGenerate PDF of pagesessionId, path
contentGet HTML contentsessionId
text_contentGet visible textsessionId
evaluateExecute JavaScriptsessionId, script
wait_for_selectorWait for elementsessionId, selector, timeout
closeClose browser sessionsessionId

๐Ÿ–ฅ๏ธ Electron Tools

ToolDescriptionKey Parameters
app_launchLaunch Electron app with AI optimizationsapp, mode, projectPath, startScript, disableDevtools, compressScreenshots, screenshotQuality
get_windowsList windows with type identificationsessionId
ipc_invokeCall IPC methodsessionId, channel, args
fs_write_fileWrite file to disksessionId, filePath, content
fs_read_fileRead file from disksessionId, filePath
keyboard_pressPress key with modifierssessionId, key, modifiers
click_by_textClick element by textsessionId, text, exact
click_by_roleClick by accessibility rolesessionId, role, name
click_nthClick nth matching elementsessionId, selector, index
keyboard_typeType with delaysessionId, text, delay
add_locator_handlerHandle modals/popupssessionId, selector, action
wait_for_load_stateWait for page statesessionId, state
smart_clickSmart click with auto-detection (refs/text/CSS)sessionId, target, strategy, windowId
browser_console_messagesGet console logs from Electron appsessionId
browser_network_requestsGet network requests from Electron appsessionId
+ Shared Web ToolsCore web tools: click, type, screenshot, evaluate, etc.

๐Ÿ’ก Usage Examples

Web Automation Workflows

AI-Optimized Browser Launch

javascript
// Launch with optimal AI settings
const session = await browser_launch({
  "compressScreenshots": true,
  "screenshotQuality": 50,
  "headed": false
})

// Navigation automatically includes page snapshot with element refs
await browser_navigate({
  "sessionId": session.id, 
  "url": "https://github.com"
})
// Response includes auto-snapshot with element references like ref="e1", ref="e2"

Multi-Tab Workflow

javascript
// Create and manage multiple tabs
const session = await browser_launch({})
await browser_navigate({"sessionId": session.id, "url": "https://github.com"})

const newTabId = await browser_tab_new({"sessionId": session.id})
await browser_tab_select({"sessionId": session.id, "tabId": newTabId})
await browser_navigate({"sessionId": session.id, "url": "https://stackoverflow.com"})

const tabs = await browser_tab_list({"sessionId": session.id})
// Shows all tabs with titles, URLs, and active status

Element Targeting with References

javascript
// Navigate and get element references
await browser_navigate({"sessionId": session.id, "url": "https://example.com"})
// Auto-snapshot response includes:
// {"role": "button", "name": "Sign In", "ref": "e5"}

// Click using standard selector (auto-snapshot included)
await click({"sessionId": session.id, "selector": "button:has-text('Sign In')"})
// Response includes updated page snapshot showing interaction result

Network and Console Monitoring

javascript
// Monitor page activity
await browser_navigate({"sessionId": session.id, "url": "https://api-heavy-site.com"})
const requests = await browser_network_requests({"sessionId": session.id})
const consoleMessages = await browser_console_messages({"sessionId": session.id})

// Generate test code from actions
const testCode = await browser_generate_playwright_test({"sessionId": session.id})

Dialog Handling

javascript
// Set up automatic dialog handling
await browser_handle_dialog({
  "sessionId": session.id,
  "action": "accept",
  "promptText": "Default input"
})
// All subsequent dialogs will be handled automatically

Desktop Application Automation

AI-Optimized Desktop Launch

javascript
// Launch with optimal AI settings for packaged apps
const session = await app_launch({
  "app": "/Applications/Visual Studio Code.app",
  "compressScreenshots": true,
  "screenshotQuality": 50
})
// All interactions automatically include window snapshots with element refs!
await click({"sessionId": session.id, "selector": "[title='New File']"})
// Response includes: "Element clicked successfully" + snapshot with ref="e1", ref="e2"

Development Mode Support

javascript
// NEW: Launch Electron app during development
const session = await app_launch({
  "app": "/Users/dev/my-electron-project",
  "mode": "development",
  "compressScreenshots": false  // Full quality for debugging
})

// Auto-detect packaged vs development
const session2 = await app_launch({
  "app": "/path/to/app-or-project",
  "mode": "auto"  // Automatically detects launch mode
})

Electron Forge Support (NEW in v0.5.7)

Recommended Approach (Most Reliable):

javascript
// 1. First, run in a separate terminal:
// npm run start

// 2. Wait for webpack to compile, then launch with MCP:
const session = await app_launch({
  "app": "/path/to/forge-project",
  "mode": "development"
  // Don't use startScript - let manual npm start handle it
})
// This approach ensures proper timing and reliable launches

Experimental Auto-Start Feature:

javascript
// The MCP can attempt to auto-start the dev server (experimental)
const session = await app_launch({
  "app": "/path/to/forge-project",
  "mode": "development",
  "startScript": "start"  // Attempts to run 'npm run start' automatically
})
// Features: 30s timeout, progress updates every 5s, enhanced Forge pattern detection
// Note: If you experience problems, use the manual approach above

๐Ÿš€ Quick Start Guide for Electron Automation

Use this guide for AI agents (CLAUDE.md) or manual reference

For Electron Forge Projects:

bash
# Step 1: In terminal, start your dev server first
npm run start

# Step 2: Once webpack compiles, use the MCP to launch
await app_launch({
  "app": "/path/to/your/project",
  "mode": "development"
})

For Regular Electron Projects:

javascript
// Just launch directly - no prep needed!
await app_launch({
  "app": "/path/to/project",
  "mode": "development",
  "disableDevtools": true  // Optional: prevent DevTools auto-opening
})

For Packaged Apps:

javascript
// Launch .app, .exe, or AppImage files
await app_launch({
  "app": "/Applications/YourApp.app"
})

Key Features:

  • ๐Ÿ“ธ Every action returns an AI-ready snapshot with element refs (e1, e2, etc.)
  • ๐ŸŽฏ Multiple click methods: by selector, text, role, or nth element
  • ๐Ÿ”ง Full automation: screenshots, evaluate JS, keyboard/mouse control
  • ๐Ÿงน Auto cleanup: Sessions and dev servers close automatically
  • ๐ŸชŸ Smart window management: DevTools automatically filtered, main window detection

Pro Tips:

  • Use compressScreenshots: true (default) for faster AI processing
  • The MCP launches a new instance - it cannot attach to running apps
  • For Electron Forge: Always start dev server first, then launch with MCP
  • DevTools windows are automatically filtered out - you'll always get the main app window
  • Use disableDevtools: true to prevent DevTools from opening automatically
  • Use get_windows to see all windows with type identification (main/devtools/other)

That's it! All other tools work just like the web version. Happy automating! ๐ŸŽ‰

๐Ÿ“– Legacy Instructions for AI Agents (Claude, CLAUDE.md, etc.)

โš ๏ธ Important: The MCP launches its own Electron instance - you cannot connect to an already running app.

For Electron development projects:

  1. Stop any existing npm run start process
  2. Let the MCP launch your app instead:
javascript
const session = await app_launch({
  "app": "/path/to/your/electron/project",
  "mode": "development"
})
// Returns sessionId automatically - use this for all subsequent commands

How It Works:

  • ๐Ÿš€ Launches new instance of your Electron app using Playwright
  • ๐ŸŽฏ Full automation control via Chrome DevTools Protocol
  • ๐Ÿ“ธ Cannot attach to existing running processes

Key Benefits for AI Workflows:

  • ๐Ÿค– Auto-snapshots after every action with element references (ref="e1", ref="e2")
  • ๐Ÿ“ธ Compressed screenshots by default for faster processing
  • ๐ŸŽฏ Direct element targeting using the provided refs in snapshots
  • ๐Ÿ”„ No manual snapshot calls needed - context is provided automatically

Code Editor Automation

javascript
// Traditional packaged app automation
const session = await app_launch({"app": "/Applications/Visual Studio Code.app"})
await click({"sessionId": session.id, "selector": "[title='New File']"})
await keyboard_type({"sessionId": session.id, "text": "console.log('Hello World');", "delay": 50})
await keyboard_press({"sessionId": session.id, "key": "s", "modifiers": ["ControlOrMeta"]})

Multi-Window Management

javascript
// Work with multiple windows
const session = await app_launch({"app": "/Applications/Slack.app"})
const windows = await get_windows({"sessionId": session.id})
await click({"sessionId": session.id, "selector": ".channel-name", "windowId": "main"})
await type({"sessionId": session.id, "selector": "[data-qa='message-input']", "text": "Hello team!", "windowId": "main"})

Console & Network Monitoring

javascript
// Launch Electron app and monitor activity
const session = await app_launch({"app": "/Applications/MyElectronApp.app"})

// Perform some actions that generate logs/network activity
await click({"sessionId": session.id, "selector": "#load-data-button"})
await wait_for_load_state({"sessionId": session.id, "state": "networkidle"})

// Get console logs for debugging
const consoleLogs = await browser_console_messages({"sessionId": session.id})
console.log("App console output:", consoleLogs)

// Get network requests to see API calls
const networkRequests = await browser_network_requests({"sessionId": session.id})
console.log("Network activity:", networkRequests)

Advanced Configuration

Web Development Mode with Full Quality

javascript
// Launch browser with uncompressed screenshots for debugging
const session = await browser_launch({
  "compressScreenshots": false,  // Full PNG quality
  "headed": true,                // Visible browser
  "viewport": {"width": 1920, "height": 1080}
})

Electron Development Mode

javascript
// Launch Electron app during development with full quality
const session = await app_launch({
  "app": "/Users/dev/my-electron-project",
  "mode": "development",
  "compressScreenshots": false  // Full PNG quality for debugging
})

Production Mode with Optimized Performance

javascript
// Web: Launch with maximum compression for speed
const webSession = await browser_launch({
  "compressScreenshots": true,
  "screenshotQuality": 30,      // Maximum compression
  "headed": false               // Headless for performance
})

// Electron: Launch packaged app with compression
const electronSession = await app_launch({
  "app": "/Applications/MyApp.app",
  "compressScreenshots": true,
  "screenshotQuality": 30       // Maximum compression
})

๐Ÿ”ง Troubleshooting

Common Electron Development Issues

"Not connected" Error

Problem: Trying to use MCP commands without a valid session

Solution:

javascript
// โŒ Wrong - no session exists
get_windows({"sessionId": "test"})

// โœ… Correct - launch first, then use returned sessionId
const session = await app_launch({"app": "/path/to/project", "mode": "development"})
get_windows({"sessionId": session.id})

Cannot Connect to Running App

Problem: Trying to connect to existing npm run start process

Solution: Stop existing process, let MCP launch your app instead

bash
# Stop existing process
kill $(ps aux | grep 'Electron .' | awk '{print $2}')

# Let MCP launch instead
app_launch({"app": "/your/project", "mode": "development"})

Electron Not Found

Problem: MCP can't find Electron executable

Solutions:

  1. Install Electron locally: npm install electron --save-dev
  2. Specify custom path: {"electronPath": "/custom/path/to/electron"}
  3. Install globally: npm install -g electron

๐Ÿ› ๏ธ Configuration Options

CLI Options

Web Server (@snowfort/circuit-web)

bash
npx @snowfort/circuit-web@latest [options]

Options:
  --browser <type>    Browser engine: chromium, firefox, webkit (default: chromium)
  --headed           Run in headed mode (default: headless)
  --name <name>      Server name for MCP handshake (default: circuit-web)

Electron Server (@snowfort/circuit-electron)

bash
npx @snowfort/circuit-electron@latest [options]

Options:
  --name <name>      Server name for MCP handshake (default: circuit-electron)

Advanced MCP Configurations

Development Setup

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

Production Setup

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

๐Ÿ—๏ธ Architecture

Published Packages:
โ”œโ”€โ”€ @snowfort/circuit-core@latest      # Core MCP infrastructure
โ”œโ”€โ”€ @snowfort/circuit-web@latest       # Web automation server (29 tools)
โ””โ”€โ”€ @snowfort/circuit-electron@latest  # Desktop automation server (32 tools)

Local Development:
packages/
โ”œโ”€โ”€ core/          # Shared MCP infrastructure & Driver interface
โ”œโ”€โ”€ web/           # Web automation CLI with AI optimizations
โ””โ”€โ”€ electron/      # Desktop automation CLI

๐Ÿ“ฆ Published Packages

PackageVersionDescription
@snowfort/circuit-corenpmCore MCP infrastructure
@snowfort/circuit-webnpmWeb automation CLI (29 tools)
@snowfort/circuit-electronnpmDesktop automation CLI (25+ tools)

๐Ÿ”ง Development

Local Development Setup

bash
# Clone the repository
git clone https://github.com/clharman/circuit-mcp.git
cd circuit-mcp

# Install dependencies
pnpm install

# Build all packages
pnpm -r build

# Watch mode development
pnpm -r dev

Running Local Development Servers

bash
# Web automation server
./packages/web/dist/esm/cli.js --headed

# Desktop automation server  
./packages/electron/dist/esm/cli.js

Testing

bash
# Run all tests
pnpm -r test

# Clean all builds
pnpm -r clean

๐Ÿค Contributing

We welcome contributions! Please see our Contributing Guide for details.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

๐Ÿ“„ License

This project is licensed under the Apache License 2.0 - see the LICENSE file for details.

Independent implementation for comprehensive automation testing

๐Ÿ™ Acknowledgments

  • Playwright for the automation framework
  • MCP SDK for the protocol implementation
  • The Model Context Protocol community for driving innovation in AI-tool integration

Installation

TypingMind
Prerequisites:

Node.js 18+

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

Use Snowfort Circuit MCP MCP with multiple AI models

TypingMind connects MCP tools at the workspace level, so once Snowfort Circuit MCP is connected, you can use it with different AI models in TypingMind instead of setting it up separately for each model. This MCP runs locally through the TypingMind MCP connector on your device.

Setup guide to use the local connector

Use this when the MCP server needs access to local files, apps, or private resources on your computer.

1

Open the MCP settings

In TypingMind, go to Settings, Advanced Settings, then Model Context Protocol and choose Setup Connector.

  1. Open TypingMind in your browser.
  2. Click the Settings icon.
  3. Go to Advanced Settings.
  4. Open the Model Context Protocol section.
  5. Click Setup Connector and choose This Device.
TypingMind MCP connector setup screen with This Device selected
2

Run the connector command

Choose This Device, copy the command from TypingMind, and run it in Terminal. Keep the process running while you use MCP.

  1. Copy the setup command shown by TypingMind.
  2. Open Terminal on macOS or Windows Terminal on Windows.
  3. Paste and run the command.
  4. Approve the package install if Terminal asks you to proceed.
  5. Keep the Terminal window running while using MCP tools.
3

Add Snowfort Circuit MCP as a server

When the connector status is Ready, click Edit Servers and paste the MCP server configuration.

  1. Wait until the connector status shows Ready.
  2. Click Edit Servers.
  3. Paste the Snowfort Circuit MCP MCP server configuration.
  4. Save the server list.
  5. Refresh if you want to confirm the connector is still ready.
TypingMind MCP settings showing active server and Edit Servers button
{
  "mcpServers": {
    "snowfort-circuit-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@icefort/circuit-web@latest"
      ]
    }
  }
}
4

Use it across models

Save the server list, open Plugins, enable the Snowfort Circuit MCP MCP tools, then select any supported AI model in TypingMind and use the tools in chat or assign them to an AI agent.

  1. Open the Plugins page in TypingMind.
  2. Enable the Snowfort Circuit MCP MCP tools.
  3. Start a chat and choose the AI model you want to use.
  4. Use the MCP tools in chat or assign them to an AI agent.
  5. Switch to another AI model whenever needed without reconnecting MCP.
TypingMind chat using enabled MCP tools with a selected AI model
Can you use Snowfort Circuit MCP to help me with this task?
Snowfort Circuit MCP
Sure. I read it.
Here is what I found using Snowfort Circuit MCP.

Frequently asked questions

What is the Snowfort Circuit MCP MCP server used for?

Snowfort Circuit MCP is an MCP server that lets compatible AI clients connect to external tools and context. In TypingMind, you can add this MCP server once and make its tools available in your AI workspace.

Can I use Snowfort Circuit MCP MCP with multiple AI models in TypingMind?

Yes. TypingMind connects MCP tools at the workspace level, so you can use Snowfort Circuit MCP with different AI models such as Claude, ChatGPT, Gemini, or other models you have configured in TypingMind without setting up the MCP server separately for each model.

Why use Snowfort Circuit MCP MCP with TypingMind?

TypingMind is one of the best frontends for LLM chat because it brings multiple AI models, prompts, plugins, AI agents, API keys, and MCP tools into one workspace. With Snowfort Circuit MCP connected, you can use its MCP tools across your preferred models while keeping your chat workflow organized in TypingMind.

How do I connect Snowfort Circuit MCP MCP to TypingMind?

Snowfort Circuit MCP runs through the TypingMind local MCP connector. This is best when the MCP server needs access to local files, desktop apps, command-line tools, or private resources on your computer.

What tools does Snowfort Circuit MCP MCP provide in TypingMind?

Snowfort Circuit MCP exposes MCP capabilities that can be enabled from the TypingMind Plugins page and used in chat or assigned to AI agents.

Do I need to share my API keys with TypingMind to use Snowfort Circuit MCP MCP?

No. TypingMind is local-first and lets you keep your model providers, API keys, prompts, and MCP configuration under your control. If Snowfort Circuit MCP requires authentication, add the required headers, OAuth settings, or local configuration for that MCP server when you create the connection.

Related MCP Servers

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter ๐Ÿ‘‡