Skip to main content
Glama
ya-frida-mcp
by 1shin-7

WIP: Ya Frida MCP

Pending JsBridge fix #3


Existing Frida MCP servers on the market are either abandoned, poorly maintained, or limited to a handful of basic operations. ya-frida-mcp was built from scratch to be a comprehensive, production-ready bridge between AI agents and Frida — covering device management, process control, script injection, memory operations, and even ADB integration out of the box.

Features

59 MCP tools across 7 categories, all returning structured JSON for minimal token consumption.

Category

Tools

Highlights

Device

frida_ls_devices frida_get_device frida_add_remote frida_remove_remote frida_query_system_parameters frida_enable_spawn_gating frida_disable_spawn_gating frida_enumerate_pending_spawn frida_enumerate_pending_children frida_inject_library_file frida_inject_library_blob

Device management, system info, spawn gating, native library injection

Process

frida_ps frida_spawn frida_attach frida_detach frida_kill frida_resume frida_list_sessions

Full process lifecycle; frida_ps supports scope/pids, frida_spawn supports argv/env/cwd/stdio

App

frida_ls_apps frida_ls_apps_running frida_get_frontmost_application

App enumeration with scope/identifiers filtering

Script

frida_inject frida_rpc_call frida_unload_script frida_get_messages frida_list_scripts frida_enumerate_modules frida_enumerate_exports frida_list_exports frida_post_message frida_enable_child_gating frida_disable_child_gating frida_compile_script frida_snapshot_script frida_eternalize_script

JS injection (QJS/V8), RPC, child gating, bytecode compilation, script snapshots

Memory

frida_memory_read frida_memory_write frida_memory_scan frida_memory_protect

Read/write/scan/protect with hex I/O

ADB (optional)

adb_shell adb_push adb_pull adb_install adb_logcat adb_forward adb_root ...

17 tools, auto-registered when adb is on PATH

Frida Server (optional)

frida_server_status frida_server_install frida_server_start frida_server_stop

Auto-download, push, and manage frida-server on Android via ADB

Also includes:

  • MCP Resources — live device list, session state, process/app enumeration as subscribable resources

  • MCP Prompts — workflow templates for native hooking, Java/ObjC hooking, Stalker tracing, module dumping

  • TOML Configuration — customize transport, default device, remote devices, timeouts

  • CLI Utilities — doctor, devices, ps, ls, tools, install/uninstall for MCP clients

  • One-command client setup — register into 22+ MCP clients including Claude Desktop, Cursor, VS Code, Windsurf, Roo Code, Cline, Kiro, and more

  • Structured output — all tools return compact JSON with Literal type hints for LLM-friendly schemas

Related MCP server: frida-mcp

Quickstart

Install

# PyPI (recommended)
pip install ya-frida-mcp

# Or via uv
uv tool install ya-frida-mcp

Register into your MCP client

# Pick your client
ya-frida-mcp install claude-desktop
ya-frida-mcp install cursor
ya-frida-mcp install vscode
ya-frida-mcp install windsurf
ya-frida-mcp install roo-code
ya-frida-mcp install cline

# All supported clients at once
ya-frida-mcp install all

Key

Client

amazon-q

Amazon Q Developer CLI

augment-code

Augment Code

claude-desktop

Claude Desktop

claude-code

Claude Code

cline

Cline

copilot-cli

Copilot CLI

crush

Crush

cursor

Cursor

gemini-cli

Gemini CLI

kilo-code

Kilo Code

kiro

Kiro

lm-studio

LM Studio

opencode

Opencode

qodo-gen

Qodo Gen

qwen-coder

Qwen Coder

roo-code

Roo Code

trae

Trae

vscode

VS Code

vscode-insiders

VS Code Insiders

warp

Warp

windsurf

Windsurf

zed

Zed

Start the server manually

# stdio (default, used by MCP clients)
ya-frida-mcp serve

# SSE transport
ya-frida-mcp serve -t sse -H 0.0.0.0 -p 8000

Configuration (optional)

ya-frida-mcp init-config   # generates config.toml in current directory
ya-frida-mcp show-config    # display resolved config
ya-frida-mcp -c /path/to/config.toml serve
# config.toml
[server]
name = "ya-frida-mcp"
transport = "stdio"       # "stdio" or "sse"
host = "127.0.0.1"
port = 8000

[frida]
default_device = "local"  # "local", "usb", or device ID
script_timeout = 10
spawn_timeout = 15

[[frida.remote_devices]]
host = "192.168.1.100"
port = 27042

CLI Reference

ya-frida-mcp doctor       # diagnose Frida connectivity
ya-frida-mcp devices      # list Frida devices
ya-frida-mcp ps            # list running processes (frida-ps)
ya-frida-mcp ls            # list installed apps (frida-ls)
ya-frida-mcp tools         # list all registered MCP tools
ya-frida-mcp version       # show version info

Development

# Clone
git clone https://github.com/1shin-7/ya-frida-mcp.git
cd ya-frida-mcp

# Install dependencies
uv sync

# Run in dev mode
uv run ya-frida-mcp serve

# Lint
uv run ruff check ya_frida_mcp/

# List tools (verify registration)
uv run ya-frida-mcp tools

Project Structure

ya_frida_mcp/
├── cli.py              # Click CLI entry point
├── config.py           # TOML configuration management
├── installer.py        # MCP client config installers
├── server.py           # FastMCP server factory + lifespan
├── resources.py        # MCP resources
├── prompts.py          # MCP workflow prompts
├── core/
│   ├── base.py         # ABC base classes + async helpers
│   ├── device.py       # Frida device wrapper + manager
│   ├── session.py      # Session + script lifecycle
│   ├── adb.py          # ADB CLI async wrapper
│   ├── frida_server.py # frida-server download & deploy logic
│   └── output.py       # Structured output helpers
└── tools/
    ├── device.py       # Device discovery tools
    ├── process.py      # Process management tools
    ├── app.py          # App enumeration tools
    ├── script.py       # Script injection + RPC tools
    ├── memory.py       # Memory read/write/scan tools
    ├── adb.py          # ADB CLI tools (optional)
    └── frida_server.py # frida-server management tools (optional)

Credits

  • Frida — Dynamic instrumentation toolkit

  • FastMCP — Pythonic MCP server framework

  • Click — CLI framework

  • Claude — AI-assisted development

License

MIT

Available Tools

39 tools
frida_add_remoteB

Connect to a remote Frida server (frida-server over TCP).

Inputs: host (required), port. Returns: object

frida_attachA

Attach to a running process by PID or name.

Args: pid: Process PID (int). name: Process name (str). identifier: Application bundle identifier (str). frontmost: Attach to the frontmost application. device_id: Target device. Uses default if omitted. realm: Session realm — "native" or "emulated".

Inputs: pid, name, realm, device_id, +2 more. Returns: object

frida_compile_scriptA

Compile a script to bytecode without loading it.

Args: pid: Target process PID (must have active session). source: JavaScript source code to compile. runtime: Script runtime — "qjs" (default, no Java/ObjC) or "v8" (full runtime with Java/ObjC bridge).

Returns: Base64-encoded bytecode.

Inputs: pid (required), source (required), runtime. Returns: object

frida_detachC

Detach from a process session.

Inputs: pid (required). Returns: object

frida_disable_child_gatingA

Disable child gating on a session.

Args: pid: Target process PID (must have active session).

Inputs: pid (required). Returns: object

frida_disable_spawn_gatingA

Disable spawn gating on the device.

Args: device_id: Target device. Uses default if omitted.

Inputs: device_id. Returns: object

frida_enable_child_gatingA

Enable child gating on a session.

When enabled, child processes created by the target are suspended until explicitly resumed.

Args: pid: Target process PID (must have active session).

Inputs: pid (required). Returns: object

frida_enable_spawn_gatingA

Enable spawn gating on the device.

When enabled, newly spawned processes are suspended until explicitly resumed.

Args: device_id: Target device. Uses default if omitted.

Inputs: device_id. Returns: object

frida_enumerate_exportsB

Enumerate exports of a specific module.

Args: pid: Target process PID (must have active session). module_name: Name of the module to inspect.

Inputs: pid (required), module_name (required). Returns: result

frida_enumerate_modulesA

Enumerate loaded modules in a process.

Injects a helper script to call Process.enumerateModules(). Requires an active session for the given PID.

Args: pid: Target process PID (must have active session). name_filter: Optional substring filter on module name (case-insensitive). Use this to avoid returning hundreds of modules at once.

Inputs: pid (required), name_filter. Returns: result

frida_enumerate_pending_childrenA

List pending child processes that are waiting to be resumed.

Args: device_id: Target device. Uses default if omitted.

Inputs: device_id. Returns: result

frida_enumerate_pending_spawnB

List pending spawned processes that are waiting to be resumed.

Args: device_id: Target device. Uses default if omitted.

Inputs: device_id. Returns: result

frida_eternalize_scriptA

Eternalize a script so it persists after detaching from the session.

Args: script_id: ID returned by frida_inject.

Inputs: script_id (required). Returns: object

frida_get_deviceA

Get info for a specific device. Uses default device if ID is omitted.

Inputs: device_id. Returns: object

frida_get_frontmost_applicationA

Get details about the frontmost application.

Args: device_id: Target device. Uses default if omitted. scope: Enumeration scope — "minimal", "metadata", or "full".

Inputs: scope, device_id. Returns: result

frida_get_messagesA

Retrieve and drain pending messages from an injected script.

Messages are produced by send() calls in the injected JS.

Inputs: script_id (required). Returns: result

frida_injectA

Inject a JavaScript snippet into a process.

The process must already have an active session (use frida_attach first).

IMPORTANT: The default runtime is QJS (QuickJS), which is lightweight but does NOT include the Java/ObjC bridges. If your script uses Java.perform(), Java.use(), ObjC.classes, or any Java/Objective-C APIs, you MUST set runtime="v8". Always use runtime="v8" for Android Java hooking.

Args: pid: Target process PID. source: JavaScript source code to inject. runtime: Script runtime — "qjs" (default, no Java/ObjC bridge) or "v8" (full runtime with Java/ObjC bridge support).

Returns: script_id for subsequent RPC calls or unloading.

Inputs: pid (required), source (required), runtime. Returns: object

frida_inject_library_blobA

Inject a native library from memory (base64-encoded binary) into a process.

Args: pid: Target process PID. blob_base64: Base64-encoded library binary. entrypoint: Name of the entry function in the library. data: String argument passed to the entrypoint. device_id: Target device. Uses default if omitted.

Inputs: pid (required), data (required), entrypoint (required), blob_base64 (required), +1 more. Returns: object

frida_inject_library_fileA

Inject a native library file (.so/.dylib) into a process.

Args: pid: Target process PID. path: Absolute path to the library on the device. entrypoint: Name of the entry function in the library. data: String argument passed to the entrypoint. device_id: Target device. Uses default if omitted.

Inputs: pid (required), data (required), path (required), entrypoint (required), +1 more. Returns: object

frida_killC

Kill a process by PID.

Inputs: pid (required), device_id. Returns: object

frida_list_exportsB

List RPC exports available on an injected script.

Args: script_id: ID returned by frida_inject.

Inputs: script_id (required). Returns: result

frida_list_scriptsA

List all active script IDs.

Inputs: no named parameters. Returns: result

frida_list_sessionsA

List all active session PIDs.

Inputs: no named parameters. Returns: result

frida_ls_appsA

List installed applications on a device (frida-ls equivalent).

Returns identifier, name, and PID (if running).

Args: device_id: Target device. Uses default if omitted. scope: Enumeration scope — "minimal", "metadata", or "full". When "full", includes parameters (version, build, etc.). identifiers: Optional list of bundle identifiers to filter by.

Inputs: scope, device_id, identifiers. Returns: result

frida_ls_apps_runningA

List only currently running applications.

Args: device_id: Target device. Uses default if omitted. scope: Enumeration scope — "minimal", "metadata", or "full". identifiers: Optional list of bundle identifiers to filter by.

Inputs: scope, device_id, identifiers. Returns: result

frida_ls_devicesA

List all available Frida devices (local, USB, remote).

Inputs: no named parameters. Returns: result

frida_memory_protectC

Change memory protection flags.

Inputs: pid (required), size (required), address (required), protection. Returns: object

frida_memory_readA

Read bytes from process memory.

Args: pid: Target process PID (must have active session). address: Hex address string (e.g. "0x7fff12340000"). size: Number of bytes to read.

Inputs: pid (required), size (required), address (required). Returns: object

frida_memory_scanA

Scan process memory for a byte pattern.

Args: pid: Target process PID (must have active session). address: Start address (hex string). size: Number of bytes to scan. pattern: Frida-style pattern (e.g. "48 8b ?? 00").

Inputs: pid (required), size (required), address (required), pattern (required). Returns: result

frida_memory_writeA

Write bytes to process memory.

Args: pid: Target process PID (must have active session). address: Hex address string (e.g. "0x7fff12340000"). hex_data: Hex-encoded bytes to write (e.g. "deadbeef").

Inputs: pid (required), address (required), hex_data (required). Returns: object

frida_post_messageA

Post a message to an injected script.

Args: script_id: ID returned by frida_inject. message: JSON-serializable message to send. data: Optional base64-encoded binary data.

Inputs: message (required), script_id (required), data. Returns: object

frida_psA

List running processes on a device (frida-ps equivalent).

Returns PID and name for each process.

Args: device_id: Target device. Uses default if omitted. scope: Enumeration scope — "minimal", "metadata", or "full". When "full", includes parameters (path, user, ppid, started). pids: Optional list of PIDs to filter by.

Inputs: pids, scope, device_id. Returns: result

frida_query_system_parametersB

Returns a dictionary of information about the host system.

Args: device_id: Target device. Uses default if omitted.

Inputs: device_id. Returns: object

frida_remove_remoteB

Disconnect from a remote Frida server.

Inputs: host (required), port. Returns: object

frida_resumeC

Resume a suspended process.

Inputs: pid (required), device_id. Returns: object

frida_rpc_callA

Call an RPC export on an injected script.

The script must expose methods via rpc.exports.

Args: script_id: ID returned by frida_inject. method: Export method name (snake_case in Python, camelCase in JS). args: Positional arguments to pass.

Inputs: method (required), script_id (required), args.

frida_snapshot_scriptA

Create a snapshot of a script for fast future loading.

Args: pid: Target process PID (must have active session). embed_script: JavaScript source to embed in the snapshot. warmup_script: Optional script to run during snapshot creation. runtime: Script runtime — "qjs" (default, no Java/ObjC) or "v8" (full runtime with Java/ObjC bridge).

Returns: Base64-encoded snapshot data.

Inputs: pid (required), embed_script (required), runtime, warmup_script. Returns: object

frida_spawnA

Spawn a new process and optionally attach to it.

Args: program: Path or bundle identifier to spawn. device_id: Target device. Uses default if omitted. auto_resume: Whether to resume the process after attaching. argv: Command-line arguments for the spawned process. env: Environment variables as key-value pairs. cwd: Working directory for the spawned process. stdio: Standard I/O mode — "inherit", "pipe", or "redirect".

Note: If spawn times out on Android, call frida_fix_usap to disable the USAP pool and detect root-hiding modules that may interfere with Frida's spawn interception.

Inputs: program (required), cwd, env, argv, +3 more. Returns: object

frida_unload_scriptB

Unload a previously injected script.

Inputs: script_id (required). Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.5/5.0

    Scored across 39 tools

    Disambiguation4/5

    Most tools have clearly distinct purposes, but a few pairs could cause confusion: frida_inject (JS) vs frida_inject_library_file/blob (native library), and frida_list_exports vs frida_enumerate_exports (RPC vs module exports). Descriptions are detailed enough to resolve ambiguity, so only minor overlap exists.

    Naming Consistency4/5

    All tools share the frida_ prefix and use snake_case, but the verb style is inconsistent (ls vs list vs enumerate vs get). For example, frida_ls_devices vs frida_list_sessions, and frida_enumerate_exports vs frida_list_exports. Overall still readable and predictable.

    Tool Count3/5

    39 tools is heavy, but the server aims to cover Frida's broad dynamic instrumentation surface across device, process, script, and memory domains. Most tools are distinct, but the count exceeds the 25-tool threshold, making it feel somewhat bloated.

    Completeness5/5

    The tool surface covers core Frida workflows: device/process discovery, attach/spawn, script injection with RPC and messaging, module/export enumeration, and memory read/write/scan/protect. No obvious critical gaps that would prevent an agent from accomplishing typical dynamic instrumentation tasks.

    Maintenance

    ActivityInactive
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      An MCP-compliant server that enables AI systems to interact with mobile and desktop applications through Frida's dynamic instrumentation capabilities, allowing for process management, device control, JavaScript execution, and script injection.
      465
      MIT
    • A
      license
      B
      quality
      D
      maintenance
      An MCP server that enables AI-assisted mobile security testing by exposing Frida functionality for Android application research. It provides tools for hooking Java methods, manipulating memory, managing device processes, and executing custom Frida scripts.
      37
      15
      MIT
    • A
      license
      B
      quality
      C
      maintenance
      A comprehensive MCP server that exposes Frida's dynamic instrumentation toolkit to AI agents for process management, script injection, and memory operations. It provides over 50 tools to interact with local and mobile devices, enabling advanced capabilities like function hooking and memory analysis.
      55
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      An MCP server that enables AI models to perform Android dynamic analysis using Frida, including spawning and attaching to applications, listing apps, and injecting scripts.
      123
      -