mcp-testing

A 32-step procedure for testing every feature of a React Native MCP server against its demo app. React Native is a framework for building mobile apps with JavaScript.

In plain words
What is it for?
Use it to run the complete MCP test flow on iOS or Android using Metro, idb or adb, and the demo app.
Why use it?
It provides a fixed sequence and success checks for verifying taps, swipes, text entry, element queries, scripts, network requests, and related behavior.

Skill for Claude CodeCodexCursor

Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

agentmods
npx agentmods add skills/ohah/react-native-mcp/mcp-testing
Any agent
npx skills add ohah/react-native-mcp --skill mcp-testing
Clone the repo
git clone --depth 1 https://github.com/ohah/react-native-mcp

Made for: Claude Code, Codex, Cursor.

Per session 72 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 3,075 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. Scan, not verified.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5 $0.00072 $0.03075
Opus 5 $0.00036 $0.01537
Sonnet 5 $0.00014 $0.00615
Haiku 4.5 $0.00007 $0.00308

Measured 2d ago against content hash 653fc7c602a5, method: parsed. Prices are Anthropic first-party input rates as of 2026-08-30, from the pricing page.

Security

Grade A, and why

mcp-testing scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

.cursor/skills/mcp-testing/SKILL.md · 124 lines

How it starts

The opening of the file, as written. The whole thing — 124 lines — stays where its author put it; the contents beside it link to each section on GitHub.

React Native MCP 전체 기능 테스트

데모 앱(examples/demo-app)은 32개 스텝으로 구성되어 있다. 이 32개 스텝을 모두 순서대로 진행하고, 각 스텝의 성공 기준을 만족하면 MCP 서버의 내부 기능(tap, swipe, type_text, query_selector, assert_text, evaluate_script, webview_evaluate_script, list_network_requests 등)을 전부 검증한 것이다. 스크롤은 MCP scroll 도구가 없으므로 swipe(platform, x1, y1, x2, y2)로 한다.

클릭/탭 (필수 흐름): query_selector(또는 take_snapshot)로 요소 찾기 → 반환된 measure(pageX, pageY, width, height)로 좌표 계산 → tap(platform, x, y)으로 idb(iOS)/adb(Android) 네이티브 클릭. JS 쪽 triggerPress가 아닌 실제 터치 주입.

스텝 이동: #step-nav-next(다음), #step-nav-prev(이전)으로 measure → tap.


사전 조건

  • Metro: cd examples/demo-app && npm start (기본 포트 8230)
  • 앱: npm run ios 또는 npm run android (MCP 런타임 주입됨)
  • MCP 서버 연결 후 앱에서 __REACT_NATIVE_MCP__ 사용 가능
  • iOS: idb 설치·연결. Android: adb 연결.

전체 테스트: 32개 스텝 순서 (모두 진행 필수)

아래 표는 스텝 1부터 32까지 순서대로 진행해야 하는 전체 목록이다. 각 스텝을 완료한 뒤 다음 스텝으로 넘어가고, 32까지 모두 통과하면 MCP 내부 기능 전체 검증이 끝난다.

Step 구분 검증 요약 사용 도구·동작
1 Press testID 버튼 탭 → Count 1 이상 query_selector #press-counter-button → measure → tap → assert_text "Count: 1"
2 Press testID 없음 버튼 탭 query_selector :text("testID 없음") → measure → tap → 숫자 증가 확인
3 Press TouchableOpacity·TouchableHighlight·Button·이미지·Icon+Label 각각 탭 query_selector로 각 버튼 찾아 measure → tap 반복 → 각 카운트 1씩 증가 확인
4 Press 롱프레스 버튼 2개 query_selector #press-long-press-button, :text("롱프레스 testID없음") → tap(..., duration) 롱프레스 → 카운트 증가 확인
5 Input testID 있는 TextInput에 입력 type_text(uid input-with-testid, 문자열) → assert_text "입력값: (문자열)"
6 Input testID 없는 TextInput에 입력 query_selector로 placeholder 등으로 TextInput uid 획득 → type_text → "입력값:" 확인
7 ScrollView scroll-view-no-ref 스크롤 후 버튼 탭 swipe로 스크롤(ScrollView 영역에서 y1>y2) → query_selector #scroll-btn-N → tap → "버튼 N (1)" 확인
8 ScrollView scroll-view-with-ref 스크롤 후 버튼 탭 swipe로 스크롤 → query_selector #scroll-btn-N → tap → 버튼 숫자 증가 확인
9 ScrollView testID 없는 ScrollView 스크롤 후 버튼 탭 swipe로 스크롤 → query_selector :text("버튼 10") 등 → tap → 카운트 확인
10 FlatList testID 있는 FlatList 스크롤 후 탭 swipe로 스크롤 → query_selector #demo-app-flat-list-btn-item-N 또는 :text("탭:") → tap → "탭: 1" 이상 assert_text
11 FlatList testID 없는 FlatList 스크롤 후 탭 swipe로 스크롤 → query_selector :text("클릭:") 등 → tap → 항목 숫자 증가 확인
12 WebView WebView 내부 버튼 클릭 또는 RN 탭 webview_evaluate_script(webViewId demo-app-webview, script로 document.querySelector("button").click()) 또는 query_selector → tap → "RN 탭 수: 1" 이상 확인
13 WebView 등록 WebView ID·내부 스크립트 실행 evaluate_script로 getRegisteredWebViewIds → webview_evaluate_script(demo-app-webview-naver, document.title 등) 결과 확인
14 WebView testID 없는 WebView에서 postMessage 수신 확인 query_selector로 WebView/버튼 영역 measure → tap → assert_text "#postmessage-count"로 "postMessage 수: 1" 이상 확인
15 Network GET /posts/1 요청·응답 query_selector #network-fetch-get → tap → list_network_requests에서 /posts/1·응답 확인, assert_text "응답: 200"
16 Network POST /posts status 201 query_selector #network-fetch-post → tap → list_network_requests에서 POST·201 확인
17 Network 3건 요청 수집 query_selector #network-fetch-multiple → tap → list_network_requests에서 users/1, todos/1, comments 3건 확인
18 Network 404 요청 확인 query_selector #network-fetch-error → tap → list_network_requests 404, assert_text "응답: 404"
19 Network XHR GET /albums/1 캡처 query_selector #network-xhr-get → tap → list_network_requests에서 XHR GET /albums/1 확인
20 Gesture Touchable·Pressable·RNGH 3개 탭 query_selector gesture-compare-touchable, gesture-compare-pressable, gesture-compare-gh-touchable → tap 각각 → 카운트 1씩 증가
21 Gesture gesture-tap-detector-wrapper 탭 query_selector #gesture-tap-detector-wrapper → tap → assert_text로 숫자 1 이상 확인 (Gesture.Tap() idb 터치 수신)
22 Gesture RNGH Pressable 탭 query_selector #gesture-gh-pressable → tap → "RNGH TouchableOpacity: 1" 이상 확인
23 Gesture testID 없음 RNGH 탭 query_selector :text("RNGH 라벨만") → tap → 숫자 증가 확인
24 Gesture Reanimated 트리거 탭 query_selector #gesture-reanimated-trigger 또는 #gesture-reanimated-box → tap → "눌러보세요" 아래 숫자 1 이상
25 Gesture Reanimated 라벨만 탭 query_selector :text("눌러보세요 (라벨만)") → tap → 스케일 박스 숫자 증가
26 Gesture Reanimated ScrollView 스크롤 swipe로 스크롤(해당 영역에서 y1>y2) → "Reanimated 목록 아이템 30" 등 하단 노출·스크롤 가능 확인
27 Gesture Swipeable 행 스와이프 query_selector "스와이프 to delete 행 1" 등 → measure → swipe 왼쪽 → "삭제" 영역 노출 확인
28 Gesture 드래그(Pan) 완료 카운트 query_selector #gesture-drag-area → measure → swipe → assert_text #gesture-drag-count "드래그 완료: 1" 이상
29 Gesture Pull to refresh 화면 상단 근처에서 swipe 아래 방향 → assert_text "새로고침 횟수: 1" 이상
30 Gesture Drawer 열기·닫기 query_selector #gesture-drawer-open → tap → assert_text "드로워: 열림" → "닫기" 또는 drawer-overlay tap → "닫힘" 확인
31 Gesture Pager 스와이프 페이저 영역 measure → 가로 swipe → assert_text 또는 query_selector "현재 페이지: 1/2/3" (pager-status)
32 Gesture Bottom sheet 스와이프 하단 시트 영역 measure → swipe 위쪽 → assert_text "상태: 열림" 또는 sheet-status 확인

Read the full file on GitHub · 124 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 2d ago First seen · 124 lines · 72 tokens per session scan A 653fc7c602a5

Subscribe to this mod's changes

mcp-testing is a skill published in the GitHub repository ohah/react-native-mcp (7 stars, last pushed 5mo ago), licensed MIT. It adds 72 tokens to every session and 3,075 once invoked, about $0.0004 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.

Related

Other skills, from other repositories

ios-qa

Live-device iOS QA for SwiftUI apps. (gstack).

garrytan/gstack · 18 tokens

bump-android-version

Use when bumping Maestro's Android compileSdk/targetSdk to a new API level and validating end-to-end against the test-e2e GHA workflow until the test-android job is green.

mobile-dev-inc/Maestro · 46 tokens

agent-device-evidence

Records iOS/Android native MP4 evidence for test/repro flows extracted from an Expensify GitHub PR or issue. Use when the user asks to "record the flow for PR.

Expensify/App · 43 tokens

solopi-ai

通过 SoloPi 的机器可读 CLI 编译和执行 AI 验证计划,管理签名端侧 ExecuTorch 决策模型、持久设备池、无人值守任务、安卓设备、应用、动作、配置、用例步骤与交互录制、回放及性能历史、动态 Agent、批量与重复执行、性能监控、压力测试和证据。适用于需求/AC 到 Result Judge 三态结论、cloud/on-device 决策切换、模型发布门禁,以及 generation 租约的多设备 CI 执行。.

alipay/SoloPi · 127 tokens

dogfood

Systematically explore and test a mobile app on iOS/Android with agent-device to find bugs, UX issues, and other problems. Use when asked to dogfood, QA, exploratory test, find issues, bug hunt, or test this app on mobile.

callstack/agent-device · 55 tokens

argent-test-ui-flow

Autonomously test an app UI (iOS or Android) by running interact-screenshot-verify loops using argent MCP tools. Use when testing UI flows, verifying login works, testing navigation, running end-to-end UI test scenarios, manual QA steps, visible UI changes, or visual behavior.

software-mansion/argent · 64 tokens