weixin-devtools-mcp 0.0.1

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,192 @@
1
+ /**
2
+ * Console和Exception监听工具
3
+ * 实现对微信开发者工具console输出和异常的监听和获取
4
+ */
5
+ import { z } from 'zod';
6
+ import { defineTool } from './ToolDefinition.js';
7
+ /**
8
+ * 启动Console监听工具
9
+ */
10
+ export const startConsoleMonitoringTool = defineTool({
11
+ name: 'start_console_monitoring',
12
+ description: '启动对微信开发者工具console和exception的监听',
13
+ schema: z.object({
14
+ clearExisting: z.boolean().optional().default(false).describe('是否清除已有的日志记录'),
15
+ }),
16
+ annotations: {
17
+ audience: ['developers'],
18
+ },
19
+ handler: async (request, response, context) => {
20
+ const { clearExisting } = request.params;
21
+ if (!context.miniProgram) {
22
+ throw new Error('请先连接到微信开发者工具');
23
+ }
24
+ // 清除现有日志
25
+ if (clearExisting) {
26
+ context.consoleStorage.consoleMessages = [];
27
+ context.consoleStorage.exceptionMessages = [];
28
+ }
29
+ // 设置监听状态
30
+ context.consoleStorage.isMonitoring = true;
31
+ context.consoleStorage.startTime = new Date().toISOString();
32
+ try {
33
+ // 监听console事件
34
+ context.miniProgram.on('console', (msg) => {
35
+ const consoleMessage = {
36
+ type: msg.type || 'log',
37
+ args: msg.args || [],
38
+ timestamp: new Date().toISOString(),
39
+ source: 'miniprogram'
40
+ };
41
+ context.consoleStorage.consoleMessages.push(consoleMessage);
42
+ console.log(`[Console ${msg.type}]:`, msg.args);
43
+ });
44
+ // 监听exception事件
45
+ context.miniProgram.on('exception', (err) => {
46
+ const exceptionMessage = {
47
+ message: err.message || String(err),
48
+ stack: err.stack,
49
+ timestamp: new Date().toISOString(),
50
+ source: 'miniprogram'
51
+ };
52
+ context.consoleStorage.exceptionMessages.push(exceptionMessage);
53
+ console.log(`[Exception]:`, err.message, err.stack);
54
+ });
55
+ response.appendResponseLine('Console监听已启动');
56
+ response.appendResponseLine(`监听开始时间: ${context.consoleStorage.startTime}`);
57
+ response.appendResponseLine(`清除历史记录: ${clearExisting ? '是' : '否'}`);
58
+ }
59
+ catch (error) {
60
+ const errorMessage = error instanceof Error ? error.message : String(error);
61
+ throw new Error(`启动Console监听失败: ${errorMessage}`);
62
+ }
63
+ },
64
+ });
65
+ /**
66
+ * 停止Console监听工具
67
+ */
68
+ export const stopConsoleMonitoringTool = defineTool({
69
+ name: 'stop_console_monitoring',
70
+ description: '停止对微信开发者工具console和exception的监听',
71
+ schema: z.object({}),
72
+ annotations: {
73
+ audience: ['developers'],
74
+ },
75
+ handler: async (request, response, context) => {
76
+ if (!context.miniProgram) {
77
+ throw new Error('请先连接到微信开发者工具');
78
+ }
79
+ try {
80
+ // 移除所有监听器
81
+ context.miniProgram.removeAllListeners('console');
82
+ context.miniProgram.removeAllListeners('exception');
83
+ // 更新监听状态
84
+ const wasMonitoring = context.consoleStorage.isMonitoring;
85
+ context.consoleStorage.isMonitoring = false;
86
+ response.appendResponseLine(wasMonitoring ? 'Console监听已停止' : 'Console监听未在运行');
87
+ response.appendResponseLine(`监听期间收集到 ${context.consoleStorage.consoleMessages.length} 条console日志`);
88
+ response.appendResponseLine(`监听期间收集到 ${context.consoleStorage.exceptionMessages.length} 条exception记录`);
89
+ }
90
+ catch (error) {
91
+ const errorMessage = error instanceof Error ? error.message : String(error);
92
+ throw new Error(`停止Console监听失败: ${errorMessage}`);
93
+ }
94
+ },
95
+ });
96
+ /**
97
+ * 获取Console日志工具
98
+ */
99
+ export const getConsoleTool = defineTool({
100
+ name: 'get_console',
101
+ description: '获取收集到的console日志和exception异常信息',
102
+ schema: z.object({
103
+ type: z.enum(['all', 'console', 'exception']).optional().default('all').describe('获取的数据类型'),
104
+ limit: z.number().optional().default(50).describe('限制返回条数'),
105
+ since: z.string().optional().describe('获取指定时间之后的记录,格式:ISO 8601'),
106
+ }),
107
+ annotations: {
108
+ audience: ['developers'],
109
+ },
110
+ handler: async (request, response, context) => {
111
+ const { type, limit, since } = request.params;
112
+ if (!context.consoleStorage) {
113
+ throw new Error('Console存储未初始化');
114
+ }
115
+ const sinceTime = since ? new Date(since) : null;
116
+ // 过滤函数
117
+ const filterByTime = (item) => {
118
+ if (!sinceTime)
119
+ return true;
120
+ return new Date(item.timestamp) >= sinceTime;
121
+ };
122
+ let result = {};
123
+ // 根据类型获取数据
124
+ if (type === 'all' || type === 'console') {
125
+ const consoleMessages = context.consoleStorage.consoleMessages
126
+ .filter(filterByTime)
127
+ .slice(-limit);
128
+ result.consoleMessages = consoleMessages;
129
+ }
130
+ if (type === 'all' || type === 'exception') {
131
+ const exceptionMessages = context.consoleStorage.exceptionMessages
132
+ .filter(filterByTime)
133
+ .slice(-limit);
134
+ result.exceptionMessages = exceptionMessages;
135
+ }
136
+ // 生成响应
137
+ response.appendResponseLine('=== Console数据获取结果 ===');
138
+ response.appendResponseLine(`监听状态: ${context.consoleStorage.isMonitoring ? '运行中' : '已停止'}`);
139
+ response.appendResponseLine(`监听开始时间: ${context.consoleStorage.startTime || '未设置'}`);
140
+ if (result.consoleMessages) {
141
+ response.appendResponseLine(`\n--- Console日志 (${result.consoleMessages.length} 条) ---`);
142
+ result.consoleMessages.forEach((msg, index) => {
143
+ response.appendResponseLine(`${index + 1}. [${msg.type}] ${msg.timestamp}`);
144
+ response.appendResponseLine(` 内容: ${JSON.stringify(msg.args)}`);
145
+ });
146
+ }
147
+ if (result.exceptionMessages) {
148
+ response.appendResponseLine(`\n--- Exception异常 (${result.exceptionMessages.length} 条) ---`);
149
+ result.exceptionMessages.forEach((err, index) => {
150
+ response.appendResponseLine(`${index + 1}. ${err.timestamp}`);
151
+ response.appendResponseLine(` 消息: ${err.message}`);
152
+ if (err.stack) {
153
+ response.appendResponseLine(` 堆栈: ${err.stack.split('\n')[0]}...`);
154
+ }
155
+ });
156
+ }
157
+ response.appendResponseLine('\n=== 获取完成 ===');
158
+ },
159
+ });
160
+ /**
161
+ * 清除Console日志工具
162
+ */
163
+ export const clearConsoleTool = defineTool({
164
+ name: 'clear_console',
165
+ description: '清除已收集的console日志和exception异常信息',
166
+ schema: z.object({
167
+ type: z.enum(['all', 'console', 'exception']).optional().default('all').describe('清除的数据类型'),
168
+ }),
169
+ annotations: {
170
+ audience: ['developers'],
171
+ },
172
+ handler: async (request, response, context) => {
173
+ const { type } = request.params;
174
+ if (!context.consoleStorage) {
175
+ throw new Error('Console存储未初始化');
176
+ }
177
+ let clearedConsole = 0;
178
+ let clearedException = 0;
179
+ // 根据类型清除数据
180
+ if (type === 'all' || type === 'console') {
181
+ clearedConsole = context.consoleStorage.consoleMessages.length;
182
+ context.consoleStorage.consoleMessages = [];
183
+ }
184
+ if (type === 'all' || type === 'exception') {
185
+ clearedException = context.consoleStorage.exceptionMessages.length;
186
+ context.consoleStorage.exceptionMessages = [];
187
+ }
188
+ response.appendResponseLine('Console数据清除完成');
189
+ response.appendResponseLine(`清除Console日志: ${clearedConsole} 条`);
190
+ response.appendResponseLine(`清除Exception异常: ${clearedException} 条`);
191
+ },
192
+ });
@@ -0,0 +1,348 @@
1
+ /**
2
+ * 诊断工具
3
+ * 帮助用户调试连接和配置问题
4
+ */
5
+ import { z } from 'zod';
6
+ import { defineTool } from './ToolDefinition.js';
7
+ import { existsSync } from 'fs';
8
+ import { resolve, isAbsolute } from 'path';
9
+ /**
10
+ * 诊断连接问题工具
11
+ */
12
+ export const diagnoseConnectionTool = defineTool({
13
+ name: 'diagnose_connection',
14
+ description: '诊断微信开发者工具连接问题,检查配置和环境',
15
+ schema: z.object({
16
+ projectPath: z.string().describe('要检查的小程序项目路径'),
17
+ verbose: z.boolean().optional().default(false).describe('是否输出详细诊断信息'),
18
+ }),
19
+ annotations: {
20
+ audience: ['developers'],
21
+ },
22
+ handler: async (request, response, context) => {
23
+ const { projectPath, verbose } = request.params;
24
+ response.appendResponseLine('🔍 开始诊断微信开发者工具连接问题...');
25
+ response.appendResponseLine('');
26
+ // 1. 检查参数有效性
27
+ response.appendResponseLine('📋 1. 参数检查');
28
+ if (!projectPath || typeof projectPath !== 'string') {
29
+ response.appendResponseLine('❌ projectPath 参数无效或缺失');
30
+ response.appendResponseLine(' 修复建议: 确保传递有效的字符串路径');
31
+ return;
32
+ }
33
+ response.appendResponseLine(`✅ projectPath 参数正常: ${projectPath}`);
34
+ // 2. 路径解析检查
35
+ response.appendResponseLine('');
36
+ response.appendResponseLine('📁 2. 路径解析检查');
37
+ let resolvedPath = projectPath;
38
+ if (projectPath.startsWith('@playground/')) {
39
+ const relativePath = projectPath.replace('@playground/', 'playground/');
40
+ resolvedPath = resolve(process.cwd(), relativePath);
41
+ response.appendResponseLine(`🔄 检测到 @playground/ 格式路径`);
42
+ response.appendResponseLine(` 原始路径: ${projectPath}`);
43
+ response.appendResponseLine(` 解析后路径: ${resolvedPath}`);
44
+ }
45
+ else if (!isAbsolute(projectPath)) {
46
+ resolvedPath = resolve(process.cwd(), projectPath);
47
+ response.appendResponseLine(`🔄 检测到相对路径,转换为绝对路径`);
48
+ response.appendResponseLine(` 原始路径: ${projectPath}`);
49
+ response.appendResponseLine(` 解析后路径: ${resolvedPath}`);
50
+ }
51
+ else {
52
+ response.appendResponseLine(`✅ 已是绝对路径: ${resolvedPath}`);
53
+ }
54
+ // 3. 路径存在性检查
55
+ response.appendResponseLine('');
56
+ response.appendResponseLine('🗂️ 3. 路径存在性检查');
57
+ if (!existsSync(resolvedPath)) {
58
+ response.appendResponseLine(`❌ 项目路径不存在: ${resolvedPath}`);
59
+ response.appendResponseLine(' 修复建议:');
60
+ response.appendResponseLine(' - 检查路径是否拼写正确');
61
+ response.appendResponseLine(' - 确保项目目录已创建');
62
+ response.appendResponseLine(' - 使用绝对路径避免相对路径问题');
63
+ return;
64
+ }
65
+ response.appendResponseLine(`✅ 项目路径存在: ${resolvedPath}`);
66
+ // 4. 小程序项目结构检查
67
+ response.appendResponseLine('');
68
+ response.appendResponseLine('📦 4. 小程序项目结构检查');
69
+ const appJsonPath = resolve(resolvedPath, 'app.json');
70
+ const projectConfigPath = resolve(resolvedPath, 'project.config.json');
71
+ const hasAppJson = existsSync(appJsonPath);
72
+ const hasProjectConfig = existsSync(projectConfigPath);
73
+ if (!hasAppJson) {
74
+ response.appendResponseLine(`❌ 缺少 app.json 文件: ${appJsonPath}`);
75
+ }
76
+ else {
77
+ response.appendResponseLine(`✅ 找到 app.json 文件: ${appJsonPath}`);
78
+ }
79
+ if (!hasProjectConfig) {
80
+ response.appendResponseLine(`⚠️ 缺少 project.config.json 文件: ${projectConfigPath}`);
81
+ response.appendResponseLine(' 这可能不影响自动化,但建议配置该文件');
82
+ }
83
+ else {
84
+ response.appendResponseLine(`✅ 找到 project.config.json 文件: ${projectConfigPath}`);
85
+ }
86
+ if (!hasAppJson) {
87
+ response.appendResponseLine('');
88
+ response.appendResponseLine('❌ 项目结构不完整,这不是一个有效的小程序项目');
89
+ response.appendResponseLine(' 修复建议:');
90
+ response.appendResponseLine(' - 确保指向正确的小程序项目根目录');
91
+ response.appendResponseLine(' - 小程序项目必须包含 app.json 文件');
92
+ return;
93
+ }
94
+ // 5. 连接状态检查
95
+ response.appendResponseLine('');
96
+ response.appendResponseLine('🔗 5. 当前连接状态检查');
97
+ if (context.miniProgram) {
98
+ response.appendResponseLine('✅ 已连接到微信开发者工具');
99
+ if (context.currentPage) {
100
+ try {
101
+ const pagePath = await context.currentPage.path;
102
+ response.appendResponseLine(` 当前页面: ${pagePath}`);
103
+ }
104
+ catch (error) {
105
+ response.appendResponseLine('⚠️ 获取当前页面信息失败');
106
+ }
107
+ }
108
+ else {
109
+ response.appendResponseLine('⚠️ 已连接但无当前页面信息');
110
+ }
111
+ }
112
+ else {
113
+ response.appendResponseLine('❌ 未连接到微信开发者工具');
114
+ }
115
+ // 6. 详细信息输出(如果启用verbose)
116
+ if (verbose) {
117
+ response.appendResponseLine('');
118
+ response.appendResponseLine('🔧 6. 详细诊断信息');
119
+ response.appendResponseLine(` 当前工作目录: ${process.cwd()}`);
120
+ response.appendResponseLine(` 元素映射大小: ${context.elementMap.size}`);
121
+ response.appendResponseLine(` Console监听状态: ${context.consoleStorage.isMonitoring ? '已启动' : '未启动'}`);
122
+ response.appendResponseLine(` Console消息数量: ${context.consoleStorage.consoleMessages.length}`);
123
+ response.appendResponseLine(` 异常消息数量: ${context.consoleStorage.exceptionMessages.length}`);
124
+ }
125
+ // 7. 总结和建议
126
+ response.appendResponseLine('');
127
+ response.appendResponseLine('📝 诊断总结');
128
+ if (hasAppJson && existsSync(resolvedPath)) {
129
+ response.appendResponseLine('✅ 项目配置检查通过,可以尝试连接');
130
+ response.appendResponseLine('');
131
+ response.appendResponseLine('💡 建议的连接命令:');
132
+ response.appendResponseLine(`connect_devtools(projectPath: "${resolvedPath}")`);
133
+ }
134
+ else {
135
+ response.appendResponseLine('❌ 发现配置问题,请根据上述建议修复后重试');
136
+ }
137
+ // 8. 常见问题解决方案
138
+ response.appendResponseLine('');
139
+ response.appendResponseLine('🛠️ 常见问题解决方案');
140
+ response.appendResponseLine('1. 路径包含"undefined": 确保传递了有效的projectPath参数');
141
+ response.appendResponseLine('2. 项目路径不存在: 检查路径拼写和目录是否已创建');
142
+ response.appendResponseLine('3. 连接超时: 确保微信开发者工具已打开并启用自动化功能');
143
+ response.appendResponseLine('4. 权限问题: 在开发者工具中开启CLI/HTTP调用权限');
144
+ response.appendResponseLine('5. 端口冲突: 尝试指定不同的端口号');
145
+ },
146
+ });
147
+ /**
148
+ * 页面元素调试工具
149
+ */
150
+ export const debugPageElementsTool = defineTool({
151
+ name: 'debug_page_elements',
152
+ description: '调试页面元素获取问题,测试不同的选择器策略',
153
+ schema: z.object({
154
+ testAllStrategies: z.boolean().optional().default(true).describe('是否测试所有选择器策略'),
155
+ customSelector: z.string().optional().describe('自定义选择器进行测试'),
156
+ }),
157
+ annotations: {
158
+ audience: ['developers'],
159
+ },
160
+ handler: async (request, response, context) => {
161
+ const { testAllStrategies, customSelector } = request.params;
162
+ if (!context.currentPage) {
163
+ throw new Error('请先连接到微信开发者工具并获取当前页面');
164
+ }
165
+ response.appendResponseLine('🔍 开始调试页面元素获取...');
166
+ response.appendResponseLine('');
167
+ const page = context.currentPage;
168
+ try {
169
+ // 获取页面基本信息
170
+ response.appendResponseLine('📱 页面基本信息');
171
+ try {
172
+ const pagePath = await page.path;
173
+ response.appendResponseLine(` 页面路径: ${pagePath}`);
174
+ }
175
+ catch (error) {
176
+ response.appendResponseLine(` 页面路径获取失败: ${error}`);
177
+ }
178
+ // 等待页面加载
179
+ response.appendResponseLine('');
180
+ response.appendResponseLine('⏱️ 等待页面加载...');
181
+ await new Promise(resolve => setTimeout(resolve, 1000));
182
+ response.appendResponseLine(' 页面加载等待完成');
183
+ if (testAllStrategies) {
184
+ response.appendResponseLine('');
185
+ response.appendResponseLine('🧪 测试各种选择器策略');
186
+ // 策略1: 通用选择器
187
+ response.appendResponseLine('');
188
+ response.appendResponseLine('策略1: 通用选择器');
189
+ const universalSelectors = ['*', 'body *', 'html *'];
190
+ for (const selector of universalSelectors) {
191
+ try {
192
+ const elements = await page.$$(selector);
193
+ response.appendResponseLine(` ${selector}: ${elements.length} 个元素`);
194
+ }
195
+ catch (error) {
196
+ response.appendResponseLine(` ${selector}: 失败 - ${error instanceof Error ? error.message : String(error)}`);
197
+ }
198
+ }
199
+ // 策略2: 小程序组件选择器
200
+ response.appendResponseLine('');
201
+ response.appendResponseLine('策略2: 小程序组件选择器');
202
+ const miniProgramSelectors = [
203
+ 'view', 'text', 'button', 'image', 'input', 'textarea',
204
+ 'picker', 'switch', 'slider', 'scroll-view', 'swiper',
205
+ 'icon', 'rich-text', 'progress', 'navigator', 'form',
206
+ 'checkbox', 'radio', 'cover-view', 'cover-image'
207
+ ];
208
+ let totalElements = 0;
209
+ for (const selector of miniProgramSelectors) {
210
+ try {
211
+ const elements = await page.$$(selector);
212
+ if (elements.length > 0) {
213
+ response.appendResponseLine(` ${selector}: ${elements.length} 个元素`);
214
+ totalElements += elements.length;
215
+ }
216
+ }
217
+ catch (error) {
218
+ response.appendResponseLine(` ${selector}: 失败 - ${error instanceof Error ? error.message : String(error)}`);
219
+ }
220
+ }
221
+ response.appendResponseLine(` 小程序组件总计: ${totalElements} 个元素`);
222
+ // 策略3: 层级选择器
223
+ response.appendResponseLine('');
224
+ response.appendResponseLine('策略3: 层级选择器');
225
+ const hierarchySelectors = ['page > *', 'page view', 'page text', 'page button'];
226
+ for (const selector of hierarchySelectors) {
227
+ try {
228
+ const elements = await page.$$(selector);
229
+ response.appendResponseLine(` ${selector}: ${elements.length} 个元素`);
230
+ }
231
+ catch (error) {
232
+ response.appendResponseLine(` ${selector}: 失败 - ${error instanceof Error ? error.message : String(error)}`);
233
+ }
234
+ }
235
+ // 策略4: 属性选择器
236
+ response.appendResponseLine('');
237
+ response.appendResponseLine('策略4: 属性选择器');
238
+ const attributeSelectors = ['[class]', '[id]', '[data-*]', '[wx:*]'];
239
+ for (const selector of attributeSelectors) {
240
+ try {
241
+ const elements = await page.$$(selector);
242
+ response.appendResponseLine(` ${selector}: ${elements.length} 个元素`);
243
+ }
244
+ catch (error) {
245
+ response.appendResponseLine(` ${selector}: 失败 - ${error instanceof Error ? error.message : String(error)}`);
246
+ }
247
+ }
248
+ }
249
+ // 自定义选择器测试
250
+ if (customSelector) {
251
+ response.appendResponseLine('');
252
+ response.appendResponseLine('🎯 自定义选择器测试');
253
+ try {
254
+ const elements = await page.$$(customSelector);
255
+ response.appendResponseLine(` ${customSelector}: ${elements.length} 个元素`);
256
+ if (elements.length > 0 && elements.length <= 5) {
257
+ response.appendResponseLine(' 元素详细信息:');
258
+ for (let i = 0; i < elements.length; i++) {
259
+ const element = elements[i];
260
+ try {
261
+ const tagName = element.tagName || 'unknown';
262
+ const text = await element.text().catch(() => '');
263
+ response.appendResponseLine(` [${i}] ${tagName}${text ? ` - "${text.substring(0, 50)}"` : ''}`);
264
+ }
265
+ catch (error) {
266
+ response.appendResponseLine(` [${i}] 元素信息获取失败`);
267
+ }
268
+ }
269
+ }
270
+ }
271
+ catch (error) {
272
+ response.appendResponseLine(` ${customSelector}: 失败 - ${error instanceof Error ? error.message : String(error)}`);
273
+ }
274
+ }
275
+ // 诊断建议
276
+ response.appendResponseLine('');
277
+ response.appendResponseLine('💡 诊断建议');
278
+ response.appendResponseLine('1. 如果所有选择器都返回0个元素,请检查:');
279
+ response.appendResponseLine(' - 页面是否已完全加载');
280
+ response.appendResponseLine(' - 是否在正确的页面上');
281
+ response.appendResponseLine(' - 微信开发者工具的自动化权限是否正确设置');
282
+ response.appendResponseLine('');
283
+ response.appendResponseLine('2. 如果只有特定组件有效,建议:');
284
+ response.appendResponseLine(' - 使用具体的组件选择器而不是通用选择器');
285
+ response.appendResponseLine(' - 组合使用多个选择器获取完整的元素列表');
286
+ response.appendResponseLine('');
287
+ response.appendResponseLine('3. 优化建议:');
288
+ response.appendResponseLine(' - 为关键元素添加class或id属性');
289
+ response.appendResponseLine(' - 使用data-testid属性便于自动化测试');
290
+ }
291
+ catch (error) {
292
+ const errorMessage = error instanceof Error ? error.message : String(error);
293
+ response.appendResponseLine(`调试过程中发生错误: ${errorMessage}`);
294
+ throw error;
295
+ }
296
+ },
297
+ });
298
+ /**
299
+ * 环境检查工具
300
+ */
301
+ export const checkEnvironmentTool = defineTool({
302
+ name: 'check_environment',
303
+ description: '检查微信开发者工具自动化环境配置',
304
+ schema: z.object({}),
305
+ annotations: {
306
+ audience: ['developers'],
307
+ },
308
+ handler: async (request, response, context) => {
309
+ response.appendResponseLine('🌍 检查微信开发者工具自动化环境...');
310
+ response.appendResponseLine('');
311
+ // 检查依赖
312
+ response.appendResponseLine('📦 依赖检查');
313
+ try {
314
+ const automator = await import('miniprogram-automator');
315
+ response.appendResponseLine('✅ miniprogram-automator 模块加载成功');
316
+ }
317
+ catch (error) {
318
+ response.appendResponseLine('❌ miniprogram-automator 模块加载失败');
319
+ response.appendResponseLine(` 错误: ${error instanceof Error ? error.message : String(error)}`);
320
+ response.appendResponseLine(' 修复建议: npm install miniprogram-automator');
321
+ return;
322
+ }
323
+ // 检查MCP服务器配置
324
+ response.appendResponseLine('');
325
+ response.appendResponseLine('⚙️ MCP服务器配置建议');
326
+ response.appendResponseLine('1. 原版服务器 (兼容性):');
327
+ response.appendResponseLine(' "command": "/path/to/weixin-devtools-mcp/build/index.js"');
328
+ response.appendResponseLine('');
329
+ response.appendResponseLine('2. 新版模块化服务器 (推荐):');
330
+ response.appendResponseLine(' "command": "/path/to/weixin-devtools-mcp/build/server.js"');
331
+ response.appendResponseLine('');
332
+ response.appendResponseLine('💡 配置文件位置:');
333
+ response.appendResponseLine(' macOS: ~/Library/Application Support/Claude/claude_desktop_config.json');
334
+ response.appendResponseLine(' Windows: %APPDATA%/Claude/claude_desktop_config.json');
335
+ // 检查工具可用性
336
+ response.appendResponseLine('');
337
+ response.appendResponseLine('🔧 可用工具统计');
338
+ response.appendResponseLine(` 总工具数量: ${context ? 'MCP服务器已初始化' : 'MCP服务器未初始化'}`);
339
+ if (context.miniProgram) {
340
+ response.appendResponseLine(' 连接状态: 已连接');
341
+ }
342
+ else {
343
+ response.appendResponseLine(' 连接状态: 未连接');
344
+ }
345
+ response.appendResponseLine('');
346
+ response.appendResponseLine('✅ 环境检查完成');
347
+ },
348
+ });
@@ -0,0 +1,80 @@
1
+ /**
2
+ * 工具模块导出
3
+ * 统一导出所有工具定义
4
+ */
5
+ // 导入各个模块的工具
6
+ import { connectDevtoolsTool, connectDevtoolsEnhancedTool, getCurrentPageTool } from './connection.js';
7
+ import { getPageSnapshotTool } from './snapshot.js';
8
+ import { clickTool, inputTextTool, getValueTool, setFormControlTool, selectPickerTool, toggleSwitchTool, setSliderTool } from './input.js';
9
+ import { screenshotTool } from './screenshot.js';
10
+ import { querySelectorTool, waitForTool } from './page.js';
11
+ import { assertExistsTool, assertVisibleTool, assertTextTool, assertAttributeTool, assertStateTool } from './assert.js';
12
+ import { navigateToTool, navigateBackTool, switchTabTool, reLaunchTool, getPageInfoTool, redirectToTool } from './navigate.js';
13
+ import { startConsoleMonitoringTool, stopConsoleMonitoringTool, getConsoleTool, clearConsoleTool } from './console.js';
14
+ import { startNetworkMonitoringTool, stopNetworkMonitoringTool, getNetworkRequestsTool, clearNetworkRequestsTool, diagnoseInterceptorTool } from './network.js';
15
+ import { diagnoseConnectionTool, checkEnvironmentTool, debugPageElementsTool } from './diagnose.js';
16
+ /**
17
+ * 所有可用工具的列表
18
+ */
19
+ export const allTools = [
20
+ // 连接管理工具
21
+ connectDevtoolsTool, // 传统连接方式(兼容性)
22
+ connectDevtoolsEnhancedTool, // 智能连接方式(推荐)
23
+ getCurrentPageTool,
24
+ // 页面快照工具
25
+ getPageSnapshotTool,
26
+ // 页面查询和等待工具
27
+ querySelectorTool,
28
+ waitForTool,
29
+ // 输入交互工具
30
+ clickTool,
31
+ inputTextTool,
32
+ getValueTool,
33
+ setFormControlTool,
34
+ selectPickerTool,
35
+ toggleSwitchTool,
36
+ setSliderTool,
37
+ // 断言验证工具
38
+ assertExistsTool,
39
+ assertVisibleTool,
40
+ assertTextTool,
41
+ assertAttributeTool,
42
+ assertStateTool,
43
+ // 页面导航工具
44
+ navigateToTool,
45
+ navigateBackTool,
46
+ switchTabTool,
47
+ reLaunchTool,
48
+ getPageInfoTool,
49
+ redirectToTool,
50
+ // 调试工具
51
+ screenshotTool,
52
+ startConsoleMonitoringTool,
53
+ stopConsoleMonitoringTool,
54
+ getConsoleTool,
55
+ clearConsoleTool,
56
+ // 网络监控工具
57
+ startNetworkMonitoringTool,
58
+ stopNetworkMonitoringTool,
59
+ getNetworkRequestsTool,
60
+ clearNetworkRequestsTool,
61
+ diagnoseInterceptorTool,
62
+ // 诊断工具
63
+ diagnoseConnectionTool,
64
+ checkEnvironmentTool,
65
+ debugPageElementsTool,
66
+ ];
67
+ /**
68
+ * 按名称获取工具
69
+ */
70
+ export function getToolByName(name) {
71
+ return allTools.find(tool => tool.name === name);
72
+ }
73
+ /**
74
+ * 获取所有工具名称
75
+ */
76
+ export function getAllToolNames() {
77
+ return allTools.map(tool => tool.name);
78
+ }
79
+ // 重新导出工具定义相关类型和函数
80
+ export * from './ToolDefinition.js';