expo-mcp (SajidAlee1/expo-mcp) is an MCP server listed on the M8ven Trust Index. It scores 60 out of 100, grade C. It declares 48 tools. No publisher has claimed this listing.

C
Caution
60/100

expo-mcp

Enables AI assistants to execute Expo and EAS operations including project setup, cloud builds, OTA updates, app submission, and diagnostics.

Caution. Specific findings reduced this grade. They are listed on the page. Grades reflect the full trust pyramid: code, verification depth, and reputation. New projects cap at C until adoption is earned.

How we verified

⚡ Live Monitored: not connected

Verified is a snapshot. Live keeps it current, and builds your track record.

⚡ Connect GitHub → continuous verification on every pushwhy connect →

Who stands behind it

SajidAlee1

Source: Glama

Is this your MCP?

Claim it to get a verified publisher badge, a free copy of our full audit findings, and direct contact for any high-priority issues we find. Or connect your repo for our deepest verification, Live Monitored: read-only, revoke anytime. What we access →

Install from

The grade above is for the source repository. Registries can serve a different version, so we mark the ones we were not able to read.

// key findings
⚠️
Tool descriptions don’t match what handlers do
2 tools describe read intent but their handlers mutate — automation_take_screenshot (line 55: fs.promises.rm(outputPath, { force: true })); automation_take_screenshot_by_testid (line 55: fs.promises.rm(outputPath, { force: true }))
48 tools verified — handlers match their declared behaviour
6 read-only tools verified — handlers contain no write/delete/exec
No credential exfiltration, no sensitive file access, no obfuscation
Static analysis found nothing flowing your secrets to unexpected places.
Open source with a license and README
Anyone can audit the code, the license is declared, and the publisher documents what it does.
🔐
You'll be asked for 1 credential: EXPO_TOKEN
These are read from process.env at runtime. Make sure you trust where they’ll be sent.
// tools this server exposes32 tools

These names and descriptions are the publisher's own, read from the source code. We print them as written. Our assessment is the findings above, not this list.

automation_tap

Tap on the device at the given coordinates (x, y) or by react-native testID. Provide either (x AND y) or testID.

automation_tap_by_testid

Tap on the device by React Native testID

automation_take_screenshot

Take screenshot of the full app or a specific view by react-native testID. Optionally provide testID to screenshot a specific view.

automation_take_screenshot_by_testid

Take screenshot of a specific view by React Native testID

automation_find_view

Find view and dump its properties. This is useful to verify the view is rendered correctly

automation_find_view_by_testid

Find a view by React Native testID and dump its properties

eas_build_create

Trigger a new EAS cloud build for iOS, Android, or both.

eas_build_list

List recent EAS builds with optional filters.

eas_build_status

Get detailed status for a specific EAS build ID.

eas_build_cancel

Cancel a build that is in-queue or in-progress.

expo_doctor

Run expo doctor diagnostics and optionally attempt auto-fixes.

expo_whoami

Check current Expo account authentication state.

eas_project_info

Get project metadata from EAS (id, slug, owner, and config).

expo_init_project

Create a new Expo project with a selected template.

expo_install_packages

Install packages with Expo version compatibility checks for the current SDK.

expo_get_config

Read and evaluate app config from app.json/app.config.*

expo_prebuild

Generate ios/android native folders from Expo config and plugins.

eas_submit_ios

Submit an iOS build to App Store Connect/TestFlight.

eas_submit_android

Submit an Android build to Google Play Console.

eas_update_publish

Publish an OTA update to an EAS branch/channel.

eas_update_list

List recent published updates with optional branch filtering.

eas_channel_create

Create a new EAS update channel.

expo_docs_list

List curated Expo and React Native documentation links.

expo_docs_search

Search Expo/React Native llms indexes for matching docs lines.

expo_docs_get

Fetch docs content using curated docId or direct URL.

expo_router_sitemap

Query the all routes of the current expo-router project. This is useful if you were using expo-router and want to know all the routes of the app

open_devtools

Open the React Native DevTools

collect_app_logs

Collect logs from native device (logcat/syslog) or JavaScript console

automation_swipe

Swipe from one coordinate to another on the device

automation_scroll

Scroll in a specific direction on the device

automation_type_text

Type text on the device keyboard

automation_press_key

Press a key on the device

// environment variables
To run this server yourself, you supply these values. They go in your own MCP client configuration and stay on your machine. The secret label means the value is sensitive, not that the server mishandles it.
configANDROID_HOME
configANDROID_SDK_ROOT
configEXPO_DEV_SERVER_PORT
configEXPO_DEV_SERVER_URLdev-server-url / : explicit Metro URL
configEXPO_MCP_SERVER_URLmcp-server-url / : tunnel server URL
configEXPO_PROJECT_ROOTroot / : Expo project root
🔐 secretEXPO_TOKENfor account/EAS actions in MCP tools
configRCT_METRO_PORT
configWORKSPACE_FOLDER_PATHS
// quality suggestions

Tool annotations

16/48 tools have annotations

Add readOnlyHint or destructiveHint annotations to every tool so hosts can warn users before invoking.

All four hints declared on every tool

32/48 tools missing one or more hints — automation_tap (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint); automation_tap_by_testid (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint); automation_take_screenshot (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint), +29 more. OpenAI's directory rejects tools where any of the four hints are missing or non-boolean.

For every tool, set all four hints (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) to explicit true/false values that match the handler’s actual behaviour.

Destructive tools are labelled

2 tools perform destructive updates without destructiveHint — automation_take_screenshot deletes at line 55 (fs.promises.rm(outputPath, { force: true })); automation_take_screenshot_by_testid deletes at line 55 (fs.promises.rm(outputPath, { force: true }))

Add destructiveHint:true to any tool whose handler calls .delete(), .upsert(), .update(), unlink, rm, DELETE, DROP, REPLACE INTO, or any operation that overwrites existing data.

Descriptions match behaviour

2 tools describe read intent but their handlers mutate — automation_take_screenshot (line 55: fs.promises.rm(outputPath, { force: true })); automation_take_screenshot_by_testid (line 55: fs.promises.rm(outputPath, { force: true }))

Rename the tool, rewrite the description, or move the side-effect into a separate clearly-named tool.

Tool inputs are validated

45/48 tool handlers declare input schemas (94%)

Declare an inputSchema with zod/joi/yup on every tool definition.

Tool handlers catch errors

35/48 tool handlers wrap calls in try/catch (73%)

Wrap each tool handler body in try/catch and return a structured error response.

Tool test coverage

Only 0/48 tools referenced in tests (0%)

Write tests that reference each tool by name so every tool has at least one test.

Shell command execution

2 child_process calls — runs shell commands

Prefer library functions over shell-outs. If you must shell out, ensure all inputs are properly escaped.

Tool description accuracy

automation_take_screenshot: description implies read-only but handler writes/deletes/executes; automation_take_screenshot_by_testid: description implies read-only but handler writes/deletes/executes

Update tool descriptions to accurately reflect all capabilities — especially write, delete, or execute operations.

Claim the listing to review these findings one by one and send us a correction where you disagree, straight to the team. Claiming also means we tell you when the grade moves, and reach you first if we find anything urgent.

// full audit trail
The findings above are the summary. The full trail, every check we ran, each deduction, the network hosts observed and the dependency advisories, goes to verified publishers, along with an alert whenever a new one lands. Verified publishers can also review each finding and dispute it in one click. Publisher corrections have sharpened several of our checks this month, because the maintainer knows the codebase better than any scanner.
// improvement guidance — verified publishers only
We have 9 concrete improvements we can share with the publisher of this MCP. Each comes with specific guidance to raise the trust score.
// embed badge in your README
[![M8ven Verified](https://m8ven.ai/badge/mcp/sajidalee1/expo-mcp?variant=verified)](https://m8ven.ai/mcp/sajidalee1/expo-mcp)
Shows verification status without the grade. Want the grade badge instead? Remove ?variant=verified from the URL.
commit: b32d35a817609ec3972643c30c5ea2636a520266
code hash: b6f73520387f932b033a838fb6bcc639968f46d3c2b3a4fdfd829530fabe5b43
view raw JSON →
Check MCPs from inside your assistant
Tool Check · MCP

Vetting this one by hand? Tool Check is an MCP that scores other MCPs. Add it once and ask Claude, ChatGPT, or any MCP client to grade a server, surface CVEs, check the publisher, and suggest safer alternatives — before you install.

https://m8ven.ai/api/mcp/tool-check
check_toolsearch_toolscompare_toolsrecommend_alternativescheck_publisherreport_concern
How to add it →Free · no account needed · works in any MCP client