adb_devices
List connected Android devices to identify available targets for ADB commands like app installation, file transfer, and shell execution.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| random_string | No |
Implementation Reference
- src/index.ts:413-416 (handler)Handler function that executes the core logic of the adb_devices tool by running the 'adb devices' command via the executeAdbCommand helper.async (_args: Record<string, never>, _extra: RequestHandlerExtra) => { log(LogLevel.INFO, "Listing connected devices"); return executeAdbCommand(["devices"], "Error executing adb devices"); },
- src/index.ts:410-418 (registration)Registration of the adb_devices tool with the MCP server, including name, input schema, handler, and description.server.tool( "adb_devices", AdbDevicesSchema.shape, async (_args: Record<string, never>, _extra: RequestHandlerExtra) => { log(LogLevel.INFO, "Listing connected devices"); return executeAdbCommand(["devices"], "Error executing adb devices"); }, { description: ADB_DEVICES_TOOL_DESCRIPTION } );
- src/types.ts:42-44 (schema)Zod input schema definition for the adb_devices tool parameters (minimal, optional random_string).export const adbDevicesInputSchema = { random_string: z.string().optional() };
- src/types.ts:102-102 (schema)Full Zod schema object for adb_devices tool input validation, wrapping the input schema.export const AdbDevicesSchema = z.object(adbDevicesInputSchema);
- src/index.ts:197-251 (helper)Helper function used by the adb_devices handler to execute ADB commands safely, handling stdout/stderr, errors, and logging.async function executeAdbCommand(args: string[], errorMessage: string) { const commandString = ["adb", ...args].join(" "); try { log(LogLevel.DEBUG, `Executing command: ${commandString}`); const { stdout, stderr } = await runAdb(args); const stderrText = stderr.trim(); // Some ADB commands output to stderr but are not errors if (stderrText && !stdout.includes("List of devices attached") && !stdout.includes("Success")) { const nonErrorWarnings = [ "Warning: Activity not started, its current task has been brought to the front", "Warning: Activity not started, intent has been delivered to currently running top-most instance." ]; if (nonErrorWarnings.some((warning) => stderrText.includes(warning))) { log(LogLevel.WARN, `Command warning (not error): ${stderrText}`); return { content: [{ type: "text" as const, text: stderrText.replace(/^Error: /, "") // Remove any 'Error: ' prefix if present }] // Do NOT set isError }; } log(LogLevel.ERROR, `Command error: ${stderrText}`); return { content: [{ type: "text" as const, text: `Error: ${stderrText}` }], isError: true }; } log(LogLevel.DEBUG, `Command successful: ${commandString}`); const commandSummary = args[0] ? `${args[0]}` : commandString; log(LogLevel.INFO, `ADB command executed successfully: ${commandSummary}`); return { content: [{ type: "text" as const, text: stdout || "Command executed successfully" }] }; } catch (error) { const errorMsg = error instanceof Error ? error.message : String(error); log(LogLevel.ERROR, `${errorMessage}: ${errorMsg}`); return { content: [{ type: "text" as const, text: `${errorMessage}: ${errorMsg}` }], isError: true }; } }