You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
nc_calendar_find_availability always returns an empty result while reporting success, so a caller cannot distinguish "no free slot exists" from "this tool does nothing".
Same for every parameter combination I tried — with and without date_range_start/date_range_end, business_hours_only=False, exclude_weekends=False.
Cause
The server says so itself:
WARNING nextcloud_mcp_server.client.calendar - find_availability is not fully implemented with AsyncDavClient
INFO nextcloud_mcp_server.observability.metrics - tool call nc_calendar_find_availability success in 30ms
The call is then recorded as a success, so the gap is invisible in metrics and to any caller that trusts is_error.
Why it matters
The tool is advertised in the tool list with a detailed docstring ("intelligently analyzes existing calendar events to find free time slots…") and a full parameter set. A model will pick it for exactly the task it names, get nothing back, and either report that the calendar is fully booked or fall back to guessing.
That is the awkward failure mode: it does not look like an error, it looks like an answer.
Suggestions
Whichever fits your plans best:
Fail loudly until it is implemented — raise a ToolError saying the tool is not available, so callers can react.
Hide it — drop it from the advertised tool list while unimplemented (the capability filter in errors.py already does this kind of gating).
Implement it — nc_calendar_get_upcoming_events already returns everything needed; the rest is interval arithmetic over the busy spans.
I ended up doing (3) in my own client. Two things I ran into that may be worth knowing if you implement it server-side:
All-day events must not blanket the day. Real calendars keep birthdays, name days and subscribed school-holiday feeds as all-day entries; treating them as busy erased whole working days for me.
nc_calendar_find_availabilityalways returns an empty result while reporting success, so a caller cannot distinguish "no free slot exists" from "this tool does nothing".Reproduction
Result:
Same for every parameter combination I tried — with and without
date_range_start/date_range_end,business_hours_only=False,exclude_weekends=False.Cause
The server says so itself:
The call is then recorded as a success, so the gap is invisible in metrics and to any caller that trusts
is_error.Why it matters
The tool is advertised in the tool list with a detailed docstring ("intelligently analyzes existing calendar events to find free time slots…") and a full parameter set. A model will pick it for exactly the task it names, get nothing back, and either report that the calendar is fully booked or fall back to guessing.
That is the awkward failure mode: it does not look like an error, it looks like an answer.
Suggestions
Whichever fits your plans best:
ToolErrorsaying the tool is not available, so callers can react.errors.pyalready does this kind of gating).nc_calendar_get_upcoming_eventsalready returns everything needed; the rest is interval arithmetic over the busy spans.I ended up doing (3) in my own client. Two things I ran into that may be worth knowing if you implement it server-side:
schedule-calendar-transpand the event'sTRANSP. Neither is currently exposed; I opened feat(calendar): surface free/busy transparency for calendars and events #1390 for that.Happy to contribute an implementation if you would like it, though I would rather agree on the shape of the response first.
🤖 Generated with Claude Code
https://claude.ai/code/session_01GomNRo5jTc6rDNNLYrRVRX