Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

io.github.JuanCF/scrcpy-mcp

NPM · SCRCPY-MCP · SCANNED SEP 20

MCP server for Android device control via ADB and scrcpy

Available components

+3 this week 95 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security98
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 42 of 112 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency97
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to JuanCF/scrcpy-mcp). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 30 days ago).Pass
  • Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability78
  • AI-judged instruction clarity (excellent).Pass
  • Tool/resource definitions use about 2202 tokens (~56/item across 39 items; 39 tools + 0 resources), lean.Pass
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 39 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the io.github.JuanCF/scrcpy-mcp server?

io.github.JuanCF/scrcpy-mcp runs locally as an npm package, launched with npx -y scrcpy-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · scrcpy-mcp

# add to Claude Code
claude mcp add juancf-scrcpy-mcp -- npx -y scrcpy-mcp
// .cursor/mcp.json
{
  "mcpServers": {
    "juancf-scrcpy-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "scrcpy-mcp"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "juancf-scrcpy-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "scrcpy-mcp"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add juancf-scrcpy-mcp -- npx -y scrcpy-mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "juancf-scrcpy-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "scrcpy-mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add juancf-scrcpy-mcp --command npx --arg -y --arg scrcpy-mcp
# ~/.hermes/config.yaml
mcp_servers:
  juancf-scrcpy-mcp:
    command: "npx"
    args: ["-y", "scrcpy-mcp"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "juancf-scrcpy-mcp": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "scrcpy-mcp"
      ]
    }
  }
}
# add to Vellum
assistant mcp add juancf-scrcpy-mcp -t stdio -c npx -a -y scrcpy-mcp
// mcp.json
{
  "mcpServers": {
    "juancf-scrcpy-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "scrcpy-mcp"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 20 Sept 26 +1
    • Stability: 0.97 → pass security
  • 19 Sept 26 −1
    • Stability: pass → 0.97 functional
  • 18 Sept 26 +1
    • Stability: 0.97 → pass security
  • 16 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.

  • 15 Sept 26 0
    • Security disclosure: unverified → fail functional
  • 14 Sept 26 +1
    • Security disclosure: fail → unverified functional
  • 12 Sept 26 −3
    • Stability: pass → 0.80 functional
  • 11 Sept 26 +1
    • Stability: 0.97 → pass security
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 20 Sept 2026 · Analysed npm/scrcpy-mcp@0.5.0

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem npm
Reason Verified
Discovered via Registry attestation endpoint
Source repo JuanCF/scrcpy-mcp
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/JuanCF/scrcpy-mcp/.github/workflows/publish.yml@refs/heads/main
Rekor log index 2540635463
Predicate type https://slsa.dev/provenance/v1
Subject digest sha512:5d2dbc6b30268f70f4d8fb88b9dd2698a1b838ce1ca07219c48ab3c2333d06be10286ed477ac6caba4728835e8d46a5c9351bfda9a5d4a92c32f157d4

Background: How many MCP packages publish verified provenance →

Dependencies 112 packages
Packages resolved 112
Stale 42
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 39 exposed · ~2,202 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
app_current ~29

Get the currently foregrounded app package name and activity.

NameTypeReqDescription
serialstringDevice serial number
NameTypeReqDescription
activitystring|nullyesForeground activity name, if resolvable
packageNamestringyesPackage name of the foreground app

No examples provided.

app_install ~48

Install an APK file on the device from the host machine.

NameTypeReqDescription
apkPathstringyesAbsolute path to the APK file on the host machine
serialstringDevice serial number
NameTypeReqDescription
messagestringyesInstall result or error output from adb
successbooleanyesWhether the APK installed successfully

No examples provided.

app_list ~79

List installed packages on the device. Optionally filter by name or restrict to system/third-party apps.

NameTypeReqDescription
filterstringFilter packages by name (partial match, case-insensitive)
serialstringDevice serial number
systembooleantrue = system apps only, false = third-party only, omit = all
NameTypeReqDescription
countintegeryesNumber of packages returned
packagesarrayyesInstalled package names

No examples provided.

app_start ~99

Launch an app on the device. Uses scrcpy START_APP when a session is active for faster launch, falls back to ADB `am start`. Supports force-stop prefix (+) to stop the app before launching.

NameTypeReqDescription
packageNamestringyesPackage name to launch (e.g., 'com.example.app'). Prefix with '+' to force-stop the app first (e.g., '+com.example.app')
serialstringDevice serial number
NameTypeReqDescription
messagestringyesHuman-readable description of the result
sourcestringMechanism used to launch the app (scrcpy or adb)
successbooleanyesWhether the app was launched

No examples provided.

app_stop ~47

Force-stop an app on the device.

NameTypeReqDescription
packageNamestringyesPackage name to force-stop (e.g., 'com.example.app')
serialstringDevice serial number
NameTypeReqDescription
messagestringyesHuman-readable description of the result
successbooleanyesWhether the app was force-stopped

No examples provided.

app_uninstall ~47

Uninstall an app from the device.

NameTypeReqDescription
packageNamestringyesPackage name to uninstall (e.g., 'com.example.app')
serialstringDevice serial number
NameTypeReqDescription
messagestringyesUninstall result or error output from adb
successbooleanyesWhether the app was uninstalled

No examples provided.

clipboard_get ~55

Get the current clipboard content from the device. Uses scrcpy GET_CLIPBOARD when a session is active (works on Android 10+), falls back to ADB clipboard commands.

NameTypeReqDescription
serialstringDevice serial number
NameTypeReqDescription
contentstringyesCurrent clipboard text on the device
sourcestringyesMechanism used to read the clipboard (scrcpy or adb)

No examples provided.

clipboard_set ~80

Set the clipboard content on the device. Uses scrcpy SET_CLIPBOARD when a session is active (with optional paste flag), falls back to ADB clipboard commands.

NameTypeReqDescription
pastebooleanAlso simulate paste action (scrcpy only)
serialstringDevice serial number
textstringyesText to set in the clipboard
NameTypeReqDescription
messagestringyesHuman-readable description of the result
sourcestringMechanism used to set the clipboard (scrcpy or adb)
successbooleanyesWhether the clipboard was set

No examples provided.

collapse_panels ~35

Collapse all open panels (notification, settings) (requires active scrcpy session)

NameTypeReqDescription
serialstringDevice serial number
NameTypeReqDescription
messagestringyesHuman-readable description of the result
successbooleanyesWhether the action succeeded

No examples provided.

connect_wifi ~55

Enable WiFi ADB and connect to the device wirelessly. Returns the connection address.

NameTypeReqDescription
portintegerTCP port for ADB connection (default: 5555)
serialstringDevice serial number
NameTypeReqDescription
addressstringThe host:port the device was connected on
messagestringyesHuman-readable description of the result
successbooleanyesWhether the wireless connection was established

No examples provided.

device_info ~48

Get detailed info about a device: model, Android version, screen size, SDK level, battery level

NameTypeReqDescription
serialstringDevice serial number. If omitted, uses the only connected device.
NameTypeReqDescription
androidVersionstring|nullyesAndroid release version
batteryLevelyesBattery level percentage
brandstring|nullyesDevice brand
manufacturerstring|nullyesDevice manufacturer
modelstring|nullyesDevice model
screenHeightintegeryesScreen height in pixels
screenWidthintegeryesScreen width in pixels
sdkLevelyesAndroid SDK API level
serialstringyesResolved device serial

No examples provided.

device_list ~23

List all connected Android devices with their serial numbers, state, and model

Input schema present but exposes no named parameters.

NameTypeReqDescription
countintegeryesNumber of connected devices
devicesarrayyesConnected devices

No examples provided.

disconnect_wifi ~40

Disconnect from a wireless ADB device

NameTypeReqDescription
addressstringyesDevice address (e.g., 192.168.1.100:5555)
NameTypeReqDescription
messagestringyesHuman-readable description of the result
successbooleanyesWhether the action succeeded

No examples provided.

drag_drop ~109

Perform a drag and drop gesture from one point to another. Uses input draganddrop on Android 8.0+ (API 26), falls back to swipe on older versions.

NameTypeReqDescription
durationintegerDuration in milliseconds
endXintegeryesEnd X coordinate
endYintegeryesEnd Y coordinate
serialstringDevice serial number
startXintegeryesStart X coordinate
startYintegeryesStart Y coordinate
NameTypeReqDescription
messagestringyesHuman-readable description of the action performed
successbooleanyesWhether the input action was dispatched to the device

No examples provided.

expand_notifications ~29

Expand the notification panel (requires active scrcpy session)

NameTypeReqDescription
serialstringDevice serial number
NameTypeReqDescription
messagestringyesHuman-readable description of the result
successbooleanyesWhether the action succeeded

No examples provided.

expand_settings ~30

Expand the quick settings panel (requires active scrcpy session)

NameTypeReqDescription
serialstringDevice serial number
NameTypeReqDescription
messagestringyesHuman-readable description of the result
successbooleanyesWhether the action succeeded

No examples provided.

file_list ~47

List directory contents on the device.

NameTypeReqDescription
pathstringyesAbsolute path to the directory on the device (e.g., /sdcard/)
serialstringDevice serial number
NameTypeReqDescription
countintegeryesNumber of entries returned
entriesarrayyesDirectory entries
pathstringyesThe directory that was listed

No examples provided.

file_pull ~69

Pull a file from the device to the host machine.

NameTypeReqDescription
localPathstringyesDestination absolute path on the host machine
remotePathstringyesPath to the file on the device (e.g., /sdcard/myfile.txt)
serialstringDevice serial number
NameTypeReqDescription
messagestringyesadb pull result or a confirmation message
successbooleanyesWhether the file was pulled

No examples provided.

file_push ~69

Push a file from the host machine to the device.

NameTypeReqDescription
localPathstringyesAbsolute path to the file on the host machine
remotePathstringyesDestination path on the device (e.g., /sdcard/myfile.txt)
serialstringDevice serial number
NameTypeReqDescription
messagestringyesadb push result or a confirmation message
successbooleanyesWhether the file was pushed

No examples provided.

input_text ~37

Type text into the currently focused input field

NameTypeReqDescription
serialstringDevice serial number
textstringyesText to type
NameTypeReqDescription
messagestringyesHuman-readable description of the action performed
successbooleanyesWhether the input action was dispatched to the device

No examples provided.

key_event ~68

Send a key event to the device. Supports keycodes like HOME, BACK, ENTER, VOLUME_UP, etc.

NameTypeReqDescription
keycodestring|numberyesKeycode name (e.g., 'HOME', 'BACK') or numeric value
serialstringDevice serial number
NameTypeReqDescription
messagestringyesHuman-readable description of the action performed
successbooleanyesWhether the input action was dispatched to the device

No examples provided.

long_press ~55

Perform a long press at the specified coordinates

NameTypeReqDescription
durationintegerDuration in milliseconds
serialstringDevice serial number
xintegeryesX coordinate
yintegeryesY coordinate
NameTypeReqDescription
messagestringyesHuman-readable description of the action performed
successbooleanyesWhether the input action was dispatched to the device

No examples provided.

rotate_device ~29

Rotate the device screen (requires active scrcpy session)

NameTypeReqDescription
serialstringDevice serial number
NameTypeReqDescription
messagestringyesHuman-readable description of the result
successbooleanyesWhether the action succeeded

No examples provided.

screen_off ~24

Turn the device screen off

NameTypeReqDescription
serialstringDevice serial number
NameTypeReqDescription
messagestringyesHuman-readable description of the result
successbooleanyesWhether the action succeeded

No examples provided.

screen_on ~27

Wake the device screen (turn screen on)

NameTypeReqDescription
serialstringDevice serial number
NameTypeReqDescription
messagestringyesHuman-readable description of the result
successbooleanyesWhether the action succeeded

No examples provided.

screen_record_start ~68

Start recording the screen. Recording continues until screen_record_stop is called.

NameTypeReqDescription
durationnumberMax recording duration in seconds (optional, device limit usually 180s)
remotePathstringPath on device to save recording
serialstringDevice serial number
NameTypeReqDescription
messagestringyesHuman-readable status message
remotePathstringPath on the device where the recording is saved
successbooleanyesWhether recording was started

No examples provided.

screen_record_stop ~68

Stop screen recording and optionally pull the file to the host.

NameTypeReqDescription
localPathstringLocal path to save recording (only if pullToHost is true)
pullToHostbooleanPull the recording to the host machine
serialstringDevice serial number
NameTypeReqDescription
localPathstringHost path the recording was pulled to, if requested
messagestringyesHuman-readable status message
successbooleanyesWhether recording was stopped

No examples provided.

screenshot ~33

Take a screenshot of the Android device screen. Returns the image as base64.

NameTypeReqDescription
serialstringDevice serial number
NameTypeReqDescription
encodingstringyesEncoding of the image data in the content block
mimeTypestringyesMIME type of the returned image
sourcestringyesCapture path used (scrcpy frame or adb screencap)

No examples provided.

scroll ~101

Scroll at the specified position. dx and dy are scroll amounts (-1 to 1 range approximated for ADB).

NameTypeReqDescription
dxnumberyesHorizontal scroll amount (negative=left, positive=right)
dynumberyesVertical scroll amount (negative=up, positive=down)
serialstringDevice serial number
xintegeryesX coordinate to scroll at
yintegeryesY coordinate to scroll at
NameTypeReqDescription
messagestringyesHuman-readable description of the action performed
successbooleanyesWhether the input action was dispatched to the device

No examples provided.

shell_exec ~59

Execute an arbitrary ADB shell command on the device and return the output. Use this for any device operation not covered by other tools.

NameTypeReqDescription
commandstringyesShell command to execute on the device
serialstringDevice serial number
NameTypeReqDescription
outputstringyesCombined stdout/stderr text from the command

No examples provided.

start_session ~93

Start a scrcpy session for fast input control and screenshots. When a session is active, tap/swipe/text/screenshot are 10-50x faster. Requires scrcpy-server to be installed.

NameTypeReqDescription
maxFpsintegerMax frames per second (default 30)
maxSizeintegerMax screen dimension in pixels (default 1024)
serialstringDevice serial number
NameTypeReqDescription
messagestringyesHuman-readable status message
screenSizeobjectyesNative display resolution — tap/swipe use these native coordinates, matching ui_dump / ui_find_element bounds directly (no scaling)
serialstringyesResolved device serial
statusstringyesSession status (e.g. 'connected')
videoAvailablebooleanyesWhether the scrcpy video stream is up. When false, the session still works for input/clipboard but screenshots fall back to adb screencap.

No examples provided.

start_video_stream ~67

Start an HTTP MJPEG video stream of the device screen and open a viewer window (ffplay). Starts a scrcpy session automatically if needed.

NameTypeReqDescription
portintegerHTTP port for the MJPEG stream (default 7183)
serialstringDevice serial number
NameTypeReqDescription
screenSizeobjectyesNative display resolution — tap/swipe use these native coordinates (no scaling)
statusstringyesStream status (e.g. 'started')
urlstringyesHTTP URL of the MJPEG stream
viewerstringyesViewer status message

No examples provided.

stop_session ~34

Stop the active scrcpy session. Tools will fall back to ADB commands.

NameTypeReqDescription
serialstringDevice serial number
NameTypeReqDescription
messagestringyesHuman-readable status message
successbooleanyesWhether the session was stopped

No examples provided.

stop_video_stream ~35

Stop the HTTP MJPEG video stream and close the viewer window for a device.

NameTypeReqDescription
serialstringDevice serial number
NameTypeReqDescription
messagestringyesHuman-readable status message
statusstringyesStream status (e.g. 'stopped')

No examples provided.

swipe ~81

Perform a swipe gesture from one point to another

NameTypeReqDescription
durationintegerDuration in milliseconds
serialstringDevice serial number
x1integeryesStart X coordinate
x2integeryesEnd X coordinate
y1integeryesStart Y coordinate
y2integeryesEnd Y coordinate
NameTypeReqDescription
messagestringyesHuman-readable description of the action performed
successbooleanyesWhether the input action was dispatched to the device

No examples provided.

tap ~42

Tap at the specified screen coordinates

NameTypeReqDescription
serialstringDevice serial number
xintegeryesX coordinate
yintegeryesY coordinate
NameTypeReqDescription
messagestringyesHuman-readable description of the action performed
successbooleanyesWhether the input action was dispatched to the device

No examples provided.

ui_dump ~41

Dump the full UI hierarchy of the current screen as XML. Useful for understanding screen structure before using ui_find_element.

NameTypeReqDescription
serialstringDevice serial number
NameTypeReqDescription
xmlstringyesThe UI hierarchy as a uiautomator XML document

No examples provided.

ui_find_element ~136

Find UI elements on screen by text, resource ID, class name, or content description. Returns matching elements with their tap coordinates. At least one search criterion must be provided.

NameTypeReqDescription
classNamestringClass name to match exactly (e.g., 'android.widget.Button')
contentDescstringContent description to search for (partial match, case-insensitive)
resourceIdstringResource ID to match exactly (e.g., 'com.app:id/button')
serialstringDevice serial number
textstringText content to search for (partial match, case-insensitive)
NameTypeReqDescription
countintegeryesNumber of matching elements
elementsarrayyesMatching UI elements with tap coordinates

No examples provided.

version ~66

Report which scrcpy version is being used by the MCP server. The version always describes the scrcpy-server file the session pushes: it comes from the SCRCPY_SERVER_VERSION environment variable, or from the scrcpy client belonging to the same install as that server, or a built-in default.

Input schema present but exposes no named parameters.

NameTypeReqDescription
sourcestringyesWhich rung resolved the install: 'env' (SCRCPY_SERVER_VERSION env var), 'binary' (the scrcpy client found on PATH), 'server-sibling' (the client belonging to the server SCRCPY_SERVER_PATH names), 'pa…
versionstringyesScrcpy version string (e.g. '4.0', '2.7')

No examples provided.

Common questions

What is the io.github.JuanCF/scrcpy-mcp server?

io.github.JuanCF/scrcpy-mcp is listed in the public MCP registry as io.github.JuanCF/scrcpy-mcp. MCP server for Android device control via ADB and scrcpy. This page covers its npm package (scrcpy-mcp).

Is the io.github.JuanCF/scrcpy-mcp server safe to use?

io.github.JuanCF/scrcpy-mcp scores 95 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the io.github.JuanCF/scrcpy-mcp server expose?

io.github.JuanCF/scrcpy-mcp exposes 39 tools: start_session, stop_session, version, device_list, device_info, and 34 more. Their descriptions and schemas cost roughly 2,202 tokens of context every time the server is loaded.

Is the io.github.JuanCF/scrcpy-mcp server still maintained?

io.github.JuanCF/scrcpy-mcp is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the io.github.JuanCF/scrcpy-mcp server under?

io.github.JuanCF/scrcpy-mcp declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.