출처와 신뢰 등급
이 문서의 모든 주장은 아래 단일 커밋에 고정된 저장소 상태와, 캡처 시점의 GitHub REST API 응답만을 근거로 한다. 코드는 한 줄도 실행하지 않았다 (설치·빌드·테스트·import 전부 없음).
409e0a203f0cc843d02403f242f558b6b87d3bff (main, ls-remote 재확인 — 캡처 전후 드리프트 없음)3cfae602ccf9d262c98edc2b290658f6bce4a23e26d1961e-542c-4c8e-8aa7-9972d6ba4d40B인 이유: 커밋·트리 고정 + 완전한 인벤토리(48 blob 전수 분류) + 선정 파일 정독까지 갖췄지만, 정적 분석의 천장에 걸린다 — 실기기 동작은 미검증(runtime unknown)이고, 1.0.0부터 실제 조작을 담당하는 mobilecli는 이 레포 밖의 Go 바이너리라 여기서 검증되지 않으며, Dependabot·코드 스캔 상태는 API가 거부(403)해 알 수 없다.
읽기 전에 — 10분 가이드
mobile-mcp는 "에이전트에게 폰을 준다"를 MCP 표준 도구 27개로 포장한 서버다. Claude·Cursor·Goose 등 MCP를 말하는 클라이언트라면 npx 한 줄로 붙는다. 스크린샷 좌표 대신 접근성 트리를 먼저 쓰는 설계라 토큰이 싸고 좌표 오차에 강하다 — 이 축의 사실상 표준 후보(스타 5,995, MCP 공식 레지스트리 등재)다.
다만 README만 읽으면 안 보이는 반전이 네 개 있다. 이 문서가 코드에서 확인한 순서대로:
- 조작의 실체는 이 레포에 없다. 1.0.0 BREAKING 이후 기본 경로는 TypeScript가 아니라
mobilecli라는 별도 Go 바이너리다. npm 3단 체인(mobilewright → driver-mobilecli → mobilecli)으로 내려받는 불투명 실행 파일 — 이 도시에의 정적 분석 범위 밖이다 (src/mobile-device.ts, §4·§9). - 텔레메트리는 기본 ON이다. PostHog 공개 프로젝트 키가 소스에 하드코딩돼 있고(
src/server.ts:109-151), 끄려면MOBILEMCP_DISABLE_TELEMETRY를 직접 세팅해야 한다. 스크린샷 크기까지 이벤트로 나간다(:788-794). - SSE 모드 인증은 fail-open이다.
MOBILEMCP_AUTH미설정이면 인증 검사가 통째로 스킵된다(src/index.ts:13-16) — README는 "인증 지원"이라고만 말한다. - 클라우드 도구는 과금이다. mobilenext.ai 실기기 할당 도구가 같은 서버에 실려 있고, 가드는 도구 어노테이션과 주석("shared and billed")뿐이다.
읽는 법: 판단만 필요하면 §3. 코드 근거는 §4·§5. 도입 절차와 스위치는 §6·§9. README 원문 링크는 전부 §12에 있다.
채택 판단
MOBILEMCP_DISABLE_TELEMETRY=1 ② SSE로 노출한다면 MOBILEMCP_AUTH 필수 (미설정 = 무인증) ③ mobilecli 불투명 바이너리 공급망을 수용할지 — 못 하면 MOBILEMCP_LEGACY_ROBOT=1 레거시 경로가 남아 있지만 제거가 예고돼 있다.요약 판정
잘하는 것 — 접근성 트리 우선 설계, 27개 도구 전부 읽기/쓰기/파괴 어노테이션이 테스트로 고정, CI는 npm ci --ignore-scripts + provenance 서명 배포, HIGH CVE 2건(임의 URL 실행·경로 탈출)을 각각 한 버전 만에 패치, 외부 기여 PR도 실제로 머지된다.
걸리는 것 — 실조작 로직이 불투명 Go 바이너리로 이사해 감사 가능성이 꺾였고, SSE 인증 fail-open은 문서화돼 있지 않으며, 텔레메트리는 opt-out이다. 릴리즈 위생도 거칠다: 태그 3개(0.0.60–62)는 릴리즈 없이 방치, 1.0.1은 CI FAILURE 3분 뒤 1.0.2로 덮고 같은 날 둘 다 공개됐다. 보안 신고 채널이 Slack DM이라는 점도 성숙도와 어긋난다.
"채택"의 뜻: 코드가 그렇게 짜여 있음을 확인했다는 것이지, 실기기에서 그렇게 동작함을 본 것이 아니다 (runtime unknown, §13).
실제 구현 — file:line 실증
아래는 README의 문장이 아니라 고정 커밋의 코드에서 직접 확인한 것들이다. 인용 링크는 전부 분석 커밋에 고정돼 있다.
진입점 — stdio 기본, SSE는 옵션이고 fail-open
서버는 기본적으로 stdio MCP로 뜨고, --listen을 주면 SSE HTTP 서버가 된다 (src/index.ts). SSE 경로의 인증은 MOBILEMCP_AUTH 환경변수 기반 Bearer 토큰인데, 변수가 없으면 검사 자체를 건너뛴다 — src/index.ts:13-16이 명시적으로 "인증 미설정 → 통과"로 짜여 있다. 설정돼 있으면 :18-27에서 Bearer 비교, :29-42는 Origin 헤더가 오면 403으로 끊어 DNS rebinding을 방어하고, :52-56은 SSE 두 번째 클라이언트를 409로 거절한다. README는 "인증 지원"이라고만 쓴다 — fail-open이라는 사실은 코드에만 있다 (C005).
도구 27개 — 어노테이션이 테스트로 고정돼 있다
src/server.ts:73-107의 tool() 래퍼가 모든 도구를 등록하며, 도구 안에서 던져진 에러를 문자열로 삼켜 MCP 응답으로 돌려준다 (프로세스는 죽지 않는다). 각 도구의 readOnly/destructive 어노테이션 매트릭스는 test/server-annotations.test.ts가 전수 고정한다 — 어노테이션을 조용히 바꾸면 테스트가 깨진다 (C011).
로봇 해석 — 기본은 mobilecli, 레거시는 환경변수 뒤에
src/server.ts:170-223 getRobotFromDevice가 디바이스 문자열을 Robot 구현으로 해석한다. 1.0.0부터 기본은 MobileDevice(src/mobile-device.ts) — 실제 탭·스와이프·스크린샷은 전부 mobilecli 외부 바이너리 호출이다. MOBILEMCP_LEGACY_ROBOT=1을 세우면 구 TypeScript 경로(AndroidRobot=adb, IosRobot=go-ios+WDA, Simctl+WDA)로 돌아간다. CHANGELOG는 레거시 경로를 한 달 뒤 제거한다고 예고한다 (C003·C004).
mobilecli 호출 규율 — 셸은 안 거친다
src/mobilecli.ts는 바이너리를 MOBILECLI_PATH → npm 체인 순으로 찾고, execFileSync로 셸 미경유 실행한다 — 인자 주입으로 셸 명령이 되는 구조는 아니다. 레거시 Android 경로도 src/android.ts:410-445에서 sendKeys 텍스트를 이스케이프하고, 시뮬레이터 앱 설치는 src/iphone-simulator.ts:135-150에서 zip-slip을 방어한다.
텔레메트리 — opt-out, 키는 소스에
src/server.ts:109-151: PostHog 공개 프로젝트 키(phc_ 접두)가 하드코딩돼 있고, distinct_id = sha256(hostname + execPath)로 기기 식별자를 만든다. 끄는 스위치는 MOBILEMCP_DISABLE_TELEMETRY. 스크린샷을 찍을 때마다 이미지 크기가 이벤트로 나간다(:788-794). README에 공개돼 있으니 은닉은 아니다 — 기본값이 ON일 뿐이다 (C007).
두 개의 HIGH CVE와 그 패치 자리
CVE-2026-35394 (임의 URL/스킴 실행, <0.0.50): 패치가 src/server.ts:652-671 open_url 스킴 화이트리스트다. 단 :662-665에서 MOBILEMCP_ALLOW_UNSAFE_URLS=1이면 게이트가 다시 열린다 — 이 변수는 취약점 클래스를 재개방하는 스위치다. CVE-2026-33989 (스크린샷 저장 경로 탈출, <0.0.49): 패치가 src/server.ts:723-742 → src/utils.ts:85-104 validateOutputPath이고, 0.0.62에서 symlink 우회(#377)까지 추가로 막았다 (C008·C009).
클라우드 디바이스 — 같은 서버, 과금 경로
src/server.ts:314-390이 mobilenext.ai 로그인, :408-430이 실기기 할당이다. 할당 도구 설명에 "shared and billed … never speculatively"라고 박아 뒀고, 해제(:432-447)는 destructiveHint가 붙어 있다. 즉 에이전트가 이 도구를 부르면 돈이 나가는 구조이며, 방어선은 어노테이션과 프롬프트 규율뿐이다 (C010).
버전의 출처
package.json의 버전은 0.0.1 고정이다 — 배포 버전은 CI가 태그에서 스탬프한다(.github/workflows/build.yml, npm ci --ignore-scripts + provenance 서명). 소스만 보고 버전을 판단하면 틀린다 (C013).
아키텍처 — 껍데기가 된 서버
README의 아키텍처 그림(§12 occurrence 18, 재게시하지 않음) 대신, 코드에서 재구성한 실제 경로다.
MCP 클라이언트 (Claude · Cursor · Goose · Copilot Studio …) │ stdio (기본) │ SSE --listen (Bearer=MOBILEMCP_AUTH, 미설정 시 무인증) ▼ src/server.ts — mobile_* 도구 27개 (읽기/쓰기/파괴 어노테이션, 테스트 고정) ▼ Robot 인터페이스 (src/robot.ts) ├─ MobileDevice ······ 1.0.0 기본 경로 │ └─▶ mobilecli ◀ 불투명 Go 바이너리 (이 레포 밖) │ npm 체인: mobilewright@0.0.52 → @mobilewright/driver-mobilecli → mobilecli@1.0.0 ├─ 레거시 경로 (MOBILEMCP_LEGACY_ROBOT=1, 제거 예고) │ ├─ AndroidRobot ─ adb │ ├─ IosRobot ──── go-ios + WebDriverAgent │ └─ Simctl ────── xcrun simctl + WebDriverAgent └─ 클라우드 (mobilenext.ai) ─ 실기기 할당/해제 · 과금
1.0.0 BREAKING의 실체는 기능 추가가 아니라 소유권 이동이다: 탭·스와이프·스크린샷의 구현이 이 저장소의 TypeScript에서 별도 저장소의 Go 바이너리(mobilecli)로 옮겨 갔고, mobile-mcp는 MCP 프로토콜 어댑터 + 텔레메트리 + 클라우드 게이트웨이로 얇아졌다. 감사 관점에서는 "코드를 읽으면 동작을 안다"가 이 커밋부터 성립하지 않는다 — 동작의 절반은 바이너리 안에 있다.
레거시 경로가 살아 있는 동안은 MOBILEMCP_LEGACY_ROBOT=1로 전 구간 소스 감사가 가능하다. CHANGELOG의 제거 예고가 실행되면 그 창은 닫힌다.
온보딩 — 실행하지 않고 읽은 절차
이 분석은 아무것도 설치·실행하지 않았다. 아래는 저장소 문서가 지시하는 절차의 정리이고, 검증되지 않은 부분은 그렇게 표시한다.
npx -y @mobilenext/mobile-mcp@latest — MCP 클라이언트 설정에 command로 등록--listen + MOBILEMCP_AUTH — 변수 없이 열면 무인증이다 (§4)MOBILEMCP_DISABLE_TELEMETRY=1 · MOBILEMCP_ALLOW_UNSAFE_URLS는 절대 세우지 말 것llms-install.md는 에이전트가 자동 설치할 때 읽는 문서인데, "No API key or credentials are required"라고 단언한다. 로컬 디바이스 경로에서는 참이지만, 같은 서버에 실린 클라우드 디바이스 도구는 mobilenext.ai 로그인과 과금이 필요하다 — 문장 그대로 믿으면 반쪽이다 (C012, 부분 지지).
정독 범위 — 무엇을 읽었나
인벤토리 48 blob 전수 분류 → substantive 28파일 선정 → 5,284줄 정독. 선정 밖 20건은 전부 생략 사유와 함께 스냅샷 원장에 기록돼 있다 (아이콘·락파일·에셋 등).
| 구역 | 파일 | 핵심 |
|---|---|---|
| 소스 (10) | src/index.ts · server.ts · robot.ts · mobile-device.ts · mobilecli.ts · android.ts · ios.ts · iphone-simulator.ts · webdriver-agent.ts · utils.ts | 진입·도구 27종·로봇 4계보·검증 유틸 — §4의 근거 전부 |
| 테스트 (6) | test/server-annotations.test.ts · mobile-device.test.ts · mobilecli.test.ts · test/android.ts · prompt-android-emulator.md · playwright.config.ts | 어노테이션 매트릭스 고정 + Claude 구동 e2e 프롬프트 |
| 문서 (7) | README.md · LICENSE · SECURITY.md · CONTRIBUTING.md · ROADMAP.md · CHANGELOG.md · llms-install.md | 주장 원천 (§11의 입력) — 권위가 아니라 대조 대상 |
| 매니페스트 (3) | package.json · server.json · glama.json | 버전 스탬프 구조 · MCP 레지스트리 등재 |
| CI (2) | .github/workflows/build.yml · .husky/pre-commit | --ignore-scripts · provenance · 레지스트리 배포 |
전체 파일 목록·blob id·생략 사유는 증거 인덱스의 스냅샷 원장에 있다.
유지보수 신호
- 게이트키핑은 사실상 1인 — gmegidish 291커밋 vs 2위 krismuhi 44커밋. 다만 외부 기여 PR(표본 30건 중 머지 20건에 TsurP·a1573595·wxxion 등 외부인 포함)이 실제로 머지되는, 닫힌 1인 프로젝트는 아니다 (C016).
- 릴리즈 위생이 거칠다 — 태그 0.0.60·0.0.61·0.0.62는 GitHub 릴리즈 없이 태그만 존재한다 (C018). 2026-08-09에는 1.0.1 태그 CI가 10:34 FAILURE, 3분 뒤 1.0.2가 성공, 10:43에 두 릴리즈가 동시 공개됐다 — 실패 버전을 지우지 않고 덮는 방식이다 (C019).
- 리뷰 응답 — coderabbitai 봇이 이슈에 19초 만에 자동 플랜을 달지만, 사람 첫 응답은 표본 기준 93.9시간(이슈 #399)이다. 봇 응답을 유지보수 신호로 읽으면 과대평가한다 (C020).
- e2e의 방식 — self-hosted 러너에서
claude --dangerously-skip-permissions로 Claude가 실기기 에뮬레이터를 조작하는 e2e가 돈다 (C014). 흥미로운 동시에, CI 인프라 신뢰 경계가 그만큼 넓다는 뜻이다. - 이슈 위생 — community health 87%, issue/PR 템플릿 부재. 표본 30건 중 open 16 / closed 5 관측.
- 속도 — 2025-03-28 공개 후 17개월 만에 스타 5,995 · 마지막 push 2026-08-18. 살아 있는 프로젝트다.
보안 · 프라이버시
등급: security/privacy medium. 은닉된 악성 패턴은 발견하지 못했다 — 아래는 설계 선택이 만드는 표면이다.
- 불투명 바이너리 공급망 — 기본 경로의 실조작은 npm 3단 체인으로 내려받는 Go 바이너리(mobilecli)다. 이 도시에의 소스 감사가 커버하지 못하는 구간이며, 신뢰는 mobile-next 조직과 npm provenance에 위임된다.
- SSE fail-open —
MOBILEMCP_AUTH미설정 시 무인증 (src/index.ts:13-16). Origin 403 방어(:29-42)는 있지만, 네트워크에 노출하면서 변수를 잊으면 폰 조작 API가 그대로 열린다. - 텔레메트리 기본 ON — PostHog 키 하드코딩 +
sha256(hostname+execPath)기기 식별 + 스크린샷 크기 이벤트 (src/server.ts:109-151,:788-794). opt-out 방식. - CVE 재개방 스위치 —
MOBILEMCP_ALLOW_UNSAFE_URLS=1은 CVE-2026-35394가 막은 임의 스킴 URL 실행을 되살린다 (src/server.ts:662-665). - 과금 도구 동거 — 클라우드 실기기 할당(과금)이 로컬 도구와 같은 서버에 있고, 가드는 어노테이션뿐이다. 에이전트 오작동 = 요금이다.
- 패치 이력은 건강 — GHSA-5qhv-x9j4-c3vm(CVE-2026-35394, HIGH)·GHSA-3p2m-h2v6-g9mx(CVE-2026-33989, HIGH) 모두 공개 어드바이저리 + 한 버전 내 패치. 숨기지 않는다.
- 보안 신고 채널이 Slack DM — SECURITY.md가 지시하는 경로가 회사 Slack 가입 후 DM이다. 이 규모 프로젝트의 표준(GHSA private report)에 못 미친다.
- CI 신뢰 경계 — e2e가 self-hosted 러너에서
--dangerously-skip-permissions로 돈다. 러너가 뚫리면 반경이 크다.
정적 전용 리시트
이 분석에서 실행된 저장소 코드는 0줄이다: 체크아웃 없음 · 의존성 설치 없음 · 빌드/테스트 없음 · import 없음 · hooks/submodule/LFS/smudge/textconv 없음. execution-observed 증거 항목 0건 — 그래서 런타임 신뢰도는 unknown이고, 그것이 정직한 천장이다.
라이선스
LICENSE + GitHub API 이중 확인 (C015)주장 검증 원장 — 22건
README·CHANGELOG·SECURITY.md·llms-install.md의 주장과 정독 발견을 대조했다. 정적 분석이므로 실행 관측(execution-observed) 증거는 0건 — "지지"도 "코드가 그렇게 짜여 있음"이지 "실기기에서 그렇게 동작함"이 아니다. 전체 원장(JSON)은 증거 인덱스에 있다.
| # | 주장 | 판정 | 근거 요지 |
|---|---|---|---|
| C001 | iOS·Android 실기기/시뮬레이터/에뮬레이터 크로스 플랫폼 자동화 | 지지 | 로봇 4계보 구현 존재; 실행 미검증 |
| C002 | 접근성 트리 우선, 스크린샷 좌표는 폴백 | 지지 | 도구 설계·구현 경로 확인 (medium) |
| C003 | 1.0.0 BREAKING — 기본 경로가 mobilecli로 교체 | 지지 | CHANGELOG + mobile-device.ts 대조 |
| C004 | 레거시 로봇은 env 게이트 + 1개월 제거 예고 | 지지 | server.ts:170-223 + CHANGELOG |
| C005 | SSE 모드 인증 지원 | 부분 지지 | 지원은 사실이나 fail-open 미문서화 (index.ts:13-16) |
| C006 | DNS rebinding 방어 (Origin 거부) | 지지 | index.ts:29-42 403 확인 |
| C007 | 텔레메트리 수집 및 opt-out 공개 | 지지 | server.ts:109-151 — 기본 ON |
| C008 | 임의 URL 실행 취약점(CVE-2026-35394)은 0.0.50에서 패치 | 지지 | 어드바이저리 + server.ts:652-671 게이트 |
| C009 | 경로 탈출 취약점(CVE-2026-33989)은 0.0.49에서 패치 | 지지 | 어드바이저리 + utils.ts:85-104 (+0.0.62 symlink #377) |
| C010 | 클라우드 실기기 도구는 공유·과금 자원 | 지지 | server.ts:408-430 도구 설명 원문 |
| C011 | 도구 어노테이션(읽기/파괴) 정확성 | 지지 | test/server-annotations.test.ts 전수 매트릭스 |
| C012 | API 키·자격증명 불필요 (llms-install.md) | 부분 지지 | 로컬 경로만 참 — 클라우드 도구는 로그인+과금 |
| C013 | CI 배포: --ignore-scripts + provenance + 레지스트리 게시 | 지지 | build.yml 확인 |
| C014 | Claude 구동 실기기 e2e 테스트 존재 | 지지 | self-hosted + --dangerously-skip-permissions |
| C015 | Apache-2.0 라이선스 | 지지 | LICENSE + API 이중 확인 |
| C016 | gmegidish 게이트키핑 + 외부 기여 머지 | 지지 | 커밋 분포 291/44 + PR 표본 30건 |
| C017 | Dependabot·코드 스캔 보안 상태 | 알 수 없음 | API 403 — 0건 단정 불가 |
| C018 | 태그 0.0.60–62는 릴리즈 없이 존재 | 지지 | tags·releases API 대조 |
| C019 | 1.0.1 CI 실패 → 3분 뒤 1.0.2, 같은 날 동시 공개 | 지지 | CI 런·릴리즈 타임스탬프 |
| C020 | 리뷰 응답은 봇(19초)과 사람(93.9h)이 다른 세계 | 지지 | 이슈 #399 타임라인 (표본, medium) |
| C021 | MCP 공식 레지스트리 등재 | 지지 | server.json 매니페스트 |
| C022 | 이 축의 주류 프로젝트 (스타 5,995) | 지지 | repo 메타데이터 (medium) |
원문 링크 원장 — README는 완역하지 않는다
이 도시에는 README의 한국어 완역을 싣지 않는다. 소스 코드가 SSOT이고 팩트이며, README는 저자의 주장이다. README의 문장들은 §11 주장 검증 원장의 입력과 §4 코드 실증의 대조 대상으로만 썼다. 대신 저자가 배치한 링크·미디어 51건 전부를 원문 순서(ordinal)대로 여기 기록한다 — 링크 39건은 목적지 그대로 보존하고(저장소 내부 링크는 커밋 고정 주소), 미디어 12건은 재게시 근거가 없어 비활성 표식으로 남긴다. occurrence 원장과 1:1이다.
히어로 — 배지와 정체성 (README 1–35행)
첫 화면: MCP 조직 선언, 배지 6종(전부 동적 SVG — 생략), 패키지·릴리스·위키·Slack, 데모 영상.
- README 3행 — Model Context Protocol 조직
- README 9행 — GitHub Stars 배지 링크
- README 10행 — 동적 SVG 배지 #1 (shields.io) — 생략
- README 12행 — @mobilenext/mobile-mcp (npm)
- README 13행 — 동적 SVG 배지 #2 (shields.io) — 생략
- README 15행 — Releases
- README 16행 — 동적 SVG 배지 #3 (shields.io) — 생략
- README 18행 — VS Code에 설치
- README 19행 — 동적 SVG 배지 #4 (shields.io) — 생략
- README 21행 — Wiki
- README 22행 — 동적 SVG 배지 #5 (shields.io) — 생략
- README 24행 — Slack 초대
- README 25행 — 동적 SVG 배지 #6 (shields.io) — 생략
- README 30행 — 데모 영상 (user-attachments)
- README 34행 — mobile-next 조직
- README 35행 — 프로젝트 배너 PNG (mobile-next-assets 저장소) — 생략
아키텍처 그림 (104–105행)
원문 다이어그램은 재게시하지 않았다 — 코드에서 재구성한 §5가 대신한다.
- README 104행 — 아키텍처 다이어그램 클릭 확대 링크 — 대상이 생략 미디어(18)와 동일하여 비활성 처리 (판단 기록: judgment-calls)
- README 105행 — 아키텍처 다이어그램 PNG (mobile-next-assets) — 생략, §5 텍스트 다이어그램으로 대체
설치 전제와 생태계 (112–124행)
Xcode·platform-tools·Node 전제와 MCP 표준·생태계 문서, 레거시 경로의 의존 도구들.
- README 112행 — Wiki (설치 전제)
- README 119행 — Xcode 리소스
- README 120행 — Android platform-tools
- README 121행 — Node.js 다운로드
- README 122행 — MCP 소개
- README 122행 — MCP 서버 퀵스타트
- README 122행 — OpenAI Agents SDK — MCP
- README 122행 — Copilot Studio MCP 발표
- README 124행 — go-ios
- README 124행 — WebDriverAgent
- README 124행 — Wiki
클라이언트별 설치 (191–305행)
Cline·Cursor·Goose·Kiro — 딥링크 셋은 전부 같은 npx 명령의 포장이다 (§6).
- README 191행 — Wiki: Cline
- README 208행 — MCP 사용자 퀵스타트
- README 270행 — Cursor에 설치
- README 270행 — Cursor 설치 버튼 SVG (cursor.com) — 생략
- README 294행 — Goose에 설치
- README 294행 — Goose 설치 버튼 SVG (block.github.io) — 생략
- README 305행 — Kiro MCP 문서
사용법·위키 (359–459행)
위키 재링크와 커밋 고정 앵커, 프롬프트 예시 목록.
- README 359행 — Wiki
- README 367행 — README #prerequisites (고정)
- README 367행 — Wiki
- README 459행 — Wiki: 프롬프트 예시 목록
프로젝트·커뮤니티 (521–545행)
형제 저장소(mobilewright·mobilecli), 회사, 기여 문서, 기여자 그래프.
- README 521행 — mobilewright
- README 522행 — mobilecli
- README 523행 — mobilenext.ai
- README 527행 — ROADMAP.md (고정)
- README 533행 — 레포 루트 (Star 유도)
- README 534행 — CONTRIBUTING.md (고정)
- README 535행 — Issues
- README 536행 — Slack 초대
- README 538행 — CODE_OF_CONDUCT.md (고정)
- README 544행 — 기여자 그래프
- README 545행 — 기여자 얼굴 모자이크 (contrib.rocks 동적 이미지) — 생략, 기여자 그래프 링크(50)로 대체
README의 실질 내용(무엇을·왜·한계)은 §4·§5·§6이 코드 대조와 함께 담고 있다 — 번역본이 아니라 검증본이다.
수집 한계 — 이 문서가 모르는 것
- 정적 분석 천장: 코드를 실행하지 않았으므로 "실기기에서 실제로 동작한다"는 어떤 주장도 이 문서는 증명하지 못한다.
- mobilecli는 범위 밖: 1.0.0 기본 경로의 실조작 로직은 별도 저장소의 Go 바이너리다. 이 도시에는 그 소스를 읽지 않았다 — mobile-mcp 쪽 호출 규율만 검증했다.
- API 샘플 경계: 이슈·PR·CI 런은 per_page=30 단일 페이지 표본이다. TTFR 93.9h는 표본 기반이지 전수 통계가 아니다.
- 거부된 엔드포인트: Dependabot 알림·코드 스캔 API가 403 — 해당 상태는 unknown이며 0으로 간주하지 않았다 (C017).
- 외부 링크 미방문: §12의 외부 목적지(mobilenext.ai, 딥링크 등)는 열지 않았다 — 목적지 설명은 URL 구조와 README 문맥에서만 도출했다.
- 시점 고정: 모든 수치는 2026-08-25 캡처 관측이다. 마지막 push 2026-08-18 — 살아 있는 프로젝트라 숫자는 곧 낡는다.