mcpField
N
NativeKeel

NativeKeel

本地服务
nativekeel.com开发工具62 天前更新

关于 NativeKeel

NativeKeel 是面向 React Native 和 Expo 应用的命令行健康检查工具,供移动开发者和团队评估升级或发布准备情况。它整合升级、应用商店、崩溃风险、安全、性能和无障碍检查,并提供报告与 CI 集成,且不会上传源码。

主要功能

  1. 01React Native 和 Expo 升级检查
  2. 02应用商店规则与发布检查
  3. 03静态安全和崩溃风险分析
  4. 04性能与无障碍问题检查
  5. 05升级计划和多种报告格式
  6. 06集成 GitHub Actions 和 SonarQube

适用场景

  1. 01评估 React Native 或 Expo 升级阻碍
  2. 02发布前检查应用商店要求
  3. 03检查源码和构建产物中的安全问题
  4. 04根据新增问题拦截拉取请求

MCP 相关

NativeKeel 提供面向 AI 编码 Agent 的 MCP 服务,通过 MCP 暴露检查功能和 `improve_app` 审查工作流。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"alicanakyol-nativekeel": {
"command": "npx",
"args": [
"-y",
"nativekeel"
],
"env": {
"NATIVEKEEL_MCP_ROOTS": "<NATIVEKEEL_MCP_ROOTS>"
}
}
}
}
启动命令npx -y nativekeel
需要配置的环境变量
NATIVEKEEL_MCP_ROOTSExtra folders the server may scan (path-delimited). By default only the folder the client starts it in.

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmnativekeel0.1.130

工具

7

收录的工具列表 · 更新于 3 天前

参数类型必填说明
pathstring是项目文件夹(绝对路径,或相对于工作区的路径)。
offlineboolean否跳过 npm / React Native Directory 查询。
min_severityenum否要包含的最低严重性(默认:low)。critical | high | medium | low | info

详细介绍

NativeKeel

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

为 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

在 React Native 0.84 应用上运行 npx nativekeel upgrade:尚未就绪,自身代码中有 3 个阻碍项(src/components/Overlay.js:13 中的 StyleSheet.absoluteFillObject 将在 0.85 中移除,src/screens/Feed.js:2 中的 InteractionManager 将在 0.87 中移除,src/App.js:8 中的 StatusBar translucent 将在 0.87 中移除),并附有对应的修复方法。

手边没有终端?将你的 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 值、Expo extra/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、添加原生库、准备应用商店发布,或运行一个由他人编写的项目之前,先检查项目。

Glama 上的 NativeKeel MCP 服务

在 Cursor 中安装 在 VS Code 中安装

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

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。