@cgaspard/webappmcp 0.1.0
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/README.md +213 -0
- package/dist/browser.d.ts +3 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +20 -0
- package/dist/browser.js.map +1 -0
- package/dist/browser.min.js +2 -0
- package/dist/browser.min.js.map +1 -0
- package/dist/client/devtools.d.ts +28 -0
- package/dist/client/devtools.d.ts.map +1 -0
- package/dist/client/devtools.js +347 -0
- package/dist/client/devtools.js.map +1 -0
- package/dist/client/index.d.ts +47 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +655 -0
- package/dist/client/index.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.esm.js +15 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/index.d.ts +30 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +323 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/mcp-server.d.ts +19 -0
- package/dist/middleware/mcp-server.d.ts.map +1 -0
- package/dist/middleware/mcp-server.js +149 -0
- package/dist/middleware/mcp-server.js.map +1 -0
- package/dist/middleware/mcp-socket-server.d.ts +29 -0
- package/dist/middleware/mcp-socket-server.d.ts.map +1 -0
- package/dist/middleware/mcp-socket-server.js +315 -0
- package/dist/middleware/mcp-socket-server.js.map +1 -0
- package/dist/middleware/mcp-sse-server.d.ts +26 -0
- package/dist/middleware/mcp-sse-server.d.ts.map +1 -0
- package/dist/middleware/mcp-sse-server.js +258 -0
- package/dist/middleware/mcp-sse-server.js.map +1 -0
- package/dist/middleware/tools/capture.d.ts +3 -0
- package/dist/middleware/tools/capture.d.ts.map +1 -0
- package/dist/middleware/tools/capture.js +54 -0
- package/dist/middleware/tools/capture.js.map +1 -0
- package/dist/middleware/tools/diagnostic.d.ts +3 -0
- package/dist/middleware/tools/diagnostic.d.ts.map +1 -0
- package/dist/middleware/tools/diagnostic.js +62 -0
- package/dist/middleware/tools/diagnostic.js.map +1 -0
- package/dist/middleware/tools/dom.d.ts +3 -0
- package/dist/middleware/tools/dom.d.ts.map +1 -0
- package/dist/middleware/tools/dom.js +84 -0
- package/dist/middleware/tools/dom.js.map +1 -0
- package/dist/middleware/tools/execute.d.ts +3 -0
- package/dist/middleware/tools/execute.d.ts.map +1 -0
- package/dist/middleware/tools/execute.js +30 -0
- package/dist/middleware/tools/execute.js.map +1 -0
- package/dist/middleware/tools/index.d.ts +3 -0
- package/dist/middleware/tools/index.d.ts.map +1 -0
- package/dist/middleware/tools/index.js +20 -0
- package/dist/middleware/tools/index.js.map +1 -0
- package/dist/middleware/tools/interaction.d.ts +3 -0
- package/dist/middleware/tools/interaction.d.ts.map +1 -0
- package/dist/middleware/tools/interaction.js +87 -0
- package/dist/middleware/tools/interaction.js.map +1 -0
- package/dist/middleware/tools/state.d.ts +3 -0
- package/dist/middleware/tools/state.d.ts.map +1 -0
- package/dist/middleware/tools/state.js +71 -0
- package/dist/middleware/tools/state.js.map +1 -0
- package/dist/middleware/types.d.ts +32 -0
- package/dist/middleware/types.d.ts.map +1 -0
- package/dist/middleware/types.js +3 -0
- package/dist/middleware/types.js.map +1 -0
- package/dist/server/cli.d.ts +3 -0
- package/dist/server/cli.d.ts.map +1 -0
- package/dist/server/cli.js +32 -0
- package/dist/server/cli.js.map +1 -0
- package/dist/server/index.d.ts +17 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +136 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/tools/capture.d.ts +3 -0
- package/dist/server/tools/capture.d.ts.map +1 -0
- package/dist/server/tools/capture.js +46 -0
- package/dist/server/tools/capture.js.map +1 -0
- package/dist/server/tools/dom.d.ts +3 -0
- package/dist/server/tools/dom.d.ts.map +1 -0
- package/dist/server/tools/dom.js +84 -0
- package/dist/server/tools/dom.js.map +1 -0
- package/dist/server/tools/index.d.ts +3 -0
- package/dist/server/tools/index.d.ts.map +1 -0
- package/dist/server/tools/index.js +16 -0
- package/dist/server/tools/index.js.map +1 -0
- package/dist/server/tools/interaction.d.ts +3 -0
- package/dist/server/tools/interaction.d.ts.map +1 -0
- package/dist/server/tools/interaction.js +87 -0
- package/dist/server/tools/interaction.js.map +1 -0
- package/dist/server/tools/state.d.ts +3 -0
- package/dist/server/tools/state.d.ts.map +1 -0
- package/dist/server/tools/state.js +63 -0
- package/dist/server/tools/state.js.map +1 -0
- package/dist/server/types.d.ts +32 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +3 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server/websocket-manager.d.ts +17 -0
- package/dist/server/websocket-manager.d.ts.map +1 -0
- package/dist/server/websocket-manager.js +67 -0
- package/dist/server/websocket-manager.js.map +1 -0
- package/package.json +77 -0
package/README.md
ADDED
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
# @cgaspard/webappmcp
|
|
2
|
+
|
|
3
|
+
WebApp MCP (Model Context Protocol) - A comprehensive toolkit for enabling AI assistants to interact with web applications through DOM inspection, user interaction simulation, and state management.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @cgaspard/webappmcp
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
For global CLI usage:
|
|
12
|
+
```bash
|
|
13
|
+
npm install -g @cgaspard/webappmcp
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Quick Start
|
|
17
|
+
|
|
18
|
+
### Express Middleware
|
|
19
|
+
|
|
20
|
+
```javascript
|
|
21
|
+
import express from 'express';
|
|
22
|
+
import { webappMCP } from '@cgaspard/webappmcp';
|
|
23
|
+
|
|
24
|
+
const app = express();
|
|
25
|
+
|
|
26
|
+
// Add WebApp MCP middleware
|
|
27
|
+
app.use(webappMCP({
|
|
28
|
+
transport: 'sse',
|
|
29
|
+
mcpPort: 3100,
|
|
30
|
+
wsPort: 3101,
|
|
31
|
+
cors: {
|
|
32
|
+
origin: true,
|
|
33
|
+
credentials: true
|
|
34
|
+
}
|
|
35
|
+
}));
|
|
36
|
+
|
|
37
|
+
app.listen(3000, () => {
|
|
38
|
+
console.log('Server running on port 3000');
|
|
39
|
+
console.log('MCP SSE endpoint: http://localhost:3000/mcp/sse');
|
|
40
|
+
console.log('WebSocket server: ws://localhost:3101');
|
|
41
|
+
});
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Browser Client
|
|
45
|
+
|
|
46
|
+
#### ES Modules
|
|
47
|
+
```javascript
|
|
48
|
+
import { WebAppMCPClient } from '@cgaspard/webappmcp';
|
|
49
|
+
|
|
50
|
+
const client = new WebAppMCPClient({
|
|
51
|
+
serverUrl: 'ws://localhost:3101',
|
|
52
|
+
autoConnect: true
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
client.connect();
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
#### Script Tag
|
|
59
|
+
```html
|
|
60
|
+
<script src="https://unpkg.com/@cgaspard/webappmcp/dist/browser.min.js"></script>
|
|
61
|
+
<script>
|
|
62
|
+
const client = new WebAppMCP.WebAppMCPClient({
|
|
63
|
+
serverUrl: 'ws://localhost:3101',
|
|
64
|
+
autoConnect: true
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
client.connect();
|
|
68
|
+
</script>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Standalone Server
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# Run the standalone MCP server
|
|
75
|
+
webappmcp-server --port 3100 --ws-port 3101
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Features
|
|
79
|
+
|
|
80
|
+
### MCP Tools Available
|
|
81
|
+
|
|
82
|
+
- **DOM Operations**
|
|
83
|
+
- `dom_query` - Find elements using CSS selectors
|
|
84
|
+
- `dom_get_properties` - Get element properties and attributes
|
|
85
|
+
- `dom_get_text` - Extract text content
|
|
86
|
+
- `dom_get_html` - Get HTML structure
|
|
87
|
+
- `dom_manipulate` - Modify DOM elements
|
|
88
|
+
|
|
89
|
+
- **User Interactions**
|
|
90
|
+
- `interaction_click` - Click on elements
|
|
91
|
+
- `interaction_type` - Type text into inputs
|
|
92
|
+
- `interaction_scroll` - Scroll page or elements
|
|
93
|
+
- `interaction_hover` - Hover over elements
|
|
94
|
+
|
|
95
|
+
- **State Management**
|
|
96
|
+
- `state_get_variable` - Access JavaScript variables
|
|
97
|
+
- `state_local_storage` - Read/write localStorage
|
|
98
|
+
- `console_get_logs` - Retrieve console logs
|
|
99
|
+
|
|
100
|
+
- **Visual Capture**
|
|
101
|
+
- `capture_screenshot` - Take full page screenshots
|
|
102
|
+
- `capture_element_screenshot` - Capture specific elements
|
|
103
|
+
|
|
104
|
+
- **Diagnostic Tools**
|
|
105
|
+
- `webapp_list_clients` - List connected browser clients
|
|
106
|
+
- `javascript_inject` - Execute JavaScript code
|
|
107
|
+
- `execute_javascript` - Execute JavaScript with async support
|
|
108
|
+
|
|
109
|
+
## Framework Integration
|
|
110
|
+
|
|
111
|
+
### React
|
|
112
|
+
```jsx
|
|
113
|
+
import { useEffect } from 'react';
|
|
114
|
+
import { WebAppMCPClient } from '@cgaspard/webappmcp';
|
|
115
|
+
|
|
116
|
+
function App() {
|
|
117
|
+
useEffect(() => {
|
|
118
|
+
const client = new WebAppMCPClient({
|
|
119
|
+
serverUrl: 'ws://localhost:3101',
|
|
120
|
+
autoConnect: true
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
client.connect();
|
|
124
|
+
|
|
125
|
+
return () => client.disconnect();
|
|
126
|
+
}, []);
|
|
127
|
+
|
|
128
|
+
return <div>Your React App</div>;
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Vue
|
|
133
|
+
```javascript
|
|
134
|
+
import { WebAppMCPClient } from '@cgaspard/webappmcp';
|
|
135
|
+
|
|
136
|
+
export default {
|
|
137
|
+
mounted() {
|
|
138
|
+
this.mcpClient = new WebAppMCPClient({
|
|
139
|
+
serverUrl: 'ws://localhost:3101',
|
|
140
|
+
autoConnect: true
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
this.mcpClient.connect();
|
|
144
|
+
},
|
|
145
|
+
|
|
146
|
+
beforeUnmount() {
|
|
147
|
+
if (this.mcpClient) {
|
|
148
|
+
this.mcpClient.disconnect();
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Configuration
|
|
155
|
+
|
|
156
|
+
### Middleware Options
|
|
157
|
+
```javascript
|
|
158
|
+
{
|
|
159
|
+
transport: 'sse', // 'sse', 'stdio', 'socket', 'none'
|
|
160
|
+
mcpPort: 3100, // MCP server port
|
|
161
|
+
wsPort: 3101, // WebSocket server port
|
|
162
|
+
cors: { // CORS configuration
|
|
163
|
+
origin: true,
|
|
164
|
+
credentials: true
|
|
165
|
+
},
|
|
166
|
+
authentication: { // Optional auth
|
|
167
|
+
enabled: false,
|
|
168
|
+
token: 'your-token'
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Client Options
|
|
174
|
+
```javascript
|
|
175
|
+
{
|
|
176
|
+
serverUrl: 'ws://localhost:3101', // WebSocket URL
|
|
177
|
+
autoConnect: true, // Auto-connect on init
|
|
178
|
+
reconnect: true, // Auto-reconnect
|
|
179
|
+
reconnectInterval: 5000, // Reconnect interval (ms)
|
|
180
|
+
maxReconnectAttempts: 10, // Max reconnect attempts
|
|
181
|
+
enableDevTools: false, // Show DevTools overlay
|
|
182
|
+
debug: false // Enable debug logging
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## Claude CLI Configuration
|
|
187
|
+
|
|
188
|
+
Add to your Claude CLI configuration:
|
|
189
|
+
|
|
190
|
+
```json
|
|
191
|
+
{
|
|
192
|
+
"mcpServers": {
|
|
193
|
+
"webapp-sse": {
|
|
194
|
+
"transport": {
|
|
195
|
+
"type": "sse",
|
|
196
|
+
"url": "http://localhost:3000/mcp/sse"
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
## Examples
|
|
204
|
+
|
|
205
|
+
See the `examples` directory for complete working examples with:
|
|
206
|
+
- Basic Express integration
|
|
207
|
+
- Todo app with vanilla JavaScript
|
|
208
|
+
- React Todo app
|
|
209
|
+
- Vue.js Todo app
|
|
210
|
+
|
|
211
|
+
## License
|
|
212
|
+
|
|
213
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AACA,OAAO,eAAe,MAAM,gBAAgB,CAAC;AAG7C,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
package/dist/browser.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
(function (factory) {
|
|
2
|
+
typeof define === 'function' && define.amd ? define(factory) :
|
|
3
|
+
factory();
|
|
4
|
+
})((function () { 'use strict';
|
|
5
|
+
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.WebAppMCPClient = void 0;
|
|
8
|
+
const tslib_1 = require("tslib");
|
|
9
|
+
// Browser-only exports
|
|
10
|
+
const index_1 = tslib_1.__importDefault(require("./client/index"));
|
|
11
|
+
exports.WebAppMCPClient = index_1.default;
|
|
12
|
+
// Also attach to window for script tag usage
|
|
13
|
+
if (typeof window !== 'undefined') {
|
|
14
|
+
window.WebAppMCP = {
|
|
15
|
+
WebAppMCPClient: index_1.default
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
}));
|
|
20
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sources":["../src/browser.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;IAAA;IACA,MAAA,OAAA,GAAA,OAAA,CAAA,eAAA,CAAA,OAAA,CAAA,gBAAA,CAAA,CAAA;IAGS,OAAA,CAAA,eAAA,GAHF,eAAe;IAKtB;IACA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QAChC,MAAc,CAAC,SAAS,GAAG;IAC1B,QAAA,eAAe,EAAf,OAAA,CAAA;SACD;IACH;;;;;;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
!function(e){"function"==typeof define&&define.amd?define(e):e()}(function(){"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.WebAppMCPClient=void 0;const e=require("tslib").__importDefault(require("./client/index"));exports.WebAppMCPClient=e.default,"undefined"!=typeof window&&(window.WebAppMCP={WebAppMCPClient:e.default})});
|
|
2
|
+
//# sourceMappingURL=browser.min.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.min.js","sources":["../src/browser.ts"],"sourcesContent":[null],"names":["index_1","__importDefault","require","exports","WebAppMCPClient","window","WebAppMCP","default"],"mappings":"sLACAA,mBAAAC,gBAAAC,QAAA,mBAGSC,QAAAC,gBAHFJ,UAMe,oBAAXK,SACRA,OAAeC,UAAY,CAC1BF,gBAAAJ,EAAAO"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface MCPLog {
|
|
2
|
+
timestamp: string;
|
|
3
|
+
level: 'info' | 'warning' | 'error';
|
|
4
|
+
source: 'websocket' | 'mcp' | 'client';
|
|
5
|
+
message: string;
|
|
6
|
+
data?: any;
|
|
7
|
+
}
|
|
8
|
+
export declare class MCPDevTools {
|
|
9
|
+
private container;
|
|
10
|
+
private isExpanded;
|
|
11
|
+
private logs;
|
|
12
|
+
private maxLogs;
|
|
13
|
+
private connectionStatus;
|
|
14
|
+
constructor();
|
|
15
|
+
private createDevToolsUI;
|
|
16
|
+
private addStyles;
|
|
17
|
+
private setupEventListeners;
|
|
18
|
+
private togglePanel;
|
|
19
|
+
setConnectionStatus(status: 'connected' | 'connecting' | 'disconnected'): void;
|
|
20
|
+
addLog(level: 'info' | 'warning' | 'error', source: 'websocket' | 'mcp' | 'client', message: string, data?: any): void;
|
|
21
|
+
private renderLogs;
|
|
22
|
+
private safeStringify;
|
|
23
|
+
private clearLogs;
|
|
24
|
+
logWebSocketEvent(event: string, data?: any): void;
|
|
25
|
+
logMCPEvent(event: string, data?: any): void;
|
|
26
|
+
logError(source: 'websocket' | 'mcp' | 'client', message: string, error?: any): void;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=devtools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devtools.d.ts","sourceRoot":"","sources":["../../src/client/devtools.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACpC,MAAM,EAAE,WAAW,GAAG,KAAK,GAAG,QAAQ,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,OAAO,CAAO;IACtB,OAAO,CAAC,gBAAgB,CAA+D;;IAOvF,OAAO,CAAC,gBAAgB;IAuCxB,OAAO,CAAC,SAAS;IAsMjB,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,WAAW;IAQZ,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,YAAY,GAAG,cAAc;IAmBvE,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,KAAK,GAAG,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;IAkBtH,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,aAAa;IA2BrB,OAAO,CAAC,SAAS;IAKV,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;IAI3C,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;IAIrC,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,GAAG,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG;CAGrF"}
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MCPDevTools = void 0;
|
|
4
|
+
class MCPDevTools {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.container = null;
|
|
7
|
+
this.isExpanded = false;
|
|
8
|
+
this.logs = [];
|
|
9
|
+
this.maxLogs = 100;
|
|
10
|
+
this.connectionStatus = 'disconnected';
|
|
11
|
+
this.createDevToolsUI();
|
|
12
|
+
this.setupEventListeners();
|
|
13
|
+
}
|
|
14
|
+
createDevToolsUI() {
|
|
15
|
+
this.container = document.createElement('div');
|
|
16
|
+
this.container.id = 'mcp-devtools';
|
|
17
|
+
this.container.innerHTML = `
|
|
18
|
+
<div class="mcp-devtools-indicator" id="mcp-indicator">
|
|
19
|
+
<div class="mcp-status-dot" id="mcp-status-dot"></div>
|
|
20
|
+
<span class="mcp-label">MCP</span>
|
|
21
|
+
</div>
|
|
22
|
+
<div class="mcp-devtools-panel" id="mcp-panel" style="display: none;">
|
|
23
|
+
<div class="mcp-devtools-header">
|
|
24
|
+
<span>MCP DevTools</span>
|
|
25
|
+
<button class="mcp-close-btn" id="mcp-close-btn">×</button>
|
|
26
|
+
</div>
|
|
27
|
+
<div class="mcp-devtools-content">
|
|
28
|
+
<div class="mcp-status-section">
|
|
29
|
+
<div class="mcp-status-item">
|
|
30
|
+
<label>WebSocket:</label>
|
|
31
|
+
<span id="mcp-ws-status">Disconnected</span>
|
|
32
|
+
</div>
|
|
33
|
+
<div class="mcp-status-item">
|
|
34
|
+
<label>MCP Server:</label>
|
|
35
|
+
<span id="mcp-server-status">Disconnected</span>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
<div class="mcp-logs-section">
|
|
39
|
+
<div class="mcp-logs-header">
|
|
40
|
+
<span>Console Logs</span>
|
|
41
|
+
<button class="mcp-clear-btn" id="mcp-clear-btn">Clear</button>
|
|
42
|
+
</div>
|
|
43
|
+
<div class="mcp-logs-container" id="mcp-logs"></div>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
`;
|
|
48
|
+
this.addStyles();
|
|
49
|
+
document.body.appendChild(this.container);
|
|
50
|
+
}
|
|
51
|
+
addStyles() {
|
|
52
|
+
const style = document.createElement('style');
|
|
53
|
+
style.textContent = `
|
|
54
|
+
#mcp-devtools {
|
|
55
|
+
position: fixed;
|
|
56
|
+
bottom: 20px;
|
|
57
|
+
right: 20px;
|
|
58
|
+
z-index: 10000;
|
|
59
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.mcp-devtools-indicator {
|
|
63
|
+
cursor: pointer;
|
|
64
|
+
display: flex;
|
|
65
|
+
align-items: center;
|
|
66
|
+
gap: 4px;
|
|
67
|
+
padding: 4px 8px;
|
|
68
|
+
background: rgba(255, 255, 255, 0.9);
|
|
69
|
+
border-radius: 4px;
|
|
70
|
+
border: 1px solid rgba(0, 0, 0, 0.1);
|
|
71
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.mcp-label {
|
|
75
|
+
font-size: 10px;
|
|
76
|
+
font-weight: 600;
|
|
77
|
+
color: #495057;
|
|
78
|
+
user-select: none;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.mcp-status-dot {
|
|
82
|
+
width: 12px;
|
|
83
|
+
height: 12px;
|
|
84
|
+
border-radius: 50%;
|
|
85
|
+
background-color: #dc3545;
|
|
86
|
+
border: 2px solid rgba(255, 255, 255, 0.8);
|
|
87
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
|
|
88
|
+
transition: background-color 0.3s ease;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.mcp-status-dot.connecting {
|
|
92
|
+
background-color: #ffc107;
|
|
93
|
+
animation: pulse 1.5s infinite;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.mcp-status-dot.connected {
|
|
97
|
+
background-color: #28a745;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
@keyframes pulse {
|
|
101
|
+
0%, 100% { opacity: 1; }
|
|
102
|
+
50% { opacity: 0.5; }
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.mcp-devtools-panel {
|
|
106
|
+
position: absolute;
|
|
107
|
+
bottom: 30px;
|
|
108
|
+
right: 0;
|
|
109
|
+
width: 400px;
|
|
110
|
+
height: 300px;
|
|
111
|
+
background: white;
|
|
112
|
+
border: 1px solid #e0e0e0;
|
|
113
|
+
border-radius: 8px;
|
|
114
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
|
|
115
|
+
display: flex;
|
|
116
|
+
flex-direction: column;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.mcp-devtools-header {
|
|
120
|
+
padding: 12px 16px;
|
|
121
|
+
background: #f8f9fa;
|
|
122
|
+
border-bottom: 1px solid #e0e0e0;
|
|
123
|
+
border-radius: 8px 8px 0 0;
|
|
124
|
+
display: flex;
|
|
125
|
+
justify-content: space-between;
|
|
126
|
+
align-items: center;
|
|
127
|
+
font-weight: 600;
|
|
128
|
+
font-size: 14px;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.mcp-close-btn {
|
|
132
|
+
background: none;
|
|
133
|
+
border: none;
|
|
134
|
+
font-size: 18px;
|
|
135
|
+
cursor: pointer;
|
|
136
|
+
color: #6c757d;
|
|
137
|
+
padding: 0;
|
|
138
|
+
width: 20px;
|
|
139
|
+
height: 20px;
|
|
140
|
+
display: flex;
|
|
141
|
+
align-items: center;
|
|
142
|
+
justify-content: center;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.mcp-close-btn:hover {
|
|
146
|
+
color: #495057;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.mcp-devtools-content {
|
|
150
|
+
flex: 1;
|
|
151
|
+
display: flex;
|
|
152
|
+
flex-direction: column;
|
|
153
|
+
overflow: hidden;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.mcp-status-section {
|
|
157
|
+
padding: 12px 16px;
|
|
158
|
+
border-bottom: 1px solid #e0e0e0;
|
|
159
|
+
background: #f8f9fa;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.mcp-status-item {
|
|
163
|
+
display: flex;
|
|
164
|
+
justify-content: space-between;
|
|
165
|
+
margin-bottom: 4px;
|
|
166
|
+
font-size: 12px;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.mcp-status-item label {
|
|
170
|
+
font-weight: 500;
|
|
171
|
+
color: #495057;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
.mcp-status-item span {
|
|
175
|
+
color: #6c757d;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.mcp-logs-section {
|
|
179
|
+
flex: 1;
|
|
180
|
+
display: flex;
|
|
181
|
+
flex-direction: column;
|
|
182
|
+
overflow: hidden;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.mcp-logs-header {
|
|
186
|
+
padding: 8px 16px;
|
|
187
|
+
background: #f8f9fa;
|
|
188
|
+
border-bottom: 1px solid #e0e0e0;
|
|
189
|
+
display: flex;
|
|
190
|
+
justify-content: space-between;
|
|
191
|
+
align-items: center;
|
|
192
|
+
font-size: 12px;
|
|
193
|
+
font-weight: 500;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
.mcp-clear-btn {
|
|
197
|
+
background: none;
|
|
198
|
+
border: 1px solid #dee2e6;
|
|
199
|
+
border-radius: 4px;
|
|
200
|
+
padding: 2px 8px;
|
|
201
|
+
font-size: 11px;
|
|
202
|
+
cursor: pointer;
|
|
203
|
+
color: #6c757d;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.mcp-clear-btn:hover {
|
|
207
|
+
background: #e9ecef;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.mcp-logs-container {
|
|
211
|
+
flex: 1;
|
|
212
|
+
overflow-y: auto;
|
|
213
|
+
padding: 8px;
|
|
214
|
+
font-size: 11px;
|
|
215
|
+
font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
.mcp-log-entry {
|
|
219
|
+
margin-bottom: 4px;
|
|
220
|
+
padding: 4px 8px;
|
|
221
|
+
border-radius: 4px;
|
|
222
|
+
white-space: pre-wrap;
|
|
223
|
+
word-break: break-word;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
.mcp-log-entry.info {
|
|
227
|
+
background: #e7f3ff;
|
|
228
|
+
color: #0c5460;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
.mcp-log-entry.warning {
|
|
232
|
+
background: #fff3cd;
|
|
233
|
+
color: #856404;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
.mcp-log-entry.error {
|
|
237
|
+
background: #f8d7da;
|
|
238
|
+
color: #721c24;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
.mcp-log-timestamp {
|
|
242
|
+
color: #6c757d;
|
|
243
|
+
font-size: 10px;
|
|
244
|
+
}
|
|
245
|
+
`;
|
|
246
|
+
document.head.appendChild(style);
|
|
247
|
+
}
|
|
248
|
+
setupEventListeners() {
|
|
249
|
+
const indicator = this.container?.querySelector('#mcp-indicator');
|
|
250
|
+
const closeBtn = this.container?.querySelector('#mcp-close-btn');
|
|
251
|
+
const clearBtn = this.container?.querySelector('#mcp-clear-btn');
|
|
252
|
+
indicator?.addEventListener('click', () => this.togglePanel());
|
|
253
|
+
closeBtn?.addEventListener('click', () => this.togglePanel());
|
|
254
|
+
clearBtn?.addEventListener('click', () => this.clearLogs());
|
|
255
|
+
}
|
|
256
|
+
togglePanel() {
|
|
257
|
+
this.isExpanded = !this.isExpanded;
|
|
258
|
+
const panel = this.container?.querySelector('#mcp-panel');
|
|
259
|
+
if (panel) {
|
|
260
|
+
panel.style.display = this.isExpanded ? 'flex' : 'none';
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
setConnectionStatus(status) {
|
|
264
|
+
this.connectionStatus = status;
|
|
265
|
+
const dot = this.container?.querySelector('#mcp-status-dot');
|
|
266
|
+
const wsStatus = this.container?.querySelector('#mcp-ws-status');
|
|
267
|
+
const serverStatus = this.container?.querySelector('#mcp-server-status');
|
|
268
|
+
if (dot) {
|
|
269
|
+
dot.className = `mcp-status-dot ${status}`;
|
|
270
|
+
}
|
|
271
|
+
if (wsStatus && serverStatus) {
|
|
272
|
+
const statusText = status.charAt(0).toUpperCase() + status.slice(1);
|
|
273
|
+
wsStatus.textContent = statusText;
|
|
274
|
+
serverStatus.textContent = statusText;
|
|
275
|
+
}
|
|
276
|
+
this.addLog('info', 'client', `Connection status: ${status}`);
|
|
277
|
+
}
|
|
278
|
+
addLog(level, source, message, data) {
|
|
279
|
+
const log = {
|
|
280
|
+
timestamp: new Date().toISOString(),
|
|
281
|
+
level,
|
|
282
|
+
source,
|
|
283
|
+
message,
|
|
284
|
+
data
|
|
285
|
+
};
|
|
286
|
+
this.logs.push(log);
|
|
287
|
+
if (this.logs.length > this.maxLogs) {
|
|
288
|
+
this.logs = this.logs.slice(-this.maxLogs);
|
|
289
|
+
}
|
|
290
|
+
this.renderLogs();
|
|
291
|
+
}
|
|
292
|
+
renderLogs() {
|
|
293
|
+
const logsContainer = this.container?.querySelector('#mcp-logs');
|
|
294
|
+
if (!logsContainer)
|
|
295
|
+
return;
|
|
296
|
+
logsContainer.innerHTML = this.logs.map(log => {
|
|
297
|
+
const time = new Date(log.timestamp).toLocaleTimeString();
|
|
298
|
+
const dataStr = log.data ? ` ${this.safeStringify(log.data)}` : '';
|
|
299
|
+
return `
|
|
300
|
+
<div class="mcp-log-entry ${log.level}">
|
|
301
|
+
<span class="mcp-log-timestamp">[${time}]</span> [${log.source.toUpperCase()}] ${log.message}${dataStr}
|
|
302
|
+
</div>
|
|
303
|
+
`;
|
|
304
|
+
}).join('');
|
|
305
|
+
logsContainer.scrollTop = logsContainer.scrollHeight;
|
|
306
|
+
}
|
|
307
|
+
safeStringify(obj) {
|
|
308
|
+
try {
|
|
309
|
+
// Handle simple types
|
|
310
|
+
if (obj === null || obj === undefined) {
|
|
311
|
+
return String(obj);
|
|
312
|
+
}
|
|
313
|
+
if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean') {
|
|
314
|
+
return String(obj);
|
|
315
|
+
}
|
|
316
|
+
// Handle arrays and objects with circular reference protection
|
|
317
|
+
const seen = new Set();
|
|
318
|
+
return JSON.stringify(obj, (key, value) => {
|
|
319
|
+
if (typeof value === 'object' && value !== null) {
|
|
320
|
+
if (seen.has(value)) {
|
|
321
|
+
return '[Circular Reference]';
|
|
322
|
+
}
|
|
323
|
+
seen.add(value);
|
|
324
|
+
}
|
|
325
|
+
return value;
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
catch (error) {
|
|
329
|
+
return `[Error stringifying: ${error instanceof Error ? error.message : 'Unknown error'}]`;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
clearLogs() {
|
|
333
|
+
this.logs = [];
|
|
334
|
+
this.renderLogs();
|
|
335
|
+
}
|
|
336
|
+
logWebSocketEvent(event, data) {
|
|
337
|
+
this.addLog('info', 'websocket', event, data);
|
|
338
|
+
}
|
|
339
|
+
logMCPEvent(event, data) {
|
|
340
|
+
this.addLog('info', 'mcp', event, data);
|
|
341
|
+
}
|
|
342
|
+
logError(source, message, error) {
|
|
343
|
+
this.addLog('error', source, message, error);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
exports.MCPDevTools = MCPDevTools;
|
|
347
|
+
//# sourceMappingURL=devtools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devtools.js","sourceRoot":"","sources":["../../src/client/devtools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
interface WebAppMCPClientConfig {
|
|
2
|
+
serverUrl: string;
|
|
3
|
+
authToken?: string;
|
|
4
|
+
reconnectInterval?: number;
|
|
5
|
+
maxReconnectAttempts?: number;
|
|
6
|
+
enableDevTools?: boolean;
|
|
7
|
+
}
|
|
8
|
+
declare class WebAppMCPClient {
|
|
9
|
+
private ws;
|
|
10
|
+
private config;
|
|
11
|
+
private reconnectAttempts;
|
|
12
|
+
private reconnectTimer;
|
|
13
|
+
private messageHandlers;
|
|
14
|
+
private consoleLogs;
|
|
15
|
+
private _isConnected;
|
|
16
|
+
private devTools;
|
|
17
|
+
get isConnected(): boolean;
|
|
18
|
+
constructor(config: WebAppMCPClientConfig);
|
|
19
|
+
connect(): void;
|
|
20
|
+
disconnect(): void;
|
|
21
|
+
private setupWebSocketHandlers;
|
|
22
|
+
private scheduleReconnect;
|
|
23
|
+
private sendMessage;
|
|
24
|
+
private handleMessage;
|
|
25
|
+
private executeToolHandler;
|
|
26
|
+
private setupConsoleInterception;
|
|
27
|
+
private domQuery;
|
|
28
|
+
private domGetProperties;
|
|
29
|
+
private domGetText;
|
|
30
|
+
private domGetHTML;
|
|
31
|
+
private interactionClick;
|
|
32
|
+
private interactionType;
|
|
33
|
+
private interactionScroll;
|
|
34
|
+
private interactionHover;
|
|
35
|
+
private captureScreenshot;
|
|
36
|
+
private captureElementScreenshot;
|
|
37
|
+
private stateGetVariable;
|
|
38
|
+
private stateLocalStorage;
|
|
39
|
+
private consoleGetLogs;
|
|
40
|
+
private domManipulate;
|
|
41
|
+
private javascriptInject;
|
|
42
|
+
private webappListClients;
|
|
43
|
+
private executeJavascript;
|
|
44
|
+
}
|
|
45
|
+
export { WebAppMCPClient };
|
|
46
|
+
export default WebAppMCPClient;
|
|
47
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAEA,UAAU,qBAAqB;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,cAAM,eAAe;IACnB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,cAAc,CAAM;IAC5B,OAAO,CAAC,eAAe,CAA0C;IACjE,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAA4B;IAE5C,IAAI,WAAW,IAAI,OAAO,CAEzB;gBAEW,MAAM,EAAE,qBAAqB;IAezC,OAAO,IAAI,IAAI;IA+Bf,UAAU,IAAI,IAAI;IAYlB,OAAO,CAAC,sBAAsB;IAwC9B,OAAO,CAAC,iBAAiB;IAmBzB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,aAAa;YAuBP,kBAAkB;IAoFhC,OAAO,CAAC,wBAAwB;YAoClB,QAAQ;YAuBR,gBAAgB;YAoBhB,UAAU;YAeV,UAAU;YAaV,gBAAgB;YAmBhB,eAAe;YAoBf,iBAAiB;YA2BjB,gBAAgB;YA2BhB,iBAAiB;YA4CjB,wBAAwB;YA+CxB,gBAAgB;YAgBhB,iBAAiB;YA2BjB,cAAc;YAWd,aAAa;YA8Eb,gBAAgB;YA4BhB,iBAAiB;YAcjB,iBAAiB;CAqChC;AAGD,OAAO,EAAE,eAAe,EAAE,CAAC;AAG3B,eAAe,eAAe,CAAC"}
|