@sudu-cli/fronted-preview-mcp 1.0.0-beta.5 → 1.0.0-beta.6
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 +24 -0
- package/dist/handlers/click.d.ts +9 -0
- package/dist/handlers/click.js +93 -0
- package/dist/handlers/click.js.map +1 -0
- package/dist/handlers/fill.d.ts +10 -0
- package/dist/handlers/fill.js +129 -0
- package/dist/handlers/fill.js.map +1 -0
- package/dist/handlers/inspect.d.ts +11 -0
- package/dist/handlers/inspect.js +138 -0
- package/dist/handlers/inspect.js.map +1 -0
- package/dist/handlers/screenshot.d.ts +10 -0
- package/dist/handlers/screenshot.js +135 -0
- package/dist/handlers/screenshot.js.map +1 -0
- package/dist/index.js +215 -0
- package/dist/index.js.map +1 -1
- package/dist/navigate.d.ts +9 -0
- package/dist/navigate.js +78 -0
- package/dist/navigate.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -26,19 +26,43 @@ npx @sudu-cli/fronted-preview-mcp --help
|
|
|
26
26
|
|
|
27
27
|
| 工具 | 说明 |
|
|
28
28
|
|------|------|
|
|
29
|
+
| **项目管理** | |
|
|
29
30
|
| `quick_preview` | **推荐**。检测框架 + 启动 dev server,一步完成 |
|
|
30
31
|
| `get_project_info` | 仅检测项目框架信息 |
|
|
31
32
|
| `start_dev_server` | 仅启动 dev server |
|
|
32
33
|
| `stop_dev_server` | 停止 dev server |
|
|
34
|
+
| **浏览器自动化** | |
|
|
35
|
+
| `navigate` | 导航到指定URL,等待页面加载 |
|
|
36
|
+
| `click` | 点击页面元素(支持多种点击方式) |
|
|
37
|
+
| `fill` | 填充表单输入字段 |
|
|
38
|
+
| `screenshot` | 截图功能(支持全页面、元素截图) |
|
|
39
|
+
| `inspect` | 元素检查和分析(详细属性、样式、结构) |
|
|
40
|
+
| **错误检测** | |
|
|
41
|
+
| `check_page_errors` | 检查页面console错误和网络失败 |
|
|
42
|
+
| `get_typescript_diagnostics` | TypeScript类型错误检查 |
|
|
43
|
+
| `auto_fix_loop` | 自动检测和修复前端错误的迭代循环 |
|
|
33
44
|
|
|
34
45
|
### 推荐工作流
|
|
35
46
|
|
|
47
|
+
#### 基础预览工作流
|
|
36
48
|
调用 `quick_preview` 后,按顺序执行:
|
|
37
49
|
|
|
38
50
|
1. **chrome-devtools** `navigate_page(url)` — 打开页面
|
|
39
51
|
2. **chrome-devtools** `list_console_messages()` — 检查 console 错误
|
|
40
52
|
3. **chrome-devtools** `take_snapshot()` — 分析页面结构
|
|
41
53
|
|
|
54
|
+
#### 自动化测试工作流
|
|
55
|
+
1. **frontend-preview** `navigate(url)` — 导航到目标页面
|
|
56
|
+
2. **frontend-preview** `fill(selector, value)` — 填充表单
|
|
57
|
+
3. **frontend-preview** `click(selector)` — 点击按钮
|
|
58
|
+
4. **frontend-preview** `check_page_errors()` — 检查错误
|
|
59
|
+
5. **frontend-preview** `screenshot()` — 截图验证
|
|
60
|
+
|
|
61
|
+
#### 元素检查工作流
|
|
62
|
+
1. **frontend-preview** `navigate(url)` — 导航到页面
|
|
63
|
+
2. **frontend-preview** `inspect(selector)` — 检查元素详情
|
|
64
|
+
3. **frontend-preview** `screenshot(selector)` — 截取元素截图
|
|
65
|
+
|
|
42
66
|
## 配置
|
|
43
67
|
|
|
44
68
|
`npx @sudu-cli/fronted-preview-mcp init` 会生成:
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { MCPToolResponse } from '../types.js';
|
|
2
|
+
interface ClickArgs {
|
|
3
|
+
selector: string;
|
|
4
|
+
timeout?: number;
|
|
5
|
+
button?: 'left' | 'right' | 'middle';
|
|
6
|
+
clickCount?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function handleClick(args: ClickArgs): Promise<MCPToolResponse>;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { CDPConnectionManager } from '../cdp/connectionManager.js';
|
|
2
|
+
import { createMCPError, createMCPSuccess } from '../types.js';
|
|
3
|
+
export async function handleClick(args) {
|
|
4
|
+
const { selector, timeout = 5000, button = 'left', clickCount = 1 } = args;
|
|
5
|
+
const cdpManager = CDPConnectionManager.getInstance();
|
|
6
|
+
try {
|
|
7
|
+
// Connect to CDP if not already connected
|
|
8
|
+
const connection = await cdpManager.getConnection(9222);
|
|
9
|
+
// Wait for element to be available
|
|
10
|
+
const startTime = Date.now();
|
|
11
|
+
let elementFound = false;
|
|
12
|
+
while (Date.now() - startTime < timeout) {
|
|
13
|
+
const element = await connection.send('Runtime.evaluate', {
|
|
14
|
+
expression: `document.querySelector('${selector}')`
|
|
15
|
+
});
|
|
16
|
+
if (element.result && element.result.value && element.result.value !== null) {
|
|
17
|
+
elementFound = true;
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
await new Promise(resolve => setTimeout(resolve, 100, undefined));
|
|
21
|
+
}
|
|
22
|
+
if (!elementFound) {
|
|
23
|
+
return createMCPError('ELEMENT_NOT_FOUND', `Element not found with selector: ${selector}`);
|
|
24
|
+
}
|
|
25
|
+
// Get element info for debugging
|
|
26
|
+
const elementInfo = await connection.send('Runtime.evaluate', {
|
|
27
|
+
expression: `
|
|
28
|
+
const element = document.querySelector('${selector}');
|
|
29
|
+
const getXPath = (node) => {
|
|
30
|
+
if (node.id) return '//*[@id=\'' + node.id + '\']';
|
|
31
|
+
if (node === document.body) return '/html/body';
|
|
32
|
+
const siblings = node.parentNode ? node.parentNode.childNodes : [];
|
|
33
|
+
let idx = siblings.indexOf(node);
|
|
34
|
+
if (idx === -1) return '';
|
|
35
|
+
const tagName = node.tagName || '';
|
|
36
|
+
const path = getXPath(node.parentNode);
|
|
37
|
+
return path + '/' + tagName + '[' + (idx + 1) + ']';
|
|
38
|
+
};
|
|
39
|
+
{
|
|
40
|
+
tagName: element.tagName,
|
|
41
|
+
id: element.id,
|
|
42
|
+
classes: Array.from(element.classList),
|
|
43
|
+
text: element.textContent?.trim() || '',
|
|
44
|
+
xpath: getXPath(element)
|
|
45
|
+
}
|
|
46
|
+
`,
|
|
47
|
+
returnByValue: true
|
|
48
|
+
});
|
|
49
|
+
// Check if element is clickable
|
|
50
|
+
const clickableCheck = await connection.send('Runtime.evaluate', {
|
|
51
|
+
expression: `
|
|
52
|
+
const element = document.querySelector('${selector}');
|
|
53
|
+
const rect = element.getBoundingClientRect();
|
|
54
|
+
const isVisible = rect.width > 0 && rect.height > 0;
|
|
55
|
+
const isNotHidden = window.getComputedStyle(element).visibility !== 'hidden';
|
|
56
|
+
const isDisplayed = window.getComputedStyle(element).display !== 'none';
|
|
57
|
+
isVisible && isNotHidden && isDisplayed;
|
|
58
|
+
`
|
|
59
|
+
});
|
|
60
|
+
if (!clickableCheck.result.value) {
|
|
61
|
+
return createMCPError('ELEMENT_NOT_CLICKABLE', `Element found but not clickable: ${selector}`);
|
|
62
|
+
}
|
|
63
|
+
// Perform the click using Runtime.evaluate
|
|
64
|
+
await connection.send('Runtime.evaluate', {
|
|
65
|
+
expression: `
|
|
66
|
+
const element = document.querySelector('${selector}');
|
|
67
|
+
const event = new MouseEvent('click', {
|
|
68
|
+
view: window,
|
|
69
|
+
bubbles: true,
|
|
70
|
+
cancelable: true,
|
|
71
|
+
button: ${button === 'left' ? 0 : button === 'right' ? 2 : 1},
|
|
72
|
+
detail: ${clickCount}
|
|
73
|
+
});
|
|
74
|
+
element.dispatchEvent(event);
|
|
75
|
+
`
|
|
76
|
+
});
|
|
77
|
+
// Wait a bit for any potential page changes
|
|
78
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
79
|
+
const result = {
|
|
80
|
+
elementFound: true,
|
|
81
|
+
elementClickable: true,
|
|
82
|
+
clickSuccess: true,
|
|
83
|
+
elementInfo: elementInfo.result.value,
|
|
84
|
+
timestamp: new Date().toISOString()
|
|
85
|
+
};
|
|
86
|
+
return createMCPSuccess({ message: 'Element clicked successfully', ...result });
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
console.error('Click error:', error);
|
|
90
|
+
return createMCPError('CLICK_ERROR', `Failed to click element: ${error instanceof Error ? error.message : String(error)}`, undefined, 'Check if Chrome is running with --remote-debugging-port=9222');
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=click.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"click.js","sourceRoot":"","sources":["../../src/handlers/click.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { MCPToolResponse } from '../types.js';
|
|
2
|
+
interface FillArgs {
|
|
3
|
+
selector: string;
|
|
4
|
+
value: string;
|
|
5
|
+
timeout?: number;
|
|
6
|
+
clearFirst?: boolean;
|
|
7
|
+
delay?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function handleFill(args: FillArgs): Promise<MCPToolResponse>;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { CDPConnectionManager } from '../cdp/connectionManager.js';
|
|
2
|
+
import { createMCPError, createMCPSuccess } from '../types.js';
|
|
3
|
+
export async function handleFill(args) {
|
|
4
|
+
const { selector, value, timeout = 5000, clearFirst = true, delay = 100 } = args;
|
|
5
|
+
const cdpManager = CDPConnectionManager.getInstance();
|
|
6
|
+
try {
|
|
7
|
+
// Connect to CDP if not already connected
|
|
8
|
+
const connection = await cdpManager.getConnection(9222);
|
|
9
|
+
// Wait for element to be available
|
|
10
|
+
const startTime = Date.now();
|
|
11
|
+
let elementFound = false;
|
|
12
|
+
while (Date.now() - startTime < timeout) {
|
|
13
|
+
const element = await connection.send('Runtime.evaluate', {
|
|
14
|
+
expression: `document.querySelector('${selector}')`
|
|
15
|
+
});
|
|
16
|
+
if (element.result && element.result.value && element.result.value !== null) {
|
|
17
|
+
elementFound = true;
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
await new Promise(resolve => setTimeout(resolve, 100, undefined));
|
|
21
|
+
}
|
|
22
|
+
if (!elementFound) {
|
|
23
|
+
return createMCPError('ELEMENT_NOT_FOUND', `Element not found with selector: ${selector}`);
|
|
24
|
+
}
|
|
25
|
+
// Get element info for debugging
|
|
26
|
+
const elementInfo = await connection.send('Runtime.evaluate', {
|
|
27
|
+
expression: `
|
|
28
|
+
const element = document.querySelector('${selector}');
|
|
29
|
+
{
|
|
30
|
+
tagName: element.tagName,
|
|
31
|
+
type: element.type,
|
|
32
|
+
id: element.id,
|
|
33
|
+
name: element.name,
|
|
34
|
+
placeholder: element.placeholder || '',
|
|
35
|
+
isInput: element.tagName === 'INPUT' || element.tagName === 'TEXTAREA' || element.tagName === 'SELECT'
|
|
36
|
+
}
|
|
37
|
+
`,
|
|
38
|
+
returnByValue: true
|
|
39
|
+
});
|
|
40
|
+
const elementInfoData = elementInfo.result.value;
|
|
41
|
+
// Check if element is an input field
|
|
42
|
+
if (!elementInfoData.isInput) {
|
|
43
|
+
return createMCPError('ELEMENT_NOT_INPUT', `Element is not an input field: ${selector}`);
|
|
44
|
+
}
|
|
45
|
+
// Clear the field first if requested
|
|
46
|
+
if (clearFirst) {
|
|
47
|
+
await connection.send('Runtime.evaluate', {
|
|
48
|
+
expression: `
|
|
49
|
+
const element = document.querySelector('${selector}');
|
|
50
|
+
if (element.tagName === 'INPUT' || element.tagName === 'TEXTAREA') {
|
|
51
|
+
element.value = '';
|
|
52
|
+
} else if (element.tagName === 'SELECT') {
|
|
53
|
+
for (let i = 0; i < element.options.length; i++) {
|
|
54
|
+
element.options[i].selected = false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
`
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
// Set the value based on input type
|
|
61
|
+
if (elementInfoData.tagName === 'INPUT' || elementInfoData.tagName === 'TEXTAREA') {
|
|
62
|
+
await connection.send('Runtime.evaluate', {
|
|
63
|
+
expression: `
|
|
64
|
+
const element = document.querySelector('${selector}');
|
|
65
|
+
element.value = '${value.replace(/'/g, "\\'")}';
|
|
66
|
+
// Trigger input events to ensure React/Vue reactivity
|
|
67
|
+
element.dispatchEvent(new Event('input', { bubbles: true }));
|
|
68
|
+
element.dispatchEvent(new Event('change', { bubbles: true }));
|
|
69
|
+
`
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
else if (elementInfoData.tagName === 'SELECT') {
|
|
73
|
+
// Find option by value or text
|
|
74
|
+
await connection.send('Runtime.evaluate', {
|
|
75
|
+
expression: `
|
|
76
|
+
const element = document.querySelector('${selector}');
|
|
77
|
+
const options = element.options;
|
|
78
|
+
let found = false;
|
|
79
|
+
for (let i = 0; i < options.length; i++) {
|
|
80
|
+
if (options[i].value === '${value}' || options[i].textContent === '${value}') {
|
|
81
|
+
options[i].selected = true;
|
|
82
|
+
found = true;
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (found) {
|
|
87
|
+
element.dispatchEvent(new Event('change', { bubbles: true }));
|
|
88
|
+
}
|
|
89
|
+
`
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
// Add delay if specified
|
|
93
|
+
if (delay > 0) {
|
|
94
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
95
|
+
}
|
|
96
|
+
// Verify the value was set
|
|
97
|
+
const verifyResult = await connection.send('Runtime.evaluate', {
|
|
98
|
+
expression: `
|
|
99
|
+
const element = document.querySelector('${selector}');
|
|
100
|
+
if (element.tagName === 'INPUT' || element.tagName === 'TEXTAREA') {
|
|
101
|
+
return element.value;
|
|
102
|
+
} else if (element.tagName === 'SELECT') {
|
|
103
|
+
const selected = element.options[element.selectedIndex];
|
|
104
|
+
return selected ? selected.value || selected.textContent : '';
|
|
105
|
+
}
|
|
106
|
+
return '';
|
|
107
|
+
`
|
|
108
|
+
});
|
|
109
|
+
const actualValue = verifyResult.result.value;
|
|
110
|
+
const valueSetCorrectly = actualValue === value;
|
|
111
|
+
const result = {
|
|
112
|
+
elementFound: true,
|
|
113
|
+
elementInputType: true,
|
|
114
|
+
fillSuccess: valueSetCorrectly,
|
|
115
|
+
elementInfo: elementInfoData,
|
|
116
|
+
timestamp: new Date().toISOString()
|
|
117
|
+
};
|
|
118
|
+
if (!valueSetCorrectly) {
|
|
119
|
+
result.fillSuccess = false;
|
|
120
|
+
return createMCPError('VALUE_SET_FAILED', `Value set but verification failed. Expected: ${value}, Actual: ${actualValue}`);
|
|
121
|
+
}
|
|
122
|
+
return createMCPSuccess({ message: 'Field filled successfully', ...result });
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
console.error('Fill error:', error);
|
|
126
|
+
return createMCPError('FILL_ERROR', `Failed to fill field: ${error instanceof Error ? error.message : String(error)}`, undefined, 'Check if Chrome is running with --remote-debugging-port=9222');
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=fill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fill.js","sourceRoot":"","sources":["../../src/handlers/fill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { MCPToolResponse } from '../types.js';
|
|
2
|
+
interface InspectArgs {
|
|
3
|
+
selector: string;
|
|
4
|
+
timeout?: number;
|
|
5
|
+
includeStyles?: boolean;
|
|
6
|
+
includeAttributes?: boolean;
|
|
7
|
+
includeChildren?: boolean;
|
|
8
|
+
maxDepth?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function handleInspect(args: InspectArgs): Promise<MCPToolResponse>;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { CDPConnectionManager } from '../cdp/connectionManager.js';
|
|
2
|
+
import { createMCPError, createMCPSuccess } from '../types.js';
|
|
3
|
+
export async function handleInspect(args) {
|
|
4
|
+
const { selector, timeout = 5000, includeStyles = true, includeAttributes = true, includeChildren = false, maxDepth = 2 } = args;
|
|
5
|
+
const cdpManager = CDPConnectionManager.getInstance();
|
|
6
|
+
try {
|
|
7
|
+
// Connect to CDP if not already connected
|
|
8
|
+
const connection = await cdpManager.getConnection(9222);
|
|
9
|
+
// Wait for element to be available
|
|
10
|
+
const startTime = Date.now();
|
|
11
|
+
let elementFound = false;
|
|
12
|
+
while (Date.now() - startTime < timeout) {
|
|
13
|
+
const element = await connection.send('Runtime.evaluate', {
|
|
14
|
+
expression: `document.querySelector('${selector}')`
|
|
15
|
+
});
|
|
16
|
+
if (element.result && element.result.value && element.result.value !== null) {
|
|
17
|
+
elementFound = true;
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
await new Promise(resolve => setTimeout(resolve, 100, undefined));
|
|
21
|
+
}
|
|
22
|
+
if (!elementFound) {
|
|
23
|
+
return createMCPError('ELEMENT_NOT_FOUND', `Element not found with selector: ${selector}`);
|
|
24
|
+
}
|
|
25
|
+
// Get comprehensive element information
|
|
26
|
+
const elementInfo = await connection.send('Runtime.evaluate', {
|
|
27
|
+
expression: `
|
|
28
|
+
const element = document.querySelector('${selector}');
|
|
29
|
+
const getStyles = (el) => {
|
|
30
|
+
const computed = window.getComputedStyle(el);
|
|
31
|
+
const styles = {};
|
|
32
|
+
for (let i = 0; i < computed.length; i++) {
|
|
33
|
+
const prop = computed[i];
|
|
34
|
+
styles[prop] = computed.getPropertyValue(prop);
|
|
35
|
+
}
|
|
36
|
+
return styles;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const getAttributes = (el) => {
|
|
40
|
+
const attrs = {};
|
|
41
|
+
for (let i = 0; i < el.attributes.length; i++) {
|
|
42
|
+
const attr = el.attributes[i];
|
|
43
|
+
attrs[attr.name] = attr.value;
|
|
44
|
+
}
|
|
45
|
+
return attrs;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const getChildren = (el, depth, maxDepth) => {
|
|
49
|
+
if (depth >= maxDepth) return [];
|
|
50
|
+
const children = [];
|
|
51
|
+
for (let i = 0; i < el.children.length; i++) {
|
|
52
|
+
const child = el.children[i];
|
|
53
|
+
children.push({
|
|
54
|
+
tagName: child.tagName,
|
|
55
|
+
id: child.id,
|
|
56
|
+
classes: Array.from(child.classList),
|
|
57
|
+
text: child.textContent?.trim() || '',
|
|
58
|
+
value: child.value,
|
|
59
|
+
type: child.type,
|
|
60
|
+
name: child.name,
|
|
61
|
+
boundingRect: child.getBoundingClientRect(),
|
|
62
|
+
children: getChildren(child, depth + 1, maxDepth)
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return children;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const getXPath = (node) => {
|
|
69
|
+
if (node.id) return '//*[@id=\'' + node.id + '\']';
|
|
70
|
+
if (node === document.body) return '/html/body';
|
|
71
|
+
const siblings = node.parentNode ? node.parentNode.childNodes : [];
|
|
72
|
+
let idx = siblings.indexOf(node);
|
|
73
|
+
if (idx === -1) return '';
|
|
74
|
+
const tagName = node.tagName || '';
|
|
75
|
+
const path = getXPath(node.parentNode);
|
|
76
|
+
return path + '/' + tagName + '[' + (idx + 1) + ']';
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const getCssPath = (node) => {
|
|
80
|
+
if (node.id) return '#' + node.id;
|
|
81
|
+
if (node.className) {
|
|
82
|
+
const classes = node.className.split(' ').join('.');
|
|
83
|
+
return node.tagName.toLowerCase() + '.' + classes;
|
|
84
|
+
}
|
|
85
|
+
const siblings = node.parentNode ? node.parentNode.children : [];
|
|
86
|
+
let idx = Array.from(siblings).indexOf(node);
|
|
87
|
+
if (idx === -1) return node.tagName.toLowerCase();
|
|
88
|
+
return node.tagName.toLowerCase() + ':nth-child(' + (idx + 1) + ')';
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
const rect = element.getBoundingClientRect();
|
|
92
|
+
|
|
93
|
+
{
|
|
94
|
+
tagName: element.tagName,
|
|
95
|
+
id: element.id,
|
|
96
|
+
classes: Array.from(element.classList),
|
|
97
|
+
text: element.textContent?.trim() || '',
|
|
98
|
+
value: element.value,
|
|
99
|
+
type: element.type,
|
|
100
|
+
name: element.name,
|
|
101
|
+
placeholder: element.placeholder || '',
|
|
102
|
+
src: element.src,
|
|
103
|
+
href: element.href,
|
|
104
|
+
disabled: element.disabled,
|
|
105
|
+
readonly: element.readOnly,
|
|
106
|
+
required: element.required,
|
|
107
|
+
checked: element.checked,
|
|
108
|
+
selected: element.selected,
|
|
109
|
+
visible: rect.width > 0 && rect.height > 0,
|
|
110
|
+
boundingRect: {
|
|
111
|
+
x: rect.left,
|
|
112
|
+
y: rect.top,
|
|
113
|
+
width: rect.width,
|
|
114
|
+
height: rect.height
|
|
115
|
+
},
|
|
116
|
+
${includeStyles ? 'styles: getStyles(element),' : ''}
|
|
117
|
+
${includeAttributes ? 'attributes: getAttributes(element),' : ''}
|
|
118
|
+
${includeChildren ? 'children: getChildren(element, 0, ${maxDepth}),' : ''}
|
|
119
|
+
xpath: getXPath(element),
|
|
120
|
+
cssPath: getCssPath(element)
|
|
121
|
+
}
|
|
122
|
+
`,
|
|
123
|
+
returnByValue: true
|
|
124
|
+
});
|
|
125
|
+
const elementInfoData = elementInfo.result.value;
|
|
126
|
+
const result = {
|
|
127
|
+
elementFound: true,
|
|
128
|
+
elementInfo: elementInfoData,
|
|
129
|
+
timestamp: new Date().toISOString()
|
|
130
|
+
};
|
|
131
|
+
return createMCPSuccess({ message: 'Element inspection completed successfully', ...result });
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
console.error('Element inspection error:', error);
|
|
135
|
+
return createMCPError('INSPECTION_ERROR', `Failed to inspect element: ${error instanceof Error ? error.message : String(error)}`, undefined, 'Check if Chrome is running with --remote-debugging-port=9222');
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=inspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/handlers/inspect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAgD/D,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAiB;IACnD,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,EAAE,aAAa,GAAG,IAAI,EAAE,iBAAiB,GAAG,IAAI,EAAE,eAAe,GAAG,KAAK,EAAE,QAAQ,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC;IAEjI,MAAM,UAAU,GAAG,oBAAoB,CAAC,WAAW,EAAE,CAAC;IAEtD,IAAI,CAAC;QACH,0CAA0C;QAC1C,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAExD,mCAAmC;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,YAAY,GAAG,KAAK,CAAC;QAEzB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,CAAC;YACxC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBACxD,UAAU,EAAE,2BAA2B,QAAQ,IAAI;aACpD,CAAC,CAAC;YAEH,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC5E,YAAY,GAAG,IAAI,CAAC;gBACpB,MAAM;YACR,CAAC;YAED,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,cAAc,CAAC,mBAAmB,EAAE,oCAAoC,QAAQ,EAAE,CAAC,CAAC;QAC7F,CAAC;QAED,wCAAwC;QACxC,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,kBAAkB,EAAE;YAC5D,UAAU,EAAE;kDACgC,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAwF9C,aAAa,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE;YAClD,iBAAiB,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,EAAE;YAC9D,eAAe,CAAC,CAAC,CAAC,iDAAiD,CAAC,CAAC,CAAC,EAAE;;;;OAI7E;YACD,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;QAEH,MAAM,eAAe,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;QAEjD,MAAM,MAAM,GAAkB;YAC5B,YAAY,EAAE,IAAI;YAClB,WAAW,EAAE,eAAe;YAC5B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,OAAO,gBAAgB,CAAC,EAAE,OAAO,EAAE,2CAA2C,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAE/F,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QAClD,OAAO,cAAc,CAAC,kBAAkB,EAAE,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,8DAA8D,CAAC,CAAC;IAC/M,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { MCPToolResponse } from '../types.js';
|
|
2
|
+
interface ScreenshotArgs {
|
|
3
|
+
selector?: string;
|
|
4
|
+
format?: 'png' | 'jpeg' | 'webp';
|
|
5
|
+
quality?: number;
|
|
6
|
+
fullPage?: boolean;
|
|
7
|
+
timeout?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function handleScreenshot(args: ScreenshotArgs): Promise<MCPToolResponse>;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { CDPConnectionManager } from '../cdp/connectionManager.js';
|
|
2
|
+
import { createMCPError, createMCPSuccess } from '../types.js';
|
|
3
|
+
export async function handleScreenshot(args) {
|
|
4
|
+
const { selector, format = 'png', quality = 80, fullPage = false, timeout = 10000 } = args;
|
|
5
|
+
const cdpManager = CDPConnectionManager.getInstance();
|
|
6
|
+
try {
|
|
7
|
+
// Connect to CDP if not already connected
|
|
8
|
+
const connection = await cdpManager.getConnection(9222);
|
|
9
|
+
// Wait for page to be ready if selector is specified
|
|
10
|
+
if (selector) {
|
|
11
|
+
const selectorStartTime = Date.now();
|
|
12
|
+
while (Date.now() - selectorStartTime < timeout) {
|
|
13
|
+
const result = await connection.send('Runtime.evaluate', {
|
|
14
|
+
expression: `document.querySelector('${selector}') !== null`
|
|
15
|
+
});
|
|
16
|
+
if (result.result && result.result.value === true) {
|
|
17
|
+
break;
|
|
18
|
+
}
|
|
19
|
+
await new Promise(resolve => setTimeout(resolve, 100, undefined));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// Take screenshot based on parameters
|
|
23
|
+
const screenshotParams = {
|
|
24
|
+
format: format,
|
|
25
|
+
quality: quality
|
|
26
|
+
};
|
|
27
|
+
if (fullPage) {
|
|
28
|
+
const metrics = await connection.send('Page.getLayoutMetrics');
|
|
29
|
+
if (metrics && metrics.cssLayoutViewport) {
|
|
30
|
+
screenshotParams.width = Math.ceil(metrics.cssLayoutViewport.clientWidth);
|
|
31
|
+
screenshotParams.height = Math.ceil(metrics.cssLayoutViewport.clientHeight);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
let screenshotData;
|
|
35
|
+
let size;
|
|
36
|
+
if (selector) {
|
|
37
|
+
// Take screenshot of specific element
|
|
38
|
+
const elementInfo = await connection.send('Runtime.evaluate', {
|
|
39
|
+
expression: `
|
|
40
|
+
const element = document.querySelector('${selector}');
|
|
41
|
+
const rect = element.getBoundingClientRect();
|
|
42
|
+
{
|
|
43
|
+
x: rect.left,
|
|
44
|
+
y: rect.top,
|
|
45
|
+
width: rect.width,
|
|
46
|
+
height: rect.height,
|
|
47
|
+
scrollX: window.pageXOffset,
|
|
48
|
+
scrollY: window.pageYOffset
|
|
49
|
+
}
|
|
50
|
+
`,
|
|
51
|
+
returnByValue: true
|
|
52
|
+
});
|
|
53
|
+
const rect = elementInfo.result.value;
|
|
54
|
+
// Scroll to element if needed
|
|
55
|
+
await connection.send('Runtime.evaluate', {
|
|
56
|
+
expression: `
|
|
57
|
+
const element = document.querySelector('${selector}');
|
|
58
|
+
element.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' });
|
|
59
|
+
`
|
|
60
|
+
});
|
|
61
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
62
|
+
// Take screenshot of element
|
|
63
|
+
const screenshotResult = await connection.send('Page.captureScreenshot', {
|
|
64
|
+
...screenshotParams,
|
|
65
|
+
clip: {
|
|
66
|
+
x: rect.x,
|
|
67
|
+
y: rect.y,
|
|
68
|
+
width: rect.width,
|
|
69
|
+
height: rect.height,
|
|
70
|
+
scale: 1
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
screenshotData = screenshotResult.data;
|
|
74
|
+
size = {
|
|
75
|
+
width: rect.width,
|
|
76
|
+
height: rect.height
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// Take full page screenshot
|
|
81
|
+
const screenshotResult = await connection.send('Page.captureScreenshot', screenshotParams);
|
|
82
|
+
screenshotData = screenshotResult.data;
|
|
83
|
+
if (fullPage) {
|
|
84
|
+
// For full page, we need to get the actual dimensions
|
|
85
|
+
const metrics = await connection.send('Page.getLayoutMetrics');
|
|
86
|
+
if (metrics && metrics.cssLayoutViewport) {
|
|
87
|
+
size = {
|
|
88
|
+
width: Math.ceil(metrics.cssLayoutViewport.clientWidth),
|
|
89
|
+
height: Math.ceil(metrics.cssLayoutViewport.clientHeight)
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
size = {
|
|
94
|
+
width: 1920, // Default fallback
|
|
95
|
+
height: 1080 // Default fallback
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
// For viewport screenshot, we need to get viewport dimensions
|
|
101
|
+
const viewport = await connection.send('Page.getLayoutMetrics');
|
|
102
|
+
if (viewport && viewport.cssLayoutViewport) {
|
|
103
|
+
size = {
|
|
104
|
+
width: viewport.cssLayoutViewport.clientWidth,
|
|
105
|
+
height: viewport.cssLayoutViewport.clientHeight
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
size = {
|
|
110
|
+
width: 1920, // Default fallback
|
|
111
|
+
height: 1080 // Default fallback
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const result = {
|
|
117
|
+
screenshotSuccess: true,
|
|
118
|
+
format: format,
|
|
119
|
+
size: size,
|
|
120
|
+
selectorUsed: selector,
|
|
121
|
+
timestamp: new Date().toISOString()
|
|
122
|
+
};
|
|
123
|
+
// Return base64 encoded screenshot data
|
|
124
|
+
return createMCPSuccess({
|
|
125
|
+
message: 'Screenshot captured successfully',
|
|
126
|
+
...result,
|
|
127
|
+
data: screenshotData
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
console.error('Screenshot error:', error);
|
|
132
|
+
return createMCPError('SCREENSHOT_ERROR', `Failed to capture screenshot: ${error instanceof Error ? error.message : String(error)}`, undefined, 'Check if Chrome is running with --remote-debugging-port=9222');
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=screenshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../src/handlers/screenshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAsB/D,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAoB;IACzD,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC;IAE3F,MAAM,UAAU,GAAG,oBAAoB,CAAC,WAAW,EAAE,CAAC;IAEtD,IAAI,CAAC;QACH,0CAA0C;QAC1C,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAExD,qDAAqD;QACrD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAErC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,iBAAiB,GAAG,OAAO,EAAE,CAAC;gBAChD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,kBAAkB,EAAE;oBACvD,UAAU,EAAE,2BAA2B,QAAQ,aAAa;iBAC7D,CAAC,CAAC;gBAEH,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;oBAClD,MAAM;gBACR,CAAC;gBAED,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;QAED,sCAAsC;QACtC,MAAM,gBAAgB,GAAQ;YAC5B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,OAAO;SACjB,CAAC;QAEF,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAC/D,IAAI,OAAO,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;gBACzC,gBAAgB,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;gBAC1E,gBAAgB,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;QAED,IAAI,cAAmB,CAAC;QACxB,IAAI,IAAuC,CAAC;QAE5C,IAAI,QAAQ,EAAE,CAAC;YACb,sCAAsC;YACtC,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBAC5D,UAAU,EAAE;oDACgC,QAAQ;;;;;;;;;;SAUnD;gBACD,aAAa,EAAE,IAAI;aACpB,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;YAEtC,8BAA8B;YAC9B,MAAM,UAAU,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBACxC,UAAU,EAAE;oDACgC,QAAQ;;SAEnD;aACF,CAAC,CAAC;YAEH,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAEvD,6BAA6B;YAC7B,MAAM,gBAAgB,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,wBAAwB,EAAE;gBACvE,GAAG,gBAAgB;gBACnB,IAAI,EAAE;oBACJ,CAAC,EAAE,IAAI,CAAC,CAAC;oBACT,CAAC,EAAE,IAAI,CAAC,CAAC;oBACT,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,KAAK,EAAE,CAAC;iBACT;aACF,CAAC,CAAC;YACH,cAAc,GAAI,gBAAwB,CAAC,IAAI,CAAC;YAEhD,IAAI,GAAG;gBACL,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,4BAA4B;YAC5B,MAAM,gBAAgB,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,wBAAwB,EAAE,gBAAgB,CAAC,CAAC;YAC3F,cAAc,GAAI,gBAAwB,CAAC,IAAI,CAAC;YAEhD,IAAI,QAAQ,EAAE,CAAC;gBACrB,sDAAsD;gBAChD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;gBAC/D,IAAI,OAAO,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;oBACzC,IAAI,GAAG;wBACL,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,WAAW,CAAC;wBACvD,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC;qBAC1D,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,IAAI,GAAG;wBACL,KAAK,EAAE,IAAI,EAAE,mBAAmB;wBAChC,MAAM,EAAE,IAAI,CAAC,mBAAmB;qBACjC,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,8DAA8D;gBAC9D,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;gBAChE,IAAI,QAAQ,IAAI,QAAQ,CAAC,iBAAiB,EAAE,CAAC;oBAC3C,IAAI,GAAG;wBACL,KAAK,EAAE,QAAQ,CAAC,iBAAiB,CAAC,WAAW;wBAC7C,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,YAAY;qBAChD,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,IAAI,GAAG;wBACL,KAAK,EAAE,IAAI,EAAE,mBAAmB;wBAChC,MAAM,EAAE,IAAI,CAAC,mBAAmB;qBACjC,CAAC;gBACJ,CAAC;YACH,CAAC;QACD,CAAC;QAED,MAAM,MAAM,GAAqB;YAC/B,iBAAiB,EAAE,IAAI;YACvB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,QAAQ;YACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,wCAAwC;QACxC,OAAO,gBAAgB,CAAC;YACtB,OAAO,EAAE,kCAAkC;YAC3C,GAAG,MAAM;YACT,IAAI,EAAE,cAAc;SACrB,CAAC,CAAC;IAEL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;QAC1C,OAAO,cAAc,CAAC,kBAAkB,EAAE,iCAAiC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,8DAA8D,CAAC,CAAC;IAClN,CAAC;AACH,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -10,6 +10,11 @@ import { handleQuickPreview } from './handlers/quickPreview.js';
|
|
|
10
10
|
import { handleCheckPageErrors } from './handlers/checkPageErrors.js';
|
|
11
11
|
import { handleGetTypeScriptDiagnostics } from './handlers/typescriptDiagnostics.js';
|
|
12
12
|
import { handleAutoFixLoop } from './handlers/autoFixLoop.js';
|
|
13
|
+
import { handleClick } from './handlers/click.js';
|
|
14
|
+
import { handleFill } from './handlers/fill.js';
|
|
15
|
+
import { handleNavigate } from './navigate.js';
|
|
16
|
+
import { handleScreenshot } from './handlers/screenshot.js';
|
|
17
|
+
import { handleInspect } from './handlers/inspect.js';
|
|
13
18
|
const server = new McpServer({
|
|
14
19
|
name: 'frontend-preview',
|
|
15
20
|
version: '1.0.0',
|
|
@@ -287,6 +292,216 @@ server.tool('auto_fix_loop', 'Automatically detect and fix frontend errors in an
|
|
|
287
292
|
return { content };
|
|
288
293
|
});
|
|
289
294
|
// ============================================================
|
|
295
|
+
// Tool: click
|
|
296
|
+
// ============================================================
|
|
297
|
+
server.tool('click', 'Click on a page element using CSS selector or XPath. ' +
|
|
298
|
+
'Supports left, right, and middle clicks with optional click count. ' +
|
|
299
|
+
'Waits for element to be available and clickable before performing the action.\n\n' +
|
|
300
|
+
'Returns { elementFound, elementClickable, clickSuccess, elementInfo, timestamp }.\n\n' +
|
|
301
|
+
'WHEN TO USE:\n' +
|
|
302
|
+
'- User wants to interact with page elements\n' +
|
|
303
|
+
'- Testing button clicks, link navigation\n' +
|
|
304
|
+
'- Automating form interactions\n\n' +
|
|
305
|
+
'PREREQUISITE:\n' +
|
|
306
|
+
'- Chrome must be running with --remote-debugging-port=9222\n' +
|
|
307
|
+
'- Page must be loaded before calling this tool\n\n' +
|
|
308
|
+
'AFTER THIS TOOL:\n' +
|
|
309
|
+
'- Check elementInfo for clicked element details\n' +
|
|
310
|
+
'- Use take_snapshot to verify page state after click', {
|
|
311
|
+
selector: z
|
|
312
|
+
.string()
|
|
313
|
+
.describe('CSS selector or XPath of the element to click (e.g., "#submit-btn", ".login-button", "//button[@id=\'submit\']")'),
|
|
314
|
+
timeout: z
|
|
315
|
+
.number()
|
|
316
|
+
.min(1000)
|
|
317
|
+
.max(30000)
|
|
318
|
+
.optional()
|
|
319
|
+
.describe('Milliseconds to wait for element availability. Defaults to 5000.'),
|
|
320
|
+
button: z
|
|
321
|
+
.enum(['left', 'right', 'middle'])
|
|
322
|
+
.optional()
|
|
323
|
+
.describe('Mouse button to use. Defaults to "left".'),
|
|
324
|
+
clickCount: z
|
|
325
|
+
.number()
|
|
326
|
+
.min(1)
|
|
327
|
+
.max(5)
|
|
328
|
+
.optional()
|
|
329
|
+
.describe('Number of times to click. Defaults to 1.'),
|
|
330
|
+
}, async (args) => {
|
|
331
|
+
return await handleClick(args);
|
|
332
|
+
});
|
|
333
|
+
// ============================================================
|
|
334
|
+
// Tool: fill
|
|
335
|
+
// ============================================================
|
|
336
|
+
server.tool('fill', 'Fill form input fields with specified values. ' +
|
|
337
|
+
'Supports text inputs, textareas, and select dropdowns. ' +
|
|
338
|
+
'Can clear fields first and add delays for React/Vue reactivity.\n\n' +
|
|
339
|
+
'Returns { elementFound, elementInputType, fillSuccess, elementInfo, timestamp }.\n\n' +
|
|
340
|
+
'WHEN TO USE:\n' +
|
|
341
|
+
'- User wants to fill out forms automatically\n' +
|
|
342
|
+
'- Testing form submissions\n' +
|
|
343
|
+
'- Automating data entry workflows\n\n' +
|
|
344
|
+
'PREREQUISITE:\n' +
|
|
345
|
+
'- Chrome must be running with --remote-debugging-port=9222\n' +
|
|
346
|
+
'- Page must be loaded before calling this tool\n\n' +
|
|
347
|
+
'AFTER THIS TOOL:\n' +
|
|
348
|
+
'- Verify fillSuccess to ensure value was set correctly\n' +
|
|
349
|
+
'- Use take_snapshot to check form state', {
|
|
350
|
+
selector: z
|
|
351
|
+
.string()
|
|
352
|
+
.describe('CSS selector of the input field to fill (e.g., "#username", "#email", ".form-input")'),
|
|
353
|
+
value: z
|
|
354
|
+
.string()
|
|
355
|
+
.describe('Value to set in the input field'),
|
|
356
|
+
timeout: z
|
|
357
|
+
.number()
|
|
358
|
+
.min(1000)
|
|
359
|
+
.max(30000)
|
|
360
|
+
.optional()
|
|
361
|
+
.describe('Milliseconds to wait for element availability. Defaults to 5000.'),
|
|
362
|
+
clearFirst: z
|
|
363
|
+
.boolean()
|
|
364
|
+
.optional()
|
|
365
|
+
.describe('Clear the field before filling. Defaults to true.'),
|
|
366
|
+
delay: z
|
|
367
|
+
.number()
|
|
368
|
+
.min(0)
|
|
369
|
+
.max(5000)
|
|
370
|
+
.optional()
|
|
371
|
+
.describe('Delay in milliseconds after filling to allow React/Vue reactivity. Defaults to 100.'),
|
|
372
|
+
}, async (args) => {
|
|
373
|
+
return await handleFill(args);
|
|
374
|
+
});
|
|
375
|
+
// ============================================================
|
|
376
|
+
// Tool: navigate
|
|
377
|
+
// ============================================================
|
|
378
|
+
server.tool('navigate', 'Navigate to a specific URL and wait for page load. ' +
|
|
379
|
+
'Supports different wait conditions and optional selector waiting.\n\n' +
|
|
380
|
+
'Returns { navigationSuccess, pageLoaded, loadTime, finalUrl, title, waitForSelectorFound, timestamp }.\n\n' +
|
|
381
|
+
'WHEN TO USE:\n' +
|
|
382
|
+
'- User wants to navigate to specific pages\n' +
|
|
383
|
+
'- Testing multi-page applications\n' +
|
|
384
|
+
'- Setting up page state before other actions\n\n' +
|
|
385
|
+
'PREREQUISITE:\n' +
|
|
386
|
+
'- Chrome must be running with --remote-debugging-port=9222\n\n' +
|
|
387
|
+
'AFTER THIS TOOL:\n' +
|
|
388
|
+
'- Use take_snapshot to verify page loaded correctly\n' +
|
|
389
|
+
'- Check loadTime for performance metrics\n' +
|
|
390
|
+
'- Use other tools to interact with the loaded page', {
|
|
391
|
+
url: z
|
|
392
|
+
.string()
|
|
393
|
+
.describe('URL to navigate to (e.g., "https://example.com", "/dashboard")'),
|
|
394
|
+
timeout: z
|
|
395
|
+
.number()
|
|
396
|
+
.min(1000)
|
|
397
|
+
.max(60000)
|
|
398
|
+
.optional()
|
|
399
|
+
.describe('Milliseconds to wait for navigation. Defaults to 10000.'),
|
|
400
|
+
waitUntil: z
|
|
401
|
+
.enum(['load', 'domcontentloaded', 'networkidle', 'commit'])
|
|
402
|
+
.optional()
|
|
403
|
+
.describe('When to consider navigation complete. Defaults to "load".'),
|
|
404
|
+
waitForSelector: z
|
|
405
|
+
.string()
|
|
406
|
+
.optional()
|
|
407
|
+
.describe('Optional CSS selector to wait for after navigation.'),
|
|
408
|
+
}, async (args) => {
|
|
409
|
+
return await handleNavigate(args);
|
|
410
|
+
});
|
|
411
|
+
// ============================================================
|
|
412
|
+
// Tool: screenshot
|
|
413
|
+
// ============================================================
|
|
414
|
+
server.tool('screenshot', 'Capture screenshots of the page or specific elements. ' +
|
|
415
|
+
'Supports full page, viewport, and element-specific screenshots. ' +
|
|
416
|
+
'Multiple formats and quality options available.\n\n' +
|
|
417
|
+
'Returns { screenshotSuccess, format, size, selectorUsed, timestamp, data }.\n\n' +
|
|
418
|
+
'WHEN TO USE:\n' +
|
|
419
|
+
'- User wants visual documentation of page state\n' +
|
|
420
|
+
-'Capturing error states or UI issues\n' +
|
|
421
|
+
'- Creating visual test reports\n\n' +
|
|
422
|
+
'PREREQUISITE:\n' +
|
|
423
|
+
'- Chrome must be running with --remote-debugging-port=9222\n' +
|
|
424
|
+
'- Page must be loaded before calling this tool\n\n' +
|
|
425
|
+
'AFTER THIS TOOL:\n' +
|
|
426
|
+
'- Use base64 data to save or display the screenshot\n' +
|
|
427
|
+
'- Check size for dimension information\n' +
|
|
428
|
+
'- Combine with element inspection for detailed UI analysis', {
|
|
429
|
+
selector: z
|
|
430
|
+
.string()
|
|
431
|
+
.optional()
|
|
432
|
+
.describe('Optional CSS selector of element to screenshot. If omitted, captures full page or viewport.'),
|
|
433
|
+
format: z
|
|
434
|
+
.enum(['png', 'jpeg', 'webp'])
|
|
435
|
+
.optional()
|
|
436
|
+
.describe('Image format. Defaults to "png".'),
|
|
437
|
+
quality: z
|
|
438
|
+
.number()
|
|
439
|
+
.min(0)
|
|
440
|
+
.max(100)
|
|
441
|
+
.optional()
|
|
442
|
+
.describe('Image quality (0-100). Only applies to JPEG/WebP. Defaults to 80.'),
|
|
443
|
+
fullPage: z
|
|
444
|
+
.boolean()
|
|
445
|
+
.optional()
|
|
446
|
+
.describe('Capture full page instead of viewport. Defaults to false.'),
|
|
447
|
+
timeout: z
|
|
448
|
+
.number()
|
|
449
|
+
.min(1000)
|
|
450
|
+
.max(30000)
|
|
451
|
+
.optional()
|
|
452
|
+
.describe('Milliseconds to wait for element availability if selector is specified. Defaults to 10000.'),
|
|
453
|
+
}, async (args) => {
|
|
454
|
+
return await handleScreenshot(args);
|
|
455
|
+
});
|
|
456
|
+
// ============================================================
|
|
457
|
+
// Tool: inspect
|
|
458
|
+
// ============================================================
|
|
459
|
+
server.tool('inspect', 'Get detailed information about a page element. ' +
|
|
460
|
+
'Returns comprehensive element data including attributes, styles, ' +
|
|
461
|
+
'position, children, and accessibility information.\n\n' +
|
|
462
|
+
'Returns { elementFound, elementInfo, timestamp }.\n\n' +
|
|
463
|
+
'WHEN TO USE:\n' +
|
|
464
|
+
'- User wants detailed element information for debugging\n' +
|
|
465
|
+
'- Understanding page structure and element properties\n' +
|
|
466
|
+
'- Debugging CSS styling and layout issues\n\n' +
|
|
467
|
+
'PREREQUISITE:\n' +
|
|
468
|
+
'- Chrome must be running with --remote-debugging-port=9222\n' +
|
|
469
|
+
'- Page must be loaded before calling this tool\n\n' +
|
|
470
|
+
'AFTER THIS TOOL:\n' +
|
|
471
|
+
'- Use elementInfo for detailed debugging\n' +
|
|
472
|
+
'- Combine with screenshot to understand visual context\n' +
|
|
473
|
+
'- Use for CSS debugging and layout analysis', {
|
|
474
|
+
selector: z
|
|
475
|
+
.string()
|
|
476
|
+
.describe('CSS selector or XPath of element to inspect (e.g., ".header", "#main-content", "//div[@class=\'container\']")'),
|
|
477
|
+
timeout: z
|
|
478
|
+
.number()
|
|
479
|
+
.min(1000)
|
|
480
|
+
.max(30000)
|
|
481
|
+
.optional()
|
|
482
|
+
.describe('Milliseconds to wait for element availability. Defaults to 5000.'),
|
|
483
|
+
includeStyles: z
|
|
484
|
+
.boolean()
|
|
485
|
+
.optional()
|
|
486
|
+
.describe('Include computed CSS styles. Defaults to true.'),
|
|
487
|
+
includeAttributes: z
|
|
488
|
+
.boolean()
|
|
489
|
+
.optional()
|
|
490
|
+
.describe('Include element attributes. Defaults to true.'),
|
|
491
|
+
includeChildren: z
|
|
492
|
+
.boolean()
|
|
493
|
+
.optional()
|
|
494
|
+
.describe('Include child elements. Defaults to false.'),
|
|
495
|
+
maxDepth: z
|
|
496
|
+
.number()
|
|
497
|
+
.min(0)
|
|
498
|
+
.max(5)
|
|
499
|
+
.optional()
|
|
500
|
+
.describe('Maximum depth for children traversal. Defaults to 2.'),
|
|
501
|
+
}, async (args) => {
|
|
502
|
+
return await handleInspect(args);
|
|
503
|
+
});
|
|
504
|
+
// ============================================================
|
|
290
505
|
// Server startup
|
|
291
506
|
// ============================================================
|
|
292
507
|
export async function main() {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { MCPToolResponse } from './types.js';
|
|
2
|
+
interface NavigateArgs {
|
|
3
|
+
url: string;
|
|
4
|
+
timeout?: number;
|
|
5
|
+
waitUntil?: 'load' | 'domcontentloaded' | 'networkidle' | 'commit';
|
|
6
|
+
waitForSelector?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function handleNavigate(args: NavigateArgs): Promise<MCPToolResponse>;
|
|
9
|
+
export {};
|
package/dist/navigate.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { CDPConnectionManager } from './cdp/connectionManager.js';
|
|
2
|
+
import { createMCPError, createMCPSuccess } from './types.js';
|
|
3
|
+
export async function handleNavigate(args) {
|
|
4
|
+
const { url, timeout = 10000, waitUntil = 'load', waitForSelector } = args;
|
|
5
|
+
const cdpManager = CDPConnectionManager.getInstance();
|
|
6
|
+
try {
|
|
7
|
+
// Connect to CDP if not already connected
|
|
8
|
+
const connection = await cdpManager.getConnection(9222);
|
|
9
|
+
const startTime = Date.now();
|
|
10
|
+
// Navigate to the URL
|
|
11
|
+
await connection.send('Page.navigate', {
|
|
12
|
+
url: url
|
|
13
|
+
});
|
|
14
|
+
// Wait for page load based on waitUntil parameter
|
|
15
|
+
let pageLoaded = false;
|
|
16
|
+
const loadTimeout = timeout;
|
|
17
|
+
const loadStartTime = Date.now();
|
|
18
|
+
while (Date.now() - loadStartTime < loadTimeout) {
|
|
19
|
+
const result = await connection.send('Page.getNavigationHistory');
|
|
20
|
+
if (result.entries && result.entries.length > 0) {
|
|
21
|
+
const currentEntry = result.entries[result.currentIndex];
|
|
22
|
+
if (currentEntry.url === url) {
|
|
23
|
+
pageLoaded = true;
|
|
24
|
+
break;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
await new Promise(resolve => setTimeout(resolve, 100, undefined));
|
|
28
|
+
}
|
|
29
|
+
if (!pageLoaded) {
|
|
30
|
+
return createMCPError('TIMEOUT', `Navigation to ${url} timed out after ${timeout}ms`, undefined, 'Check if the page is loading properly');
|
|
31
|
+
}
|
|
32
|
+
// Wait for additional conditions if specified
|
|
33
|
+
let waitForSelectorFound = false;
|
|
34
|
+
if (waitForSelector) {
|
|
35
|
+
const selectorTimeout = Math.min(5000, timeout - (Date.now() - loadStartTime));
|
|
36
|
+
const selectorStartTime = Date.now();
|
|
37
|
+
while (Date.now() - selectorStartTime < selectorTimeout) {
|
|
38
|
+
const result = await connection.send('Runtime.evaluate', {
|
|
39
|
+
expression: `document.querySelector('${waitForSelector}') !== null`
|
|
40
|
+
});
|
|
41
|
+
if (result.result && result.result.value === true) {
|
|
42
|
+
waitForSelectorFound = true;
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
await new Promise(resolve => setTimeout(resolve, 100, undefined));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Get final page info
|
|
49
|
+
const pageInfo = await connection.send('Runtime.evaluate', {
|
|
50
|
+
expression: `
|
|
51
|
+
{
|
|
52
|
+
url: window.location.href,
|
|
53
|
+
title: document.title,
|
|
54
|
+
readyState: document.readyState,
|
|
55
|
+
loadTime: Date.now() - ${startTime}
|
|
56
|
+
}
|
|
57
|
+
`,
|
|
58
|
+
returnByValue: true
|
|
59
|
+
});
|
|
60
|
+
const pageInfoData = pageInfo.result.value;
|
|
61
|
+
const loadTime = Date.now() - startTime;
|
|
62
|
+
const result = {
|
|
63
|
+
navigationSuccess: true,
|
|
64
|
+
pageLoaded: pageLoaded,
|
|
65
|
+
loadTime: loadTime,
|
|
66
|
+
finalUrl: pageInfoData.url,
|
|
67
|
+
title: pageInfoData.title,
|
|
68
|
+
waitForSelectorFound: waitForSelectorFound,
|
|
69
|
+
timestamp: new Date().toISOString()
|
|
70
|
+
};
|
|
71
|
+
return createMCPSuccess({ message: 'Navigation completed successfully', ...result });
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
console.error('Navigation error:', error);
|
|
75
|
+
return createMCPError('PAGE_NAVIGATION_FAILED', `Failed to navigate to ${url}: ${error instanceof Error ? error.message : String(error)}`, undefined, 'Check if Chrome is running with --remote-debugging-port=9222');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=navigate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigate.js","sourceRoot":"","sources":["../src/navigate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAoB9D,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAkB;IACrD,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,KAAK,EAAE,SAAS,GAAG,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;IAE3E,MAAM,UAAU,GAAG,oBAAoB,CAAC,WAAW,EAAE,CAAC;IAEtD,IAAI,CAAC;QACH,0CAA0C;QAC1C,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAExD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,sBAAsB;QACtB,MAAM,UAAU,CAAC,IAAI,CAAC,eAAe,EAAE;YACrC,GAAG,EAAE,GAAG;SACT,CAAC,CAAC;QAEH,kDAAkD;QAClD,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,MAAM,WAAW,GAAG,OAAO,CAAC;QAC5B,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEjC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,GAAG,WAAW,EAAE,CAAC;YAChD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAElE,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChD,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;gBACzD,IAAI,YAAY,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;oBAC7B,UAAU,GAAG,IAAI,CAAC;oBAClB,MAAM;gBACR,CAAC;YACH,CAAC;YAED,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,cAAc,CAAC,SAAS,EAAE,iBAAiB,GAAG,oBAAoB,OAAO,IAAI,EAAE,SAAS,EAAE,uCAAuC,CAAC,CAAC;QAC5I,CAAC;QAED,8CAA8C;QAC9C,IAAI,oBAAoB,GAAG,KAAK,CAAC;QACjC,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC;YAC/E,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAErC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,iBAAiB,GAAG,eAAe,EAAE,CAAC;gBACxD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,kBAAkB,EAAE;oBACvD,UAAU,EAAE,2BAA2B,eAAe,aAAa;iBACpE,CAAC,CAAC;gBAEH,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;oBAClD,oBAAoB,GAAG,IAAI,CAAC;oBAC5B,MAAM;gBACR,CAAC;gBAET,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,sBAAsB;QACtB,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,kBAAkB,EAAE;YACzD,UAAU,EAAE;;;;;mCAKiB,SAAS;;OAErC;YACD,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;QAE3C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAExC,MAAM,MAAM,GAAmB;YAC7B,iBAAiB,EAAE,IAAI;YACvB,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,YAAY,CAAC,GAAG;YAC1B,KAAK,EAAE,YAAY,CAAC,KAAK;YACzB,oBAAoB,EAAE,oBAAoB;YAC1C,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,OAAO,gBAAgB,CAAC,EAAE,OAAO,EAAE,mCAAmC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAEvF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;QAC1C,OAAO,cAAc,CAAC,wBAAwB,EAAE,yBAAyB,GAAG,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,8DAA8D,CAAC,CAAC;IACxN,CAAC;AACH,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -28,7 +28,7 @@ export interface ToolContext {
|
|
|
28
28
|
port?: number;
|
|
29
29
|
cdpPort?: number;
|
|
30
30
|
}
|
|
31
|
-
export type MCPErrorCode = 'FRAMEWORK_NOT_DETECTED' | 'DEV_SERVER_START_FAILED' | 'CDP_CONNECTION_FAILED' | 'PAGE_NAVIGATION_FAILED' | 'TYPE_CHECK_FAILED' | 'CONFIG_NOT_FOUND' | 'INVALID_PROJECT_DIR' | 'PORT_IN_USE' | 'TIMEOUT' | 'UNKNOWN_ERROR';
|
|
31
|
+
export type MCPErrorCode = 'FRAMEWORK_NOT_DETECTED' | 'DEV_SERVER_START_FAILED' | 'CDP_CONNECTION_FAILED' | 'PAGE_NAVIGATION_FAILED' | 'TYPE_CHECK_FAILED' | 'CONFIG_NOT_FOUND' | 'INVALID_PROJECT_DIR' | 'PORT_IN_USE' | 'TIMEOUT' | 'UNKNOWN_ERROR' | 'ELEMENT_NOT_FOUND' | 'ELEMENT_NOT_CLICKABLE' | 'ELEMENT_NOT_INPUT' | 'CLICK_ERROR' | 'FILL_ERROR' | 'NAVIGATION_ERROR' | 'SCREENSHOT_ERROR' | 'INSPECTION_ERROR' | 'VALUE_SET_FAILED';
|
|
32
32
|
export interface MCPError {
|
|
33
33
|
code: MCPErrorCode;
|
|
34
34
|
message: string;
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA+DA,MAAM,UAAU,cAAc,CAC5B,IAAkB,EAClB,OAAe,EACf,OAAiB,EACjB,UAAmB;IAEnB,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;aACjF;SACF;QACD,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAa;IAC5C,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;aACpC;SACF;KACF,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sudu-cli/fronted-preview-mcp",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
4
|
-
"description": "MCP server for frontend project detection, dev server management, and
|
|
3
|
+
"version": "1.0.0-beta.6",
|
|
4
|
+
"description": "MCP server for frontend project detection, dev server management, preview workflow, and browser automation. Includes click, fill, navigate, screenshot, and inspect tools for comprehensive frontend testing and automation.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"bin": {
|