# 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 organization
- `ownership_transfers_cancel`: Cancel the open offer of ownership
- `ownership_transfers_create`: Offer ownership to another member
- `ownership_transfers_get`: Get the open offer of ownership
- `ownership_transfers_list_mine`: List the offers of ownership for you

## `ownership_transfers_accept`

**Accept ownership of an organization.** Operation [`ownership_transfers.accept`](https://ownrecord.io/docs/reference/ownership-transfers-accept.md) · 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_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

- [`ownership_transfer_not_found`](https://ownrecord.io/docs/reference/errors.md#ownership_transfer_not_found): No open offer of this organization is addressed to you.
- [`owner_required`](https://ownrecord.io/docs/reference/errors.md#owner_required): The caller isn't a signed-in person.
- [`version_conflict`](https://ownrecord.io/docs/reference/errors.md#version_conflict): The offer or a membership changed at the same time; try again.
- [`fresh_auth_required`](https://ownrecord.io/docs/reference/errors.md#fresh_auth_required): Your last sign-in is older than 15 minutes.
- [`permission_denied`](https://ownrecord.io/docs/reference/errors.md#permission_denied): The caller isn't a signed-in user.

### Example

**Accept the offer**

Arguments:

```json
{
  "orgId": "org_01m4tx5nj7ekd958x53w4bntcg",
  "idempotency_key": "8d0c5f8e-4b7a-4e43-9b0f-2f6a0c1d9e21"
}
```

Result `output`:

```json
{
  "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`](https://ownrecord.io/docs/reference/ownership-transfers-cancel.md) · 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_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

- [`owner_required`](https://ownrecord.io/docs/reference/errors.md#owner_required): You aren't an owner of the organization.
- [`ownership_transfer_not_found`](https://ownrecord.io/docs/reference/errors.md#ownership_transfer_not_found): There's no open offer (it was accepted, cancelled or expired).
- [`version_conflict`](https://ownrecord.io/docs/reference/errors.md#version_conflict): The offer changed at the same time (for example, it was just accepted).
- [`permission_denied`](https://ownrecord.io/docs/reference/errors.md#permission_denied): You can't manage this organization.

### Example

**Withdraw the offer**

Arguments:

```json
{
  "idempotency_key": "8d0c5f8e-4b7a-4e43-9b0f-2f6a0c1d9e21"
}
```

Result `output`:

```json
{
  "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`](https://ownrecord.io/docs/reference/ownership-transfers-create.md) · 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_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

- [`owner_required`](https://ownrecord.io/docs/reference/errors.md#owner_required): You aren't an owner of the organization (or you aren't a person).
- [`ownership_transfer_not_allowed`](https://ownrecord.io/docs/reference/errors.md#ownership_transfer_not_allowed): The person isn't a member, is an owner already, or is you (`details.problem`).
- [`ownership_transfer_exists`](https://ownrecord.io/docs/reference/errors.md#ownership_transfer_exists): An offer is open already; cancel it first.
- [`fresh_auth_required`](https://ownrecord.io/docs/reference/errors.md#fresh_auth_required): Your last sign-in is older than 15 minutes.
- [`permission_denied`](https://ownrecord.io/docs/reference/errors.md#permission_denied): You can't manage this organization.

### Example

**Offer ownership to an admin**

Arguments:

```json
{
  "toUserId": "usr_01m4tx5nj8emwbyf7y9vcf47xb",
  "idempotency_key": "8d0c5f8e-4b7a-4e43-9b0f-2f6a0c1d9e21"
}
```

Result `output`:

```json
{
  "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`](https://ownrecord.io/docs/reference/ownership-transfers-get.md) · 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_key` is ignored.

### Errors

- [`permission_denied`](https://ownrecord.io/docs/reference/errors.md#permission_denied): You can't read this organization.

### Example

**An offer waiting for the member**

Arguments:

```json
{}
```

Result `output`:

```json
{
  "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`](https://ownrecord.io/docs/reference/ownership-transfers-list-mine.md) · 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_key` is ignored.

### Errors

- [`permission_denied`](https://ownrecord.io/docs/reference/errors.md#permission_denied): The caller isn't a signed-in user.

### Example

**One offer**

Arguments:

```json
{}
```

Result `output`:

```json
{
  "object": "list",
  "data": [
    {
      "orgId": "org_01m4tx5nj7ekd958x53w4bntcg",
      "organization": {
        "slug": "acme",
        "name": "Acme"
      },
      "fromUserId": "usr_01m4tx5nj8emwbyf7y9vcf47xa",
      "expiresAt": "2026-11-02T09:00:00.000Z"
    }
  ]
}
```
