Skip to main content
Glama

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
NameRequiredDescriptionDefault
random_stringNo

Implementation Reference

  • 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 }
    );
  • Zod input schema definition for the adb_devices tool parameters (minimal, optional random_string).
    export const adbDevicesInputSchema = {
      random_string: z.string().optional()
    };
  • Full Zod schema object for adb_devices tool input validation, wrapping the input schema.
    export const AdbDevicesSchema = z.object(adbDevicesInputSchema);
  • 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
        };
      }
    }

Latest Blog Posts

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/srmorete/adb-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server