Agno's GoogleCalendarTools.find_available_slots loads the user's Calendar timezone with zoneinfo and builds each day's working-hours window in it, so a Los Angeles user gets slots from 09:00 to 17:00 at -07:00. Weekends follow the local date too.
Earlier releases read that timezone, printed it in the result, and then did every calculation in UTC. A 9 to 17 window for a Los Angeles user ran from 2 a.m. to 10 a.m. local time. The tool also passed the bare end date to the Calendar API as timeMax, which means midnight and excludes the whole last day, so meetings on that day never reached the busy list. Calling it for Tuesday and Wednesday with a meeting on Wednesday morning showed both problems.
# Real output, mocked Calendar service: timezone America/Los_Angeles, working hours 9 to 17,
# busy 2026-10-28 09:00-11:00 -07:00, find_available_slots("2026-10-27", "2026-10-28", 60)
# Before
timeMin 2026-10-27T00:00:00+00:00 timeMax 2026-10-28T00:00:00+00:00
timezone America/Los_Angeles events_analyzed 0
2026-10-28 15 slots: 2026-10-28T09:00:00+00:00 ... 2026-10-28T16:00:00+00:00
# 16:00+00:00 is 09:00 in Los Angeles, inside the meeting
# Now
timeMin 2026-10-27T09:00:00-07:00 timeMax 2026-10-28T17:00:00-07:00
timezone America/Los_Angeles events_analyzed 1
2026-10-28 11 slots: 2026-10-28T11:00:00-07:00 ... 2026-10-28T16:00:00-07:00When the saved timezone can't be loaded, the tool logs a warning, falls back to UTC and says "timezone": "UTC" in the result.
See the cookbook, and learn more about Google Calendar tools in the documentation.
Frequently asked questions
It reads the timezone saved in the authenticated user's Google Calendar settings. Date-only inputs, the working-hours window, weekend checks and the returned slot offsets all use that zone. The result's timezone field names it.
An unknown name, or a system without a timezone database, makes find_available_slots log a warning and fall back to UTC. The result then reports "timezone": "UTC" and every slot carries a +00:00 offset.
It sent the bare end date to the Calendar API as timeMax, which is midnight and exclusive, so events on the final day were never fetched. Agno now queries from the start of working hours on the first day to their end on the last day.





