{"name":"ai.chronary/mcp","slug":"chronary-mcp","title":"Chronary","description":"Calendar API for AI agents: events, availability, Google/Microsoft setup, scheduling, and iCal.","url":"https://mcp.market/server/chronary-mcp","rating":null,"grade":"A","score":89,"certified":false,"status":"active","category":"productivity","tags":["productivity"],"presence":{"score":27,"stars":0,"forks":0,"downloads_week":56,"last_push_at":"2026-07-14T21:12:26.000Z","license":"Apache-2.0"},"uptime":{"percent":100,"checks":28,"ok":28,"last_checked_at":"2026-11-04T11:25:37.648Z","last_ok_at":"2026-11-04T11:25:37.648Z","latency_ms":387},"claimed":false,"transport":"mixed","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/Chronary/chronary-mcp","website":"https://docs.chronary.ai/mcp/overview","version":"1.5.2","remotes":[{"type":"streamable-http","url":"https://api.chronary.ai/mcp","headers":[{"description":"Bearer auth with your Chronary API key, e.g. 'Bearer chr_sk_...'.","isRequired":true,"isSecret":true,"name":"Authorization"}]}],"packages":[{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"@chronary/mcp","version":"1.5.2","runtimeHint":"npx","transport":{"type":"stdio"},"environmentVariables":[{"description":"Chronary API key - org key (chr_sk_...) or agent-scoped key (chr_ak_...). Request access at https://chronary.ai.","isRequired":true,"isSecret":true,"name":"CHRONARY_API_KEY"}]}],"tools":[{"name":"accept_terms","description":"Re-accept the current Chronary terms of service on behalf of the calling org. Use this when responses carry the Chronary-Terms-Upgrade-Required header — a material ToS bump otherwise leaves MCP-only agents stuck without a console session. Pass the current tos_version (read it from GET /v1/auth/terms/current). Requires an org-level API key (chr_sk_*); agent-scoped keys cannot accept org-wide terms.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"tos_version":{"type":"string","minLength":1,"description":"The terms-of-service version to accept; must match the current version"}},"required":["tos_version"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"cancel_connection_link","description":"Cancel a pending human-calendar setup request. This invalidates the setup URL and does not disconnect an already completed Google or Microsoft connection.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"connection_link_id":{"type":"string","pattern":"^csl_.*","description":"Connection setup link ID"}},"required":["connection_link_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"cancel_event","description":"Delete or cancel an event from a calendar. Use this to remove, cancel, or delete any scheduled event or appointment. The event is marked cancelled and excluded from future availability calculations. For a recurring series, pass `occurrence_start` to cancel just that one occurrence (the series continues); omit it to cancel the whole series. `calendar_id` is optional — if omitted the calendar is looked up from the event. Provide `calendar_id` to fail fast on cross-calendar typos.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"event_id":{"type":"string","description":"Event ID to cancel"},"calendar_id":{"description":"Calendar ID that owns the event. Optional — if omitted the calendar is resolved from the event. Matches the asymmetry with confirm_event / release_event which never required this arg.","type":"string"},"occurrence_start":{"description":"For recurring events only: ISO 8601 start of the single occurrence to cancel. The rest of the series is unaffected.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["event_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"cancel_proposal","description":"Cancel an open proposal. Fires a proposal.cancelled webhook with reason=\"organizer_cancelled\". Requires an org-level API key. Pro plan only.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"proposal_id":{"type":"string","description":"Proposal to cancel"}},"required":["proposal_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"clear_availability_rules","description":"Remove the availability rules from a calendar, reverting to the default (no buffers, no working-hours mask). Returns the deleted row, or an error if none were set.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"calendar_id":{"type":"string","description":"Calendar whose rules should be cleared"}},"required":["calendar_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"confirm_event","description":"Promote a held event to a confirmed booking. The event must currently have status=\"hold\" and its hold_expires_at must not have passed. After confirmation, event.started and event.ended lifecycle webhooks fire at the scheduled times.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"event_id":{"type":"string","description":"Event ID of the hold to confirm"}},"required":["event_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"create_agent","description":"Register your agent (AI assistant, human participant, or resource) with Chronary so it can own calendars, events, and webhooks.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255,"description":"Display name for the agent"},"type":{"type":"string","enum":["ai","human","resource"],"description":"Agent type"},"description":{"description":"Optional description","type":"string"}},"required":["name","type"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"create_booking_page","description":"Create a public booking page (a hosted scheduling link) for a calendar. Returns a booking_url to send to a human; when they pick a slot, a confirmed event is created on the calendar and an event.created webhook fires with a booking_page_id field. Set availability_constraints to restrict to weekly working hours; existing calendar events always block slots.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"calendar_id":{"type":"string","description":"Calendar a booking resolves to (from create_calendar/list_calendars)."},"title":{"type":"string","minLength":1,"maxLength":200,"description":"Meeting title shown on the page."},"description":{"description":"Optional description shown to the booker.","type":"string","maxLength":2000},"duration_minutes":{"description":"Slot length in minutes (default 30).","type":"integer","minimum":5,"maximum":480},"buffer_minutes":{"description":"Padding before/after existing events (default 0).","type":"integer","minimum":0,"maximum":120},"window_days":{"description":"How far ahead bookings are allowed (default 14).","type":"integer","minimum":1,"maximum":365},"min_notice_minutes":{"description":"Minimum lead time before a bookable slot (default 0).","type":"integer","minimum":0,"maximum":40320},"timezone":{"description":"IANA timezone for display + working hours (default UTC).","type":"string","minLength":1,"maxLength":64},"availability_constraints":{"description":"Weekly working hours, e.g. {\"mon\":{\"start\":\"09:00\",\"end\":\"17:00\"}}. Omit/null for any time in the window.","anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"start":{"type":"string"},"end":{"type":"string"}},"required":["start","end"]}},{"type":"null"}]},"active":{"description":"Whether the page accepts bookings (default true).","type":"boolean"}},"required":["calendar_id","title"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"create_calendar","description":"Create a calendar to hold events and track availability. Calendars are required before creating events — call this first when setting up a new agent. An agent can have multiple calendars (e.g. \"Work\", \"Personal\"). Org-level calendars (no agent_id) can be used as shared resources like meeting rooms.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255,"description":"Calendar name"},"agent_id":{"description":"Agent ID to own this calendar (omit for org-level)","type":"string"},"timezone":{"type":"string","minLength":1,"description":"IANA timezone (e.g. America/New_York)"},"default_reminders":{"description":"Default reminder offsets in minutes before start, inherited by events on this calendar that don't set their own. Omit or null to use the system default (10 min); [] for no reminders.","anyOf":[{"maxItems":5,"type":"array","items":{"type":"integer","minimum":1,"maximum":40320}},{"type":"null"}]}},"required":["name","timezone"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"create_connection_link","description":"Request human setup of Google Calendar or Microsoft Outlook for a Chronary calendar. Give setup_url to a human; the agent never receives OAuth credentials, provider calendar names, or event data. The secret URL is returned only on first creation. If reused=true and setup_url is null, retain the original URL or cancel this link and create a replacement.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"calendar_id":{"type":"string","pattern":"^cal_.*","description":"Chronary calendar whose owning agent will receive authorized availability"},"capabilities":{"default":["availability"],"description":"Request opaque availability, plus optional opt-in event publishing permission","minItems":1,"maxItems":2,"type":"array","items":{"type":"string","enum":["availability","publishing"]}},"publication_policy":{"default":"none","description":"Desired publishing policy; a human still chooses the destination","type":"string","enum":["none","confirmed","confirmed_tentative"]}},"required":["calendar_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"create_event","description":"Create a booking, appointment, meeting, hold, or any scheduled event on a calendar. The calendar_id comes from create_calendar or list_events. Once created, this event blocks the agent's availability during that time and appears in availability queries. Use status=\"hold\" with hold_expires_at to tentatively reserve a slot that auto-releases on TTL.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"calendar_id":{"type":"string","description":"Calendar ID to add the event to"},"title":{"type":"string","minLength":1,"maxLength":500,"description":"Event title"},"start_time":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"Start time (ISO 8601)"},"end_time":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"End time (ISO 8601)"},"description":{"description":"Optional event description","type":"string"},"all_day":{"default":false,"description":"Whether this is an all-day event","type":"boolean"},"status":{"description":"Event status. \"hold\" creates a tentative reservation that auto-expires at hold_expires_at. Defaults to \"confirmed\".","type":"string","enum":["confirmed","tentative","hold"]},"reminders":{"description":"Reminder offsets in minutes before start_time (e.g. [10, 1440]). Each fires an event.reminder webhook and shows as an alarm in the iCal feed. Omit or null to inherit the calendar default (then the system default of 10 min); [] for no reminders.","anyOf":[{"maxItems":5,"type":"array","items":{"type":"integer","minimum":1,"maximum":40320}},{"type":"null"}]},"hold_expires_at":{"description":"Required when status=\"hold\". ISO 8601 timestamp 30s-15min in the future. Auto-releases the hold when reached.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"hold_priority":{"description":"Only valid with status=\"hold\". Higher-priority overlapping holds pre-empt lower-priority ones. Defaults to 0.","type":"integer","minimum":0,"maximum":100},"recurrence_rule":{"description":"Make this a recurring series (RFC 5545 RRULE subset, no \"RRULE:\" prefix), e.g. \"FREQ=WEEKLY;BYDAY=MO,WE;COUNT=12\". Supports FREQ=DAILY/WEEKLY/MONTHLY/YEARLY, INTERVAL, COUNT (max 730) or UNTIL, BYDAY (weekly list or monthly ordinal like 2TU/-1FR), BYMONTHDAY (1-28 or -1). start_time must match the rule pattern; expansion is UTC-only. Not allowed with status=\"hold\". Free plan: max 5 recurring events, series must end within 90 days.","type":"string","maxLength":256}},"required":["calendar_id","title","start_time","end_time"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"create_proposal","description":"Create a scheduling proposal — send a set of candidate time slots to one or more participant agents so they can accept, decline, or counter-propose. The organizer agent owns the proposal; once every participant responds, the system auto-resolves to the highest-scoring slot (or cancels if all decline). Requires an org-level API key. Pro plan only.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":500,"description":"Short description of what the meeting is about"},"description":{"description":"Longer context/agenda","type":"string","maxLength":5000},"organizer_agent_id":{"type":"string","description":"Agent ID proposing the meeting"},"participant_agent_ids":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string"},"description":"Agent IDs invited to respond"},"calendar_id":{"type":"string","description":"Calendar the resolved event will be created on"},"slots":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"object","properties":{"start_time":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"Slot start time (ISO 8601)"},"end_time":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"Slot end time (ISO 8601), after start_time"},"weight":{"description":"Preference for this slot, 0–10 (higher = more preferred). Used to rank candidate slots when the proposal is resolved. Defaults to 1.","default":1,"type":"number","minimum":0,"maximum":10},"calendar_id":{"description":"Calendar to create the event on if this slot is chosen. Defaults to the proposal's top-level calendar_id.","type":"string"}},"required":["start_time","end_time"]},"description":"Candidate time slots (up to 20)"},"expires_at":{"description":"Auto-cancel cutoff if unresolved","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["title","organizer_agent_id","participant_agent_ids","calendar_id","slots"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"create_scoped_key","description":"Create an agent-scoped API key (chr_ak_*) that can only act on behalf of a single agent. Use this to self-provision or rotate per-agent credentials. The plaintext key is returned exactly once in the response — store it immediately, it cannot be retrieved later. Requires an org-level API key.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"agent_id":{"type":"string","pattern":"^agt_","description":"Agent ID this key is scoped to"},"label":{"description":"Human-readable label for the key","type":"string","minLength":1,"maxLength":100}},"required":["agent_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"create_webhook","description":"Create a webhook subscription so the org receives HTTP POST notifications when events occur (e.g. event.created, proposal.confirmed). The signing secret is returned ONCE in this response — store it to verify the HMAC-SHA256 signature on delivered payloads. Requires an org-level API key.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"HTTPS endpoint that will receive event deliveries"},"events":{"minItems":1,"type":"array","items":{"type":"string","enum":["agent.created","agent.updated","event.created","event.updated","event.deleted","event.started","event.ended","event.reminder","event.hold_created","event.hold_expired","event.hold_released","event.hold_confirmed","proposal.created","proposal.responded","proposal.confirmed","proposal.expired","proposal.cancelled","webhook.deactivated"]},"description":"Event types to subscribe to"}},"required":["url","events"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"delete_agent","description":"Decommission an agent. This marks the agent as decommissioned and revokes all of its scoped API keys. Requires an org-level API key — agent-scoped keys cannot delete agents.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"agent_id":{"type":"string","description":"Agent ID to decommission"}},"required":["agent_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"delete_booking_page","description":"Delete (deactivate) a booking page. Its hosted URL stops resolving; already-booked events are unaffected.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"booking_page_id":{"type":"string","description":"Booking page ID to delete (bkp_...)"}},"required":["booking_page_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"delete_calendar","description":"Delete a calendar (soft delete). Its events are no longer returned and it stops contributing to availability. Agent-scoped keys may only delete calendars owned by their agent.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"calendar_id":{"type":"string","description":"Calendar ID to delete"}},"required":["calendar_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"delete_ical_subscription","description":"Delete an external iCal feed subscription. Events previously synced from the feed are no longer refreshed.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"subscription_id":{"type":"string","description":"iCal subscription ID to delete"}},"required":["subscription_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"delete_webhook","description":"Permanently delete a webhook subscription. This frees its endpoint slot against the per-plan cap. Requires an org-level API key.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"webhook_id":{"type":"string","description":"Webhook subscription to delete"}},"required":["webhook_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"find_meeting_time","description":"Find slots when multiple agents are free across Chronary calendars and any human calendars authorized for each agent. This tool is fail-closed: always inspect `availability_state` and `warnings` before using slots. Accepts `agents`/`start`/`end` or their aliases.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"agents":{"description":"Array of agent IDs to find common free time for. All agents must be free during the returned slots. Alias: agent_ids.","minItems":1,"type":"array","items":{"type":"string"}},"agent_ids":{"description":"Alias for `agents` (matches REST/scheduling-proposal naming).","minItems":1,"type":"array","items":{"type":"string"}},"start":{"description":"Search range start (ISO 8601). Alias: start_time.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"end":{"description":"Search range end (ISO 8601). Alias: end_time.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"start_time":{"description":"Alias for `start` (matches REST events naming).","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"end_time":{"description":"Alias for `end` (matches REST events naming).","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"duration":{"description":"Requested slot length (15m/30m/45m/1h/2h). Preferred over the deprecated slot_duration. Defaults to 30m.","type":"string","enum":["15m","30m","45m","1h","2h"]},"slot_duration":{"description":"Deprecated alias for `duration` — minimum slot length. Prefer `duration`.","type":"string","enum":["15m","30m","45m","1h","2h"]},"calendars":{"description":"Additional shared calendar IDs to treat as busy","type":"array","items":{"type":"string"}},"include_busy":{"default":false,"description":"Include per-agent busy blocks in response","type":"boolean"}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"get_agent","description":"Fetch a single agent by ID. An agent represents an AI assistant, human, or shared resource (e.g. a meeting room). Agent-scoped API keys may only read their own agent.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"agent_id":{"type":"string","description":"Agent ID to fetch"}},"required":["agent_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"get_audit_log","description":"List audit-log entries for the calling org — mutating operations and auth-lifecycle events, newest first. Results are clamped to the plan's retention window. Requires an org-level API key (chr_sk_*); agent-scoped keys cannot read the org-wide audit log.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"from":{"description":"Start of the window (ISO 8601). Silently clamped to the plan retention window if older.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"to":{"description":"End of the window (ISO 8601)","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"action":{"description":"Filter by action name (e.g. event.created)","type":"string","minLength":1,"maxLength":64},"actor_key_prefix":{"description":"Filter by the API key prefix that performed the action","type":"string","minLength":1,"maxLength":32},"cursor":{"description":"Opaque pagination cursor from a previous response","type":"string","minLength":1,"maxLength":256},"limit":{"description":"Max results to return (default 50)","type":"integer","minimum":1,"maximum":200}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"get_availability","description":"Check when a single agent is free across its Chronary calendars and any human calendars authorized for that agent. This tool is fail-closed: always inspect `availability_state` and `warnings` before using slots. Accepts `start`/`end` or the `start_time`/`end_time` aliases.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"agent_id":{"type":"string","description":"Agent ID to check availability for"},"start":{"description":"Range start (ISO 8601). Alias: start_time.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"end":{"description":"Range end (ISO 8601). Alias: end_time.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"start_time":{"description":"Alias for `start` (matches REST events naming).","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"end_time":{"description":"Alias for `end` (matches REST events naming).","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"duration":{"description":"Requested slot length (15m/30m/45m/1h/2h). Preferred over the deprecated slot_duration. Defaults to 30m.","type":"string","enum":["15m","30m","45m","1h","2h"]},"slot_duration":{"description":"Deprecated alias for `duration` — minimum slot length. Prefer `duration`.","type":"string","enum":["15m","30m","45m","1h","2h"]},"include_busy":{"default":false,"description":"Include busy blocks in response","type":"boolean"}},"required":["agent_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"get_availability_rules","description":"Read the buffer times and working-hours rules configured on a calendar. Returns the rules row, or an error if none are set.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"calendar_id":{"type":"string","description":"Calendar to read"}},"required":["calendar_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"get_booking_page","description":"Fetch a single booking page by ID, including its public booking_url and settings.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"booking_page_id":{"type":"string","description":"Booking page ID to fetch (bkp_...)"}},"required":["booking_page_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"get_calendar","description":"Fetch a single calendar by ID, including its name, timezone, agent status, and default reminders. Agent-scoped keys may only read calendars owned by their agent.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"calendar_id":{"type":"string","description":"Calendar ID to fetch"}},"required":["calendar_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"get_calendar_context","description":"Get a calendar's temporal context in a single call: the current event (if one is happening now), the next upcoming event, recent past events, a short upcoming window, and the owning agent's status (idle/working/waiting/error). Use this to answer \"what is this agent doing right now?\" without issuing multiple list_events queries.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"calendar_id":{"type":"string","description":"Calendar ID"}},"required":["calendar_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"get_connection_link","description":"Poll a human-calendar setup request. Returns provider-neutral status and resulting connection ID when complete, but never replays the bearer setup URL or exposes human calendar data.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"connection_link_id":{"type":"string","pattern":"^csl_.*","description":"Connection setup link ID"}},"required":["connection_link_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"get_event","description":"Retrieve a single event by ID, including its title, times, status, location, reminders, and metadata. Works for both internally created events and externally synced iCal events. `calendar_id` is optional — if omitted the calendar is resolved from the event. Provide `calendar_id` to fail fast on cross-calendar typos.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"event_id":{"type":"string","description":"Event ID to retrieve"},"calendar_id":{"description":"Calendar ID that owns the event. Optional — if omitted the calendar is resolved from the event.","type":"string"}},"required":["event_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"get_ical_subscription","description":"Get a single external iCal feed subscription by id, including its sync status, last sync time, and last error.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"subscription_id":{"type":"string","description":"iCal subscription ID to fetch"}},"required":["subscription_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"get_proposal","description":"Get a scheduling proposal by id, including its slots and per-participant responses. Requires an org-level API key.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"proposal_id":{"type":"string","description":"Proposal to fetch"}},"required":["proposal_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"get_usage","description":"Get the calling org's current-period usage and plan limits (agents, calendars, events, API calls, webhooks, availability queries, iCal subscriptions, proposals, scoped keys, holds, cross-calendar queries). Requires an org-level API key (chr_sk_*); agent-scoped keys cannot read org-wide usage.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"get_webhook","description":"Get a single webhook subscription by id, including its subscribed event types and active state. The signing secret is never returned. Requires an org-level API key.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"webhook_id":{"type":"string","description":"Webhook subscription to fetch"}},"required":["webhook_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"list_agents","description":"List all agents in your organization","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"type":{"description":"Filter by agent type","type":"string","enum":["ai","human","resource"]},"status":{"description":"Filter by status","type":"string","enum":["active","paused","decommissioned"]},"limit":{"default":50,"description":"Max results to return","type":"integer","minimum":1,"maximum":200},"offset":{"default":0,"description":"Pagination offset","type":"integer","minimum":0,"maximum":9007199254740991}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"list_booking_pages","description":"List booking pages in the org. Agent-scoped keys see only pages on their own agent's calendars.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"limit":{"default":50,"description":"Max results to return","type":"integer","minimum":1,"maximum":200},"offset":{"default":0,"description":"Pagination offset","type":"integer","minimum":0,"maximum":9007199254740991}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"list_calendars","description":"List calendars in the org. Org-level API keys see every calendar (agent-owned and shared); agent-scoped keys see only their own agent's calendars. Use this to discover calendar IDs before creating or listing events.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"agent_id":{"description":"Filter to calendars owned by this agent. Org keys only — agent-scoped keys are always limited to their own agent and ignore this.","type":"string"},"include":{"description":"Pass \"all\" to include calendars across all agents (org keys only)","type":"string","enum":["all"]},"limit":{"default":50,"description":"Max results to return","type":"integer","minimum":1,"maximum":200},"offset":{"default":0,"description":"Pagination offset","type":"integer","minimum":0,"maximum":9007199254740991}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"list_events","description":"List events on a calendar or across an agent's calendars, including internally created events and externally synced events from iCal subscriptions (e.g. Google Calendar, Outlook). Provide `calendar_id` OR `agent_id`. Narrow with `start_after`/`start_before` (time window), `status`, and `source`.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"calendar_id":{"description":"Calendar ID to list events from. Provide this or agent_id.","type":"string"},"agent_id":{"description":"Agent ID to list events for across all of the agent's calendars. Provide this or calendar_id.","type":"string"},"start_after":{"description":"Only events starting after this ISO 8601 time","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"start_before":{"description":"Only events starting before this ISO 8601 time","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"status":{"description":"Filter by event status","type":"string","enum":["confirmed","tentative","cancelled","hold"]},"source":{"description":"Filter by source: \"internal\" (created via the API) or \"external_ical\" (synced from an iCal subscription)","type":"string","enum":["internal","external_ical"]},"limit":{"default":50,"description":"Max results to return","type":"integer","minimum":1,"maximum":200},"offset":{"default":0,"description":"Pagination offset","type":"integer","minimum":0,"maximum":9007199254740991},"expand":{"default":false,"description":"Expand recurring series into individual occurrence instances within the window. Requires both start_after and start_before (max 366 days apart). Instances carry recurringEventId + originalStartTime.","type":"boolean"}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"list_ical_subscriptions","description":"List an agent's external iCal feed subscriptions (e.g. linked Google Calendar / Outlook feeds), including their sync status and last sync time.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"agent_id":{"type":"string","description":"Agent ID whose iCal subscriptions to list"},"status":{"description":"Filter by subscription status","type":"string","enum":["active","error","paused"]},"limit":{"default":50,"description":"Max results to return","type":"integer","minimum":1,"maximum":200},"offset":{"default":0,"description":"Pagination offset","type":"integer","minimum":0,"maximum":9007199254740991}},"required":["agent_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"list_proposals","description":"List scheduling proposals for the org. Filter by status (pending|confirmed|expired|cancelled) or organizer_agent_id. Requires an org-level API key.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"status":{"description":"Filter by proposal status","type":"string","enum":["pending","confirmed","expired","cancelled"]},"organizer_agent_id":{"description":"Filter by organizer agent","type":"string"},"limit":{"description":"Max results (default 50)","type":"integer","minimum":1,"maximum":200},"offset":{"description":"Pagination offset (default 0)","type":"integer","minimum":0,"maximum":9007199254740991}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"list_scoped_keys","description":"List all live (non-revoked) agent-scoped API keys for this org. Returns key metadata only (id, prefix, agent_id, label, created_at) — never the plaintext secret. Requires an org-level API key.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"list_webhook_deliveries","description":"List delivery attempts for a webhook subscription, with per-status counts (pending/delivered/failed). Use this to debug failing deliveries. Requires an org-level API key.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"webhook_id":{"type":"string","description":"Webhook subscription whose deliveries to list"},"limit":{"default":20,"description":"Max results to return","type":"integer","minimum":1,"maximum":100},"offset":{"default":0,"description":"Pagination offset","type":"integer","minimum":0,"maximum":9007199254740991},"status":{"description":"Filter to a single delivery status","type":"string","enum":["pending","delivered","failed"]},"include_payload":{"description":"Include the full event payload sent on each delivery","type":"boolean"}},"required":["webhook_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"list_webhooks","description":"List the org's webhook subscriptions with their subscribed event types and active state. Signing secrets are never returned. Requires an org-level API key.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"limit":{"default":20,"description":"Max results to return","type":"integer","minimum":1,"maximum":100},"offset":{"default":0,"description":"Pagination offset","type":"integer","minimum":0,"maximum":9007199254740991}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"release_event","description":"Manually release a held event before its hold_expires_at. The event must currently have status=\"hold\". Frees the slot for other agents to book.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"event_id":{"type":"string","description":"Event ID of the hold to release"}},"required":["event_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"resolve_proposal","description":"Force-resolve an open proposal using responses collected so far. Picks the highest-scoring slot among those accepted by the most participants and creates a confirmed calendar event. If every response was \"decline\", the proposal is cancelled instead. Use when you want to close out a proposal without waiting for every participant. Requires an org-level API key. Pro plan only.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"proposal_id":{"type":"string","description":"Proposal to resolve"}},"required":["proposal_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"respond_to_proposal","description":"Submit a response (accept / decline / counter) on behalf of one participant agent to an open proposal. An \"accept\" requires the slot id from the proposal; a \"counter\" can suggest alternative slots. When all participants have responded the proposal auto-resolves — no separate resolve call needed in the normal flow. Requires an org-level API key. Pro plan only.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"proposal_id":{"type":"string","description":"Proposal to respond to"},"agent_id":{"type":"string","description":"Participant agent responding"},"response":{"type":"string","enum":["accept","decline","counter"],"description":"Decision from this agent"},"selected_slot_id":{"description":"Required when response is \"accept\"","type":"string"},"counter_slots":{"description":"Alternative slots when response is \"counter\"","maxItems":20,"type":"array","items":{"type":"object","properties":{"start_time":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"Slot start time (ISO 8601)"},"end_time":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","description":"Slot end time (ISO 8601), after start_time"},"weight":{"description":"Preference for this slot, 0–10 (higher = more preferred). Used to rank candidate slots when the proposal is resolved. Defaults to 1.","default":1,"type":"number","minimum":0,"maximum":10},"calendar_id":{"description":"Calendar to create the event on if this slot is chosen. Defaults to the proposal's top-level calendar_id.","type":"string"}},"required":["start_time","end_time"]}},"message":{"description":"Optional note for the organizer","type":"string","maxLength":2000}},"required":["proposal_id","agent_id","response"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"revoke_scoped_key","description":"Revoke an agent-scoped API key by ID. Revocation is permanent (cannot be un-revoked); the key stops authenticating within about a minute. Requires an org-level API key.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"key_id":{"type":"string","description":"ID of the scoped key to revoke"}},"required":["key_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"set_availability_rules","description":"Set or replace the availability rules on a calendar — buffer times before/after events and optional per-day working hours. When these rules are set, every availability query on this calendar automatically applies them (busy-block expansion for buffers, masking outside working hours). Upsert: overwrites any existing rules.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"calendar_id":{"type":"string","description":"Calendar to configure"},"buffer_before_minutes":{"default":0,"description":"Minutes of buffer before each event (0–120)","type":"integer","minimum":0,"maximum":120},"buffer_after_minutes":{"default":0,"description":"Minutes of buffer after each event (0–120)","type":"integer","minimum":0,"maximum":120},"working_hours":{"default":null,"description":"Per-day working hours map in the calendar's timezone; omit keys for off-days. Pass null to remove any working-hours constraint.","anyOf":[{"type":"object","properties":{"mon":{"type":"object","properties":{"start":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"Start of the working window, HH:MM 24-hour, in the rules timezone (e.g. \"09:00\")"},"end":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"End of the working window, HH:MM 24-hour, after start (e.g. \"17:00\")"}},"required":["start","end"],"description":"A single day's working hours window"},"tue":{"type":"object","properties":{"start":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"Start of the working window, HH:MM 24-hour, in the rules timezone (e.g. \"09:00\")"},"end":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"End of the working window, HH:MM 24-hour, after start (e.g. \"17:00\")"}},"required":["start","end"],"description":"A single day's working hours window"},"wed":{"type":"object","properties":{"start":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"Start of the working window, HH:MM 24-hour, in the rules timezone (e.g. \"09:00\")"},"end":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"End of the working window, HH:MM 24-hour, after start (e.g. \"17:00\")"}},"required":["start","end"],"description":"A single day's working hours window"},"thu":{"type":"object","properties":{"start":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"Start of the working window, HH:MM 24-hour, in the rules timezone (e.g. \"09:00\")"},"end":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"End of the working window, HH:MM 24-hour, after start (e.g. \"17:00\")"}},"required":["start","end"],"description":"A single day's working hours window"},"fri":{"type":"object","properties":{"start":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"Start of the working window, HH:MM 24-hour, in the rules timezone (e.g. \"09:00\")"},"end":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"End of the working window, HH:MM 24-hour, after start (e.g. \"17:00\")"}},"required":["start","end"],"description":"A single day's working hours window"},"sat":{"type":"object","properties":{"start":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"Start of the working window, HH:MM 24-hour, in the rules timezone (e.g. \"09:00\")"},"end":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"End of the working window, HH:MM 24-hour, after start (e.g. \"17:00\")"}},"required":["start","end"],"description":"A single day's working hours window"},"sun":{"type":"object","properties":{"start":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"Start of the working window, HH:MM 24-hour, in the rules timezone (e.g. \"09:00\")"},"end":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$","description":"End of the working window, HH:MM 24-hour, after start (e.g. \"17:00\")"}},"required":["start","end"],"description":"A single day's working hours window"}}},{"type":"null"}]},"timezone":{"default":"UTC","description":"IANA timezone used to interpret working_hours (e.g. America/New_York)","type":"string","minLength":1,"maxLength":64}},"required":["calendar_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"subscribe_ical","description":"Link an external iCal feed (e.g. a human's Google Calendar) to an agent's calendar so external events appear in availability calculations. The target calendar must be owned by the specified agent — create the calendar with that agent_id first (org-level calendars without an agent_id cannot host external iCal subscriptions; create a dedicated per-agent calendar for sync targets).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"agent_id":{"type":"string","description":"Agent ID that will own this subscription"},"calendar_id":{"type":"string","description":"Calendar ID to sync external events into"},"url":{"type":"string","format":"uri","description":"HTTPS URL of the iCal feed (.ics) to subscribe to"},"label":{"description":"Optional label for this subscription","type":"string"}},"required":["agent_id","calendar_id","url"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"sync_ical_subscription","description":"Trigger an immediate sync of an external iCal feed subscription instead of waiting for the next scheduled poll. Returns once the sync has been queued.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"subscription_id":{"type":"string","description":"iCal subscription ID to sync"}},"required":["subscription_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"update_agent","description":"Update an agent's name, description, metadata, or status (active/paused). Requires an org-level API key — agent-scoped keys cannot mutate agents.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"agent_id":{"type":"string","description":"Agent ID to update"},"name":{"description":"New display name","type":"string","minLength":1,"maxLength":255},"description":{"description":"New description (null to clear)","anyOf":[{"type":"string"},{"type":"null"}]},"metadata":{"description":"Arbitrary metadata (max 16KB)","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"status":{"description":"Operational status","type":"string","enum":["active","paused"]}},"required":["agent_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"update_calendar","description":"Update a calendar's name, timezone, agent status, default reminders, or metadata. Agent-scoped keys may only update calendars owned by their agent.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"calendar_id":{"type":"string","description":"Calendar ID to update"},"name":{"description":"New calendar name","type":"string","minLength":1,"maxLength":255},"timezone":{"description":"New IANA timezone (e.g. America/New_York)","type":"string","minLength":1},"agent_status":{"description":"Owning agent's status","type":"string","enum":["idle","working","waiting","error"]},"default_reminders":{"description":"Default reminder offsets in minutes; null for system default, [] for none","anyOf":[{"maxItems":5,"type":"array","items":{"type":"integer","minimum":1,"maximum":40320}},{"type":"null"}]},"metadata":{"description":"Arbitrary metadata (max 16KB)","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["calendar_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"update_event","description":"Reschedule or edit an event — change its title, description, start/end times, location, status, reminders, or metadata. Use this to move an appointment to a new time or update its details. Provide only the fields you want to change. Holds cannot be edited via this tool (use confirm_event / release_event). External iCal events are read-only. `calendar_id` is optional — if omitted it is resolved from the event.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"event_id":{"type":"string","description":"Event ID to update"},"calendar_id":{"description":"Calendar ID that owns the event. Optional — if omitted the calendar is resolved from the event.","type":"string"},"title":{"description":"New event title","type":"string","minLength":1,"maxLength":500},"description":{"description":"New description, or null to clear it","anyOf":[{"type":"string"},{"type":"null"}]},"start_time":{"description":"New start time (ISO 8601)","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"end_time":{"description":"New end time (ISO 8601)","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"all_day":{"description":"Whether this is an all-day event","type":"boolean"},"status":{"description":"New event status","type":"string","enum":["confirmed","tentative","cancelled"]},"metadata":{"description":"Replacement metadata object","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"reminders":{"description":"Reminder offsets in minutes before start_time. Omit to leave unchanged, null to inherit the calendar default, [] for no reminders.","anyOf":[{"maxItems":5,"type":"array","items":{"type":"integer","minimum":1,"maximum":40320}},{"type":"null"}]},"recurrence_rule":{"description":"Set/change the recurring series rule (RFC 5545 RRULE subset, full-series semantics), or null to make the event a one-off. Changing the rule or start_time resets cancelled occurrences.","anyOf":[{"type":"string","maxLength":256},{"type":"null"}]}},"required":["event_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"update_ical_subscription","description":"Update an external iCal feed subscription — change its label or its feed URL. Changing the URL forces a full re-sync on the next poll.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"subscription_id":{"type":"string","description":"iCal subscription ID to update"},"label":{"description":"New label for this subscription","type":"string","minLength":1,"maxLength":255},"url":{"description":"New HTTPS URL of the iCal feed (.ics)","type":"string","format":"uri","pattern":"^https:\\/\\/.*"}},"required":["subscription_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"update_webhook","description":"Update a webhook subscription — change its delivery URL, the set of subscribed event types, or pause/resume it via active. At least one field must be supplied. Requires an org-level API key.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"webhook_id":{"type":"string","description":"Webhook subscription to update"},"url":{"description":"New HTTPS delivery endpoint","type":"string","format":"uri"},"events":{"description":"Replacement set of event types to subscribe to","minItems":1,"type":"array","items":{"type":"string","enum":["agent.created","agent.updated","event.created","event.updated","event.deleted","event.started","event.ended","event.reminder","event.hold_created","event.hold_expired","event.hold_released","event.hold_confirmed","proposal.created","proposal.responded","proposal.confirmed","proposal.expired","proposal.cancelled","webhook.deactivated"]}},"active":{"description":"Set false to pause deliveries, true to resume","type":"boolean"}},"required":["webhook_id"],"$schema":"http://json-schema.org/draft-07/schema#"}}],"scan":{"score":89,"grade":"A","scanned_at":"2026-09-25T21:45:46.907Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-25T21:45:46.808Z","components":{"code":{"score":25,"max":25,"notes":["4 source files scanned"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 1292ms"]},"poisoning":{"score":15,"max":15,"notes":["54 tool descriptions checked"]},"auth":{"score":8,"max":15,"notes":["API key sent as a header"]},"maintenance":{"score":12,"max":15,"notes":["last push 73 days ago"]},"identity":{"score":9,"max":10,"notes":["registry namespace matches repository owner","website matches verified namespace"]}},"findings":[],"inputs":{"probes":[{"url":"https://api.chronary.ai/mcp","reachable":true,"authRequired":false,"latencyMs":1292,"serverInfo":{"name":"chronary","version":"1.0.0"}}],"packages":[{"registryType":"npm","identifier":"@chronary/mcp","version":"1.5.2","found":true,"license":"Apache-2.0","hasInstallScripts":false,"dependencyCount":4,"publishedAt":"2026-07-14T21:12:54.331Z","repositoryUrl":"git+https://github.com/Chronary/chronary-mcp.git","weeklyDownloads":56}],"repo":{"found":true,"owner":"Chronary","repo":"chronary-mcp","archived":false,"pushedAt":"2026-07-14T21:12:26Z","stars":0,"forks":0,"openIssues":0,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/276158803?v=4","ownerCreatedAt":"2026-04-15T02:23:08Z","license":"Apache-2.0"},"icon":{"url":"https://docs.chronary.ai/favicon.svg","source":"site"},"presence":{"stars":0,"forks":0,"downloadsWeek":56,"license":"Apache-2.0","lastPushAt":"2026-07-14T21:12:26.000Z","score":27}}}},"grade_history":[],"reviews":[]}