Skip to main content
Glama

NativeKeel

npm Weekly downloads License: MIT React Native Directory MCP Registry GitHub Marketplace Awesome MCP Servers

Health check for React Native and Expo apps. Will your app survive the next upgrade, pass the store and stay safe? One command, no install, no account:

npx nativekeel upgrade   # go/no-go for the newest React Native / Expo, with file and line
npx nativekeel           # full health check: upgrade, store rules, crashes, security, accessibility

No terminal handy? Paste your package.json at nativekeel.com/check: the same dependency checks and upgrade plan, run in your browser.

Works with GitHub Actions (a quality gate comment on every pull request), SonarQube (findings in your existing projects and quality gate) and AI coding agents (MCP server for Claude Code, Codex and Cursor). Several apps? npx nativekeel fleet puts them on one page.

What's new in 0.1.132: turning off expo-camera's barcode scanner (expo.camera.barcode-scanner-enabled=false) to drop Google's portrait-locked scanner activity also turns off CameraView scanning on Android, so onBarcodeScanned silently never fires. NativeKeel now reports that when the app scans barcodes, and the Android 16 note leads with the fix that is safe either way (tools:remove). Recent releases added the expo-camera orientation lock to the Android 16 note, the target SDK check for managed Expo apps, a check for UIScene setups that lose the deep link that launches the app, a list of 30 libraries that still call APIs React Native removed, npx nativekeel upgrade (a go/no-go for the newest React Native / Expo), known malware anywhere in the lockfile's dependency tree, and detection of the actively exploited Metro dev-server flaw CVE-2025-11953. Every check is tuned on 1,100+ open-source React Native and Expo projects, with recently updated ones added every week, to keep false alarms out (measured accuracy). All releases →

Summary  4 critical · 4 high · 6 medium · 6 low
Security (OWASP MASVS)  crypto 1 · network 1 · code 1  ·  7 finding categories; not a compliance verdict

Start here
  1. Revoke the AWS access key ID in src/App.js:6 at the provider today.
  2. Set targetSdkVersion = 36 and compileSdkVersion = 36 in android/build.gradle.
  3. Replace @react-native-community/push-notification-ios: no New Architecture support, unmaintained.

Could someone steal data or abuse the app?

npx nativekeel security . --html security.html --fail-on high

Review secrets, credential leaks, backend access rules, unsafe code execution, transport and dependency risks in one report. New flow/configuration findings show where the input enters, where it is used, what an attacker would need, and how to verify the fix. --offline keeps the scan offline and skips online advisory checks. No source code is uploaded.

Keys added at build time. An EXPO_PUBLIC_ value set in EAS or a CI secret never appears in the repository, so no source scan can see it, yet it ships in the app. NativeKeel also opens the built app and scans the JavaScript bundle inside it, plain JavaScript or Hermes bytecode: APKs and AABs under android/app/build/outputs, eas build --local results, committed bundles, and any APK, AAB or IPA you pass with --artifact app.apk (the GitHub Action's artifact input, after your build step).

This is source analysis, not a live attack or a security certificate. Security checks and scope · Mobile flow details · Native Android details.

Related MCP server: rn-devtools-mcp

What it checks

Upgrade

  • Is your React Native / Expo version still supported? React Native supports the latest three minors; in Expo projects React Native moves with the SDK.

  • Can you upgrade at all? The legacy architecture was removed in 0.82. If the New Architecture is off (it is off by default before 0.76), you are stuck at 0.81.

  • Which packages block the upgrade? Native modules without New Architecture support (cross-checked with the package's own codegen spec), unmaintained or with no release in years, with verified alternatives and renamed packages. Library versions for each step come from the libraries' own compatibility tables.

  • Which packages might be unused? Installed packages with no import, native reference, requirement or patch found. Listed for review, not automatic removal: dynamic and generated usage can hide from a static scan.

Store

  • Will Google Play and the App Store accept your next build? targetSdk, permissions Google Play restricts (photo/video, all files, background location, app installs, SMS), 16 KB memory pages (it also opens your built APK/AAB and checks every native library), the iOS privacy manifest and SDKs too old to have one, missing Info.plist usage descriptions, sign-up without account deletion, social login without Sign in with Apple, and release builds signed with the debug key.

Crashes

  • Will it crash at runtime? packages off the versions your Expo SDK expects, release builds that still point at a development server, native libraries that need a newer React Native, Reanimated without its Babel plugin or react-native-worklets, mixed @react-native-firebase/* or @react-navigation/* majors, a second copy of React or React Native inside a dependency, Kotlin modules that cannot load through the New Architecture interop layer, AppDelegate setups that crash in Release, camera/photos/location access without the Info.plist text iOS requires, imports of APIs removed from React Native core (AsyncStorage, Picker, ViewPropTypes, …) or deprecated for removal (ImageBackground, SafeAreaView), and traps learned from real upgrades.

Security, grouped by OWASP MASVS

  • Secrets in the app or the repo: AWS, Stripe, OpenAI, Anthropic, GitHub, Slack, SendGrid, Twilio, Shopify, Google OAuth and Supabase service_role keys, private keys, .env values compiled into the bundle, Expo extra/EXPO_PUBLIC_/eas.json secrets, signing keys and passwords.

  • Data on the device: iOS file sharing (UIFileSharingEnabled) that exposes an unencrypted MMKV, expo-sqlite or Realm database (they live in Documents by default on iOS), passwords that flow into crash reports, analytics, databases or plain AsyncStorage (followed through variables), auth tokens in unencrypted storage, Android backups that copy them.

  • Network: TLS certificate checks turned off in native code, cleartext HTTP, NSAllowsArbitraryLoads, plain-HTTP API calls, user-installed CAs in release.

  • Backend rules: Firebase Realtime Database, Firestore and Storage rules open to anyone or in test mode; Supabase tables created without row level security; sign-in-only Firebase write rules and unconditional Supabase UPDATE/DELETE policies without row ownership checks. Policy findings include file/line evidence and explain deployment/grant assumptions.

  • Authentication: biometric prompts (Face ID, Touch ID, fingerprint) whose success is only a yes/no in JavaScript, with no secret bound to biometrics in the keychain/keystore, in JS or native code: the prompt guards the screen, not the data.

  • Cryptography: hardcoded encryption keys, MD5/SHA-1 on passwords, ECB mode, Math.random for nonces and salts.

  • Platform: WebViews that read local files or load HTTP into HTTPS, Android components any app can start, unverified deep links and the template myapp:// URL scheme.

  • Dependencies and reverse engineering: known vulnerabilities in the exact versions you ship (GitHub Advisory Database), source maps in the app, Hermes or R8 off.

These are static checks: they catch the common, detectable mistakes, not everything a penetration test of the running app and backend would.

Performance

  • What is your release bundle actually made of? npx nativekeel bundle reads the source map a release build already wrote (Android: android/app/build/generated/sourcemaps/react/release/, Expo: npx expo export --dump-sourcemap) and measures how much of the shipped code is your app and each package, and which packages are bundled twice. --base old.map compares two builds: what was added, removed or grew. Nothing is built or run; the normal scan picks the map up too.

  • Where should you investigate performance? Nested list patterns, JavaScript animation settings, source logging calls, root lodash/moment imports, referenced images over 500 KB, JSON over 300 KB imported into the JavaScript bundle (every language's translations, Lottie animations), and selector allocation patterns. Confirm the actual components, release output and runtime behavior before changing them; these checks do not measure frame rate, startup time or savings. Accessibility

  • Can everyone use it? Icon-only buttons with no accessibility label (VoiceOver and TalkBack say just "button"), buttons smaller than 44×44 with no hitSlop, text and placeholders whose color and background (both set in the code) fall below WCAG contrast, text fields with no label or placeholder, and text scaling turned off for the whole app. Text.defaultProps is flagged too: React 19 (React Native 0.78+) ignores it in JSX, so app-wide fonts and font-scaling limits silently stop applying. Only React Native's own touchables and inputs are checked; custom components, focus order and color contrast still need a test with a screen reader.

App improvement review

npx nativekeel improve /path/to/app --offline
npx nativekeel improve /path/to/app --offline --out IMPROVE.md

Existing security, stability, performance, store and dependency findings become an ordered plan with reasons, applicability conditions, actions, verification and recovery. Exposed credentials get containment instructions. Apparently unused dependencies are review candidates: direct, transitive, dynamic, native and generated consumers must be considered before removal. Performance signals are not measurements.

Use --json for structured output or MCP improve_app. Malware findings block execution-dependent actions. Unknown runtime, backend, accessibility and reliability coverage stays explicit. This adds a decision layer over existing checks, not new vulnerability detectors. See scope and next modules.

Usage

npx nativekeel [path]              # report
npx nativekeel plan --out UPGRADE.md   # step-by-step upgrade plan
npx nativekeel --html report.html  # shareable HTML report
npx nativekeel --markdown pr.md    # summary for a pull request comment
npx nativekeel --sarif nk.sarif    # GitHub code scanning
npx nativekeel --sonar nk-sonar.json  # SonarQube external issues
npx nativekeel --json              # machine-readable output
npx nativekeel --fail-on high      # exit 1 on high or critical (default: critical)
npx nativekeel --offline           # no network at all, local checks only
npx nativekeel --verbose           # list every outdated package
npx nativekeel fleet ~/clients     # every app in a folder side by side

Everything is free. The scan exits with code 1 when it finds a critical issue, so it can gate CI.

Upgrade plan

nativekeel plan turns the report into ordered work: stop leaks, set up a safety net of UI flows, fix crash risks, meet store deadlines, close security gaps, replace blocking packages, switch on the New Architecture at the right point, then upgrade React Native (or the Expo SDK) in small, reviewable hops with links to the Upgrade Helper diffs and the library versions each hop needs. Performance fixes and routine updates come last.

GitHub Action

# .github/workflows/nativekeel.yml
name: NativeKeel
on: [pull_request]
permissions:
  contents: read
  security-events: write   # only needed with sarif: true
jobs:
  health:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
      - uses: actions/setup-node@v7
        with: { node-version: 20 }
      - run: npm ci
      - uses: AlicanAkyol/nativekeel@v0
        with:
          fail-on: critical
          baseline: .nativekeel-baseline.json   # optional
          sarif: true                           # findings inline in the PR

The report is added to the job summary. To also keep one comment on each pull request up to date with what that pull request adds or fixes, give the job pull-requests: write and set pr-comment: true:

permissions:
  contents: read
  pull-requests: write
# …
      - uses: AlicanAkyol/nativekeel@v0
        with:
          pr-comment: true

The comment compares the pull request with its base commit (no code runs) and is edited in place on every push, not repeated. Pull requests from forks get a read-only token, so they get the job summary only.

With a baseline, only findings that are new since the baseline fail the build:

npx nativekeel --save-baseline .nativekeel-baseline.json   # commit this file

Use with AI coding agents (MCP)

Let Claude Code, Codex, Cursor, VS Code or any MCP client ask NativeKeel what is wrong with a project, how to upgrade it, and which version of a library works with your React Native version, instead of guessing. With it installed, the agent checks the project before it upgrades React Native or Expo, adds a native library, prepares a store release, or runs a project you did not write.

NativeKeel MCP server on Glama

Install in Cursor Install in VS Code

Claude Code (plugin: the MCP server plus a skill that tells Claude when to use it):

claude plugin marketplace add AlicanAkyol/nativekeel
claude plugin install nativekeel@nativekeel

Or the MCP server alone: claude mcp add nativekeel -- npx -y nativekeel@latest mcp

Codex (plugin: the MCP server plus the same skill):

codex plugin marketplace add AlicanAkyol/nativekeel
codex plugin add nativekeel@nativekeel

Or only the MCP server, in ~/.codex/config.toml:

[mcp_servers.nativekeel]
command = "npx"
args = ["-y", "nativekeel@latest", "mcp"]

Any other agent, no MCP needed: add this line to your project's AGENTS.md or CLAUDE.md:

Before upgrading React Native or Expo, adding a native library, or preparing a store release, run `npx -y nativekeel@latest --json` and fix the critical and high findings first.

Also listed in the official MCP Registry as io.github.AlicanAkyol/nativekeel.

Tools: scan_project (findings with file:line and fixes), measure_bundle (what the release bundle is made of, from its source map), upgrade_plan (ordered steps), check_library (latest version, New Architecture support, maintenance, the range that works with a given React Native version, known traps) explain_error (what a build, launch, crash or store-review error means, the fix, and where this project is affected) and verify_upgrade (after an upgrade: what got fixed and what is new compared with the last commit). Without MCP: npx nativekeel explain "<error>" --path . and npx nativekeel verify. The server is read-only and only scans folders under the directory it was started in, plus NATIVEKEEL_MCP_ROOTS (set it when your client starts servers from another folder). Results omit source files and non-package project names. Common instruction-like patterns are filtered, but this is not a complete prompt-injection defense. Malware findings stop upgrade plans; verify_upgrade.ok means no new serious findings, while safety.blocked separately reports current malware. Servers started inside a plugin folder (Codex) use your home folder as the boundary, or only NATIVEKEEL_MCP_ROOTS when it is set. See SECURITY.md.

Ratings and several apps at once

Every report rates six areas from A to E, the way SonarQube rates code: Security, Store, Stability, Upgrade, Performance, Accessibility. A means the scan found nothing in that area, B only low findings, C medium, D high, E at least one critical. A rating describes what the scan found, not a guarantee.

npx nativekeel fleet [folder ...] scans every React Native and Expo app under the folders you give it (client projects side by side, or all apps in a monorepo) and shows them in one table, worst first: versions, the six ratings, critical and high counts, and the store and end-of-support deadlines each app faces. --html fleet.html saves it as a page you can share, --markdown and --json work too, and --fail-on applies across all apps.

npx nativekeel fleet ~/clients --html fleet.html --brand "Acme Mobile"
npx nativekeel fleet ~/clients --json > fleet-2026-10.json     # keep this month's run
npx nativekeel fleet ~/clients --base fleet-2026-10.json       # next month: what changed per app

With --base, every app shows what changed since that run ("Security D→B, critical 2→0"), and new or removed apps are listed. npx nativekeel compare before.json after.json does the same for one app, ratings included.

Every app in a GitHub organization, monthly: copy examples/fleet-workflow.yml to .github/workflows/ in any repository of the organization. On the 1st of each month it clones the repositories on the runner, scans them, compares with last month and writes the table to the run summary, with fleet.html and fleet.json kept as the run's artifact. Private repositories need a read-only FLEET_TOKEN secret; NativeKeel uploads nothing.

Already on SonarQube? npx nativekeel --sonar nativekeel-sonar.json writes the findings in SonarQube's generic issue format; pass it to the scanner with -Dsonar.externalIssuesReportPaths=nativekeel-sonar.json (or set sonar: nativekeel-sonar.json on the GitHub Action). Security findings arrive as vulnerabilities, store rules and crash risks as bugs, upgrade and other findings as code smells, each on its file and line. Tested on SonarQube Community Build 26.10. Details: nativekeel.com/sonarqube.

In a pull request, the GitHub Action's comment (pr-comment: true) starts with a quality gate (passed when the change adds no critical or high finding) and the ratings, with what changed.

A .nativekeel.json next to package.json keeps the team's decisions in the repository: the gate level, findings the team has accepted, folders that are not part of the app (a web dashboard, a backend), each with a reason, which checks may fail the build (gate), and an until date on an accepted finding so it comes back for review: teams usually start by gating only the checks they have seen to be right in their code, and keep the rest as a report. Every finding in the report shows its id in brackets. A finding in a file no import reaches is labelled "in code no import reaches"; crash, performance and accessibility findings there are lowered, security findings keep their level, and a project that loads files by a computed path (require.context, import(variable)) gets no such label at all. --fail-on still wins. Ignored findings stay listed in the report, and malware warnings cannot be ignored.

{
  "failOn": "high",
  "gate": ["secret:*", "backend-admin-in-bundle:*", "ci-*", "android-16kb-libs"],
  "ignore": [
    { "id": "flipper", "reason": "Removed in the 0.80 upgrade, sprint 42" },
    { "id": "a11y-small-touch-target*", "reason": "Design review in November", "until": "2026-12-01" }
  ],
  "exclude": [
    { "path": "tools/admin-web", "reason": "Internal web dashboard, not shipped in the app" }
  ]
}

Team panel (closed beta). With --upload (or the Action's panel-token input) and your team's token in NATIVEKEEL_TOKEN, each scan sends a summary to your team's page on nativekeel.com: app name, versions, ratings, finding titles. No source code and no finding details; never with --offline. Live demo · join the beta: hello@nativekeel.com.

Looking after many apps? Tell us what your team needs: hello@nativekeel.com

Reports for clients

Agencies can put their own name on the HTML report: npx nativekeel plan --html plan.html --brand "Acme Mobile".

Why you can run this on private code

  • Your code never leaves your machine. The only requests are package-name lookups on npm and React Native Directory, and one request to npm's advisory endpoint with the names and exact versions of your runtime dependencies (what npm audit sends). In Expo projects without node_modules, one request to unpkg for the versions your Expo SDK expects (only the expo version is sent). --offline makes none; a test traps fetch to prove it.

  • Zero dependencies, no install scripts. Only Node.js built-ins.

  • Read-only. It never changes your project.

  • Safe on untrusted projects. It never runs project code, and a repository's own git config cannot make the scan run a command.

  • Secrets are always masked in every output.

  • Verifiable releases. Published with npm provenance from GitHub Actions: npm audit signatures.

Details and vulnerability reporting: SECURITY.md. Wrong or missed finding? Tell us, no code needed.

Expert help

The tool is free and stays free. If your team would rather hand an upgrade over, the maintainer takes on a few projects at a time: send your report to hello@nativekeel.com. How it works.

License

MIT

Available Tools

9 tools
check_libraryA
Read-onlyIdempotent

What to know about one React Native library before adding or upgrading it: latest version, New Architecture support and maintenance status (React Native Directory), the version range that works with a given React Native version where NativeKeel has a compatibility table, replacements, and known traps.

NameRequiredDescriptionDefault
nameYesnpm package name of the library, for example react-native-reanimated or @react-native-async-storage/async-storage.
react_nativeNoReact Native version to check against, for example 0.88 or 0.88.0. Optional: without it only the general facts are returned.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so safety is covered. The description adds genuinely useful context beyond that: the data sources (React Native Directory, NativeKeel's compatibility table) and the coverage caveat 'where NativeKeel has a compatibility table', which warns results may be partial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One front-loaded sentence with a colon introducing a scannable list of returned facts; no filler or repetition. It is dense and long-ish for a single sentence, but every clause carries content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must carry the return-value burden, and it does so by enumerating the fields returned plus the caveat about compatibility-table coverage and the no-version case. It stops short of stating result format or how missing data is surfaced, but an agent has enough to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameter descriptions already explain the npm package name format and that react_native is optional with only general facts returned otherwise. The description restates the react_native purpose ('the version range that works with a given React Native version') but adds no syntax or format detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('check_library' → what to know about one React Native library) and enumerates the exact facts returned: latest version, New Architecture support, maintenance status, compatibility range, replacements, known traps. This is clearly distinguishable from siblings like upgrade_plan or verify_upgrade without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'before adding or upgrading it' gives a concrete decision point for invoking the tool, which is more than implied usage. It does not name an alternative (e.g., upgrade_plan) or state when not to use it, so it falls short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

explain_errorA
Read-onlyIdempotent

Explain a React Native or Expo build, launch, crash or store-review error: what it means and the fix, from errors NativeKeel has reproduced or verified against Apple, Google, Expo and React Native documentation. Pass the error message (or the failing part of the log) and, optionally, the project path to see where this project is affected. Call it before searching the web or changing versions.

NameRequiredDescriptionDefault
pathNoFolder of the React Native or Expo app, to point at the place in this project the error comes from. Optional.
errorYesThe error message or the relevant part of the build log.
offlineNoDefault true: the project check runs without network requests.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower; the description adds the provenance of answers (errors NativeKeel reproduced or verified against Apple, Google, Expo and React Native docs) and the offline default for the local check. What it does not disclose is the failure mode when no verified match exists, or the response shape. Good added context, but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, zero padding: capability first, then how to supply input, then the ordering directive. Each sentence earns its place and the most decision-relevant content is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description does carry the burden of describing results and it does so at a high level ('what it means and the fix'). Combined with 100% schema coverage and full annotations, an agent has what it needs to invoke it correctly; only the shape of the returned explanation/absence of a match is left unspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all three parameters, including that 'path' points at where in the project the error originates and that 'offline' defaults to true. The description restates the error/path usage ('the failing part of the log', 'see where this project is affected') with only marginal added meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('explain') and a precisely scoped resource (React Native or Expo build, launch, crash or store-review errors), plus what the answer contains ('what it means and the fix'). This clearly differentiates it from the scan/audit/upgrade siblings, which all operate on the project rather than on an error text.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete triggering condition (you have an error message or failing log) and an ordering directive: 'Call it before searching the web or changing versions.' That is real when-to-use guidance. It does not, however, name or exclude any sibling tool, nor state what to do if this tool returns no verified match, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

improve_appA
Read-onlyIdempotent

Prioritize existing security, crash, accessibility, performance, store and dependency findings into a review plan with prerequisites, expected effects and validation. Use this when someone asks what to fix first or how to make the app better overall, across all areas. Do not use it for upgrade questions: use upgrade_readiness for whether to upgrade and upgrade_plan for the upgrade steps. No project code runs, no automatic changes or unmeasured performance claims. Reports unassessed areas explicitly.

NameRequiredDescriptionDefault
pathYesFolder of the React Native or Expo app (the one with package.json), absolute or relative to the workspace. Must be inside the folders this server may read.
offlineNotrue: make no network requests (skip the npm and React Native Directory lookups behind version, maintenance and vulnerability checks). Default false.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the bar is lower, yet the description still adds real context: no project code runs, no automatic changes, no unmeasured performance claims, and unassessed areas are reported explicitly. It stops short of describing how findings are ordered or what the plan's output structure looks like, which keeps it below a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tightly packed sentences: purpose first, then usage triggers, then exclusions with named alternatives, then behavioral caveats. Every sentence carries distinct information and the most actionable content is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter, read-only planning tool with no output schema, the description covers what it does, when to use it, when not to, what it will not do, and what the resulting plan contains. An agent has everything needed to select and invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the path and offline parameters (including the network lookups that offline skips) are already fully documented in the schema. The description adds no parameter-level detail beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Prioritize existing ... findings into a review plan', enumerating the finding domains (security, crash, accessibility, performance, store, dependency) and the plan's contents (prerequisites, expected effects, validation). It is clearly distinguishable from sibling scanners like scan_project and security_audit, which produce findings rather than prioritize them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit positive trigger ('what to fix first or how to make the app better overall, across all areas') and an explicit negative one ('Do not use it for upgrade questions'), routing the agent to upgrade_readiness and upgrade_plan by name. Nothing about tool selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

measure_bundleA
Read-onlyIdempotent

What the release JavaScript bundle of a React Native or Expo app is made of, measured from the source map a release build already wrote (Hermes bytecode maps included): bytes and share for the app code and each package, packages bundled more than once, and the largest JSON. With base (an older map), what was added, removed or changed size since that build. Nothing is built or run; returns found:false with how to produce a map if there is none.

NameRequiredDescriptionDefault
mapNoSource map of the release bundle, relative to path (for example android/app/build/generated/sourcemaps/react/release/index.android.bundle.map). Optional: without it the usual React Native and Expo output folders are searched.
baseNoAn older release source map, relative to path, to compare against: the result then lists packages added, removed or changed in size. Optional.
pathYesFolder of the React Native or Expo app (the one with package.json), absolute or relative to the workspace. Must be inside the folders this server may read.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world). The description adds genuinely new behavioral context: nothing is built or run, and a missing map yields found:false with remediation guidance. It stops short of permission or performance details, so not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads what is measured, then the diff behavior, then the no-build/error fallback — a logical order with no filler. It is dense and long, but each clause carries information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description does the work of describing returns: bytes and share per package, duplicate packages, largest JSON, diff results, and the found:false shape. Complete enough to call correctly, though it could be more explicit about the failure payload structure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all three parameters are already documented in the schema (including the map default-search behavior and the base diff semantics). The description restates the base-comparison outcome without adding syntax or format detail beyond it, matching the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (measure) and resource (release JavaScript bundle composition) plus the exact data source (the source map a release build already wrote). Clearly separable from siblings like scan_project or check_library, which inspect different artifacts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear conditional context: pass base to get a diff against an older build, and the map param is optional because standard RN/Expo output folders are searched. No explicit when-not or named alternative tool, but siblings do not overlap enough to require it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scan_projectA
Read-onlyIdempotent

Health check for a React Native or Expo project: upgrade blockers, New Architecture, Google Play and App Store rules (target SDK, 16 KB pages, Xcode 27 UIScene, privacy manifests), crash risks, accessibility (unlabeled icon buttons and text fields, small touch targets, low text contrast, text scaling), OWASP MASVS security findings, leaked secrets, and signs of malware planted in the project or known malware anywhere in its lockfile dependency tree (run it before installing or starting a project you did not write). Use this for a general "how healthy is this app" or "what is wrong with it" question; it covers every area at a glance. For a deeper security review with attacker prerequisites use security_audit; for "should we upgrade" use upgrade_readiness. Read-only, never runs project code; returns findings with file:line references and fixes, never source code.

NameRequiredDescriptionDefault
pathYesFolder of the React Native or Expo app (the one with package.json), absolute or relative to the workspace. Must be inside the folders this server may read.
offlineNotrue: make no network requests (skip the npm and React Native Directory lookups behind version, maintenance and vulnerability checks). Default false.
min_severityNoLowest severity to return: critical, high, medium, low or info. Default low.low

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and non-destructive, so the safety profile is partly covered. The description still adds valuable context the annotations don't: it never executes project code, it returns findings with file:line references plus fixes, and it never returns source code. It stops short of stating runtime, rate, or permission requirements beyond the schema's path note.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose, then the coverage list, then the routing to alternatives – logical order. The parenthetical enumeration of store rules and accessibility checks is dense but each item is a concrete area an agent could match a user question against. Slightly overlong as one running sentence, but nothing reads as filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description tells the agent what to expect back (findings with file:line references and fixes, never source code), covers side effects (never runs project code), and covers usage context. Nothing an agent needs in order to call it correctly or interpret results is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with enum values and defaults fully documented for all three parameters, so the schema carries the burden. The description adds no per-parameter guidance of its own; the only inferable link is that the offline parameter relates to network-dependent checks, which the schema already states explicitly. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ("Health check for a React Native or Expo project") and then enumerates the concrete domains covered: upgrade blockers, store rules, crash risks, accessibility, MASVS, secrets, malware. An agent can tell exactly what this does and how it differs from security_audit, upgrade_readiness, and check_library without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the use case ("general 'how healthy is this app' question; covers every area at a glance") and names both alternatives with their selecting conditions: security_audit for deeper attacker-prerequisite review, upgrade_readiness for upgrade decisions. It even adds a proactive trigger ("run it before installing or starting a project you did not write").

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

security_auditA
Read-onlyIdempotent

Review mobile app data exposure, account access, unsafe code execution, backend rules and dependency risks. Returns source evidence, attacker prerequisites, fixes, validation steps and explicit coverage limits. Use this when the question is specifically about security ("can this app be hacked", "is user data safe", before a security review or release); it goes deeper than the security part of scan_project and explains what an attacker would need for each finding. For an overall health check use scan_project. Static and read-only; does not claim a live penetration test or a clean bill of health.

NameRequiredDescriptionDefault
pathYesFolder of the React Native or Expo app (the one with package.json), absolute or relative to the workspace. Must be inside the folders this server may read.
offlineNotrue: make no network requests (skip the npm and React Native Directory lookups behind version, maintenance and vulnerability checks). Default false.
min_severityNoLowest severity to return: critical, high, medium, low or info. Default low.low

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is partly covered; the description still adds non-obvious context: that it is static rather than a live penetration test, that it will not issue a clean bill of health, and that output includes attacker prerequisites and explicit coverage limits. It stops short of stating network-dependency behavior for the offline path or runtime/pagination characteristics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with what it covers and what it returns, then routing guidance, then scope caveats. The quoted user-question examples cost some length but help matching; four sentences with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only three-parameter analysis tool with no output schema, the description covers the scan surface, the shape of the findings (evidence, prerequisites, fixes, validation), and the honesty caveats an agent needs to set expectations. Nothing required to invoke or interpret it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and all three parameters (path, offline, min_severity) are documented in the schema with a defaulted enum. The description adds nothing about parameter behavior, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (review) over a concrete set of resources (data exposure, account access, unsafe code execution, backend rules, dependency risks) and names scan_project as the sibling it differs from. An agent can tell exactly which tool to open without comparing schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use triggers with quoted user phrasings ("can this app be hacked", "is user data safe", pre-release review) and an explicit when-not ("For an overall health check use scan_project"), plus a depth relationship between the two. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upgrade_planA
Read-onlyIdempotent

Ordered, step-by-step upgrade plan for a React Native or Expo project: phases in the order to do them (security fixes, crash risks, store deadlines, React Native and Expo upgrades, library replacements), the reason for each phase and concrete steps with file names. Use this once the decision to upgrade is made and the user wants the work in order; call upgrade_readiness first for the go/no-go. For non-upgrade priorities use improve_app. Built from the same scan as scan_project; stops with a warning if the project contains planted malware. Read-only.

NameRequiredDescriptionDefault
pathYesFolder of the React Native or Expo app (the one with package.json), absolute or relative to the workspace. Must be inside the folders this server may read.
offlineNotrue: make no network requests (skip the npm and React Native Directory lookups behind version, maintenance and vulnerability checks). Default false.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, open-world. The description adds real behavioral context beyond them: it is built from the same scan as scan_project, and it aborts with a warning if planted malware is found. It does not describe output volume or how long the scan takes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the deliverable, then usage routing, then provenance and the malware guard. Dense but each clause carries information; the trailing 'Read-only.' is redundant with annotations but minor.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but the description gives enough shape for the agent to set expectations (phases in order, reasons, concrete steps with file names) and discloses the malware abort condition. A brief note on plan length or scan cost would complete it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both path and offline are fully documented in the schema; the description adds no syntax or format detail beyond that. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific deliverable (ordered, step-by-step upgrade plan) and enumerates the phase categories it produces, so the agent knows exactly what this tool returns versus a readiness verdict or a general improvement list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit sequencing: use this once the upgrade decision is made, call upgrade_readiness first for go/no-go, and use improve_app for non-upgrade priorities. Alternatives and their conditions are named directly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upgrade_readinessA
Read-onlyIdempotent

Go/no-go for upgrading a React Native or Expo project to the newest version: a verdict (ready, blocked, a multi-version jump, or already current), the exact breaking changes in the project's own code and dependencies with file and line, behavior and tooling changes to review, and an honest list of what a static scan cannot confirm. Use this first when someone asks whether or how to upgrade; use upgrade_plan for the full ordered steps. Built from the same scan as scan_project. Read-only.

NameRequiredDescriptionDefault
pathYesFolder of the React Native or Expo app (the one with package.json), absolute or relative to the workspace. Must be inside the folders this server may read.
offlineNotrue: make no network requests (skip the npm and React Native Directory lookups behind version, maintenance and vulnerability checks). Default false.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, non-destructive and open-world, so the safety profile is covered; the description adds real value by disclosing output content (breaking changes with file and line) and candidly noting 'what a static scan cannot confirm'. It still says nothing about cost, runtime or request behavior beyond the schema's offline flag.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The lead sentence front-loads the core verdict and deliverables, followed by short routing and provenance sentences. The enumerated output clause is dense but every element is informative, so little is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description carries the burden of describing return values, and it does so thoroughly (verdict, located breaking changes, behavior/tooling changes, limitations). With annotations covering safety and the schema covering params, an agent has what it needs to select and call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both path and offline are fully documented in the schema, making 3 the baseline. The description adds no further semantics about the parameters beyond the read-only framing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Go/no-go for upgrading a React Native or Expo project to the newest version') and enumerates the verdict values it returns. It also differentiates itself from siblings by naming upgrade_plan and scan_project explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use this first when someone asks whether or how to upgrade' and routes the agent to upgrade_plan for ordered steps, plus clarifies it shares a scan with scan_project. The when-to-use and the alternative are both stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_upgradeA
Read-onlyIdempotent

Check a change before committing it: compares the React Native or Expo project as committed at a git revision (default HEAD) with the working tree, and lists what got fixed, what is new and how versions moved. Call it after an upgrade or a dependency change. Read-only: the committed version is unpacked into a temporary folder outside the project and deleted.

NameRequiredDescriptionDefault
baseNoGit revision to compare with: HEAD (default), HEAD~1, a branch, tag or commit SHA.HEAD
pathYesFolder of the React Native or Expo app, inside a git repository.
offlineNoDefault true: both sides are scanned without network requests.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is largely covered. The description adds genuinely new behavior: the committed revision is unpacked into a temporary folder outside the project and deleted, telling the agent about filesystem side effects and cleanup. It stops short of describing the result format in detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the core comparison action, followed by the invocation trigger and the read-only side-effect note. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description compensates by naming the three categories of result (fixed, new, version movement). Combined with the read-only guarantee and the usage trigger, an agent has everything needed to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds real meaning: it explains that the comparison is revision-vs-working-tree and that the revision defaults to HEAD, clarifying what 'base' and 'path' actually do together. It adds context beyond the field descriptions without introducing syntax detail the schema lacks.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise action ('compares the React Native or Expo project as committed at a git revision with the working tree') plus the concrete outputs ('what got fixed, what is new and how versions moved'). This clearly separates it from siblings like upgrade_plan (planning) and scan_project (static analysis).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the trigger condition: 'Call it after an upgrade or a dependency change.' That gives a clear usage context, but it never names an alternative or an exclusion (e.g. when to prefer upgrade_plan), so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 1 tool updatev0.1.121
    • Addedupgrade_readiness
  2. 8 tool updatesv0.1.0
    • First observedcheck_library
    • First observedexplain_error
    • First observedimprove_app
    • First observedmeasure_bundle
    • First observedscan_project
    • First observedsecurity_audit
    • First observedupgrade_plan
    • First observedverify_upgrade

TDQS

A4.2/5.0

Scored across 9 tools

Disambiguation4/5

The descriptions do heavy lifting: scan_project, security_audit, improve_app and upgrade_readiness all derive from the same scan and could easily blur together, but each explicitly states when to prefer another tool ('use security_audit for deeper', 'use upgrade_readiness first'). Boundaries between upgrade_readiness, upgrade_plan and improve_app are deliberate and readable, though the scan/security/improve trio still requires careful reading.

Naming Consistency4/5

All tools use snake_case and the names are short and readable, with a clear upgrade_* family. There is a minor deviation in verb placement: explain_error, scan_project, check_library, measure_bundle and verify_upgrade are verb_noun, while security_audit, upgrade_plan and upgrade_readiness are noun-first.

Tool Count5/5

Nine tools is well within a comfortable range, and each covers a distinct stage of the diagnostic/upgrade workflow (error help, scan, deep audit, prioritization, go/no-go, plan, library lookup, bundle, verification). No filler tools are apparent.

Completeness4/5

The surface covers the lifecycle from understanding an error through scanning, deciding on an upgrade, planning and verifying it, plus library and bundle inspection. Gaps are minor: no tool addresses runtime/performance measurement or store-metadata generation, and everything is read-only by design, so fixes cannot be applied.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers