Snowfort Circuit MCP是一套全面的模型上下文协议(MCP)服务器套件,它使AI编码代理能够以前所未有的精度和灵活性自动操作Web浏览器和Electron桌面应用程序。
将以下内容添加到你的AI代理的MCP配置文件中:
{
"mcpServers": {
"circuit-web": {
"command": "npx",
"args": ["@snowfort/circuit-web@latest"]
}
}
}
{
"mcpServers": {
"circuit-electron": {
"command": "npx",
"args": ["@snowfort/circuit-electron@latest"]
}
}
}
{
"mcpServers": {
"circuit-web": {
"command": "npx",
"args": ["@snowfort/circuit-web@latest"]
},
"circuit-electron": {
"command": "npx",
"args": ["@snowfort/circuit-electron@latest"]
}
}
}
配置完成后,你的AI代理可以立即开始自动化操作:
// 使用优化的AI设置启动浏览器
browser_launch({
"compressScreenshots": true,
"screenshotQuality": 50
})
browser_navigate({"sessionId": "...", "url": "https://github.com"})
// 响应中包含自动快照!
// 启动并控制任何Electron应用程序
app_launch({"app": "/Applications/Visual Studio Code.app"})
click({"sessionId": "...", "selector": "button[title='New File']"})
| 工具 | 描述 | 关键参数 |
|---|---|---|
browser_launch |
使用AI优化设置启动浏览器 | browser, headed, viewport, compressScreenshots, screenshotQuality |
browser_navigate |
导航到指定URL(包含自动快照) | sessionId, url |
browser_resize |
调整浏览器视口大小 | sessionId, width, height |
browser_handle_dialog |
设置对话框自动响应 | sessionId, action, promptText |
browser_tab_new |
创建新的浏览器标签 | sessionId |
browser_tab_list |
列出所有打开的标签 | sessionId |
browser_tab_select |
切换到指定标签 | sessionId, tabId |
browser_tab_close |
关闭指定标签 | sessionId, tabId |
browser_network_requests |
获取网络请求历史记录 | sessionId |
browser_console_messages |
获取控制台消息历史记录 | sessionId |
browser_generate_playwright_test |
根据操作生成测试代码 | sessionId |
click |
点击元素(包含自动快照) | sessionId, selector, windowId |
type |
输入文本(包含自动快照) | sessionId, selector, text, windowId |
hover |
悬停在元素上(包含自动快照) | sessionId, selector, windowId |
drag |
将元素拖动到目标位置 | sessionId, sourceSelector, targetSelector |
key |
按下键盘按键(包含自动快照) | sessionId, key, windowId |
select |
选择下拉选项 | sessionId, selector, value |
upload |
上传文件到输入框 | sessionId, selector, filePath |
back |
后退到历史记录中的上一页 | sessionId |
forward |
前进到历史记录中的下一页 | sessionId |
refresh |
重新加载当前页面 | sessionId |
screenshot |
拍摄压缩截图 | sessionId, path |
snapshot |
获取带有元素引用的可访问性树 | sessionId |
pdf |
生成页面的PDF文件 | sessionId, path |
content |
获取HTML内容 | sessionId |
text_content |
获取可见文本 | sessionId |
evaluate |
执行JavaScript代码 | sessionId, script |
wait_for_selector |
等待元素出现 | sessionId, selector, timeout |
close |
关闭浏览器会话 | sessionId |
| 工具 | 描述 | 关键参数 |
|---|---|---|
app_launch |
使用AI优化设置启动Electron应用程序 | app, mode, projectPath, startScript, disableDevtools, compressScreenshots, screenshotQuality |
get_windows |
列出带有类型标识的窗口 | sessionId |
ipc_invoke |
调用IPC方法 | sessionId, channel, args |
fs_write_file |
将文件写入磁盘 | sessionId, filePath, content |
fs_read_file |
从磁盘读取文件 | sessionId, filePath |
keyboard_press |
按下带有修饰键的按键 | sessionId, key, modifiers |
click_by_text |
根据文本点击元素 | sessionId, text, exact |
click_by_role |
根据可访问性角色点击元素 | sessionId, role, name |
click_nth |
点击第n个匹配的元素 | sessionId, selector, index |
keyboard_type |
延迟输入文本 | sessionId, text, delay |
add_locator_handler |
处理模态框/弹出窗口 | sessionId, selector, action |
wait_for_load_state |
等待页面状态 | sessionId, state |
smart_click |
智能点击,自动检测(引用/文本/CSS) | sessionId, target, strategy, windowId |
browser_console_messages |
获取Electron应用程序的控制台日志 | sessionId |
browser_network_requests |
获取Electron应用程序的网络请求 | sessionId |
| + 共享Web工具 | 核心Web工具:click, type, screenshot, evaluate等 |
// 使用优化的AI设置启动浏览器
const session = await browser_launch({
"compressScreenshots": true,
"screenshotQuality": 50,
"headed": false
})
// 导航时自动包含带有元素引用的页面快照
await browser_navigate({
"sessionId": session.id,
"url": "https://github.com"
})
// 响应中包含带有元素引用的自动快照,如ref="e1", ref="e2"
// 创建和管理多个标签
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})
// 显示所有标签的标题、URL和活动状态
// 导航并获取元素引用
await browser_navigate({"sessionId": session.id, "url": "https://example.com"})
// 自动快照响应包含:
// {"role": "button", "name": "Sign In", "ref": "e5"}
// 使用标准选择器点击元素(包含自动快照)
await click({"sessionId": session.id, "selector": "button:has-text('Sign In')"})
// 响应中包含更新后的页面快照,显示交互结果
// 监控页面活动
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})
// 根据操作生成测试代码
const testCode = await browser_generate_playwright_test({"sessionId": session.id})
// 设置自动对话框处理
await browser_handle_dialog({
"sessionId": session.id,
"action": "accept",
"promptText": "Default input"
})
// 后续所有对话框将自动处理
// 使用优化的AI设置启动打包应用程序
const session = await app_launch({
"app": "/Applications/Visual Studio Code.app",
"compressScreenshots": true,
"screenshotQuality": 50
})
// 所有交互自动包含带有元素引用的窗口快照!
await click({"sessionId": session.id, "selector": "[title='New File']"})
// 响应中包含:"Element clicked successfully" + 带有ref="e1", ref="e2"的快照
// 新特性:在开发过程中启动Electron应用程序
const session = await app_launch({
"app": "/Users/dev/my-electron-project",
"mode": "development",
"compressScreenshots": false // 调试时使用全质量截图
})
// 自动检测打包和开发模式
const session2 = await app_launch({
"app": "/path/to/app-or-project",
"mode": "auto" // 自动检测启动模式
})
推荐方法(最可靠):
// 1. 首先,在单独的终端中运行:
// npm run start
// 2. 等待webpack编译完成后,使用MCP启动应用程序:
const session = await app_launch({
"app": "/path/to/forge-project",
"mode": "development"
// 不要使用startScript - 让手动的npm start处理它
})
// 这种方法确保了正确的时间安排和可靠的启动
实验性自动启动功能:
// MCP可以尝试自动启动开发服务器(实验性)
const session = await app_launch({
"app": "/path/to/forge-project",
"mode": "development",
"startScript": "start" // 尝试自动运行 'npm run start'
})
// 特性:30秒超时,每5秒更新进度,增强Forge模式检测
// 注意:如果遇到问题,请使用上述手动方法
本指南适用于AI代理(CLAUDE.md)或手动参考
# 步骤1:在终端中,首先启动开发服务器
npm run start
# 步骤2:webpack编译完成后,使用MCP启动应用程序
await app_launch({
"app": "/path/to/your/project",
"mode": "development"
})
// 直接启动 - 无需准备!
await app_launch({
"app": "/path/to/project",
"mode": "development",
"disableDevtools": true // 可选:防止DevTools自动打开
})
// 启动.app、.exe或AppImage文件
await app_launch({
"app": "/Applications/YourApp.app"
})
compressScreenshots: true(默认)以加快AI处理速度。disableDevtools: true 防止DevTools自动打开。get_windows 查看所有带有类型标识的窗口(主窗口/DevTools/其他)。就是这样! 所有其他工具的使用方法与Web版本相同。祝你自动化愉快!🎉
⚠️ 重要提示
MCP会启动自己的Electron实例 - 你无法连接到已经运行的应用程序。
对于Electron开发项目:
npm run start 进程const session = await app_launch({
"app": "/path/to/your/electron/project",
"mode": "development"
})
// 自动返回sessionId - 后续所有命令使用此ID
工作原理:
AI工作流的关键优势:
ref="e1", ref="e2")// 传统打包应用程序自动化
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"]})
// 处理多个窗口
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"})
// 启动Electron应用程序并监控活动
const session = await app_launch({"app": "/Applications/MyElectronApp.app"})
// 执行一些生成日志/网络活动的操作
await click({"sessionId": session.id, "selector": "#load-data-button"})
await wait_for_load_state({"sessionId": session.id, "state": "networkidle"})
// 获取控制台日志进行调试
const consoleLogs = await browser_console_messages({"sessionId": session.id})
console.log("App console output:", consoleLogs)
// 获取网络请求以查看API调用
const networkRequests = await browser_network_requests({"sessionId": session.id})
console.log("Network activity:", networkRequests)
// 启动浏览器时使用未压缩的截图进行调试
const session = await browser_launch({
"compressScreenshots": false, // 全PNG质量
"headed": true, // 可见浏览器
"viewport": {"width": 1920, "height": 1080}
})
// 在开发过程中以全质量启动Electron应用程序
const session = await app_launch({
"app": "/Users/dev/my-electron-project",
"mode": "development",
"compressScreenshots": false // 调试时使用全质量截图
})
// Web:为了速度使用最大压缩启动
const webSession = await browser_launch({
"compressScreenshots": true,
"screenshotQuality": 30, // 最大压缩
"headed": false // 无头模式以提高性能
})
// Electron:以压缩模式启动打包应用程序
const electronSession = await app_launch({
"app": "/Applications/MyApp.app",
"compressScreenshots": true,
"screenshotQuality": 30 // 最大压缩
})
问题:尝试在没有有效会话的情况下使用MCP命令。 解决方案:
// ❌ 错误 - 没有会话存在
get_windows({"sessionId": "test"})
// ✅ 正确 - 先启动,然后使用返回的sessionId
const session = await app_launch({"app": "/path/to/project", "mode": "development"})
get_windows({"sessionId": session.id})
问题:尝试连接到现有的 npm run start 进程。
解决方案:停止现有进程,让MCP启动应用程序。
# 停止现有进程
kill $(ps aux | grep 'Electron .' | awk '{print $2}')
# 让MCP启动应用程序
app_launch({"app": "/your/project", "mode": "development"})
问题:MCP无法找到Electron可执行文件。 解决方案:
npm install electron --save-dev{"electronPath": "/custom/path/to/electron"}npm install -g electron@snowfort/circuit-web)npx @snowfort/circuit-web@latest [options]
Options:
--browser <type> 浏览器引擎:chromium, firefox, webkit (默认: chromium)
--headed 以有头模式运行 (默认: 无头模式)
--name MCP握手的服务器名称 (默认: circuit-web)
@snowfort/circuit-electron)npx @snowfort/circuit-electron@latest [options]
Options:
--name MCP握手的服务器名称 (默认: circuit-electron)
{
"mcpServers": {
"circuit-web": {
"command": "npx",
"args": ["@snowfort/circuit-web@latest", "--headed", "--browser", "chromium"]
},
"circuit-electron": {
"command": "npx",
"args": ["@snowfort/circuit-electron@latest"]
}
}
}
{
"mcpServers": {
"circuit-web": {
"command": "npx",
"args": ["@snowfort/circuit-web@latest"]
},
"circuit-electron": {
"command": "npx",
"args": ["@snowfort/circuit-electron@latest"]
}
}
}
已发布的包:
├── @snowfort/circuit-core@latest # 核心MCP基础设施
├── @snowfort/circuit-web@latest # Web自动化服务器(29种工具)
└── @snowfort/circuit-electron@latest # 桌面自动化服务器(32种工具)
本地开发:
packages/
├── core/ # 共享MCP基础设施和驱动接口
├── web/ # 带有AI优化的Web自动化CLI
└── electron/ # 桌面自动化CLI
| 包 | 版本 | 描述 |
|---|---|---|
@snowfort/circuit-core |
核心MCP基础设施 | |
@snowfort/circuit-web |
Web自动化CLI(29种工具) | |
@snowfort/circuit-electron |
桌面自动化CLI(25+种工具) |
# 克隆仓库
git clone https://github.com/snowfort-ai/circuit-mcp.git
cd circuit-mcp
# 安装依赖
pnpm install
# 构建所有包
pnpm -r build
# 开启监听模式开发
pnpm -r dev
# Web自动化服务器
./packages/web/dist/esm/cli.js --headed
# 桌面自动化服务器
./packages/electron/dist/esm/cli.js
# 运行所有测试
pnpm -r test
# 清理所有构建
pnpm -r clean
我们欢迎贡献!请参阅我们的贡献指南以获取详细信息。
git checkout -b feature/amazing-feature)git commit -m 'Add some amazing feature')git push origin feature/amazing-feature)本项目采用Apache License 2.0许可 - 有关详细信息,请参阅LICENSE文件。
全面自动化测试的独立实现 - © 2025 Snowfort LLC
准备好自动化一切了吗? 从上面的MCP配置开始,释放AI优化的双引擎自动化的力量!🚀