chrome-mcp · android-mcp
MCP servers that drive your real Chrome browser and Android devices from Claude Code. Semantic locators, live debugging, flow recording — one config block, no install script.
chrome-mcp
Drives Chrome on macOS/Linux/Windows via CDP. Auto-launches Chrome on first tool call.
Paste into ~/.claude.json and restart Claude Code:
{
"mcpServers": {
"chrome": {
"command": "node",
"args": [
"-e",
"(async()=>{const o=await import(\"node:fs\"),{homedir:s}=await import(\"node:os\"),{join:e}=await import(\"node:path\"),{pathToFileURL:a}=await import(\"node:url\"),i=process.env.CHROME_MCP_ENDPOINT||\"https://chrome-mcp.actuallyroy.com\",c=process.env.CHROME_MCP_CACHE_DIR||e(s(),\".chrome-mcp\"),r=e(c,\"loader.mjs\");if(!o.existsSync(r)||process.env.CHROME_MCP_REFRESH_LOADER){o.mkdirSync(c,{recursive:!0});const t=await fetch(i+\"/loader.mjs\");if(!t.ok)throw new Error(\"loader download failed: \"+t.status);o.writeFileSync(r,Buffer.from(await t.arrayBuffer()))}await import(a(r).href)})().catch(o=>{console.error(\"[chrome-mcp]\",o.message||o),process.exit(1)});"
]
}
}
}sha256: b8c2b5b6bd872a1e4f1b85e768309992112f82c54c48a2a5a29dcf03dd074b26
bundle · manifest · loader.mjs
android-mcp
Drives Android devices and emulators via UIAutomator2 (same chrome-mcp pattern, native view hierarchy instead of DOM). Requires adb and a device/emulator ready.
Paste into ~/.claude.json and restart Claude Code:
{
"mcpServers": {
"android": {
"command": "node",
"args": [
"-e",
"(async()=>{const o=await import(\"node:fs\"),{homedir:s}=await import(\"node:os\"),{join:a}=await import(\"node:path\"),{pathToFileURL:i}=await import(\"node:url\"),c=process.env.ANDROID_MCP_ENDPOINT||\"https://chrome-mcp.actuallyroy.com\",e=process.env.ANDROID_MCP_CACHE_DIR||a(s(),\".android-mcp\"),r=a(e,\"loader.mjs\");if(!o.existsSync(r)||process.env.ANDROID_MCP_REFRESH_LOADER){o.mkdirSync(e,{recursive:!0});const t=await fetch(c+\"/android/loader.mjs\");if(!t.ok)throw new Error(\"android loader download failed: \"+t.status);o.writeFileSync(r,Buffer.from(await t.arrayBuffer()))}await import(i(r).href)})().catch(o=>{console.error(\"[android-mcp]\",o.message||o),process.exit(1)});"
]
}
}
}sha256: 06199440fac0fc59f6e399e63e2c0bc0c824be8105b68d07b102b6f2e8d6505c
bundle · manifest · loader.mjs · u2 APK
How updates work
Each bootstrap downloads its loader.mjs once into ~/.chrome-mcp/ or ~/.android-mcp/. The loader fetches the latest bundle on every launch, verifies its SHA-256, and runs it. If the endpoint is unreachable, it falls back to the cached bundle.
CHROME_MCP_PIN_VERSION/ANDROID_MCP_PIN_VERSION— pin a versionCHROME_MCP_SKIP_UPDATE=1/ANDROID_MCP_SKIP_UPDATE=1— skip network checks*_ENDPOINT— self-host the bundle elsewhere*_REFRESH_LOADER=1— force re-download of loader.mjs
What's in chrome-mcp
click / fill / fill_form / select_option— semantic locators (text, label, ref, selector)outline— compact DOM snapshot with stable refsget_toasts/wait_for_toast— survives auto-dismissget_console/get_network— captured logs + fetch/XHRpause / resume— in-page "Resume" overlay, blocks the agentinject_script— persists across navigationsstart_recording / stop_recording / run_script / assert— flowslaunch_chrome— auto-fires on first tool call
What's in android-mcp
click / fill / long_press— locators: text / desc / id / xpath / ref / class / UiSelectoroutline— real view hierarchy, grouped by interaction typedescribe— full node info for one elementlaunch_app / stop_app / install_app / clear_app_datapress_key— HOME, BACK, APP_SWITCH, ENTER, VOLUME_UP…swipe / scroll (with until_text)get_logcat— long-running ring buffer, filtered by tag/leveladb_shell— escape hatchstart_recording / stop_recording / run_script / assertpause— stderr + flag-file (touch /tmp/android-mcp.resume to continue)