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": "默认输入"
})
// 所有后续对话将被自动处理
// 使用最优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']"})
// 响应包含:“成功点击元素”+带有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)或手动参考
# 第一步:首先在终端中启动您的开发服务器
npm run start
# 第二步:一旦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 - 用于所有后续命令
如何工作:
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