关于 NativeKeel
NativeKeel 是面向 React Native 和 Expo 应用的命令行健康检查工具,供移动开发者和团队评估升级或发布准备情况。它整合升级、应用商店、崩溃风险、安全、性能和无障碍检查,并提供报告与 CI 集成,且不会上传源码。
主要功能
- 01React Native 和 Expo 升级检查
- 02应用商店规则与发布检查
- 03静态安全和崩溃风险分析
- 04性能与无障碍问题检查
- 05升级计划和多种报告格式
- 06集成 GitHub Actions 和 SonarQube
适用场景
- 01评估 React Native 或 Expo 升级阻碍
- 02发布前检查应用商店要求
- 03检查源码和构建产物中的安全问题
- 04根据新增问题拦截拉取请求
MCP 相关
NativeKeel 提供面向 AI 编码 Agent 的 MCP 服务,通过 MCP 暴露检查功能和 `improve_app` 审查工作流。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
7收录的工具列表 · 更新于 3 天前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| path | string | 是 | 项目文件夹(绝对路径,或相对于工作区的路径)。 |
| offline | boolean | 否 | 跳过 npm / React Native Directory 查询。 |
| min_severity | enum | 否 | 要包含的最低严重性(默认:low)。critical | high | medium | low | info |
详细介绍
NativeKeel
为 React Native 和 Expo 应用进行健康检查。你的应用能否安然度过下一次升级、通过应用商店审核并保持安全?只需一条命令,无需安装、无需账号:
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
手边没有终端?将你的 package.json 粘贴到 nativekeel.com/check:即可在浏览器中运行相同的依赖检查并获取升级计划。
支持 GitHub Actions(在每个拉取请求中添加质量门禁评论)、SonarQube(在现有项目中查找问题并设置质量门禁)以及 AI 编码 Agent(适用于 Claude Code、Codex 和 Cursor 的 MCP 服务)。有多个应用?npx nativekeel fleet 可将它们汇总到一个页面。
**0.1.130 版新内容:**托管式 Expo 应用也会检查 Google Play 目标 SDK:如果 expo-build-properties 中固定的 targetSdkVersion 低于 36,就会报告这一情况,因为即使升级 Expo SDK,应用仍会低于 11 月 1 日之后更新所需的级别。近期版本还新增了对 UIScene 配置的检查,这类配置可能会丢失启动应用的深层链接;新增了仍在调用 React Native 已移除 API 的 30 个库的列表;新增了 npx nativekeel upgrade(检查能否升级到最新 React Native / Expo);新增了对锁文件依赖树中任何位置已知恶意软件的检查;还新增了对正在遭利用的 Metro 开发服务器漏洞 CVE-2025-11953 的检测。每项检查都基于 1,100 多个开源 React Native 和 Expo 项目进行调优,并且每周都会加入近期更新的项目,以减少误报(准确率测量)。查看所有版本 →
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.
有人能窃取数据或滥用应用吗?
npx nativekeel security . --html security.html --fail-on high
在一份报告中检查密钥、凭据泄露、后端访问规则、不安全的代码执行、传输和依赖项风险。新的流程/配置发现会指出输入从何处进入、在哪里使用、攻击者需要什么,以及如何验证修复结果。--offline 可让扫描保持离线,并跳过在线公告检查。不会上传任何源代码。
在构建时加入的密钥。 在 EAS 或 CI 密钥中设置的 EXPO_PUBLIC_ 值不会出现在代码库中,因此源代码扫描无法发现它们,但它们会随应用一起发布。NativeKeel 还会打开构建完成的应用,并扫描其中的 JavaScript 包(普通 JavaScript 或 Hermes 字节码):android/app/build/outputs 下的 APK 和 AAB、eas build --local 的构建结果、已提交的包,以及你通过 --artifact app.apk 指定的任何 APK、AAB 或 IPA(GitHub Action 的 artifact 输入,在构建步骤之后)。
这是源代码分析,不是实时攻击测试,也不是安全认证。安全检查与范围 · 移动端流程详情 · 原生 Android 详情。
检查内容
升级
-
你的 React Native / Expo 版本仍受支持吗? React Native 支持最新的三个次版本;在 Expo 项目中,React Native 版本随 SDK 版本变化。
-
你还能升级吗? 旧架构已在 0.82 中移除。如果未启用新架构(0.76 之前的版本默认关闭),你将被限制在 0.81。
-
哪些软件包会阻碍升级? 不支持新架构的原生模块(会与软件包自身的 codegen 规范交叉核对)、无人维护或多年没有发布版本的软件包,以及经过验证的替代品和更名软件包。每个升级步骤所需的库版本取自各库自身的兼容性表。
-
哪些软件包可能未使用? 已安装但没有发现导入、原生引用、需求或补丁的软件包。仅供检查,不会自动移除:动态和生成的用法可能无法被静态扫描发现。
应用商店
- Google Play 和 App Store 会接受你的下一个构建版本吗?
targetSdk、Google Play 限制的权限(照片/视频、所有文件、后台位置、应用安装、SMS)、16 KB 内存页(还会打开构建完成的 APK/AAB 并检查其中的每个原生库)、iOS 隐私清单和过旧而没有隐私清单的 SDK、缺少 Info.plist 使用说明、注册流程未提供账户删除功能、社交登录未提供通过 Apple 登录,以及使用调试密钥签名的发布构建。
崩溃
- 应用会在运行时崩溃吗? 软件包版本与 Expo SDK 预期不符、仍指向开发服务器的发布构建、需要更新版 React Native 的原生库、缺少 Babel 插件或
react-native-worklets的 Reanimated、混用多个主版本的@react-native-firebase/*或@react-navigation/*、依赖项中存在第二份 React 或 React Native、无法通过新架构互操作层加载的 Kotlin 模块、在 Release 中会崩溃的 AppDelegate 设置、访问相机/照片/位置时缺少 iOS 要求的 Info.plist 文本、导入已从 React Native 核心移除(AsyncStorage、Picker、ViewPropTypes,……)或计划弃用(ImageBackground、SafeAreaView)的 API,以及从真实升级案例中总结的常见问题。 安全性,按 OWASP MASVS 分类 - 应用或仓库中的密钥: AWS、Stripe、OpenAI、Anthropic、GitHub、Slack、SendGrid、Twilio、Shopify、Google OAuth 和 Supabase
service_role密钥、私钥、编译进包中的.env值、Expoextra/EXPO_PUBLIC_/eas.json密钥、签名密钥和密码。 - 设备上的数据: iOS 文件共享(
UIFileSharingEnabled)会暴露未加密的 MMKV、expo-sqlite 或 Realm 数据库(在 iOS 上默认位于 Documents 目录),流入崩溃报告、分析工具、数据库或普通 AsyncStorage 的密码(会追踪变量),未加密存储中的身份验证令牌,以及会复制这些数据的 Android 备份。 - 网络: 原生代码中关闭 TLS 证书检查、明文 HTTP、
NSAllowsArbitraryLoads、纯 HTTP API 调用,以及发布版本中用户安装的 CA。 - 后端规则: Firebase Realtime Database、Firestore 和 Storage 规则对任何人开放或处于测试模式;创建 Supabase 表时未启用行级安全;仅需登录即可写入的 Firebase 规则,以及未进行行所有权检查的无条件 Supabase UPDATE/DELETE 策略。策略问题会附上文件/行证据,并说明部署/授权假设。
- 身份验证: 生物识别提示(Face ID、Touch ID、指纹)在 JavaScript 中只返回成功或失败,未在 keychain/keystore、JavaScript 或原生代码中将密钥绑定到生物识别:提示只保护屏幕,不保护数据。
- 密码学: 硬编码的加密密钥、用于密码的 MD5/SHA-1、ECB 模式,以及用于生成随机数和盐值的
Math.random。 - 平台: 可读取本地文件或在 HTTPS 页面中加载 HTTP 内容的 WebView、任何应用都能启动的 Android 组件、未经验证的深层链接,以及模板
myapp://URL 方案。 - 依赖项和逆向工程: 你发布的确切版本中已知的漏洞(GitHub Advisory Database)、应用中的源映射,以及关闭的 Hermes 或 R8。
这些都是静态检查:它们能发现常见且可检测的问题,但无法发现运行中的应用和后端经过渗透测试才能发现的所有问题。
性能
- 你的发布包实际由什么构成?
npx nativekeel bundle会读取发布构建已生成的源映射(Android:android/app/build/generated/sourcemaps/react/release/,Expo:npx expo export --dump-sourcemap),并衡量发布代码中应用和各个包所占的比例,以及哪些包被重复打包。--base old.map可比较两个构建版本:新增、移除或增大的内容。它不会构建或运行任何内容;常规扫描也会读取该映射。 - 应该在哪里排查性能问题? 嵌套列表模式、JavaScript 动画设置、源码中的日志调用、根级
lodash/moment导入、超过 500 KB 的引用图片、导入 JavaScript 包且超过 300 KB 的 JSON(每种语言的翻译、Lottie 动画),以及选择器分配模式。修改之前,请确认实际组件、发布产物和运行时行为;这些检查不会测量帧率、启动时间或性能提升。 无障碍 - 所有人都能使用吗? 没有无障碍标签的纯图标按钮(VoiceOver 和 TalkBack 只会读出“按钮”)、小于 44×44 且没有
hitSlop的按钮、颜色和背景(两者都在代码中设置)导致对比度低于 WCAG 要求的文本和占位符、没有标签或占位符的文本字段,以及整个应用关闭文本缩放。Text.defaultProps也会被标记:React 19(React Native 0.78+)在 JSX 中会忽略它,因此应用全局字体和字体缩放限制会悄然失效。检查范围仅包括 React Native 自带的触控组件和输入组件;自定义组件、焦点顺序和颜色对比度仍需使用屏幕阅读器进行测试。
应用改进审查
npx nativekeel improve /path/to/app --offline
npx nativekeel improve /path/to/app --offline --out IMPROVE.md
现有的安全性、稳定性、性能、应用商店和依赖项检查结果会整理成一份有序计划,并说明原因、适用条件、操作、验证和恢复步骤。对于暴露的凭据,会提供遏制措施。对于看似未使用的依赖项,会将其列为审查候选项:移除前必须考虑直接、传递、动态、原生和生成的使用方。性能信号并非测量结果。
使用 --json 获取结构化输出,或使用 MCP 工具 improve_app。恶意软件检查结果会阻止依赖执行的操作。未知的运行时、后端、无障碍和可靠性覆盖情况会明确标出。这是在现有检查之上增加决策层,而不是新增漏洞检测器。请参阅范围和后续模块。
用法
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
全部免费。扫描发现严重问题时会以代码 1 退出,因此可用于阻止 CI 通过。
升级计划
nativekeel plan 会将报告转化为有序的工作计划:遏制泄露、建立 UI 流程安全网、修复崩溃风险、满足应用商店期限、弥补安全缺口、替换阻塞性软件包、在合适的阶段启用新架构,然后通过小步、便于审查的升级逐步升级 React Native(或 Expo SDK),并附上指向 Upgrade Helper 差异和每一步所需库版本的链接。性能修复和常规更新安排在最后。
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
报告会添加到作业摘要中。若还要在每个拉取请求中保留一条评论,并持续更新该拉取请求新增或修复的内容,请为作业授予 pull-requests: write 权限,并设置 pr-comment: true:
permissions:
contents: read
pull-requests: write
# …
- uses: AlicanAkyol/nativekeel@v0
with:
pr-comment: true
评论会将拉取请求与其基准提交进行比较(不会运行代码),并在每次推送时原地编辑,不会重复发布。来自 fork 的拉取请求会获得只读令牌,因此只能看到作业摘要。
设置基线后,只有基线之后新增的检查结果才会导致构建失败:
npx nativekeel --save-baseline .nativekeel-baseline.json # commit this file
与 AI 编码 Agent 一起使用(MCP)
让 Claude Code、Codex、Cursor、VS Code 或任何 MCP 客户端询问 NativeKeel 项目出了什么问题、如何升级,以及哪个库版本与您的 React Native 版本兼容,而不是靠猜测。有了它,Agent 会在升级 React Native 或 Expo、添加原生库、准备应用商店发布,或运行一个由他人编写的项目之前,先检查项目。
Claude Code(插件:MCP 服务加上一项技能,用于告知 Claude 何时使用它):
claude plugin marketplace add AlicanAkyol/nativekeel
claude plugin install nativekeel@nativekeel
或者单独使用 MCP 服务:claude mcp add nativekeel -- npx -y nativekeel@latest mcp
Codex(插件:MCP 服务加上相同的技能):
codex plugin marketplace add AlicanAkyol/nativekeel
codex plugin add nativekeel@nativekeel
或者仅在 ~/.codex/config.toml 中配置 MCP 服务:
[mcp_servers.nativekeel]
command = "npx"
args = ["-y", "nativekeel@latest", "mcp"]
其他任意 Agent,无需 MCP:在项目的 AGENTS.md 或 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.
它也列于官方 MCP Registry,名称为 io.github.AlicanAkyol/nativekeel。
工具:scan_project(提供包含 file:line 和修复建议的问题)、measure_bundle(根据源映射文件说明发布包的组成)、upgrade_plan(按顺序列出步骤)、check_library(最新版本、对新架构的支持情况、维护状况、与指定 React Native 版本兼容的版本范围、已知陷阱)、explain_error(说明构建、启动、崩溃或应用商店审核错误的含义、修复方法,以及该项目受影响的位置)以及 verify_upgrade(升级后说明已修复的问题,以及与上次提交相比新增的问题)。无需 MCP:npx nativekeel explain "<error>" --path . 和 npx nativekeel verify。该服务为只读,只会扫描启动目录下的文件夹,以及 NATIVEKEEL_MCP_ROOTS 指定的目录(如果客户端从其他文件夹启动服务,请设置此变量)。结果会省略源文件和非软件包项目名称。常见的指令式模式会经过过滤,但这并非完整的提示词注入防护。发现恶意软件时会停止生成升级计划;verify_upgrade.ok 表示没有新增严重问题,而 safety.blocked 会单独报告当前恶意软件。在插件文件夹(Codex)中启动的服务会以您的主文件夹为边界;如果设置了 NATIVEKEEL_MCP_ROOTS,则仅以其指定目录为边界。请参阅 SECURITY.md。
评级和同时扫描多个应用
每份报告都会像 SonarQube 评级代码一样,对六个领域从 A 到 E 进行评级:安全、应用商店、稳定性、升级、性能、无障碍性。A 表示扫描未发现该领域的问题,B 表示仅有低级问题,C 表示中级问题,D 表示高级问题,E 表示至少有一个严重问题。评级描述的是扫描发现的情况,并非保证。
npx nativekeel fleet [folder ...] 会扫描你指定文件夹下的所有 React Native 和 Expo 应用(并排放置的客户端项目,或单体仓库中的所有应用),并按问题严重程度从高到低显示在一个表格中:版本、六项评级、严重和高级问题数量,以及各应用面临的应用商店和停止支持期限。--html fleet.html 会将其保存为可分享的页面,--markdown 和 --json 也可使用,--fail-on 则会应用于所有应用。
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
使用 --base 时,每个应用都会显示自上次扫描以来的变化(“安全 D→B,严重问题 2→0”),并列出新增或移除的应用。npx nativekeel compare before.json after.json 可对单个应用执行相同操作,包括评级。
每月扫描 GitHub 组织中的所有应用:将 examples/fleet-workflow.yml 复制到该组织任意仓库的 .github/workflows/ 中。每月 1 日,工作流会在运行器上克隆仓库并进行扫描,与上月结果对比,然后将表格写入运行摘要;fleet.html 和 fleet.json 会作为本次运行的构建产物保留。私有仓库需要只读的 FLEET_TOKEN 密钥;NativeKeel 不会上传任何内容。
已经在使用 SonarQube?npx nativekeel --sonar nativekeel-sonar.json 会以 SonarQube 通用问题格式写入发现结果;将其传给扫描器:-Dsonar.externalIssuesReportPaths=nativekeel-sonar.json(或在 GitHub Action 中设置 sonar: nativekeel-sonar.json)。安全问题会作为漏洞导入,应用商店规则和崩溃风险会作为错误导入,升级及其他问题会作为代码异味导入,并标注各自的文件和行号。已在 SonarQube Community Build 26.10 上测试。详情:nativekeel.com/sonarqube。
在拉取请求中,GitHub Action 的评论(pr-comment: true)会先显示质量门禁结果(变更未新增严重或高级问题时即为通过)和评级,并说明具体变化。
在 package.json 旁放置 .nativekeel.json,即可将团队的决策保存在仓库中:门禁级别、团队已接受的问题、非应用组成部分的文件夹(例如 Web 仪表盘、后端)及其原因、可能导致构建失败的检查(gate),以及已接受问题的 until 日期,以便到期后重新审查。团队通常会先只对已确认适用于自身代码的检查设置门禁,其余检查则保留为报告。报告中的每个问题都会以方括号显示其 id。在没有被任何导入路径访问到的文件中的问题会标注为“代码中没有导入路径可访问”;这类文件中的崩溃、性能和无障碍性问题会降低级别,安全问题则保留原级别;如果项目通过计算路径加载文件(require.context、import(variable)),则不会添加此类标注。--fail-on 仍具有最高优先级。被忽略的问题仍会列在报告中,恶意软件警告无法忽略。
{
"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" }
]
}
团队面板(封闭测试)。 使用 --upload(或 Action 的 panel-token 输入项)并在 NATIVEKEEL_TOKEN 中提供团队令牌后,每次扫描都会向团队在 nativekeel.com 上的页面发送摘要:应用名称、版本、评级和问题标题。不会发送源代码或问题详情;使用 --offline 时绝不会发送。在线演示 · 加入测试:[email protected]。
需要管理许多应用?告诉我们团队的需求:[email protected]
面向客户的报告
代理机构可以在 HTML 报告中使用自己的名称:npx nativekeel plan --html plan.html --brand "Acme Mobile"。
为什么可以在私有代码上运行
- 你的代码绝不会离开你的设备。 唯一的请求是查询 npm 和 React Native Directory 中的包名,以及向 npm 的安全公告端点发送一次请求,其中包含运行时依赖项的名称和确切版本(也就是
npm audit发送的内容)。对于没有node_modules的 Expo 项目,会向 unpkg 发送一次请求,以获取 Expo SDK 预期的版本(只会发送expo版本)。使用--offline时不会发送任何请求;有一项测试会拦截fetch来证明这一点。 - 零依赖,无安装脚本。 仅使用 Node.js 内置功能。
- 只读。 绝不会修改你的项目。
- 可安全用于不可信项目。 绝不会运行项目代码,仓库自身的 git 配置也无法让扫描过程运行命令。
- 所有输出中的机密信息始终会被屏蔽。
- 可验证的发布。 通过 GitHub Actions 使用 npm provenance 发布:
npm audit signatures。
详情和漏洞报告:SECURITY.md。发现错误或遗漏?告诉我们,无需提供代码。
专家支持
该工具免费,并将一直免费。如果你的团队希望将升级工作交由他人处理,维护者会一次承接少量项目:将报告发送至 [email protected]。了解运作方式。
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。