Skip to content

MCP Tools Reference

Chronary exposes 47 MCP tools. Each tool maps to one or more REST API endpoints but is designed for natural-language invocation by AI agents.


Register your agent (AI assistant, human participant, or resource) with Chronary, creating a Chronary identity it can use to own calendars, events, and webhooks. The agent itself already exists in your system — this gives it a Chronary record.

ParameterTypeRequiredDescription
namestringYesDisplay name for the agent
typeenum: ai, human, resourceYesAgent type — ai for bots, human for people, resource for rooms/equipment
descriptionstringNoOptional description of the agent’s purpose

User: “Register an AI agent for my customer support team”

Tool call:

{
"name": "create_agent",
"arguments": {
"name": "Customer Support Agent",
"type": "ai",
"description": "Handles scheduling for customer support calls"
}
}

Response:

{
"id": "agt_a1b2c3d4",
"name": "Customer Support Agent",
"type": "ai",
"description": "Handles scheduling for customer support calls",
"status": "active",
"createdAt": "2026-04-04T10:00:00Z"
}

List agents in your organization with optional filtering.

ParameterTypeRequiredDefaultDescription
typeenum: ai, human, resourceNoFilter by agent type
statusenum: active, paused, decommissionedNoFilter by status
limitnumber (1–200)No50Maximum results to return
offsetnumberNo0Pagination offset

User: “Show me all my active AI agents”

Tool call:

{
"name": "list_agents",
"arguments": {
"type": "ai",
"status": "active"
}
}

Response:

{
"data": [
{
"id": "agt_a1b2c3d4",
"name": "Customer Support Agent",
"type": "ai",
"status": "active"
},
{
"id": "agt_e5f6g7h8",
"name": "Sales Agent",
"type": "ai",
"status": "active"
}
],
"total": 2,
"limit": 50,
"offset": 0
}

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.

ParameterTypeRequiredDescription
agent_idstringYesAgent ID to fetch

User: “Show me the details for my support agent”

Tool call:

{
"name": "get_agent",
"arguments": {
"agent_id": "agt_a1b2c3d4"
}
}

Response:

{
"id": "agt_a1b2c3d4",
"name": "Customer Support Agent",
"type": "ai",
"description": "Handles scheduling for customer support calls",
"status": "active",
"createdAt": "2026-04-04T10:00:00Z"
}

Update an agent’s name, description, metadata, or status (active/paused). Requires an org-level API key — agent-scoped keys cannot mutate agents.

ParameterTypeRequiredDescription
agent_idstringYesAgent ID to update
namestring (1–255)NoNew display name
descriptionstring | nullNoNew description (null to clear)
metadataobjectNoArbitrary metadata (max 16KB)
statusenum: active, pausedNoOperational status

User: “Pause my sales agent”

Tool call:

{
"name": "update_agent",
"arguments": {
"agent_id": "agt_e5f6g7h8",
"status": "paused"
}
}

Response:

{
"id": "agt_e5f6g7h8",
"name": "Sales Agent",
"type": "ai",
"status": "paused",
"updatedAt": "2026-04-04T10:30:00Z"
}

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.

ParameterTypeRequiredDescription
agent_idstringYesAgent ID to decommission

User: “Decommission the old test agent”

Tool call:

{
"name": "delete_agent",
"arguments": {
"agent_id": "agt_a1b2c3d4"
}
}

Response:

{
"deleted": true,
"id": "agt_a1b2c3d4"
}

Create a calendar. Calendars can belong to a specific agent or exist at the organization level.

ParameterTypeRequiredDescription
namestringYesCalendar display name
agent_idstringNoAgent to own this calendar. Omit for an org-level calendar.
timezonestring (IANA)YesCalendar timezone, e.g. America/New_York, Europe/London, UTC

User: “Create a calendar for my sales agent in New York timezone”

Tool call:

{
"name": "create_calendar",
"arguments": {
"name": "Sales Calendar",
"agent_id": "agt_e5f6g7h8",
"timezone": "America/New_York"
}
}

Response:

{
"id": "cal_x1y2z3",
"orgId": "org_a1b2c3",
"agentId": "agt_e5f6g7h8",
"name": "Sales Calendar",
"timezone": "America/New_York",
"agent_status": "idle",
"default_reminders": null,
"createdAt": "2026-04-04T10:05:00Z"
}

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.

ParameterTypeRequiredDefaultDescription
includeenum: allNoPass all to include calendars across all agents (org keys only)
limitnumber (1–200)No50Max results to return
offsetnumberNo0Pagination offset

User: “List all my calendars”

Tool call:

{
"name": "list_calendars",
"arguments": {
"include": "all"
}
}

Response:

{
"data": [
{
"id": "cal_x1y2z3",
"agentId": "agt_e5f6g7h8",
"name": "Sales Calendar",
"timezone": "America/New_York"
}
],
"total": 1,
"limit": 50,
"offset": 0
}

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.

ParameterTypeRequiredDescription
calendar_idstringYesCalendar ID to fetch

User: “Show me the sales calendar”

Tool call:

{
"name": "get_calendar",
"arguments": {
"calendar_id": "cal_x1y2z3"
}
}

Response:

{
"id": "cal_x1y2z3",
"agentId": "agt_e5f6g7h8",
"name": "Sales Calendar",
"timezone": "America/New_York",
"agent_status": "working",
"default_reminders": [10]
}

Update a calendar’s name, timezone, agent status, default reminders, or metadata. Agent-scoped keys may only update calendars owned by their agent.

ParameterTypeRequiredDescription
calendar_idstringYesCalendar ID to update
namestring (1–255)NoNew calendar name
timezonestring (IANA)NoNew IANA timezone (e.g. America/New_York)
agent_statusenum: idle, working, waiting, errorNoOwning agent’s status
default_remindersarray of number (1–40320) | nullNoDefault reminder offsets in minutes; null for system default, [] for none
metadataobjectNoArbitrary metadata (max 16KB)

User: “Set my sales agent’s status to working”

Tool call:

{
"name": "update_calendar",
"arguments": {
"calendar_id": "cal_x1y2z3",
"agent_status": "working"
}
}

Response:

{
"id": "cal_x1y2z3",
"name": "Sales Calendar",
"timezone": "America/New_York",
"agent_status": "working"
}

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.

ParameterTypeRequiredDescription
calendar_idstringYesCalendar ID to delete

User: “Delete the old sales calendar”

Tool call:

{
"name": "delete_calendar",
"arguments": {
"calendar_id": "cal_x1y2z3"
}
}

Response:

{
"deleted": true,
"id": "cal_x1y2z3"
}

Create an event on a calendar.

ParameterTypeRequiredDescription
calendar_idstringYesTarget calendar ID (cal_ prefix)
titlestringYesEvent title
start_timestring (ISO 8601)YesEvent start time, e.g. 2026-04-07T14:00:00Z
end_timestring (ISO 8601)YesEvent end time
descriptionstringNoEvent description or notes
all_daybooleanNoSet to true for all-day events

User: “Schedule a 30-minute demo call for next Monday at 2pm UTC”

Tool call:

{
"name": "create_event",
"arguments": {
"calendar_id": "cal_x1y2z3",
"title": "Demo Call",
"start_time": "2026-04-07T14:00:00Z",
"end_time": "2026-04-07T14:30:00Z",
"description": "Product demo for prospective client"
}
}

Response:

{
"id": "evt_m1n2o3",
"calendarId": "cal_x1y2z3",
"title": "Demo Call",
"startTime": "2026-04-07T14:00:00Z",
"endTime": "2026-04-07T14:30:00Z",
"description": "Product demo for prospective client",
"status": "confirmed",
"createdAt": "2026-04-04T10:10:00Z"
}

List events on a calendar with optional time-range filtering.

ParameterTypeRequiredDefaultDescription
calendar_idstringYesCalendar ID to query
start_afterstring (ISO 8601)NoOnly events starting after this time
start_beforestring (ISO 8601)NoOnly events starting before this time
limitnumber (1–200)No50Maximum results to return
offsetnumberNo0Pagination offset

User: “What meetings do I have next week?”

Tool call:

{
"name": "list_events",
"arguments": {
"calendar_id": "cal_x1y2z3",
"start_after": "2026-04-06T00:00:00Z",
"start_before": "2026-04-13T00:00:00Z"
}
}

Response:

{
"data": [
{
"id": "evt_m1n2o3",
"title": "Demo Call",
"startTime": "2026-04-07T14:00:00Z",
"endTime": "2026-04-07T14:30:00Z",
"status": "confirmed"
},
{
"id": "evt_p4q5r6",
"title": "Team Standup",
"startTime": "2026-04-08T09:00:00Z",
"endTime": "2026-04-08T09:15:00Z",
"status": "confirmed"
}
],
"total": 2,
"limit": 50,
"offset": 0
}

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.

ParameterTypeRequiredDescription
event_idstringYesEvent ID to retrieve
calendar_idstringNoCalendar ID that owns the event. Optional — if omitted the calendar is resolved from the event.

User: “Show me the details of my demo call”

Tool call:

{
"name": "get_event",
"arguments": {
"event_id": "evt_m1n2o3"
}
}

Response:

{
"id": "evt_m1n2o3",
"calendarId": "cal_x1y2z3",
"title": "Demo Call",
"startTime": "2026-04-07T14:00:00Z",
"endTime": "2026-04-07T14:30:00Z",
"status": "confirmed"
}

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.

ParameterTypeRequiredDescription
event_idstringYesEvent ID to update
calendar_idstringNoCalendar ID that owns the event. Optional — if omitted the calendar is resolved from the event.
titlestring (1–500)NoNew event title
descriptionstring | nullNoNew description, or null to clear it
start_timestring (ISO 8601)NoNew start time
end_timestring (ISO 8601)NoNew end time
all_daybooleanNoWhether this is an all-day event
statusenum: confirmed, tentative, cancelledNoNew event status
metadataobjectNoReplacement metadata object
remindersarray of number (1–40320) | nullNoReminder offsets in minutes before start_time. Omit to leave unchanged, null to inherit the calendar default, [] for no reminders.

At least one field beyond event_id / calendar_id must be supplied.

User: “Move my demo call to 3pm UTC”

Tool call:

{
"name": "update_event",
"arguments": {
"event_id": "evt_m1n2o3",
"start_time": "2026-04-07T15:00:00Z",
"end_time": "2026-04-07T15:30:00Z"
}
}

Response:

{
"id": "evt_m1n2o3",
"calendarId": "cal_x1y2z3",
"title": "Demo Call",
"startTime": "2026-04-07T15:00:00Z",
"endTime": "2026-04-07T15:30:00Z",
"status": "confirmed"
}

Cancel an event. The event is marked as cancelled rather than deleted, preserving history.

ParameterTypeRequiredDescription
event_idstringYesEvent to cancel (evt_ prefix)
calendar_idstringNoCalendar the event belongs to. Optional — if omitted, the calendar is resolved from the event (matching the behavior of confirm_event / release_event). Provide it to fail fast on cross-calendar typos.

User: “Cancel my demo call on Monday”

Tool call:

{
"name": "cancel_event",
"arguments": {
"calendar_id": "cal_x1y2z3",
"event_id": "evt_m1n2o3"
}
}

Response:

{
"cancelled": true,
"id": "evt_m1n2o3"
}

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.

ParameterTypeRequiredDescription
event_idstringYesEvent ID of the hold to confirm (evt_ prefix)

User: “Lock in the 2 pm demo slot I placed a hold on”

Tool call:

{
"name": "confirm_event",
"arguments": {
"event_id": "evt_h1a2b3c4"
}
}

Response:

{
"id": "evt_h1a2b3c4",
"status": "confirmed",
"holdExpiresAt": null,
"startTime": "2026-04-05T14:00:00Z",
"endTime": "2026-04-05T14:30:00Z"
}

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.

ParameterTypeRequiredDescription
event_idstringYesEvent ID of the hold to release (evt_ prefix)

User: “Never mind, release that 2 pm hold”

Tool call:

{
"name": "release_event",
"arguments": {
"event_id": "evt_h1a2b3c4"
}
}

Response:

{
"released": true,
"id": "evt_h1a2b3c4"
}

Query available time slots for a single agent across all their calendars.

ParameterTypeRequiredDefaultDescription
agent_idstringYesAgent to check availability for
startstring (ISO 8601)Yes¹Start of the query window. Alias: start_time.
endstring (ISO 8601)Yes¹End of the query window. Alias: end_time.
slot_durationenum: 15m, 30m, 45m, 1h, 2hNo30mDuration of each available slot
include_busybooleanNofalseInclude busy periods in the response

¹ Use either start/end (canonical — matches the availability service) or start_time/end_time (aliases — match the REST events schema). Mixing forms is allowed; the canonical name wins.

User: “When is my support agent free tomorrow afternoon for a 1-hour meeting?”

Tool call:

{
"name": "get_availability",
"arguments": {
"agent_id": "agt_a1b2c3d4",
"start": "2026-04-05T12:00:00Z",
"end": "2026-04-05T18:00:00Z",
"slot_duration": "1h"
}
}

Response:

{
"agents": ["agt_a1b2c3d4"],
"slots": [
{ "start": "2026-04-05T12:00:00Z", "end": "2026-04-05T13:00:00Z" },
{ "start": "2026-04-05T13:00:00Z", "end": "2026-04-05T14:00:00Z" },
{ "start": "2026-04-05T15:00:00Z", "end": "2026-04-05T16:00:00Z" },
{ "start": "2026-04-05T16:00:00Z", "end": "2026-04-05T17:00:00Z" }
]
}

Find overlapping free slots across multiple agents — ideal for scheduling group meetings.

ParameterTypeRequiredDefaultDescription
agentsarray of stringsYes¹Agent IDs to check (minimum 2). Alias: agent_ids.
startstring (ISO 8601)Yes¹Start of the query window. Alias: start_time.
endstring (ISO 8601)Yes¹End of the query window. Alias: end_time.
slot_durationenum: 15m, 30m, 45m, 1h, 2hNo30mDuration of each slot
calendarsarray of stringsNoLimit to specific calendars (default: all calendars for each agent)
include_busybooleanNofalseInclude per-agent busy periods

¹ agents/start/end are the canonical names. agent_ids/start_time/end_time are accepted as aliases for clients written against the REST/scheduling-proposal naming. The canonical name wins if both are supplied.

User: “Find a 30-minute slot next week where both my sales agent and support agent are free”

Tool call:

{
"name": "find_meeting_time",
"arguments": {
"agents": ["agt_a1b2c3d4", "agt_e5f6g7h8"],
"start": "2026-04-06T09:00:00Z",
"end": "2026-04-10T17:00:00Z",
"slot_duration": "30m"
}
}

Response:

{
"agents": ["agt_a1b2c3d4", "agt_e5f6g7h8"],
"slots": [
{ "start": "2026-04-06T10:00:00Z", "end": "2026-04-06T10:30:00Z" },
{ "start": "2026-04-06T11:00:00Z", "end": "2026-04-06T11:30:00Z" },
{ "start": "2026-04-07T09:00:00Z", "end": "2026-04-07T09:30:00Z" },
{ "start": "2026-04-07T15:00:00Z", "end": "2026-04-07T15:30:00Z" }
]
}

Subscribe an agent’s calendar to an external iCal feed. Chronary will periodically sync events from the external URL into the agent’s calendar.

ParameterTypeRequiredDescription
agent_idstringYesAgent that owns the target calendar
calendar_idstringYesCalendar to subscribe to the external feed. Must be agent-owned.
urlstring (HTTPS)YesURL of the external .ics feed
labelstringNoDisplay label for this subscription

User: “Subscribe my sales agent’s calendar to our company holiday calendar”

Tool call:

{
"name": "subscribe_ical",
"arguments": {
"agent_id": "agt_e5f6g7h8",
"calendar_id": "cal_x1y2z3",
"url": "https://company.example.com/holidays.ics",
"label": "Company Holidays"
}
}

Response:

{
"id": "ics_k1l2m3",
"agent_id": "agt_e5f6g7h8",
"calendar_id": "cal_x1y2z3",
"url": "https://company.example.com/holidays.ics",
"label": "Company Holidays",
"status": "active",
"last_synced_at": null,
"created_at": "2026-04-04T10:15:00Z"
}

List an agent’s external iCal feed subscriptions (e.g. linked Google Calendar / Outlook feeds), including their sync status and last sync time.

ParameterTypeRequiredDefaultDescription
agent_idstringYesAgent ID whose iCal subscriptions to list
statusenum: active, error, pausedNoFilter by subscription status
limitnumber (1–200)No50Max results to return
offsetnumberNo0Pagination offset

User: “List my sales agent’s external calendar feeds”

Tool call:

{
"name": "list_ical_subscriptions",
"arguments": {
"agent_id": "agt_e5f6g7h8"
}
}

Response:

{
"data": [
{
"id": "ics_k1l2m3",
"calendar_id": "cal_x1y2z3",
"label": "Company Holidays",
"status": "active",
"last_synced_at": "2026-04-04T10:30:00Z"
}
],
"total": 1,
"limit": 50,
"offset": 0
}

Get a single external iCal feed subscription by id, including its sync status, last sync time, and last error.

ParameterTypeRequiredDescription
subscription_idstringYesiCal subscription ID to fetch

User: “Show me the company holidays feed”

Tool call:

{
"name": "get_ical_subscription",
"arguments": {
"subscription_id": "ics_k1l2m3"
}
}

Response:

{
"id": "ics_k1l2m3",
"calendar_id": "cal_x1y2z3",
"url": "https://company.example.com/holidays.ics",
"label": "Company Holidays",
"status": "active",
"last_synced_at": "2026-04-04T10:30:00Z",
"last_error": null
}

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.

ParameterTypeRequiredDescription
subscription_idstringYesiCal subscription ID to update
labelstring (1–255)NoNew label for this subscription
urlstring (HTTPS)NoNew HTTPS URL of the iCal feed (.ics)

At least one of label or url must be supplied.

User: “Rename the holidays feed to 2026 Holidays”

Tool call:

{
"name": "update_ical_subscription",
"arguments": {
"subscription_id": "ics_k1l2m3",
"label": "2026 Holidays"
}
}

Response:

{
"id": "ics_k1l2m3",
"calendar_id": "cal_x1y2z3",
"label": "2026 Holidays",
"status": "active"
}

Delete an external iCal feed subscription. Events previously synced from the feed are no longer refreshed.

ParameterTypeRequiredDescription
subscription_idstringYesiCal subscription ID to delete

User: “Remove the company holidays feed”

Tool call:

{
"name": "delete_ical_subscription",
"arguments": {
"subscription_id": "ics_k1l2m3"
}
}

Response:

{
"deleted": true,
"id": "ics_k1l2m3"
}

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.

ParameterTypeRequiredDescription
subscription_idstringYesiCal subscription ID to sync

User: “Sync the company holidays feed now”

Tool call:

{
"name": "sync_ical_subscription",
"arguments": {
"subscription_id": "ics_k1l2m3"
}
}

Response:

{
"status": "syncing"
}

Fetch a calendar’s temporal context in one call — the current event, next upcoming event, recent past events, a short upcoming window, and the owning agent’s agent_status. Use this to answer “what is this agent doing right now?” without issuing multiple list_events queries.

ParameterTypeRequiredDescription
calendar_idstringYesCalendar to inspect

User: “What is the support agent up to right now?”

Tool call:

{
"name": "get_calendar_context",
"arguments": { "calendar_id": "cal_x1y2z3" }
}

Response (shape follows the REST /v1/calendars/:id/context response):

{
"calendar_id": "cal_x1y2z3",
"now": "2026-04-24T14:30:00.000Z",
"agent_status": "working",
"current_event": { "id": "evt_a1", "title": "Customer call", "endTime": "2026-04-24T15:00:00Z" },
"next_event": { "id": "evt_a2", "startTime": "2026-04-24T15:30:00Z" },
"recent_events": [],
"upcoming": []
}

Send a set of candidate time slots to one or more participant agents so they can accept, decline, or counter-propose. 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.

ParameterTypeRequiredDescription
titlestringYesShort description of the meeting
descriptionstringNoLonger context / agenda
organizer_agent_idstringYesAgent proposing the meeting
participant_agent_idsstring[]YesInvited agents (1–50)
calendar_idstringYesCalendar the resolved event lands on
slotsarrayYesCandidate time slots (1–20). Each: { start_time, end_time, weight?, calendar_id? }
expires_atstring (ISO-8601)NoAuto-cancel cutoff if unresolved

Fires proposal.created on the webhook stream.


List scheduling proposals for the current org. Filter by status or organizer agent, and page through results with limit and offset. Requires an org-level API key. Pro plan only.

ParameterTypeRequiredDescription
statuspending|confirmed|expired|cancelledNoFilter proposals by lifecycle state
organizer_agent_idstringNoFilter to proposals created by one agent
limitintegerNoPage size, 1-200. Default 50
offsetintegerNoPage offset. Default 0

Fetch a scheduling proposal with its candidate slots and participant responses. Use this before respond_to_proposal to find a selected_slot_id. Requires an org-level API key. Pro plan only.

ParameterTypeRequiredDescription
proposal_idstringYesProposal to fetch

Submit a response on behalf of one participant agent. An accept requires the slot id from the proposal; a counter can suggest alternative slots. When all participants have responded the proposal auto-resolves. Requires an org-level API key. Pro plan only.

ParameterTypeRequiredDescription
proposal_idstringYesProposal to respond to
agent_idstringYesParticipant agent responding
responseaccept|decline|counterYesDecision
selected_slot_idstringWhen acceptSlot the agent is accepting
counter_slotsarrayWhen counterAlternative slots (up to 20)
messagestringNoOptional note for the organizer

Response includes auto_resolved: "confirmed", "cancelled", or null.


Force-resolve an open proposal using responses collected so far — picks the highest-scoring slot accepted by the most participants and creates a confirmed 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.

ParameterTypeRequiredDescription
proposal_idstringYesProposal to resolve

Response is either { status: "confirmed", resolved_slot } or { status: "cancelled", reason: "all_declined" }.


Cancel an open proposal. Fires proposal.cancelled with reason: "organizer_cancelled". Requires an org-level API key. Pro plan only.

ParameterTypeRequiredDescription
proposal_idstringYesProposal to cancel

Set (or replace) the availability rules on a calendar — buffer times before/after events and optional per-day working hours. Once set, every availability query on this calendar automatically applies them: busy blocks expand by the buffers, and slots outside working hours are masked. Upsert semantics — overwrites any existing rules.

ParameterTypeRequiredDescription
calendar_idstringYesCalendar to configure
buffer_before_minutesinteger (0–120)NoBuffer before each event. Default 0.
buffer_after_minutesinteger (0–120)NoBuffer after each event. Default 0.
working_hoursobject | nullNoPer-day map { mon: { start: "09:00", end: "17:00" }, ... }. Pass null to disable the mask.
timezonestringNoIANA timezone used to interpret working_hours. Default UTC.

Read the buffer times and working-hours rules configured on a calendar. Returns the rules row, or not_found if none are set.

ParameterTypeRequiredDescription
calendar_idstringYesCalendar to read

Remove the availability rules from a calendar, reverting to the default (no buffers, no working-hours mask). Returns the deleted row, or not_found if none were set.

ParameterTypeRequiredDescription
calendar_idstringYesCalendar whose rules should be cleared

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.

ParameterTypeRequiredDescription
urlstring (HTTPS)YesHTTPS endpoint that will receive event deliveries
eventsarray of stringYesEvent types to subscribe to (minimum 1)

User: “Send me a webhook whenever an event is created or cancelled”

Tool call:

{
"name": "create_webhook",
"arguments": {
"url": "https://example.com/hooks/chronary",
"events": ["event.created", "event.cancelled"]
}
}

Response:

{
"id": "whk_a1b2c3",
"url": "https://example.com/hooks/chronary",
"events": ["event.created", "event.cancelled"],
"active": true,
"createdAt": "2026-04-04T10:20:00Z",
"secret": "whsec_xxxxxxxxxxxxxxxx"
}

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.

ParameterTypeRequiredDefaultDescription
limitnumber (1–100)No20Max results to return
offsetnumberNo0Pagination offset

User: “List my webhook subscriptions”

Tool call:

{
"name": "list_webhooks",
"arguments": {}
}

Response:

{
"data": [
{
"id": "whk_a1b2c3",
"url": "https://example.com/hooks/chronary",
"events": ["event.created", "event.cancelled"],
"active": true
}
],
"total": 1,
"limit": 20,
"offset": 0
}

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.

ParameterTypeRequiredDescription
webhook_idstringYesWebhook subscription to fetch

User: “Show me my event-created webhook”

Tool call:

{
"name": "get_webhook",
"arguments": {
"webhook_id": "whk_a1b2c3"
}
}

Response:

{
"id": "whk_a1b2c3",
"url": "https://example.com/hooks/chronary",
"events": ["event.created", "event.cancelled"],
"active": true
}

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.

ParameterTypeRequiredDescription
webhook_idstringYesWebhook subscription to update
urlstring (HTTPS)NoNew HTTPS delivery endpoint
eventsarray of stringNoReplacement set of event types to subscribe to (minimum 1)
activebooleanNoSet false to pause deliveries, true to resume

User: “Pause my webhook for now”

Tool call:

{
"name": "update_webhook",
"arguments": {
"webhook_id": "whk_a1b2c3",
"active": false
}
}

Response:

{
"id": "whk_a1b2c3",
"url": "https://example.com/hooks/chronary",
"events": ["event.created", "event.cancelled"],
"active": false
}

Permanently delete a webhook subscription. This frees its endpoint slot against the per-plan cap. Requires an org-level API key.

ParameterTypeRequiredDescription
webhook_idstringYesWebhook subscription to delete

User: “Delete my old webhook”

Tool call:

{
"name": "delete_webhook",
"arguments": {
"webhook_id": "whk_a1b2c3"
}
}

Response:

{
"deleted": true,
"id": "whk_a1b2c3"
}

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.

ParameterTypeRequiredDefaultDescription
webhook_idstringYesWebhook subscription whose deliveries to list
limitnumber (1–100)No20Max results to return
offsetnumberNo0Pagination offset
statusenum: pending, delivered, failedNoFilter to a single delivery status
include_payloadbooleanNofalseInclude the full event payload sent on each delivery

User: “Show me the failed deliveries for my webhook”

Tool call:

{
"name": "list_webhook_deliveries",
"arguments": {
"webhook_id": "whk_a1b2c3",
"status": "failed"
}
}

Response:

{
"data": [
{
"id": "whd_x9y8z7",
"subscription_id": "whk_a1b2c3",
"event_type": "event.created",
"status": "failed",
"attempts": 3,
"last_attempt_at": "2026-04-04T10:25:00Z",
"next_retry_at": null,
"created_at": "2026-04-04T10:20:00Z"
}
],
"total": 13,
"limit": 20,
"offset": 0,
"stats": { "pending": 0, "delivered": 12, "failed": 1 }
}

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.

ParameterTypeRequiredDescription
agent_idstring (agt_ prefix)YesAgent ID this key is scoped to
labelstring (1–100)NoHuman-readable label for the key

User: “Create a scoped key for my support agent”

Tool call:

{
"name": "create_scoped_key",
"arguments": {
"agent_id": "agt_a1b2c3d4",
"label": "Support agent runtime"
}
}

Response:

{
"id": "key_p1q2r3",
"key_prefix": "chr_ak_0A1B2C3D",
"agent_id": "agt_a1b2c3d4",
"label": "Support agent runtime",
"key": "chr_ak_xxxxxxxxxxxxxxxxxxxx",
"created_at": "2026-04-04T10:35:00Z"
}

List all live (non-revoked) agent-scoped API keys for this org. Returns key metadata only (id, key_prefix, agent_id, label, created_at) — never the plaintext secret. Requires an org-level API key.

This tool takes no parameters.

User: “List my scoped API keys”

Tool call:

{
"name": "list_scoped_keys",
"arguments": {}
}

Response:

{
"keys": [
{
"id": "key_p1q2r3",
"key_prefix": "chr_ak_0A1B2C3D",
"agent_id": "agt_a1b2c3d4",
"label": "Support agent runtime",
"created_at": "2026-04-04T10:35:00Z"
}
]
}

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.

ParameterTypeRequiredDescription
key_idstringYesID of the scoped key to revoke

User: “Revoke the support agent’s key”

Tool call:

{
"name": "revoke_scoped_key",
"arguments": {
"key_id": "key_p1q2r3"
}
}

Response:

{
"revoked": true,
"id": "key_p1q2r3"
}

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.

This tool takes no parameters.

User: “How much of my quota have I used this month?”

Tool call:

{
"name": "get_usage",
"arguments": {}
}

Response:

{
"period_start": "2026-04-01T00:00:00.000Z",
"period_end": "2026-05-01T00:00:00.000Z",
"plan": "free",
"agents": { "used": 2, "limit": 5 },
"events": { "used": 140, "limit": 1000 },
"api_calls": { "used": 3200, "limit": 10000 }
}

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.

ParameterTypeRequiredDefaultDescription
fromstring (ISO 8601)NoStart of the window. Silently clamped to the plan retention window if older.
tostring (ISO 8601)NoEnd of the window
actionstring (1–64)NoFilter by action name (e.g. event.created)
actor_key_prefixstring (1–32)NoFilter by the API key prefix that performed the action
cursorstring (1–256)NoOpaque pagination cursor from a previous response
limitnumber (1–200)No50Max results to return

User: “Show me everything that’s happened to my events recently”

Tool call:

{
"name": "get_audit_log",
"arguments": {
"action": "event.created",
"limit": 50
}
}

Response:

{
"data": [
{
"id": "aud_a1b2c3",
"action": "event.created",
"actor_key_prefix": "chr_sk_abcdef12345678",
"created_at": "2026-04-04T10:10:00Z"
}
],
"pagination": { "next_cursor": null },
"retention_days": 3,
"range_clamped": false
}

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.

ParameterTypeRequiredDescription
tos_versionstringYesThe terms-of-service version to accept; must match the current version

User: “Accept the latest terms of service”

Tool call:

{
"name": "accept_terms",
"arguments": {
"tos_version": "2026-04-01"
}
}

Response:

{
"accepted": true,
"tos_version": "2026-04-01",
"accepted_at": "2026-04-04T10:40:00Z"
}

ToolPurposeKey parameters
create_agentRegister agentname, type
list_agentsList/filter agentstype, status, limit
get_agentFetch one agentagent_id
update_agentUpdate agentagent_id, name, status
delete_agentDecommission agentagent_id
create_calendarCreate calendarname, timezone, agent_id
list_calendarsList calendarsinclude, limit
get_calendarFetch one calendarcalendar_id
update_calendarUpdate calendarcalendar_id, name, timezone, agent_status
delete_calendarDelete calendarcalendar_id
create_eventSchedule eventcalendar_id, title, start_time, end_time
list_eventsList/filter eventscalendar_id, start_after, start_before
get_eventFetch one eventevent_id, calendar_id
update_eventReschedule/edit eventevent_id, start_time, end_time
cancel_eventCancel eventcalendar_id, event_id
confirm_eventPromote hold to confirmedevent_id
release_eventRelease a hold earlyevent_id
get_availabilitySingle-agent free slotsagent_id, start, end, slot_duration
find_meeting_timeCross-agent free slotsagents, start, end, slot_duration
subscribe_icalSubscribe to external iCalagent_id, calendar_id, url
list_ical_subscriptionsList iCal subscriptionsagent_id, status, limit
get_ical_subscriptionFetch one iCal subscriptionsubscription_id
update_ical_subscriptionUpdate iCal subscriptionsubscription_id, label, url
delete_ical_subscriptionDelete iCal subscriptionsubscription_id
sync_ical_subscriptionForce immediate iCal syncsubscription_id
get_calendar_contextCurrent + upcoming contextcalendar_id
create_proposalOpen a multi-agent scheduling proposalorganizer_agent_id, participant_agent_ids, calendar_id, slots
list_proposalsList scheduling proposalsstatus, organizer_agent_id, limit
get_proposalFetch a scheduling proposalproposal_id
respond_to_proposalParticipant responseproposal_id, agent_id, response
resolve_proposalForce-resolve a pending proposalproposal_id
cancel_proposalCancel a pending proposalproposal_id
set_availability_rulesConfigure buffers + working hourscalendar_id, buffer_before_minutes, buffer_after_minutes, working_hours
get_availability_rulesRead configured rulescalendar_id
clear_availability_rulesRemove rulescalendar_id
create_webhookCreate webhook subscriptionurl, events
list_webhooksList webhook subscriptionslimit, offset
get_webhookFetch one webhookwebhook_id
update_webhookUpdate webhookwebhook_id, url, events, active
delete_webhookDelete webhookwebhook_id
list_webhook_deliveriesList delivery attemptswebhook_id, status, include_payload
create_scoped_keyCreate agent-scoped keyagent_id, label
list_scoped_keysList scoped keysnone
revoke_scoped_keyRevoke a scoped keykey_id
get_usageCurrent-period usage + limitsnone
get_audit_logList audit-log entriesfrom, to, action, limit
accept_termsRe-accept current ToStos_version