Team Member Tools

Team members are the people who collaborate inside a team, distinct from a project's members.

Team members are the people who collaborate inside a team, distinct from a project's members. These tools list the roster, invite by email with a role, change a role and remove someone, the same rules the team settings screen enforces.

Tools

Withdraw a team invitation that has not been accepted.

Withdraws a pending invitation. The link stops working and the invitee never becomes a member.

An invitee is not a member

Someone who has not accepted has no membership row — only a pending invitation. That is why this is a separate tool from remove_team_member: the two fail on different things, and using the wrong one returns RESOURCE_NOT_FOUND instead of doing something surprising.

Not tier-gated. See what the tier gates.

Requires ability

The token behind the MCP session must hold it, or the call is refused with TOKEN_MISSING_ABILITY.

The REST endpoint and this tool share one action, so validation, permissions and events are identical.

Annotations

DestructiveOpen world

A client that honours annotations asks a person before running it. It reaches beyond Subscriby: a connector, a provider or a member.

Arguments

team_id*string

UUID of the team.

invitation_id*string

UUID of the pending invitation to withdraw.

What it returns

{  "data": {    "team_id": "a83f0d51-4c92-4b7e-8615-2fd9e70a3c86",    "invitation_id": "b73c5f21-9d80-4a6e-8215-4f70ce13a9d6",    "cancelled": true  }}

No webhook event fires. An invitation that was never accepted changed nobody's access, so there is no membership transition to announce.

How it fails

AUTHENTICATION_REQUIRED

no authenticated user on the request.

TOKEN_MISSING_ABILITY

token lacks team-member:remove.

RESOURCE_NOT_FOUND

no such team, or no pending invitation with that id on it. An invitation that has already been accepted is gone from this list; remove the member instead.

Invite a collaborator into a team by email, onto a role that already exists.

Invites someone into a team. Addressed by email, not by user id — the invitee may not have a Subscriby account yet, which is what separates inviting from adding. They receive an invitation with a link; the membership appears when they accept.

role is a role code on that team, such as support-agent. Create it first with create_role if it does not exist.

Growth-tier capability. On a lower tier this returns TEAM_TIER_REQUIRED and sends nothing.

Requires ability

The token behind the MCP session must hold it, or the call is refused with TOKEN_MISSING_ABILITY.

Runs the same action as

The REST endpoint and this tool share one action, so validation, permissions and events are identical.

Fires one event

Delivered to every endpoint subscribed to it once the change is made.

Annotations

DestructiveOpen world

A client that honours annotations asks a person before running it. It reaches beyond Subscriby: a connector, a provider or a member.

Arguments

team_id*string

UUID of the team to invite into.

email*string

Email address of the invitee.

role*string

Role code the invitee will hold. Must already exist on the team.

What it returns

{  "data": {    "team_id": "a83f0d51-4c92-4b7e-8615-2fd9e70a3c86",    "email": "[email protected]",    "role": "support-agent",    "status": "invited"  }}

status is always invited — nobody is a member until they accept, so there is no id to return yet.

Emits team.member.invited now, then team.member.joined when they accept.

How it fails

AUTHENTICATION_REQUIRED

no authenticated user on the request.

TOKEN_MISSING_ABILITY

token lacks team-member:invite.

TEAM_TIER_REQUIRED

the caller's platform tier does not include Teams.

RESOURCE_NOT_FOUND

no such team, or the caller is not a member.

VALIDATION_FAILED

malformed email, unknown role code, or the person is already in the team. Call [list_roles](/mcp/tools/roles-and-groups#list-roles) to see the codes available.

List collaborators on a team. Owner pseudo-row is prepended; role_id is null for the owner.

List the collaborators on a team — the owner pseudo-row is prepended to every pivot member. role_id is null for the owner. Emails are surfaced verbatim because team members are internal collaborators, not subscribers.

Requires ability

The token behind the MCP session must hold it, or the call is refused with TOKEN_MISSING_ABILITY.

Runs the same action as

The REST endpoint and this tool share one action, so validation, permissions and events are identical.

Annotations

Read-only

It reads and never changes anything.

Arguments

team_id*string

UUID of the team whose members to list.

What it returns

{  "data": [    {      "id": "2a91c4e7-6f38-4b52-8e0d-9c1a7b3f5d80",      "team_id": "a83f0d51-4c92-4b7e-8615-2fd9e70a3c86",      "name": "Priya Patel",      "email": "[email protected]",      "role_id": null,      "is_owner": true,      "joined_at": "2026-04-02T14:15:00Z"    }  ],  "meta": { "total": 3 }}

How it fails

RESOURCE_NOT_FOUND

team_id is not a valid UUID, or the team falls outside the caller's visibility set.

AUTHENTICATION_REQUIRED

no authenticated user on the request.

TOKEN_MISSING_ABILITY

token lacks team-member:view-any.

Remove a collaborator from a team. Their Subscriby account is untouched.

Removes a collaborator from a team. They lose access to every project and setting scoped to it immediately; their own Subscriby account is untouched.

The team owner cannot be removed — ownership is not a membership row.

Not tier-gated, unlike inviting. A creator whose tier lapsed with collaborators still attached has to be able to remove them; gating that would turn a downgrade into a permanent grant. See what the tier gates.

Only works on someone who has accepted. Somebody still holding an unaccepted invitation has no membership row to remove — use cancel_team_invitation for those. Using the wrong one returns RESOURCE_NOT_FOUND rather than doing something surprising.

Requires ability

The token behind the MCP session must hold it, or the call is refused with TOKEN_MISSING_ABILITY.

The REST endpoint and this tool share one action, so validation, permissions and events are identical.

Fires one event

Delivered to every endpoint subscribed to it once the change is made.

Annotations

DestructiveOpen world

A client that honours annotations asks a person before running it. It reaches beyond Subscriby: a connector, a provider or a member.

Arguments

team_id*string

UUID of the team.

user_id*string

UUID of the collaborator to remove.

What it returns

{  "data": {    "team_id": "a83f0d51-4c92-4b7e-8615-2fd9e70a3c86",    "user_id": "2a91c4e7-6f38-4b52-8e0d-9c1a7b3f5d80",    "removed": true  }}

How it fails

AUTHENTICATION_REQUIRED

no authenticated user on the request.

TOKEN_MISSING_ABILITY

token lacks team-member:remove.

RESOURCE_NOT_FOUND

no such team, or user_id is not a member. The owner also returns 404.

Move an existing collaborator onto a different role within the team.

Moves an existing collaborator onto a different role. This is the only way to re-role someone without removing and re-inviting them — the dashboard's team settings page offers invite, remove and cancel-invitation only, so there is no UI equivalent.

The team owner cannot be re-roled: ownership is not a membership row and carries everything unconditionally.

Growth-tier capability. On a lower tier this returns TEAM_TIER_REQUIRED and changes nothing.

Requires ability

The token behind the MCP session must hold it, or the call is refused with TOKEN_MISSING_ABILITY.

The REST endpoint and this tool share one action, so validation, permissions and events are identical.

Delivered to every endpoint subscribed to it once the change is made.

Annotations

DestructiveOpen world

A client that honours annotations asks a person before running it. It reaches beyond Subscriby: a connector, a provider or a member.

Arguments

team_id*string

UUID of the team.

user_id*string

UUID of the collaborator whose role is changing.

role*string

Role code to move them onto. Must already exist on the team.

What it returns

{  "data": {    "team_id": "a83f0d51-4c92-4b7e-8615-2fd9e70a3c86",    "user_id": "2a91c4e7-6f38-4b52-8e0d-9c1a7b3f5d80",    "role": "manager"  }}

Emits team.member.role_changed.

This is what makes that event reachable

Nothing in Subscriby called the underlying re-role path before this shipped, so team.member.role_changed sat in the webhook catalog — and was offered as a Zapier and n8n trigger — while being impossible to fire.

How it fails

AUTHENTICATION_REQUIRED

no authenticated user on the request.

TOKEN_MISSING_ABILITY

token lacks team-member:update-role.

TEAM_TIER_REQUIRED

the caller's platform tier does not include Teams.

RESOURCE_NOT_FOUND

no such team, or user_id is not a member of it. The owner also returns 404 here, because the owner has no membership row to change.

VALIDATION_FAILED

unknown role code.

How is this guide?

On this page

Subscriby is a product designed by you — for you.No boardroom full of executives deciding what we ships next. Our roadmap always shaped by you with your feedback.

Share feedback or a request