@weapp-vite/mcp 1.2.1 → 1.3.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.
package/README.md CHANGED
@@ -35,6 +35,16 @@ const handle = await startWeappViteMcpServer({
35
35
  await handle.close?.()
36
36
  ```
37
37
 
38
+ `streamable-http` 模式会同时暴露 DevTools runtime REST 接口,默认前缀为
39
+ `/api/weapp/devtools`。可以通过 `restEndpoint` 调整,或设为 `false` 关闭:
40
+
41
+ ```ts
42
+ const handle = await startWeappViteMcpServer({
43
+ transport: 'streamable-http',
44
+ restEndpoint: '/api/weapp/devtools',
45
+ })
46
+ ```
47
+
38
48
  ## 主要 Tools
39
49
 
40
50
  - `workspace_catalog`: 输出 `weapp-vite / wevu / wevu-compiler` 目录、版本、脚本
@@ -47,6 +57,50 @@ await handle.close?.()
47
57
  - `compare_weapp_screenshot`: 面向“截图对比 / diff / baseline / 视觉回归”语义,执行 `weapp-vite compare --json`
48
58
  - `run_repo_command`: 执行仓库级命令(`pnpm/node/git/rg`)
49
59
 
60
+ ### DevTools Runtime Tools
61
+
62
+ 这些工具复用 `weapp-ide-cli` 的 automator 会话能力,面向已经能被微信开发者工具打开的小程序项目:
63
+
64
+ - `weapp_devtools_connect`: 确认 DevTools automator 会话可用
65
+ - `weapp_devtools_active_page` / `weapp_devtools_page_stack`: 读取当前页面与页面栈
66
+ - `weapp_devtools_route`: 执行 `navigateTo` / `redirectTo` / `reLaunch` / `switchTab` / `navigateBack`
67
+ - `weapp_devtools_capture`: 截取当前小程序视口
68
+ - `weapp_devtools_host_api`: 调用 `wx.*` API
69
+ - `weapp_devtools_console`: 读取 MCP 会话期间捕获的 console/exception 日志
70
+ - `weapp_runtime_find_node` / `weapp_runtime_find_nodes` / `weapp_runtime_wait_node`: 查询和等待页面元素
71
+ - `weapp_runtime_page_state` / `weapp_runtime_update_page_state` / `weapp_runtime_invoke_page`: 操作页面实例
72
+ - `weapp_runtime_tap_node` / `weapp_runtime_input_node`: 操作页面元素
73
+ - `weapp_runtime_component_state` / `weapp_runtime_update_component_state` / `weapp_runtime_invoke_component`: 操作组件实例
74
+ - `weapp_runtime_find_child` / `weapp_runtime_find_children`: 查询组件内部元素
75
+ - `weapp_runtime_node_markup` / `weapp_runtime_node_styles` / `weapp_runtime_node_attrs` / `weapp_runtime_measure_node`: 读取元素结构与渲染信息
76
+
77
+ 建议调用顺序:先 `weapp_devtools_connect`,再 `weapp_devtools_active_page`,之后再执行 `weapp_devtools_capture` 或 `weapp_runtime_*`。
78
+
79
+ ### DevTools Runtime REST
80
+
81
+ REST 接口和 MCP runtime tools 复用同一个 automator 会话管理器,适合脚本或其他非 MCP 客户端连续操控模拟器:
82
+
83
+ - `POST /api/weapp/devtools/connect`
84
+ - `POST /api/weapp/devtools/route`
85
+ - `GET|POST /api/weapp/devtools/active-page`
86
+ - `GET|POST /api/weapp/devtools/page-stack`
87
+ - `POST /api/weapp/devtools/capture`
88
+ - `POST /api/weapp/devtools/host-api`
89
+ - `GET|DELETE /api/weapp/devtools/console`
90
+ - `DELETE /api/weapp/devtools/session`
91
+
92
+ 示例:
93
+
94
+ ```bash
95
+ curl -X POST http://127.0.0.1:3088/api/weapp/devtools/route \
96
+ -H 'content-type: application/json' \
97
+ -d '{"projectPath":"dist/build/mp-weixin","transition":"reLaunch","path":"pages/index/index"}'
98
+
99
+ curl -X POST http://127.0.0.1:3088/api/weapp/devtools/capture \
100
+ -H 'content-type: application/json' \
101
+ -d '{"projectPath":"dist/build/mp-weixin","outputPath":".tmp/home.png"}'
102
+ ```
103
+
50
104
  ## 主要 Resources
51
105
 
52
106
  - `weapp-vite://workspace/catalog`
@@ -64,6 +118,8 @@ await handle.close?.()
64
118
 
65
119
  - `plan-weapp-vite-change`: 生成 weapp-vite/wevu 改造计划提示词
66
120
  - `debug-wevu-runtime`: 生成 wevu runtime 排查提示词
121
+ - `inspect-mini-program-page`: 连接 DevTools 并检查页面渲染状态
122
+ - `recover-mini-program-connection`: 按固定顺序恢复 automator 连接
67
123
 
68
124
  ## 开发
69
125
 
package/dist/index.d.mts CHANGED
@@ -1,3 +1,4 @@
1
+ import { DevtoolsRuntimeHooks } from '@weapp-vite/devtools-runtime';
1
2
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
3
 
3
4
  declare const MCP_SERVER_NAME = "@weapp-vite/mcp";
@@ -85,14 +86,78 @@ declare function searchTextInDirectory(root: string, query: string, options?: {
85
86
  maxResults?: number;
86
87
  }): Promise<SearchMatch[]>;
87
88
 
89
+ interface MiniProgramElement {
90
+ tagName?: string;
91
+ $?: (selector: string) => Promise<MiniProgramElement | null>;
92
+ $$?: (selector: string) => Promise<MiniProgramElement[]>;
93
+ tap: () => Promise<void>;
94
+ }
95
+ interface MiniProgramPage {
96
+ path: string;
97
+ query?: unknown;
98
+ $: (selector: string) => Promise<MiniProgramElement | null>;
99
+ $$?: (selector: string) => Promise<MiniProgramElement[]>;
100
+ data: (path?: string) => Promise<unknown>;
101
+ size: () => Promise<unknown>;
102
+ scrollTop: () => Promise<unknown>;
103
+ waitFor: (milliseconds: number) => Promise<void>;
104
+ }
105
+ interface MiniProgramLike {
106
+ on: (name: 'console' | 'exception', handler: (payload: unknown) => void) => void;
107
+ off?: (name: 'console' | 'exception', handler: (payload: unknown) => void) => void;
108
+ currentPage: () => Promise<MiniProgramPage>;
109
+ systemInfo: () => Promise<unknown>;
110
+ pageStack: () => Promise<MiniProgramPage[]>;
111
+ navigateTo: (url: string) => Promise<MiniProgramPage>;
112
+ redirectTo: (url: string) => Promise<MiniProgramPage>;
113
+ reLaunch: (url: string) => Promise<MiniProgramPage>;
114
+ switchTab: (url: string) => Promise<MiniProgramPage>;
115
+ navigateBack: () => Promise<MiniProgramPage>;
116
+ screenshot: () => Promise<string | Uint8Array>;
117
+ callWxMethod: (method: string, ...args: unknown[]) => Promise<unknown>;
118
+ }
119
+ interface RuntimeConnectionInput {
120
+ projectPath: string;
121
+ timeout?: number;
122
+ preferOpenedSession?: boolean;
123
+ }
124
+ interface RuntimeConsoleLogEntry {
125
+ level: string;
126
+ message: string;
127
+ timestamp: number;
128
+ raw: unknown;
129
+ }
130
+ declare class RuntimeSessionManager {
131
+ private readonly workspaceRoot;
132
+ private readonly runtimeHooks;
133
+ private readonly logs;
134
+ private readonly attachedSessions;
135
+ private readonly maxLogs;
136
+ constructor(workspaceRoot: string, runtimeHooks?: DevtoolsRuntimeHooks);
137
+ close(input: RuntimeConnectionInput): Promise<void>;
138
+ clearLogs(): void;
139
+ getLogs(): RuntimeConsoleLogEntry[];
140
+ resolveProjectPath(projectPath: string): string;
141
+ resolveWorkspacePath(filePath: string): string;
142
+ withMiniProgram<T>(input: RuntimeConnectionInput, runner: (miniProgram: MiniProgramLike) => Promise<T>): Promise<T>;
143
+ withPage<T>(input: RuntimeConnectionInput, runner: (page: MiniProgramPage, miniProgram: MiniProgramLike) => Promise<T>): Promise<T>;
144
+ private attach;
145
+ private detach;
146
+ private pushLog;
147
+ }
148
+
88
149
  interface CreateServerOptions {
150
+ runtimeHooks?: DevtoolsRuntimeHooks;
89
151
  workspaceRoot?: string;
90
152
  }
91
153
  declare function createWeappViteMcpServer(options?: CreateServerOptions): Promise<{
154
+ runtimeManager: RuntimeSessionManager;
92
155
  server: McpServer;
93
156
  workspaceRoot: string;
94
157
  }>;
95
158
 
159
+ declare const DEFAULT_RUNTIME_REST_ENDPOINT = "/api/weapp/devtools";
160
+
96
161
  declare const DEFAULT_MCP_HOST = "127.0.0.1";
97
162
  declare const DEFAULT_MCP_PORT = 3088;
98
163
  declare const DEFAULT_MCP_ENDPOINT = "/mcp";
@@ -101,6 +166,7 @@ interface StartMcpServerOptions extends CreateServerOptions {
101
166
  host?: string;
102
167
  port?: number;
103
168
  endpoint?: string;
169
+ restEndpoint?: string | false;
104
170
  unref?: boolean;
105
171
  quiet?: boolean;
106
172
  onReady?: (message: string) => void;
@@ -135,5 +201,5 @@ declare function resolveWorkspaceRoot(start?: string): string;
135
201
  declare function assertInsideRoot(root: string, targetPath: string): string;
136
202
  declare function resolveSubPath(root: string, relativePath: string): string;
137
203
 
138
- export { DEFAULT_MAX_FILE_CHARS, DEFAULT_MAX_OUTPUT_CHARS, DEFAULT_MAX_RESULTS, DEFAULT_MCP_ENDPOINT, DEFAULT_MCP_HOST, DEFAULT_MCP_PORT, DEFAULT_TIMEOUT_MS, EXPOSED_PACKAGES, MCP_SERVER_NAME, MCP_SERVER_VERSION, SKIPPED_DIR_NAMES, assertInsideRoot, createWeappViteMcpServer, formatJson, listFilesInDirectory, loadExposedCatalog, loadPackageSummary, normalizeErrorMessage, readFileContent, resolveSubPath, resolveWorkspaceRoot, runCommand, searchTextInDirectory, startStdioServer, startWeappViteMcpServer, toToolError, toToolResult };
204
+ export { DEFAULT_MAX_FILE_CHARS, DEFAULT_MAX_OUTPUT_CHARS, DEFAULT_MAX_RESULTS, DEFAULT_MCP_ENDPOINT, DEFAULT_MCP_HOST, DEFAULT_MCP_PORT, DEFAULT_RUNTIME_REST_ENDPOINT, DEFAULT_TIMEOUT_MS, EXPOSED_PACKAGES, MCP_SERVER_NAME, MCP_SERVER_VERSION, SKIPPED_DIR_NAMES, assertInsideRoot, createWeappViteMcpServer, formatJson, listFilesInDirectory, loadExposedCatalog, loadPackageSummary, normalizeErrorMessage, readFileContent, resolveSubPath, resolveWorkspaceRoot, runCommand, searchTextInDirectory, startStdioServer, startWeappViteMcpServer, toToolError, toToolResult };
139
205
  export type { CommandResult, CreateServerOptions, ExposedPackageId, ExposedPackageSummary, McpServerHandle, SearchMatch, StartMcpServerOptions };
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { DevtoolsRuntimeHooks } from '@weapp-vite/devtools-runtime';
1
2
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
3
 
3
4
  declare const MCP_SERVER_NAME = "@weapp-vite/mcp";
@@ -85,14 +86,78 @@ declare function searchTextInDirectory(root: string, query: string, options?: {
85
86
  maxResults?: number;
86
87
  }): Promise<SearchMatch[]>;
87
88
 
89
+ interface MiniProgramElement {
90
+ tagName?: string;
91
+ $?: (selector: string) => Promise<MiniProgramElement | null>;
92
+ $$?: (selector: string) => Promise<MiniProgramElement[]>;
93
+ tap: () => Promise<void>;
94
+ }
95
+ interface MiniProgramPage {
96
+ path: string;
97
+ query?: unknown;
98
+ $: (selector: string) => Promise<MiniProgramElement | null>;
99
+ $$?: (selector: string) => Promise<MiniProgramElement[]>;
100
+ data: (path?: string) => Promise<unknown>;
101
+ size: () => Promise<unknown>;
102
+ scrollTop: () => Promise<unknown>;
103
+ waitFor: (milliseconds: number) => Promise<void>;
104
+ }
105
+ interface MiniProgramLike {
106
+ on: (name: 'console' | 'exception', handler: (payload: unknown) => void) => void;
107
+ off?: (name: 'console' | 'exception', handler: (payload: unknown) => void) => void;
108
+ currentPage: () => Promise<MiniProgramPage>;
109
+ systemInfo: () => Promise<unknown>;
110
+ pageStack: () => Promise<MiniProgramPage[]>;
111
+ navigateTo: (url: string) => Promise<MiniProgramPage>;
112
+ redirectTo: (url: string) => Promise<MiniProgramPage>;
113
+ reLaunch: (url: string) => Promise<MiniProgramPage>;
114
+ switchTab: (url: string) => Promise<MiniProgramPage>;
115
+ navigateBack: () => Promise<MiniProgramPage>;
116
+ screenshot: () => Promise<string | Uint8Array>;
117
+ callWxMethod: (method: string, ...args: unknown[]) => Promise<unknown>;
118
+ }
119
+ interface RuntimeConnectionInput {
120
+ projectPath: string;
121
+ timeout?: number;
122
+ preferOpenedSession?: boolean;
123
+ }
124
+ interface RuntimeConsoleLogEntry {
125
+ level: string;
126
+ message: string;
127
+ timestamp: number;
128
+ raw: unknown;
129
+ }
130
+ declare class RuntimeSessionManager {
131
+ private readonly workspaceRoot;
132
+ private readonly runtimeHooks;
133
+ private readonly logs;
134
+ private readonly attachedSessions;
135
+ private readonly maxLogs;
136
+ constructor(workspaceRoot: string, runtimeHooks?: DevtoolsRuntimeHooks);
137
+ close(input: RuntimeConnectionInput): Promise<void>;
138
+ clearLogs(): void;
139
+ getLogs(): RuntimeConsoleLogEntry[];
140
+ resolveProjectPath(projectPath: string): string;
141
+ resolveWorkspacePath(filePath: string): string;
142
+ withMiniProgram<T>(input: RuntimeConnectionInput, runner: (miniProgram: MiniProgramLike) => Promise<T>): Promise<T>;
143
+ withPage<T>(input: RuntimeConnectionInput, runner: (page: MiniProgramPage, miniProgram: MiniProgramLike) => Promise<T>): Promise<T>;
144
+ private attach;
145
+ private detach;
146
+ private pushLog;
147
+ }
148
+
88
149
  interface CreateServerOptions {
150
+ runtimeHooks?: DevtoolsRuntimeHooks;
89
151
  workspaceRoot?: string;
90
152
  }
91
153
  declare function createWeappViteMcpServer(options?: CreateServerOptions): Promise<{
154
+ runtimeManager: RuntimeSessionManager;
92
155
  server: McpServer;
93
156
  workspaceRoot: string;
94
157
  }>;
95
158
 
159
+ declare const DEFAULT_RUNTIME_REST_ENDPOINT = "/api/weapp/devtools";
160
+
96
161
  declare const DEFAULT_MCP_HOST = "127.0.0.1";
97
162
  declare const DEFAULT_MCP_PORT = 3088;
98
163
  declare const DEFAULT_MCP_ENDPOINT = "/mcp";
@@ -101,6 +166,7 @@ interface StartMcpServerOptions extends CreateServerOptions {
101
166
  host?: string;
102
167
  port?: number;
103
168
  endpoint?: string;
169
+ restEndpoint?: string | false;
104
170
  unref?: boolean;
105
171
  quiet?: boolean;
106
172
  onReady?: (message: string) => void;
@@ -135,5 +201,5 @@ declare function resolveWorkspaceRoot(start?: string): string;
135
201
  declare function assertInsideRoot(root: string, targetPath: string): string;
136
202
  declare function resolveSubPath(root: string, relativePath: string): string;
137
203
 
138
- export { DEFAULT_MAX_FILE_CHARS, DEFAULT_MAX_OUTPUT_CHARS, DEFAULT_MAX_RESULTS, DEFAULT_MCP_ENDPOINT, DEFAULT_MCP_HOST, DEFAULT_MCP_PORT, DEFAULT_TIMEOUT_MS, EXPOSED_PACKAGES, MCP_SERVER_NAME, MCP_SERVER_VERSION, SKIPPED_DIR_NAMES, assertInsideRoot, createWeappViteMcpServer, formatJson, listFilesInDirectory, loadExposedCatalog, loadPackageSummary, normalizeErrorMessage, readFileContent, resolveSubPath, resolveWorkspaceRoot, runCommand, searchTextInDirectory, startStdioServer, startWeappViteMcpServer, toToolError, toToolResult };
204
+ export { DEFAULT_MAX_FILE_CHARS, DEFAULT_MAX_OUTPUT_CHARS, DEFAULT_MAX_RESULTS, DEFAULT_MCP_ENDPOINT, DEFAULT_MCP_HOST, DEFAULT_MCP_PORT, DEFAULT_RUNTIME_REST_ENDPOINT, DEFAULT_TIMEOUT_MS, EXPOSED_PACKAGES, MCP_SERVER_NAME, MCP_SERVER_VERSION, SKIPPED_DIR_NAMES, assertInsideRoot, createWeappViteMcpServer, formatJson, listFilesInDirectory, loadExposedCatalog, loadPackageSummary, normalizeErrorMessage, readFileContent, resolveSubPath, resolveWorkspaceRoot, runCommand, searchTextInDirectory, startStdioServer, startWeappViteMcpServer, toToolError, toToolResult };
139
205
  export type { CommandResult, CreateServerOptions, ExposedPackageId, ExposedPackageSummary, McpServerHandle, SearchMatch, StartMcpServerOptions };