Local MCP server for AI-assisted mobile testing on real Android, iOS, and HarmonyOS devices.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · http counts 31 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
agent_health
-
cancel_run
-
config_status
-
doctor
-
exploration_ai_act
-
exploration_ask_about_screen
-
exploration_end
-
exploration_get_page_summary
-
exploration_screenshot
-
exploration_start
-
exploration_type
-
exploration_wait
-
export_recorded_rules
-
get_network_mock_status
-
get_root_ca_cert
-
get_visual_flow_ir_rules
-
install_app
-
list_devices
-
read_report
-
run_flow
-
save_report
-
start_agent
-
start_ios_wda
-
start_network_mocks
-
start_recording
-
stop_agent
-
stop_network_mocks
-
stop_recording
-
update_network_mock_rules
-
validate_visual_flow
-
watch_run
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 407750f · analyzer v33 · 3d ago
skills & prompt files 1
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 181
filesystem 42
- fs zifengjiang-Preflight-407750f/src/application/task/TaskApplicationService.ts :7
import { readFile, rm } from "node:fs/promises"; - fs zifengjiang-Preflight-407750f/src/infrastructure/airtest/AirtestRuntime.ts :3
import { mkdtemp, mkdir, readFile, writeFile, stat } from "node:fs/promises"; - fs zifengjiang-Preflight-407750f/src/infrastructure/app-package/AppPackageUrlCache.ts :2
import { access, mkdir, readFile, rename, stat, writeFile } from "node:fs/promises"; - fs zifengjiang-Preflight-407750f/src/infrastructure/cache/DirCapacityWatchdog.ts :1
import { readdir, rm, stat } from "node:fs/promises"; - fs zifengjiang-Preflight-407750f/src/infrastructure/config/agentConfigFile.ts :1
import fs from "node:fs"; - fs zifengjiang-Preflight-407750f/src/infrastructure/ios/IOSWdaWatchdog.ts :1
import { mkdir, readFile, writeFile } from "node:fs/promises"; - fs zifengjiang-Preflight-407750f/src/infrastructure/midscene/DebugRuntimeImpl.ts :5
import { readFile } from "node:fs/promises"; - fs zifengjiang-Preflight-407750f/src/infrastructure/midscene/MidsceneRuntimeReal.ts :1
import { mkdir, readFile, readdir, stat, writeFile } from "node:fs/promises"; - fs zifengjiang-Preflight-407750f/src/infrastructure/midscene/executionDumpWatcher.ts :1
import { mkdirSync, watch, type FSWatcher } from "node:fs"; - fs zifengjiang-Preflight-407750f/src/infrastructure/midscene/videoRecorder.ts :2
import { mkdir, rm, stat, writeFile } from "node:fs/promises"; - fs zifengjiang-Preflight-407750f/src/infrastructure/midscene/zipReportDir.ts :3
import { mkdtemp, readFile, rm } from "node:fs/promises"; - fs zifengjiang-Preflight-407750f/src/infrastructure/transport/http/CallbackOutboxStore.ts :1
import { mkdir, readdir, readFile, rm, writeFile } from "node:fs/promises"; - fs zifengjiang-Preflight-407750f/src/mcp/agentRuntime.ts :2
import { createWriteStream, type WriteStream } from "node:fs"; - fs zifengjiang-Preflight-407750f/src/mcp/cli.ts :3
import { access } from "node:fs/promises"; - fs zifengjiang-Preflight-407750f/src/mcp/doctor.ts :4
import { readFile } from "node:fs/promises"; - fs zifengjiang-Preflight-407750f/src/mcp/evidence.ts :1
import { mkdir, writeFile } from "node:fs/promises"; - fs zifengjiang-Preflight-407750f/src/mcp/exploration/sessionManager.ts :1
import { mkdir, readFile, writeFile, unlink } from "node:fs/promises"; - fs zifengjiang-Preflight-407750f/src/mcp/exploration/tools-session.ts :1
import { readFile } from "node:fs/promises"; - fs zifengjiang-Preflight-407750f/src/mcp/live/dumpTimeline.ts :1
import { readdir, readFile, stat } from "node:fs/promises"; - fs zifengjiang-Preflight-407750f/src/mcp/live/evidenceAssets.ts :1
import { mkdir, copyFile, readdir, stat } from "node:fs/promises"; - fs zifengjiang-Preflight-407750f/src/mcp/live/evidenceCard.ts :3
import { existsSync } from "node:fs"; - fs zifengjiang-Preflight-407750f/src/mcp/liveViewer.ts :2
import { createReadStream } from "node:fs"; - fs zifengjiang-Preflight-407750f/src/mcp/network-mocks/NetworkMockServer.ts :10
import { writeFileSync, unlinkSync, readFileSync, mkdirSync } from "node:fs"; - fs zifengjiang-Preflight-407750f/src/mcp/network-mocks/NetworkMockService.ts :202
await fs.mkdir(profileDir, { recursive: true }); - fs zifengjiang-Preflight-407750f/src/mcp/network-mocks/WireGuardMockServer.ts :3
import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync, chmodSync } from "node:fs"; - fs zifengjiang-Preflight-407750f/src/mcp/reportReader.ts :1
import { readFile, readdir } from "node:fs/promises"; - fs zifengjiang-Preflight-407750f/src/mcp/runManager.ts :1
import { mkdir, appendFile, writeFile } from "node:fs/promises"; - fs zifengjiang-Preflight-407750f/src/mcp/runtimeInstall.ts :2
import { access, cp, mkdir, rm, writeFile } from "node:fs/promises"; - fs zifengjiang-Preflight-407750f/src/mcp/server.ts :20
import { readFile } from "node:fs/promises"; - fs zifengjiang-Preflight-407750f/src/mcp/setup.ts :1
import { mkdir, readFile, writeFile } from "node:fs/promises"; - fs zifengjiang-Preflight-407750f/src/mcp/userConfig.ts :1
import { readFile } from "node:fs/promises"; - fs (weak) zifengjiang-Preflight-407750f/src/tests/dumpTimeline.test.ts :3
import { mkdtempSync, rmSync, writeFileSync } from "node:fs"; - fs (weak) zifengjiang-Preflight-407750f/src/tests/evidence.test.ts :3
import { mkdtemp, mkdir, writeFile, readFile, readdir, access, rm } from "node:fs/promises"; - fs (weak) zifengjiang-Preflight-407750f/src/tests/evidenceAssets.test.ts :3
import { mkdtemp, mkdir, writeFile, readdir, readFile, utimes, access } from "node:fs/promises"; - fs (weak) zifengjiang-Preflight-407750f/src/tests/evidenceCard.test.ts :4
import { mkdtemp, mkdir, writeFile } from "node:fs/promises"; - fs (weak) zifengjiang-Preflight-407750f/src/tests/networkMockHandler.test.ts :131
'() => ({ body: String(require("fs").readFileSync("/etc/passwd")) })', - fs (weak) zifengjiang-Preflight-407750f/src/tests/networkMockHardening.test.ts :3
import { statSync } from "node:fs"; - fs (weak) zifengjiang-Preflight-407750f/src/tests/runtimeInstall.test.ts :1
import { mkdir, mkdtemp, readFile, writeFile } from "node:fs/promises"; - fs zifengjiang-Preflight-407750f/src/utils/appPackageLocalPath.ts :1
import { access, mkdir, rm, writeFile } from "node:fs/promises"; - fs zifengjiang-Preflight-407750f/src/utils/iosAgentDebugDevice.ts :1
import { readFile } from "node:fs/promises"; - fs zifengjiang-Preflight-407750f/src/utils/seedMidsceneTaskCache.ts :1
import { existsSync, mkdirSync, writeFileSync } from "node:fs"; - fs zifengjiang-Preflight-407750f/src/utils/wrapper/resolveTaskRunnerImport.ts :1
import { existsSync } from 'node:fs'
shell / exec 19
- shell zifengjiang-Preflight-407750f/src/infrastructure/airtest/AirtestRuntime.ts :1
import { execFile } from "node:child_process"; - shell zifengjiang-Preflight-407750f/src/infrastructure/midscene/videoRecorder.ts :1
import { spawn, type ChildProcess } from "node:child_process"; - shell zifengjiang-Preflight-407750f/src/infrastructure/midscene/zipReportDir.ts :1
import { execFile } from "node:child_process"; - shell zifengjiang-Preflight-407750f/src/infrastructure/system/CommandRunner.ts :1
import { spawn } from "node:child_process"; - shell zifengjiang-Preflight-407750f/src/mcp/agentRuntime.ts :1
import { spawn, type ChildProcess } from "node:child_process"; - shell zifengjiang-Preflight-407750f/src/mcp/doctor.ts :1
import { spawn, execFile } from "node:child_process"; - shell zifengjiang-Preflight-407750f/src/mcp/exploration/tools-intelligent.ts :2
import { execSync } from "node:child_process"; - shell zifengjiang-Preflight-407750f/src/mcp/exploration/tools-session.ts :5
import { spawn } from "node:child_process"; - shell zifengjiang-Preflight-407750f/src/mcp/live/deviceStream.ts :1
import { spawn } from "node:child_process"; - shell zifengjiang-Preflight-407750f/src/mcp/live/foregroundProbe.ts :1
import { execFile } from "node:child_process"; - shell zifengjiang-Preflight-407750f/src/mcp/network-mocks/NetworkMockServer.ts :8
import { execSync } from "node:child_process"; - shell zifengjiang-Preflight-407750f/src/mcp/network-mocks/WireGuardMockServer.ts :2
import { execFileSync, spawn, type ChildProcess } from "node:child_process"; - shell zifengjiang-Preflight-407750f/src/mcp/network-mocks/device-ca.ts :1
import { execFile } from "node:child_process"; - shell zifengjiang-Preflight-407750f/src/mcp/network-mocks/device-proxy.ts :1
import { execFileSync } from "node:child_process"; - shell zifengjiang-Preflight-407750f/src/mcp/runtimeInstall.ts :1
import { spawn } from "node:child_process"; - shell (weak) zifengjiang-Preflight-407750f/src/tests/dumpTimeline.test.ts :97
writeFileSync(join(tmp, "1.execution.json"), exec("ONE", "s1")); - shell (weak) zifengjiang-Preflight-407750f/src/tests/networkMockHandler.test.ts :132
'() => ({ body: String(require("child_process").execSync("id")) })', - shell zifengjiang-Preflight-407750f/src/utils/harmonyHdcDeviceId.ts :1
import { execFile } from 'node:child_process' - shell zifengjiang-Preflight-407750f/src/utils/midscene-device-session.ts :1
import { execFile, execSync } from 'node:child_process'
network 20
- net zifengjiang-Preflight-407750f/src/infrastructure/ios/IOSWdaWatchdog.ts :2
import net from "node:net"; - net zifengjiang-Preflight-407750f/src/infrastructure/midscene/DebugRuntimeImpl.ts :275
const res = await fetch(url, { signal: controller.signal }); - net zifengjiang-Preflight-407750f/src/infrastructure/midscene/MidsceneRuntimeReal.ts :2
import net from "node:net"; - net zifengjiang-Preflight-407750f/src/infrastructure/transport/http/PlatformCallbackClient.ts :91
const resp = await fetch(url, { - net zifengjiang-Preflight-407750f/src/interfaces/http/HttpServer.ts :1
import { createServer } from "node:http"; - net zifengjiang-Preflight-407750f/src/main.ts :46
import { isIPv4 } from "node:net"; - net zifengjiang-Preflight-407750f/src/mcp/agentHttpClient.ts :91
const resp = await fetch(url, { ...init, headers, signal: controller.signal }); - net zifengjiang-Preflight-407750f/src/mcp/doctor.ts :3
import http from "node:http"; - net zifengjiang-Preflight-407750f/src/mcp/exploration/tools-intelligent.ts :1
import http from "node:http"; - net zifengjiang-Preflight-407750f/src/mcp/exploration/tools-session.ts :2
import http from "node:http"; - net zifengjiang-Preflight-407750f/src/mcp/live/deviceStream.ts :3
import http from "node:http"; - net zifengjiang-Preflight-407750f/src/mcp/live/foregroundProbe.ts :35
const res = await fetch(url, { signal: AbortSignal.timeout(4000) }); - net zifengjiang-Preflight-407750f/src/mcp/live/page.ts :472
const view = await (await fetch(runUrl + '/dump')).json(); - net zifengjiang-Preflight-407750f/src/mcp/liveViewer.ts :1
import { createServer, type Server } from "node:http"; - net zifengjiang-Preflight-407750f/src/mcp/network-mocks/NetworkMockServer.ts :1
import { createServer, request as httpRequest, IncomingMessage, ServerResponse, type Server } from "node:http"; - net (weak) zifengjiang-Preflight-407750f/src/tests/deviceStream.test.ts :3
import http from "node:http"; - net (weak) zifengjiang-Preflight-407750f/src/tests/networkMockHardening.test.ts :8
import type { ServerResponse } from "node:http"; - net (weak) zifengjiang-Preflight-407750f/src/tests/networkMockRecord.test.ts :3
import { createServer, request as httpRequest } from "node:http"; - net zifengjiang-Preflight-407750f/src/utils/appPackageLocalPath.ts :68
const res = await fetch(raw, { redirect: "follow" }); - net zifengjiang-Preflight-407750f/src/utils/iosMjpegCapture.ts :1
import http from "node:http";
secrets 4
- secrets zifengjiang-Preflight-407750f/src/client/agentAppPackageClient.ts :40
process.env.AGENT_HTTP_TOKEN?.trim() || - secrets zifengjiang-Preflight-407750f/src/infrastructure/config/agentConfigFile.ts :82
const h = process.env.AGENT_HTTP_TOKEN?.trim() ?? ""; - secrets zifengjiang-Preflight-407750f/src/main.ts :54
process.env.AGENT_HTTP_TOKEN = ""; - secrets zifengjiang-Preflight-407750f/src/mcp/server.ts :79
const client = new AgentHttpClient({ baseUrl: agentBaseUrl, token: options.agentToken ?? process.env.AGENT_HTTP_TOKEN });
tool registrations 31
- exploration_start zifengjiang-Preflight-407750f/src/mcp/exploration/index.ts :46
- exploration_end zifengjiang-Preflight-407750f/src/mcp/exploration/index.ts :73
- exploration_get_page_summary zifengjiang-Preflight-407750f/src/mcp/exploration/index.ts :89
- exploration_ask_about_screen zifengjiang-Preflight-407750f/src/mcp/exploration/index.ts :105
- exploration_ai_act zifengjiang-Preflight-407750f/src/mcp/exploration/index.ts :124
- exploration_screenshot zifengjiang-Preflight-407750f/src/mcp/exploration/index.ts :141
- exploration_type zifengjiang-Preflight-407750f/src/mcp/exploration/index.ts :164
- exploration_wait zifengjiang-Preflight-407750f/src/mcp/exploration/index.ts :180
- agent_health zifengjiang-Preflight-407750f/src/mcp/server.ts :89
- start_agent zifengjiang-Preflight-407750f/src/mcp/server.ts :98
- stop_agent zifengjiang-Preflight-407750f/src/mcp/server.ts :107
- start_ios_wda zifengjiang-Preflight-407750f/src/mcp/server.ts :116
- config_status zifengjiang-Preflight-407750f/src/mcp/server.ts :134
- get_visual_flow_ir_rules zifengjiang-Preflight-407750f/src/mcp/server.ts :149
- validate_visual_flow zifengjiang-Preflight-407750f/src/mcp/server.ts :161
- doctor zifengjiang-Preflight-407750f/src/mcp/server.ts :173
- list_devices zifengjiang-Preflight-407750f/src/mcp/server.ts :188
- install_app zifengjiang-Preflight-407750f/src/mcp/server.ts :200
- run_flow zifengjiang-Preflight-407750f/src/mcp/server.ts :216
- watch_run zifengjiang-Preflight-407750f/src/mcp/server.ts :323
- cancel_run zifengjiang-Preflight-407750f/src/mcp/server.ts :359
- save_report zifengjiang-Preflight-407750f/src/mcp/server.ts :381
- read_report zifengjiang-Preflight-407750f/src/mcp/server.ts :414
- start_network_mocks zifengjiang-Preflight-407750f/src/mcp/server.ts :432
- stop_network_mocks zifengjiang-Preflight-407750f/src/mcp/server.ts :489
- get_network_mock_status zifengjiang-Preflight-407750f/src/mcp/server.ts :500
- update_network_mock_rules zifengjiang-Preflight-407750f/src/mcp/server.ts :511
- get_root_ca_cert zifengjiang-Preflight-407750f/src/mcp/server.ts :547
- start_recording zifengjiang-Preflight-407750f/src/mcp/server.ts :566
- stop_recording zifengjiang-Preflight-407750f/src/mcp/server.ts :583
- export_recorded_rules zifengjiang-Preflight-407750f/src/mcp/server.ts :599
declared dependencies 19
- @modelcontextprotocol/sdk@^1.17.5
- @midscene/android@^1.7.5
- @midscene/harmony@^1.7.5
- @midscene/ios@^1.7.5
- isolated-vm@^6.1.2
- koa@^2.15.4
- lodash@^4.17.21
- safe-regex@^2.1.1
- sharp@^0.33.5
- tsx@^4.20.6
- ws@^8.18.3
- yaml@^2.8.1
- zod@^3.25.76
- @swmansion/argent@^0.18.0
- @types/koa@^3.0.2
- @types/lodash@^4.17.24
- @types/node@^20.17.57
- @types/ws@^8.18.1
- typescript@^5.9.3
cursor-plugin 2
- opaque (low) zifengjiang-Preflight-407750f/.cursor/mcp.json
bundled .cursor/ plugin descriptor (zifengjiang-Preflight-407750f/.cursor/mcp.json) — presence-detected; review the descriptor - opaque (low) zifengjiang-Preflight-407750f/.cursor/rules/preflight.mdc
bundled .cursor/ plugin descriptor (zifengjiang-Preflight-407750f/.cursor/rules/preflight.mdc) — presence-detected; review the descriptor
perm:untrusted 1
- untrusted zifengjiang-Preflight-407750f/src/mcp/live/page.ts :472
const view = await (await fetch(runUrl + '/dump')).json();