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
cancel_team_invitationCancel Team InvitationDESTRUCTIVEinvite_team_memberInvite Team MemberREADlist_team_membersList Team MembersDESTRUCTIVEremove_team_memberRemove Team MemberDESTRUCTIVEupdate_team_member_roleChange Team Member Rolecancel_team_invitation
DESTRUCTIVEWithdraw 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.
Runs the same action as
The REST endpoint and this tool share one action, so validation, permissions and events are identical.
Annotations
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*stringUUID of the team.
invitation_id*stringUUID 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_REQUIREDno authenticated user on the request.
TOKEN_MISSING_ABILITYtoken lacks team-member:remove.
RESOURCE_NOT_FOUNDno 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_team_member
DESTRUCTIVEInvite 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
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*stringUUID of the team to invite into.
email*stringEmail address of the invitee.
role*stringRole 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_REQUIREDno authenticated user on the request.
TOKEN_MISSING_ABILITYtoken lacks team-member:invite.
TEAM_TIER_REQUIREDthe caller's platform tier does not include Teams.
RESOURCE_NOT_FOUNDno such team, or the caller is not a member.
VALIDATION_FAILEDmalformed 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
It reads and never changes anything.
Arguments
team_id*stringUUID 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_FOUNDteam_id is not a valid UUID, or the team falls outside the caller's visibility set.
AUTHENTICATION_REQUIREDno authenticated user on the request.
TOKEN_MISSING_ABILITYtoken lacks team-member:view-any.
remove_team_member
DESTRUCTIVERemove 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.
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
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*stringUUID of the team.
user_id*stringUUID 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 }}Emits team.member.removed.
How it fails
AUTHENTICATION_REQUIREDno authenticated user on the request.
TOKEN_MISSING_ABILITYtoken lacks team-member:remove.
RESOURCE_NOT_FOUNDno such team, or user_id is not a member. The owner also returns 404.
update_team_member_role
DESTRUCTIVEMove 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.
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
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*stringUUID of the team.
user_id*stringUUID of the collaborator whose role is changing.
role*stringRole 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_REQUIREDno authenticated user on the request.
TOKEN_MISSING_ABILITYtoken lacks team-member:update-role.
TEAM_TIER_REQUIREDthe caller's platform tier does not include Teams.
RESOURCE_NOT_FOUNDno 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_FAILEDunknown role code.
How is this guide?