Browse documentation
Agent-first documentation · 2026-10-13.1 · Updated 2026-10-13 View as Markdown

Import your calendar with an AI agent

Open Calendar → Calendars → Add calendar → Use my AI agent for a request you can copy. Your agent reads a calendar it is authorized to access and sends a private snapshot to Domino. Connecting Domino does not connect your calendar provider, and this is not continuous sync.

Connect and authorize

Agent intake uses Domino's existing MCP/API access rollout. If Agent Access is unavailable for your account, use Google, a calendar link, or screenshot upload from Your calendars.

Connect to https://letsdomino.io/mcp and explicitly select Import private calendar snapshots (calendar:import). This optional permission is unchecked by default. Existing planning-write and wildcard grants do not acquire it. Reconnect if an old authorization did not request this scope. No planning, RSVP or external-commit permission is required for a calendar-only connection.

  • Codex: use its MCP settings and a dedicated Domino Agent Access token with only calendar:import. Store the token in protected environment/secret configuration, never in a chat or URL. See Codex MCP configuration and Domino token management.
  • Claude Mac app: open Customize → Connectors and add a custom remote connector for the MCP URL above. Use Register automatically if the client offers an OAuth identity choice; Domino supports that registration flow. Continue through Domino sign-in and explicitly select the calendar permission. Enable the connector in your conversation. See Domino OAuth setup and Claude's connector guide.
  • Claude Code: not tested for this release. General MCP support does not establish this calendar workflow's acceptance.

Configuration is not verification. The authenticated connection must list domino_prepare_calendar_import, domino_get_calendar_import, domino_commit_calendar_import and domino_remove_calendar_import. Calendar sources vary by client: connect your provider separately or supply a calendar export you are allowed to use. If the agent has no source, it must ask for one or suggest Domino's screenshot flow.

Send a request

Send my calendar for the full next 90 days to Domino using the bulk import. Send the original calendar JSON or ICS without rewriting each event. Keep readable details private, include the actual queried window and when it was checked, and tell me if any calendars or pages are missing. Give me the Calendar link immediately; Domino can process and save it in the background. Do not create provider events or send invitations.

Read calendars in bulk and run independent reads together where supported. Follow all result pages, then prepare the combined snapshot once and commit it. The commit response is the receipt; a separate status read is only needed when the outcome is uncertain. Do not repeatedly regenerate the event list. Overlapping events can extend beyond the coverage window.

The agent may prepare and commit consecutively when your request already authorizes a complete, unambiguous import. It should ask for correction when a date, timezone, disclosure or replacement is unresolved. Readable titles, locations and notes are kept privately by default and shown in your Calendar view. You can request busy blocks only to discard them. Details never appear in agent receipts or friends' free/busy results.

Open the returned Your calendars link. Check the source and its observed date. Use controls both calendar display and availability; older visibility differences have Show or Hide links to align them with Use. Expand the row for optional free/busy sharing, Update, Rename or Remove. Imports are not shared with friends by default. To refresh, choose Update (or Turn on and update when paused) and send the new request. Remove deletes the Domino snapshot and its availability evidence; it does not delete events at your provider.

Freshness lasts at most 24 hours from when the agent checked the calendar. Re-importing an old snapshot does not make it fresh. Partial results can add busy evidence but cannot prove unseen time clear; retained events keep their original freshness.

Bulk import: preferred for original exports

Use domino_bulk_calendar_import (calendar.import.bulk) to hand off original calendar event data without converting every event in the agent. The owner request authorizes a background private save. It returns Calendar immediately; events appear when processing finishes. No separate prepare/commit or mandatory editing is needed.

Supply metadata: source_kind (google/ics/other), source_name, export_format (google_json/ics), IANA timezone, original offset-bearing observed_at, complete, calendars_included and actual queried coverage (start/exclusive end). The same 90-day/1 MB/1,000-item limits apply. Missing calendars or pages mean partial coverage. A requested range alone is not evidence that it was queried.

For Google, send the original Events.list JSON or the connector's event JSON. For multiple calendars/pages, wrap each original result as {calendars: [{calendar_id, response: original_result}]}; single-calendar exports can send the original result directly. Native items/events, Google start/end objects and the Codex connector's timestamp fields are accepted. Preserve IDs, recurrence instance identifiers, titles, locations, notes and attendance evidence. ICS handles recurrence inside the bounded range using source rules. Domino resolves date offsets and informational all-day labels; ambiguous attendance stays May be busy. Entries without usable times remain saved privately for optional correction.

Pass the original text as data when the client supports only tool calls. A faster file path is available for clients with code and access to their existing authorized Domino credential: omit data, then POST the original file bytes to returned data_url with that same Bearer credential. The file's body is raw JSON/ICS, not a JSON envelope or multipart form. This uses existing permission, no new token, no public download URL and no arbitrary URL fetch. Original data is encrypted during processing and discarded after completion/failure, cancellation or expiry. Do not print credentials or attach unrelated tool transcripts.

Return calendar_url immediately after acceptance/upload. Do not repeatedly poll or retype every event: calendar.import.get can read a bulk_ handle when needed. Updates use the same source_handle/expected_source_revision contract and named calendars as the structured path. Queue execution rechecks the original connection's current permission before saving; concurrent updates or removal cannot be overwritten. Older clients may need to refresh their tool catalog. If bulk transfer is unavailable, the existing structured path remains supported.

Bulk release verification: the Codex-operated native Google connector capture and authenticated file-transfer/queued-save path passed with a fresh 209-event, 90-day export. Source readback matches structured import; 208 events placed and one kept for optional timing correction. The original Claude run's files expired, so this does not establish full Claude app inline-transfer performance. No OpenAI model call was needed for JSON/ICS conversion.

Structured contract for agents

Use schemas from authenticated tools/list or the capability catalog. Some clients cache older tool descriptions. If yours still mentions 31 days, refresh its connector tool catalog; the current import supports 90 days, and the copied request explicitly preserves the selected range despite stale descriptions. Current receipts return import_limits; compare their actual coverage with the full user-requested window before committing. Never save a shorter window based only on cached text. A new chat alone may retain the cached catalog. All calendar import operations require calendar:import. Structured and bulk JSON/ICS imports do not invoke a Domino model.

  1. calendar.import.prepare accepts a snapshot object: schema: calendar-import.v1, owner: self, source_kind (google/outlook/ics/other), source_name, IANA timezone, offset-bearing observed_at, complete, calendars_included, exact coverage intervals and resolved items. detail_mode defaults to private_titles (private event details); busy_only explicitly discards titles, locations and notes. Optional per-item title, location and description preserve readable source text; descriptions are plain text, at most 4,000 characters. Each item includes calendar_key, stable occurrence_key, optional recurrence_key, start/exclusive end, all-day flag and busy/available/unsure/ignore state. Different occurrences need different identities even if their times match. Do not send recurrence rules, credentials, secret feed URLs or transcripts. Readable uncertainty notes are accepted when boundaries are known; ambiguous commitments stay “May be busy.” Missing start/end still returns precise needs_input guidance.
  2. Limits are 90 calendar days of coverage (with DST offsets preserved), 1,000 incoming and retained occurrences, 100 included calendars, 90 coverage intervals and 1,000,000 bytes. Narrow oversized snapshots; never silently truncate. Failed pages/calendars mean complete: false. No connector evidence means no import.
  3. For an update, provide the exact source_handle and expected_source_revision outside snapshot. Keep the same calendar set. A different set needs a separate source. Partial updates retain omitted items. Complete updates remove omitted items only wholly inside their covered intervals. Other sources and dates remain intact.
  4. Prepare returns an import_handle, expected_version, optional expected source revision, replacement/removal/retained counts, coverage and owner review URL. No active availability changes yet. Commit takes these values plus a stable idempotency_key. This is an owner-private write, not actions.commit and not its 15-minute approval kernel. Drafts expire after seven days.
  5. calendar.import.get takes exactly one import or source handle and returns a safe current receipt. Draft access/commit requires the original connection and unchanged scope; reprepare after changing either. A revoked or expired credential must be reauthorized. Retry an uncertain write with the original key and input, then read current status; a replay receipt records the original result and does not prove the source still exists.
  6. calendar.import.remove requires the exact source handle and its current expected revision, plus an idempotency key. Remove only when the user requests it.

All item and coverage boundaries should be full date-times with an explicit UTC offset (or Z), including all-day events. Convert an ICS VALUE=DATE pair such as October 16–17 into 2026-10-16T00:00:00-05:00 through 2026-10-17T00:00:00-05:00 for Chicago. The end stays exclusive. Resolve each midnight's offset separately across daylight-saving changes; an all-day event need not be exactly 24 hours. Bare dates are rejected without changing active evidence. Correct the indicated field and prepare with a new idempotency key; reserve same-key retries for unchanged input.

Saved snapshots are retained through their covered end plus 14 days unless removed earlier. Draft and revision payloads are encrypted. Source-local identifiers are HMACed for matching; event text is excluded from receipts and operational summaries. Owner review in Domino can show permitted private details. These capabilities are not exposed to SMS or the hosted Domino assistant.

Release acceptance

Protocol fixtures and actual client acceptance are separate. Verified October 13, 2026:

Client Calendar import evidence
Claude Mac app Passed with a supplied fictional ICS export: prepare, safe same-key replay, commit, receipt readback and owner source controls. Busy-only privacy, bounded coverage, all-day end and observation-based freshness independently verified in production.
Codex CLI Passed with a supplied fictional ICS export: prepare, commit, safe same-key commit replay, receipt readback and owner source controls. Two busy-only items, exact coverage, all-day exclusive end and observation-based freshness independently verified in production.
Claude Code Untested for this release.

This verifies the supplied-export path. Retrieval from a live Google, Microsoft or other calendar connector depends on that client's separate authorized integration and was not tested in this batch. Both fictional production sources were removed after verification; the temporary Codex test credential was revoked.

Informational all-day school labels, birthdays and spirit weeks can be nonblocking even when a provider defaults them to busy. Explicit personal commitments remain blocking; unresolved attendance stays unknown. Fresh partial imports can display Unverified idea suggestions outside known or possible commitments. This does not certify empty time as free, extend freshness or change Invite review.