Ownership transfers tools
MCP tools for Ownership transfers: ownership_transfers_accept, ownership_transfers_cancel, ownership_transfers_create, ownership_transfers_get, ownership_transfers_list_mine.
ownership_transfers_accept: Accept ownership of an organizationownership_transfers_cancel: Cancel the open offer of ownershipownership_transfers_create: Offer ownership to another memberownership_transfers_get: Get the open offer of ownershipownership_transfers_list_mine: List the offers of ownership for you
ownership_transfers_accept
Accept ownership of an organization. Operation ownership_transfers.accept · Platform level · permission account:write · risk tier security · since M12
Accepts the offer of ownership an owner made to you: you become an owner of the whole organization
(org_owner), and the owner who offered it becomes an admin. You must be signed in as the member the offer is
for, with a sign-in in the last 15 minutes; the offer must still be open (7 days).
Who can call it: the signed-in member the offer is addressed to.
Annotations: readOnlyHint: false · destructiveHint: false · idempotentHint: false · openWorldHint: false
Arguments
| Argument | Type | Required | Description |
|---|---|---|---|
orgId | ID (org_…) | yes | – |
idempotency_key | string | no | A 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_run | boolean | no | true: check permissions and rules and compute the result, then roll everything back. Nothing is saved. (default false) |
- Idempotency: the result returns the
idempotency_keyused, 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: truechecks permissions and rules and computes the result, then rolls everything back.
Errors
ownership_transfer_not_found: No open offer of this organization is addressed to you.owner_required: The caller isn't a signed-in person.version_conflict: The offer or a membership changed at the same time; try again.fresh_auth_required: Your last sign-in is older than 15 minutes.permission_denied: The caller isn't a signed-in user.
Example
Accept the offer
Arguments:
{
"orgId": "org_01m4tx5nj7ekd958x53w4bntcg",
"idempotency_key": "8d0c5f8e-4b7a-4e43-9b0f-2f6a0c1d9e21"
}
Result output:
{
"organization": {
"id": "org_01m4tx5nj7ekd958x53w4bntcg",
"slug": "acme",
"name": "Acme"
},
"membership": {
"id": "mem_01m4tx5nj8emwbyf7y9vcf47x6",
"object": "membership",
"orgId": "org_01m4tx5nj7ekd958x53w4bntcg",
"userId": "usr_01m4tx5nj8emwbyf7y9vcf47xb",
"role": "org_owner",
"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"
},
"previousOwnerMembership": {
"id": "mem_01m4tx5nj8emwbyf7y9vcf47x6",
"object": "membership",
"orgId": "org_01m4tx5nj7ekd958x53w4bntcg",
"userId": "usr_01m4tx5nj8emwbyf7y9vcf47xb",
"role": "org_admin",
"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"
}
}
ownership_transfers_cancel
Cancel the open offer of ownership. Operation ownership_transfers.cancel · Organization level · permission org:admin · risk tier write · since M12
Withdraws the organization's open offer of ownership before the member accepts it. Returns the cancelled offer. Only an owner can cancel it.
Annotations: readOnlyHint: false · destructiveHint: false · idempotentHint: false · openWorldHint: false
Arguments
| Argument | Type | Required | Description |
|---|---|---|---|
idempotency_key | string | no | A 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_run | boolean | no | true: check permissions and rules and compute the result, then roll everything back. Nothing is saved. (default false) |
- Idempotency: the result returns the
idempotency_keyused, 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: truechecks permissions and rules and computes the result, then rolls everything back.
Errors
owner_required: You aren't an owner of the organization.ownership_transfer_not_found: There's no open offer (it was accepted, cancelled or expired).version_conflict: The offer changed at the same time (for example, it was just accepted).permission_denied: You can't manage this organization.
Example
Withdraw the offer
Arguments:
{
"idempotency_key": "8d0c5f8e-4b7a-4e43-9b0f-2f6a0c1d9e21"
}
Result output:
{
"object": "ownership_transfer",
"orgId": "org_01m4tx5nj7ekd958x53w4bntcg",
"fromUserId": "usr_01m4tx5nj8emwbyf7y9vcf47xa",
"toUserId": "usr_01m4tx5nj8emwbyf7y9vcf47xb",
"toEmail": "ana@acme.example",
"status": "pending",
"createdAt": "2026-10-26T09:00:00.000Z",
"expiresAt": "2026-11-02T09:00:00.000Z"
}
ownership_transfers_create
Offer ownership to another member. Operation ownership_transfers.create · Organization level · permission org:admin · risk tier security · since M12
An owner offers ownership of the organization to another member. The member is emailed and has 7 days to
accept (ownership_transfers.accept, with their own recent sign-in). When they accept, they become an owner
and you become an admin (org_admin), so the organization keeps the same number of owners. Until then
nothing changes, and you can withdraw the offer (ownership_transfers.cancel). One offer is open at a time.
Only an owner can offer ownership, from the console, with a sign-in in the last 15 minutes.
Annotations: readOnlyHint: false · destructiveHint: false · idempotentHint: false · openWorldHint: true
Arguments
| Argument | Type | Required | Description |
|---|---|---|---|
toUserId | ID (usr_…) | yes | The member who would become the owner. |
idempotency_key | string | no | A 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_run | boolean | no | true: check permissions and rules and compute the result, then roll everything back. Nothing is saved. (default false) |
- Idempotency: the result returns the
idempotency_keyused, 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: truechecks permissions and rules and computes the result, then rolls everything back.
Errors
owner_required: You aren't an owner of the organization (or you aren't a person).ownership_transfer_not_allowed: The person isn't a member, is an owner already, or is you (details.problem).ownership_transfer_exists: An offer is open already; cancel it first.fresh_auth_required: Your last sign-in is older than 15 minutes.permission_denied: You can't manage this organization.
Example
Offer ownership to an admin
Arguments:
{
"toUserId": "usr_01m4tx5nj8emwbyf7y9vcf47xb",
"idempotency_key": "8d0c5f8e-4b7a-4e43-9b0f-2f6a0c1d9e21"
}
Result output:
{
"object": "ownership_transfer",
"orgId": "org_01m4tx5nj7ekd958x53w4bntcg",
"fromUserId": "usr_01m4tx5nj8emwbyf7y9vcf47xa",
"toUserId": "usr_01m4tx5nj8emwbyf7y9vcf47xb",
"toEmail": "ana@acme.example",
"status": "pending",
"createdAt": "2026-10-26T09:00:00.000Z",
"expiresAt": "2026-11-02T09:00:00.000Z"
}
ownership_transfers_get
Get the open offer of ownership. Operation ownership_transfers.get · Organization level · permission org:read · risk tier read · since M12
Returns the organization's open offer of ownership (pending), or null when there's none: who offered it, to
whom, and until when it can be accepted. Offers lapse after 7 days.
Annotations: readOnlyHint: true · destructiveHint: false · idempotentHint: true · openWorldHint: false
Arguments
This tool takes no arguments.
- Read-only: changes nothing;
idempotency_keyis ignored.
Errors
permission_denied: You can't read this organization.
Example
An offer waiting for the member
Arguments:
{}
Result output:
{
"object": "ownership_transfer_status",
"orgId": "org_01m4tx5nj7ekd958x53w4bntcg",
"pending": {
"object": "ownership_transfer",
"orgId": "org_01m4tx5nj7ekd958x53w4bntcg",
"fromUserId": "usr_01m4tx5nj8emwbyf7y9vcf47xa",
"toUserId": "usr_01m4tx5nj8emwbyf7y9vcf47xb",
"toEmail": "ana@acme.example",
"status": "pending",
"createdAt": "2026-10-26T09:00:00.000Z",
"expiresAt": "2026-11-02T09:00:00.000Z"
}
}
ownership_transfers_list_mine
List the offers of ownership for you. Operation ownership_transfers.list_mine · Platform level · permission account:read · risk tier read · since M12
Lists the open offers of ownership addressed to you, with the organization and when each offer lapses.
Accept one with ownership_transfers.accept.
Who can call it: any signed-in user.
Annotations: readOnlyHint: true · destructiveHint: false · idempotentHint: true · openWorldHint: false
Arguments
This tool takes no arguments.
- Read-only: changes nothing;
idempotency_keyis ignored.
Errors
permission_denied: The caller isn't a signed-in user.
Example
One offer
Arguments:
{}
Result output:
{
"object": "list",
"data": [
{
"orgId": "org_01m4tx5nj7ekd958x53w4bntcg",
"organization": {
"slug": "acme",
"name": "Acme"
},
"fromUserId": "usr_01m4tx5nj8emwbyf7y9vcf47xa",
"expiresAt": "2026-11-02T09:00:00.000Z"
}
]
}