github TypeScript analyzed 407750f

zifengjiang/Preflight

github

Local MCP server for AI-assisted mobile testing on real Android, iOS, and HarmonyOS devices.

maintainer
zifengjiang
license
Apache-2.0
first seen
2026-06-15
last seen
2026-08-04
releases · 30d
0
short id

Drift inferred · capture-to-capture

No drift recorded — single capability capture; advisories appear once its surface changes.

capabilities 31 tools
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
skills & danger signals github-tarball
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

code evidence vv2.0.3 · github-tarball
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();