{"name":"io.github.Rudrasamadhiya/expo-mcp-bridge","slug":"rudrasamadhiya-expo-mcp-bridge","title":"Expo Agent Bridge","description":"Let AI agents see, tap, type, scroll, screenshot and debug your Expo app on a real phone.","url":"https://mcp.market/server/rudrasamadhiya-expo-mcp-bridge","rating":null,"grade":"A","score":85,"certified":false,"status":"active","category":"ai","tags":["ai"],"presence":{"score":30,"stars":1,"forks":0,"downloads_week":82,"last_push_at":"2026-10-21T19:55:15.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/Rudrasamadhiya/expo-mcp-bridge","website":"https://rudrasamadhiya.github.io/expo-agent-kit/docs/bridge/","version":"0.3.2","remotes":[],"packages":[{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"expo-mcp-bridge","version":"0.3.2","transport":{"type":"stdio"},"environmentVariables":[{"description":"WebSocket port the phone connects to (default 8347)","format":"number","name":"EXPO_MCP_PORT"}]}],"tools":[{"name":"app_batch","description":"Run several actions in one call (fastest way to fill forms or walk a flow). Returns the screen once at the end. Steps: {action:\"tap\"|\"type\"|\"scroll\"|\"toggle\"|\"navigate\"|\"wait\"|\"dismiss_keyboard\", ...that tool's args}.","write_action":true,"price_micros":0,"input_schema":null},{"name":"app_dismiss_keyboard","description":"Hide the on-screen keyboard.","write_action":false,"price_micros":0,"input_schema":null},{"name":"app_eval","description":"Run JavaScript inside the app (dev only) and return the JSON result. Expression or statements with return. `bridge` and `RN` (react-native) are in scope.","write_action":true,"price_micros":0,"input_schema":null},{"name":"app_layout","description":"Positions (dp, window coordinates) and font sizes of elements on the current screen. For layout checks and visual work; app_snapshot is cheaper for acting.","write_action":false,"price_micros":0,"input_schema":null},{"name":"app_logs","description":"Console logs and JS errors captured in the app.","write_action":false,"price_micros":0,"input_schema":null},{"name":"app_navigate","description":"Open a route (expo-router path like \"/settings\") or a full deep link.","write_action":false,"price_micros":0,"input_schema":null},{"name":"app_network","description":"HTTP requests made by the app (fetch/XHR) with status, timing and truncated bodies.","write_action":false,"price_micros":0,"input_schema":null},{"name":"app_reload","description":"Reload the JS bundle (like pressing r in Metro).","write_action":false,"price_micros":0,"input_schema":null},{"name":"app_screenshot","description":"JPEG screenshot of the app. Use only for visual/layout questions; app_snapshot is cheaper for finding elements. With saveTo, writes the file and returns only its path (no image tokens).","write_action":false,"price_micros":0,"input_schema":null},{"name":"app_scroll","description":"Scroll a list/ScrollView (first one on screen if no target).","write_action":false,"price_micros":0,"input_schema":null},{"name":"app_snapshot","description":"Compact text outline of the current screen (buttons, inputs, text, lists) with refs like [e3] to act on. Prefer this over screenshots.","write_action":false,"price_micros":0,"input_schema":null},{"name":"app_status","description":"Check whether the mobile app is connected and show device info. Call first.","write_action":false,"price_micros":0,"input_schema":null},{"name":"app_tap","description":"Press a button/pressable element. Returns what changed on screen plus any new errors.","write_action":false,"price_micros":0,"input_schema":null},{"name":"app_toggle","description":"Flip a Switch (or set it with value).","write_action":false,"price_micros":0,"input_schema":null},{"name":"app_type","description":"Set text in an input (replaces by default). Target by ref, testID, or placeholder text.","write_action":false,"price_micros":0,"input_schema":null},{"name":"app_wait","description":"Wait until text or a testID appears (or disappears with gone=true). Cheaper than polling snapshots.","write_action":false,"price_micros":0,"input_schema":null},{"name":"device_key","description":"Press a hardware/system key on an Android device via adb (USB or Wi-Fi debugging): ….","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":85,"grade":"A","scanned_at":"2026-10-25T16:32:48.338Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-25T16:32:48.309Z","components":{"code":{"score":20,"max":25,"notes":["9 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":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":15,"max":15,"notes":["last push 4 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":"client/index.js: …| ''); let fn; try { fn = new Function('bridge', 'RN', 'return (' + code + '\\n)…"}],"inputs":{"packages":[{"registryType":"npm","identifier":"expo-mcp-bridge","version":"0.3.2","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":3,"publishedAt":"2026-10-21T19:27:42.356Z","repositoryUrl":"git+https://github.com/Rudrasamadhiya/expo-mcp-bridge.git","weeklyDownloads":82}],"repo":{"found":true,"owner":"Rudrasamadhiya","repo":"expo-mcp-bridge","archived":false,"pushedAt":"2026-10-21T19:55:15Z","stars":1,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/213203169?v=4","ownerCreatedAt":"2025-05-24T14:35:10Z","license":"MIT"},"icon":{"url":null,"source":"none"},"presence":{"stars":1,"forks":0,"downloadsWeek":82,"license":"MIT","lastPushAt":"2026-10-21T19:55:15.000Z","score":30}}}},"grade_history":[],"reviews":[]}