Calendar and series

MCP and CLI operations to list, schedule, prepare, move, snooze, skip and cancel planned meetings, and to manage session series and their schedules.

Calendar operations work with planned meetings (occurrences), the same ones the app's calendar and Prepare page show. Series operations manage session series and their schedules. Most of these operations are on by default in MCP Access. Assistants can plan and prepare meetings, but recording always starts in the app. Every operation also takes an optional workspaceId. See How to read this reference for the conventions.

OperationKindToolOnGroup
calendar.upcomingReadtalkbar_readOnmetadata
calendar.getReadtalkbar_readOnmetadata
calendar.prepReadtalkbar_readOncontent
calendar.actionableReadtalkbar_readOnmetadata
calendar.scheduleWritetalkbar_changeOnscheduling
calendar.prepareWritetalkbar_changeOnscheduling
calendar.prep.editWritetalkbar_changeOnscheduling
calendar.moveWritetalkbar_changeOnscheduling
calendar.snoozeWritetalkbar_changeOnscheduling
calendar.cancelWritetalkbar_deleteOnscheduling
calendar.skipWritetalkbar_deleteOnscheduling
calendar.startWritetalkbar_changeOnscheduling
calendar.tickWritetalkbar_changeOffscheduling
series.listReadtalkbar_readOnmetadata
series.getReadtalkbar_readOnmetadata
series.kinds.listReadtalkbar_readOnmetadata
series.schedule.getReadtalkbar_readOnmetadata
series.createWritetalkbar_changeOnscheduling
series.updateWritetalkbar_changeOnscheduling
series.archiveWritetalkbar_deleteOnscheduling
series.sessions.assignWritetalkbar_changeOnscheduling
series.schedule.setWritetalkbar_changeOnscheduling

Meeting statuses

A meeting is planned, started, completed, missed, skipped, cancelled or unscheduled. Times are epoch milliseconds.

calendar.upcoming

Lists standalone and series meetings in a time window, soonest first, in pages.

Read · runs with talkbar_read · MCP switch On by default · policy group metadata

Arguments

startAtMsrequired
integer

Window start, epoch ms. Meetings that overlap the window are listed.

endAtMsrequired
integer

Window end, epoch ms. Must not be before startAtMs.

includeArchived
boolean

Also list the planned meetings of archived series, which the app's calendar hides. Default false.

statuses
string[]

Which meetings to list. Values: planned, started, completed, missed, skipped, cancelled. Empty or left out: planned, started, completed and missed.

limit
integer

How many to return. From 1 to 500. Default 100.

offset
integer

nextOffset from the previous page.

Returns: {occurrences, nextOffset}. Rows are meetings as calendar.get returns them, except that prepared: true/false replaces the setup itself (read it with calendar.get or calendar.prep).

{"tool": "calendar.upcoming", "args": {"startAtMs": 1761955200000, "endAtMs": 1762560000000}}

calendar.get

Reads one planned meeting.

Read · runs with talkbar_read · MCP switch On by default · policy group metadata

Arguments

occurrenceIdrequired
string

The planned meeting, from calendar.upcoming.

Returns: The meeting (occurrence): occurrenceId, seriesId, scheduleId, plannedStartAtMs, originalStartAtMs, durationMinutes, timezone, status, sessionId, title, preparedSetupJson (the saved start setup, as a JSON string), reminderOffsetsMinutes, startMode, autoStartCountdownSeconds, moved, wasScheduled (false for a meeting prepared without a planned time), sessionTitle (the linked session's name, once it has one), quiet (muted in the app: shown on the calendar, but never reminded or started automatically), createdAt, updatedAt.

{"tool": "calendar.get", "args": {"occurrenceId": "occ_1"}}

calendar.prep

Reads what the app's Prepare page shows for a meeting: prep notes, the cards and documents it starts with, the action items it brings in, and the series' previous session.

Read · runs with talkbar_read · MCP switch On by default · policy group content

Arguments

occurrenceIdrequired
string

The planned meeting, from calendar.upcoming.

Returns: occurrenceId, title, status, plannedStartAtMs, durationMinutes, seriesId, sessionId, prepared, preparable, projectId, sessionTemplateId, notes ([{noteId, title, preview, updatedAt}]), cards ([{memoryId, title, type, status}]), documents, actionItems ({carried, carriedOverflow, added, skipped, suggested}) and previousSession ({sessionId, title, startedAtMs, private} or null).

  • Read a prep note with notes.get and the previous session's summary with sessions.get. Prep notes are written in the app.
{"tool": "calendar.prep", "args": {"occurrenceId": "occ_1"}}

calendar.actionable

Lists meeting reminders waiting for Start, Snooze or Skip.

Read · runs with talkbar_read · MCP switch On by default · policy group metadata

Arguments: none besides workspaceId.

Returns: An array of reminders: [{jobId, occurrenceId, offsetMinutes, remindAtMs, status, snoozedUntilMs, createdAt, updatedAt}], soonest first. Read the meeting with calendar.get.

calendar.schedule

Schedules a standalone or series meeting. It never starts recording.

Write · runs with talkbar_change · MCP switch On by default · policy group scheduling

Arguments

occurrenceIdrequired
string

An id you choose for the new meeting. Must be new.

plannedStartAtMsrequired
integer

Start time, epoch ms. A past time is accepted, so a meeting can be logged after it happened.

durationMinutesrequired
integer

Length in minutes. At least 1.

timezonerequired
string

IANA time zone, for example America/New_York.

seriesId
string

Add the meeting to this series. It must be an active (not archived) series.

title
string

The meeting title. 1 to 200 characters.

reminderOffsetsMinutes
integer[]

Minutes before the start to remind you. Up to 6 values, each from 0 to 10,080; duplicates are removed. Default [10].

startMode
string

prompt (ask before starting) or automatic (start after a countdown, in the app). Default prompt.

autoStartCountdownSeconds
integer

Seconds of countdown before an automatic start. From 5 to 300. Default 60.

preparedSetup
object

The start setup the app's meeting prep saves. Fields left out keep the app's defaults. Unknown fields are refused.

  • source: mic, system or both; micDeviceId.
  • sessionTemplateId, projectId, topicIds, memoryIds (knowledge cards), documentIds.
  • summariesEnabled, summaryLanguage (auto or a summary language code), summaryLength (short, standard or detailed), summaryModel ({providerId, modelId}).
  • participants: [{name, contactId}]; each needs a name.
  • memoryMode: normal, session_only, manual_only or sensitive. speakerMode: solo, duo, small or large. privateSession.
  • origin: {name, url}.
  • actionItemIds, skippedActionItemIds: read-only; the meeting keeps the lists it has (change them with calendar.prep.edit).

Templates, projects, people, cards and documents must be in the workspace, and cards must be approved.

Returns: The meeting (occurrence): occurrenceId, seriesId, scheduleId, plannedStartAtMs, originalStartAtMs, durationMinutes, timezone, status, sessionId, title, preparedSetupJson (the saved start setup, as a JSON string), reminderOffsetsMinutes, startMode, autoStartCountdownSeconds, moved, wasScheduled (false for a meeting prepared without a planned time), sessionTitle (the linked session's name, once it has one), quiet (muted in the app: shown on the calendar, but never reminded or started automatically), createdAt, updatedAt. Its status is planned.

  • Creates reminders as the app does. A duplicate occurrenceId is refused with failed.
{"tool": "calendar.schedule", "args": {"occurrenceId": "occ_weekly_sync_1107", "plannedStartAtMs": 1762531200000, "durationMinutes": 30, "timezone": "America/New_York", "title": "Weekly sync"}}

calendar.prepare

Changes a meeting's title, start setup, reminders or start mode. Fields left out keep their values.

Write · runs with talkbar_change · MCP switch On by default · policy group scheduling

Arguments

occurrenceIdrequired
string

The planned meeting, from calendar.upcoming.

title
string | null

The new title, 1 to 200 characters, or null to clear it.

reminderOffsetsMinutes
integer[]

Minutes before the start to remind you. Up to 6 values, each from 0 to 10,080.

startMode
string

prompt or automatic.

autoStartCountdownSeconds
integer

Seconds of countdown before an automatic start. From 5 to 300.

preparedSetup
object

The start setup, as for calendar.schedule. When given, it replaces the stored setup as a whole: read it with calendar.get, change it, and send it all back. null clears it.

Returns: The meeting (occurrence): occurrenceId, seriesId, scheduleId, plannedStartAtMs, originalStartAtMs, durationMinutes, timezone, status, sessionId, title, preparedSetupJson (the saved start setup, as a JSON string), reminderOffsetsMinutes, startMode, autoStartCountdownSeconds, moved, wasScheduled (false for a meeting prepared without a planned time), sessionTitle (the linked session's name, once it has one), quiet (muted in the app: shown on the calendar, but never reminded or started automatically), createdAt, updatedAt.

  • Works on planned, missed and unscheduled meetings; others are refused with failed. Preparing a missed meeting makes it planned again.
  • A meeting whose start has passed always gets prompt.
{"tool": "calendar.prepare", "args": {"occurrenceId": "occ_1", "title": "Northwind kickoff", "reminderOffsetsMinutes": [15, 5]}}

calendar.prep.edit

Adds or removes the knowledge cards, documents and action items from other meetings that a meeting starts with, or skips a carried-over action item, as the app's Prepare page does. Every edit applies, or none does.

Write · runs with talkbar_change · MCP switch On by default · policy group scheduling

Arguments

occurrenceIdrequired
string

The planned meeting, from calendar.upcoming.

editsrequired
object[]

The changes, 1 to 50. Each is {kind, id, add}:

  • kind: memory (a knowledge card), document, actionItem (a task, follow-up or question from another meeting) or skippedActionItem (a carried-over item to leave out of this meeting).
  • id: the item's id.
  • add: true adds (or skips); false removes (or brings a skipped item back).

Returns: The meeting's prep: occurrenceId, prepared, preparable, sessionId, projectId, memoryIds, documentIds, maxMemoryCount, maxDocumentCount, sessionTemplateId, hasContent, draftCount and actionItemCount. calendar.prep shows the lists in full.

  • A wrong id or kind, skipping an item that is not carried over, or an item both added and skipped is refused with invalid_arguments, and nothing changes.
  • A meeting that started, was cancelled or was skipped is refused with failed.
{"tool": "calendar.prep.edit", "args": {"occurrenceId": "occ_1", "edits": [{"kind": "memory", "id": "mem_321", "add": true}, {"kind": "document", "id": "doc_8", "add": true}]}}

calendar.move

Reschedules one meeting and updates its reminders and automatic start. Other meetings of the series are unchanged.

Write · runs with talkbar_change · MCP switch On by default · policy group scheduling

Arguments

occurrenceIdrequired
string

The planned meeting, from calendar.upcoming.

plannedStartAtMsrequired
integer

The new start time, epoch ms. Must be in the future.

Returns: The meeting (occurrence): occurrenceId, seriesId, scheduleId, plannedStartAtMs, originalStartAtMs, durationMinutes, timezone, status, sessionId, title, preparedSetupJson (the saved start setup, as a JSON string), reminderOffsetsMinutes, startMode, autoStartCountdownSeconds, moved, wasScheduled (false for a meeting prepared without a planned time), sessionTitle (the linked session's name, once it has one), quiet (muted in the app: shown on the calendar, but never reminded or started automatically), createdAt, updatedAt. Its status is planned.

  • Works on planned, missed and unscheduled meetings.
{"tool": "calendar.move", "args": {"occurrenceId": "occ_1", "plannedStartAtMs": 1762617600000}}

calendar.snooze

Snoozes a planned meeting's reminder and cancels any automatic start countdown. The meeting stays planned.

Write · runs with talkbar_change · MCP switch On by default · policy group scheduling

Arguments

occurrenceIdrequired
string

The planned meeting, from calendar.upcoming.

snoozedUntilMsrequired
integer

When to remind you again, epoch ms. Must be in the future.

Returns: The meeting (occurrence): occurrenceId, seriesId, scheduleId, plannedStartAtMs, originalStartAtMs, durationMinutes, timezone, status, sessionId, title, preparedSetupJson (the saved start setup, as a JSON string), reminderOffsetsMinutes, startMode, autoStartCountdownSeconds, moved, wasScheduled (false for a meeting prepared without a planned time), sessionTitle (the linked session's name, once it has one), quiet (muted in the app: shown on the calendar, but never reminded or started automatically), createdAt, updatedAt.

  • Only a planned meeting can be snoozed.
  • Snoozing sets the meeting's start mode to prompt.

calendar.cancel

Cancels one planned meeting, with its reminders and automatic start. It does not archive the series.

Write · runs with talkbar_delete · MCP switch On by default · policy group scheduling

Arguments

occurrenceIdrequired
string

The planned meeting, from calendar.upcoming.

Returns: The meeting (occurrence): occurrenceId, seriesId, scheduleId, plannedStartAtMs, originalStartAtMs, durationMinutes, timezone, status, sessionId, title, preparedSetupJson (the saved start setup, as a JSON string), reminderOffsetsMinutes, startMode, autoStartCountdownSeconds, moved, wasScheduled (false for a meeting prepared without a planned time), sessionTitle (the linked session's name, once it has one), quiet (muted in the app: shown on the calendar, but never reminded or started automatically), createdAt, updatedAt. Its status is cancelled.

  • Only a planned meeting can be cancelled; otherwise failed names its current status.
  • Runs with talkbar_delete: confirmed with you when your AI app can ask; apps that cannot ask are refused unless Allow deletes without confirmation is on.

calendar.skip

Skips one planned meeting and cancels its reminders and countdown. The series and its other meetings are unchanged.

Write · runs with talkbar_delete · MCP switch On by default · policy group scheduling

Arguments

occurrenceIdrequired
string

The planned meeting, from calendar.upcoming.

Returns: The meeting (occurrence): occurrenceId, seriesId, scheduleId, plannedStartAtMs, originalStartAtMs, durationMinutes, timezone, status, sessionId, title, preparedSetupJson (the saved start setup, as a JSON string), reminderOffsetsMinutes, startMode, autoStartCountdownSeconds, moved, wasScheduled (false for a meeting prepared without a planned time), sessionTitle (the linked session's name, once it has one), quiet (muted in the app: shown on the calendar, but never reminded or started automatically), createdAt, updatedAt. Its status is skipped.

  • Only a planned meeting can be skipped; otherwise failed names its current status.
  • Runs with talkbar_delete: confirmed with you when your AI app can ask; apps that cannot ask are refused unless Allow deletes without confirmation is on.

calendar.start

Checks whether a meeting can start here. MCP and the CLI never record, so this changes nothing and only explains why the meeting cannot start.

Write · runs with talkbar_change · MCP switch On by default · policy group scheduling

Arguments

occurrenceIdrequired
string

The planned meeting, from calendar.upcoming.

Returns: {intent: null, unavailableReason}. unavailableReason is captureHostUnavailable for a planned meeting and notPlanned otherwise.

  • It does not check whether the app could start the meeting now. Start recording in the app.

calendar.tick

Runs one pass of the meeting scheduler: creates upcoming meetings from series schedules, prepares their reminders, and marks meetings that passed unrecorded as missed. It delivers no notifications and records nothing.

Write · runs with talkbar_change · MCP switch Off by default · policy group scheduling

Arguments

horizonEndMsrequired
integer

Create meetings up to this time, epoch ms. Must not be before nowMs.

nowMsrequired
integer

The time to run the pass for, epoch ms.

limit
integer

Most due items to handle in this pass. From 1 to 100. Default 32.

Returns: An array of automatic-start countdowns that are due: [{kind, intent, occurrence}].

  • The app runs this itself; it is off by default in MCP Access and rarely needed by an assistant.

series.list

Lists session series with counts.

Read · runs with talkbar_read · MCP switch On by default · policy group metadata

Arguments

includeArchived
boolean

Also list archived series.

Returns: An array of series (as series.get returns them) with sessionCount, lastSessionStartedAtMs, nextPlannedAtMs, projectName, customKind and schedule ({enabled, scheduleKind, rrule, localDate, localTime, timezone, durationMinutes} or null).

{"tool": "series.list", "args": {}}

series.get

Reads one session series.

Read · runs with talkbar_read · MCP switch On by default · policy group metadata

Arguments

seriesIdrequired
string

The series, from series.list.

Returns: The series: seriesId, workspaceId, name, kind, customKindId, description, projectId, anchorContactId, templateId, startTemplateJson, archivedAtMs, createdAt, updatedAt.

series.kinds.list

Lists the built-in series types with their suggested templates, the workspace's own series types, and the icons a type may use.

Read · runs with talkbar_read · MCP switch On by default · policy group metadata

Arguments: none besides workspaceId.

Returns: {builtin: [{key, suggestedTemplateId}], custom: [{kindId, name, icon, createdAt, updatedAt}], icons}.

series.schedule.get

Reads a series' schedule, if it has one.

Read · runs with talkbar_read · MCP switch On by default · policy group metadata

Arguments

seriesIdrequired
string

The series, from series.list.

Returns: The schedule or null: scheduleId, seriesId, enabled, scheduleKind, timezone, localDate, localTime, durationMinutes, title, rrule, reminderOffsetsMinutes, startMode, autoStartCountdownSeconds, effectiveFromOriginalStartMs (set when the schedule applies from a given meeting on), createdAt, updatedAt.

series.create

Creates a session series, optionally linked to a project, a person and a template.

Write · runs with talkbar_change · MCP switch On by default · policy group scheduling

Arguments

seriesIdrequired
string

An id you choose for the new series. Must be new.

namerequired
string

The series name. 1 to 120 characters.

kindrequired
string

The series type: oneOnOne, standup, teamMeeting, inPersonMeeting, clientMeeting, phoneCall, interview, hiringInterview, userResearch, salesCall, customerCheckIn, investorCall, legalConsultation, boardMeeting, leadershipSync, coaching, mentoring, workshop, training, brainstorm, retro, presentation, presentationPractice, productLaunch, lecture, class, course, educationalTalk, tutorial, webinar, panelDiscussion, podcast, videoWatching, voiceJournal, speakingPractice or custom.

customKindId
string

With kind: "custom", one of the workspace's own series types (series.kinds.list).

description
string

A description.

projectId
string

The project the series belongs to.

anchorContactId
string

The main person the series is with.

templateId
string

The template its sessions start with.

Returns: The series: seriesId, workspaceId, name, kind, customKindId, description, projectId, anchorContactId, templateId, startTemplateJson, archivedAtMs, createdAt, updatedAt.

  • Sessions stay independent until you assign them with series.sessions.assign. A duplicate seriesId is refused with failed.
{"tool": "series.create", "args": {"seriesId": "ser_dana_1on1", "name": "1:1 with Dana", "kind": "oneOnOne", "anchorContactId": "ct_77"}}

series.update

Changes a series' details. Nullable fields take null to clear them.

Write · runs with talkbar_change · MCP switch On by default · policy group scheduling

Arguments

seriesIdrequired
string

The series, from series.list.

name
string

The new name. 1 to 120 characters.

kind
string

The series type, as for series.create.

customKindId
string | null

One of the workspace's own series types, for kind: "custom". null clears it.

description
string | null

A description. null clears it.

projectId
string | null

The project the series belongs to. null clears it.

anchorContactId
string | null

The main person the series is with. null clears it.

templateId
string | null

The template its sessions start with. null clears it.

Returns: The series: seriesId, workspaceId, name, kind, customKindId, description, projectId, anchorContactId, templateId, startTemplateJson, archivedAtMs, createdAt, updatedAt.

  • Give at least one field. Member sessions are not changed.

series.archive

Archives or restores a series. Its sessions and history are kept.

Write · runs with talkbar_delete · MCP switch On by default · policy group scheduling

Arguments

seriesIdrequired
string

The series, from series.list.

archivedrequired
boolean

true archives, false restores.

Returns: The series: seriesId, workspaceId, name, kind, customKindId, description, projectId, anchorContactId, templateId, startTemplateJson, archivedAtMs, createdAt, updatedAt.

  • Archiving hides the series' planned meetings (from the app calendar, and from calendar.upcoming unless includeArchived is set) and stops their reminders and automatic starts. It does not mark them missed.
  • Restoring brings future meetings back and marks the ones whose time passed while archived as skipped.
  • Archiving an archived series keeps its first archive date.
  • Runs with talkbar_delete: confirmed with you when your AI app can ask; apps that cannot ask are refused unless Allow deletes without confirmation is on.

series.sessions.assign

Moves sessions into a series, or out of their series.

Write · runs with talkbar_change · MCP switch On by default · policy group scheduling

Arguments

sessionIdsrequired
string[]

The sessions to move. At least one. A session named twice counts once.

seriesIdrequired
string | null

The series, or null to take the sessions out of their series. Required.

Returns: {changed}: how many sessions changed.

  • An archived series cannot take new sessions (failed). Unknown sessions and sessions in the Trash are not_found, each one named.
  • Only series membership changes; session content, projects and files are untouched.
{"tool": "series.sessions.assign", "args": {"sessionIds": ["ses_123", "ses_124"], "seriesId": "ser_dana_1on1"}}

series.schedule.set

Creates or replaces a series' one-time or recurring schedule, and creates its upcoming meetings.

Write · runs with talkbar_change · MCP switch On by default · policy group scheduling

Arguments

seriesIdrequired
string

The series, from series.list.

scheduleKindrequired
string

one_time or recurring.

timezonerequired
string

IANA time zone, for example Europe/London.

localDaterequired
string

The first (or only) date, as YYYY-MM-DD.

localTimerequired
string

The start time, as HH:MM.

durationMinutesrequired
integer

Length in minutes. At least 1.

scheduleId
string

A series keeps one schedule. Leave this out (an id is made the first time) or pass the existing schedule's id; a different id is refused.

title
string

A title for the meetings. May be empty.

rrule
string

The recurrence rule, required for recurring and not allowed for one_time. Supports FREQ DAILY, WEEKLY or MONTHLY with INTERVAL, BYDAY, BYMONTHDAY, COUNT and UNTIL, for example FREQ=WEEKLY;BYDAY=TU.

reminderOffsetsMinutes
integer[]

Minutes before the start to remind you. Up to 6 values, each from 0 to 10,080; duplicates are removed. Default [10].

startMode
string

prompt (ask before starting) or automatic (start after a countdown, in the app). Default prompt.

autoStartCountdownSeconds
integer

Seconds of countdown before an automatic start. From 5 to 300. Default 60.

effectiveFromOccurrenceId
string

Change the schedule from this meeting on ("this and following"); earlier meetings keep the old schedule.

horizonEndMs
integer

Create meetings up to this time, epoch ms. Default: 90 days from now.

Returns: The schedule, as series.schedule.get returns it, including its scheduleId.

  • An archived series is refused with failed.
{"tool": "series.schedule.set", "args": {"seriesId": "ser_dana_1on1", "scheduleKind": "recurring", "timezone": "America/New_York", "localDate": "2026-11-03", "localTime": "10:00", "durationMinutes": 30, "rrule": "FREQ=WEEKLY;BYDAY=TU"}}