Propose meeting
propose_meetingPlace reversible, expiring, invitee-invisible calendar holds and STAGE the invitee email; this tool never emails anyone. First confirm topic AND agenda once with the user. Keep names out of the topic; address the invitee as you in the agenda. Pass exactly 3 find_times slots verbatim; list deliberate busy picks in busy_override_starts. co_host_emails is workspace members only; invitees use invitee_email/additional_invitee_emails. Relay dropped_co_hosts. Search for known account/contact/opportunity IDs; never invent them. Returns full state, picker_url and staged_invite_preview. A clear human go on content is authorization to send: call send_meeting_invite in the same turn, not a separate approval gate. Withhold only if explicitly told to hold, or without invitee_email (share picker_url). Never send without a human go. Details: capable://guide/scheduling.
When to use: After the user chooses times and approves the content.
Example: Set up our agreed meeting.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| slots | Yes | Exactly 3 slots, byte-identical from find_times output. | |
| topic | Yes | Short subject — becomes the calendar invite title and the picker heading. E.g. "Intro call", "Portfolio review", "Partnership next steps". No participant names. | |
| agenda | Yes | Goes into the calendar event description; the invitee reads it. Second person, 2–4 sentences, no invitee name. | |
| account_id | No | Link the meeting to an account in your workspace. | |
| contact_id | No | Link the meeting to a contact (usually the invitee). | |
| window_end | No | Forward the window_end you gave find_times (ISO 8601); stored with window_start for reschedule context. | |
| duration_min | Yes | Meeting duration in minutes — must match the find_times call. | |
| invitee_name | Yes | Primary invitee's full name. | |
| window_start | No | Forward the window_start you gave find_times (reschedule context). | |
| invitee_email | No | Primary invitee's email. OMIT for shareable mode — the picker URL comes back for the user to share manually, and the invitee enters their email when they pick. | |
| co_host_emails | No | Workspace members who co-host: holds land on their calendars and the confirmed event includes them. Never the external invitee (invitee_email / additional_invitee_emails); a non-member matching a known contact is dropped. | |
| opportunity_id | No | Link the meeting to an opportunity. | |
| invitee_company | No | Primary invitee's company name, stored on the meeting; it appears in the host's booked notification and is matched by meeting search. | |
| expiration_hours | No | Hours before the held times auto-release if the invitee doesn't pick. Defaults to the host's saved default. | |
| busy_override_starts | No | `starts_at` values from `slots` the host deliberately chose over a busy time on their own or a co-host's calendar (the find_times card marks these busy_override after the host drops a slot onto a visible busy band). Pass only after a heads-up to the user — a light note for the host's own busy time, a stronger one for a co-host's. A listed start keeps its hold while busy (placed and honored at the invitee's confirm); a busy slot not listed is dropped as a race. Omit when none overrides a busy time. | |
| additional_invitee_emails | No | Secondary invitees — CC'd on the picker email and added to the calendar event; only the primary invitee picks. Requires invitee_email. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | ||
| slots | No | ||
| meeting | No | ||
| guidance | No | ||
| proposed | No | ||
| timed_out | No | ||
| picker_url | No | ||
| signed_in_as | No | ||
| dropped_slots | No | ||
| repairs_flagged | No | ||
| dropped_co_hosts | No | ||
| staged_invite_preview | No |