Skip to main content
Glama
README.md
<div align="center">

![AndroJack Banner](https://raw.githubusercontent.com/VIKAS9793/AndroJack-mcp/main/assets/AndroJack%20banner.png)

# AndroJack — The Jack of All Android Trades

<img src="https://img.shields.io/badge/Android-3DDC84?style=for-the-badge&logo=android&logoColor=white" />
<img src="https://img.shields.io/badge/Kotlin-7F52FF?style=for-the-badge&logo=kotlin&logoColor=white" />
<img src="https://img.shields.io/badge/MCP-Protocol-blueviolet?style=for-the-badge" />

<a href="https://www.npmjs.com/package/androjack-mcp/v/2.1.0"><img alt="AndroJack MCP version 2.1.0" src="https://img.shields.io/badge/AndroJack_MCP-v2.1.0-3DDC84?style=for-the-badge&logo=android&logoColor=white&labelColor=0B1F14" height="64" /></a>

### *An MCP server that equips your AI coding assistant with live, verified Android knowledge — so it builds from official sources, not from memory.*

<br/>

[![Install in VS Code](https://img.shields.io/badge/Install%20in-VS%20Code-007ACC?style=for-the-badge&logo=visual-studio-code&logoColor=white)](https://marketplace.visualstudio.com/items?itemName=VIKAS9793.androjack-vscode)
[![Install in Claude Desktop](https://img.shields.io/badge/Install%20in-Claude%20Desktop-D97706?style=for-the-badge&logo=anthropic&logoColor=white)](https://claude.ai/integrations/install-mcp?params=eyJuYW1lIjoiYW5kcm9qYWNrIiwiY29tbWFuZCI6Im5weCIsImFyZ3MiOlsiLXkiLCJhbmRyb2phY2stbWNwQDIuMS4wIl19)
[![Install in Cursor](https://img.shields.io/badge/Install%20in-Cursor-000000?style=for-the-badge&logo=cursor&logoColor=white)](https://cursor.com/install-mcp?name=androjack&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsImFuZHJvamFjay1tY3BAMi4xLjAiXX0=)
[![Add to Kiro](https://img.shields.io/badge/Add%20to-AWS%20Kiro-FF9900?style=for-the-badge&logoColor=white)](https://kiro.dev/launch/mcp/add?name=androjack&config=%7B%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22androjack-mcp%402.1.0%22%5D%2C%22disabled%22%3Afalse%2C%22autoApprove%22%3A%5B%5D%7D)
[![View on npm](https://img.shields.io/badge/View%20on-npm-CB3837?style=for-the-badge&logo=npm&logoColor=white)](https://www.npmjs.com/package/androjack-mcp)

<br/>

[![Official Product Page](https://img.shields.io/badge/Product-Landing%20Page-00C7B7?style=for-the-badge)](https://androjack-web.netlify.app/)
[![Watch AndroJack in Action on YouTube](https://img.shields.io/badge/YouTube-Watch%20Demo-FF0000?style=for-the-badge&logo=youtube&logoColor=white)](https://youtu.be/O2aFyObV-B0)

<br/>

**Also works with:** Windsurf · VS Code Copilot · Google Antigravity · JetBrains AI — see [Manual Config](#-manual-config--copy--paste) below ↓

**VS Code distribution:** Also live on the VS Code Marketplace as [AndroJack MCP for VS Code](https://marketplace.visualstudio.com/items?itemName=VIKAS9793.androjack-vscode).


</div>

---

## Table of Contents

- [The Crisis That Created This Tool](#-the-crisis-that-created-this-tool)
- [What Actually Breaks In Practice](#-what-actually-breaks-in-practice--documented-evidence)
- [What AndroJack Does](#-what-androjack-does)
- [Honest Activation Model](#️-honest-activation-model--two-levels)
- [What Can Still Break — Even at Level 3](#-what-can-still-break--even-at-level-3)
- [Defence-in-Depth](#️-defence-in-depth-the-right-tool-for-each-bug-class)
- [The Killer Argument](#-the-killer-argument)
- [The 23 Tools](#-what-androjack-covers--23-tools)
- [Quick Start](#-quick-start--zero-install-required)
- [Manual Config](#-manual-config--copy--paste)
- [Ecosystem: Google's First-Party Tools](#-the-ecosystem-androjack-and-googles-first-party-agent-tools)
- [Security & Privacy](#-security--privacy)
- [Changelog](#-changelog)

---

## 🔥 The Crisis That Created This Tool

In 2025, the **Stack Overflow Developer Survey** asked 49,000 developers about their experience with AI coding tools. The results should alarm every Android engineer:

- **84% of developers** now use AI coding tools — up from 76% the year before.
- **Trust in AI accuracy collapsed** from 40% to just **29%** in a single year.
- **35% of all Stack Overflow visits in 2025** are now triggered by developers debugging and fixing AI-generated code.

The gap between usage and trust is not a coincidence. It is the product of a structural problem: **AI models predict tokens, not APIs.** They were trained on a snapshot of the world and have no mechanism to know what changed at API 30, what shipped at Google I/O 2025, or what Google Play now rejects at review time.

For Android developers, this failure mode is uniquely dangerous. Android has the fastest-moving ecosystem in mobile development — a new Compose BOM every month, Navigation 3 going stable after seven years of Nav2, Android 16 rewriting the rules on screen orientation locking — and most AI tools have training data that is six months to two years stale by the time you use them.

The result is not just bad code. It is **confidently bad code.**

---

## ⚡ What Actually Breaks In Practice — Documented Evidence

> These are not hypothetical risks. They are documented failure modes from real developer projects.

<details>
<summary><strong>The Navigation 3 Hallucination (January 2026)</strong></summary>

A published case study from **Atomic Robot** documented a live Navigation 2 → Navigation 3 migration using both Gemini and Claude — with internet access enabled on both. The conclusion, verbatim:

> *"LLMs still hallucinate versions. Even with internet access, both agents wanted to use an outdated release candidate instead of the stable 1.0.0 release."*

Navigation 3 went stable in November 2025 after seven years of the same library. It is a complete architectural rethink: back stacks are now plain Kotlin lists, the monolithic nav graph is gone, and `NavDisplay` replaces `NavController`. Google's own migration guide is so aware that AI tools get this wrong that it now contains special **"AI Agent:" annotations** — instructions embedded directly in the official docs for AI tools to follow. An AI tool that generates Nav2 code for a new Compose project in 2026 is not making a small mistake. It is creating an architectural incoherence that requires a full rewrite to fix.

</details>

<details>
<summary><strong>The Compose Deprecation Treadmill</strong></summary>

Jetpack Compose ships a new BOM every month. Since most models' training cutoffs, these APIs changed:

| API | Status | What goes wrong |
|:----|:-------|:----------------|
| `ContextualFlowRow` / `ContextualFlowColumn` | Deprecated in Compose 1.8 | AI still generates them — compile warning today, removal tomorrow |
| `TestCoroutineDispatcher` | Removed from coroutines-test 1.8+ | AI still generates it — non-deterministic test failures in CI |
| `FlowRow` overflow parameter | Deprecated in 1.8 | Subtle behavioral regression at runtime, silent in most linting setups |
| `AnchoredDraggableState.confirmValueChange` | Deprecated | Incorrect drag behavior at anchor boundaries |
| Navigation 2 in new projects | Superseded by Nav3 stable Nov 2025 | Architectural dead-end that requires a rewrite to fix |

Every one of these compiles. Most run without errors. The bugs surface later in CI flakiness, UI regressions, or Play Store review failures.

</details>

<details>
<summary><strong>The Android 16 / API 36 Mandate (in force since August 31, 2026)</strong></summary>

Android 16 made a platform-level change affecting every published app: on devices ≥600dp — tablets, foldables, ChromeOS — apps can **no longer lock screen orientation** or restrict resizability. Since August 31, 2026, Google Play requires new apps and updates to target API 36 (extension available to November 1, 2026). Android 17 / API 37 removes the remaining opt-out.

An AI tool generating `android:screenOrientation="portrait"` or `android:resizeableActivity="false"` today is generating code that triggers App Compatibility warnings in Play Console, fails large-screen quality checks, and gets apps demoted in Play Store search results.

The business impact is not theoretical: **Foldable users spend 14× more on apps** than phone-only users. Tablet + phone users spend 9× more. FlipaClip saw 54% growth in tablet users within four months of going adaptive.

</details>

<details>
<summary><strong>The KMP Silent Failure</strong></summary>

Kotlin Multiplatform went mainstream in 2025 — over 900 new KMP libraries published, Room added KMP support, companies now hire specifically for KMP skills. When a developer on a KMP project asks an AI tool to add database support, the AI generates Android-only Room code. It compiles. It runs perfectly on Android. **The iOS build fails.** The developer spends hours debugging before realizing the root cause: their AI tool does not know KMP exists.

</details>

---

## 🧩 What AndroJack Does

AndroJack is a **documentation-grounded Android engineering MCP server**. It gives your AI coding assistant **23 specialized tools** that fetch live, verified answers from official Android and Kotlin sources — instead of predicting from stale training data.

It does not make the AI smarter. It makes the AI **accountable to evidence.**

Think of it as a pre-build linter for LLMs. While other tools retrieve documentation, AndroJack acts as a strict architectural gatekeeper.

```
Without AndroJack:  You ask → AI predicts from stale weights → Code (possibly wrong)

With AndroJack:     You ask → AI calls tool → Tool fetches official source live
                             → AI reads verified answer → Code (grounded)
```

---

## ⚠️ Honest Activation Model — Two Levels

> [!IMPORTANT]
> This is the most important thing to understand before you install AndroJack.

| Level | What's Active | What the AI Does |
|:------|:--------------|:-----------------|
| **Level 1 — Tools only** | 23 tools registered in IDE | AI *may* call the right tool. Depends on the IDE and the AI's judgment. |
| **Level 2 — Tools + Grounding Gate** | 23 tools + mandatory pre-generation rulebook | AI *must* call the correct tool for every decision before writing code. |
| **Level 3 — Full loop-back** | Level 2 + `android_code_validator` | AI validates every code block against 34 rules. Errors must be fixed before the user sees the code. |

**Level 1 is passive.** The tools are available but the AI decides when to use them. An AI building a Compose screen may call `architecture_reference` but skip `material3_expressive` — and ship M3E violations silently.

**Level 2 is active.** The `androjack_grounding_gate` system prompt maps every task type to the correct tool. Building Compose UI? The AI is mandated to call `material3_expressive` first. Adding a dependency? It must call `gradle_dependency_checker`. No exceptions.

**Level 3 is the loop-back.** `android_code_validator` runs on every code block the AI generates before returning it to the user. 34 rules covering removed APIs, deprecated patterns, Android 16/17 compliance, and Compose-First migration signals. Comments are ignored, so a migration note like `// replaced AsyncTask` never triggers a false FAIL. Results come back as text **and** as `structuredContent` with an output schema. Verdict **FAIL** means the AI must fix and re-validate — the user never sees the broken code.

→ *For full grounding, always activate Level 2 + Level 3. See Getting the Full Guarantee below.*

---

## 🪲 What Can Still Break — Even at Level 3

> [!IMPORTANT]
> AndroJack is a documentation-grounding and API-validation tool. It is not a Compose layout engine, a design system enforcer, or a runtime renderer. Level 3 catches removed APIs and deprecated patterns. It cannot catch every class of Android bug. This is not a limitation of AndroJack — it is a fundamental property of static text analysis applied to a visual, runtime-rendered UI framework.

The following bugs were encountered in a real Android app built with AndroJack at Level 2 (v1.4.0). They are documented here honestly so you know exactly what to watch for — and where to reach for different tools.

### ✅ What Level 3 Catches

```kotlin
// ❌ REMOVED — android_code_validator fires: REMOVED_ASYNCTASK
class MyTask : AsyncTask<Void, Void, String>()

// ❌ REMOVED — fires: REMOVED_TEST_COROUTINE_DISPATCHER
val dispatcher = TestCoroutineDispatcher()

// ❌ DEPRECATED — fires: DEPRECATED_CONTEXTUAL_FLOW_ROW
ContextualFlowRow { Text("hello") }

// ❌ LEAK — fires: GLOBALSCOPE_LAUNCH
GlobalScope.launch { fetchData() }
```

### ⚠️ What Level 3 Cannot Catch

> [!WARNING]
> The following bugs were found in a real project. They are valid, API-current Compose code that violates design system constraints, accessibility minimums, or architectural boundaries. Static text scanning cannot detect them.

<details>
<summary><strong>Bug PH-UI-001 — Segmented button text truncation</strong></summary>

```kotlin
// Compiles and runs. Level 3 sees no violation.
// The bug: Text inside MultiChoiceSegmentedButtonRow truncates because a
// fixed height modifier prevents the Roboto Flex variable font from expanding.
MultiChoiceSegmentedButtonRow {
    SegmentedButton(/* fixed height modifier */) {
        Text("Light")
    }
}
```

> [!NOTE]
> This is an **absence** bug. The correct modifier is missing — no wrong one is present. Use visual testing or runtime inspection.

</details>

<details>
<summary><strong>Bug PH-UI-003 — Disabled button contrast failure</strong></summary>

```kotlin
// Correct Material 3 API. Level 3 sees no violation.
// The bug: disabled state colours fail WCAG AA 4.5:1 contrast against surface.
Button(enabled = false, onClick = {}) {
    Text("INITIALIZE VAULT")
}
```

> [!NOTE]
> This is a **runtime visual property** bug. Use paparazzi screenshot tests or Google's Accessibility Scanner.

</details>

<details>
<summary><strong>Bug PH-AR-004 — Raw stack trace rendered to end user</strong></summary>

```kotlin
// A missing try/catch produces no pattern match.
class VaultViewModel : ViewModel() {
    fun initializeVault() {
        viewModelScope.launch {
            val result = repository.initialize() // Missing try/catch
            _uiState.value = UiState.Success(result)
        }
    }
}
```

> [!WARNING]
> **UDF architecture violations** require Detekt with custom rules or unit tests verifying exception mapping.

</details>

---

## 🗂️ Defence-in-Depth: The Right Tool for Each Bug Class

| Bug Class | Real Example | Right Tool |
|:----------|:-------------|:-----------|
| Removed / deprecated API | `AsyncTask`, `TestCoroutineDispatcher` | ✅ AndroJack Level 3 |
| Android 16 violations | `screenOrientation`, `resizeableActivity=false` | ✅ AndroJack Level 3 |
| Android 17 violations | `static final` reflection, LAN without permission | ✅ AndroJack Level 3 |
| Architecture (flagged root) | `GlobalScope` leaking to UI | ✅ AndroJack Level 3 |
| Absent modifier / missing constraint | `PH-UI-009` (innerPadding) | 🔧 Android Lint / IDE inspector |
| Runtime contrast / colour failures | `PH-UI-003` (WCAG) | 🔧 paparazzi + Accessibility Scanner |
| Touch target violations | `PH-UX-008` | 🔧 Accessibility Scanner |
| Architecture boundary (missing catch) | `PH-AR-004` (stack trace to UI) | 🔧 Detekt + ViewModel unit tests |

---

## 🎯 The Killer Argument

> *"Can your `agents.md` file tell me the Gradle version that shipped last Tuesday?"*

No markdown file can. No rules in `.cursorrules` can. No `SKILL.md` can.

**✅ Only a live tool call can.**

That's the job AndroJack exists to do — and nothing else in the current ecosystem does it for Android specifically.

| What you need | agents.md / SKILL.md | AndroJack MCP |
|:--------------|:---------------------|:--------------|
| Format output a specific way | ✅ Perfect | Works too |
| Follow team conventions | ✅ Perfect | Works too |
| Latest Gradle version right now | ❌ Guesses from memory | ✅ Fetches live |
| Is AsyncTask removed? | ❌ May be wrong | ✅ Verified against SDK |
| Android 16 Play Store rules | ❌ Unknown | ✅ Official source |

**Prompt engineering controls how the AI responds. MCP controls what the AI knows.**

---

## ✨ What AndroJack Covers — 23 Tools

| # | Tool | What It Does | What Breaks Without It |
|:----|:-----|:-------------|:-----------------------|
| 1 | `🔍 search` | Official doc excerpts — Google Developer Knowledge API (optional key) or a verified index of canonical pages | AI reasons from memory — possibly wrong today |
| 2 | `⚠️ component` | Deprecated/removed check on 40+ APIs | Compiles fine, breaks at runtime/review |
| 3 | `📐 architecture` | Guides for 40+ topics — MVVM, Nav3, MVI... | AI gives 2022 advice; misses Nav3 |
| 4 | `🐛 debugger` | Parses stacktraces → official docs + Issue Tracker link | AI hallucinates fixes for known bugs |
| 5 | `📦 gradle` | Live lookup from Google Maven (highest **stable**, pre-release flagged) + BOM resolution | Stale Compose BOM, KAPT instead of KSP |
| 6 | `📊 api-level` | API 21–36 table, minSdk warnings | API 26+ calls in minSdk 21 apps |
| 7 | `🎯 kotlin` | 10 patterns — coroutines, MVI, Compose state | `GlobalScope.launch`, `runBlocking` in UI |
| 8 | `🎨 m3e` | Material 3 Expressive components & Motion | M2 MaterialTheme in M3E app |
| 9 | `🔐 permissions` | 40+ permissions rules & contracts | `deprecated requestPermissions()` |
| 10 | `🧪 testing` | Unit/Compose UI testing official patterns | `Thread.sleep()` in tests; missing Hilt |
| 11 | `🏗️ build` | R8, libs.versions.toml, signing, AAB | `implementation` instead of `ksp` |
| 12 | `📱 large-screen` | WindowSizeClass (5 breakpoints incl. Large/XL), Adaptive Scaffolds | Phone-only layouts on foldables and desktops |
| 13 | `🚀 scalability` | Paging 3, WorkManager, modularization | Naive `loadAll()`; unstable keys in lists |
| 14 | `🧭 nav3` | Nav3 (Nov 2025) — Scenes, migration | AI generates Nav2 dead-ends |
| 15 | `✅ compliance` | API 36 / Android 16 / 16 KB page size | Updates rejected — Play has required targetSdk 36 since Aug 31, 2026 |
| 16 | `🌐 kmp` | Room KMP, Room 3 (stable, `androidx.room3`), Ktor, source sets | Android-only code in KMP projects |
| 17 | `🤖 ondevice-ai` | AICore, ML Kit Gen AI, Gemini Nano, **AppFunctions** (on-device MCP) | Cloud-only AI when offline is required |
| 18 | `📋 policy` | Play Store age-gating, billing openness, data safety | Apps rejected for unknown policy changes |
| 19 | `🥽 xr` | Android XR SDK, SpatialPanel, Orbiter | Works as 2D panel, misses spatial value |
| 20 | `⌚ wear` | Tiles, Health, M3 Expressive for Wear OS | Handheld patterns on round displays |
| 21 | `🛡️ validator` | Level 3 loop-back validation gate — 34 rules, structured output, also runs in CI | AI ships broken code without checking |
| 22 | `🆕 api17` | Android 17 / API 37 (stable) — static final, LAN, OTP, MessageQueue, native libs, Handoff | Apps crash on API 37 targets |
| 23 | `🪪 dev-verification` | Developer Verification Program — timeline, registration, CI/CD | Apps blocked from install on certified devices (enforced since Sept 30, 2026 in 4 countries) |

---

## 🚀 Quick Start — Zero Install Required

### Option 1 — Interactive CLI (v2.1.0) ✨ Recommended

```bash
npx -y androjack-mcp@2.1.0 install
```

Launches a full animated terminal wizard with auto-detection for **VS Code, Cursor, Claude, Windsurf, JetBrains, Kiro, and Antigravity.**

### Option 2 — Targeted Installs

```bash
# Preview detected IDEs and config paths
npx -y androjack-mcp@2.1.0 install --list

# Auto-detect all
npx -y androjack-mcp@2.1.0 install --auto

# Install to a specific IDE
npx -y androjack-mcp@2.1.0 install --ide=cursor
npx -y androjack-mcp@2.1.0 install --ide=claude
npx -y androjack-mcp@2.1.0 install --ide=vscode
npx -y androjack-mcp@2.1.0 install --ide=windsurf
npx -y androjack-mcp@2.1.0 install --ide=jetbrains
npx -y androjack-mcp@2.1.0 install --ide=kiro
npx -y androjack-mcp@2.1.0 install --ide=antigravity
```

### Option 3 — Test Without an IDE

```bash
npx -y @modelcontextprotocol/inspector npx -y androjack-mcp@2.1.0
```

### Option 4 — Enforce the rules in CI (new in 2.1.0)

The same rule engine the agent is held to, run on every pull request — including code no agent touched:

```bash
npx -y androjack-mcp@2.1.0 validate app/src --target-sdk=37            # exit 1 on errors
npx -y androjack-mcp@2.1.0 validate . --format=sarif > androjack.sarif  # GitHub code scanning
```

```yaml
# .github/workflows/androjack.yml
- run: npx -y androjack-mcp@2.1.0 validate . --target-sdk=37 --format=sarif > androjack.sarif || true
- uses: github/codeql-action/upload-sarif@v3
  with: { sarif_file: androjack.sarif }
- run: npx -y androjack-mcp@2.1.0 validate . --target-sdk=37   # fails the job on errors
```

Flags: `--format=text|json|sarif`, `--target-sdk=N`, `--min-sdk=N`, `--fail-on=error|warning|never`. Exit codes: `0` pass, `1` violations, `2` usage error **or the scan could not check everything** (no matching files, a file over 1 MiB, or the 20k-file cap) — a gate never passes on a partial scan.

### Optional configuration

| Variable | Effect |
|:---------|:-------|
| `ANDROJACK_DEVELOPER_KNOWLEDGE_API_KEY` | Use Google's [Developer Knowledge API](https://developers.google.com/knowledge/mcp) as the doc-search backend (full-text search over developer.android.com). Without it, AndroJack uses its verified index of canonical pages. **Privacy:** search queries — including exception messages from `android_debugger` — are sent to Google. |
| `ANDROJACK_OFFLINE=1` | Zero outbound requests — tools return canonical links only. For air-gapped setups. |
| `ANDROJACK_HTTP_TOKEN` | `serve` requires `Authorization: Bearer <token>`. Mandatory for remote binds when a Google API key is set. |
| `ANDROJACK_ALLOW_REMOTE_HTTP=1` | Same as `serve --allow-remote`; also applies to `--http`. |
| `ANDROJACK_HTTP_STATELESS=1` / `serve --stateless` | No MCP sessions — each request is self-contained (load-balancer friendly). |

---

## 🧩 Manual Config / Copy / Paste

If you prefer to wire the server manually, or want to inspect the exact JSON before writing anything:

- Run `npx -y androjack-mcp@2.1.0 install --list` to preview detected IDEs and target config paths.
- Ready-to-paste examples live in [`config/`](config/).

| IDE / Client | Config file |
|:-------------|:------------|
| Claude Desktop | [`config/claude_desktop_config.json`](config/claude_desktop_config.json) |
| Cursor | [`config/cursor_mcp.json`](config/cursor_mcp.json) |
| VS Code / GitHub Copilot | [`config/vscode_mcp.json`](config/vscode_mcp.json) |
| Windsurf | [`config/windsurf_mcp.json`](config/windsurf_mcp.json) |
| Android Studio / IntelliJ | [`config/jetbrains_mcp.json`](config/jetbrains_mcp.json) |
| AWS Kiro | [`config/kiro_mcp.json`](config/kiro_mcp.json) |
| Google Antigravity | [`config/antigravity_mcp.json`](config/antigravity_mcp.json) |

Every example keeps AndroJack local by default and runs the published package via `npx -y androjack-mcp@2.1.0`.

---

## 📍 The Ecosystem: AndroJack and Google's First-Party Agent Tools

Google now ships its own agent stack for Android. Being straight about the overlap:

| | Google Developer Knowledge MCP/API | Android CLI + Android skills + Knowledge Base | AndroJack MCP |
|:--|:--|:--|:--|
| **Job** | Retrieve docs (search, get, answer) | Run the toolchain; give agents task instructions; `android docs search` | **Enforce**: validate code, encode time-bound mandates, gate CI |
| **Retrieval quality** | Best available — Google's own index | Google's own index | Uses Google's API when you set a key; otherwise a verified index of canonical pages |
| **Fails a build?** | No | No (skills are advisory; `android studio check` needs Studio) | **Yes** — deterministic rule IDs, exit codes, SARIF |
| **Setup** | Google Cloud project + API key | Install the CLI | `npx androjack-mcp@2.1.0` — no account |
| **Where it runs** | Remote (googleapis.com) | Local CLI | Local stdio / HTTP, works offline |

**Recommended setup:** use Google's tools for retrieval and task skills, and AndroJack as the enforcement step — `android_code_validator` inside the agent loop and `androjack-mcp validate` in CI. AndroJack does not try to out-search Google's own documentation index. With `ANDROJACK_DEVELOPER_KNOWLEDGE_API_KEY` set, it uses that index.

---

## 🔒 Security & Privacy

| Property | Implementation |
|:---------|:---------------|
| **Domain allowlist** | Requests only to Google/Android/Kotlin official domains, default HTTPS port, no embedded credentials |
| **Redirects re-validated** | Every redirect hop is checked against the allowlist (2.1.0) — an allowlisted host cannot bounce a fetch elsewhere |
| **Untrusted-content boundary** | *All* fetched text is normalized, scrubbed of injection patterns and spoofed boundary tags, and wrapped as untrusted before it reaches the agent |
| **HTTPS only** | Outbound documentation fetches refuse non-HTTPS URLs, cap body size, and redact query strings in retry logs |
| **Local by default** | `serve` binds to loopback only unless you explicitly pass `--allow-remote` |
| **HTTP hardening** | `Origin`/`Host` validation, body cap, session cap with idle eviction, optional bearer token, stateless mode |
| **Transparent agent** | `User-Agent: AndroJack-MCP/2.1.0` |
| **Read-only** | All 23 tools annotated `readOnlyHint: true`, `destructiveHint: false`, `idempotentHint: true` |
| **Credentials** | None required. The optional Google API key is sent only as a header, never in URLs or logs |
| **Offline mode** | `ANDROJACK_OFFLINE=1` guarantees zero outbound requests |
| **Security policy** | Disclosure process and supported versions in [SECURITY.md](SECURITY.md) |

---

## 📋 Changelog

### v2.1.0 — Fix what didn't work, harden what did, enforce in CI

- **Doc search actually returns docs.** v2.0 scraped client-rendered search pages and returned no documentation for any query. 2.1 uses Google's Developer Knowledge API (optional key) or a verified index of canonical pages.
- **Security:** redirect allowlist bypass closed; *all* fetched content now goes through the untrusted-content boundary (v2.0 claimed this but only one tool did it); boundary-tag spoofing and zero-width/full-width evasion fixed; HTTP session-exhaustion DoS fixed; bearer auth and stateless mode; 7 dependency vulnerabilities (1 critical) patched.
- **No more confident wrong answers:** `Row` → "DEPRECATED", `Task` → "REMOVED" registry false positives fixed; Android 17 games exemption corrected; fabricated Handoff API removed; Room 3 is stable (was described as alpha); Google Maven alphas no longer labelled "Latest Stable"; 19 dead documentation links replaced.
- **Validator:** comments ignored (ends agent fix-loops), Kotlin DSL `kapt(...)` detected, API 37 thresholds corrected, 6 new Android 17 rules (34 total), structured output.
- **New:** `androjack-mcp validate` CLI (text/JSON/SARIF) for CI; MCP resources for the rule catalogue; full tool annotations; AppFunctions guidance; Android Studio Rabbit 1 / AGP 9.4.
- **Lower token cost:** `tools/list` ~28.5 KB → ~20.5 KB; repeated identical results in a session are replaced by a short pointer (pass `refresh: true` to get them again).
- **Tests:** 85 → 196 (+1 opt-in live), including a 17-scenario black-box UAT suite driven through the real MCP SDK client. See [`test/uat/UAT_PLAN.md`](test/uat/UAT_PLAN.md).

Full details: [CHANGELOG.md](CHANGELOG.md).

### v2.0.0 — Security Hardening, Compose-First, Developer Verification

- **Content sanitizer for indirect prompt injection** — `src/content-sanitizer.ts` neutralizes structural injection patterns (fake role markers, instruction-reset framing) in any externally-fetched text before it reaches the calling agent's context. `android_debugger` results from `issuetracker.google.com` — the only allowlisted domain indexing free-text, user-submitted content — are wrapped in an explicit untrusted-data boundary.
- **Dependency vulnerabilities patched** — resolved 7 vulnerabilities (3 high) in transitive `undici`/`qs` via a `cheerio` update. Zero breaking changes, 0 vulnerabilities in the shipped tree.
- **Tool 23: `android_developer_verification`** — Google's developer verification program enforces from September 30, 2026 (Brazil, Indonesia, Singapore, Thailand first; global 2027). Covers registration paths, timeline, enterprise exemptions, and CI/CD bulk-registration APIs.
- **Compose-First platform shift reflected** — as of May 19, 2026, Android UI development is officially Compose First; View-based patterns (Fragments, RecyclerView, ViewPager) are flagged as maintenance-mode wherever queried, sourced directly from Google's own announcement rather than left silently outdated.
- **Compose 1.11 v2 Testing Framework** — full migration guide for the new default `StandardTestDispatcher` behavior, plus a validator rule (`UNCONFINED_DISPATCHER_COMPOSE_TEST`) that flags the old assumption.
- **Navigation 3 Scene Decorators (1.1)** — persistent chrome (bottom bars, rails, dialogs) without per-screen awareness.
- **Android Studio codename corrected** — was two full codenames stale ("Panda 2"). Now correctly reflects **Quail (2026.1.x)** as current stable, AGP 9.2.0.
- **Android Skills positioning** — documents Google's first-party Android Skills/CLI (April 2026) and positions AndroJack's validator as the complementary post-generation enforcement gate, not a competing retrieval layer.
- **28 validator rules** (was 26) — added `UNCONFINED_DISPATCHER_COMPOSE_TEST` and `NEW_FRAGMENT_CLASS_COMPOSE_FIRST`.
- **Fabricated version numbers removed** — a prior session's dependency version catalog example asserted several unverified version numbers. Replaced with only-confirmed values plus explicit `CHECK_LIVE_VIA_gradle_dependency_checker` placeholders.
- **Full version sync** — closed a gap where `src/version.ts` had been bumped without propagating to `package.json`, all IDE config files, and manifest files — now enforced as a release checklist item.

### v1.7.1 — Engineering Hardening & Community Parity

- **54-Test Coverage** — Implemented comprehensive unit and contract tests for validator rules, HTML parser, LRU cache, and HTTP security layer.
- **Discovery Parity** — Fixed `/.well-known/mcp` endpoint to correctly report `tools: 22`.
- **Dependency Sanitization** — Removed `node-fetch` (migrated to native `fetch`) and pruned stale overrides for a cleaner supply chain.
- **Rule Hardening** — Improved Compose component detection for `NavHost` and `BottomAppBar`.
- **URL Remediation** — Fixed broken documentation anchors for Android 17 `ACCESS_LOCAL_NETWORK` and `handoff`.

### v1.7.0 — Android 17 / API 37 Support

- **Tool 22: `android_api17_compliance`** — Full reference for Android 17 platform stability (March 26, 2026).
- **Validator rule expansion** — *(Corrected in 2.1.0: these notes originally claimed 31 rules, including Room 3.0 and `ACCESS_LOCAL_NETWORK` checks that never shipped. The real count was 26 → 28 in 2.0.0 and 34 in 2.1.0.)*
- **WindowManager 1.5.0** — Added Large (1200dp) and Extra-large (1600dp) breakpoints and layout patterns.
- **Room 3.0 alpha** — Support for modern SQLiteDriver migration paths.


---

## 👥 Authorship & Ownership

**Vikas Sahani** — Product Lead (vikassahani17@gmail.com)  
**Claude AI** — AI Engineering Lead

---

<div align="center">

MIT License © 2026 Vikas Sahani | [SECURITY.md](SECURITY.md)

*Built because 35% of Stack Overflow visits in 2025 are developers debugging AI-generated code.*  
*AndroJack exists so none of those visits are yours.*

</div>

TDQS

A3.5/5.0

Scored across 23 tools

Disambiguation4/5

Most tools have clearly distinct domains (XR, Wear OS, KMP, Play policy, testing, build/publish), and descriptions give explicit call triggers. However, several knowledge tools overlap: architecture_reference, kotlin_best_practices, and android_navigation3_guide all touch navigation/room/compose topics, and large-screen concerns appear in both android_large_screen_guide and android_api36_compliance, creating some misselection risk.

Naming Consistency4/5

All names use predictable snake_case noun-phrase style that is easy to scan and reason about. The only inconsistency is the 'android_' prefix, which is applied to most but not all tools (architecture_reference, gradle_dependency_checker, kotlin_best_practices, material3_expressive lack it).

Tool Count4/5

23 tools is on the heavy side and borders the 'too many' threshold, but the breadth of covered domains (Wear, XR, KMP, Play policy, testing, publishing, compliance) justifies most of them. Each tool appears to own a distinct topic rather than duplicating another.

Completeness5/5

The surface is remarkably complete for an Android/Kotlin assistant: official search, API status, architecture and framework guides, dependency versioning, API-level mapping, permissions, testing, build/publish, code validation, plus Play compliance and developer verification. General fallback (android_official_search) covers residual lookups, leaving few obvious dead ends.

Maintenance

ActivityActive
ResponsivenessNo issues