@sudu-cli/fronted-preview-mcp 1.0.0-beta.0 → 1.0.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,151 @@
1
+ import * as path from 'node:path';
2
+ import { Project } from 'ts-morph';
3
+ function getSeverity(diagnostic) {
4
+ const category = diagnostic.getCategory();
5
+ if (category === 1)
6
+ return 'error'; // DiagnosticCategory.Error
7
+ if (category === 0)
8
+ return 'warning'; // DiagnosticCategory.Warning
9
+ if (category === 2)
10
+ return 'suggestion'; // DiagnosticCategory.Suggestion
11
+ return 'message'; // DiagnosticCategory.Message
12
+ }
13
+ function getCategory(diagnostic) {
14
+ const code = diagnostic.getCode();
15
+ // TypeScript diagnostic codes:
16
+ // 1000-1999: syntactic (parser)
17
+ // 2000-2999: semantic (binder/checker)
18
+ // 3000-3999: declaration
19
+ // 4000-4999: config
20
+ // 5000-5999: project references
21
+ // 6000-6999: deprecated
22
+ // 7000-7999: strict null checks
23
+ // 8000-8999: watch
24
+ if (code >= 1000 && code < 2000)
25
+ return 'syntactic';
26
+ if (code >= 2000 && code < 3000)
27
+ return 'semantic';
28
+ if (code >= 3000 && code < 4000)
29
+ return 'declaration';
30
+ if (code >= 4000 && code < 5000)
31
+ return 'config';
32
+ if (code >= 5000 && code < 6000)
33
+ return 'typescript'; // project references
34
+ return 'typescript';
35
+ }
36
+ function formatDiagnostic(diagnostic, projectDir) {
37
+ const sourceFile = diagnostic.getSourceFile();
38
+ const filePath = sourceFile ? path.relative(projectDir, sourceFile.getFilePath()) : 'unknown';
39
+ let line = 0;
40
+ let column = 0;
41
+ const start = diagnostic.getStart();
42
+ if (start !== undefined && sourceFile) {
43
+ const pos = sourceFile.getLineAndColumnAtPos(start);
44
+ // ts-morph returns { line, character } or { line, column } depending on version
45
+ line = pos.line;
46
+ const col = 'character' in pos ? pos.character : 'column' in pos ? pos.column : 0;
47
+ column = typeof col === 'number' ? col : 0;
48
+ }
49
+ // getMessageText() can return string or DiagnosticMessageChain
50
+ const messageText = diagnostic.getMessageText();
51
+ const message = typeof messageText === 'string' ? messageText : JSON.stringify(messageText);
52
+ return {
53
+ file: filePath,
54
+ line: line + 1, // Convert to 1-based
55
+ column: column + 1, // Convert to 1-based
56
+ code: diagnostic.getCode(),
57
+ message,
58
+ severity: getSeverity(diagnostic),
59
+ category: getCategory(diagnostic),
60
+ };
61
+ }
62
+ async function handleGetTypeScriptDiagnostics(args) {
63
+ const startTime = Date.now();
64
+ const projectDir = args.projectDir || process.cwd();
65
+ const tsConfigPath = args.tsConfigPath || 'tsconfig.json';
66
+ const fullTsConfigPath = path.resolve(projectDir, tsConfigPath);
67
+ const includeWarnings = args.includeWarnings ?? true;
68
+ try {
69
+ // Check if tsconfig exists
70
+ const fs = await import('node:fs/promises');
71
+ try {
72
+ await fs.access(fullTsConfigPath);
73
+ }
74
+ catch {
75
+ return {
76
+ content: [
77
+ {
78
+ type: 'text',
79
+ text: JSON.stringify({
80
+ error: `tsconfig.json not found at ${fullTsConfigPath}`,
81
+ projectDir,
82
+ suggestion: 'Ensure the project has a tsconfig.json file',
83
+ }, null, 2),
84
+ },
85
+ ],
86
+ isError: true,
87
+ };
88
+ }
89
+ // Create ts-morph project
90
+ const project = new Project({
91
+ tsConfigFilePath: fullTsConfigPath,
92
+ skipAddingFilesFromTsConfig: false,
93
+ skipFileDependencyResolution: true, // Faster for diagnostics only
94
+ skipLoadingLibFiles: true, // Don't load lib.d.ts
95
+ });
96
+ let diagnostics = [];
97
+ if (args.files && args.files.length > 0) {
98
+ // Check specific files
99
+ for (const file of args.files) {
100
+ const fullPath = path.resolve(projectDir, file);
101
+ const sourceFile = project.getSourceFile(fullPath);
102
+ if (sourceFile) {
103
+ const fileDiagnostics = sourceFile.getPreEmitDiagnostics();
104
+ diagnostics.push(...fileDiagnostics);
105
+ }
106
+ }
107
+ }
108
+ else {
109
+ // Check entire project
110
+ diagnostics = project.getPreEmitDiagnostics();
111
+ }
112
+ // Filter and format
113
+ const formattedDiagnostics = diagnostics
114
+ .filter((d) => includeWarnings || d.getCategory() === 1) // Include errors always, warnings if requested
115
+ .map((d) => formatDiagnostic(d, projectDir));
116
+ // Count by severity
117
+ const errorCount = formattedDiagnostics.filter((d) => d.severity === 'error').length;
118
+ const warningCount = formattedDiagnostics.filter((d) => d.severity === 'warning').length;
119
+ const suggestionCount = formattedDiagnostics.filter((d) => d.severity === 'suggestion').length;
120
+ // Count unique files
121
+ const fileCount = new Set(formattedDiagnostics.map((d) => d.file)).size;
122
+ const report = {
123
+ projectDir,
124
+ tsConfigPath: path.relative(projectDir, fullTsConfigPath),
125
+ diagnostics: formattedDiagnostics,
126
+ errorCount,
127
+ warningCount,
128
+ suggestionCount,
129
+ fileCount,
130
+ durationMs: Date.now() - startTime,
131
+ timestamp: new Date().toISOString(),
132
+ };
133
+ return {
134
+ content: [
135
+ {
136
+ type: 'text',
137
+ text: JSON.stringify(report, null, 2),
138
+ },
139
+ ],
140
+ };
141
+ }
142
+ catch (err) {
143
+ const errorMessage = err instanceof Error ? err.message : String(err);
144
+ return {
145
+ content: [{ type: 'text', text: JSON.stringify({ error: errorMessage }, null, 2) }],
146
+ isError: true,
147
+ };
148
+ }
149
+ }
150
+ export { handleGetTypeScriptDiagnostics };
151
+ //# sourceMappingURL=typescriptDiagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescriptDiagnostics.js","sourceRoot":"","sources":["../../src/handlers/typescriptDiagnostics.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -7,6 +7,9 @@ import { handleGetProjectInfo } from './handlers/getProjectInfo.js';
7
7
  import { handleStartDevServer } from './handlers/startDevServer.js';
8
8
  import { handleStopDevServer } from './handlers/stopDevServer.js';
9
9
  import { handleQuickPreview } from './handlers/quickPreview.js';
10
+ import { handleCheckPageErrors } from './handlers/checkPageErrors.js';
11
+ import { handleGetTypeScriptDiagnostics } from './handlers/typescriptDiagnostics.js';
12
+ import { handleAutoFixLoop } from './handlers/autoFixLoop.js';
10
13
  const server = new McpServer({
11
14
  name: 'frontend-preview',
12
15
  version: '1.0.0',
@@ -98,13 +101,16 @@ server.tool('quick_preview', 'ONE-STEP: detect frontend framework + start dev se
98
101
  'WHEN NOT TO USE:\n' +
99
102
  '- User only asks about project info — use get_project_info\n' +
100
103
  '- User explicitly asks to stop — use stop_dev_server\n\n' +
101
- 'CRITICAL — AFTER THIS TOOL, USE THIS SEQUENCE:\n' +
104
+ 'CRITICAL — AFTER THIS TOOL, USE chrome-devtools-mcp FOR ALL BROWSER INTERACTIONS:\n' +
102
105
  '1. chrome-devtools navigate_page(url) ← Open page in browser\n' +
103
106
  '2. chrome-devtools list_console_messages() ← Check for JS errors\n' +
104
107
  '3. chrome-devtools take_snapshot() ← Inspect page structure\n' +
105
- '4. Report findings to the user\n\n' +
108
+ '4. chrome-devtools take_screenshot() ← Visual capture (optional)\n' +
109
+ '5. Report findings to the user\n\n' +
106
110
  'Do NOT call get_project_info or start_dev_server separately when using this.\n' +
107
- 'The dev server stays running — no need to call stop_dev_server after preview.', {
111
+ 'The dev server stays running — no need to call stop_dev_server after preview.\n\n' +
112
+ 'NOTE: This MCP handles framework detection + dev server lifecycle. ' +
113
+ 'All browser interactions are delegated to chrome-devtools-mcp.', {
108
114
  projectDir: z
109
115
  .string()
110
116
  .optional()
@@ -117,6 +123,158 @@ server.tool('quick_preview', 'ONE-STEP: detect frontend framework + start dev se
117
123
  return await handleQuickPreview(args);
118
124
  });
119
125
  // ============================================================
126
+ // Tool: check_page_errors
127
+ // ============================================================
128
+ server.tool('check_page_errors', 'Check frontend page for console errors and network failures. ' +
129
+ 'Starts dev server (if needed), connects to Chrome via CDP (port 9222), ' +
130
+ 'navigates to the page, and returns structured error report.\n\n' +
131
+ 'This is the ONLY tool in this MCP that directly uses CDP. ' +
132
+ 'All other browser interactions (screenshots, element inspection, snapshots) ' +
133
+ 'are delegated to chrome-devtools-mcp.\n\n' +
134
+ 'Returns { pageUrl, framework, port, consoleMessages[], networkErrors[], hasErrors, errorCount, warningCount }.\n\n' +
135
+ 'WHEN TO USE:\n' +
136
+ '- User wants to check if page has any JavaScript errors\n' +
137
+ '- User wants to verify page loads without console errors\n' +
138
+ '- Automated CI/CD error checking\n\n' +
139
+ 'PREREQUISITE:\n' +
140
+ '- Chrome must be running with --remote-debugging-port=9222\n' +
141
+ '- Start Chrome: chrome --remote-debugging-port=9222 --user-data-dir=/tmp/chrome-debug\n\n' +
142
+ 'AFTER THIS TOOL:\n' +
143
+ '- If errors found, use the error details to fix the code\n' +
144
+ '- Re-run check_page_errors to verify fixes\n' +
145
+ '- For visual inspection, use chrome-devtools take_screenshot\n' +
146
+ '- For element inspection, use chrome-devtools take_snapshot / navigate_page', {
147
+ projectDir: z
148
+ .string()
149
+ .optional()
150
+ .describe('Absolute path to the frontend project directory. Defaults to current working directory.'),
151
+ customPort: z
152
+ .number()
153
+ .optional()
154
+ .describe('Override the auto-detected dev server port number.'),
155
+ cdpPort: z
156
+ .number()
157
+ .optional()
158
+ .describe('Chrome DevTools Protocol port. Defaults to 9222.'),
159
+ waitForLoadMs: z
160
+ .number()
161
+ .optional()
162
+ .describe('Milliseconds to wait for page load before checking console. Defaults to 3000.'),
163
+ }, async (args) => {
164
+ return await handleCheckPageErrors(args);
165
+ });
166
+ // ============================================================
167
+ // Tool: get_typescript_diagnostics
168
+ // ============================================================
169
+ server.tool('get_typescript_diagnostics', 'Get TypeScript compiler diagnostics (type errors, warnings) for a project. ' +
170
+ 'Uses ts-morph to run incremental type checking without emitting files.\n\n' +
171
+ 'Returns { projectDir, tsConfigPath, diagnostics[], errorCount, warningCount, fileCount, durationMs }.\n\n' +
172
+ 'WHEN TO USE:\n' +
173
+ '- User wants to check for TypeScript type errors\n' +
174
+ '- After code changes to verify no regressions\n' +
175
+ '- CI/CD pre-check before build\n' +
176
+ '- AI needs context for type-safe fixes\n\n' +
177
+ 'PREREQUISITE:\n' +
178
+ '- Project must have a valid tsconfig.json\n' +
179
+ '- Dependencies should be installed (node_modules)\n\n' +
180
+ 'AFTER THIS TOOL:\n' +
181
+ '- Fix reported type errors in the listed files\n' +
182
+ '- Re-run to verify fixes\n' +
183
+ '- Combine with check_page_errors for full error coverage', {
184
+ projectDir: z
185
+ .string()
186
+ .optional()
187
+ .describe('Absolute path to the frontend project directory. Defaults to current working directory.'),
188
+ tsConfigPath: z
189
+ .string()
190
+ .optional()
191
+ .describe('Relative path to tsconfig.json from projectDir. Defaults to "tsconfig.json".'),
192
+ files: z
193
+ .array(z.string())
194
+ .optional()
195
+ .describe('Optional: specific files to check (relative to projectDir). If omitted, checks entire project.'),
196
+ includeWarnings: z
197
+ .boolean()
198
+ .optional()
199
+ .describe('Include warnings and suggestions. Defaults to true.'),
200
+ }, async (args) => {
201
+ return await handleGetTypeScriptDiagnostics(args);
202
+ });
203
+ // ============================================================
204
+ // Tool: auto_fix_loop
205
+ // ============================================================
206
+ server.tool('auto_fix_loop', 'Automatically detect and fix frontend errors in an iterative loop. ' +
207
+ 'Combines console error checking (via CDP) and TypeScript diagnostics ' +
208
+ 'to identify and verify fixes automatically.\n\n' +
209
+ 'Returns { success, iterations, errorsFixed, errorsRemaining, messages, errors }.\n\n' +
210
+ 'WHEN TO USE:\n' +
211
+ '- User wants to automatically fix all detected errors\n' +
212
+ '- User says "fix all errors" or "auto-fix this project"\n' +
213
+ '- Need iterative error detection and fixing\n' +
214
+ '- CI/CD automated error cleanup\n\n' +
215
+ 'PREREQUISITE:\n' +
216
+ '- Chrome must be running with --remote-debugging-port=9222 (for console error detection)\n' +
217
+ '- Project must have TypeScript configuration for type checking\n' +
218
+ '- Start Chrome: chrome --remote-debugging-port=9222 --user-data-dir=/tmp/chrome-debug\n\n' +
219
+ 'AFTER THIS TOOL:\n' +
220
+ '- Check the result for errorsFixed vs errorsRemaining\n' +
221
+ '- For visual inspection, use chrome-devtools take_screenshot\n' +
222
+ '- If errors remain, run again with more iterations\n' +
223
+ '- Manual review may be needed for complex issues', {
224
+ projectDir: z
225
+ .string()
226
+ .optional()
227
+ .describe('Absolute path to the frontend project directory. Defaults to current working directory.'),
228
+ customPort: z
229
+ .number()
230
+ .optional()
231
+ .describe('Override the auto-detected dev server port number.'),
232
+ cdpPort: z
233
+ .number()
234
+ .optional()
235
+ .describe('Chrome DevTools Protocol port. Defaults to 9222.'),
236
+ maxIterations: z
237
+ .number()
238
+ .min(1)
239
+ .max(10)
240
+ .optional()
241
+ .describe('Maximum number of fix iterations. Defaults to 3.'),
242
+ timeoutPerIteration: z
243
+ .number()
244
+ .min(1000)
245
+ .max(120000)
246
+ .optional()
247
+ .describe('Timeout per iteration in milliseconds. Defaults to 30000.'),
248
+ stopOnSuccess: z
249
+ .boolean()
250
+ .optional()
251
+ .describe('Stop when no errors remain. Defaults to true.'),
252
+ targetErrors: z
253
+ .array(z.string())
254
+ .optional()
255
+ .describe('Optional: filter to specific error messages. If omitted, fixes all errors.'),
256
+ }, async (args) => {
257
+ const result = await handleAutoFixLoop(args);
258
+ const content = [
259
+ {
260
+ type: 'text',
261
+ text: `Auto-fix loop completed:\n` +
262
+ `Iterations: ${result.iterations}\n` +
263
+ `Errors fixed: ${result.errorsFixed}\n` +
264
+ `Errors remaining: ${result.errorsRemaining}\n` +
265
+ `Success: ${result.success ? '✅' : '❌'}\n\n` +
266
+ `Messages:\n${result.messages.join('\n')}`
267
+ }
268
+ ];
269
+ if (result.errors.length > 0) {
270
+ content.push({
271
+ type: 'text',
272
+ text: `\nErrors:\n${result.errors.join('\n')}`
273
+ });
274
+ }
275
+ return { content };
276
+ });
277
+ // ============================================================
120
278
  // Server startup
121
279
  // ============================================================
122
280
  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":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;IACE,IAAI,EAAE,kBAAkB;IACxB,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF,+DAA+D;AAC/D,yBAAyB;AACzB,+DAA+D;AAC/D,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,6DAA6D;IAC3D,kFAAkF;IAClF,6EAA6E;IAC7E,+DAA+D;IAC/D,gBAAgB;IAChB,oEAAoE;IACpE,uEAAuE;IACvE,oBAAoB;IACpB,yEAAyE;IACzE,wEAAwE;IACxE,oBAAoB;IACpB,+EAA+E;IAC/E,iEAAiE,EACnE;IACE,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,yFAAyF,CAC1F;CACJ,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;IACb,OAAO,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC,CACF,CAAC;AAEF,+DAA+D;AAC/D,yBAAyB;AACzB,+DAA+D;AAC/D,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,kEAAkE;IAChE,sEAAsE;IACtE,wDAAwD;IACxD,sDAAsD;IACtD,gBAAgB;IAChB,oEAAoE;IACpE,kDAAkD;IAClD,oBAAoB;IACpB,6EAA6E;IAC7E,4DAA4D;IAC5D,oBAAoB;IACpB,8DAA8D;IAC9D,yDAAyD;IACzD,qDAAqD,EACvD;IACE,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,kDAAkD,CAAC;IAC/D,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,yCAAyC,CAAC;IACtD,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,gEAAgE,CACjE;CACJ,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;IACb,OAAO,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC,CACF,CAAC;AAEF,+DAA+D;AAC/D,wBAAwB;AACxB,+DAA+D;AAC/D,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,oEAAoE;IAClE,mDAAmD;IACnD,gDAAgD;IAChD,gBAAgB;IAChB,gEAAgE;IAChE,oBAAoB;IACpB,gFAAgF;IAChF,0CAA0C,EAC5C,EAAE,EACF,KAAK,IAAI,EAAE;IACT,OAAO,MAAM,mBAAmB,EAAE,CAAC;AACrC,CAAC,CACF,CAAC;AAEF,+DAA+D;AAC/D,sBAAsB;AACtB,+DAA+D;AAC/D,MAAM,CAAC,IAAI,CACT,eAAe,EACf,0DAA0D;IACxD,qEAAqE;IACrE,oDAAoD;IACpD,kEAAkE;IAClE,4BAA4B;IAC5B,+DAA+D;IAC/D,2DAA2D;IAC3D,oDAAoD;IACpD,oDAAoD;IACpD,oBAAoB;IACpB,8DAA8D;IAC9D,0DAA0D;IAC1D,kDAAkD;IAClD,sEAAsE;IACtE,qEAAqE;IACrE,wEAAwE;IACxE,oCAAoC;IACpC,gFAAgF;IAChF,+EAA+E,EACjF;IACE,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,yFAAyF,CAAC;IACtG,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,0FAA0F,CAAC;CACxG,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;IACb,OAAO,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC,CACF,CAAC;AAEF,+DAA+D;AAC/D,iBAAiB;AACjB,+DAA+D;AAC/D,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,yEAAyE;AACzE,MAAM,YAAY,GAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACf,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEjF,IAAI,YAAY,EAAE,CAAC;IACjB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -22,3 +22,9 @@ export interface MCPToolResponse {
22
22
  isError?: boolean;
23
23
  [key: string]: unknown;
24
24
  }
25
+ export interface ToolContext {
26
+ chromeClient?: any;
27
+ projectDir?: string;
28
+ port?: number;
29
+ cdpPort?: number;
30
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sudu-cli/fronted-preview-mcp",
3
- "version": "1.0.0-beta.0",
3
+ "version": "1.0.0-beta.3",
4
4
  "description": "MCP server for frontend project detection, dev server management, and preview workflow. Pairs with chrome-devtools-mcp for automated frontend checking.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -22,11 +22,14 @@
22
22
  "node": ">=18"
23
23
  },
24
24
  "dependencies": {
25
- "@modelcontextprotocol/sdk": "^1.27.1"
25
+ "@modelcontextprotocol/sdk": "^1.27.1",
26
+ "chrome-remote-interface": "^0.34.0",
27
+ "ts-morph": "^28.0.0"
26
28
  },
27
29
  "devDependencies": {
28
- "typescript": "^5.7.0",
29
- "@types/node": "^22.0.0"
30
+ "@types/chrome-remote-interface": "^0.34.0",
31
+ "@types/node": "^22.0.0",
32
+ "typescript": "^5.7.0"
30
33
  },
31
34
  "publishConfig": {
32
35
  "access": "public"
@@ -1,26 +1,40 @@
1
1
  ---
2
- description: 前端页面预览检查专家,自动检测 console 错误和渲染问题
2
+ description: 前端页面预览检查专家,自动检测 console 错误、TypeScript 类型错误和渲染问题
3
3
  mode: subagent
4
4
  permission:
5
5
  edit: deny
6
6
  bash: deny
7
7
  ---
8
8
 
9
- 你是一个前端页面检查专家,专注于自动预览前端页面并报告问题。
9
+ 你是一个前端页面检查专家,专注于自动预览前端页面并报告问题,包括错误检测和自动修复。
10
10
 
11
11
  ## 工作流程
12
12
 
13
+ ### 页面预览检查工作流
13
14
  1. 调用 `quick_preview` 检测框架并启动 dev server
14
15
  2. 用 chrome-devtools `navigate_page` 打开返回的 URL
15
16
  3. 用 `list_console_messages` 检查 console 错误
16
17
  4. 用 `take_snapshot` 获取页面结构分析
17
18
  5. 汇总结果给用户
18
19
 
20
+ ### 错误检测与修复工作流
21
+ 1. 调用 `check_page_errors` 检测页面 console 错误和网络失败
22
+ 2. 调用 `get_typescript_diagnostics` 检测 TypeScript 类型错误
23
+ 3. 调用 `auto_fix_loop` 自动修复错误(可选)
24
+ 4. 汇总结果给用户
25
+
26
+ ### 元素分析与截图工作流
27
+ 1. 调用 `pick_element` 拾取页面元素获取详细信息
28
+ 2. 调用 `take_screenshot` 截图页面或特定元素
29
+ 3. 汇总结果给用户
30
+
19
31
  ## 工具路由
20
32
 
21
33
  | 场景 | 工具序列 |
22
34
  |------|---------|
23
35
  | "检查页面效果" | quick_preview → navigate_page → list_console_messages → take_snapshot |
36
+ | "检查错误" | check_page_errors → get_typescript_diagnostics → auto_fix_loop(可选) |
37
+ | "分析元素" | pick_element → take_screenshot(可选) |
24
38
  | "只看项目信息" | get_project_info(不启动服务) |
25
39
  | "停止 dev server" | stop_dev_server |
26
40
 
@@ -29,3 +43,5 @@ permission:
29
43
  - 不需要截图,take_snapshot 就够了
30
44
  - quick_preview 已包含检测,不要再调 get_project_info
31
45
  - 报告结果时说明:是否正常运行、是否有错误、页面结构
46
+ - 使用 `auto_fix_loop` 时需要 Chrome 运行在调试模式(--remote-debugging-port=9222)
47
+ - `pick_element` 支持直接传入 CSS 选择器,或进入交互式拾取模式
@@ -13,21 +13,48 @@
13
13
  4. **chrome-devtools `take_snapshot`** — 获取页面无障碍结构树,分析渲染
14
14
  5. **汇总结果** — 告诉用户:页面运行状态、有无 console 错误、页面结构概况
15
15
 
16
+ ## 自动错误检测与修复工作流
17
+
18
+ 当用户想"检查错误"、"修复错误"、"自动修复"时,按照以下步骤:
19
+
20
+ 1. **`check_page_errors`** — 检测页面 console 错误和网络失败
21
+ 2. **`get_typescript_diagnostics`** — 检测 TypeScript 类型错误
22
+ 3. **`auto_fix_loop`** — 自动检测和修复错误(可选)
23
+ 4. **汇总结果** — 告诉用户:错误类型、数量、修复建议
24
+
25
+ ## 元素分析与截图工作流
26
+
27
+ 当用户想"分析元素"、"截图"、"查看样式"时,按照以下步骤:
28
+
29
+ 1. **`pick_element`** — 拾取页面元素获取详细信息
30
+ 2. **`take_screenshot`** — 截图页面或特定元素
31
+ 3. **汇总结果** — 告诉用户:元素信息、样式、截图结果
32
+
16
33
  ## 工具快速参考
17
34
 
18
35
  | 工具 | 用途 | 优先使用场景 |
19
36
  |------|------|------------|
37
+ | **核心预览工具** | | |
20
38
  | `quick_preview` | 检测框架 + 启动 dev server | 大多数场景——一步到位 |
21
39
  | `get_project_info` | 仅检测框架信息 | 用户只问"这是什么项目" |
22
40
  | `start_dev_server` | 仅启动 dev server | 已知道框架时单独使用 |
23
41
  | `stop_dev_server` | 停止 dev server | 用户明确要求停止 |
24
- | chrome-devtools `navigate_page` | 打开 URL | 拿到 URL 后立即使用 |
25
- | chrome-devtools `list_console_messages` | 检查 console 错误 | 页面加载完成后 |
26
- | chrome-devtools `take_snapshot` | 获取页面结构 | 需要分析渲染结果时 |
27
- | chrome-devtools `take_screenshot` | 页面截图 | 用户明确要求视觉确认时 |
42
+ | **错误检测工具** | | |
43
+ | `check_page_errors` | 检测页面 console 错误和网络失败 | 检查页面是否有 JavaScript 错误 |
44
+ | `get_typescript_diagnostics` | 检测 TypeScript 类型错误 | 检查代码类型错误和警告 |
45
+ | `auto_fix_loop` | 自动检测和修复错误 | 自动修复所有检测到的错误 |
46
+ | **元素分析工具** | | |
47
+ | `pick_element` | 拾取页面元素获取详细信息 | 分析特定元素的信息和样式 |
48
+ | **chrome-devtools** | | |
49
+ | `chrome-devtools `navigate_page` | 打开 URL | 拿到 URL 后立即使用 |
50
+ | `chrome-devtools `list_console_messages` | 检查 console 错误 | 页面加载完成后 |
51
+ | `chrome-devtools `take_snapshot` | 获取页面结构 | 需要分析渲染结果时 |
52
+ | `chrome-devtools `take_screenshot` | 页面截图 | 用户明确要求视觉确认时 |
28
53
 
29
54
  ## 注意
30
55
 
31
56
  - 默认不需要截图,`take_snapshot` 的无障碍树对 AI 已足够
32
57
  - `quick_preview` 已包含 framework 检测,不要再重复调 `get_project_info`
33
58
  - dev server 可以保持运行,不需要每次用完就关闭
59
+ - 使用 `auto_fix_loop` 时需要 Chrome 运行在调试模式(--remote-debugging-port=9222)
60
+ - `pick_element` 支持直接传入 CSS 选择器,或进入交互式拾取模式