partners gap every import names, or when the user asks who co-hosts an event.
Follows the heyBTW MCP rules.
When to use it
- “Who are the partners on the SF dinner?”
- “Marlowe Cloud is co-hosting, add them.”
- “Invite Dana at Marlowe so she can see the guest list.”
- “Take Acme off the summit.”
Parameters
Arguments an action does not use are refused (
invalid_parameter, naming each one), never ignored.
Workflow
add
Passdomain or member_email. A company name alone is refused, so ask the user for the domain. The workspace’s own domain and personal addresses (gmail.com and the like) are refused. It takes effect at once, like the dashboard’s Add Partner: no approval step, no invite sent, no tier, contact or sharing setting changed. When a heyBTW workspace already holds the partner’s domain, that workspace is linked to the collab at once (it sees it under the host’s Sponsor Mode view). outcome: created, reactivated or already_present.
remove
Passdomain. It archives the partner’s row, which ends that company’s access to THIS collab at once. Nothing is deleted; adding the domain again reactivates it. The host row cannot be removed. outcome: removed or already_removed, with removed_count.
With a client_request_id, a retry with the SAME id returns the first answer (idempotent_replay: true) and changes nothing again; the same id with a different partner, collab or action is refused.
invite: preview, then explicit confirmation
1
Preview (sends nothing)
action: "invite", confirm: false, the partner’s domain, the contact_email, and optionally contact_name and message. The answer is a preview with a preview_token, valid 15 minutes.2
Get the user's explicit go-ahead
Show who will be emailed, for which collab, the message, and what the partner will see after accepting (
partner_side_view). Do not send without a clear yes.3
Confirm (sends one email)
Call again with
confirm: true, the SAME arguments, that preview_token and a fresh client_request_id.send_outcome_unknown or a retryable error, retry with the SAME client_request_id: a confirm that went through is replayed (idempotent_replay: true) and never sent twice. Never mint a new id for a retry. If unsure, read action: "status" first: once it went through, the partner’s invited_contact names that contact. If a confirm answers invite_recorded: false, the email was sent but heyBTW could not record it. Do not send it again.
A removed partner cannot be invited (add it again first), and the host row cannot be invited.
Response
status
joined is NOT a state. heyBTW does not record when an invited contact accepts, so an accepted or declined invite shows as associated with invited_contact set. Never tell the user a partner joined.
Trimmed from a real status call today on a ScaleUp.ai fixture collab:
add, remove and invite
These shapes are from the contract and the code (tools/manage_collab_partners.py, collab-partners-contract.json). They were not called live, because each writes or sends.
Rules the agent must follow
- Never send an invite without a preview and the user’s explicit go-ahead. An invite emails one person.
- Never retry a confirm with a new
client_request_id. Readstatuswhen unsure. - Never say a partner joined.
- Ask for a domain; never guess one from a company name.
- This tool never sets a partner’s tier, mode or contact (other than an invite’s) and never deletes anything.
Errors and gaps
Related
- get_event_details, which also lists each partner’s status
- record_signups and create_collab, whose
import_gapspoint here - get_partner_insights
- Playbook: Connect heyBTW next to your CRM and your event platform