> For the complete documentation index, see [llms.txt](https://docs.kinesis.network/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.kinesis.network/mcp/tools/members.md).

# Members and invitations

List organization members, manage their roles and ownership, and invite people to join.

List organization members, manage their roles and ownership, and invite people to join.

These are action names. In default compact mode, call the indicated group tool with `{"action":"<action-name>","params":{...}}`; the arguments below go inside `params`. In `?mode=all`, call the action name directly with those arguments. `browse_github` and `read_docs` are direct tools in both modes. Expand each schema for nested fields, enum values and validation constraints. Successful results are JSON in both text content and `structuredContent`; failures use `isError` and `structuredContent.error`.

These actions use `sharing` and `sharing_write` in compact mode. Organization roles are `admin`, `developer` and `viewer`. Removing a member ends access in this organization; resources remain and apps keep running. Only the owner can transfer ownership. `details: true` adds member activity and resource counts only for admins using a credential that is not limited to projects.

The [OpenAI profile](/mcp/openai-profile.md) calls individual actions, omits `get_byod_token`, and restricts credential inputs and environment outputs. The input schemas below describe the standard catalog; profile-specific schemas are included where they differ.

## `list_members`

The members of an organization and their roles, admins first. These are the people add\_grantees can add to its projects, apps and grids

**Group:** `sharing` · **Behavior:** Read

**Compact tool:** `sharing` · **Action:** `list_members`

**MCP annotations:** `readOnlyHint: true` · `destructiveHint: false` · `idempotentHint: true` · `openWorldHint: false`

### Permissions and REST equivalents

| Operation      | REST           | Required scopes |
| -------------- | -------------- | --------------- |
| `members.list` | `GET /members` | `members:read`  |

### Arguments

| Argument  | Type      | Required | Description                                                                                      |
| --------- | --------- | -------- | ------------------------------------------------------------------------------------------------ |
| `details` | `boolean` | No       | For admins: also each member's last sign-in and what they created (lastSignInAt, created)        |
| `org`     | `string`  | No       | Slug of the organization to act in (see orgs.list); needed when the caller reaches more than one |

<details>

<summary>Complete input schema</summary>

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "details": {
      "type": "boolean",
      "description": "For admins: also each member's last sign-in and what they created (lastSignInAt, created)"
    },
    "org": {
      "description": "Slug of the organization to act in (see orgs.list); needed when the caller reaches more than one",
      "type": "string",
      "minLength": 3,
      "maxLength": 39
    }
  },
  "additionalProperties": false
}
```

</details>

### Result

* `members` (`array<object>`): See the complete response schema below.

<details>

<summary>Response schema: members.list</summary>

```json
{
  "type": "object",
  "properties": {
    "members": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "userId": {
            "type": "string",
            "description": "What add_grantees and the member calls take"
          },
          "email": {
            "type": "string"
          },
          "name": {
            "type": [
              "string",
              "null"
            ]
          },
          "role": {
            "type": "string",
            "enum": [
              "admin",
              "developer",
              "viewer"
            ]
          },
          "joinedAt": {
            "type": "string"
          },
          "isOwner": {
            "type": "boolean",
            "description": "Owns the organization: always an admin, and stays until they transfer ownership"
          },
          "lastSignInAt": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "description": "ISO 8601 timestamp (UTC)"
              },
              {
                "type": "null"
              }
            ],
            "description": "With details, for admins: when they last signed in"
          },
          "created": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "projects": {
                    "type": "integer"
                  },
                  "apps": {
                    "type": "integer"
                  },
                  "grids": {
                    "type": "integer"
                  }
                },
                "required": [
                  "projects",
                  "apps",
                  "grids"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ],
            "description": "With details, for admins: what they created here, which stays when they leave"
          }
        },
        "required": [
          "userId",
          "email",
          "name",
          "role",
          "joinedAt",
          "isOwner",
          "lastSignInAt",
          "created"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "members"
  ],
  "additionalProperties": false
}
```

</details>

Operation-specific errors: `400 org_required`.

## `set_member_role`

Change a member's role (admins). Their invitations above the new role are withdrawn

**Group:** `sharing` · **Behavior:** Write

**Compact tool:** `sharing_write` · **Action:** `set_member_role`

**MCP annotations:** `readOnlyHint: false` · `destructiveHint: true` · `idempotentHint: true` · `openWorldHint: false`

### Permissions and REST equivalents

| Operation        | REST                      | Required scopes |
| ---------------- | ------------------------- | --------------- |
| `members.update` | `PATCH /members/{userId}` | `members:write` |

### Arguments

| Argument | Type                               | Required | Description                                                                                      |
| -------- | ---------------------------------- | -------- | ------------------------------------------------------------------------------------------------ |
| `role`   | `"admin" / "developer" / "viewer"` | Yes      | Their new role                                                                                   |
| `userId` | `string`                           | Yes      | The member's user id, from members.list                                                          |
| `org`    | `string`                           | No       | Slug of the organization to act in (see orgs.list); needed when the caller reaches more than one |

<details>

<summary>Complete input schema</summary>

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "role": {
      "type": "string",
      "enum": [
        "admin",
        "developer",
        "viewer"
      ],
      "description": "Their new role"
    },
    "userId": {
      "type": "string",
      "pattern": "^[0-9a-fA-F]{24}$",
      "description": "The member's user id, from members.list"
    },
    "org": {
      "description": "Slug of the organization to act in (see orgs.list); needed when the caller reaches more than one",
      "type": "string",
      "minLength": 3,
      "maxLength": 39
    }
  },
  "required": [
    "role",
    "userId"
  ],
  "additionalProperties": false
}
```

</details>

### Result

* `userId` (`string`): See the complete response schema below.
* `role` (`"admin" / "developer" / "viewer"`): See the complete response schema below.

<details>

<summary>Response schema: members.update</summary>

```json
{
  "type": "object",
  "properties": {
    "userId": {
      "type": "string"
    },
    "role": {
      "type": "string",
      "enum": [
        "admin",
        "developer",
        "viewer"
      ]
    }
  },
  "required": [
    "userId",
    "role"
  ],
  "additionalProperties": false
}
```

</details>

Operation-specific errors: `409 last_admin`, `409 owner`, `409 role_changed`, `400 org_required`, `403 key_project_restricted`.

## `remove_member`

Remove a member (admins), or leave with the caller's own user id. Their access, keys and connected apps in the organization end; what they created stays and their apps keep running.

**Group:** `sharing` · **Behavior:** Write

**Compact tool:** `sharing_write` · **Action:** `remove_member`

**MCP annotations:** `readOnlyHint: false` · `destructiveHint: true` · `idempotentHint: false` · `openWorldHint: false`

Requires `confirm: true` for this irreversible action.

### Permissions and REST equivalents

| Operation        | REST                       | Required scopes |
| ---------------- | -------------------------- | --------------- |
| `members.remove` | `DELETE /members/{userId}` | `members:write` |

### Arguments

| Argument  | Type     | Required | Description                                                                                      |
| --------- | -------- | -------- | ------------------------------------------------------------------------------------------------ |
| `userId`  | `string` | Yes      | The member's user id, from members.list                                                          |
| `confirm` | `true`   | Yes      | Must be true: this action cannot be undone                                                       |
| `org`     | `string` | No       | Slug of the organization to act in (see orgs.list); needed when the caller reaches more than one |

<details>

<summary>Complete input schema</summary>

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "userId": {
      "type": "string",
      "pattern": "^[0-9a-fA-F]{24}$",
      "description": "The member's user id, from members.list"
    },
    "confirm": {
      "type": "boolean",
      "const": true,
      "description": "Must be true: this action cannot be undone"
    },
    "org": {
      "description": "Slug of the organization to act in (see orgs.list); needed when the caller reaches more than one",
      "type": "string",
      "minLength": 3,
      "maxLength": 39
    }
  },
  "required": [
    "userId",
    "confirm"
  ],
  "additionalProperties": false
}
```

</details>

### Result

* `userId` (`string`): See the complete response schema below.
* `removed` (`true`): See the complete response schema below.
* `warning` (`string or null`): Set when a grid they had contributed to could not be fully released

<details>

<summary>Response schema: members.remove</summary>

```json
{
  "type": "object",
  "properties": {
    "userId": {
      "type": "string"
    },
    "removed": {
      "type": "boolean",
      "const": true
    },
    "warning": {
      "description": "Set when a grid they had contributed to could not be fully released",
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": [
    "userId",
    "removed",
    "warning"
  ],
  "additionalProperties": false
}
```

</details>

Operation-specific errors: `409 last_admin`, `409 owner`, `400 org_required`, `403 key_project_restricted`.

## `transfer_ownership`

Hand the organization to another member (its owner only). They become an admin if they aren't one; the previous owner stays an admin.

**Group:** `sharing` · **Behavior:** Write

**Compact tool:** `sharing_write` · **Action:** `transfer_ownership`

**MCP annotations:** `readOnlyHint: false` · `destructiveHint: true` · `idempotentHint: false` · `openWorldHint: false`

Requires `confirm: true` for this irreversible action.

### Permissions and REST equivalents

| Operation                | REST                  | Required scopes |
| ------------------------ | --------------------- | --------------- |
| `members.owner.transfer` | `POST /members/owner` | `members:write` |

### Arguments

| Argument  | Type     | Required | Description                                                                                      |
| --------- | -------- | -------- | ------------------------------------------------------------------------------------------------ |
| `userId`  | `string` | Yes      | The member's user id, from members.list                                                          |
| `confirm` | `true`   | Yes      | Must be true: this action cannot be undone                                                       |
| `org`     | `string` | No       | Slug of the organization to act in (see orgs.list); needed when the caller reaches more than one |

<details>

<summary>Complete input schema</summary>

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "userId": {
      "type": "string",
      "pattern": "^[0-9a-fA-F]{24}$",
      "description": "The member's user id, from members.list"
    },
    "confirm": {
      "type": "boolean",
      "const": true,
      "description": "Must be true: this action cannot be undone"
    },
    "org": {
      "description": "Slug of the organization to act in (see orgs.list); needed when the caller reaches more than one",
      "type": "string",
      "minLength": 3,
      "maxLength": 39
    }
  },
  "required": [
    "userId",
    "confirm"
  ],
  "additionalProperties": false
}
```

</details>

### Result

* `ownerUserId` (`string`): The new owner

<details>

<summary>Response schema: members.owner.transfer</summary>

```json
{
  "type": "object",
  "properties": {
    "ownerUserId": {
      "type": "string",
      "description": "The new owner"
    }
  },
  "required": [
    "ownerUserId"
  ],
  "additionalProperties": false
}
```

</details>

Operation-specific errors: `400 already_owner`, `409 owner_changed`, `409 role_changed`, `400 org_required`, `403 key_project_restricted`.

## `list_member_invitations`

Pending invitations to the organization, newest first. Admins see every one; a developer the ones they sent

**Group:** `sharing` · **Behavior:** Read

**Compact tool:** `sharing` · **Action:** `list_member_invitations`

**MCP annotations:** `readOnlyHint: true` · `destructiveHint: false` · `idempotentHint: true` · `openWorldHint: false`

### Permissions and REST equivalents

| Operation                  | REST                       | Required scopes |
| -------------------------- | -------------------------- | --------------- |
| `members.invitations.list` | `GET /members/invitations` | `members:read`  |

### Arguments

| Argument | Type     | Required | Description                                                                                      |
| -------- | -------- | -------- | ------------------------------------------------------------------------------------------------ |
| `org`    | `string` | No       | Slug of the organization to act in (see orgs.list); needed when the caller reaches more than one |

<details>

<summary>Complete input schema</summary>

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "org": {
      "description": "Slug of the organization to act in (see orgs.list); needed when the caller reaches more than one",
      "type": "string",
      "minLength": 3,
      "maxLength": 39
    }
  },
  "additionalProperties": false
}
```

</details>

### Result

* `invitations` (`array<object>`): See the complete response schema below.

<details>

<summary>Response schema: members.invitations.list</summary>

```json
{
  "type": "object",
  "properties": {
    "invitations": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Invitation id"
          },
          "email": {
            "type": "string"
          },
          "role": {
            "type": "string",
            "enum": [
              "admin",
              "developer",
              "viewer"
            ],
            "description": "The role they join with"
          },
          "invitedBy": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "userId": {
                    "type": "string",
                    "description": "User id, as members.list and the sharing calls use it"
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "email": {
                    "type": "string"
                  }
                },
                "required": [
                  "userId",
                  "name",
                  "email"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "expiresAt": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 timestamp (UTC)"
          },
          "expired": {
            "type": "boolean",
            "description": "Past its date; inviting the address again sends a fresh link"
          },
          "addsTo": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Names of the projects, apps and grids they are added to on joining"
          }
        },
        "required": [
          "id",
          "email",
          "role",
          "invitedBy",
          "expiresAt",
          "expired",
          "addsTo"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "invitations"
  ],
  "additionalProperties": false
}
```

</details>

Operation-specific errors: `400 org_required`, `403 key_project_restricted`.

## `invite_member`

Invite someone to the organization by email, at the caller's role or below. They get a link good for 7 days; inviting an address again sends a fresh one. addTo also adds them to a project, app or grid on joining.

**Group:** `sharing` · **Behavior:** Write

**Compact tool:** `sharing_write` · **Action:** `invite_member`

**MCP annotations:** `readOnlyHint: false` · `destructiveHint: true` · `idempotentHint: false` · `openWorldHint: true`

### Permissions and REST equivalents

| Operation                    | REST                          | Required scopes  |
| ---------------------------- | ----------------------------- | ---------------- |
| `members.invitations.create` | `POST /members/invitations`   | `members:write`  |
| Conditional                  | addTo.resourceType is project | `projects:admin` |
| Conditional                  | addTo.resourceType is app     | `apps:admin`     |
| Conditional                  | addTo.resourceType is grid    | `pools:admin`    |

### Arguments

| Argument | Type                               | Required | Description                                                                                      |
| -------- | ---------------------------------- | -------- | ------------------------------------------------------------------------------------------------ |
| `email`  | `string`                           | Yes      | Who to invite                                                                                    |
| `role`   | `"admin" / "developer" / "viewer"` | Yes      | The role they join with: admin, developer or viewer                                              |
| `addTo`  | `object`                           | No       | A project, app or grid of the organization the caller may add people to                          |
| `org`    | `string`                           | No       | Slug of the organization to act in (see orgs.list); needed when the caller reaches more than one |

<details>

<summary>Complete input schema</summary>

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "email": {
      "type": "string",
      "minLength": 1,
      "maxLength": 320,
      "description": "Who to invite"
    },
    "role": {
      "type": "string",
      "enum": [
        "admin",
        "developer",
        "viewer"
      ],
      "description": "The role they join with: admin, developer or viewer"
    },
    "addTo": {
      "type": "object",
      "properties": {
        "resourceType": {
          "type": "string",
          "enum": [
            "project",
            "app",
            "grid"
          ],
          "description": "What is shared"
        },
        "resourceId": {
          "type": "string",
          "minLength": 1,
          "description": "Project or app id, or grid id"
        }
      },
      "required": [
        "resourceType",
        "resourceId"
      ],
      "additionalProperties": {},
      "description": "A project, app or grid of the organization the caller may add people to"
    },
    "org": {
      "description": "Slug of the organization to act in (see orgs.list); needed when the caller reaches more than one",
      "type": "string",
      "minLength": 3,
      "maxLength": 39
    }
  },
  "required": [
    "email",
    "role"
  ],
  "additionalProperties": false
}
```

</details>

### Result

* `id` (`string`): Invitation id
* `email` (`string`): See the complete response schema below.
* `role` (`"admin" / "developer" / "viewer"`): The role they join with
* `invitedBy` (`object or null`): See the complete response schema below.
* `expiresAt` (`string`): ISO 8601 timestamp (UTC)
* `expired` (`boolean`): Past its date; inviting the address again sends a fresh link
* `addsTo` (`array<string>`): Names of the projects, apps and grids they are added to on joining
* `warning` (`string or null`): Set when the invitation was saved but its email could not be sent

<details>

<summary>Response schema: members.invitations.create</summary>

```json
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Invitation id"
    },
    "email": {
      "type": "string"
    },
    "role": {
      "type": "string",
      "enum": [
        "admin",
        "developer",
        "viewer"
      ],
      "description": "The role they join with"
    },
    "invitedBy": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "userId": {
              "type": "string",
              "description": "User id, as members.list and the sharing calls use it"
            },
            "name": {
              "type": [
                "string",
                "null"
              ]
            },
            "email": {
              "type": "string"
            }
          },
          "required": [
            "userId",
            "name",
            "email"
          ],
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ]
    },
    "expiresAt": {
      "type": "string",
      "format": "date-time",
      "description": "ISO 8601 timestamp (UTC)"
    },
    "expired": {
      "type": "boolean",
      "description": "Past its date; inviting the address again sends a fresh link"
    },
    "addsTo": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Names of the projects, apps and grids they are added to on joining"
    },
    "warning": {
      "description": "Set when the invitation was saved but its email could not be sent",
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": [
    "id",
    "email",
    "role",
    "invitedBy",
    "expiresAt",
    "expired",
    "addsTo",
    "warning"
  ],
  "additionalProperties": false
}
```

</details>

Operation-specific errors: `400 invalid_email`, `403 invites_admins_only`, `403 role_too_high`, `409 already_member`, `409 invitation_exists`, `429 resend_too_soon`, `429 invitation_limit`, `400 org_required`, `403 key_project_restricted`.

## `revoke_member_invitation`

Withdraw a pending invitation to the organization. Its link stops working

**Group:** `sharing` · **Behavior:** Write

**Compact tool:** `sharing_write` · **Action:** `revoke_member_invitation`

**MCP annotations:** `readOnlyHint: false` · `destructiveHint: true` · `idempotentHint: false` · `openWorldHint: false`

### Permissions and REST equivalents

| Operation                    | REST                                         | Required scopes |
| ---------------------------- | -------------------------------------------- | --------------- |
| `members.invitations.revoke` | `DELETE /members/invitations/{invitationId}` | `members:write` |

### Arguments

| Argument       | Type     | Required | Description                                                                                      |
| -------------- | -------- | -------- | ------------------------------------------------------------------------------------------------ |
| `invitationId` | `string` | Yes      | Invitation id, from members.invitations.list                                                     |
| `org`          | `string` | No       | Slug of the organization to act in (see orgs.list); needed when the caller reaches more than one |

<details>

<summary>Complete input schema</summary>

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "invitationId": {
      "type": "string",
      "pattern": "^[0-9a-fA-F]{24}$",
      "description": "Invitation id, from members.invitations.list"
    },
    "org": {
      "description": "Slug of the organization to act in (see orgs.list); needed when the caller reaches more than one",
      "type": "string",
      "minLength": 3,
      "maxLength": 39
    }
  },
  "required": [
    "invitationId"
  ],
  "additionalProperties": false
}
```

</details>

### Result

* `invitationId` (`string`): See the complete response schema below.
* `revoked` (`true`): See the complete response schema below.

<details>

<summary>Response schema: members.invitations.revoke</summary>

```json
{
  "type": "object",
  "properties": {
    "invitationId": {
      "type": "string"
    },
    "revoked": {
      "type": "boolean",
      "const": true
    }
  },
  "required": [
    "invitationId",
    "revoked"
  ],
  "additionalProperties": false
}
```

</details>

Operation-specific errors: `400 org_required`, `403 key_project_restricted`.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.kinesis.network/mcp/tools/members.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
