androjack-mcp 1.5.1 โ†’ 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,10 +6,11 @@
6
6
 
7
7
  # ๐Ÿค– AndroJack โ€” The Jack of All Android Trades
8
8
 
9
- ![AndroJack Banner](https://raw.githubusercontent.com/VIKAS9793/AndroJack-mcp/main/assets/AndroJack%20banner.png)
9
+ ![AndroJack Banner](https://raw.githubusercontent.com/VIKAS9793/androjack-mcp/main/assets/AndroJack%20banner.png)
10
10
 
11
- ### ๐ŸŽฌ See AndroJack in Action
11
+ ### ๐ŸŽฌ Discover AndroJack
12
12
 
13
+ [![Official Product Page](https://img.shields.io/badge/Product-Landing%20Page-00C7B7?style=for-the-badge)](https://androjack-web.netlify.app/)
13
14
  [![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)
14
15
 
15
16
  ### *An MCP server that equips your AI coding assistant with live, verified Android knowledge โ€” so it builds from official sources, not from memory.*
@@ -17,7 +18,8 @@
17
18
  <br/>
18
19
 
19
20
  [![npm version](https://img.shields.io/npm/v/androjack-mcp?color=0A7AFF&style=flat-square&logo=npm&label=npm)](https://www.npmjs.com/package/androjack-mcp)
20
- [![GitHub stars](https://img.shields.io/github/stars/VIKAS9793/AndroJack-mcp?style=flat-square&logo=github&color=0A7AFF)](https://github.com/VIKAS9793/AndroJack-mcp/stargazers)
21
+ [![VS Code](https://img.shields.io/visual-studio-marketplace/v/VIKAS9793.androjack-vscode?color=0A7AFF&style=flat-square&logo=visual-studio-code&label=VS%20Code)](https://marketplace.visualstudio.com/items?itemName=VIKAS9793.androjack-vscode)
22
+ [![GitHub stars](https://img.shields.io/github/stars/VIKAS9793/androjack-mcp?style=flat-square&logo=github&color=0A7AFF)](https://github.com/VIKAS9793/androjack-mcp/stargazers)
21
23
  [![Node.js](https://img.shields.io/badge/node-%3E%3D22.0.0-brightgreen?style=flat-square&logo=node.js)](https://nodejs.org)
22
24
  [![MCP Spec](https://img.shields.io/badge/MCP-2025--11--25-blueviolet?style=flat-square)](https://modelcontextprotocol.io)
23
25
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.5-3178C6?style=flat-square&logo=typescript)](https://typescriptlang.org)
@@ -27,11 +29,16 @@
27
29
 
28
30
  ### ๐Ÿš€ One-Click Install
29
31
 
30
- [![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=eyJuYW1lIjoiYW5kcm9qYWNrIiwiY29tbWFuZCI6Im5weCIsImFyZ3MiOlsiLXkiLCJhbmRyb2phY2stbWNwIl19)
31
- [![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=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsImFuZHJvamFjay1tY3AiXX0=)
32
- [![Add to Kiro](https://img.shields.io/badge/Add%20to-AWS%20Kiro-FF9900?style=for-the-badge&logo=amazonaws&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%22%5D%7D)
32
+ [![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)
33
+ [![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=eyJuYW1lIjoiYW5kcm9qYWNrIiwiY29tbWFuZCI6Im5weCIsImFyZ3MiOlsiLXkiLCJhbmRyb2phY2stbWNwQDEuNi4wIl19)
34
+ [![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=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsImFuZHJvamFjay1tY3BAMS42LjAiXX0=)
35
+ [![Add to Kiro](https://img.shields.io/badge/Add%20to-AWS%20Kiro-FF9900?style=for-the-badge&logo=amazonaws&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%401.6.1%22%5D%7D)
33
36
  [![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)
34
37
 
38
+ **VS Code distribution:** AndroJack MCP is also live on the VS Code Marketplace as [AndroJack MCP for VS Code](https://marketplace.visualstudio.com/items?itemName=VIKAS9793.androjack-vscode). The `VS Code` badge above always reflects the currently published Marketplace version.
39
+
40
+ **PM / APM docs:** Product strategy, JTBD, personas, roadmap, user stories, competitive analysis, and GTM materials now live under [product-management/README.md](product-management/README.md).
41
+
35
42
  <br/>
36
43
 
37
44
  **Also works with:** Windsurf ยท VS Code Copilot ยท Google Antigravity ยท JetBrains AI โ€” see [Manual Config](#-manual-config--copy--paste) below โ†“
@@ -321,7 +328,7 @@ Scaffold { innerPadding ->
321
328
 
322
329
  ## ๐ŸŽฏ The Killer Argument
323
330
 
324
- <img src="https://raw.githubusercontent.com/VIKAS9793/AndroJack-mcp/main/assets/killer_argument.png" alt="The Killer Argument โ€” AndroJack MCP" width="100%" />
331
+ <img src="https://raw.githubusercontent.com/VIKAS9793/androjack-mcp/main/assets/killer_argument.png" alt="The Killer Argument โ€” AndroJack MCP" width="100%" />
325
332
 
326
333
  <br/>
327
334
 
@@ -487,10 +494,10 @@ Each tool lists the **specific failure mode it prevents** โ€” not just what it d
487
494
 
488
495
  ## ๐Ÿš€ Quick Start โ€” Zero Install Required
489
496
 
490
- ### Option 1 โ€” Interactive CLI (v1.5.1) โœจ Recommended
497
+ ### Option 1 โ€” Interactive CLI (v1.6.1) โœจ Recommended
491
498
 
492
499
  ```bash
493
- npx androjack-mcp install
500
+ npx androjack-mcp@1.6.1 install
494
501
  ```
495
502
 
496
503
  Launches a full animated terminal wizard:
@@ -508,19 +515,19 @@ Launches a full animated terminal wizard:
508
515
 
509
516
  ```bash
510
517
  # Auto-detect and install to all found IDEs
511
- npx androjack-mcp install --auto
518
+ npx androjack-mcp@1.6.1 install --auto
512
519
 
513
520
  # Install to one specific IDE
514
- npx androjack-mcp install --ide=cursor
515
- npx androjack-mcp install --ide=claude
516
- npx androjack-mcp install --ide=vscode
517
- npx androjack-mcp install --ide=windsurf
518
- npx androjack-mcp install --ide=jetbrains
519
- npx androjack-mcp install --ide=antigravity
520
- npx androjack-mcp install --ide=kiro
521
+ npx androjack-mcp@1.6.1 install --ide=cursor
522
+ npx androjack-mcp@1.6.1 install --ide=claude
523
+ npx androjack-mcp@1.6.1 install --ide=vscode
524
+ npx androjack-mcp@1.6.1 install --ide=windsurf
525
+ npx androjack-mcp@1.6.1 install --ide=jetbrains
526
+ npx androjack-mcp@1.6.1 install --ide=antigravity
527
+ npx androjack-mcp@1.6.1 install --ide=kiro
521
528
 
522
529
  # Check what's installed where
523
- npx androjack-mcp install --list
530
+ npx androjack-mcp@1.6.1 install --list
524
531
  ```
525
532
 
526
533
  ### Option 3 โ€” From your IDE's NPM Scripts panel (one click)
@@ -543,7 +550,7 @@ install-mcp:list โ† see detection status
543
550
  ### Option 4 โ€” Test all tools (no IDE needed)
544
551
 
545
552
  ```bash
546
- npx @modelcontextprotocol/inspector npx androjack-mcp
553
+ npx @modelcontextprotocol/inspector npx androjack-mcp@1.6.1
547
554
  ```
548
555
 
549
556
  > **Requires:** Node.js 18+. Nothing else.
@@ -570,7 +577,7 @@ npx @modelcontextprotocol/inspector npx androjack-mcp
570
577
 
571
578
  ### AWS Kiro
572
579
 
573
- [![Add to Kiro](https://img.shields.io/badge/Add%20to-AWS%20Kiro-FF9900?style=for-the-badge&logo=amazonaws)](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%22%5D%2C%22disabled%22%3Afalse%2C%22autoApprove%22%3A%5B%5D%7D)
580
+ [![Add to Kiro](https://img.shields.io/badge/Add%20to-AWS%20Kiro-FF9900?style=for-the-badge&logo=amazonaws)](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%401.6.1%22%5D%2C%22disabled%22%3Afalse%2C%22autoApprove%22%3A%5B%5D%7D)
574
581
 
575
582
  ---
576
583
 
@@ -584,7 +591,7 @@ npx @modelcontextprotocol/inspector npx androjack-mcp
584
591
  "mcpServers": {
585
592
  "androjack": {
586
593
  "command": "npx",
587
- "args": ["-y", "androjack-mcp"],
594
+ "args": ["-y", "androjack-mcp@1.6.1"],
588
595
  "env": {},
589
596
  "autoApprove": [],
590
597
  "disabled": false
@@ -604,7 +611,7 @@ npx @modelcontextprotocol/inspector npx androjack-mcp
604
611
  "androjack": {
605
612
  "type": "stdio",
606
613
  "command": "npx",
607
- "args": ["-y", "androjack-mcp"]
614
+ "args": ["-y", "androjack-mcp@1.6.1"]
608
615
  }
609
616
  }
610
617
  }
@@ -620,7 +627,7 @@ npx @modelcontextprotocol/inspector npx androjack-mcp
620
627
  "mcpServers": {
621
628
  "androjack": {
622
629
  "command": "npx",
623
- "args": ["-y", "androjack-mcp"]
630
+ "args": ["-y", "androjack-mcp@1.6.1"]
624
631
  }
625
632
  }
626
633
  }
@@ -640,7 +647,7 @@ UI path: Agent pane โ†’ `...` โ†’ **MCP Servers** โ†’ **Manage MCP Servers** โ†’
640
647
  "mcpServers": {
641
648
  "androjack": {
642
649
  "command": "npx",
643
- "args": ["-y", "androjack-mcp"],
650
+ "args": ["-y", "androjack-mcp@1.6.1"],
644
651
  "disabled": false,
645
652
  "autoApprove": []
646
653
  }
@@ -649,13 +656,15 @@ UI path: Agent pane โ†’ `...` โ†’ **MCP Servers** โ†’ **Manage MCP Servers** โ†’
649
656
  ```
650
657
 
651
658
  Place at `.kiro/settings/mcp.json` (project) or `~/.kiro/settings/mcp.json` (global).
652
- Or use the CLI: `kiro-cli mcp add --name androjack --command npx --args '-y androjack-mcp' --scope workspace`
659
+ Or use the CLI: `kiro-cli mcp add --name androjack --command npx --args '-y androjack-mcp@1.6.1' --scope workspace`
653
660
 
654
661
  </details>
655
662
 
656
663
  ---
657
664
 
658
- ## ๐Ÿ’ก Example Session
665
+ ## ๐Ÿงช Examples
666
+
667
+ ### Example Session
659
668
 
660
669
  ```
661
670
  You: Build a login screen with ViewModel and Jetpack Compose
@@ -702,9 +711,9 @@ In February 2026, Google launched the Developer Knowledge MCP in public preview
702
711
  | **Mechanism** | Context Retrieval | Context Enforcement |
703
712
  | **Scope** | Generalist โ€” Firebase, Cloud, Android, Maps, and more | Android specialist โ€” 21 tools, one domain, zero drift |
704
713
  | **Tools** | 3 retrieval tools (`search_documents`, `get_document`, `batch_get_documents`) | 21 specialized tools โ€” live version checks, deprecation registry, Gradle lookups, API level validation, loop-back code validator |
705
- | **Setup** | Google Cloud project + API key + `gcloud` CLI required | `npx androjack-mcp` โ€” zero auth, zero cloud project |
714
+ | **Setup** | Google Cloud project + API key + `gcloud` CLI required | `npx androjack-mcp@1.6.1` โ€” zero auth, zero cloud project |
706
715
  | **Enforcement** | Passive โ€” AI decides when to retrieve | Active โ€” tool descriptions mandate calls before every task type |
707
- | **Status** | Public preview (v1alpha / experimental) | Stable (v1.5.1) |
716
+ | **Status** | Public preview (v1alpha / experimental) | Stable (v1.6.1) |
708
717
 
709
718
  **Why you need both in production:**
710
719
  Google's tool cures AI "ignorance" by providing official text. However, **AndroJack cures AI "bad habits."** If you ask an AI to refactor an app, Google's tool will provide the new docs. But **AndroJack** is the tool that actively blocks the AI from writing legacy XML, enforces Jetpack Compose, checks Gradle versions against Maven, and ensures your `minSdk` doesn't violate Android 16's Play Store mandate.
@@ -721,13 +730,23 @@ Google tells the AI the rules; **AndroJack forces the AI to follow them.**
721
730
  | **Rate limiting** | 30 requests / domain / minute with exponential backoff on 429/5xx |
722
731
  | **No credentials** | Zero API keys, zero auth tokens required |
723
732
  | **No data stored** | Nothing persisted beyond process lifetime |
724
- | **Transparent agent** | User-Agent: `AndroJack-MCP/1.4 (documentation-grounding bot; not-a-scraper)` |
733
+ | **Transparent agent** | User-Agent: `AndroJack-MCP/1.6.1 (documentation-grounding bot; not-a-scraper)` |
725
734
  | **Read-only** | All 21 tools are annotated `readOnlyHint: true` โ€” no writes, no side effects |
726
735
  | **Input bounds** | All inputs length-capped and sanitized before use |
727
736
  | **Body size cap** | HTTP responses capped at 4 MB โ€” no OOM risk on large documentation pages |
728
737
 
729
738
  ---
730
739
 
740
+ ## ๐Ÿ›ก๏ธ Privacy Policy
741
+
742
+ - AndroJack runs locally in your MCP client or terminal session.
743
+ - It does not require user accounts, API keys, or cloud credentials.
744
+ - It does not persist prompts, source code, or tool outputs beyond the current process lifetime.
745
+ - It only fetches from allowlisted documentation and artifact domains needed to ground answers.
746
+ - If you run the optional HTTP mode yourself, you are responsible for your own network exposure and access controls.
747
+
748
+ ---
749
+
731
750
  ## ๐Ÿ—บ๏ธ Knowledge Sources
732
751
 
733
752
  | Source | What It Covers |
@@ -774,10 +793,20 @@ Google tells the AI the rules; **AndroJack forces the AI to follow them.**
774
793
 
775
794
  ---
776
795
 
796
+ ## ๐Ÿงฑ Infrastructure
797
+
798
+ - **Primary transport:** stdio via the `androjack-mcp` npm package for local MCP clients.
799
+ - **Optional hosted transport:** Streamable HTTP via `node build/index.js --http` for controlled environments.
800
+ - **Runtime model:** stateless tool execution with in-process rate limiting and shared LRU caching.
801
+ - **Source of truth:** official Android/Kotlin docs, Google issue tracker, Google Maven, and Maven Central.
802
+ - **Release channels:** npm for the MCP server, VS Code Marketplace for the thin wrapper that launches the pinned npm package.
803
+
804
+ ---
805
+
777
806
  ## ๐Ÿง‘โ€๐Ÿ’ป Local Development
778
807
 
779
808
  ```bash
780
- git clone https://github.com/VIKAS9793/AndroJack-mcp.git
809
+ git clone https://github.com/VIKAS9793/androjack-mcp.git
781
810
  cd androjack-mcp
782
811
  npm install
783
812
  npm run build # compiles TypeScript โ†’ build/
@@ -790,8 +819,32 @@ npm run install-mcp:list # check IDE detection status
790
819
 
791
820
  ---
792
821
 
822
+ ## โ“ FAQ
823
+
824
+ **Why does the VS Code extension need its own release if the MCP code lives on `main`?**
825
+ Because the Marketplace wrapper is a separate package. For `v1.6.1`, it is pinned to `androjack-mcp@1.6.1`, so the wrapper must be versioned and uploaded separately.
826
+
827
+ **Why pin `npx -y androjack-mcp@1.6.1` instead of using the floating latest package?**
828
+ Pinning guarantees reproducible installs, clearer support, and predictable Anthropic or Marketplace review behavior. It avoids stale local `npx` cache surprises.
829
+
830
+ **Does AndroJack send my project files to a hosted backend?**
831
+ No. It runs locally and only makes outbound requests to allowlisted documentation and artifact sources needed to answer the userโ€™s query.
832
+
833
+ **What should I update first for future releases?**
834
+ Publish the MCP server to npm first, confirm the pinned version is live, then update and upload the VS Code wrapper to point at that exact version.
835
+
836
+ ---
837
+
793
838
  ## ๐Ÿ“‹ Changelog
794
839
 
840
+ ### v1.6.1 โ€” Pinned Distribution, Shared Cache Wiring, and Registry Metadata
841
+
842
+ - **New:** Exact `@1.6.1` pinning across shipped config examples, installer output, one-click install links, and the VS Code Marketplace wrapper release flow.
843
+ - **New:** Shared fetch cache wiring for both `secureFetch()` and `secureFetchJson()` so repeated documentation and metadata lookups stop consuming rate-limit budget.
844
+ - **New:** Official MCP registry metadata with `server.json` plus package-level `mcpName`.
845
+ - **Fix:** User-Agent now reports the correct released version: `AndroJack-MCP/1.6.1`.
846
+ - **Docs:** Added explicit privacy policy, infrastructure, examples, and FAQ sections for release reviewers and end users.
847
+
795
848
  ### v1.5.1 โ€” Level 3 Loop-Back Validator + Interactive CLI Installer
796
849
 
797
850
  - **New:** `android_code_validator` (Tool 21) โ€” Level 3 loop-back validation gate. 24 rules across Kotlin, XML, and Gradle. Validates AI-generated code before it reaches the user. Returns PASS/WARN/FAIL verdict with line-level violations, replacements, and official doc URLs. Zero new dependencies โ€” pure TypeScript.
@@ -807,7 +860,7 @@ npm run install-mcp:list # check IDE detection status
807
860
 
808
861
  ### v1.3.4 and earlier
809
862
 
810
- See [GitHub releases](https://github.com/VIKAS9793/AndroJack-mcp/releases) for prior history.
863
+ See [GitHub releases](https://github.com/VIKAS9793/androjack-mcp/releases) for prior history.
811
864
 
812
865
  ---
813
866
 
package/build/cache.js CHANGED
@@ -1,11 +1,10 @@
1
1
  /**
2
- * Simple LRU cache implementation for AndroJack MCP.
2
+ * Shared LRU cache for AndroJack HTTP fetches and hosted-mode stats.
3
3
  */
4
4
  export class LRUCache {
5
5
  cache = new Map();
6
6
  ttlMs = 24 * 60 * 60 * 1000; // 24 hours default
7
7
  maxSize = 100;
8
- // Stats
9
8
  hits = 0;
10
9
  misses = 0;
11
10
  evictions = 0;
@@ -44,7 +43,7 @@ export class LRUCache {
44
43
  this.misses++;
45
44
  return undefined;
46
45
  }
47
- if (Date.now() - entry.timestamp > this.ttlMs) {
46
+ if (Date.now() > entry.expiresAt) {
48
47
  this.cache.delete(key);
49
48
  this.misses++;
50
49
  return undefined;
@@ -55,9 +54,11 @@ export class LRUCache {
55
54
  this.hits++;
56
55
  return entry.value;
57
56
  }
58
- set(key, value) {
57
+ set(key, value, ttlMs = this.ttlMs) {
59
58
  if (this.ttlMs === 0)
60
59
  return;
60
+ if (ttlMs <= 0)
61
+ return;
61
62
  if (this.cache.has(key)) {
62
63
  this.cache.delete(key);
63
64
  }
@@ -69,7 +70,31 @@ export class LRUCache {
69
70
  this.evictions++;
70
71
  }
71
72
  }
72
- this.cache.set(key, { value, timestamp: Date.now() });
73
+ this.cache.set(key, { value, expiresAt: Date.now() + ttlMs });
74
+ }
75
+ }
76
+ const DOC_SOURCE_TTL_MS = 6 * 60 * 60 * 1000;
77
+ const ISSUE_TRACKER_TTL_MS = 60 * 60 * 1000;
78
+ const ARTIFACT_METADATA_TTL_MS = 30 * 60 * 1000;
79
+ const ARTIFACT_HOSTS = new Set([
80
+ "dl.google.com",
81
+ "plugins.gradle.org",
82
+ "search.maven.org",
83
+ ]);
84
+ const ISSUE_TRACKER_HOSTS = new Set([
85
+ "issuetracker.google.com",
86
+ ]);
87
+ export function getFetchCacheKey(url, kind) {
88
+ return `${kind}:${url}`;
89
+ }
90
+ export function getFetchCacheTtlMs(hostname, kind) {
91
+ const normalized = hostname.toLowerCase();
92
+ if (ARTIFACT_HOSTS.has(normalized)) {
93
+ return ARTIFACT_METADATA_TTL_MS;
94
+ }
95
+ if (ISSUE_TRACKER_HOSTS.has(normalized)) {
96
+ return ISSUE_TRACKER_TTL_MS;
73
97
  }
98
+ return kind === "json" ? ISSUE_TRACKER_TTL_MS : DOC_SOURCE_TTL_MS;
74
99
  }
75
100
  export const docCache = new LRUCache(200);
@@ -29,7 +29,7 @@ export const GOOGLE_MAVEN_URL = "https://dl.google.com/dl/android/maven2";
29
29
  export const JETPACK_BOM_URL = "https://developer.android.com/jetpack/compose/setup";
30
30
  // โ”€โ”€ HTTP Client Config โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
31
31
  export const HTTP_TIMEOUT_MS = 12_000;
32
- export const USER_AGENT = "AndroJack-MCP/1.0 (documentation-grounding bot; not-a-scraper)";
32
+ export const USER_AGENT = "AndroJack-MCP/1.6.1 (Android AI Assistant; +https://androjack-web.netlify.app)";
33
33
  export const COMPONENT_REGISTRY = {
34
34
  // โ”€โ”€ Deprecated concurrency โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
35
35
  AsyncTask: {
@@ -45,12 +45,12 @@ export async function startHttpServer(server) {
45
45
  res.writeHead(200, { "Content-Type": "application/json" });
46
46
  res.end(JSON.stringify({
47
47
  name: "androjack-mcp",
48
- version: "1.5.1",
48
+ version: "1.6.1",
49
49
  description: "Documentation-grounded Android engineering MCP server. " +
50
50
  "Forces AI tools to verify official docs before generating Android/Kotlin code.",
51
51
  mcp_endpoint: `http://${host}:${port}${MCP_PATH}`,
52
52
  spec_version: "2025-11-25",
53
- tools: 11,
53
+ tools: 21,
54
54
  read_only: true,
55
55
  auth_required: false,
56
56
  }));
package/build/http.js CHANGED
@@ -12,6 +12,7 @@
12
12
  */
13
13
  import * as cheerio from "cheerio";
14
14
  import { ALLOWED_DOMAINS, HTTP_TIMEOUT_MS, USER_AGENT } from "./constants.js";
15
+ import { docCache, getFetchCacheKey, getFetchCacheTtlMs } from "./cache.js";
15
16
  import { logger } from "./logger.js";
16
17
  // โ”€โ”€ Rate limiter (per domain, per process lifetime) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
17
18
  const requestCounts = new Map();
@@ -90,6 +91,11 @@ async function fetchWithRetry(url, init, attempt = 0) {
90
91
  // โ”€โ”€ Public API โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
91
92
  export async function secureFetch(url) {
92
93
  const parsed = assertAllowedDomain(url);
94
+ const cacheKey = getFetchCacheKey(url, "html");
95
+ const cached = docCache.get(cacheKey);
96
+ if (typeof cached === "string") {
97
+ return cached;
98
+ }
93
99
  checkRateLimit(parsed.hostname);
94
100
  const response = await fetchWithRetry(url, {
95
101
  headers: {
@@ -102,17 +108,26 @@ export async function secureFetch(url) {
102
108
  throw new Error(`HTTP ${response.status} from ${parsed.hostname}: ${response.statusText}`);
103
109
  }
104
110
  const text = await response.text();
105
- return text.length > MAX_BODY_BYTES ? text.slice(0, MAX_BODY_BYTES) : text;
111
+ const boundedText = text.length > MAX_BODY_BYTES ? text.slice(0, MAX_BODY_BYTES) : text;
112
+ docCache.set(cacheKey, boundedText, getFetchCacheTtlMs(parsed.hostname, "html"));
113
+ return boundedText;
106
114
  }
107
115
  export async function secureFetchJson(url) {
108
116
  const parsed = assertAllowedDomain(url);
117
+ const cacheKey = getFetchCacheKey(url, "json");
118
+ const cached = docCache.get(cacheKey);
119
+ if (cached !== undefined) {
120
+ return structuredClone(cached);
121
+ }
109
122
  checkRateLimit(parsed.hostname);
110
123
  const response = await fetchWithRetry(url, {
111
124
  headers: { "User-Agent": USER_AGENT, Accept: "application/json" },
112
125
  });
113
126
  if (!response.ok)
114
127
  throw new Error(`HTTP ${response.status}: ${response.statusText}`);
115
- return (await response.json());
128
+ const payload = (await response.json());
129
+ docCache.set(cacheKey, structuredClone(payload), getFetchCacheTtlMs(parsed.hostname, "json"));
130
+ return payload;
116
131
  }
117
132
  // โ”€โ”€ HTML extraction (cheerio) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
118
133
  export function extractPageText(html, maxChars = 3000) {
package/build/index.js CHANGED
@@ -39,7 +39,7 @@ import { androidCodeValidator } from "./tools/validator.js";
39
39
  // โ”€โ”€ Server Instantiation โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
40
40
  const server = new McpServer({
41
41
  name: "androjack-mcp",
42
- version: "1.5.1",
42
+ version: "1.6.1",
43
43
  });
44
44
  // โ”€โ”€ Tool 1: Official Android Documentation Search โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
45
45
  server.registerTool("android_official_search", {