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.
- package/LICENSE +21 -0
- package/README.md +364 -0
- package/dist/src/bridge/cef-bridge.d.ts +115 -0
- package/dist/src/bridge/cef-bridge.d.ts.map +1 -0
- package/dist/src/bridge/cef-bridge.js +417 -0
- package/dist/src/bridge/cef-bridge.js.map +1 -0
- package/dist/src/domains/interaction/handlers/action.handler.d.ts +72 -0
- package/dist/src/domains/interaction/handlers/action.handler.d.ts.map +1 -0
- package/dist/src/domains/interaction/handlers/action.handler.js +304 -0
- package/dist/src/domains/interaction/handlers/action.handler.js.map +1 -0
- package/dist/src/domains/interaction/handlers/form.handler.d.ts +66 -0
- package/dist/src/domains/interaction/handlers/form.handler.d.ts.map +1 -0
- package/dist/src/domains/interaction/handlers/form.handler.js +180 -0
- package/dist/src/domains/interaction/handlers/form.handler.js.map +1 -0
- package/dist/src/domains/interaction/handlers/index.d.ts +7 -0
- package/dist/src/domains/interaction/handlers/index.d.ts.map +1 -0
- package/dist/src/domains/interaction/handlers/index.js +7 -0
- package/dist/src/domains/interaction/handlers/index.js.map +1 -0
- package/dist/src/domains/interaction/handlers/keyboard.handler.d.ts +44 -0
- package/dist/src/domains/interaction/handlers/keyboard.handler.d.ts.map +1 -0
- package/dist/src/domains/interaction/handlers/keyboard.handler.js +247 -0
- package/dist/src/domains/interaction/handlers/keyboard.handler.js.map +1 -0
- package/dist/src/domains/interaction/interaction.schemas.d.ts +2463 -0
- package/dist/src/domains/interaction/interaction.schemas.d.ts.map +1 -0
- package/dist/src/domains/interaction/interaction.schemas.js +162 -0
- package/dist/src/domains/interaction/interaction.schemas.js.map +1 -0
- package/dist/src/domains/interaction/interaction.types.d.ts +134 -0
- package/dist/src/domains/interaction/interaction.types.d.ts.map +1 -0
- package/dist/src/domains/interaction/interaction.types.js +7 -0
- package/dist/src/domains/interaction/interaction.types.js.map +1 -0
- package/dist/src/domains/interaction/strategies/accessibility-click.strategy.d.ts +24 -0
- package/dist/src/domains/interaction/strategies/accessibility-click.strategy.d.ts.map +1 -0
- package/dist/src/domains/interaction/strategies/accessibility-click.strategy.js +69 -0
- package/dist/src/domains/interaction/strategies/accessibility-click.strategy.js.map +1 -0
- package/dist/src/domains/interaction/strategies/bbox-click.strategy.d.ts +28 -0
- package/dist/src/domains/interaction/strategies/bbox-click.strategy.d.ts.map +1 -0
- package/dist/src/domains/interaction/strategies/bbox-click.strategy.js +54 -0
- package/dist/src/domains/interaction/strategies/bbox-click.strategy.js.map +1 -0
- package/dist/src/domains/interaction/strategies/click-strategy.interface.d.ts +24 -0
- package/dist/src/domains/interaction/strategies/click-strategy.interface.d.ts.map +1 -0
- package/dist/src/domains/interaction/strategies/click-strategy.interface.js +7 -0
- package/dist/src/domains/interaction/strategies/click-strategy.interface.js.map +1 -0
- package/dist/src/domains/interaction/strategies/dom-click.strategy.d.ts +40 -0
- package/dist/src/domains/interaction/strategies/dom-click.strategy.d.ts.map +1 -0
- package/dist/src/domains/interaction/strategies/dom-click.strategy.js +135 -0
- package/dist/src/domains/interaction/strategies/dom-click.strategy.js.map +1 -0
- package/dist/src/domains/interaction/strategies/index.d.ts +8 -0
- package/dist/src/domains/interaction/strategies/index.d.ts.map +1 -0
- package/dist/src/domains/interaction/strategies/index.js +8 -0
- package/dist/src/domains/interaction/strategies/index.js.map +1 -0
- package/dist/src/domains/navigation/handlers/index.d.ts +5 -0
- package/dist/src/domains/navigation/handlers/index.d.ts.map +1 -0
- package/dist/src/domains/navigation/handlers/index.js +5 -0
- package/dist/src/domains/navigation/handlers/index.js.map +1 -0
- package/dist/src/domains/navigation/handlers/navigation.handler.d.ts +68 -0
- package/dist/src/domains/navigation/handlers/navigation.handler.d.ts.map +1 -0
- package/dist/src/domains/navigation/handlers/navigation.handler.js +246 -0
- package/dist/src/domains/navigation/handlers/navigation.handler.js.map +1 -0
- package/dist/src/domains/navigation/navigation.schemas.d.ts +115 -0
- package/dist/src/domains/navigation/navigation.schemas.d.ts.map +1 -0
- package/dist/src/domains/navigation/navigation.schemas.js +65 -0
- package/dist/src/domains/navigation/navigation.schemas.js.map +1 -0
- package/dist/src/domains/navigation/navigation.types.d.ts +70 -0
- package/dist/src/domains/navigation/navigation.types.d.ts.map +1 -0
- package/dist/src/domains/navigation/navigation.types.js +7 -0
- package/dist/src/domains/navigation/navigation.types.js.map +1 -0
- package/dist/src/domains/perception/handlers/ax-tree.handler.d.ts +32 -0
- package/dist/src/domains/perception/handlers/ax-tree.handler.d.ts.map +1 -0
- package/dist/src/domains/perception/handlers/ax-tree.handler.js +60 -0
- package/dist/src/domains/perception/handlers/ax-tree.handler.js.map +1 -0
- package/dist/src/domains/perception/handlers/content.handler.d.ts +55 -0
- package/dist/src/domains/perception/handlers/content.handler.d.ts.map +1 -0
- package/dist/src/domains/perception/handlers/content.handler.js +150 -0
- package/dist/src/domains/perception/handlers/content.handler.js.map +1 -0
- package/dist/src/domains/perception/handlers/dom-tree.handler.d.ts +21 -0
- package/dist/src/domains/perception/handlers/dom-tree.handler.d.ts.map +1 -0
- package/dist/src/domains/perception/handlers/dom-tree.handler.js +40 -0
- package/dist/src/domains/perception/handlers/dom-tree.handler.js.map +1 -0
- package/dist/src/domains/perception/handlers/index.d.ts +11 -0
- package/dist/src/domains/perception/handlers/index.d.ts.map +1 -0
- package/dist/src/domains/perception/handlers/index.js +11 -0
- package/dist/src/domains/perception/handlers/index.js.map +1 -0
- package/dist/src/domains/perception/handlers/layout.handler.d.ts +30 -0
- package/dist/src/domains/perception/handlers/layout.handler.d.ts.map +1 -0
- package/dist/src/domains/perception/handlers/layout.handler.js +61 -0
- package/dist/src/domains/perception/handlers/layout.handler.js.map +1 -0
- package/dist/src/domains/perception/handlers/network.handler.d.ts +31 -0
- package/dist/src/domains/perception/handlers/network.handler.d.ts.map +1 -0
- package/dist/src/domains/perception/handlers/network.handler.js +59 -0
- package/dist/src/domains/perception/handlers/network.handler.js.map +1 -0
- package/dist/src/domains/perception/handlers/ui-discover.handler.d.ts +21 -0
- package/dist/src/domains/perception/handlers/ui-discover.handler.d.ts.map +1 -0
- package/dist/src/domains/perception/handlers/ui-discover.handler.js +37 -0
- package/dist/src/domains/perception/handlers/ui-discover.handler.js.map +1 -0
- package/dist/src/domains/perception/handlers/vision.handler.d.ts +43 -0
- package/dist/src/domains/perception/handlers/vision.handler.d.ts.map +1 -0
- package/dist/src/domains/perception/handlers/vision.handler.js +116 -0
- package/dist/src/domains/perception/handlers/vision.handler.js.map +1 -0
- package/dist/src/domains/perception/perception.schemas.d.ts +1223 -0
- package/dist/src/domains/perception/perception.schemas.d.ts.map +1 -0
- package/dist/src/domains/perception/perception.schemas.js +108 -0
- package/dist/src/domains/perception/perception.schemas.js.map +1 -0
- package/dist/src/domains/perception/perception.types.d.ts +90 -0
- package/dist/src/domains/perception/perception.types.d.ts.map +1 -0
- package/dist/src/domains/perception/perception.types.js +7 -0
- package/dist/src/domains/perception/perception.types.js.map +1 -0
- package/dist/src/domains/session/handlers/index.d.ts +5 -0
- package/dist/src/domains/session/handlers/index.d.ts.map +1 -0
- package/dist/src/domains/session/handlers/index.js +5 -0
- package/dist/src/domains/session/handlers/index.js.map +1 -0
- package/dist/src/domains/session/handlers/session.handler.d.ts +68 -0
- package/dist/src/domains/session/handlers/session.handler.d.ts.map +1 -0
- package/dist/src/domains/session/handlers/session.handler.js +225 -0
- package/dist/src/domains/session/handlers/session.handler.js.map +1 -0
- package/dist/src/domains/session/session.schemas.d.ts +483 -0
- package/dist/src/domains/session/session.schemas.d.ts.map +1 -0
- package/dist/src/domains/session/session.schemas.js +61 -0
- package/dist/src/domains/session/session.schemas.js.map +1 -0
- package/dist/src/domains/session/session.types.d.ts +64 -0
- package/dist/src/domains/session/session.types.d.ts.map +1 -0
- package/dist/src/domains/session/session.types.js +7 -0
- package/dist/src/domains/session/session.types.js.map +1 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +128 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/server/mcp-server.d.ts +65 -0
- package/dist/src/server/mcp-server.d.ts.map +1 -0
- package/dist/src/server/mcp-server.js +390 -0
- package/dist/src/server/mcp-server.js.map +1 -0
- package/dist/src/server/tool-registry.d.ts +53 -0
- package/dist/src/server/tool-registry.d.ts.map +1 -0
- package/dist/src/server/tool-registry.js +39 -0
- package/dist/src/server/tool-registry.js.map +1 -0
- package/dist/src/server/types.d.ts +46 -0
- package/dist/src/server/types.d.ts.map +1 -0
- package/dist/src/server/types.js +7 -0
- package/dist/src/server/types.js.map +1 -0
- package/dist/src/shared/errors/error-codes.d.ts +52 -0
- package/dist/src/shared/errors/error-codes.d.ts.map +1 -0
- package/dist/src/shared/errors/error-codes.js +63 -0
- package/dist/src/shared/errors/error-codes.js.map +1 -0
- package/dist/src/shared/errors/error-response.d.ts +61 -0
- package/dist/src/shared/errors/error-response.d.ts.map +1 -0
- package/dist/src/shared/errors/error-response.js +136 -0
- package/dist/src/shared/errors/error-response.js.map +1 -0
- package/dist/src/shared/errors/index.d.ts +9 -0
- package/dist/src/shared/errors/index.d.ts.map +1 -0
- package/dist/src/shared/errors/index.js +9 -0
- package/dist/src/shared/errors/index.js.map +1 -0
- package/dist/src/shared/errors/mcp-error.d.ts +57 -0
- package/dist/src/shared/errors/mcp-error.d.ts.map +1 -0
- package/dist/src/shared/errors/mcp-error.js +93 -0
- package/dist/src/shared/errors/mcp-error.js.map +1 -0
- package/dist/src/shared/schemas/base.schemas.d.ts +454 -0
- package/dist/src/shared/schemas/base.schemas.d.ts.map +1 -0
- package/dist/src/shared/schemas/base.schemas.js +168 -0
- package/dist/src/shared/schemas/base.schemas.js.map +1 -0
- package/dist/src/shared/schemas/index.d.ts +5 -0
- package/dist/src/shared/schemas/index.d.ts.map +1 -0
- package/dist/src/shared/schemas/index.js +5 -0
- package/dist/src/shared/schemas/index.js.map +1 -0
- package/dist/src/shared/services/dom-transformer.service.d.ts +71 -0
- package/dist/src/shared/services/dom-transformer.service.d.ts.map +1 -0
- package/dist/src/shared/services/dom-transformer.service.js +190 -0
- package/dist/src/shared/services/dom-transformer.service.js.map +1 -0
- package/dist/src/shared/services/element-fusion.service.d.ts +80 -0
- package/dist/src/shared/services/element-fusion.service.d.ts.map +1 -0
- package/dist/src/shared/services/element-fusion.service.js +286 -0
- package/dist/src/shared/services/element-fusion.service.js.map +1 -0
- package/dist/src/shared/services/element-resolver.service.d.ts +93 -0
- package/dist/src/shared/services/element-resolver.service.d.ts.map +1 -0
- package/dist/src/shared/services/element-resolver.service.js +378 -0
- package/dist/src/shared/services/element-resolver.service.js.map +1 -0
- package/dist/src/shared/services/form-detector.service.d.ts +119 -0
- package/dist/src/shared/services/form-detector.service.d.ts.map +1 -0
- package/dist/src/shared/services/form-detector.service.js +308 -0
- package/dist/src/shared/services/form-detector.service.js.map +1 -0
- package/dist/src/shared/services/index.d.ts +9 -0
- package/dist/src/shared/services/index.d.ts.map +1 -0
- package/dist/src/shared/services/index.js +9 -0
- package/dist/src/shared/services/index.js.map +1 -0
- package/dist/src/shared/services/logging.service.d.ts +145 -0
- package/dist/src/shared/services/logging.service.d.ts.map +1 -0
- package/dist/src/shared/services/logging.service.js +257 -0
- package/dist/src/shared/services/logging.service.js.map +1 -0
- package/dist/src/shared/services/selector-builder.service.d.ts +56 -0
- package/dist/src/shared/services/selector-builder.service.d.ts.map +1 -0
- package/dist/src/shared/services/selector-builder.service.js +232 -0
- package/dist/src/shared/services/selector-builder.service.js.map +1 -0
- package/dist/src/shared/services/visibility-checker.service.d.ts +55 -0
- package/dist/src/shared/services/visibility-checker.service.d.ts.map +1 -0
- package/dist/src/shared/services/visibility-checker.service.js +204 -0
- package/dist/src/shared/services/visibility-checker.service.js.map +1 -0
- package/dist/src/shared/types/base.types.d.ts +103 -0
- package/dist/src/shared/types/base.types.d.ts.map +1 -0
- package/dist/src/shared/types/base.types.js +5 -0
- package/dist/src/shared/types/base.types.js.map +1 -0
- package/dist/src/shared/types/index.d.ts +5 -0
- package/dist/src/shared/types/index.d.ts.map +1 -0
- package/dist/src/shared/types/index.js +5 -0
- package/dist/src/shared/types/index.js.map +1 -0
- package/dist/tests/mocks/cdp-bridge.mock.d.ts +45 -0
- package/dist/tests/mocks/cdp-bridge.mock.d.ts.map +1 -0
- package/dist/tests/mocks/cdp-bridge.mock.js +126 -0
- package/dist/tests/mocks/cdp-bridge.mock.js.map +1 -0
- package/dist/tests/unit/shared/dom-transformer.service.test.d.ts +5 -0
- package/dist/tests/unit/shared/dom-transformer.service.test.d.ts.map +1 -0
- package/dist/tests/unit/shared/dom-transformer.service.test.js +273 -0
- package/dist/tests/unit/shared/dom-transformer.service.test.js.map +1 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +15 -0
- package/dist/vitest.config.js.map +1 -0
- 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
|
+
[](https://github.com/lespaceman/athena-browser-mcp/actions/workflows/ci.yml)
|
|
4
|
+
[](https://www.npmjs.com/package/athena-browser-mcp)
|
|
5
|
+
[](https://codecov.io/gh/lespaceman/athena-browser-mcp)
|
|
6
|
+
[](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"}
|