mobile-unslop-mcp
Verifies Android/Kotlin/Compose code for issues like GlobalScope leaks, blocking sleeps, missing remember, unlabelled icon buttons, hardcoded strings, cleartext traffic, debuggable builds, and insecure token storage; also cross-checks AndroidManifest permissions and exported flags.
Cross-checks platform API usage against Expo app.json configuration to ensure permission purpose strings and manifest details are correctly declared.
Verifies Flutter/Dart code for common mobile slop such as setState after await without a mounted check and print logging, helping prevent crashes and review rejections.
Verifies iOS/SwiftUI code for crash-prone patterns such as force unwraps, force casts, main-thread sync deadlocks, unlabelled icon buttons, and insecure token storage; also cross-checks Info.plist purpose strings and PrivacyInfo.xcprivacy against API usage.
Verifies React Native code for issues like ScrollView with map rendering performance and unlabelled touchables, and supports TypeScript compilation checks.
Click on "Deploy 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-unslop-mcpcheck my Flutter app for insecure token storage and missing accessibility labels"
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-unslop-mcp
Stop AI-written mobile code from crashing on users' phones or getting rejected at review: skill + MCP verifier for iOS (Swift/SwiftUI), Android (Kotlin/Compose), React Native and Flutter.
An agent skill plus an MCP server in one package. The skill tells your coding agent what slop to avoid; the MCP tools then deterministically verify the result, so the agent can't just claim it's done.
Works with Claude Code, Claude Desktop, Codex and Antigravity.
What it catches
Rule | Severity | Catches |
| ERROR |
|
| ERROR |
|
| WARN | Force unwrap |
| ERROR | DispatchQueue.main.sync deadlocks when called from the main thread. Use @MainActor / await MainActor.run / main.async. |
| WARN | Fixed font size ignores Dynamic Type. Use text styles (.font(.body)) or scale with relativeTo / UIFontMetrics. |
| ERROR | Layout hardcoded to one device width (or UIScreen.main, deprecated for multi-window). Use flexible frames, GeometryReader or containerRelativeFrame. |
| ERROR | Icon-only Button without an accessibility label: VoiceOver reads the SF Symbol name. Use Label("Delete", systemImage:) or .accessibilityLabel. |
| WARN | .onAppear { Task { } } leaks work after the view disappears. Use .task { }, which is cancelled automatically. |
| WARN | AnyView erases identity and defeats SwiftUI diffing. Use @ViewBuilder, generics or |
| WARN | print() logging ships to production and cannot be filtered. Use os.Logger with a subsystem/category. |
| ERROR | GlobalScope coroutines outlive the screen and leak. Use viewModelScope / lifecycleScope / an injected scope. |
| ERROR | Thread.sleep/runBlocking blocks the calling thread (ANR on main). Use delay() inside a coroutine. |
| WARN |
|
| ERROR | IconButton whose icon has contentDescription = null is unlabeled for TalkBack. Describe the action. |
| ERROR | mutableStateOf without remember resets on every recomposition. Wrap in remember { } (or rememberSaveable). |
| WARN | Hardcoded UI string can't be translated. Use stringResource(R.string.x). |
| WARN | Debug logging ships in release builds. Use Timber with a release tree, or strip with R8 rules. |
| ERROR | Cleartext HTTP enabled app-wide. Use HTTPS; scope exceptions to specific debug domains in network_security_config. |
| ERROR | android:debuggable hardcoded in the manifest ships debuggable release builds. Let the build type set it. |
| WARN | allowBackup without backup rules copies tokens and databases to cloud/adb backups. Add dataExtractionRules or disable. |
| ERROR | App Transport Security disabled for all domains (App Review asks for justification). Use HTTPS or a per-domain NSExceptionDomains entry. |
| ERROR | Empty or vague permission purpose string: App Review rejects these (guideline 5.1.1). Say what the feature does with the data. |
| ERROR | Credential stored in plain preferences (UserDefaults/SharedPreferences/AsyncStorage). Use Keychain, EncryptedSharedPreferences/Keystore, expo-secure-store or flutter_secure_storage. |
| WARN | ScrollView + .map renders every row at once. Use FlatList/FlashList for lists. |
| WARN | Icon-only touchable without accessibilityLabel/accessibilityRole is invisible to screen readers. |
| WARN | setState after an await without a |
| WARN | print() ships to release logs. Use debugPrint or package:logging. |
verify_app_manifest cross-checks the platform APIs your code uses against Info.plist purpose strings (and Expo app.json), PrivacyInfo.xcprivacy, and AndroidManifest permissions and android:exported flags: the mistakes that crash on first use or fail App Review / Play Console.
Rules marked ERROR make the audit return status: "FAIL"; WARN is reported but does not fail.
Related MCP server: platao
Quick start
1. Add the MCP server
# Claude Code
claude mcp add mobile-unslop -s user -- npx -y mobile-unslop-mcp
# Codex
codex mcp add mobile-unslop -- npx -y mobile-unslop-mcpClaude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json) and Antigravity (~/.gemini/config/mcp_config.json):
{
"mcpServers": {
"mobile-unslop": {
"command": "npx",
"args": ["-y", "mobile-unslop-mcp"]
}
}
}Restart the app afterwards.
2. Install the bundled skill
npx -y mobile-unslop-mcp install-skills # clients that are installed
npx -y mobile-unslop-mcp install-skills --all # every locationClient | Location |
Claude Code |
|
Codex |
|
Antigravity |
|
Claude Desktop has no skills folder, so it receives the rules through the MCP prompt and the load_*_rules tool.
MCP surface
Kind | Name | Purpose |
Prompt |
| The full skill text, for GUI clients |
Tool |
| Returns the full mobile-unslop ruleset. Call before writing code if the mobile-unslop skill is not already loaded. |
Tool |
| Deterministically scans Swift, Kotlin/Java, Dart, React Native and manifest files for mobile slop: crash operators (try!, as!, !, !!), main-thread deadlocks and blocking sleeps, GlobalScope, missing remember, Dynamic Type and device-size hardcodes, unlabelled icon buttons, insecure token storage, cleartext traffic, ATS disabled, vague permission strings and release logging. Accepts files or directories; with no files it audits the git working-tree changes. Suppress a verified false positive with a |
Tool |
| Cross-checks platform APIs used in code against Info.plist purpose strings (and Expo app.json), PrivacyInfo.xcprivacy and AndroidManifest permissions/exported flags. Catches crash-on-first-use and App Review / Play Console rejections. Run after adding any camera, location, photos, mic, contacts, Bluetooth, health, notification or network feature. |
Tool |
| Verifies the app compiles. mode 'syntax' (default, fast): swiftc -parse on given Swift files, dart analyze, tsc for React Native. mode 'full': swift build / xcodebuild (simulator, no signing) and ./gradlew compileDebugSources; can take minutes. Missing toolchains are SKIPPED. |
File paths resolve against the server's working directory and cannot escape it. Directories honour .gitignore and skip node_modules, build output and minified files.
CLI and CI
The same audit runs without an agent. It exits 1 on any ERROR, so it works as a pre-commit hook or CI step:
npx -y mobile-unslop-mcp audit # git working-tree changes
npx -y mobile-unslop-mcp audit src app # files or directories
npx -y mobile-unslop-mcp audit src --json # machine-readable
npx -y mobile-unslop-mcp rules # list every ruleSuppressing a false positive
The checks are regex and structure based: fast, offline and predictable, but heuristic. For a verified false positive, add a comment on the line or the line above, with a reason:
// unslop-ignore SWIFT_FORCE_TRY -- why this is safe hereSuppressions without a reason are reported as SUPPRESSION_WITHOUT_REASON errors, and every honoured suppression is listed in the audit output so reviewers can see it.
How it works
The agent loads the skill and writes code under its constraints.
Before finishing, the skill requires the audit and verification tools.
On
FAIL, the agent fixes every finding and re-runs untilPASS. Missing toolchains are reported asSKIPPED, never as passing.
The unslop family
All share the engine in unslop-core.
Development
git clone https://github.com/fikrifirmanf/mobile-unslop-mcp
cd mobile-unslop-mcp && npm install
npm test # every rule is checked against its good/bad examples
node src/server.mjs # speaks MCP over stdioLicense
MIT © Fikri Firman Fadilah
This server cannot be deployed
Maintenance
Related MCP Connectors
Proof and repair for Apple coding agents: validate Swift, run Xcode evidence, and repair failures.
Scan, fix and justify your application code until it is approved to ship.
Lets coding agents check their own code for leaked secrets, risky dependencies and AI-code mistakes
Preflight QA for AI-agent deliverables with structured verdicts and repair guidance.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to scan code for security and quality issues and receive machine-readable reports with suggested fixes and verification criteria.63 npm2MIT
- AlicenseNot gradedqualityBmaintenanceEnables coding agents to run deterministic completeness audits on code before declaring 'done'—catching unwired modules, placebo tests, swallowed errors, and stubs via AST analysis, entirely offline and free.MIT
- AlicenseBqualityBmaintenanceEnables AI agents to run deterministic, fully local static security and compliance audits of code, configurations, and dependencies through 32 MCP tools covering 24 vulnerability categories. It also detects the project stack, generates risk reports and checklists, suggests stack-aware remediations, and re-validates fixes to confirm vulnerabilities were eliminated.321MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI coding assistants to scan an iOS, Android, Flutter, React Native or Expo project for App Store and Google Play rejection risks, returning deterministic findings that cite the guideline section, link to the official Apple or Google page and explain how to fix each problem. Nothing leaves the machine and no AI is used in the checks.11 npmMIT