easytouch-mcp
npx skills add https://github.com/whuanle/easytouch --skill easytouch-mcp
Agent 安装分布
Skill 文档
EasyTouch Automation Skill
该æè½ç¨äºæå¯¼ AI 婿éè¿ et å½ä»¤æ§è¡æ¡é¢èªå¨åä»»å¡ã
éç¨äº CLI è°ç¨å MCP éæåºæ¯ï¼éç¹æ¯ç¨³å®çæä½æµç¨ä¸å¯å¤ç°å½ä»¤ã
使¶ä½¿ç¨
- éè¦æ§å¶é¼ æ ãé®çæ§è¡æ¡é¢æä½
- éè¦æªå¾ãåè²ãè¯å«åå°çªå£ç¶æ
- éè¦æ¥è¯¢ç³»ç»ä¿¡æ¯ãè¿ç¨ãåªè´´æ¿
- éè¦æµè§å¨èªå¨åï¼ä¸æä½æ¯å¤æ¥éª¤ä»»å¡ï¼å¯å¨ -> å¯¼èª -> ç¹å»/è¾å ¥ -> æªå¾ï¼
åç½®æ¡ä»¶
- å·²å®è£
EasyTouchï¼å¯æ§è¡æä»¶å¯éè¿
etè°ç¨ - å¦ä½¿ç¨æµè§å¨è½åï¼ç¡®ä¿æ¬æºå¯å¯å¨ Playwright æµè§å¨
skillsä»åºä» æä¾ææ¡£ï¼ä¸å ç½®äºè¿å¶ï¼éå å®è£ ç¨åºæ¬ä½ï¼ä¾å¦easytouch-windowsï¼
å¿«éèªæ£
et --version
et mouse_position
et screen_list
常ç¨å½ä»¤å
- é¼ æ ï¼
mouse_movemouse_clickmouse_scrollmouse_position - é®çï¼
key_presstype_text - å±å¹ï¼
screenshotpixel_colorscreen_list - çªå£ï¼
window_listwindow_findwindow_activatewindow_foreground - ç³»ç»ï¼
os_infocpu_infomemory_infodisk_listprocess_list - åªè´´æ¿ï¼
clipboard_get_textclipboard_set_textclipboard_get_files - æµè§å¨ï¼
browser_*
æµè§å¨èªå¨åæä½æåï¼éç¹ï¼
1) æ§è¡æ¨¡åï¼å çè§£è¿ä¸ªï¼
- æææµè§å¨å¨ä½é½ä¾èµ
browserId browser_launchåªè´è´£å建ä¼è¯ï¼ä¸ä¼æ¿ä½ 宿åç»ä¸å¡æ¥éª¤- å½åå®ç°éè¿åå° daemon ææä¼è¯ï¼æä»¥å½ä»¤ç»æåä¼è¯ä»å¯å¤ç¨
- ä½ å¿ é¡»æ¾å¼ç®¡çä¼è¯ï¼å建ã使ç¨ãå ³é
æ¯ææµè§å¨ï¼
chromiumfirefoxwebkitedgeï¼å é¨ä½¿ç¨msedgeééï¼
注æï¼éè¿ npm å®è£ EasyTouch æ¶å·²å ç½® Playwright è¿è¡è½åï¼æ¬æè½ä¸å 嫿å¨å®è£ æ¥éª¤ã
2) æ åæä½é»è¾ï¼AI å¿ é¡»éµå®ï¼
æ¯ä¸ªæµè§å¨ä»»å¡æåºå®é¡ºåºæ§è¡ï¼
- å建ä¼è¯ï¼
browser_launch - 确认ä¼è¯ï¼
browser_listï¼æåç®æ browserId - æå¼ç®æ 页ï¼
browser_navigate - çå¾
页é¢å¯äº¤äºï¼
browser_wait_for - æ§è¡äº¤äºï¼
browser_click/browser_fill/browser_select/browser_upload - éªè¯ç»æï¼
browser_get_text/browser_assert_text/browser_page_info - çè¯æ®ï¼
browser_screenshot - ç»æä»»å¡ï¼
browser_close
妿ä¸é失败ï¼ä¸è¦ç´æ¥éå¯æææ¥éª¤ï¼ä¼å ï¼
- å
browser_page_infoçå½å URL/æ é¢ - å
browser_wait_foréè¯å ³é®å ç´ - ä»å¤±è´¥æèèå
³éæ§ä¼è¯å¹¶éæ°
browser_launch
3) CLI æµç¨æ¨¡æ¿
# å建ä¼è¯
et browser_launch --browser edge --headless false
# 读å browserIdï¼ä»¥ä¸ç¤ºä¾å设为 browser_1ï¼
et browser_list
# 导èª
et browser_navigate --browser-id browser_1 --url "https://example.com"
# çå¾
å¹¶æä½
et browser_wait_for --browser-id browser_1 --selector "input[name='q']" --state visible --timeout 15000
et browser_fill --browser-id browser_1 --selector "input[name='q']" --value "EasyTouch"
et browser_click --browser-id browser_1 --selector "button[type='submit']"
# éªè¯ä¸æªå¾
et browser_get_text --browser-id browser_1 --selector "body"
et browser_screenshot --browser-id browser_1 --output "./result.png" --full-page true
# æ¶å°¾
et browser_close --browser-id browser_1
4) MCP å½ä»¤æ å°ï¼AI è°ç¨éç¹ï¼
CLI åæ°åä¸ MCP åæ°åä¸åï¼å¸¸ç¨æ å°å¦ä¸ï¼
| CLI å½ä»¤ | MCP name |
å
³é® arguments |
|---|---|---|
browser_launch |
browser_launch |
browserType, headless, executablePath, userDataDir |
browser_navigate |
browser_navigate |
browserId, url, waitUntil, timeout |
browser_click |
browser_click |
browserId, selector, selectorType, button, clickCount |
browser_fill |
browser_fill |
browserId, selector, selectorType, value, clear |
browser_wait_for |
browser_wait_for |
browserId, selector, selectorType, state, timeout |
browser_screenshot |
browser_screenshot |
browserId, selector, fullPage, outputPath, type |
browser_close |
browser_close |
browserId, force |
browser_list |
browser_list |
{} |
MCP è°ç¨èå¼ï¼
{
"jsonrpc": "2.0",
"id": "browser-1",
"method": "tools/call",
"params": {
"name": "browser_launch",
"arguments": {
"browserType": "edge",
"headless": false
}
}
}
{
"jsonrpc": "2.0",
"id": "browser-2",
"method": "tools/call",
"params": {
"name": "browser_navigate",
"arguments": {
"browserId": "browser_1",
"url": "https://example.com",
"waitUntil": "load",
"timeout": 30000
}
}
}
4.1) æªå¾æä»¶è·¯å¾è§èï¼å¿ é¡»éµå®ï¼
AI è°ç¨ browser_screenshot æ¶ï¼å¿
é¡»æ¾å¼ä¼ outputPathï¼ä¸è¦ä¾èµé»è®¤è·¯å¾ã
åå ï¼
- ä¸ä¼
outputPathæ¶ï¼æªå¾ä¼è½å°ç³»ç»ä¸´æ¶ç®å½ï¼Path.GetTempPath()ï¼ - AI å¾å¾ä¸ä¼å¨åç»æ¥éª¤èªå¨å®ä½ä¸´æ¶ç®å½ï¼å¯¼è´âæ¾ä¸å°æªå¾æä»¶â
æ§è¡è§åï¼
- æ¯æ¬¡æªå¾é½ä¼ æç¡®è·¯å¾
- ä¼å
使ç¨å½åä»»å¡å¯è®¿é®ç®å½ï¼å¦ä»åºä¸
artifacts/screenshotsï¼ - æªå¾åå§ç»è¯»åè¿åå¼éç
imagePathï¼åç»ä¸å¾ç¨è¿ä¸ªå®é è·¯å¾ - ä¸è¦èªè¡çæµæä»¶ä½ç½®ï¼ä¸è¦ç¡¬ç¼ç ä¸è¿åå¼ä¸ä¸è´çè·¯å¾
CLI 示ä¾ï¼
et browser_screenshot --browser-id browser_1 --full-page true --output "./artifacts/screenshots/search-result.png"
MCP 示ä¾ï¼
{
"jsonrpc": "2.0",
"id": "browser-3",
"method": "tools/call",
"params": {
"name": "browser_screenshot",
"arguments": {
"browserId": "browser_1",
"fullPage": true,
"outputPath": "E:\\workspace\\EasyTouch\\artifacts\\screenshots\\search-result.png",
"type": "png"
}
}
}
æ¶å°ååºåï¼
- è®°å½
data.imagePath - åç»å¦æè¦è¯»å/ä¸ä¼ /å±ç¤ºæªå¾ï¼ä½¿ç¨
data.imagePathï¼ä¸è¦æ¹åæå ¶ä»è·¯å¾
5) éæ©å¨çç¥ï¼æé«æåçï¼
ä¼å 级建议ï¼
- 稳å®å±æ§éæ©å¨ï¼
[data-testid='xxx']ã[name='xxx'] - è¯ä¹å CSSï¼
form button[type='submit'] - ææ¬éæ©ï¼
selectorType=textï¼ä» 卿æ¡ç¨³å®æ¶ä½¿ç¨ï¼ - XPathï¼ä» å¨å¤æç»ææ¶å åº
æ¯æ¬¡ç¹å»/è¾å
¥åï¼é½å
browser_wait_forï¼
state=visibleç¨äºå¯è§å ç´ æä½state=attachedç¨äºåªè¦æ±å¨ DOM ä¸åå¨çå ç´
6) 常è§ä»»å¡æ¨¡æ¿
ç»å½æµç¨æ¨¡æ¿ï¼
browser_navigateæå¼ç»å½é¡µbrowser_wait_forçå¾ ç¨æ·åæ¡browser_fillå¡«ç¨æ·å/å¯ç browser_clickæäº¤æé®browser_wait_forçå¾ ç»å½åæ å¿å ç´browser_screenshotåè¯
æç´¢æµç¨æ¨¡æ¿ï¼
browser_wait_foræç´¢æ¡browser_fillå ³é®è¯browser_clickæç´¢æé®browser_wait_forç»æå表browser_get_text读ååå æ¡ç»ææè¦
7) ä¼è¯ä¸å¼å¸¸æ¢å¤
browser_list 为空ï¼
- å
æ¥
et browser_daemon_status - è¥ daemon ä¸å¨ï¼éæ°
browser_launch
browserId æ æï¼
- ä¼è¯å¯è½å·²å ³éæ daemon éå¯
- éæ°å建ä¼è¯ï¼æ¿æ¢ä¸ºæ°
browserId
页é¢è·³è½¬åå ç´ æ¾ä¸å°ï¼
- å¢å¤§
browser_wait_for --timeout - æ¹ç¨æ´ç¨³å®çéæ©å¨
- ç¨
browser_page_info确认æ¯å¦è·³å°äºé¢æé¡µé¢
æ§è¡å®æå¿ é¡»æ¶å°¾ï¼
- åä»»å¡ç»æï¼
browser_close --browser-id ... - éè¦å½»åºç»æåå°æä¹
åï¼
browser_daemon_stop
MCP 使ç¨å»ºè®®
å¦éä¾ AI 客æ·ç«¯é¿æè°ç¨ï¼ä½¿ç¨ MCP 模å¼ï¼
et --mcp
示ä¾é ç½®ï¼
{
"mcpServers": {
"easytouch": {
"command": "et",
"args": ["--mcp"]
}
}
}
åèææ¡£
- 项ç®è¯´æï¼
README.md - æè½ææ¡£ï¼
skills/SKILLS.md