adb_logcat
Retrieve Android device system logs to debug applications, monitor device activity, and analyze system events using ADB commands.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Logcat filter expression (optional) | |
| device | No | Specific device ID (optional) | |
| lines | No | Number of lines to return (default: 50) |
Implementation Reference
- src/index.ts:536-566 (handler)The core handler function for the 'adb_logcat' tool. It processes input arguments for device, filter, and lines; constructs the adb logcat command; executes it using runAdb; limits the output to the specified number of lines; and returns the log content or error.async (args: z.infer<typeof AdbLogcatSchema>, _extra: RequestHandlerExtra) => { const lines = args.lines || 50; const filterExpr = args.filter ? args.filter : ""; log(LogLevel.INFO, `Reading logcat (${lines} lines, filter: ${filterExpr || 'none'})`); const deviceArgs = buildDeviceArgs(args.device); const filterArgs = filterExpr ? splitCommandArguments(filterExpr) : []; const adbArgs = [...deviceArgs, "logcat", "-d", ...filterArgs]; try { const { stdout, stderr } = await runAdb(adbArgs); if (stderr) { log(LogLevel.WARN, `logcat returned stderr: ${stderr}`); } const logLines = stdout.split(/\r?\n/); const limitedLines = lines > 0 ? logLines.slice(-lines) : logLines; const text = limitedLines.join("\n"); return { content: [{ type: "text" as const, text }] }; } catch (error) { const errorMsg = error instanceof Error ? error.message : String(error); log(LogLevel.ERROR, `Error reading logcat: ${errorMsg}`); return { content: [{ type: "text" as const, text: `Error reading logcat: ${errorMsg}` }], isError: true }; } },
- src/index.ts:533-568 (registration)Registers the 'adb_logcat' tool with the MCP server via server.tool(), specifying the tool name, input schema shape, inline handler function, and tool description.server.tool( "adb_logcat", AdbLogcatSchema.shape, async (args: z.infer<typeof AdbLogcatSchema>, _extra: RequestHandlerExtra) => { const lines = args.lines || 50; const filterExpr = args.filter ? args.filter : ""; log(LogLevel.INFO, `Reading logcat (${lines} lines, filter: ${filterExpr || 'none'})`); const deviceArgs = buildDeviceArgs(args.device); const filterArgs = filterExpr ? splitCommandArguments(filterExpr) : []; const adbArgs = [...deviceArgs, "logcat", "-d", ...filterArgs]; try { const { stdout, stderr } = await runAdb(adbArgs); if (stderr) { log(LogLevel.WARN, `logcat returned stderr: ${stderr}`); } const logLines = stdout.split(/\r?\n/); const limitedLines = lines > 0 ? logLines.slice(-lines) : logLines; const text = limitedLines.join("\n"); return { content: [{ type: "text" as const, text }] }; } catch (error) { const errorMsg = error instanceof Error ? error.message : String(error); log(LogLevel.ERROR, `Error reading logcat: ${errorMsg}`); return { content: [{ type: "text" as const, text: `Error reading logcat: ${errorMsg}` }], isError: true }; } }, { description: ADB_LOGCAT_TOOL_DESCRIPTION } );
- src/types.ts:56-60 (schema)Defines the raw input schema object for adb_logcat parameters using Zod primitives with descriptions and defaults.export const adbLogcatInputSchema = { filter: z.string().optional().describe("Logcat filter expression (optional)"), device: z.string().optional().describe("Specific device ID (optional)"), lines: z.number().optional().default(50).describe("Number of lines to return (default: 50)") };
- src/types.ts:105-105 (schema)Creates the full Zod schema for adb_logcat by wrapping the input schema with z.object() for validation.export const AdbLogcatSchema = z.object(adbLogcatInputSchema);
- src/index.ts:113-120 (helper)Tool description string used in registration for the adb_logcat tool, providing usage guidance.* Tool description for adb-logcat */ const ADB_LOGCAT_TOOL_DESCRIPTION = "Retrieves Android system and application logs from a connected device. " + "Ideal for debugging app behavior, monitoring system events, and identifying errors. " + "Supports filtering by log tags or expressions to narrow down relevant information. " + "Results can be limited to a specific number of lines, making it useful for both brief checks and detailed analysis. " + "Use when troubleshooting crashes, unexpected behavior, or performance issues.";