Skip to content

Invitations tools

MCP tools for Invitations: invitations_accept, invitations_create, invitations_list, invitations_lookup, invitations_revoke.

  • invitations_accept: Accept an invitation
  • invitations_create: Invite someone to the organization
  • invitations_list: List invitations
  • invitations_lookup: Look up an invitation
  • invitations_revoke: Revoke an invitation

invitations_accept

Accept an invitation. Operation invitations.accept · Platform level · permission account:write · risk tier write · since M1

Accepts an invitation: you become a member of the organization with the invitation's role and scope. You must be signed in with the address the invitation was sent to, and the invitation must be pending (not accepted, revoked or older than 7 days). Live-mode access follows the role (developers start without it). Returns the new membership and the organization, whose console is /console/{slug}.

Who can call it: any signed-in user holding the token from the invitation link.

Annotations: readOnlyHint: false · destructiveHint: false · idempotentHint: false · openWorldHint: false

Arguments

ArgumentTypeRequiredDescription
tokenstringyes–
idempotency_keystringnoA unique string for this change. Retrying with the same key and arguments never acts twice. When left out, the server generates one and returns it in the result's idempotency_key. (1–255 characters)
dry_runbooleannotrue: check permissions and rules and compute the result, then roll everything back. Nothing is saved. (default false)
  • Idempotency: the result returns the idempotency_key used, yours or one the server generated. Retry with it: a call with the same key and arguments never acts twice (keys are kept for 24 hours).
  • Dry run: supported. dry_run: true checks permissions and rules and computes the result, then rolls everything back.

Errors

Example

Accept an invitation to a brand

Arguments:

JSON
{
  "token": "ExampleOnlyNotARealInvitationToken000000000",
  "idempotency_key": "8d0c5f8e-4b7a-4e43-9b0f-2f6a0c1d9e21"
}

Result output:

JSON
{
  "membership": {
    "id": "mem_01m4tx5nj8emwbyf7y9vcf47x6",
    "object": "membership",
    "orgId": "org_01m4tx5nj7ekd958x53w4bntcg",
    "userId": "usr_01m4tx5nj8emwbyf7y9vcf47xb",
    "role": "developer",
    "scope": {
      "type": "brand",
      "brandId": "brd_01m4tx5nj8emwbyf7y9vcf47x4"
    },
    "livemodeAccess": false,
    "invitedBy": "usr_01m4tx5nj8emwbyf7y9vcf47xa",
    "user": {
      "email": "dev@acme.example",
      "name": "Dana Developer"
    },
    "createdAt": "2026-10-13T12:00:00.000Z",
    "updatedAt": "2026-10-13T12:00:00.000Z"
  },
  "organization": {
    "id": "org_01m4tx5nj7ekd958x53w4bntcg",
    "slug": "acme",
    "name": "Acme"
  }
}

invitations_create

Invite someone to the organization. Operation invitations.create · Organization level · permission members:admin · risk tier security · since M1

Invites a person by email with a role and a scope (the whole organization, one legal entity or one brand). They accept by signing in with that address and opening the link; the invitation expires after 7 days. Live-mode access follows the role (developers start without it; change it after they join).

Ownrecord emails the invitation link to the address right after the change is saved. The response also contains the invitation token (link: /console/invitations/{token}), once: only a hash is stored.

You can't invite anyone with more access than you have. A pending invitation reserves a seat: members plus pending invitations count against the plan's members.max. Needs members:admin and a signed-in member (the invitation says who invited; API keys can't invite). A security-tier change.

Annotations: readOnlyHint: false · destructiveHint: false · idempotentHint: false · openWorldHint: false

Arguments

ArgumentTypeRequiredDescription
emailstringyes(at most 254 characters)
roleone of org_owner, org_admin, billing_admin, finance, tax_manager, support, developer, vieweryes–
scopeobject or object or objectyes–
idempotency_keystringnoA unique string for this change. Retrying with the same key and arguments never acts twice. When left out, the server generates one and returns it in the result's idempotency_key. (1–255 characters)
dry_runbooleannotrue: check permissions and rules and compute the result, then roll everything back. Nothing is saved. (default false)
  • Idempotency: the result returns the idempotency_key used, yours or one the server generated. Retry with it: a call with the same key and arguments never acts twice (keys are kept for 24 hours).
  • Dry run: supported. dry_run: true checks permissions and rules and computes the result, then rolls everything back.

Errors

Example

Invite a finance colleague for one entity

Arguments:

JSON
{
  "email": "finance@acme.example",
  "role": "finance",
  "scope": {
    "type": "entity",
    "entityId": "ent_01m4tx5nj8emwbyf7y9vcf47x2"
  },
  "idempotency_key": "8d0c5f8e-4b7a-4e43-9b0f-2f6a0c1d9e21"
}

Result output:

JSON
{
  "id": "invt_01m4tx5nj8emwbyf7y9vcf47x8",
  "object": "invitation",
  "orgId": "org_01m4tx5nj7ekd958x53w4bntcg",
  "email": "finance@acme.example",
  "role": "finance",
  "scope": {
    "type": "entity",
    "entityId": "ent_01m4tx5nj8emwbyf7y9vcf47x2"
  },
  "status": "pending",
  "expiresAt": "2026-10-20T12:00:00.000Z",
  "invitedBy": "usr_01m4tx5nj8emwbyf7y9vcf47xa",
  "acceptedAt": null,
  "revokedAt": null,
  "createdAt": "2026-10-13T12:00:00.000Z",
  "token": "ExampleOnlyNotARealInvitationToken000000000"
}

invitations_list

List invitations. Operation invitations.list · Organization level · permission members:read · risk tier read · since M1

Lists the organization's invitations, newest first, with their status: pending, accepted, revoked or expired (invitations work for 7 days). Filter with status, e.g. pending for the invitations still waiting for an answer. Tokens are never returned. Paginate with limit and starting_after.

Needs members:read (organization owners and admins, or an org management key).

Annotations: readOnlyHint: true · destructiveHint: false · idempotentHint: true · openWorldHint: false

Arguments

ArgumentTypeRequiredDescription
statusone of pending, accepted, revoked, expiredno–
limitintegerno(1–100)
starting_afterID (invt_…)no–
  • Read-only: changes nothing; idempotency_key is ignored.

Errors

Examples

Pending invitations

Arguments:

JSON
{
  "status": "pending"
}

Result output:

JSON
{
  "object": "list",
  "data": [
    {
      "id": "invt_01m4tx5nj8emwbyf7y9vcf47x8",
      "object": "invitation",
      "orgId": "org_01m4tx5nj7ekd958x53w4bntcg",
      "email": "finance@acme.example",
      "role": "finance",
      "scope": {
        "type": "entity",
        "entityId": "ent_01m4tx5nj8emwbyf7y9vcf47x2"
      },
      "status": "pending",
      "expiresAt": "2026-10-20T12:00:00.000Z",
      "invitedBy": "usr_01m4tx5nj8emwbyf7y9vcf47xa",
      "acceptedAt": null,
      "revokedAt": null,
      "createdAt": "2026-10-13T12:00:00.000Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Everything, two per page

Arguments:

JSON
{
  "limit": 2
}

Result output:

JSON
{
  "object": "list",
  "data": [
    {
      "id": "invt_01m4tx5nj8emwbyf7y9vcf47x8",
      "object": "invitation",
      "orgId": "org_01m4tx5nj7ekd958x53w4bntcg",
      "email": "finance@acme.example",
      "role": "finance",
      "scope": {
        "type": "entity",
        "entityId": "ent_01m4tx5nj8emwbyf7y9vcf47x2"
      },
      "status": "pending",
      "expiresAt": "2026-10-20T12:00:00.000Z",
      "invitedBy": "usr_01m4tx5nj8emwbyf7y9vcf47xa",
      "acceptedAt": null,
      "revokedAt": null,
      "createdAt": "2026-10-13T12:00:00.000Z"
    },
    {
      "id": "invt_01m4tx5nj8emwbyf7y9vcf47x9",
      "object": "invitation",
      "orgId": "org_01m4tx5nj7ekd958x53w4bntcg",
      "email": "dev@acme.example",
      "role": "developer",
      "scope": {
        "type": "brand",
        "brandId": "brd_01m4tx5nj8emwbyf7y9vcf47x4"
      },
      "status": "accepted",
      "expiresAt": "2026-10-20T12:00:00.000Z",
      "invitedBy": "usr_01m4tx5nj8emwbyf7y9vcf47xa",
      "acceptedAt": "2026-10-14T09:30:00.000Z",
      "revokedAt": null,
      "createdAt": "2026-10-13T12:00:00.000Z"
    }
  ],
  "has_more": true,
  "next_cursor": "invt_01m4tx5nj8emwbyf7y9vcf47x9"
}

invitations_lookup

Look up an invitation. Operation invitations.lookup · Platform level · permission account:read · risk tier read · since M1

Shows what an invitation link offers: the organization, the role and scope, who invited, when it expires and its status. The invited address is shown in full only when you're signed in with it.

Who can call it: any signed-in user holding the token from the invitation link.

Annotations: readOnlyHint: true · destructiveHint: false · idempotentHint: true · openWorldHint: false

Arguments

ArgumentTypeRequiredDescription
tokenstringyes–
  • Read-only: changes nothing; idempotency_key is ignored.

Errors

Example

A pending invitation for the signed-in address

Arguments:

JSON
{
  "token": "ExampleOnlyNotARealInvitationToken000000000"
}

Result output:

JSON
{
  "object": "invitation_preview",
  "status": "pending",
  "organization": {
    "name": "Acme",
    "slug": "acme"
  },
  "role": "finance",
  "scope": {
    "type": "entity",
    "name": "Acme Digital d.o.o."
  },
  "email": "finance@acme.example",
  "emailMatches": true,
  "invitedBy": "Olivia Owner",
  "expiresAt": "2026-10-20T12:00:00.000Z"
}

invitations_revoke

Revoke an invitation. Operation invitations.revoke · Organization level · permission members:admin · risk tier security · since M1

Revokes a pending invitation: its link stops working at once. Accepted, revoked and expired invitations can't be revoked (invitation_not_pending). Give a reason: it goes to the audit log.

Like members, you can only revoke invitations you could have sent (an admin can't revoke an invitation to become an owner). Needs members:admin; a security-tier change.

Annotations: readOnlyHint: false · destructiveHint: true · idempotentHint: false · openWorldHint: false

Arguments

ArgumentTypeRequiredDescription
idID (invt_…)yes–
reasonstringno(1–500 characters)
idempotency_keystringnoA unique string for this change. Retrying with the same key and arguments never acts twice. When left out, the server generates one and returns it in the result's idempotency_key. (1–255 characters)
dry_runbooleannotrue: check permissions and rules and compute the result, then roll everything back. Nothing is saved. (default false)
  • Idempotency: the result returns the idempotency_key used, yours or one the server generated. Retry with it: a call with the same key and arguments never acts twice (keys are kept for 24 hours).
  • Dry run: supported. dry_run: true checks permissions and rules and computes the result, then rolls everything back.

Errors

Example

Revoke an invitation sent to the wrong address

Arguments:

JSON
{
  "id": "invt_01m4tx5nj8emwbyf7y9vcf47x8",
  "reason": "Sent to the wrong address",
  "idempotency_key": "8d0c5f8e-4b7a-4e43-9b0f-2f6a0c1d9e21"
}

Result output:

JSON
{
  "id": "invt_01m4tx5nj8emwbyf7y9vcf47x8",
  "object": "invitation",
  "orgId": "org_01m4tx5nj7ekd958x53w4bntcg",
  "email": "finance@acme.example",
  "role": "finance",
  "scope": {
    "type": "entity",
    "entityId": "ent_01m4tx5nj8emwbyf7y9vcf47x2"
  },
  "status": "revoked",
  "expiresAt": "2026-10-20T12:00:00.000Z",
  "invitedBy": "usr_01m4tx5nj8emwbyf7y9vcf47xa",
  "acceptedAt": null,
  "revokedAt": "2026-10-14T09:30:00.000Z",
  "createdAt": "2026-10-13T12:00:00.000Z"
}