mobile-docs-mcp
Provides version-aware documentation for Android (Jetpack, androidx, Compose) APIs, enabling verification of API availability against target SDK versions.
Allows checking Android API availability against compileSdk and library versions directly within Android Studio via MCP.
Provides version-aware documentation for Apple (SwiftUI, UIKit) APIs, enabling verification of API availability against iOS versions.
Integrates with Windsurf (by Codeium) to provide mobile documentation lookup and version verification.
Enables agents to combine Xcode's build/preview tools with version-aware API verification through simultaneous MCP connections.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mobile-docs-mcpverify if scrollTargetBehavior works on iOS 16"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mobile-docs-mcp
A version-aware documentation MCP server for mobile development — the context7 idea, but specialized for the thing generic doc proxies get wrong: which version of an API you can actually use.
Install:
uvx mobile-docs-mcp(nothing to clone) — orpip install mobile-docs-mcp. Published on PyPI. Jump to Editor & IDE setup.
It indexes Android (Jetpack / androidx / Compose) and Apple (SwiftUI / UIKit)
documentation with since / deprecated / removed metadata on every symbol,
so an agent can verify an API exists on the version the project targets before
writing code against it.
Why it's different from a doc proxy
Most "Apple docs" / "Android docs" MCP servers live-fetch and parse the current
doc site. They answer "what is scrollTargetBehavior?" but not "can I use it on
iOS 16?" — and that second question is where coding agents hallucinate. Every
result here is filtered and annotated against a target version.
Related MCP server: devdocs-mcp
Tools
Tool | Purpose |
| Hybrid (BM25 + optional vector) retrieval, filtered by platform + target version |
| Full symbol card: signature, availability, deprecation/migration pointer |
| Anti-hallucination check — real AND usable on a given version? |
| since / deprecated / removed timeline + migration lineage |
| What changed in a library/version |
Example verdict:
verify_api_exists("scrollTargetBehavior", "16.0", "apple")
→ ❌ NOT AVAILABLE — introduced in 17.0, newer than 16.0. Will not compile there.Run
# Recommended: fetch + run on demand, no install step
uvx mobile-docs-mcp
# Or install into the current environment
pip install mobile-docs-mcp
mobile-docs-mcp # stdio transport
# From source (for development)
git clone https://github.com/asif786ka/mobile-docs-mcp
cd mobile-docs-mcp && pip install -e .
python -m mobile_docs_mcp.serverShips with a seed corpus, so it works immediately with no crawl.
Editor & IDE setup (iOS + Android)
The server speaks MCP over stdio, so any MCP-capable editor can use it. All the tools work for both platforms — you'll lean on the SwiftUI entries in an iOS project and the Compose/androidx entries in an Android one, but nothing is editor-specific. Two ways to launch it:
Recommended (from PyPI):
command: "uvx",args: ["mobile-docs-mcp"]— no clone, nocwd. This is what the examples below use.From source:
command: "python",args: ["-m", "mobile_docs_mcp.server"], withcwdset to the repo path.
Set MOBILE_DOCS_DATA in env to layer in any corpora you've crawled with the
ingesters (see "Growing the index").
Claude Code (CLI)
# published package, shared with the repo via .mcp.json (project scope)
claude mcp add mobile-docs-mcp --scope project -- uvx mobile-docs-mcp
# from source instead: claude mcp add mobile-docs-mcp -- python -m mobile_docs_mcp.serverVerify with claude mcp list, or /mcp inside a session.
Claude Desktop
Edit claude_desktop_config.json (Settings → Developer → Edit Config), then
restart the app:
{
"mcpServers": {
"mobile-docs-mcp": {
"command": "uvx",
"args": ["mobile-docs-mcp"]
}
}
}(Layer in crawled corpora with "env": { "MOBILE_DOCS_DATA": "/abs/path/data/android,/abs/path/data/apple" }.)
Cursor
Create .cursor/mcp.json in the project root (or ~/.cursor/mcp.json for all
projects) — same mcpServers shape as above:
{
"mcpServers": {
"mobile-docs-mcp": {
"command": "uvx",
"args": ["mobile-docs-mcp"]
}
}
}Then enable it under Settings → MCP.
Windsurf
Edit ~/.codeium/windsurf/mcp_config.json (Cascade panel → MCP icon →
Configure). Same mcpServers shape; Windsurf supports ${env:VAR} interpolation
so you can keep paths/secrets out of the file:
{
"mcpServers": {
"mobile-docs-mcp": {
"command": "uvx",
"args": ["mobile-docs-mcp"]
}
}
}Android Studio
Gemini in Android Studio is an MCP client. Go to Settings → Tools → AI → MCP
Servers, tick Enable MCP Servers, and paste the same mcpServers JSON
block shown for Claude Desktop. Confirm with the "Successfully connected"
notification, then type /mcp in the chat to see the tools. Great for checking
androidx/Compose availability against your module's compileSdk / library
versions without leaving the IDE.
VS Code
VS Code's key is servers (not mcpServers) and wants an explicit type.
Create .vscode/mcp.json (commit it to share with the team):
{
"servers": {
"mobile-docs-mcp": {
"type": "stdio",
"command": "uvx",
"args": ["mobile-docs-mcp"]
}
}
}Open the file and click Start, or run MCP: List Servers from the Command Palette. Copilot Chat's Agent mode will then surface the tools.
Xcode
Xcode 26.3+ is itself an MCP server (it exposes build / test / preview /
Apple-doc-search tools) rather than an MCP client — so you don't register
mobile-docs-mcp inside Xcode. Instead, run an agent that consumes both: point
Claude Code (or Cursor / Codex) at mobile-docs-mcp using the steps above while
it's also connected to Xcode's server. The agent then gets Xcode's build/preview
tools and this server's verify_api_exists version checks in one session —
e.g. it can confirm scrollTargetBehavior needs iOS 17 before writing it against
your iOS 16 deployment target, then build the project to check.
Architecture
ingest/ (batch, offline) server.py (runtime)
android.py developer.android.com FastMCP
apple.py Apple JSON doc API │
│ ▼
▼ store.py — hybrid, version-aware
symbols.json + chunks.json 1. BM25 lexical recall
(version-tagged) 2. vector recall (optional)
3. RRF fusion
4. VERSION FILTER ← the differentiator
5. cross-encoder rerank (optional)Retrieval is provider-agnostic (embeddings.py), same shape as a multi-provider
model gateway: BM25 works fully offline; vector recall and rerank switch on via
env var with no code change and degrade gracefully if a provider is missing.
MOBILE_DOCS_EMBEDDINGS=local # or openai ; default none (BM25-only)
MOBILE_DOCS_RERANK=local # default none
MOBILE_DOCS_DATA=data/android,data/apple # layer in crawled corporaGrowing the index
python -m mobile_docs_mcp.ingest.android --out data/android \
--refs androidx.compose.foundation.lazy.LazyColumn \
--release-notes compose-foundation navigation
python -m mobile_docs_mcp.ingest.apple --out data/apple \
--paths swiftui/navigationstack swiftui/view/scrolltargetbehaviorThen point the server at the output with MOBILE_DOCS_DATA.
Status
MVP. The protocol layer, version logic, hybrid store, and tool surface are production-shaped; the ingestion coverage is a seed. The real work — and the moat — is breadth and freshness of the version-tagged index.
MIT.
Available Tools
5 toolsget_api_referenceB
Full reference card for a symbol: signature, summary, availability, and any deprecation/migration pointer. Use exact names ("NavigationStack", "animateItem") for best results.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| platform | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses what the reference card contains but does not mention safety (read-only), side effects, or constraints like rate limits. For a read operation, more transparency is expected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no fluff. First sentence defines purpose and content, second gives a clear usage tip. Information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values need not be explained. However, the description lacks full parameter documentation (platform) and behavioral details. Given the tool's simplicity, it is minimally adequate but has gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description only adds value for the 'name' parameter (use exact names). The 'platform' parameter is not explained at all, leaving its purpose ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it provides a full reference card for a symbol, listing key contents (signature, summary, availability, deprecation/migration). Distinct from siblings which cover release notes, API versions, mobile docs search, and existence checks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a usage tip (use exact names for best results) but does not explicitly state when to use this tool versus alternatives like get_release_notes or search_mobile_docs. Lacks when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_release_notesA
Retrieve release-note chunks describing what changed. Good for "what's new in Compose 1.7" or "SwiftUI iOS 17 changes".
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| platform | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must cover behavioral aspects. It does not disclose return format, pagination, permissions, or side effects. The phrase 'release-note chunks' is vague.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the verb, and contains no redundant information. Every word serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 3 parameters with 0% schema description coverage and no annotations, the description is insufficient. It does not explain parameter behavior, output schema (though present), or when to prefer this over search_mobile_docs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description does not explain the parameters (query, limit, platform) in any detail. Examples hint at query usage but lack clarity on format and defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves release-note chunks and gives concrete examples ('what's new in Compose 1.7', 'SwiftUI iOS 17 changes'), distinguishing it from siblings like get_api_reference or search_mobile_docs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through examples but does not explicitly state when to use or avoid this tool versus alternatives. However, the examples provide clear context for typical use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_api_versionsB
Show the availability timeline (since / deprecated / removed) for a symbol and its migration lineage.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| platform | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It only states what the tool shows, but does not disclose behavioral traits such as read-only nature, authentication needs, rate limits, or any side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that is clear and free of unnecessary words. Every part of it contributes to understanding the tool's purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has two parameters, no schema descriptions, and no annotations, the description is too brief. It does not explain the return format, how migration lineage is presented, or any details that would help an agent use it effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%. The description does not explain the parameters 'name' and 'platform' beyond what the schema provides, leaving ambiguity about their intended use.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: showing an availability timeline (since/deprecated/removed) and migration lineage for a symbol. It uses a specific verb and resource, and is distinct from sibling tools like get_api_reference or verify_api_exists.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for checking versioning timeline of a symbol, but lacks explicit guidance on when to use this tool versus alternatives (e.g., get_api_reference). No exclusions or context are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_mobile_docsA
Search Android (Jetpack/androidx/Compose) and Apple (SwiftUI/UIKit) docs.
Args: query: what you're looking for, e.g. "animate lazy list item". platform: "android" | "apple" | "" for both. target_version: version the project targets (e.g. "1.6.0" for androidx, "16.0" for iOS). Results the target can't use are filtered out unless include_unavailable is true, and each hit is annotated with its availability status for that version. include_unavailable: keep results not yet available at target_version. limit: max results.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| platform | No | ||
| target_version | No | ||
| include_unavailable | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behaviors: target_version filters results based on availability, include_unavailable overrides filtering, and each hit is annotated with availability status. This adds value beyond a simple 'search' definition. With no annotations available, the description carries the full burden and does so well, though it could mention response size or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with a clear one-line purpose followed by a bulleted list of parameters. It is front-loaded and every sentence adds value. No redundancy or wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists (so return values are documented elsewhere), the description covers all necessary context: search scope, platforms, filtering behavior, and parameter details. The tool's role among siblings is clear, making it complete for a search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description fully explains all 5 parameters, including concrete examples (e.g., target_version '1.6.0' for androidx, '16.0' for iOS) and the effect of include_unavailable. This provides rich semantic meaning beyond the schema's type definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it searches Android and Apple docs with specific examples (Jetpack/Compose, SwiftUI/UIKit). The verb 'Search' and resource 'mobile docs' are precise, and the tool is well-distinguished from sibling tools like get_api_reference (focused on specific API lookups) and get_release_notes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for searching mobile docs but does not explicitly state when to use this tool over siblings or when not to use it. No alternative tools are mentioned. The context is clear, but exclusions or comparative guidance are absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_api_existsA
Anti-hallucination check. Confirms whether an API is real AND usable on a specific version before an agent writes code against it.
Args: name: symbol name, e.g. "scrollTargetBehavior" or "animateItem". target_version: the version to check against ("17.0", "1.6.0", "34"). platform: "android" | "apple" | "" to search both.
Returns a verdict: available / deprecated / not-yet-available / unknown, with the migration target when relevant.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| platform | No | ||
| target_version | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavior: it returns a verdict (available, deprecated, etc.) and migration target. It also labels itself as an 'anti-hallucination check', which is a behavioral trait, but lacks details on potential side effects (though none expected).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise: a one-line summary, followed by a clear list of arguments and return value. Every sentence adds value, and the structure is front-loaded with the purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the existence of an output schema (not shown but known), the description is complete: it covers purpose, usage context, parameter semantics, and return value. No gaps remain for an agent to correctly select and invoke this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 0% description coverage, but the description fully explains each parameter: 'name' with examples like 'scrollTargetBehavior', 'target_version' with version format examples, and 'platform' with allowed values. This adds significant meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool's purpose as an 'Anti-hallucination check' that confirms API existence and usability on a specific version, distinguishing it from siblings like get_api_reference which likely provides full reference details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description explicitly says to use 'before an agent writes code against it', providing clear context. It does not explicitly state when not to use or list alternatives, but the purpose is well-defined and the handling of 'unknown' verdict implies caution.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
5 tool updates
v0.1.1- First observed
get_api_reference - First observed
get_release_notes - First observed
list_api_versions - First observed
search_mobile_docs - First observed
verify_api_exists
TDQS
Each tool has a unique and clearly defined purpose: get_api_reference for symbol details, get_release_notes for release information, list_api_versions for availability timelines, search_mobile_docs for general search, and verify_api_exists for existence checks. There is no overlap or ambiguity.
All tool names follow a consistent verb_noun pattern with underscores (e.g., get_api_reference, search_mobile_docs), making the set predictable and easy to understand.
With 5 tools covering the key operations for mobile documentation (search, reference, release notes, availability, verification), the count is well-scoped and appropriate for the domain.
The tool set provides comprehensive coverage for mobile API documentation: searching, getting detailed references, checking availability across versions, reviewing release notes, and verifying existence. No obvious gaps for typical developer workflows.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for developer documentation, generated by doc2mcp.
MCP server for doc2mcp documentation, generated by doc2mcp.
MCP server for opencode documentation, generated by doc2mcp.
MCP server for Vonage API documentation, code snippets, tutorials, and troubleshooting.
Related MCP Servers
- AlicenseBqualityDmaintenanceProvides comprehensive access to MCP documentation through structured guides, full-text search, and interactive development workflows for building servers and clients.337MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that provides version-pinned, deterministic documentation sourced from DevDocs.io to AI assistants (Claude, RooCode, Cline, Copilot etc.) and also via offline mode. Not via Scraping! But using the supported downloading option from devdocs.15713MIT
- AlicenseAqualityDmaintenanceAn MCP server that serves documentation and enables AI-powered search, Q\&A, and document analysis for developer tools and guides.54MIT
- AlicenseAqualityDmaintenanceMCP server that gives LLMs access to up-to-date mobile SDK documentation, package registry info, and GitHub issues.612MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/asif786ka/mobile-docs-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server