Claude In Android — the complete, unedited output of the deterministic mcptrustchecker engine v1.13.0, scanned . Every finding, capability tag and score component below is exactly what the engine produced — no AI, no post-processing.
{
"tool": {
"name": "mcptrustchecker",
"version": "1.13.0",
"methodologyVersion": "mcptrustchecker-1.13"
},
"target": {
"id": "claude-in-android",
"source": {
"kind": "package",
"origin": "claude-in-android"
},
"server": {
"name": "claude-in-android"
}
},
"grade": "B",
"score": {
"score": 84,
"threatScore": 91,
"grade": "B",
"band": "B",
"categorySubtotals": {
"injection": 9.45,
"exfiltration": 0,
"permissions": 0,
"supply-chain": 0,
"network": 0,
"hygiene": 0
},
"vector": [
{
"kind": "threat",
"ruleId": "MTC-SRC-009",
"category": "injection",
"severity": "medium",
"confidence": "strong",
"rawWeight": 9,
"confidenceMult": 0.7,
"diminishingFactor": 1,
"appliedPenalty": 6.3
},
{
"kind": "threat",
"ruleId": "MTC-SRC-009",
"category": "injection",
"severity": "medium",
"confidence": "strong",
"rawWeight": 9,
"confidenceMult": 0.7,
"diminishingFactor": 0.5,
"appliedPenalty": 3.15
},
{
"kind": "client",
"term": "capability-exposure",
"level": "high",
"label": "capability blast radius (high) — client exposure if the model is manipulated",
"appliedPenalty": 6
},
{
"kind": "client",
"term": "verification-discount",
"level": "repo",
"label": "publisher verification (public source) — no provenance, but the source is public and inspectable",
"appliedPenalty": 1
},
{
"kind": "client",
"term": "coverage-honesty",
"level": "source",
"label": "inspection depth (source) — how much of the target the scan could see",
"appliedPenalty": 0
}
],
"gatesFired": [],
"methodologyVersion": "mcptrustchecker-1.13"
},
"capability": {
"level": "high",
"reasons": [
"can execute shell commands or code"
],
"tags": [
"code-exec"
]
},
"coverage": {
"level": "source",
"inputs": {
"toolSurface": true,
"implementationSource": true,
"packageMetadata": true,
"liveTransport": false
},
"caveats": [
"Tools were statically extracted from the published source (17 recovered), not enumerated from a running server. Tool-poisoning, Unicode-smuggling, capability and toxic-flow analysis ran on this inferred surface, but a mis-parsed registration could be missed or mis-attributed, so tool-derived findings are capped below “confirmed”. To grade the real runtime surface, scan the running server: --command \"npx -y <package>\"."
]
},
"findings": [
{
"ruleId": "MTC-CAP-001",
"title": "Tool \"shell\" exposes command/code execution",
"category": "permissions",
"severity": "high",
"confidence": "strong",
"description": "Tool \"shell\" appears to run shell commands or evaluate code (keyword \"shell\" in tool name, parameter \"command\"). Arbitrary execution driven by model input is one of the most dangerous MCP capabilities; combined with any untrusted input it becomes RCE.",
"remediation": "Sandbox execution, allowlist commands/arguments, and never pass model output to a shell unescaped.",
"location": {
"kind": "tool",
"name": "shell"
},
"owasp": "LLM05:2025 Improper Output Handling",
"data": {
"tags": [
"code-exec"
]
}
},
{
"ruleId": "MTC-SRC-002",
"title": "Shell/command execution in server code (dist/adb/client.js)",
"category": "permissions",
"severity": "high",
"confidence": "strong",
"description": "In the server's implementation (`dist/adb/client.js:1`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.",
"remediation": "Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.",
"location": {
"kind": "server",
"name": "dist/adb/client.js"
},
"evidence": "execSync, exec } from \"child_process\"; import { promisify } from \"util\"; const execAsync = promisify(exec); export clas",
"owasp": "LLM05:2025 Improper Output Handling",
"data": {
"rule": "MTC-SRC-002",
"file": "dist/adb/client.js",
"line": 1,
"nonRuntime": false
}
},
{
"ruleId": "MTC-SRC-002",
"title": "Shell/command execution in server code (dist/ios/client.js)",
"category": "permissions",
"severity": "high",
"confidence": "strong",
"description": "In the server's implementation (`dist/ios/client.js:1`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.",
"remediation": "Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.",
"location": {
"kind": "server",
"name": "dist/ios/client.js"
},
"evidence": "port { execSync } from \"child_process\"; import { tmpdir } from \"os\"; import { join } from \"path\"; import { readFileSync,",
"owasp": "LLM05:2025 Improper Output Handling",
"data": {
"rule": "MTC-SRC-002",
"file": "dist/ios/client.js",
"line": 1,
"nonRuntime": false
}
},
{
"ruleId": "MTC-SRC-009",
"title": "Untrusted input concatenated into a command sink (dist/adb/client.js)",
"category": "injection",
"severity": "medium",
"confidence": "strong",
"description": "In the server's implementation (`dist/adb/client.js:88`): A shell/process command assembled from concatenated or interpolated values is command injection when any part is attacker-influenced — the OWASP canonical RCE flow. Verify what reaches the interpolated value. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.",
"remediation": "Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.",
"location": {
"kind": "server",
"name": "dist/adb/client.js"
},
"evidence": "ap(x, y) { this.exec(`shell input tap ${x} ${y}`); } /** * Long press at coordinates */ lo",
"owasp": "LLM05:2025 Improper Output Handling",
"data": {
"rule": "MTC-SRC-009",
"file": "dist/adb/client.js",
"line": 88,
"nonRuntime": false
}
},
{
"ruleId": "MTC-SRC-009",
"title": "Untrusted input concatenated into a command sink (dist/ios/client.js)",
"category": "injection",
"severity": "medium",
"confidence": "strong",
"description": "In the server's implementation (`dist/ios/client.js:75`): A shell/process command assembled from concatenated or interpolated values is command injection when any part is attacker-influenced — the OWASP canonical RCE flow. Verify what reaches the interpolated value. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.",
"remediation": "Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.",
"location": {
"kind": "server",
"name": "dist/ios/client.js"
},
"evidence": "ecified\"); this.exec(`boot ${target}`); } /** * Shutdown simulator */ shutdown(deviceId) {",
"owasp": "LLM05:2025 Improper Output Handling",
"data": {
"rule": "MTC-SRC-009",
"file": "dist/ios/client.js",
"line": 75,
"nonRuntime": false
}
},
{
"ruleId": "MTC-CAP-006",
"title": "Unconstrained command parameter \"command\" on \"shell\"",
"category": "permissions",
"severity": "medium",
"confidence": "heuristic",
"description": "Tool \"shell\" takes a command-shaped parameter \"command\" with no enum/pattern constraint. Free-form, model- or attacker-controlled arguments reaching a shell is the command-injection precondition.",
"remediation": "Constrain the parameter (enum/pattern), or build the command from a fixed template with escaped args.",
"location": {
"kind": "tool",
"name": "shell",
"field": "inputSchema.properties.command"
},
"owasp": "LLM05:2025 Improper Output Handling",
"data": {
"param": "command"
}
},
{
"ruleId": "MTC-CAP-005",
"title": "Mutating tool \"shell\" declares no destructiveHint",
"category": "hygiene",
"severity": "low",
"confidence": "heuristic",
"description": "Tool \"shell\" can mutate/egress but declares no destructiveHint. Clients that don't default to spec-safe behavior may not prompt before running it.",
"remediation": "Declare accurate annotations, and gate destructive tools on user confirmation regardless.",
"location": {
"kind": "tool",
"name": "shell"
},
"data": {
"tags": [
"code-exec"
]
}
}
],
"toxicFlows": [],
"capabilities": [
{
"tool": "list_devices",
"tags": [],
"reasons": {}
},
{
"tool": "set_device",
"tags": [],
"reasons": {}
},
{
"tool": "screenshot",
"tags": [],
"reasons": {}
},
{
"tool": "get_ui",
"tags": [],
"reasons": {}
},
{
"tool": "tap",
"tags": [],
"reasons": {}
},
{
"tool": "long_press",
"tags": [],
"reasons": {}
},
{
"tool": "swipe",
"tags": [],
"reasons": {}
},
{
"tool": "input_text",
"tags": [],
"reasons": {}
},
{
"tool": "press_key",
"tags": [],
"reasons": {}
},
{
"tool": "find_element",
"tags": [],
"reasons": {}
},
{
"tool": "launch_app",
"tags": [],
"reasons": {}
},
{
"tool": "stop_app",
"tags": [],
"reasons": {}
},
{
"tool": "install_app",
"tags": [],
"reasons": {}
},
{
"tool": "get_current_activity",
"tags": [],
"reasons": {}
},
{
"tool": "shell",
"tags": [
"code-exec"
],
"reasons": {
"code-exec": [
"keyword \"shell\" in tool name",
"parameter \"command\""
]
}
},
{
"tool": "wait",
"tags": [],
"reasons": {}
},
{
"tool": "open_url",
"tags": [],
"reasons": {}
}
],
"surfaceDigest": "f8d15aa8b1ceeb00a89927bea787d2c3e3251987aea0887eeebc2327bd2edd26",
"stats": {
"tools": 17,
"prompts": 0,
"resources": 0,
"findingsBySeverity": {
"critical": 0,
"high": 3,
"medium": 3,
"low": 1,
"info": 0
}
}
}