@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 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":"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"}
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 {};
@@ -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":"AAsDA,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"}
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.5",
4
- "description": "MCP server for frontend project detection, dev server management, and preview workflow. Pairs with chrome-devtools-mcp for automated frontend checking.",
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": {