{
  "id": "expo-react-native",
  "type": "loadout",
  "title": "Expo and React Native with Expo MCP",
  "summary": "Expo rules for agents plus Expo's official MCP server: npx expo install, Expo Router, no secrets in EXPO_PUBLIC_, no production EAS releases, check on a simulator.",
  "description": "Expo now ships its own agent tooling: new projects include an AGENTS.md, Claude Code and Codex have an official Expo plugin, and the hosted Expo MCP server (free plan included) gives agents current docs, EAS build logs and simulator screenshots. This loadout adds the project rules agents still get wrong: SDK-matched installs with npx expo install, never editing generated native folders, EXPO_PUBLIC_ variables treated as public, development builds for native packages, and no production builds, submits or updates unless asked.\n",
  "highlights": [
    "Expo MCP server (remote, OAuth) for docs, EAS logs and screenshots",
    "npx expo install and expo-doctor after every dependency change",
    "Generated ios/ and android/ folders left alone under CNG",
    "EXPO_PUBLIC_ variables treated as public; no secrets in the app",
    "No production eas build, submit or update without being asked"
  ],
  "version": "1.0.0",
  "license": "MIT",
  "author": {
    "name": "Agent Loadout",
    "url": "https://loadout.jnw-it.com"
  },
  "credits": [
    {
      "title": "Expo docs: AI agents and Expo",
      "url": "https://docs.expo.dev/agents/"
    },
    {
      "title": "Expo docs: Expo MCP server",
      "url": "https://docs.expo.dev/mcp/"
    },
    {
      "title": "Expo changelog: Expo MCP server on the Free plan",
      "url": "https://expo.dev/changelog/the-expo-mcp-server-is-now-available-on-the-free-plan"
    },
    {
      "title": "@KhalidDevLog: daily mobile MCPs (XcodeBuildMCP, Expo MCP, Figma MCP)",
      "url": "https://x.com/KhalidDevLog/status/2096183096697586039"
    }
  ],
  "categories": [
    "web-app"
  ],
  "stacks": [
    "react-native",
    "expo",
    "typescript",
    "ios",
    "android"
  ],
  "files": [
    {
      "path": "AGENTS.md",
      "role": "instructions",
      "description": "Expo, Expo Router and EAS rules, with Expo MCP usage.",
      "skill": null,
      "agent": null,
      "install_to": {
        "claude-code": "AGENTS.md",
        "codex": "AGENTS.md",
        "cursor": "AGENTS.md",
        "gemini-cli": "AGENTS.md",
        "antigravity-cli": "AGENTS.md",
        "copilot": "AGENTS.md"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/expo-react-native/1.0.0/AGENTS.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/expo-react-native/latest/AGENTS.md",
      "bytes": 2022,
      "lang": "markdown",
      "content": "# AGENTS.md: Expo / React Native app\n\nReact Native app on Expo with Expo Router and TypeScript. Check the Expo SDK version in `package.json` before using an API.\n\n## Commands\n- Start: `npx expo start`. Lint: `npx expo lint`. Types: `npx tsc --noEmit`. Tests: the project's test script.\n- Health check after dependency changes: `npx expo-doctor`.\n- Add a package: `npx expo install <package>` so the version matches the SDK. Never plain `npm install` for native packages.\n- Done means: lint, type-check and tests pass, and expo-doctor reports no problems you introduced.\n\n## Project rules\n- Routes are files in `app/` (Expo Router). Layouts in `_layout.tsx`; do not hand-roll a navigator alongside the router.\n- Native config lives in `app.json` or `app.config.ts` and config plugins. If `ios/` and `android/` are generated\n  (Continuous Native Generation, listed in `.gitignore`), never edit them; change config and run `npx expo prebuild --clean`.\n- Packages with native code need a development build, not Expo Go. Say so when you add one.\n- `EXPO_PUBLIC_` variables are compiled into the app and visible to anyone. Never put secrets in them; secrets stay on a server.\n- Use platform-specific files (`.ios.tsx`, `.android.tsx`) or `Platform.select` only when behaviour really differs.\n- Lists use `FlatList` or `FlashList`, never `map` inside a `ScrollView` for long data.\n\n## Releases\n- Never run `eas build --profile production`, `eas submit` or `eas update` on a production channel without the human\n  asking for it in this session. Preview builds and updates to a preview channel are fine when asked.\n- Bumping the Expo SDK is its own task: follow the upgrade guide, run `npx expo install --fix`, then expo-doctor.\n\n## Expo MCP and skills\n- The Expo MCP server (`expo` in the MCP config) gives live docs, EAS build logs and, with a running dev server,\n  simulator screenshots. Prefer it over guessing APIs from memory. It signs in with your Expo account (OAuth).\n- Use the `expo-change` skill for any feature or fix.\n"
    },
    {
      "path": "CLAUDE.md",
      "role": "adapter",
      "description": "Imports AGENTS.md for Claude Code.",
      "skill": null,
      "agent": "claude-code",
      "install_to": {
        "claude-code": "CLAUDE.md",
        "codex": null,
        "cursor": null,
        "gemini-cli": null,
        "antigravity-cli": null,
        "copilot": null
      },
      "raw_url": "https://loadout.jnw-it.com/raw/expo-react-native/1.0.0/CLAUDE.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/expo-react-native/latest/CLAUDE.md",
      "bytes": 511,
      "lang": "markdown",
      "content": "# CLAUDE.md\n\n@AGENTS.md\n\n## Claude Code notes\n- Skills from this loadout live in `.claude/skills/`: `expo-change`. Use them when their description matches the task.\n- MCP servers for this project are in `.mcp.json`. If a server is not connected, tell the human rather than working around it.\n- Follow AGENTS.md above; where this file and AGENTS.md disagree, AGENTS.md wins.\n\n<!-- From the Agent Loadout \"Expo and React Native with Expo MCP\" v1.0.0 — https://loadout.jnw-it.com/loadouts/expo-react-native/ -->\n"
    },
    {
      "path": "GEMINI.md",
      "role": "adapter",
      "description": "Imports AGENTS.md for Gemini CLI.",
      "skill": null,
      "agent": "gemini-cli",
      "install_to": {
        "claude-code": null,
        "codex": null,
        "cursor": null,
        "gemini-cli": "GEMINI.md",
        "antigravity-cli": null,
        "copilot": null
      },
      "raw_url": "https://loadout.jnw-it.com/raw/expo-react-native/1.0.0/GEMINI.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/expo-react-native/latest/GEMINI.md",
      "bytes": 385,
      "lang": "markdown",
      "content": "# GEMINI.md\n\n@./AGENTS.md\n\n## Gemini CLI notes\n- Skills from this loadout live in `.agents/skills/`: `expo-change`. Use them when their description matches the task.\n- Follow AGENTS.md above; where this file and AGENTS.md disagree, AGENTS.md wins.\n\n<!-- From the Agent Loadout \"Expo and React Native with Expo MCP\" v1.0.0 — https://loadout.jnw-it.com/loadouts/expo-react-native/ -->\n"
    },
    {
      "path": "skills/expo-change/SKILL.md",
      "role": "skill",
      "description": "Feature or fix with docs lookup, checks and a simulator check.",
      "skill": "expo-change",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/expo-change/SKILL.md",
        "codex": ".agents/skills/expo-change/SKILL.md",
        "cursor": ".agents/skills/expo-change/SKILL.md",
        "gemini-cli": ".agents/skills/expo-change/SKILL.md",
        "antigravity-cli": ".agents/skills/expo-change/SKILL.md",
        "copilot": ".agents/skills/expo-change/SKILL.md"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/expo-react-native/1.0.0/skills/expo-change/SKILL.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/expo-react-native/latest/skills/expo-change/SKILL.md",
      "bytes": 1237,
      "lang": "markdown",
      "content": "---\nname: expo-change\ndescription: Make a feature or fix in an Expo app with SDK-matched packages, Expo Router conventions, a check on a simulator or device and no production releases. Use for any change to an Expo / React Native app.\n---\n\n# Expo change\n\n1. Read `package.json` (Expo SDK), `app.json` or `app.config.ts`, and the routes in `app/` that the change touches.\n2. Look up the API in the current docs (Expo MCP `search_documentation` / `read_documentation`, or docs.expo.dev) for\n   this SDK version. Do not rely on memory for package APIs; they change between SDKs.\n3. New packages: `npx expo install <package>`. If it has native code, note that a development build is needed.\n4. Make the change in TypeScript, following the router layout. Keep secrets out of `EXPO_PUBLIC_` variables.\n5. Run `npx expo lint`, `npx tsc --noEmit`, the tests and, after dependency changes, `npx expo-doctor`.\n6. Check it runs: with the dev server up, open the screen on a simulator or device. With Expo MCP local capabilities,\n   take a screenshot and look at it; otherwise ask the human to check and describe what to look for.\n7. Report: files changed, packages added (and whether a new dev build is needed), check results, screenshot if taken.\n"
    },
    {
      "path": "mcp.json",
      "role": "mcp",
      "description": "Expo MCP server (remote, OAuth).",
      "skill": null,
      "agent": null,
      "install_to": {
        "claude-code": ".mcp.json",
        "codex": null,
        "cursor": ".cursor/mcp.json",
        "gemini-cli": null,
        "antigravity-cli": ".agents/mcp_config.json",
        "copilot": null
      },
      "raw_url": "https://loadout.jnw-it.com/raw/expo-react-native/1.0.0/mcp.json",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/expo-react-native/latest/mcp.json",
      "bytes": 108,
      "lang": "json",
      "content": "{\n  \"mcpServers\": {\n    \"expo\": {\n      \"type\": \"http\",\n      \"url\": \"https://mcp.expo.dev/mcp\"\n    }\n  }\n}\n"
    }
  ],
  "requires": {
    "tools": [
      "node"
    ],
    "env": [],
    "mcp": [
      "expo"
    ]
  },
  "tested": {
    "status": "untested",
    "last_run": null,
    "fixture": null,
    "per_agent": {
      "claude-code": "untested",
      "codex": "untested",
      "cursor": "untested",
      "gemini-cli": "untested",
      "antigravity-cli": "untested",
      "copilot": "untested"
    }
  },
  "security": {
    "scanned": true,
    "scanner": "intake-precheck/1",
    "verdict": "clean",
    "network": true,
    "scripts": [],
    "notes": "The Expo MCP server is hosted by Expo and signs in with your Expo account via OAuth; it can read EAS build history and project metadata. npx expo install downloads packages from npm."
  },
  "featured": false,
  "deprecated": false,
  "last_checked": "2026-10-17",
  "published": "2026-10-17",
  "updated": "2026-10-17",
  "compatibility": {
    "claude-code": "native",
    "codex": "adapter",
    "cursor": "native",
    "gemini-cli": "adapter",
    "antigravity-cli": "native",
    "copilot": "adapter"
  },
  "counts": {
    "rules": 1,
    "skills": 1,
    "mcp": 1
  },
  "url": "https://loadout.jnw-it.com/loadouts/expo-react-native/",
  "api_url": "https://loadout.jnw-it.com/api/loadouts/expo-react-native.json",
  "verification": {
    "level": "verified-install",
    "status": "verified",
    "label": "Verified install",
    "verified": true,
    "checked_at": "2026-10-17T08:09:30Z",
    "commit": "03c1b9839c40eb1e44c0a2877baaa3978a96895c",
    "content_current": true,
    "agent_tests": "not-run",
    "counts": {
      "pass": 9,
      "fail": 0,
      "skip": 0,
      "not_applicable": 1
    },
    "meaning": "Level 1: automated checks on the files (parse, install paths, MCP config, safety scan, references, size, licence, starter build). No AI agent was run.",
    "checks": [
      {
        "id": "listing",
        "name": "Listing",
        "status": "pass",
        "summary": "Schema valid; 5 files declared, none missing or extra",
        "details": [
          "tested.status: untested (agent tests are separate from Level 1)"
        ]
      },
      {
        "id": "parse",
        "name": "Files parse",
        "status": "pass",
        "summary": "All 5 files parse; front matter valid",
        "details": []
      },
      {
        "id": "adapters",
        "name": "Adapters",
        "status": "pass",
        "summary": "CLAUDE.md and GEMINI.md import AGENTS.md and are up to date",
        "details": [
          "CLAUDE.md: matches the generator",
          "GEMINI.md: matches the generator"
        ]
      },
      {
        "id": "install-paths",
        "name": "Install paths",
        "status": "pass",
        "summary": "Correct paths for all 6 agents; layouts re-discovered",
        "details": [
          "Claude Code: 4 files, 1 skill in .claude/skills/, MCP at .mcp.json",
          "Codex CLI: 2 files, 1 skill in .agents/skills/, MCP manual step",
          "Cursor: 3 files, 1 skill in .agents/skills/, MCP at .cursor/mcp.json",
          "Gemini CLI: 3 files, 1 skill in .agents/skills/, MCP manual step",
          "Antigravity CLI: 3 files, 1 skill in .agents/skills/, MCP at .agents/mcp_config.json",
          "GitHub Copilot: 2 files, 1 skill in .agents/skills/, MCP manual step"
        ]
      },
      {
        "id": "mcp",
        "name": "MCP config",
        "status": "pass",
        "summary": "1 server valid: expo",
        "details": [
          "mcp.json → expo: mcp.expo.dev is reachable over HTTPS",
          "Converts to Codex config.toml, Gemini CLI settings.json, VS Code mcp.json and Antigravity CLI .agents/mcp_config.json (serverUrl)"
        ]
      },
      {
        "id": "safety",
        "name": "Safety scan",
        "status": "pass",
        "summary": "Clean: no credentials, risky shell or hidden text",
        "details": [
          "Scanner intake-precheck/1: verdict clean; network yes (listing says yes)",
          "info mcp-server in mcp.json: expo: url https://mcp.expo.dev/mcp"
        ]
      },
      {
        "id": "references",
        "name": "References",
        "status": "pass",
        "summary": "2 references between files resolve for every agent",
        "details": []
      },
      {
        "id": "size",
        "name": "Size limits",
        "status": "pass",
        "summary": "5 files, 4.2 KB total; largest AGENTS.md 2.0 KB",
        "details": [
          "Limits: 30 files, 32 KB per file, 128 KB total, 500 lines per skill or rule"
        ]
      },
      {
        "id": "licence",
        "name": "Licence",
        "status": "pass",
        "summary": "MIT, by Agent Loadout; text in the repository LICENSE",
        "details": []
      },
      {
        "id": "starter-build",
        "name": "Starter build",
        "status": "n/a",
        "summary": "Not applicable: checking an Expo change needs a simulator or device and an Expo account for the MCP server, neither of which runs free in CI",
        "details": [
          "The loadout is project rules, one procedure skill and Expo's hosted MCP server; there is no starter project or code example to compile.",
          "The MCP config is still checked structurally and its URL is checked for reachability.",
          "Every other Level 1 check still runs on this loadout."
        ]
      }
    ]
  },
  "install": {
    "claude-code": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/expo-react-native/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "CLAUDE.md",
          "target": "CLAUDE.md",
          "raw_url": "https://loadout.jnw-it.com/raw/expo-react-native/1.0.0/CLAUDE.md",
          "role": "adapter"
        },
        {
          "path": "skills/expo-change/SKILL.md",
          "target": ".claude/skills/expo-change/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/expo-react-native/1.0.0/skills/expo-change/SKILL.md",
          "role": "skill"
        },
        {
          "path": "mcp.json",
          "target": ".mcp.json",
          "raw_url": "https://loadout.jnw-it.com/raw/expo-react-native/1.0.0/mcp.json",
          "role": "mcp"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/expo-react-native/claude-code.zip"
    },
    "codex": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/expo-react-native/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/expo-change/SKILL.md",
          "target": ".agents/skills/expo-change/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/expo-react-native/1.0.0/skills/expo-change/SKILL.md",
          "role": "skill"
        }
      ],
      "manual_steps": [
        {
          "path": "mcp.json",
          "note": "Codex reads MCP servers from ~/.codex/config.toml (TOML, not JSON). Add each server with `codex mcp add` or copy the URL into an [mcp_servers.<name>] table.",
          "raw_url": "https://loadout.jnw-it.com/raw/expo-react-native/1.0.0/mcp.json"
        }
      ],
      "zip_url": "https://loadout.jnw-it.com/download/expo-react-native/codex.zip"
    },
    "cursor": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/expo-react-native/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/expo-change/SKILL.md",
          "target": ".agents/skills/expo-change/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/expo-react-native/1.0.0/skills/expo-change/SKILL.md",
          "role": "skill"
        },
        {
          "path": "mcp.json",
          "target": ".cursor/mcp.json",
          "raw_url": "https://loadout.jnw-it.com/raw/expo-react-native/1.0.0/mcp.json",
          "role": "mcp"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/expo-react-native/cursor.zip"
    },
    "gemini-cli": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/expo-react-native/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "GEMINI.md",
          "target": "GEMINI.md",
          "raw_url": "https://loadout.jnw-it.com/raw/expo-react-native/1.0.0/GEMINI.md",
          "role": "adapter"
        },
        {
          "path": "skills/expo-change/SKILL.md",
          "target": ".agents/skills/expo-change/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/expo-react-native/1.0.0/skills/expo-change/SKILL.md",
          "role": "skill"
        }
      ],
      "manual_steps": [
        {
          "path": "mcp.json",
          "note": "Gemini CLI reads MCP servers from the mcpServers block of .gemini/settings.json. Merge the servers in by hand, and use httpUrl instead of url for HTTP servers. Since 18 June 2026 Gemini CLI serves only Gemini Code Assist Standard/Enterprise licences and paid API keys; personal accounts use Antigravity CLI.",
          "raw_url": "https://loadout.jnw-it.com/raw/expo-react-native/1.0.0/mcp.json"
        }
      ],
      "zip_url": "https://loadout.jnw-it.com/download/expo-react-native/gemini-cli.zip"
    },
    "antigravity-cli": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/expo-react-native/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/expo-change/SKILL.md",
          "target": ".agents/skills/expo-change/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/expo-react-native/1.0.0/skills/expo-change/SKILL.md",
          "role": "skill"
        },
        {
          "path": "mcp.json",
          "target": ".agents/mcp_config.json",
          "raw_url": "https://loadout.jnw-it.com/raw/expo-react-native/1.0.0/generated/antigravity-cli/mcp_config.json",
          "role": "mcp",
          "generated": true
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/expo-react-native/antigravity-cli.zip"
    },
    "copilot": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/expo-react-native/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/expo-change/SKILL.md",
          "target": ".agents/skills/expo-change/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/expo-react-native/1.0.0/skills/expo-change/SKILL.md",
          "role": "skill"
        }
      ],
      "manual_steps": [
        {
          "path": "mcp.json",
          "note": "In VS Code, MCP servers go in .vscode/mcp.json under a \"servers\" key (not \"mcpServers\"). Copilot CLI uses ~/.copilot/mcp-config.json.",
          "raw_url": "https://loadout.jnw-it.com/raw/expo-react-native/1.0.0/mcp.json"
        }
      ],
      "zip_url": "https://loadout.jnw-it.com/download/expo-react-native/copilot.zip"
    }
  },
  "source_zip_url": "https://loadout.jnw-it.com/download/expo-react-native/source.zip"
}