ReadCalendarTool
Reads calendar events in a date range via ContentResolver on CalendarContract.Events, filtered by DTSTART between start_date and end-of-end_date (soft-deleted rows excluded via DELETED != 1). Requires READ_CALENDAR.
Queries Events directly rather than CalendarContract.Instances, so recurring events are not expanded — a repeating event's individual occurrences won't appear here, only its single base row (whose own DTSTART may or may not fall in range). A recurring event stores DURATION instead of DTEND, which reads back as 0 — end is reported as null in that case rather than the epoch-derived "1970-01-01 00:00".
Output: events (list of {id, title, start, end, location, description, all_day} with times formatted yyyy-MM-dd HH:mm) and count, capped at limit (1–100, default 10).