athena-browser-mcp 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +364 -0
  3. package/dist/src/bridge/cef-bridge.d.ts +115 -0
  4. package/dist/src/bridge/cef-bridge.d.ts.map +1 -0
  5. package/dist/src/bridge/cef-bridge.js +417 -0
  6. package/dist/src/bridge/cef-bridge.js.map +1 -0
  7. package/dist/src/domains/interaction/handlers/action.handler.d.ts +72 -0
  8. package/dist/src/domains/interaction/handlers/action.handler.d.ts.map +1 -0
  9. package/dist/src/domains/interaction/handlers/action.handler.js +304 -0
  10. package/dist/src/domains/interaction/handlers/action.handler.js.map +1 -0
  11. package/dist/src/domains/interaction/handlers/form.handler.d.ts +66 -0
  12. package/dist/src/domains/interaction/handlers/form.handler.d.ts.map +1 -0
  13. package/dist/src/domains/interaction/handlers/form.handler.js +180 -0
  14. package/dist/src/domains/interaction/handlers/form.handler.js.map +1 -0
  15. package/dist/src/domains/interaction/handlers/index.d.ts +7 -0
  16. package/dist/src/domains/interaction/handlers/index.d.ts.map +1 -0
  17. package/dist/src/domains/interaction/handlers/index.js +7 -0
  18. package/dist/src/domains/interaction/handlers/index.js.map +1 -0
  19. package/dist/src/domains/interaction/handlers/keyboard.handler.d.ts +44 -0
  20. package/dist/src/domains/interaction/handlers/keyboard.handler.d.ts.map +1 -0
  21. package/dist/src/domains/interaction/handlers/keyboard.handler.js +247 -0
  22. package/dist/src/domains/interaction/handlers/keyboard.handler.js.map +1 -0
  23. package/dist/src/domains/interaction/interaction.schemas.d.ts +2463 -0
  24. package/dist/src/domains/interaction/interaction.schemas.d.ts.map +1 -0
  25. package/dist/src/domains/interaction/interaction.schemas.js +162 -0
  26. package/dist/src/domains/interaction/interaction.schemas.js.map +1 -0
  27. package/dist/src/domains/interaction/interaction.types.d.ts +134 -0
  28. package/dist/src/domains/interaction/interaction.types.d.ts.map +1 -0
  29. package/dist/src/domains/interaction/interaction.types.js +7 -0
  30. package/dist/src/domains/interaction/interaction.types.js.map +1 -0
  31. package/dist/src/domains/interaction/strategies/accessibility-click.strategy.d.ts +24 -0
  32. package/dist/src/domains/interaction/strategies/accessibility-click.strategy.d.ts.map +1 -0
  33. package/dist/src/domains/interaction/strategies/accessibility-click.strategy.js +69 -0
  34. package/dist/src/domains/interaction/strategies/accessibility-click.strategy.js.map +1 -0
  35. package/dist/src/domains/interaction/strategies/bbox-click.strategy.d.ts +28 -0
  36. package/dist/src/domains/interaction/strategies/bbox-click.strategy.d.ts.map +1 -0
  37. package/dist/src/domains/interaction/strategies/bbox-click.strategy.js +54 -0
  38. package/dist/src/domains/interaction/strategies/bbox-click.strategy.js.map +1 -0
  39. package/dist/src/domains/interaction/strategies/click-strategy.interface.d.ts +24 -0
  40. package/dist/src/domains/interaction/strategies/click-strategy.interface.d.ts.map +1 -0
  41. package/dist/src/domains/interaction/strategies/click-strategy.interface.js +7 -0
  42. package/dist/src/domains/interaction/strategies/click-strategy.interface.js.map +1 -0
  43. package/dist/src/domains/interaction/strategies/dom-click.strategy.d.ts +40 -0
  44. package/dist/src/domains/interaction/strategies/dom-click.strategy.d.ts.map +1 -0
  45. package/dist/src/domains/interaction/strategies/dom-click.strategy.js +135 -0
  46. package/dist/src/domains/interaction/strategies/dom-click.strategy.js.map +1 -0
  47. package/dist/src/domains/interaction/strategies/index.d.ts +8 -0
  48. package/dist/src/domains/interaction/strategies/index.d.ts.map +1 -0
  49. package/dist/src/domains/interaction/strategies/index.js +8 -0
  50. package/dist/src/domains/interaction/strategies/index.js.map +1 -0
  51. package/dist/src/domains/navigation/handlers/index.d.ts +5 -0
  52. package/dist/src/domains/navigation/handlers/index.d.ts.map +1 -0
  53. package/dist/src/domains/navigation/handlers/index.js +5 -0
  54. package/dist/src/domains/navigation/handlers/index.js.map +1 -0
  55. package/dist/src/domains/navigation/handlers/navigation.handler.d.ts +68 -0
  56. package/dist/src/domains/navigation/handlers/navigation.handler.d.ts.map +1 -0
  57. package/dist/src/domains/navigation/handlers/navigation.handler.js +246 -0
  58. package/dist/src/domains/navigation/handlers/navigation.handler.js.map +1 -0
  59. package/dist/src/domains/navigation/navigation.schemas.d.ts +115 -0
  60. package/dist/src/domains/navigation/navigation.schemas.d.ts.map +1 -0
  61. package/dist/src/domains/navigation/navigation.schemas.js +65 -0
  62. package/dist/src/domains/navigation/navigation.schemas.js.map +1 -0
  63. package/dist/src/domains/navigation/navigation.types.d.ts +70 -0
  64. package/dist/src/domains/navigation/navigation.types.d.ts.map +1 -0
  65. package/dist/src/domains/navigation/navigation.types.js +7 -0
  66. package/dist/src/domains/navigation/navigation.types.js.map +1 -0
  67. package/dist/src/domains/perception/handlers/ax-tree.handler.d.ts +32 -0
  68. package/dist/src/domains/perception/handlers/ax-tree.handler.d.ts.map +1 -0
  69. package/dist/src/domains/perception/handlers/ax-tree.handler.js +60 -0
  70. package/dist/src/domains/perception/handlers/ax-tree.handler.js.map +1 -0
  71. package/dist/src/domains/perception/handlers/content.handler.d.ts +55 -0
  72. package/dist/src/domains/perception/handlers/content.handler.d.ts.map +1 -0
  73. package/dist/src/domains/perception/handlers/content.handler.js +150 -0
  74. package/dist/src/domains/perception/handlers/content.handler.js.map +1 -0
  75. package/dist/src/domains/perception/handlers/dom-tree.handler.d.ts +21 -0
  76. package/dist/src/domains/perception/handlers/dom-tree.handler.d.ts.map +1 -0
  77. package/dist/src/domains/perception/handlers/dom-tree.handler.js +40 -0
  78. package/dist/src/domains/perception/handlers/dom-tree.handler.js.map +1 -0
  79. package/dist/src/domains/perception/handlers/index.d.ts +11 -0
  80. package/dist/src/domains/perception/handlers/index.d.ts.map +1 -0
  81. package/dist/src/domains/perception/handlers/index.js +11 -0
  82. package/dist/src/domains/perception/handlers/index.js.map +1 -0
  83. package/dist/src/domains/perception/handlers/layout.handler.d.ts +30 -0
  84. package/dist/src/domains/perception/handlers/layout.handler.d.ts.map +1 -0
  85. package/dist/src/domains/perception/handlers/layout.handler.js +61 -0
  86. package/dist/src/domains/perception/handlers/layout.handler.js.map +1 -0
  87. package/dist/src/domains/perception/handlers/network.handler.d.ts +31 -0
  88. package/dist/src/domains/perception/handlers/network.handler.d.ts.map +1 -0
  89. package/dist/src/domains/perception/handlers/network.handler.js +59 -0
  90. package/dist/src/domains/perception/handlers/network.handler.js.map +1 -0
  91. package/dist/src/domains/perception/handlers/ui-discover.handler.d.ts +21 -0
  92. package/dist/src/domains/perception/handlers/ui-discover.handler.d.ts.map +1 -0
  93. package/dist/src/domains/perception/handlers/ui-discover.handler.js +37 -0
  94. package/dist/src/domains/perception/handlers/ui-discover.handler.js.map +1 -0
  95. package/dist/src/domains/perception/handlers/vision.handler.d.ts +43 -0
  96. package/dist/src/domains/perception/handlers/vision.handler.d.ts.map +1 -0
  97. package/dist/src/domains/perception/handlers/vision.handler.js +116 -0
  98. package/dist/src/domains/perception/handlers/vision.handler.js.map +1 -0
  99. package/dist/src/domains/perception/perception.schemas.d.ts +1223 -0
  100. package/dist/src/domains/perception/perception.schemas.d.ts.map +1 -0
  101. package/dist/src/domains/perception/perception.schemas.js +108 -0
  102. package/dist/src/domains/perception/perception.schemas.js.map +1 -0
  103. package/dist/src/domains/perception/perception.types.d.ts +90 -0
  104. package/dist/src/domains/perception/perception.types.d.ts.map +1 -0
  105. package/dist/src/domains/perception/perception.types.js +7 -0
  106. package/dist/src/domains/perception/perception.types.js.map +1 -0
  107. package/dist/src/domains/session/handlers/index.d.ts +5 -0
  108. package/dist/src/domains/session/handlers/index.d.ts.map +1 -0
  109. package/dist/src/domains/session/handlers/index.js +5 -0
  110. package/dist/src/domains/session/handlers/index.js.map +1 -0
  111. package/dist/src/domains/session/handlers/session.handler.d.ts +68 -0
  112. package/dist/src/domains/session/handlers/session.handler.d.ts.map +1 -0
  113. package/dist/src/domains/session/handlers/session.handler.js +225 -0
  114. package/dist/src/domains/session/handlers/session.handler.js.map +1 -0
  115. package/dist/src/domains/session/session.schemas.d.ts +483 -0
  116. package/dist/src/domains/session/session.schemas.d.ts.map +1 -0
  117. package/dist/src/domains/session/session.schemas.js +61 -0
  118. package/dist/src/domains/session/session.schemas.js.map +1 -0
  119. package/dist/src/domains/session/session.types.d.ts +64 -0
  120. package/dist/src/domains/session/session.types.d.ts.map +1 -0
  121. package/dist/src/domains/session/session.types.js +7 -0
  122. package/dist/src/domains/session/session.types.js.map +1 -0
  123. package/dist/src/index.d.ts +8 -0
  124. package/dist/src/index.d.ts.map +1 -0
  125. package/dist/src/index.js +128 -0
  126. package/dist/src/index.js.map +1 -0
  127. package/dist/src/server/mcp-server.d.ts +65 -0
  128. package/dist/src/server/mcp-server.d.ts.map +1 -0
  129. package/dist/src/server/mcp-server.js +390 -0
  130. package/dist/src/server/mcp-server.js.map +1 -0
  131. package/dist/src/server/tool-registry.d.ts +53 -0
  132. package/dist/src/server/tool-registry.d.ts.map +1 -0
  133. package/dist/src/server/tool-registry.js +39 -0
  134. package/dist/src/server/tool-registry.js.map +1 -0
  135. package/dist/src/server/types.d.ts +46 -0
  136. package/dist/src/server/types.d.ts.map +1 -0
  137. package/dist/src/server/types.js +7 -0
  138. package/dist/src/server/types.js.map +1 -0
  139. package/dist/src/shared/errors/error-codes.d.ts +52 -0
  140. package/dist/src/shared/errors/error-codes.d.ts.map +1 -0
  141. package/dist/src/shared/errors/error-codes.js +63 -0
  142. package/dist/src/shared/errors/error-codes.js.map +1 -0
  143. package/dist/src/shared/errors/error-response.d.ts +61 -0
  144. package/dist/src/shared/errors/error-response.d.ts.map +1 -0
  145. package/dist/src/shared/errors/error-response.js +136 -0
  146. package/dist/src/shared/errors/error-response.js.map +1 -0
  147. package/dist/src/shared/errors/index.d.ts +9 -0
  148. package/dist/src/shared/errors/index.d.ts.map +1 -0
  149. package/dist/src/shared/errors/index.js +9 -0
  150. package/dist/src/shared/errors/index.js.map +1 -0
  151. package/dist/src/shared/errors/mcp-error.d.ts +57 -0
  152. package/dist/src/shared/errors/mcp-error.d.ts.map +1 -0
  153. package/dist/src/shared/errors/mcp-error.js +93 -0
  154. package/dist/src/shared/errors/mcp-error.js.map +1 -0
  155. package/dist/src/shared/schemas/base.schemas.d.ts +454 -0
  156. package/dist/src/shared/schemas/base.schemas.d.ts.map +1 -0
  157. package/dist/src/shared/schemas/base.schemas.js +168 -0
  158. package/dist/src/shared/schemas/base.schemas.js.map +1 -0
  159. package/dist/src/shared/schemas/index.d.ts +5 -0
  160. package/dist/src/shared/schemas/index.d.ts.map +1 -0
  161. package/dist/src/shared/schemas/index.js +5 -0
  162. package/dist/src/shared/schemas/index.js.map +1 -0
  163. package/dist/src/shared/services/dom-transformer.service.d.ts +71 -0
  164. package/dist/src/shared/services/dom-transformer.service.d.ts.map +1 -0
  165. package/dist/src/shared/services/dom-transformer.service.js +190 -0
  166. package/dist/src/shared/services/dom-transformer.service.js.map +1 -0
  167. package/dist/src/shared/services/element-fusion.service.d.ts +80 -0
  168. package/dist/src/shared/services/element-fusion.service.d.ts.map +1 -0
  169. package/dist/src/shared/services/element-fusion.service.js +286 -0
  170. package/dist/src/shared/services/element-fusion.service.js.map +1 -0
  171. package/dist/src/shared/services/element-resolver.service.d.ts +93 -0
  172. package/dist/src/shared/services/element-resolver.service.d.ts.map +1 -0
  173. package/dist/src/shared/services/element-resolver.service.js +378 -0
  174. package/dist/src/shared/services/element-resolver.service.js.map +1 -0
  175. package/dist/src/shared/services/form-detector.service.d.ts +119 -0
  176. package/dist/src/shared/services/form-detector.service.d.ts.map +1 -0
  177. package/dist/src/shared/services/form-detector.service.js +308 -0
  178. package/dist/src/shared/services/form-detector.service.js.map +1 -0
  179. package/dist/src/shared/services/index.d.ts +9 -0
  180. package/dist/src/shared/services/index.d.ts.map +1 -0
  181. package/dist/src/shared/services/index.js +9 -0
  182. package/dist/src/shared/services/index.js.map +1 -0
  183. package/dist/src/shared/services/logging.service.d.ts +145 -0
  184. package/dist/src/shared/services/logging.service.d.ts.map +1 -0
  185. package/dist/src/shared/services/logging.service.js +257 -0
  186. package/dist/src/shared/services/logging.service.js.map +1 -0
  187. package/dist/src/shared/services/selector-builder.service.d.ts +56 -0
  188. package/dist/src/shared/services/selector-builder.service.d.ts.map +1 -0
  189. package/dist/src/shared/services/selector-builder.service.js +232 -0
  190. package/dist/src/shared/services/selector-builder.service.js.map +1 -0
  191. package/dist/src/shared/services/visibility-checker.service.d.ts +55 -0
  192. package/dist/src/shared/services/visibility-checker.service.d.ts.map +1 -0
  193. package/dist/src/shared/services/visibility-checker.service.js +204 -0
  194. package/dist/src/shared/services/visibility-checker.service.js.map +1 -0
  195. package/dist/src/shared/types/base.types.d.ts +103 -0
  196. package/dist/src/shared/types/base.types.d.ts.map +1 -0
  197. package/dist/src/shared/types/base.types.js +5 -0
  198. package/dist/src/shared/types/base.types.js.map +1 -0
  199. package/dist/src/shared/types/index.d.ts +5 -0
  200. package/dist/src/shared/types/index.d.ts.map +1 -0
  201. package/dist/src/shared/types/index.js +5 -0
  202. package/dist/src/shared/types/index.js.map +1 -0
  203. package/dist/tests/mocks/cdp-bridge.mock.d.ts +45 -0
  204. package/dist/tests/mocks/cdp-bridge.mock.d.ts.map +1 -0
  205. package/dist/tests/mocks/cdp-bridge.mock.js +126 -0
  206. package/dist/tests/mocks/cdp-bridge.mock.js.map +1 -0
  207. package/dist/tests/unit/shared/dom-transformer.service.test.d.ts +5 -0
  208. package/dist/tests/unit/shared/dom-transformer.service.test.d.ts.map +1 -0
  209. package/dist/tests/unit/shared/dom-transformer.service.test.js +273 -0
  210. package/dist/tests/unit/shared/dom-transformer.service.test.js.map +1 -0
  211. package/dist/vitest.config.d.ts +3 -0
  212. package/dist/vitest.config.d.ts.map +1 -0
  213. package/dist/vitest.config.js +15 -0
  214. package/dist/vitest.config.js.map +1 -0
  215. package/package.json +72 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Nadeem
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,364 @@
1
+ # Browser Automation MCP Server
2
+
3
+ [![CI](https://github.com/lespaceman/athena-browser-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/lespaceman/athena-browser-mcp/actions/workflows/ci.yml)
4
+ [![npm version](https://badge.fury.io/js/athena-browser-mcp.svg)](https://www.npmjs.com/package/athena-browser-mcp)
5
+ [![codecov](https://codecov.io/gh/lespaceman/athena-browser-mcp/branch/main/graph/badge.svg)](https://codecov.io/gh/lespaceman/athena-browser-mcp)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
+
8
+ A comprehensive Model Context Protocol (MCP) server that exposes browser automation capabilities for AI agents through Qt + CEF (Chromium Embedded Framework).
9
+
10
+ ## Overview
11
+
12
+ This MCP server provides 40+ tools organized into three categories:
13
+
14
+ ### A) Perception & Understanding Tools (11 tools)
15
+
16
+ - **DOM & Accessibility**: Get stable DOM trees and accessibility information
17
+ - **Layout & Visibility**: Check element geometry and visibility
18
+ - **UI Discovery**: Fuse DOM+AX+layout for intelligent element discovery
19
+ - **Vision/OCR**: Fallback text detection for canvas/SVG elements
20
+ - **Network Observation**: Monitor and capture network requests
21
+ - **Content Extraction**: Extract main content using Readability/Trafilatura
22
+
23
+ ### B) Interaction & Navigation Tools (14 tools)
24
+
25
+ - **Target Resolution**: Resolve semantic hints to concrete elements
26
+ - **Actions**: Click, type, select, scroll, upload files
27
+ - **Navigation**: Go to URLs, wait for conditions, switch frames
28
+ - **Form Toolkit**: Detect, fill, and submit forms intelligently
29
+ - **Keyboard**: Press key sequences and type text
30
+
31
+ ### C) Session, Memory & Safety Tools (10 tools)
32
+
33
+ - **Session Management**: Save/restore cookies and storage
34
+ - **Site Memory**: Learn stable selectors for recurring sites
35
+ - **Safety Controls**: Domain allowlists, action budgets, audit logs
36
+ - **Audit Snapshots**: Capture screenshots, DOM, and HAR files
37
+
38
+ ## Architecture
39
+
40
+ ```
41
+ ┌─────────────┐
42
+ │ Claude │ (AI Agent)
43
+ └──────┬──────┘
44
+ │ MCP Protocol
45
+
46
+ ┌──────▼──────────────────────┐
47
+ │ MCP Server (Node.js) │
48
+ │ - Tool routing │
49
+ │ - Safety policies │
50
+ │ - Audit logging │
51
+ └──────┬──────────────────────┘
52
+ │ IPC/WebSocket
53
+
54
+ ┌──────▼──────────────────────┐
55
+ │ CEF Bridge (Qt/C++) │
56
+ │ - CDP communication │
57
+ │ - Screenshot capture │
58
+ │ - File system access │
59
+ └──────┬──────────────────────┘
60
+ │ Chrome DevTools Protocol
61
+
62
+ ┌──────▼──────────────────────┐
63
+ │ Chromium Engine (CEF) │
64
+ │ - Render web pages │
65
+ │ - Execute JavaScript │
66
+ │ - Network handling │
67
+ └─────────────────────────────┘
68
+ ```
69
+
70
+ ## Installation
71
+
72
+ ```bash
73
+ npm install
74
+ npm run build
75
+ ```
76
+
77
+ ## Configuration
78
+
79
+ ### Claude Desktop Configuration
80
+
81
+ Add to your Claude Desktop config file:
82
+
83
+ **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
84
+ **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
85
+ **Linux**: `~/.config/Claude/claude_desktop_config.json`
86
+
87
+ ```json
88
+ {
89
+ "mcpServers": {
90
+ "browser-automation": {
91
+ "command": "node",
92
+ "args": ["/path/to/athena-browser-mcp/dist/src/index.js"],
93
+ "env": {
94
+ "CEF_BRIDGE_HOST": "localhost",
95
+ "CEF_BRIDGE_PORT": "9222",
96
+ "ALLOWED_FILE_DIRS": "/home/user/downloads,/tmp"
97
+ }
98
+ }
99
+ }
100
+ }
101
+ ```
102
+
103
+ ### Environment Variables
104
+
105
+ - `CEF_BRIDGE_HOST`: Host for CEF bridge connection (default: localhost)
106
+ - `CEF_BRIDGE_PORT`: Port for CEF bridge connection (default: 9222)
107
+ - `ALLOWED_FILE_DIRS`: Comma-separated list of directories for file uploads
108
+ - `DEFAULT_TIMEOUT_MS`: Default timeout for operations (default: 30000)
109
+
110
+ ## Usage Examples
111
+
112
+ ### Example 1: Login Flow
113
+
114
+ ```typescript
115
+ // 1. Discover form elements
116
+ const form = await mcp.tools.form_detect({});
117
+
118
+ // 2. Fill credentials
119
+ await mcp.tools.form_fill({
120
+ pairs: [
121
+ { slot: 'email', text: 'user@example.com' },
122
+ { slot: 'password', text: '********' },
123
+ ],
124
+ });
125
+
126
+ // 3. Submit form
127
+ await mcp.tools.form_submit({ strategy: 'button' });
128
+
129
+ // 4. Wait for navigation
130
+ await mcp.tools.nav_wait({ for: 'route-change' });
131
+
132
+ // 5. Save session
133
+ const session = await mcp.tools.session_save({ domain: 'example.com' });
134
+ ```
135
+
136
+ ### Example 2: Search and Extract
137
+
138
+ ```typescript
139
+ // 1. Navigate to search page
140
+ await mcp.tools.nav_goto({ url: 'https://example.com/search' });
141
+
142
+ // 2. Find search box
143
+ const searchBox = await mcp.tools.targets_resolve({
144
+ hint: { role: 'textbox', label: 'Search' },
145
+ });
146
+
147
+ // 3. Type search query
148
+ await mcp.tools.act_type({
149
+ target: searchBox,
150
+ text: 'machine learning',
151
+ submit: 'Enter',
152
+ });
153
+
154
+ // 4. Wait for results
155
+ await mcp.tools.nav_wait({ for: 'network-idle' });
156
+
157
+ // 5. Extract main content
158
+ const content = await mcp.tools.content_extract_main({
159
+ mode: 'readability',
160
+ });
161
+ ```
162
+
163
+ ### Example 3: Handle Canvas UI (with OCR fallback)
164
+
165
+ ```typescript
166
+ // 1. Try semantic resolution first
167
+ let button = await mcp.tools.targets_resolve({
168
+ hint: { role: 'button', label: 'Download' },
169
+ });
170
+
171
+ // 2. Fallback to vision if needed
172
+ if (!button) {
173
+ button = await mcp.tools.vision_find_by_text({
174
+ text: 'Download',
175
+ fuzzy: true,
176
+ });
177
+ }
178
+
179
+ // 3. Click using bbox strategy
180
+ if (button) {
181
+ await mcp.tools.act_click({
182
+ target: button,
183
+ strategy: 'bbox',
184
+ });
185
+ }
186
+
187
+ // 4. Verify with network observation
188
+ const download = await mcp.tools.net_observe({
189
+ patterns: ['*.pdf', '*.csv'],
190
+ });
191
+ ```
192
+
193
+ ## Tool Categories
194
+
195
+ ### Deterministic-First, Vision-Assisted Fallback
196
+
197
+ The toolkit prioritizes deterministic methods:
198
+
199
+ 1. **Accessibility tree** (most stable)
200
+ 2. **DOM selectors** (CSS, XPath)
201
+ 3. **Layout/geometry** (bounding boxes)
202
+ 4. **Vision/OCR** (last resort for canvas/SVG)
203
+
204
+ ### Selector Bundles
205
+
206
+ Each `ElementRef` contains multiple locators for resilience:
207
+
208
+ ```typescript
209
+ interface ElementRef {
210
+ frameId: string;
211
+ nodeId?: number;
212
+ selectors: {
213
+ ax?: string; // Accessibility path
214
+ css?: string; // CSS selector
215
+ xpath?: string; // XPath expression
216
+ };
217
+ bbox?: { x: number; y: number; w: number; h: number };
218
+ role?: string;
219
+ label?: string;
220
+ name?: string;
221
+ }
222
+ ```
223
+
224
+ ### Safety Features
225
+
226
+ 1. **Domain Allowlists**: Restrict navigation to approved domains
227
+ 2. **Action Budgets**: Rate limit to prevent runaway automation
228
+ 3. **File Path Validation**: Only upload files from allowed directories
229
+ 4. **Audit Logging**: All actions captured with pre/post screenshots
230
+ 5. **Confirmation Prompts**: For destructive actions (delete, purchase)
231
+
232
+ ## Implementation Checklist
233
+
234
+ ### Phase 1: Core Tools (Week 1-2)
235
+
236
+ - [ ] `targets_resolve` - Element resolution
237
+ - [ ] `act_click` - Click actions
238
+ - [ ] `act_type` - Text input
239
+ - [ ] `nav_wait` - Wait conditions
240
+ - [ ] `ui_discover` - Element discovery
241
+ - [ ] CEF Bridge basic IPC
242
+
243
+ ### Phase 2: Robustness (Week 3-4)
244
+
245
+ - [ ] `form_detect` / `form_fill` / `form_submit`
246
+ - [ ] Selector bundle system
247
+ - [ ] Shadow DOM piercing
248
+ - [ ] Frame handling
249
+ - [ ] Visibility checks
250
+
251
+ ### Phase 3: Advanced Features (Week 5-6)
252
+
253
+ - [ ] `vision_ocr` / `vision_find_by_text`
254
+ - [ ] `net_observe` / `net_get_response_body`
255
+ - [ ] `session_save` / `session_restore`
256
+ - [ ] Site memory profiles
257
+ - [ ] Virtualized list handling
258
+
259
+ ### Phase 4: Safety & Production (Week 7-8)
260
+
261
+ - [ ] `safety_set_policy`
262
+ - [ ] `audit_snapshot`
263
+ - [ ] Domain allowlists
264
+ - [ ] Action budgets
265
+ - [ ] Comprehensive logging
266
+ - [ ] Error recovery
267
+
268
+ ## CEF Bridge Requirements
269
+
270
+ Your Qt/CEF application must expose these capabilities via IPC:
271
+
272
+ ```typescript
273
+ interface CEFBridge {
274
+ // CDP Methods
275
+ executeDevToolsMethod(method: string, params: any): Promise<any>;
276
+ onDevToolsEvent(handler: (event: string, params: any) => void): void;
277
+
278
+ // Screenshot
279
+ captureScreenshot(region?: BBox): Promise<string>; // Returns base64 or path
280
+
281
+ // File System
282
+ saveFile(path: string, data: Buffer): Promise<void>;
283
+ readFile(path: string): Promise<Buffer>;
284
+
285
+ // Safety
286
+ setSafetyPolicy(policy: SafetyPolicy): void;
287
+ }
288
+ ```
289
+
290
+ ## Testing
291
+
292
+ ```bash
293
+ # Run tests
294
+ npm test
295
+
296
+ # Test with Claude Desktop
297
+ # 1. Configure Claude Desktop (see Configuration section)
298
+ # 2. Restart Claude Desktop
299
+ # 3. Start a conversation with Claude
300
+ # 4. Ask: "Can you help me navigate to example.com and find the search box?"
301
+ ```
302
+
303
+ ## Debugging
304
+
305
+ Enable debug logging:
306
+
307
+ ```bash
308
+ DEBUG=mcp:* node dist/src/index.js
309
+ ```
310
+
311
+ Check MCP communication:
312
+
313
+ ```bash
314
+ # View MCP protocol messages
315
+ tail -f ~/Library/Logs/Claude/mcp*.log # macOS
316
+ ```
317
+
318
+ ## API Reference
319
+
320
+ See [src/config/tools.json](./src/config/tools.json) for complete tool definitions.
321
+
322
+ See type definitions in:
323
+
324
+ - [src/domains/interaction/interaction.types.ts](./src/domains/interaction/interaction.types.ts)
325
+ - [src/domains/perception/perception.types.ts](./src/domains/perception/perception.types.ts)
326
+ - [src/domains/navigation/navigation.types.ts](./src/domains/navigation/navigation.types.ts)
327
+ - [src/domains/session/session.types.ts](./src/domains/session/session.types.ts)
328
+
329
+ ## Design Principles
330
+
331
+ 1. **Separation of Concerns**: Agent never touches CDP directly
332
+ 2. **Resilience**: Multiple locator strategies with automatic fallback
333
+ 3. **Observability**: Every action logged with screenshots
334
+ 4. **Safety**: Allowlists, budgets, and confirmations built-in
335
+ 5. **Determinism**: Prefer stable AX/DOM methods over vision
336
+ 6. **Testability**: Each tool is independently testable
337
+
338
+ ## Contributing
339
+
340
+ 1. Add new tools to `src/config/tools.json`
341
+ 2. Add type definitions to appropriate domain type files
342
+ 3. Implement handlers in respective domain handler files
343
+ 4. Add tests in `tests/`
344
+ 5. Update README with examples
345
+
346
+ ## License
347
+
348
+ MIT
349
+
350
+ ## Support
351
+
352
+ For issues or questions, please open an issue on GitHub or contact the development team.
353
+
354
+ ## Roadmap
355
+
356
+ - [ ] Multi-tab support
357
+ - [ ] Browser extension API bridge
358
+ - [ ] Performance profiling tools
359
+ - [ ] A/B testing utilities
360
+ - [ ] Visual regression testing
361
+ - [ ] Accessibility audit tools
362
+ - [ ] Network throttling
363
+ - [ ] Geolocation simulation
364
+ - [ ] Device emulation
@@ -0,0 +1,115 @@
1
+ /**
2
+ * CEF Bridge Interface
3
+ *
4
+ * This module connects to CEF's native Chrome DevTools Protocol server
5
+ * using the chrome-remote-interface library.
6
+ */
7
+ import { EventEmitter } from 'events';
8
+ import type { BBox, NetworkEvent } from '../shared/types/index.js';
9
+ interface SafetyPolicy {
10
+ allowedDomains?: string[];
11
+ blockedDomains?: string[];
12
+ allowFileUploads?: boolean;
13
+ maxNetworkRequests?: number;
14
+ }
15
+ /**
16
+ * CEFBridge connects to CEF's Chrome DevTools Protocol server
17
+ * and provides methods to execute CDP commands.
18
+ */
19
+ export declare class CEFBridge extends EventEmitter {
20
+ private cdpClient?;
21
+ private readonly host;
22
+ private readonly port;
23
+ private safetyPolicy?;
24
+ private reconnectAttempts;
25
+ private readonly maxReconnectAttempts;
26
+ private readonly reconnectDelay;
27
+ private isConnecting;
28
+ private isClosing;
29
+ private networkEventsBuffer;
30
+ constructor();
31
+ /**
32
+ * Connect to the CEF CDP server
33
+ */
34
+ private connect;
35
+ /**
36
+ * Enable required CDP domains
37
+ */
38
+ private enableDomains;
39
+ /**
40
+ * Set up CDP event handlers
41
+ */
42
+ private setupEventHandlers;
43
+ /**
44
+ * Schedule reconnection attempt
45
+ */
46
+ private scheduleReconnect;
47
+ /**
48
+ * Execute a Chrome DevTools Protocol method
49
+ *
50
+ * @param method CDP method name (e.g., 'DOM.getDocument', 'Page.navigate')
51
+ * @param params Parameters for the CDP method
52
+ * @returns Promise resolving to CDP response
53
+ */
54
+ executeDevToolsMethod<TResult = unknown, TParams extends Record<string, unknown> = Record<string, unknown>>(method: string, params: TParams): Promise<TResult>;
55
+ private executeWithConnection;
56
+ /**
57
+ * Capture a screenshot of the current page or a specific region
58
+ *
59
+ * @param region Optional region to capture
60
+ * @returns Promise resolving to screenshot path or base64 data
61
+ */
62
+ captureScreenshot(region?: BBox): Promise<string>;
63
+ /**
64
+ * Save a file to the file system
65
+ *
66
+ * @param path File path
67
+ * @param data File data
68
+ */
69
+ saveFile(path: string, data: Buffer): Promise<void>;
70
+ /**
71
+ * Read a file from the file system
72
+ *
73
+ * @param path File path
74
+ * @returns Promise resolving to file data
75
+ */
76
+ readFile(path: string): Promise<Buffer>;
77
+ /**
78
+ * Set safety policy for browser operations
79
+ *
80
+ * @param policy Safety policy configuration
81
+ */
82
+ setSafetyPolicy(policy: SafetyPolicy): void;
83
+ /**
84
+ * Get current safety policy
85
+ */
86
+ getSafetyPolicy(): SafetyPolicy | undefined;
87
+ /**
88
+ * Get observed network events from buffer
89
+ *
90
+ * @returns Array of network events
91
+ */
92
+ getObservedNetworkEvents(): NetworkEvent[];
93
+ /**
94
+ * Observe network events matching patterns
95
+ *
96
+ * @param patterns URL patterns to observe
97
+ * @returns Async iterable of network events
98
+ */
99
+ observeNetworkEvents(patterns?: string[]): AsyncIterable<NetworkEvent>;
100
+ private toNetworkEvent;
101
+ private extractHeaders;
102
+ /**
103
+ * Check if URL matches pattern
104
+ */
105
+ private matchPattern;
106
+ /**
107
+ * Close connection to CDP server
108
+ */
109
+ close(): Promise<void>;
110
+ private ensureConnected;
111
+ private handleDisconnect;
112
+ private ensureRecord;
113
+ }
114
+ export {};
115
+ //# sourceMappingURL=cef-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cef-bridge.d.ts","sourceRoot":"","sources":["../../../src/bridge/cef-bridge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGnE,UAAU,YAAY;IACpB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;GAGG;AACH,qBAAa,SAAU,SAAQ,YAAY;IACzC,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAK;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,mBAAmB,CAAsB;;IAajD;;OAEG;YACW,OAAO;IA0CrB;;OAEG;YACW,aAAa;IAoB3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAyB1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAsBzB;;;;;;OAMG;IACG,qBAAqB,CACzB,OAAO,GAAG,OAAO,EACjB,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YAItC,qBAAqB;IA2CnC;;;;;OAKG;IACG,iBAAiB,CAAC,MAAM,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAwBvD;;;;;OAKG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzD;;;;;OAKG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ7C;;;;OAIG;IACH,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAK3C;;OAEG;IACH,eAAe,IAAI,YAAY,GAAG,SAAS;IAI3C;;;;OAIG;IACH,wBAAwB,IAAI,YAAY,EAAE;IAM1C;;;;;OAKG;IACI,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,YAAY,CAAC;IA6C7E,OAAO,CAAC,cAAc;IAqCtB,OAAO,CAAC,cAAc;IAStB;;OAEG;IACH,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAiBd,eAAe;IAkD7B,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,YAAY;CAMrB"}