Skip to main content
Glama

Propose meeting

propose_meeting

Place 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

NameRequiredDescriptionDefault
slotsYesExactly 3 slots, byte-identical from find_times output.
topicYesShort subject — becomes the calendar invite title and the picker heading. E.g. "Intro call", "Portfolio review", "Partnership next steps". No participant names.
agendaYesGoes into the calendar event description; the invitee reads it. Second person, 2–4 sentences, no invitee name.
account_idNoLink the meeting to an account in your workspace.
contact_idNoLink the meeting to a contact (usually the invitee).
window_endNoForward the window_end you gave find_times (ISO 8601); stored with window_start for reschedule context.
duration_minYesMeeting duration in minutes — must match the find_times call.
invitee_nameYesPrimary invitee's full name.
window_startNoForward the window_start you gave find_times (reschedule context).
invitee_emailNoPrimary 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_emailsNoWorkspace 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_idNoLink the meeting to an opportunity.
invitee_companyNoPrimary invitee's company name, stored on the meeting; it appears in the host's booked notification and is matched by meeting search.
expiration_hoursNoHours before the held times auto-release if the invitee doesn't pick. Defaults to the host's saved default.
busy_override_startsNo`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_emailsNoSecondary invitees — CC'd on the picker email and added to the calendar event; only the primary invitee picks. Requires invitee_email.

Output Schema

NameRequiredDescriptionDefault
noteNo
slotsNo
meetingNo
guidanceNo
proposedNo
timed_outNo
picker_urlNo
signed_in_asNo
dropped_slotsNo
repairs_flaggedNo
dropped_co_hostsNo
staged_invite_previewNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • removedInput schema / $schema
      Removed value: -"https://json-schema.org/draft/2020-12/schema"
  2. Changed3 schema fields changed
    • removedInput schema / properties / account_id / pattern
      Removed value: -"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    • removedInput schema / properties / contact_id / pattern
      Removed value: -"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    • removedInput schema / properties / opportunity_id / pattern
      Removed value: -"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
  3. Changed14 schema fields changed
    • removedOutput schema / $schema
      Removed value: -"https://json-schema.org/draft/2020-12/schema"
    • removedOutput schema / additionalProperties
      Removed value: -{}
    • removedOutput schema / properties / dropped_co_hosts / items / additionalProperties
      Removed value: -{}
    • removedOutput schema / properties / dropped_co_hosts / items / propertyNames
      Removed value: -{
      -  "type": "string"
      -}
    • removedOutput schema / properties / dropped_slots / items / additionalProperties
      Removed value: -{}
    • removedOutput schema / properties / dropped_slots / items / propertyNames
      Removed value: -{
      -  "type": "string"
      -}
    • removedOutput schema / properties / meeting / additionalProperties
      Removed value: -{}
    • removedOutput schema / properties / meeting / propertyNames
      Removed value: -{
      -  "type": "string"
      -}
    • removedOutput schema / properties / signed_in_as / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / signed_in_as / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / slots / items / additionalProperties
      Removed value: -{}
    • removedOutput schema / properties / slots / items / propertyNames
      Removed value: -{
      -  "type": "string"
      -}
    • removedOutput schema / properties / staged_invite_preview / additionalProperties
      Removed value: -{}
    • removedOutput schema / properties / staged_invite_preview / propertyNames
      Removed value: -{
      -  "type": "string"
      -}
  4. Changed3 schema fields changed
    • changedInput schema / properties / busy_override_starts / description
      Previous value: -"ISO `starts_at` values (from `slots`) that the host DELIBERATELY chose over a busy time on their (or a co-host's) calendar — the find_times card flags these with `busy_override` after the host drops a slot onto a visible busy band. Pass them here ONLY after you've given the user a heads-up (a light note for the host's own busy; a STRONGER one — \"only if you've cleared it with them\" — for a co-host's). A start in this list is kept-while-busy (its hold is placed and honored at the invitee's confirm); a busy slot NOT in this list is a race and is dropped. Omit when no slot overrides a busy time."New value: +"`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."
    • changedInput schema / properties / co_host_emails / description
      Previous value: -"WORKSPACE MEMBERS who co-host: holds land on their calendars too, and the confirmed event includes them. WORKSPACE MEMBERS ONLY — never the external invitee (the invitee goes in invitee_email / additional_invitee_emails, not here). A non-member address that matches a known workspace contact is dropped and the meeting is created without it."New value: +"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."
    • changedInput schema / properties / window_end / description
      Previous value: -"Forward the window_end you gave find_times (ISO 8601) — stored with window_start as the meeting's search window for reschedule context."New value: +"Forward the window_end you gave find_times (ISO 8601); stored with window_start for reschedule context."
  5. First observed

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations, the description discloses that holds are reversible, expiring, invitee-invisible, and never emailed; that the email is staged; that dropped co-hosts must be relayed; and that busy overrides behave differently from race-dropped busy slots. It also explains the authorization model: a clear human go on content authorizes sending via send_meeting_invite in the same turn. These are material behavioral traits not carried by the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but front-loaded, stating the core behavior first and then workflow constraints, parameter pitfalls, return values, authorization, and a use-case note. Every sentence carries operational value for a 16-parameter scheduling tool. There is little or no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity, 16 parameters, and an output schema, the description covers the essential workflow, prerequisites, authorization boundary, co-host constraints, ID validation, and returned artifacts such as picker_url and staged_invite_preview. An agent has enough context to call this correctly and to know when to route to send_meeting_invite.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds operational meaning by requiring exactly three find_times slots verbatim, restricting co_host_emails to workspace members, directing invitees to invitee_email or additional_invitee_emails, and requiring search for known IDs rather than invention. It also explains why busy_override_starts exists and when to list a start. Some of this repeats schema descriptions, so it is strong but not fully additive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it places reversible, expiring, invitee-invisible calendar holds and stages an invitee email without sending it. It explicitly distinguishes this from send_meeting_invite and from find_times by describing the exact stage-and-defer behavior. An agent can identify precisely what this tool does without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit timing: use after the user chooses times and approves the content, and first confirm topic and agenda once. It also names the follow-on alternative send_meeting_invite and the condition for calling it in the same turn, plus the exception for withholding when told to hold or when invitee_email is absent. This is unusually complete routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources