Skip to main content
Writes to your heyBTW workspace: it creates one collab (and its target spec, if you pass one). It sends nothing, runs no enrichment, and never writes to the event platform.
A collab is the record people, lists and context attach to. Reach for this tool when the user names an event heyBTW does not hold yet, or pastes the link to one. Follows the heyBTW MCP rules.

When to use it

  • “Add our Oct 20 dinner in SF to heyBTW, 6 to 9pm.”
  • “Here’s the Luma link for next week’s meetup, set it up.”
  • “We ran a Partiful event last month. Get it into heyBTW so I can load the guest list.”
  • “Create the collab and say who it’s for: VPs of Marketing at Series B fintechs.”

Parameters

Pick ONE door per call.

Workflow

There is no preview step: one call creates the collab. Retries are safe because of client_request_id.
1

Choose the door

FIELDS door when you have the details (name, event_start). LINK door when you have a public page (event_url).
2

Generate a fresh client_request_id

A new hyphenated UUID for every new create. On a transport error, retry with the SAME id: a committed creation is replayed (idempotent_replay: true), never repeated. Reusing the id for a different call is refused.
3

Read the answer to the user

Read facts one sentence each, then offer next. If event_end_origin is assumed, tell the person the end is assumed and set it with update_collab once known.
4

Carry on with the channel_id

Pass channel_id unchanged to record_signups, get_event_details, save_event_context, update_collab and every other tool that takes a collab.
The FIELDS door is matched too when another collab already has its landing_page_url: that collab comes back as it is, and the values in the call are not applied (use update_collab to change them). A name and a start alone never match.

The event-history ladder

A collab created here sits on rung 2 of the ladder: it brings the event, not its people or partners. Rung 1, an API sync from a connected Luma, Splash or Zuddl account, is better whenever it exists. Every answer lists what this rung leaves out in import_gaps, each with the tool that fills it: A collab the Luma integration already synced reports the rung 1 gaps instead (partners only).

Response

The shape below is from the contract and the code (tools/create_collab.py, collab-write-contract.json). A success was not captured live, because this tool creates a real collab. data[0] opens with the first-value block: A brand-new collab has no sign-ups, so most facts read 0 or a gap. An empty roster says nothing about who registered.

Rules the agent must follow

  • Pick one door per call. Never send event_name or event_date on input: those are response names.
  • Never guess a time zone or an offset. Ask the user.
  • Read facts to the user before proposing anything, then offer next. Never recount from the roster. A gap is absent, not zero.
  • If possible_duplicates is not empty, confirm with the person which collab is the real event before adding people to either.
  • People who registered or attended go to record_signups. People to invite go to import_people, save_list, activate_list: they are not sign-ups.
  • An archived match stays archived; a coverage note says so. Tell the user.

Errors and gaps

The validation error, trimmed from a real call with no arguments today: