> ## Documentation Index
> Fetch the complete documentation index at: https://docs.agentlinkops.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Workspace Access tools

> Inputs, access and errors for 10 registered workspace access tools.

Generated 2026-09-13T03:11:22.248Z from `src/tool-registry.js` by `scripts/export-mint-tool-docs.mjs`. 10 of 62 registered tools. Authenticated cloud tools have REST endpoints under `/v1/`. The anonymous `verify_link_free` tool uses `POST /free/check` and `/free/mcp`.

## get\_workspace

Read workspace limits, usage and membership.

* **State**: Registered and locally tested.
* **Access**: read · scope: `projects:read` · defined at `src/tool-registry.js:28`

No inputs.

**Error codes**: `CHECK_COOLDOWN` · `CHECK_QUOTA_EXCEEDED` · `CURSOR_EXPIRED` · `IDEMPOTENCY_CONFLICT` · `INVALID_CURSOR` · `INVALID_GRANT` · `INVALID_INPUT` · `INVALID_LIMIT` · `INVALID_URL` · `JOB_NOT_FOUND` · `PROJECT_GRANT_RESTRICTED` · `PROJECT_NOT_FOUND` · `READ_ONLY_MEMBER` · `UNAUTHORIZED` · `WATCH_BUSY` · `WATCH_NOT_FOUND` · `WATCH_PAUSED` · `WATCH_QUOTA_EXCEEDED` · `WORKSPACE_ACCESS_DENIED`

## get\_usage

Read workspace usage, allowance and billing availability for one UTC month. Source and destination checks share allowance; reserved, consumed and released are separate totals.

* **State**: Registered and locally tested.
* **Access**: read · scope: `projects:read` · defined at `src/tool-registry.js:49`

| Input    | Type   | Required | Notes                                                                   |
| -------- | ------ | -------- | ----------------------------------------------------------------------- |
| `period` | string | no       | Billing month in UTC, formatted YYYY-MM; defaults to the current month. |

**Error codes**: `INVALID_PROVIDER_EVENT` · `INVALID_QUANTITY` · `PROVIDER_EVENT_CONFLICT`

## list\_members

List this workspace's members with their role and, when narrowed, the exact projects they can see. A null project list means every project.

* **State**: Registered.
* **Access**: read · scope: `projects:read` · defined at `src/tool-registry.js:58`

No inputs.

**Error codes**: `ADMIN_REQUIRED` · `ALREADY_A_MEMBER` · `INVALID_ACCEPTANCE` · `INVALID_EMAIL` · `INVALID_PROJECT_GRANT` · `INVALID_ROLE` · `INVITATION_ALREADY_ACCEPTED` · `INVITATION_ALREADY_OPEN` · `INVITATION_CHANGED` · `INVITATION_EMAIL_MISMATCH` · `INVITATION_EXPIRED` · `INVITATION_NOT_FOUND` · `INVITATION_NOT_OPEN` · `INVITATION_REVOKED` · `LAST_OWNER` · `MEMBERSHIP_CHANGED` · `MEMBER_NOT_FOUND` · `OWNER_CANNOT_BE_SCOPED` · `PROJECT_NOT_FOUND` · `ROLE_EXCEEDS_ACTOR` · `ROLE_EXCEEDS_INVITER` · `TARGET_OUTRANKS_ACTOR` · `WORKSPACE_ACCESS_DENIED`

## invite\_member

Invite one email address as admin, member or viewer, optionally scoped to specific projects. Returns a join token ONCE; only its hash is stored. The token alone is NOT enough to join — the accepting user's VERIFIED email must match the invitation, so a forwarded link cannot admit a stranger. An invitation can never grant a role or a project the inviter does not hold, and owner is not invitable: transferring ownership is its own act. Linktrail does not send the email; hand the token to the person yourself.

* **State**: Registered.
* **Access**: write · scope: `projects:write` · defined at `src/tool-registry.js:59`

| Input        | Type   | Required | Notes                                                                                              |
| ------------ | ------ | -------- | -------------------------------------------------------------------------------------------------- |
| `email`      | string | yes      | Email address to bind an invitation to; Linktrail does not send the invitation.                    |
| `role`       | string | no       | Workspace access role; cannot exceed the acting member’s authority.; one of: admin, member, viewer |
| `projectIds` | array  | no       | Accessible project IDs. Where nullable, null grants all projects.                                  |

**Side effects**: write

**Error codes**: `ADMIN_REQUIRED` · `ALREADY_A_MEMBER` · `INVALID_ACCEPTANCE` · `INVALID_EMAIL` · `INVALID_PROJECT_GRANT` · `INVALID_ROLE` · `INVITATION_ALREADY_ACCEPTED` · `INVITATION_ALREADY_OPEN` · `INVITATION_CHANGED` · `INVITATION_EMAIL_MISMATCH` · `INVITATION_EXPIRED` · `INVITATION_NOT_FOUND` · `INVITATION_NOT_OPEN` · `INVITATION_REVOKED` · `LAST_OWNER` · `MEMBERSHIP_CHANGED` · `MEMBER_NOT_FOUND` · `OWNER_CANNOT_BE_SCOPED` · `PROJECT_NOT_FOUND` · `ROLE_EXCEEDS_ACTOR` · `ROLE_EXCEEDS_INVITER` · `TARGET_OUTRANKS_ACTOR` · `WORKSPACE_ACCESS_DENIED`

## list\_invitations

List open, accepted and revoked invitations. Tokens are never returned.

* **State**: Registered.
* **Access**: read · scope: `projects:read` · defined at `src/tool-registry.js:60`

No inputs.

**Error codes**: `ADMIN_REQUIRED` · `ALREADY_A_MEMBER` · `INVALID_ACCEPTANCE` · `INVALID_EMAIL` · `INVALID_PROJECT_GRANT` · `INVALID_ROLE` · `INVITATION_ALREADY_ACCEPTED` · `INVITATION_ALREADY_OPEN` · `INVITATION_CHANGED` · `INVITATION_EMAIL_MISMATCH` · `INVITATION_EXPIRED` · `INVITATION_NOT_FOUND` · `INVITATION_NOT_OPEN` · `INVITATION_REVOKED` · `LAST_OWNER` · `MEMBERSHIP_CHANGED` · `MEMBER_NOT_FOUND` · `OWNER_CANNOT_BE_SCOPED` · `PROJECT_NOT_FOUND` · `ROLE_EXCEEDS_ACTOR` · `ROLE_EXCEEDS_INVITER` · `TARGET_OUTRANKS_ACTOR` · `WORKSPACE_ACCESS_DENIED`

## revoke\_invitation

Revoke an open invitation so its token can no longer be used.

* **State**: Registered and locally tested.
* **Access**: write · scope: `projects:write` · defined at `src/tool-registry.js:61`

| Input          | Type   | Required | Notes                                                                  |
| -------------- | ------ | -------- | ---------------------------------------------------------------------- |
| `invitationId` | string | yes      | Identifier of the invitation returned by its create or list operation. |

**Side effects**: write

**Error codes**: `ADMIN_REQUIRED` · `ALREADY_A_MEMBER` · `INVALID_ACCEPTANCE` · `INVALID_EMAIL` · `INVALID_PROJECT_GRANT` · `INVALID_ROLE` · `INVITATION_ALREADY_ACCEPTED` · `INVITATION_ALREADY_OPEN` · `INVITATION_CHANGED` · `INVITATION_EMAIL_MISMATCH` · `INVITATION_EXPIRED` · `INVITATION_NOT_FOUND` · `INVITATION_NOT_OPEN` · `INVITATION_REVOKED` · `LAST_OWNER` · `MEMBERSHIP_CHANGED` · `MEMBER_NOT_FOUND` · `OWNER_CANNOT_BE_SCOPED` · `PROJECT_NOT_FOUND` · `ROLE_EXCEEDS_ACTOR` · `ROLE_EXCEEDS_INVITER` · `TARGET_OUTRANKS_ACTOR` · `WORKSPACE_ACCESS_DENIED`

## set\_member\_access

Change one member's role, their project grant, or both. A grant of null means every project. Refusals worth knowing: the last owner cannot be demoted, nobody can raise their own role or outrank their actor, and an owner cannot be scoped to specific projects because a scoped owner can lock a project away from everyone. A member's grant is the CEILING on every key they hold, so narrowing it narrows their existing keys immediately.

* **State**: Registered and locally tested.
* **Access**: write · scope: `projects:write` · defined at `src/tool-registry.js:62`

| Input        | Type        | Required | Notes                                                                                                     |
| ------------ | ----------- | -------- | --------------------------------------------------------------------------------------------------------- |
| `userId`     | string      | yes      | Identifier of the user returned by its create or list operation.                                          |
| `role`       | string      | no       | Workspace access role; cannot exceed the acting member’s authority.; one of: owner, admin, member, viewer |
| `projectIds` | array\|null | no       | Accessible project IDs. Where nullable, null grants all projects.                                         |

**Side effects**: write

**Error codes**: `ADMIN_REQUIRED` · `ALREADY_A_MEMBER` · `INVALID_ACCEPTANCE` · `INVALID_EMAIL` · `INVALID_PROJECT_GRANT` · `INVALID_ROLE` · `INVITATION_ALREADY_ACCEPTED` · `INVITATION_ALREADY_OPEN` · `INVITATION_CHANGED` · `INVITATION_EMAIL_MISMATCH` · `INVITATION_EXPIRED` · `INVITATION_NOT_FOUND` · `INVITATION_NOT_OPEN` · `INVITATION_REVOKED` · `LAST_OWNER` · `MEMBERSHIP_CHANGED` · `MEMBER_NOT_FOUND` · `OWNER_CANNOT_BE_SCOPED` · `PROJECT_NOT_FOUND` · `ROLE_EXCEEDS_ACTOR` · `ROLE_EXCEEDS_INVITER` · `TARGET_OUTRANKS_ACTOR` · `WORKSPACE_ACCESS_DENIED`

## remove\_member

Remove a member from this workspace. Their keys stop working on the next request, because every principal re-reads membership per request. The last owner cannot be removed.

* **State**: Registered and locally tested.
* **Access**: write · scope: `projects:write` · defined at `src/tool-registry.js:66`

| Input    | Type   | Required | Notes                                                            |
| -------- | ------ | -------- | ---------------------------------------------------------------- |
| `userId` | string | yes      | Identifier of the user returned by its create or list operation. |

**Side effects**: write

**Error codes**: `ADMIN_REQUIRED` · `ALREADY_A_MEMBER` · `INVALID_ACCEPTANCE` · `INVALID_EMAIL` · `INVALID_PROJECT_GRANT` · `INVALID_ROLE` · `INVITATION_ALREADY_ACCEPTED` · `INVITATION_ALREADY_OPEN` · `INVITATION_CHANGED` · `INVITATION_EMAIL_MISMATCH` · `INVITATION_EXPIRED` · `INVITATION_NOT_FOUND` · `INVITATION_NOT_OPEN` · `INVITATION_REVOKED` · `LAST_OWNER` · `MEMBERSHIP_CHANGED` · `MEMBER_NOT_FOUND` · `OWNER_CANNOT_BE_SCOPED` · `PROJECT_NOT_FOUND` · `ROLE_EXCEEDS_ACTOR` · `ROLE_EXCEEDS_INVITER` · `TARGET_OUTRANKS_ACTOR` · `WORKSPACE_ACCESS_DENIED`

## list\_projects

List projects available to this agent.

* **State**: Registered and locally tested.
* **Access**: read · scope: `projects:read` · defined at `src/tool-registry.js:77`

| Input    | Type    | Required | Notes                                                                       |
| -------- | ------- | -------- | --------------------------------------------------------------------------- |
| `cursor` | string  | no       | Opaque continuation returned by this same listing; omit for the first page. |
| `limit`  | integer | no       | Maximum rows in this page or bounded report; subject to the schema maximum. |

**Error codes**: `CHECK_COOLDOWN` · `CHECK_QUOTA_EXCEEDED` · `CURSOR_EXPIRED` · `IDEMPOTENCY_CONFLICT` · `INVALID_CURSOR` · `INVALID_GRANT` · `INVALID_INPUT` · `INVALID_LIMIT` · `INVALID_URL` · `JOB_NOT_FOUND` · `PROJECT_GRANT_RESTRICTED` · `PROJECT_NOT_FOUND` · `READ_ONLY_MEMBER` · `UNAUTHORIZED` · `WATCH_BUSY` · `WATCH_NOT_FOUND` · `WATCH_PAUSED` · `WATCH_QUOTA_EXCEEDED` · `WORKSPACE_ACCESS_DENIED`

## create\_project

Create a project for the product domain.

* **State**: Registered and locally tested.
* **Access**: write · scope: `projects:write` · defined at `src/tool-registry.js:78`

| Input    | Type   | Required | Notes                                                          |
| -------- | ------ | -------- | -------------------------------------------------------------- |
| `name`   | string | yes      | Human-readable name for the resource being created or updated. |
| `domain` | string | yes      | Project domain name, for example example.com.                  |

**Side effects**: write

**Error codes**: `CHECK_COOLDOWN` · `CHECK_QUOTA_EXCEEDED` · `CURSOR_EXPIRED` · `IDEMPOTENCY_CONFLICT` · `INVALID_CURSOR` · `INVALID_GRANT` · `INVALID_INPUT` · `INVALID_LIMIT` · `INVALID_URL` · `JOB_NOT_FOUND` · `PROJECT_GRANT_RESTRICTED` · `PROJECT_NOT_FOUND` · `READ_ONLY_MEMBER` · `UNAUTHORIZED` · `WATCH_BUSY` · `WATCH_NOT_FOUND` · `WATCH_PAUSED` · `WATCH_QUOTA_EXCEEDED` · `WORKSPACE_ACCESS_DENIED`
