{"name":"io.github.monkeywave/frida-mobile-mcp","slug":"monkeywave-frida-mobile-mcp","title":"Frida Mobile MCP","description":"Mobile Frida MCP Server - AI-powered mobile app exploration and testing via Frida instrumentation","url":"https://mcp.market/server/monkeywave-frida-mobile-mcp","rating":null,"grade":"B","score":75,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":41,"stars":15,"forks":2,"downloads_week":234,"last_push_at":"2026-10-23T09:00:08.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/monkeywave/frida-mobile-mcp","website":"https://github.com/monkeywave/frida-mobile-mcp","version":"0.6.0","remotes":[],"packages":[{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"frida-mobile-mcp","version":"0.6.0","runtimeHint":"npx","transport":{"type":"stdio"},"environmentVariables":[{"description":"Default Frida device ID to use (e.g. emulator-5554 or a USB serial). Can also be set with --device.","name":"FRIDA_DEVICE_ID"},{"description":"Set to \"1\" to enable execution of custom Frida scripts (execute_script and custom hook_function handlers). Disabled by default.","default":"0","choices":["0","1"],"name":"FRIDA_MCP_ALLOW_CUSTOM_SCRIPTS"},{"description":"Set to \"1\" to enable the write_memory tool. Disabled by default for safety.","default":"0","choices":["0","1"],"name":"FRIDA_MCP_MEMORY_WRITE"},{"description":"host[:port] of a remote frida-server to add as a remote device at startup (port defaults to 27042).","name":"FRIDA_MCP_REMOTE"},{"description":"Tool schema profile. \"compact\" shortens tool schemas and descriptions for clients with small context windows.","default":"full","choices":["full","compact"],"name":"FRIDA_MCP_SCHEMA_PROFILE"},{"description":"Maximum number of characters in a single tool response; longer output is truncated.","format":"number","default":"25000","name":"FRIDA_MCP_MAX_RESPONSE_CHARS"},{"description":"Bearer token required by HTTP clients. Only used with --transport http (required when --host is not loopback); unused for the default stdio transport.","isSecret":true,"name":"FRIDA_MCP_HTTP_TOKEN"},{"description":"Frida script runtime to use for injected agents.","choices":["qjs","v8"],"name":"FRIDA_MCP_RUNTIME"},{"description":"Set to \"1\" to enable debug logging on stderr. Can also be set with --debug.","default":"0","choices":["0","1"],"name":"FRIDA_MCP_DEBUG"},{"description":"Directory with prebuilt Java/ObjC bridge bundles (defaults to dist/bridges inside the package)","name":"FRIDA_MCP_BRIDGES_DIR"},{"description":"Cache directory for the frida.Compiler project used to compile ES module scripts","name":"FRIDA_MCP_COMPILER_PROJECT_DIR"},{"description":"Path to a friTap fritap_agent.js bundle for capture_tls (otherwise the installed friTap Python package or a pinned download is used)","name":"FRITAP_AGENT_PATH"},{"description":"friTap release tag to download when no local agent is found (default v2.5.2)","name":"FRITAP_VERSION"}]}],"tools":[{"name":"adb_forward","description":"Manage adb port forwards (`adb forward`): add a local->remote forward, remove one, or list them. Use it to reach a frida-server on a non-default device port (e.g. local \"tcp:27042\" -> remote \"tcp:12345\").","write_action":false,"price_micros":0,"input_schema":null},{"name":"adb_logcat","description":"Dump the last N lines of the Android logcat (one-shot, `adb logcat -t N`), optionally filtered by tag:priority specs, or clear the buffer. Useful for correlating app log output with instrumentation events.","write_action":false,"price_micros":0,"input_schema":null},{"name":"adb_pull","description":"Pull a file from an Android device to the host (`adb pull`). Enforces allowedDevices.","write_action":false,"price_micros":0,"input_schema":null},{"name":"adb_push","description":"Push a file from the host to an Android device (`adb push`). Enforces allowedDevices.","write_action":false,"price_micros":0,"input_schema":null},{"name":"adb_shell","description":"Run an arbitrary shell command on an Android device via `adb shell`. DISABLED by default: arbitrary command execution must be enabled with allowAdbShell (config) or FRIDA_MCP_ALLOW_ADB_SHELL=1. Enforces allowedDevices.","write_action":true,"price_micros":0,"input_schema":null},{"name":"analyze_native_function","description":"Static-style analysis of a native function at runtime: function range (Process.findFunctionRange), basic blocks and edges (Frida 17.12+ ControlFlowGraph; falls back to linear disassembly until the first return and says so in `limitations`), and the first instructions. All addresses are reported as absolute and as module+0xoffset for cross-referencing with Ghidra/IDA.","write_action":false,"price_micros":0,"input_schema":null},{"name":"attach_process","description":"Attach to an already running process by PID or name.","write_action":false,"price_micros":0,"input_schema":null},{"name":"bypass_ssl_pinning","description":"One-click SSL certificate pinning bypass for the target app. Auto-detects platform (Android/iOS) and applies the appropriate bypass techniques. On Android: hooks TrustManager, OkHttp CertificatePinner, and Conscrypt. On iOS: hooks SecTrust, ATS, and BoringSSL verification. Returns which bypass methods were successfully installed.","write_action":false,"price_micros":0,"input_schema":null},{"name":"capture_tls","description":"Capture TLS session keys (NSS key log format) and decrypted plaintext from the target using the friTap agent (OpenSSL/BoringSSL, Conscrypt, NSS, GnuTLS, wolfSSL, mbedTLS, Secure Transport, ...).","write_action":false,"price_micros":0,"input_schema":null},{"name":"child_gating","description":"Enable or disable child gating on an existing session. When enabled, processes forked/exec'd by the instrumented process are held so they can be instrumented too (e.g. an app that moves detection into a child process). Requires device-wide spawn gating to catch the held children; list them with spawn_gating action=\"list\".","write_action":false,"price_micros":0,"input_schema":null},{"name":"describe_class","description":"Return the full shape of ONE loaded app class so you can pick an exact method overload before hooking. Android: every declared method with parameter types, return type, modifiers and a ready-to-use `signature` (e.g. \"encrypt(byte[], java.lang.String)\"), constructors (as \"$init(...)\"), fields, superclass and interfaces; searches all class loaders. iOS: selectors with Objective-C type encodings, sup","write_action":false,"price_micros":0,"input_schema":null},{"name":"detach_session","description":"Detach from a specific Frida session, unloading all scripts.","write_action":false,"price_micros":0,"input_schema":null},{"name":"detect_app_technologies","description":"Detect what libraries, frameworks, and security mechanisms an app uses. Returns structured results with recommended script targets. Run this before choosing which pre-built scripts to use.","write_action":false,"price_micros":0,"input_schema":null},{"name":"discover_crypto","description":"Find where an app actually performs cryptography (or any API family), without assuming javax.crypto. In one pass it enumerates: Java/ObjC classes whose name matches a pattern (across all class loaders), and native export symbols matching the pattern or a known crypto/TLS symbol (EVP_*, SSL_read/write, CCCrypt, RC4, AES_, mbedtls_, ...). Returns ranked candidates — app-owned classes first, then fra","write_action":false,"price_micros":0,"input_schema":null},{"name":"drive_coverage","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"dump_module_memory","description":"Dump a loaded module from process memory to a file on the host (e.g. an unpacked/decrypted library). The file is laid out base-relative: file offset 0 is the module base, readable ranges are copied in 1 MiB chunks, unreadable gaps are zero-filled, so it can be imported into Ghidra/IDA as a raw binary at the returned `base`. out_path must be absolute and inside the current directory, the OS temp di","write_action":false,"price_micros":0,"input_schema":null},{"name":"enumerate_exports","description":"List exports (functions and variables) of a specific module, paginated with offset/limit.","write_action":false,"price_micros":0,"input_schema":null},{"name":"enumerate_imports","description":"List imports of a specific module (functions it calls in other libraries), paginated with offset/limit.","write_action":false,"price_micros":0,"input_schema":null},{"name":"enumerate_modules","description":"List loaded modules (shared libraries) in the target process with name, base, end (base+size), size and path.","write_action":false,"price_micros":0,"input_schema":null},{"name":"enumerate_symbols","description":"List symbols (including non-exported/debug symbols) of a specific module. Only available on Linux, Android, iOS and macOS.","write_action":false,"price_micros":0,"input_schema":null},{"name":"eternalize_script","description":"Make a loaded script survive session detach: frida pins it in the target so it keeps running after we detach (or the host exits). Trade-off — once eternalized the script can no longer send messages back, be unloaded, or be inspected; it is fire-and-forget persistence. Use it to leave a bypass/monitor running while you free the session. Give the session_id and the script_id returned by hook_method ","write_action":false,"price_micros":0,"input_schema":null},{"name":"execute_script","description":"","write_action":true,"price_micros":0,"input_schema":null},{"name":"explore_app","description":"Launch a mobile app and gather comprehensive initial context including loaded classes, modules, and libraries. This is the recommended starting point for any app analysis. The app will be spawned in suspended mode, instrumented, then resumed. Returns: pid, platform, loaded modules, and filtered class list.","write_action":false,"price_micros":0,"input_schema":null},{"name":"export_script","description":"Turn a Frida script into a STANDALONE classic .js file that the plain frida / frida-tools 17 CLI can run with `frida -U -f <package> -l file.js`, without this MCP server. The output is a header comment + the frida-mobile-mcp preamble helpers + the script body. Provide exactly one of source (inline) or name (a saved script). It does NOT bundle the Java/ObjC bridges (the Frida 17 CLI injects those) ","write_action":false,"price_micros":0,"input_schema":null},{"name":"find_secrets_in_memory","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"frida_help","description":"Get help on how to use frida-mobile-mcp tools. Use this to learn about available capabilities, method hooking patterns, address notation, script kinds (classic/esm/bundle), TLS capture and example workflows. Topics: ….","write_action":false,"price_micros":0,"input_schema":null},{"name":"frida_server_install","description":"Push a local frida-server binary to an Android device and make it executable (adb push + chmod 755). Download and decompress the correct .xz for the device ABI first (frida_server_status gives the asset URL).","write_action":false,"price_micros":0,"input_schema":null},{"name":"frida_server_start","description":"Start frida-server detached on an Android device (adb shell, daemonized with -D), optionally via su. Supports a custom listen address/port and a renamed binary path for stealth setups, then confirms the server came up.","write_action":false,"price_micros":0,"input_schema":null},{"name":"frida_server_status","description":"Report whether frida-server is running on an Android device (via adb): its PIDs, the device CPU ABI, the matching frida release arch, and the exact GitHub .xz asset URL to download for the installed frida-node version.","write_action":false,"price_micros":0,"input_schema":null},{"name":"frida_server_stop","description":"Stop frida-server on an Android device by sending a signal to the matching process (adb shell pkill, optionally via su), then report any remaining PIDs.","write_action":false,"price_micros":0,"input_schema":null},{"name":"generate_memory_pattern","description":"Turn a secret you already located (e.g. from find_secrets_in_memory) into a reusable anchor pattern: a stable byte signature near the key plus the offset from it to the key.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_device_info","description":"Get detailed information about a device including OS version, architecture, and system parameters.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_frontmost_application","description":"Get the currently foreground application on the device.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_messages","description":"Retrieve buffered messages from active scripts and hooks. Messages include hook invocations, trace hits, script output (send() calls), and errors. Use \"since\" for pagination to get only new messages.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_status","description":"Get an overview of connected devices, active sessions (with platform, script count and last activity), hooks, traces, and the most recent session detaches / process crashes (recent_detaches). Use this first to understand what is available before starting any instrumentation work, and after a session is lost to see why.","write_action":false,"price_micros":0,"input_schema":null},{"name":"hook_function","description":"Low-level hook with custom onEnter/onLeave JavaScript handlers. For advanced use when hook_method does not provide enough control. Custom handler bodies require allowCustomScripts: true in config; without them the hook sends default enter/leave events. Handler bodies are compiled as functions (new Function) inside the agent: `this` is the Interceptor invocation context (this.context, this.returnAd","write_action":false,"price_micros":0,"input_schema":null},{"name":"hook_method","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"inject_library","description":"Inject a native agent library (.so/.dylib) from the host into a target process via Frida's injector, independent of the JS engine — the parity path for a prebuilt Frida gadget/agent or a custom .so. Runs arbitrary native code in the target, so it needs allowNativeInjection (a capability separate from allowCustomScripts). The library must match the device architecture (arm64-v8a etc.); its optional","write_action":false,"price_micros":0,"input_schema":null},{"name":"kill_process","description":"Kill a process on the target device.","write_action":true,"price_micros":0,"input_schema":null},{"name":"list_applications","description":"List installed and running applications on the target device.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_devices","description":"Enumerate all Frida-visible devices including local, USB, and remote devices. Equivalent to frida-ls-devices CLI command.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_processes","description":"List running processes on the target device. Equivalent to frida-ps CLI command.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_saved_scripts","description":"List the Frida scripts saved in the local library (~/.config/frida-mobile-mcp/scripts/) with their description, creation time and size. Returns an empty list when nothing has been saved yet. No device is required.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_sessions","description":"List all active Frida sessions managed by this server.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_threads","description":"List the threads of the target process (id, name, state, current pc as module+0xoffset). With backtraces: true each thread also gets a symbolised backtrace (up to 8 frames) captured from its register context.","write_action":false,"price_micros":0,"input_schema":null},{"name":"mobile_action","description":"Gateway to mobile-mcp UI automation tools. Perform screenshots, taps, swipes, text input, app management and more. Common actions: mobile_take_screenshot, mobile_list_elements_on_screen, mobile_click_on_screen_at_coordinates (params: {x, y}), mobile_swipe_on_screen (params: {direction}), mobile_type_keys (params: {text}), mobile_launch_app (params: {appId}), mobile_list_apps. Call without action t","write_action":false,"price_micros":0,"input_schema":null},{"name":"monitor_crypto","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"read_memory","description":"Read raw memory from a target process. Requires an active session. Address in any notation: …. Max 4MB per read. Returns hex-encoded bytes plus the resolved absolute address and module+offset (rva).","write_action":false,"price_micros":0,"input_schema":null},{"name":"resolve_address","description":"Translate between absolute process addresses and static-analysis coordinates. Give \"0x7f...\" to get module+0xoffset (+ nearest symbol); give \"libfoo.so+0x1234\" or \"libfoo.so!func\" to get the absolute runtime address. Use it to hand addresses between Frida and Ghidra/IDA.","write_action":false,"price_micros":0,"input_schema":null},{"name":"resume_process","description":"Resume a suspended process (after spawn_process).","write_action":false,"price_micros":0,"input_schema":null},{"name":"run_prebuilt_script","description":"Run a pre-built Frida script from the built-in library. Call without script_name to list all available scripts. Available scripts include: ssl_pinning_bypass, root_jailbreak_bypass, class_enumeration, method_hook, crypto_monitor, network_inspector, keychain_prefs, filesystem_monitor, anti_frida_evasion.","write_action":true,"price_micros":0,"input_schema":null},{"name":"run_saved_script","description":"Load a script previously saved with save_script into a target process. Resolves (or reuses) a session the same way execute_script does and runs the stored source as a custom agent: classic JavaScript gets the Java/ObjC bridges injected by platform, ES modules are compiled with the Frida Compiler, and frida-compile bundles are loaded as-is. Provide a target (app id, process name or PID) or an exist","write_action":true,"price_micros":0,"input_schema":null},{"name":"save_script","description":"Save a Frida script to the local library (~/.config/frida-mobile-mcp/scripts/) so it can be re-run later with run_saved_script or shared with export_script. Stores the raw source as <name>.js plus a <name>.json metadata file (sha256, size, created timestamp, description). Names are restricted to letters, digits, underscores and hyphens. Refuses to overwrite an existing script unless overwrite is t","write_action":false,"price_micros":0,"input_schema":null},{"name":"scan_memory","description":"Scan process memory for a byte pattern. Pattern format: \"48 89 5c 24 ?? 57\" where ?? is a wildcard. Optionally limit scan to a specific module.","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_classes_and_methods","description":"Search for classes and their methods by pattern in a running app. Combines class enumeration and method listing. Use regex patterns like \"Login\", \"com\\.example\\.auth.*\", or \"NSURLSession\". Returns matching classes with their methods when include_methods is true.","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_recipes","description":"Search the purpose-indexed library of ready-to-run classic-JS Frida recipes (custom Java crypto-key capture, standard javax.crypto key/IV, native export hook, JNI RegisterNatives discovery, custom-classloader enumeration, intent/deeplink trace, WebView bridge, iOS Keychain). Returns ranked recipes with their classic-JS source and usage notes; adapt the source and run it with execute_script. An emp","write_action":false,"price_micros":0,"input_schema":null},{"name":"select_device","description":"Explicitly select the active Frida device for subsequent operations.","write_action":false,"price_micros":0,"input_schema":null},{"name":"spawn_gating","description":"Enable, disable, or list device-wide spawn gating. When enabled, every newly spawned process (including app-launched child/isolated processes that often run RASP/anti-Frida checks) is held suspended until released. Use \"list\" to see pending spawns and children, then attach_process + hook_method, and resume_process to release each by PID.","write_action":false,"price_micros":0,"input_schema":null},{"name":"spawn_process","description":"Spawn a new process in suspended state for early instrumentation. The process will be paused until resume_process is called.","write_action":false,"price_micros":0,"input_schema":null},{"name":"stop_instrumentation","description":"Clean up all hooks, scripts, and traces on a target. The \"undo everything\" tool. Detaches the Frida session and frees all resources. Use when you are done analyzing an app or want to start fresh.","write_action":false,"price_micros":0,"input_schema":null},{"name":"trace_coverage","description":"Arm a broad set of cheap entry-hooks over a target set and track which have been REACHED (covered) vs which are still COLD — the reachability signal for a drive loop. Unlike trace_method (time-boxed, logs every call), this is persistent and entry-only: it answers \"what code have I NOT exercised yet, so where should I keep driving?\". Scope can be a single class (all its methods), a class/package gl","write_action":false,"price_micros":0,"input_schema":null},{"name":"trace_method","description":"Trace function calls matching a pattern for a specified duration. Simplified frida-trace equivalent. Supports glob patterns like \"com.example.network.*\" for Java, \"-[NSURL*]\" for ObjC, and \"libssl.so!SSL_*\" for native. Returns all captured invocations after the duration expires.","write_action":false,"price_micros":0,"input_schema":null},{"name":"trigger_and_wait","description":"Correlate a UI action with instrumentation output in one round-trip: optionally perform a mobile_action (tap/launch/type) on the session's device, then block until at least `expect_messages` new messages/hook hits arrive (or timeout). Returns exactly the messages the trigger produced and which hooks fired. This is how you confirm \"this tap ran the hooked code\" — or learn \"nothing fired, the hypoth","write_action":false,"price_micros":0,"input_schema":null},{"name":"unhook_function","description":"Remove a specific hook by its hook ID.","write_action":true,"price_micros":0,"input_schema":null},{"name":"unload_script","description":"Unload a single script (hook, trace or custom script) from a session while keeping the session attached. Use the script_id returned by hook_method, trace_method, execute_script or run_prebuilt_script. Hooks and traces that belong to the script are removed from the server state. Use stop_instrumentation to tear down a whole session instead.","write_action":false,"price_micros":0,"input_schema":null},{"name":"validate_script","description":"Check a Frida script for syntax, type and Frida 17 API problems without a device. Use it before execute_script. Classic (non-module) scripts get a JavaScript syntax check plus a lint for APIs removed in Frida 17 (static Module/Memory helpers, *Sync enumerators); referencing them throws at runtime, so they make the result not ok. ES module scripts (import/export) are compiled with the Frida Compile","write_action":false,"price_micros":0,"input_schema":null},{"name":"watch_loads","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"write_memory","description":"Write raw bytes to process memory. DISABLED by default for safety - enable via config (memoryWriteEnabled: true). Provide hex-encoded data. Address in any notation: ….","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":75,"grade":"B","scanned_at":"2026-10-24T04:07:14.641Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-24T04:07:14.585Z","components":{"code":{"score":20,"max":25,"notes":["196 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":15,"max":15,"notes":["last push 1 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[{"id":"exec.eval","severity":"medium","component":"code","title":"eval / new Function used","evidence":"dist/bridges/objc.js: …return \",returnCaptureRight=\"\");const m=eval(\"var m = function (\"+argVariableNames.jo…"}],"inputs":{"packages":[{"registryType":"npm","identifier":"frida-mobile-mcp","version":"0.6.0","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":7,"publishedAt":"2026-10-23T09:18:40.439Z","repositoryUrl":"git+https://github.com/monkeywave/frida-mobile-mcp.git","weeklyDownloads":234}],"repo":{"found":true,"owner":"monkeywave","repo":"frida-mobile-mcp","archived":false,"pushedAt":"2026-10-23T09:00:08Z","stars":15,"forks":2,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/23526996?v=4","ownerCreatedAt":"2016-11-17T15:10:32Z","license":"MIT"},"icon":{"url":null,"source":"none"},"presence":{"stars":15,"forks":2,"downloadsWeek":234,"license":"MIT","lastPushAt":"2026-10-23T09:00:08.000Z","score":41}}}},"grade_history":[],"reviews":[]}