test-genie について
test-genie は、iOS、Android、Flutter、React Native、Web プロジェクトのテスト自動化を行う MCP サーバーです。問題を分析して修正案を提示し、反復修正ではテストの再実行と回帰時のロールバックを行います。一部の機械的な修正にはバックアップと構文検証があります。
主な機能
- 01プロジェクト構造の分析とテストシナリオ・計画の作成
- 02メモリリーク、論理エラー、競合状態、セキュリティ問題の検出
- 03修正案の提示、適用、ロールバック
- 04修正を反復し、変更後にテストを再実行
- 05レポート、テスト履歴、CI 設定の生成
- 06限定された安全な機械的変更の自動修正
活用シーン
- 01React Native コンポーネントのメモリリークを特定する
- 02Flutter ウィジェットに dispose 処理を追加する
- 03コミット前に競合状態や一般的なセキュリティ問題を確認する
MCP 対応
MCP サーバーとして、プロジェクト診断、テスト、コード分析、修正のツールと、テストワークフロー用プロンプトを提供します。反復修正ツールはバックアップを伴う変更を適用し、影響を受けるテストを再実行して、回帰があればロールバックできます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
19掲載時のツール一覧 · 3 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| depth | enum | いいえ | 分析の深度レベルshallow | normal | deep |
| platform | enum | いいえ | 対象プラットフォーム(指定されていない場合は自動検出)ios | android | flutter | react-native | web |
| projectPath | string | はい | プロジェクトのルートディレクトリのパス |
詳細
test-genie-mcp
バイブコーディングをする人向け:コマンドを1つ実行するだけで、プロジェクトで実際に何が壊れているのかを優先度順に表示します。
iOS、Android、Flutter、React Native、Web アプリ向けの自己修復型テスト自動化ツールです。MCP サーバーとして動作します。
v3.1.1 — バイブチェック+誠実な自動修正。 MCP を1回呼び出せば、約30秒で、競合状態+セキュリティ上の問題+メモリリーク+ロジックエラー+パフォーマンス上の問題を優先度順に表示します。すべてローカルマシン上で処理され、テレメトリーはありません。
autoFix: trueを渡すと、小規模で安全な機械的修正(弱いハッシュ、単純なMath.randomの置き換え)が適用されます。バックアップ+構文検証+構文エラー時のロールバックを行います。より難しい修正をテストで検証しながら適用するには、v3.0.0 の反復修正ループを使用してください。
バイブコーディングをする人向けクイックスタート
ドキュメントは読みません。プロジェクトを開いて Claude に話しかけ、判定結果を知りたい。こちらです。
Claude で(test-genie-mcp をインストールした状態で — セットアップ):
/vibe-check /Users/me/my-app
Claude は内部で diagnose_project を呼び出します。約30秒後に、次の結果が表示されます。
# vibe-check report
- Project: /Users/me/my-app
- Platform: web
- Findings: 11 total — 4 critical, 4 high, 1 medium, 1 low
- Estimated fix time: ~85 min
## Top 5 issues
### 1. [CRIT] Hardcoded AWS access key id found in source
- File: `server.js:7`
- Category: security / secret (CWE-798)
- Confidence: 95%
- Fix: Move the value to an env var, gitignore the config, rotate the leaked key.
### 2. [CRIT] SQL string built by concatenating user input
- File: `server.js:21`
- Category: security / injection (CWE-89)
- Fix: Use parameterized queries (`db.query("... WHERE id = ?", [id])`).
### 3. [HIGH] useState setter called after await without mount guard
- File: `UserProfile.tsx:16`
- Category: race-condition / react-setstate-after-await (CWE-362)
- Confidence: 78%
- Fix: Use AbortController and check signal.aborted before calling setters.
… (top 5 shown — full list at output: "detailed")
## Next steps
1. Address the critical / high findings above.
2. Re-run diagnose_project after fixing to confirm convergence.
3. Use run_iterative_fix_loop for test-driven verification of each fix.
検出結果の autoFixable: true が high/critical の重大度であれば、diagnose_project の呼び出しで autoFix: true を指定して、機械的な置換を直接適用できます(バックアップ+構文検証を実施します。具体的なガードについては SAFETY.md を参照してください)。v3.1.1 で誠実に対応する範囲は限定的です。弱いハッシュ(createHash('md5'|'sha1') → createHash('sha256'))と、セキュリティ上重要なファイル内にある単独の Math.random() が対象です。より広範または構造的な修正(競合状態、eval、exec インジェクション)には、run_iterative_fix_loop を別途実行してください。テストを再実行し、回帰が発生した場合は自動でロールバックします。
test-genie を選ぶ理由
モバイルとクロスプラットフォームのテスト自動化におけるボトルネックは、テストを書くことではなく、失敗したテストから成功するテストに至るまでのループです。test-genie はこのループを完結させます。
failing test → analyzer flags issue → fix proposed → dry-run + syntax check →
applied with backup → affected tests re-run → regression check → loop or stop
この一連のループを担うのが run_iterative_fix_loop ツールです。v3.1.1 の diagnose_project autoFix: true の経路が対象とするのは、その一部に厳密に限られます。バックアップ+ドライラン+構文検証+適用を行いますが、テストは再実行しません(その経路ではテスト回帰時のロールバックも行いません)。目的に合ったツールを選び、それぞれの具体的なガードについては SAFETY.md を参照してください。
その他のツール(Detox、Maestro、Playwright、xcodebuild test)はテストを実行します。test-genie は、スタックトレースを手作業で追わなくても、テストを実行するだけでなく、基準を満たすか、これ以上進められなくなるまで修正も進めます。
5分でできるクイックスタート
# 1. Install
npm install -g test-genie-mcp
# 2. Add to Claude Desktop config (~/.config/claude/claude_desktop_config.json)
{
"mcpServers": {
"test-genie": {
"command": "npx",
"args": ["test-genie-mcp"],
"env": {
"TEST_GENIE_ALLOWED_ROOT": "/path/to/your/project"
}
}
}
}
# 3. Restart Claude Desktop. From a chat:
# "Run the iterate-fix loop on /Users/me/my-rn-app with autoApply=false"
出力例(省略あり):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Iterative fix loop f8b3… — PAUSED-FOR-CONFIRMATION
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Iterations completed: 1
Fixes applied: 0
Regressions rolled back: 0
Final tests: 7/10 passing (3 failing)
Pending confirmations (3):
- 71fbe…: Fix: useEffect missing cleanup for setInterval (confidence: 85)
- 92ad1…: Fix: Force-unwrap on possibly-undefined name (confidence: 85)
- …
Resume token: f8b3…
ファイルに実際にパッチを適用するには、autoApply: true(または resumeToken: "f8b3…")を指定して再度呼び出します。
実際のユースケース
以下のフローは
run_iterative_fix_loopの経路(v3.0 の 主な機能)について説明しています。検出 → 提案 → ドライラン → バックアップ付きで適用 → テスト再実行 → 回帰時にロールバックを行います。 v3.1.1 のdiagnose_project autoFixの経路は、より限定的な機械的置換のみの経路です。 実際に何が対象となるかについては、SAFETY.md の §4 を参照してください。
1. React Native のメモリリークを自己修復
チームが useEffect に setInterval(...) を追加し、クリーンアップを忘れたとします。test-genie の detect_memory_leaks がそれを検出し、suggest_fixes が return () => clearInterval(id) を提案し(src/tools/fixing/suggestFixes.ts:169-179)、ループがパッチを TS コンパイラーでドライランし、バックアップ付きで適用した後、影響を受けるスナップショットテストだけを再実行して、合格率が100%になったことを確認して停止します。修正前: 失敗するスナップショットが1件。修正後: 失敗は0件、修正を1件適用、.test-genie-backups/ にバックアップが1件。
2. Flutter ウィジェットの dispose() 自動化
AnimationController が破棄されずに残っています。test-genie は dispose() のオーバーライドがないことを検出し、Dart の @override dispose() { controller.dispose(); super.dispose(); } ブロック(suggestFixes.ts:214-217)を生成して、修正したファイルに対して dart analyze を実行し、適用後に flutter test を再実行して収束します。
3. iOS のリテインサイクル(クロージャのキャプチャ)
self.timer = Timer.scheduledTimer(...) { _ in self.tick() } — ルールベースの検出器がクロージャによる self のキャプチャを検出し、修正機能が [weak self] _ in guard let self = self else { return }; self.tick() に書き換えます(suggestFixes.ts:239-242)。swiftc が PATH にある場合は実際に構文チェックを行い、ない場合は test-genie が「検証レベルの引き下げ」を報告するので、そのことがわかります。
反復修正ループの仕組み
┌────────────────────┐
│ collect tests │ (run_scenario_test / supplied list)
└─────────┬──────────┘
│
pass-rate ≥ threshold? ── yes ──▶ SUCCESS
│ no
▼
┌────────────────────┐
│ detect issues │ memory + logic analyzers
└─────────┬──────────┘
│
┌────────────────────┐
│ suggest fixes │ rule-based (default) → LLM (hybrid, optional)
└─────────┬──────────┘
│
┌────────────────────┐
│ dry-run + syntax │ TS compiler API / platform compiler / brace check
└─────────┬──────────┘
│
┌────────────────────┐
│ apply with backup │ per-file `.test-genie-backups/`
└─────────┬──────────┘
│
┌────────────────────┐
│ re-run tests │ regression? yes → auto-rollback
└─────────┬──────────┘
│
▼
loop (≤ maxIterations, ≤ totalTimeout)
シーケンス図と安全ガードの一覧については、docs/ITERATE_FIX_LOOP.md を参照してください。
ツール(23)
| # | ツール | モード |
|---|---|---|
| 1 | analyze_app_structure | 実際 |
| 2 | generate_scenarios | 実際 |
| 3 | create_test_plan | 実際 |
| 4 | run_scenario_test | ハイブリッド |
| 5 | run_simulation | シミュレーション |
| 6 | run_stress_test | ハイブリッド |
| 7 | detect_memory_leaks | 実際 |
| 8 | detect_logic_errors | 実際 |
| 9 | suggest_fixes | 実際 |
| 10 | confirm_fix | 実際 |
| 11 | apply_fix | 実際 |
| 12 | rollback_fix | 実際 |
| 13 | run_full_automation | ハイブリッド |
| 14 | run_iterative_fix_loop(v3.0 の目玉) | ハイブリッド |
| 15 | generate_report | 実際 |
| 16 | get_pending_fixes | 実際 |
| 17 | get_test_history | 実際 |
| 18 | analyze_performance | 実際 |
| 19 | analyze_code_deep | 実際 |
| 20 | generate_cicd_config | 実際 |
| 21 | diagnose_project(v3.1 の目玉 — 雰囲気チェック) | 実際 |
| 22 | detect_race_conditions | 実際 |
| 23 | detect_security_issues | 実際 |
mode の凡例は docs/SIMULATION_VS_REAL.md にあります。
さらに、4 つのリソース(test-genie://iteration-logs、…/test-history/{path}、…/iteration-logs/{loopId}、…/applied-fixes/{path})と 3 つのプロンプト(full-test-pipeline、diagnose-failure、vibe-check)があります。
vibe-check が検出する項目
競合状態(detect_race_conditions / diagnose_project):
| パターン | 言語 | 重大度 | 自動修正可能(v3.1.1) |
|---|---|---|---|
マウントガードなしで、await の後に useState セッターを呼び出す | TS/JS/React | 高 | いいえ(構造上の問題) |
非同期フェッチを行う useEffect に AbortController/クリーンアップがない | TS/JS/React | 高 | いいえ(構造上の問題) |
arr.forEach(async ...)(通知されない fire-and-forget) | TS/JS | 中 | いいえ(順序に依存) |
Promise.all/順次実行を使わない、隣接するフェッチ | TS/JS | 中 | いいえ |
TOCTOU:ロックなしで existsSync の後に readFileSync を実行する | TS/JS Node | 中 | いいえ |
| 非同期コンテキストでの非アトミックなカウンターのインクリメント | TS/JS | 低 | いいえ |
@MainActor の外での @Published の変更 | Swift | 中 | いいえ |
.barrier を使わない、並行する DispatchQueue への書き込み | Swift | 中 | いいえ |
Dispatchers.Main 以外での MutableStateFlow の変更 | Kotlin | 中 | いいえ |
flowOn を使わずに Flow を収集する | Kotlin | 低 | いいえ |
sync.Mutex を使わない、goroutine と共有マップの組み合わせ | Go | 高 | いいえ |
v3.1.1 の正確性監査:以前は
useEffect-no-abortとforEach-awaitを自動修正可能として案内していましたが、 実際にはできません。AbortControllerでラップしたり、Promise.all(arr.map(...))に書き換えたりすると、 静的に検証できない動作の変更が生じます。これらは現在、レポートのみを 出力します。SAFETY.md を参照してください。
セキュリティ(detect_security_issues / diagnose_project):
| パターン | 重大度 | CWE | 自動修正可能(v3.1.1) |
|---|---|---|---|
| ハードコードされた AWS/Stripe/GitHub/Google/Slack トークン | 重大/高 | CWE-798 | いいえ(ローテーション) |
| ハードコードされた JWT シークレットのリテラル | 高 | CWE-798 | いいえ |
| URL クエリ文字列内の API トークン | 高 | CWE-200 | いいえ |
.env ファイルが存在するが、gitignore の対象ではない | 高 | CWE-538 | いいえ(先にローテーションが必要) |
req.params/req.body を使った SQL 文字列の連結 | 重大 | CWE-89 | いいえ |
動的な値を使った innerHTML/dangerouslySetInnerHTML | 高 | CWE-79 | いいえ |
リテラル以外を使った eval()/new Function() | 重大 | CWE-95 | いいえ |
セキュリティ関連ファイル内の Math.random()、単独の代入 | 高 | CWE-338 | はい(crypto.randomInt) |
算術式に含まれる Math.random() | 高 | CWE-338 | いいえ(意味上の問題) |
セキュリティ関連キーワードを含むファイル内の createHash('md5'|'sha1') | 高 | CWE-327 | はい('sha256') |
その他の箇所での createHash('md5'|'sha1') | 中 | CWE-327 | いいえ(重大度の下限未満) |
ユーザー入力を含むテンプレートリテラルを使った child_process.exec | 重大 | CWE-78 | いいえ |
fetch(req.query.url)(SSRF) | 高 | CWE-918 | いいえ |
CORS のオリジンが * かつ Allow-Credentials: true | 高 | CWE-942 | いいえ |
httpOnly/secure/sameSite を指定せずに設定された Cookie | 低 | CWE-1004 | いいえ |
安全なスキーマを指定しない yaml.load | 中 | CWE-502 | いいえ |
v3.1.1 の正確性監査:以前は
.env/Math.random(一般)/yaml.loadを 自動修正可能として案内していましたが、いずれも無条件で書き換えるにはリスクが高すぎるか、 提供できる戦略がありませんでした。そのため、レポートのみの出力に変更しました。 SAFETY.md §5 を参照してください。
vibe-check では検出できないこと(正直な一覧)
これは「30 秒で明らかな問題を見つける」ためのフィルターであり、Snyk や Semgrep、完全な SAST ツールではありません。次の問題は検出できません。
- ファイルをまたぐデータフロー。 ユーザー入力が 3 つのファイルを経由して
db.queryに到達する場合でも、正規表現ではそのつながりを追えません。本格的な SAST は呼び出しグラフ全体で汚染の伝播を追跡します。ロードマップ:上位 N 個のエントリーポイントを対象に、ts-morph で参照をたどる機能。 - 脆弱な間接依存関係。 npm のアドバイザリは照会しません。それは
npm auditの役割であり、古いアドバイザリ一覧を同梱すると誤った情報になるためです。依存関係の CVE も対象にしたい場合は、npm audit --jsonを並行して実行してください。 - プロセス間の競合状態。 プロセス内の JS/Swift/Kotlin/Go の競合状態は検出します。サービス間のロック順序や DB トランザクションなど、分散システムの競合状態には別のツールが必要です。
- 型は正しいがロジックが壊れているコード。 このアナライザーは構文ベースであり、意味解析は行いません。
Math.random()をgetNonceと命名しても見逃しませんが、適切な名前が付けられたcrypto.randomBytesがごく少ないエントロピーで使われている場合は見逃します。 - 独自のシークレット形式。 固有のプレフィックスを持つ社内トークンには、
securityAnalyzer.SECRET_PATTERNSに追加できる正規表現が必要です。PR を歓迎します。 - リアルタイム/動的な問題。 高負荷時のメモリーリーク、ネットワークのタイムアウト、操作中の描画の遅延などには、静的解析ではなく
run_stress_test/run_simulationが必要です。
vibe-check に加えて、より広範囲を確認したい場合は、検出結果を run_iterative_fix_loop に渡してテストで検証しながら適用するか、コンプライアンス用途では Snyk/Semgrep/GitHub Advanced Security にエスカレーションしてください。
vibe-check と代替ツールの比較
| vibe-check (test-genie) | Snyk | Semgrep | GitHub Advanced Security | |
|---|---|---|---|---|
| ローカルで実行 | はい | ハイブリッド(クラウド) | はい | いいえ(クラウド) |
| テレメトリーなし | はい(ネットワーク呼び出しなし) | いいえ | 一部対応 | いいえ |
| 修正ループとの統合 | はい(run_iterative_fix_loop) | いいえ | いいえ | いいえ |
| 競合状態の検出 | はい(JS/Swift/Kotlin/Go) | いいえ | 一部対応 | 一部対応 |
| ファイルをまたぐ汚染フロー | いいえ(ロードマップ) | はい | はい | はい |
| セットアップ時間 | なし(test-genie がインストール済みなら、すでに利用できます) | アカウント作成+認証 | インストール+ルールセット | リポジトリ単位で有効化 |
「コミットする前に、何が壊れているか」を知りたいなら、応答速度では vibe-check が優れています。「コンプライアンスとサプライチェーンの監査」が目的なら、専用ツールを使用してください。
test-genie を使用すべきでない場合
- 本番環境へのデプロイ可否を決めるテスト実行。 test-genie は開発時のフィードバックループ向けに作られています。リリースの判断には、エンドツーエンドで制御できる適切な CI を使用してください。
- チームがすべての行を手作業でレビューしなければならないコード。 このループの役割は修正を提案して適用することです。すべての修正に人の確認が必要な場合は、
autoApply: false(既定値)のまま、修正案の生成のみを目的に使用してください。 - バックアップがない/バージョン管理されていない状況。 test-genie の自動ロールバックはベストエフォートであり、ファイルごとのバックアップが存在する必要があります。必ず git 作業ツリー内で実行してください。
比較
| test-genie | Detox | Maestro | xcodebuild test | |
|---|---|---|---|---|
| E2E テスト/単体テストの実行 | ✅(Jest/Detox など経由) | ✅ | ✅ | ✅ |
| コードの問題を検出 | ✅ ルール+LLM | ❌ | ❌ | ❌ |
| 反復的な修正ループ | ✅ (run_iterative_fix_loop) | ❌ | ❌ | ❌ |
| テストのリグレッション時に自動ロールバック | ✅ run_iterative_fix_loop 内のみ | ❌ | ❌ | ❌ |
| 構文エラー時に自動ロールバック | ✅ すべての適用経路 | ❌ | ❌ | ❌ |
| MCP ネイティブ(Claude/エージェントと通信) | ✅ | ❌ | ❌ | ❌ |
| マルチプラットフォーム | iOS+Android+Web+Flutter+RN | iOS+Android | iOS+Android | iOS のみ |
対象範囲に関する注意:
diagnose_project autoFix: trueは構文検証の 失敗時にロールバックします(applyFix.ts:185-202)が、テストを 再実行しないため、テストのリグレッションを検出できません。テスト駆動の ロールバックにはrun_iterative_fix_loopを使用してください。 SAFETY.md §2.4 を参照してください。
test-genie は Jest、Detox、xcodebuild test などのツールを内部で使用します。テストランナー層ではなく、オーケストレーション層で動作します。
既知の制限事項
- プラットフォーム構文チェックのダウングレード。 Swift/Kotlin/Java/Dart では、プラットフォームのコンパイラーを
-typecheckモードで使用します。コンパイラーが PATH 上にない場合は、波括弧の対応チェックにフォールバックし、結果にdowngraded: trueを表示します。実際の検証を行うには、swiftc/kotlinc/javac/dartをインストールしてください。 - LLM は任意であり、条件に応じて実行されます。
strategy: 'hybrid'では、ルールベースの信頼度がしきい値を下回った場合にのみ LLM が実行されます。API キーがない場合、ループはルールベースのみで動作します。失敗にはなりません。 - ストレージはマシンごとです。 テスト履歴/反復ログは
$TEST_GENIE_STORAGE_DIR(デフォルトは~/.test-genie-mcp)に保存されます。マシン間では同期されません。 - シミュレーションモードは「シミュレーション」であり、魔法ではありません。
run_simulationは実際の異常ではなく、もっともらしい異常を返します。実機で実行するにはrun_scenario_test(ハイブリッド)を使用してください。
設定
| 環境変数 | デフォルト | 目的 |
|---|---|---|
TEST_GENIE_ALLOWED_ROOT | cwd | ケイパビリティベースのパス安全性。サーバーはこのルート外の読み書きを拒否します。 |
TEST_GENIE_STORAGE_DIR | ~/.test-genie-mcp | シナリオ/結果/反復ログの保存先です。 |
TEST_GENIE_LLM_PROVIDER | 自動検出 | anthropic/openai/none。 |
ANTHROPIC_API_KEY | — | プロバイダーが anthropic の場合に使用します。 |
OPENAI_API_KEY | — | プロバイダーが openai の場合に使用します。 |
TEST_GENIE_ANTHROPIC_MODEL | claude-haiku-4-5 | Anthropic モデルを上書きします。 |
TEST_GENIE_OPENAI_MODEL | gpt-4o-mini | OpenAI モデルを上書きします。 |
v2.x からの移行
run_full_automationは引き続き動作します。confirmMode/autoFixオプションは互換性のために維持されていますが、新しい方法はautoApply: booleanです。autoApply: trueはconfirmMode: 'auto'と同等です。- サブプロセスの強化により、プラットフォームツールはシェルのメタ文字を含むスキーム/デバイス/パッケージ名の引数を拒否するようになりました。CI から不自然な値を渡していた場合は、事前にサニタイズしてください。
- 破壊的変更の一覧と移行手順については、CHANGELOG.md を参照してください。
ロードマップ
- LLM による修正案の投票(複数の提案から、構文と再テストの差分に基づいて最適なものを選択)
- 複数リポジトリの同期(1 回の MCP 呼び出しから、N 個のリポジトリでループを並列実行)
- ファイル保存時にループを実行する「ウォッチモード」
- Detox/Maestro のアーティファクト取り込みの改善(動画を反復ログにリンク)
貢献
Issue、PR、アイデアを歓迎します。CONTRIBUTING.md(TODO)を参照してください。コードは src/ に、テストは tests/ にあります。PR を送る前に npm test を実行してください。
メンテナー
@MUSE-CODE-SPACE — Yoonkyoung Gong。
ライセンス
MIT — LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。