@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.
Files changed (106) hide show
  1. package/README.md +213 -0
  2. package/dist/browser.d.ts +3 -0
  3. package/dist/browser.d.ts.map +1 -0
  4. package/dist/browser.js +20 -0
  5. package/dist/browser.js.map +1 -0
  6. package/dist/browser.min.js +2 -0
  7. package/dist/browser.min.js.map +1 -0
  8. package/dist/client/devtools.d.ts +28 -0
  9. package/dist/client/devtools.d.ts.map +1 -0
  10. package/dist/client/devtools.js +347 -0
  11. package/dist/client/devtools.js.map +1 -0
  12. package/dist/client/index.d.ts +47 -0
  13. package/dist/client/index.d.ts.map +1 -0
  14. package/dist/client/index.js +655 -0
  15. package/dist/client/index.js.map +1 -0
  16. package/dist/index.d.ts +7 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.esm.js +15 -0
  19. package/dist/index.esm.js.map +1 -0
  20. package/dist/index.js +18 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/middleware/index.d.ts +30 -0
  23. package/dist/middleware/index.d.ts.map +1 -0
  24. package/dist/middleware/index.js +323 -0
  25. package/dist/middleware/index.js.map +1 -0
  26. package/dist/middleware/mcp-server.d.ts +19 -0
  27. package/dist/middleware/mcp-server.d.ts.map +1 -0
  28. package/dist/middleware/mcp-server.js +149 -0
  29. package/dist/middleware/mcp-server.js.map +1 -0
  30. package/dist/middleware/mcp-socket-server.d.ts +29 -0
  31. package/dist/middleware/mcp-socket-server.d.ts.map +1 -0
  32. package/dist/middleware/mcp-socket-server.js +315 -0
  33. package/dist/middleware/mcp-socket-server.js.map +1 -0
  34. package/dist/middleware/mcp-sse-server.d.ts +26 -0
  35. package/dist/middleware/mcp-sse-server.d.ts.map +1 -0
  36. package/dist/middleware/mcp-sse-server.js +258 -0
  37. package/dist/middleware/mcp-sse-server.js.map +1 -0
  38. package/dist/middleware/tools/capture.d.ts +3 -0
  39. package/dist/middleware/tools/capture.d.ts.map +1 -0
  40. package/dist/middleware/tools/capture.js +54 -0
  41. package/dist/middleware/tools/capture.js.map +1 -0
  42. package/dist/middleware/tools/diagnostic.d.ts +3 -0
  43. package/dist/middleware/tools/diagnostic.d.ts.map +1 -0
  44. package/dist/middleware/tools/diagnostic.js +62 -0
  45. package/dist/middleware/tools/diagnostic.js.map +1 -0
  46. package/dist/middleware/tools/dom.d.ts +3 -0
  47. package/dist/middleware/tools/dom.d.ts.map +1 -0
  48. package/dist/middleware/tools/dom.js +84 -0
  49. package/dist/middleware/tools/dom.js.map +1 -0
  50. package/dist/middleware/tools/execute.d.ts +3 -0
  51. package/dist/middleware/tools/execute.d.ts.map +1 -0
  52. package/dist/middleware/tools/execute.js +30 -0
  53. package/dist/middleware/tools/execute.js.map +1 -0
  54. package/dist/middleware/tools/index.d.ts +3 -0
  55. package/dist/middleware/tools/index.d.ts.map +1 -0
  56. package/dist/middleware/tools/index.js +20 -0
  57. package/dist/middleware/tools/index.js.map +1 -0
  58. package/dist/middleware/tools/interaction.d.ts +3 -0
  59. package/dist/middleware/tools/interaction.d.ts.map +1 -0
  60. package/dist/middleware/tools/interaction.js +87 -0
  61. package/dist/middleware/tools/interaction.js.map +1 -0
  62. package/dist/middleware/tools/state.d.ts +3 -0
  63. package/dist/middleware/tools/state.d.ts.map +1 -0
  64. package/dist/middleware/tools/state.js +71 -0
  65. package/dist/middleware/tools/state.js.map +1 -0
  66. package/dist/middleware/types.d.ts +32 -0
  67. package/dist/middleware/types.d.ts.map +1 -0
  68. package/dist/middleware/types.js +3 -0
  69. package/dist/middleware/types.js.map +1 -0
  70. package/dist/server/cli.d.ts +3 -0
  71. package/dist/server/cli.d.ts.map +1 -0
  72. package/dist/server/cli.js +32 -0
  73. package/dist/server/cli.js.map +1 -0
  74. package/dist/server/index.d.ts +17 -0
  75. package/dist/server/index.d.ts.map +1 -0
  76. package/dist/server/index.js +136 -0
  77. package/dist/server/index.js.map +1 -0
  78. package/dist/server/tools/capture.d.ts +3 -0
  79. package/dist/server/tools/capture.d.ts.map +1 -0
  80. package/dist/server/tools/capture.js +46 -0
  81. package/dist/server/tools/capture.js.map +1 -0
  82. package/dist/server/tools/dom.d.ts +3 -0
  83. package/dist/server/tools/dom.d.ts.map +1 -0
  84. package/dist/server/tools/dom.js +84 -0
  85. package/dist/server/tools/dom.js.map +1 -0
  86. package/dist/server/tools/index.d.ts +3 -0
  87. package/dist/server/tools/index.d.ts.map +1 -0
  88. package/dist/server/tools/index.js +16 -0
  89. package/dist/server/tools/index.js.map +1 -0
  90. package/dist/server/tools/interaction.d.ts +3 -0
  91. package/dist/server/tools/interaction.d.ts.map +1 -0
  92. package/dist/server/tools/interaction.js +87 -0
  93. package/dist/server/tools/interaction.js.map +1 -0
  94. package/dist/server/tools/state.d.ts +3 -0
  95. package/dist/server/tools/state.d.ts.map +1 -0
  96. package/dist/server/tools/state.js +63 -0
  97. package/dist/server/tools/state.js.map +1 -0
  98. package/dist/server/types.d.ts +32 -0
  99. package/dist/server/types.d.ts.map +1 -0
  100. package/dist/server/types.js +3 -0
  101. package/dist/server/types.js.map +1 -0
  102. package/dist/server/websocket-manager.d.ts +17 -0
  103. package/dist/server/websocket-manager.d.ts.map +1 -0
  104. package/dist/server/websocket-manager.js +67 -0
  105. package/dist/server/websocket-manager.js.map +1 -0
  106. 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,3 @@
1
+ import WebAppMCPClient from './client/index';
2
+ export { WebAppMCPClient };
3
+ //# sourceMappingURL=browser.d.ts.map
@@ -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"}
@@ -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"}