{
  "tools": [
    {
      "name": "createWorkspaceWebhook",
      "description": "Create workspace webhook. Use this when the user wants to register a webhook endpoint; store the signing secret immediately.\n\nRegisters a new workspace webhook endpoint and returns the plaintext\n`signing_secret` EXACTLY ONCE in the 201 body — it is never retrievable\nafterwards (v1ListWorkspaceWebhooks omits it), so capture and store it\nimmediately. `verification_token` is also returned for endpoint verification.\nRequires a PRO+ plan: FREE workspaces get 402. Each plan caps the number of\nactive endpoints (PRO=1, ELITE=3, ENTERPRISE=unlimited); exceeding it returns\n409 `endpoint_cap_exceeded` — delete an existing endpoint or upgrade. `url`\nmust be HTTPS and `subscribed_events` must be a non-empty list of known event\ntypes (otherwise 400). The endpoint starts in `pending` status until\nverified. Requires workspace:write scope and an ADMIN/OWNER role. Not\nidempotent — retrying creates duplicate endpoints (subject to the cap).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "subscribed_events": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "url": {
            "type": "string"
          }
        },
        "required": [
          "subscribed_events",
          "url"
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false
      },
      "x-contio-http": {
        "method": "POST",
        "path": "/v1/workspace/webhooks"
      }
    },
    {
      "name": "deleteWorkspaceApiKey",
      "description": "Delete workspace API key. Use this when the user wants to revoke an API key.\n\nSoft-deletes (revokes) a workspace API key by its `{id}` from\nv1ListWorkspaceApiKeys; requires the `workspace:write` scope AND an admin or\nowner role. This is destructive and takes effect immediately: any integration\nstill authenticating with that key starts receiving 401s, so confirm the key is\nunused before revoking. For IDOR protection the endpoint returns 404 (not 403)\nwhen the id belongs to another workspace, so a 404 is expected for\nnon-matching ids. A 402 indicates the feature is gated on the current plan.\nReturns 204 No Content on success. The operation is effectively idempotent (a\nrepeat delete 404s), so retries are safe.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "API Key ID"
          }
        },
        "required": [
          "id"
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": true
      },
      "x-contio-http": {
        "method": "DELETE",
        "path": "/v1/workspace/api-keys/{id}"
      }
    },
    {
      "name": "deleteWorkspaceWebhook",
      "description": "Delete workspace webhook. Use this when the user wants to remove a webhook endpoint.\n\nSoft-deletes a webhook endpoint by its `{id}` from v1ListWorkspaceWebhooks;\nrequires the `workspace:write` scope AND an admin or owner role. Once deleted\nthe endpoint stops receiving event deliveries immediately, so confirm nothing\ndepends on it before removing. Returns 204 No Content on success. An unknown id\nreturns 404. The operation is effectively idempotent (a repeat delete 404s), so\nretries after a network error are safe.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Webhook endpoint ID"
          }
        },
        "required": [
          "id"
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": true
      },
      "x-contio-http": {
        "method": "DELETE",
        "path": "/v1/workspace/webhooks/{id}"
      }
    },
    {
      "name": "getWorkspace",
      "description": "Get workspace settings. Use this when the user wants to view workspace name, plan, owner, and timestamps.\n\nReturns the caller's workspace record (name, plan, owner, timestamps).\nRequires the `workspace:read` scope AND an admin or owner role — a member with\na lesser role is rejected, so this is not a general \"who am I\" call for\nordinary users. Use it to read back the current `plan` (some features are plan\ngated) or to confirm settings after v1UpdateWorkspace. Returns 404 if the\nPrincipal has no resolvable workspace.",
      "inputSchema": {
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true
      },
      "x-contio-http": {
        "method": "GET",
        "path": "/v1/workspace"
      }
    },
    {
      "name": "listWorkspaceApiKeys",
      "description": "List workspace API keys. Use this when the user wants to view the workspace's non-revoked API keys.\n\nLists the workspace's non-revoked API keys; requires the `workspace:write`\nscope AND an admin or owner role. Each entry exposes only a masked prefix plus\nscopes and timestamps — the full secret key value is never returned by this or\nany read endpoint, so do not expect to recover a lost key here. Revoked keys\nare excluded. A 402 indicates the feature is gated on the current plan.\nPaginate with `limit` and `offset` (limit clamped to 1–100). Each key's `id` is\nwhat you pass to v1DeleteWorkspaceApiKey.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "integer",
            "description": "Limit"
          },
          "offset": {
            "type": "integer",
            "description": "Offset"
          }
        }
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true
      },
      "x-contio-http": {
        "method": "GET",
        "path": "/v1/workspace/api-keys"
      }
    },
    {
      "name": "listWorkspaceMembers",
      "description": "List workspace members. Use this when the user wants to see active members and pending invitations.\n\nLists the caller's workspace members; requires the `workspace:read` scope AND\nan admin or owner role. The result includes both active users and pending\ninvitations, so an entry may represent someone who has not yet accepted — check\neach member's state before assuming they are active. Paginate with `limit` and\n`offset` (limit clamped to 1–100) and read `total` from the envelope. Each\nmember carries the user id you pass to v1UpdateWorkspaceMemberRole or\nv1RemoveWorkspaceMember.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "integer",
            "description": "Items per page (default 25, clamped [1,100])"
          },
          "offset": {
            "type": "integer",
            "description": "Pagination offset (default 0)"
          }
        }
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true
      },
      "x-contio-http": {
        "method": "GET",
        "path": "/v1/workspace/members"
      }
    },
    {
      "name": "listWorkspaceWebhooks",
      "description": "List workspace webhooks. Use this when the user wants to view the workspace's registered webhook endpoints.\n\nLists the workspace's webhook endpoints; requires the `workspace:write` scope\nAND an admin or owner role. Deleted endpoints are excluded. Each entry carries\na `status` — an endpoint that has repeatedly failed delivery may be\nauto-disabled, in which case v1ReEnableWorkspaceWebhook is used to bring it\nback. Paginate with `limit` and `offset` (limit clamped to 1–100). Each\nendpoint's `id` is what you pass to v1DeleteWorkspaceWebhook and\nv1ReEnableWorkspaceWebhook.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "integer",
            "description": "Limit"
          },
          "offset": {
            "type": "integer",
            "description": "Offset"
          }
        }
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true
      },
      "x-contio-http": {
        "method": "GET",
        "path": "/v1/workspace/webhooks"
      }
    },
    {
      "name": "reEnableWorkspaceWebhook",
      "description": "Re-enable workspace webhook. Use this when the user wants to restore a disabled webhook endpoint.\n\nRe-enables a webhook endpoint that was auto-disabled after repeated delivery\nfailures, keyed by the `{id}` from v1ListWorkspaceWebhooks; requires the\n`workspace:write` scope AND an admin or owner role. It clears the auto-disable\nstate: status returns to verified and the failure counter is reset, so\ndeliveries resume. Fix the underlying endpoint (reachability, response codes)\nbefore re-enabling, or it will simply auto-disable again. Returns 200 on\nsuccess. The endpoint MUST currently be in the disabled state: re-enabling an\nendpoint that is not disabled returns 400 (`endpoint_not_disabled`). Supports\nan optional `Idempotency-Key` header: supply a client-generated printable-ASCII\nkey (max 255 chars) and the API replays the original `2xx` response for\nidentical repeats, returning `Idempotent-Replayed: true` on replays. Without a\nkey, a blind retry after the endpoint has already been re-enabled can return\n400, so check the endpoint's status via v1ListWorkspaceWebhooks first or use a\nkey.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "Idempotency-Key": {
            "type": "string",
            "description": "Optional client-generated idempotency key (max 255 printable ASCII). Repeat requests with the same key replay the original 2xx response."
          },
          "id": {
            "type": "string",
            "description": "Webhook endpoint ID"
          }
        },
        "required": [
          "id"
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true
      },
      "x-contio-http": {
        "method": "POST",
        "path": "/v1/workspace/webhooks/{id}/re-enable"
      }
    },
    {
      "name": "removeWorkspaceMember",
      "description": "Remove workspace member. Use this when the user wants to remove a member from the workspace.\n\nSoft-deletes a member from the caller's workspace, keyed by the `{userID}` from\nv1ListWorkspaceMembers; requires the `workspace:write` scope AND an admin or\nowner role. Two guard rules apply: removing yourself returns 400\n(`invalid_request`) and removing the workspace owner returns 403 (`forbidden`);\nneither succeeds, so this is not a way to leave a workspace. Treat the 403 as an\nauthorization guard, not a malformed request. Returns 204 No Content on success.\nAn unknown\nuser id returns 404. The removal is a soft delete and is effectively idempotent\n(a repeat removal 404s), so retries after a network error are safe.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "userID": {
            "type": "string",
            "description": "User ID of the member to remove"
          }
        },
        "required": [
          "userID"
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": true
      },
      "x-contio-http": {
        "method": "DELETE",
        "path": "/v1/workspace/members/{userID}"
      }
    },
    {
      "name": "rotateWorkspaceWebhookSecret",
      "description": "Rotate webhook signing secret. Use this when the user wants to reset a webhook endpoint's secret; store the new secret immediately.\n\nGenerates a NEW signing secret for the webhook endpoint identified by `{id}`\nand returns it EXACTLY ONCE in the 200 body — store it immediately, it is not\nretrievable later. This is destructive: the previous secret is invalidated\nright away, so any receiver still verifying signatures with the old secret\nwill start rejecting deliveries until you deploy the new one. Requires a PRO+\nplan (FREE gets 402, and the plan gate short-circuits before the endpoint\nlookup — a FREE caller sees 402 even for an unknown id). An unknown or\nother-workspace `{id}` returns 404 (ownership is cloaked to prevent\ndisclosure). Requires workspace:write scope and an ADMIN/OWNER role. Not\nidempotent — each call mints a different secret.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Webhook endpoint ID"
          }
        },
        "required": [
          "id"
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false
      },
      "x-contio-http": {
        "method": "POST",
        "path": "/v1/workspace/webhooks/{id}/rotate-secret"
      }
    },
    {
      "name": "updateWorkspace",
      "description": "Update workspace settings. Use this when the user wants to change workspace name, company size, or industry.\n\nPartial update (PATCH) of workspace settings — send only the fields you want to\nchange (`name`, `company_size`, `primary_industry_id`,\n`remove_external_participants_from_meetings`); omitted fields are left\nuntouched. Requires the `workspace:write` scope AND an admin or owner role; a\nlesser role gets 403. Note `remove_external_participants_from_meetings` is a\npolicy toggle that affects future meetings, so flipping it has workspace-wide\nside effects — set it deliberately. Returns the updated workspace on 200. This\nendpoint does NOT honor `Idempotency-Key` (see the `missing_idempotency_key`\nflag); re-read with v1GetWorkspace before retrying if a call's outcome is\nuncertain.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "company_size": {
            "type": "string",
            "example": "11-50"
          },
          "name": {
            "type": "string",
            "example": "Acme Corp"
          },
          "primary_industry_id": {
            "type": "string",
            "example": "industry-1"
          },
          "remove_external_participants_from_meetings": {
            "type": "boolean",
            "example": true
          }
        }
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false
      },
      "x-contio-http": {
        "method": "PATCH",
        "path": "/v1/workspace"
      }
    },
    {
      "name": "updateWorkspaceMemberRole",
      "description": "Update workspace member role. Use this when the user wants to change a member's workspace role.\n\nChanges a member's workspace role, keyed by the `{userID}` from\nv1ListWorkspaceMembers; requires the `workspace:write` scope AND an admin or\nowner role. The body's `role` field is required. You cannot change the owner's\nrole (returns 403/400), so ownership is not transferable through this endpoint.\nReturns 204 No Content on success — there is no body to parse, so re-read with\nv1ListWorkspaceMembers if you need to confirm the new role. An unknown user id\nreturns 404. This endpoint does NOT honor `Idempotency-Key` (see the\n`missing_idempotency_key` flag), though re-issuing the same target role is\nfunctionally harmless.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "role": {
            "type": "string",
            "example": "WORKSPACE_ADMIN"
          },
          "userID": {
            "type": "string",
            "description": "User ID of the member"
          }
        },
        "required": [
          "role",
          "userID"
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false
      },
      "x-contio-http": {
        "method": "PATCH",
        "path": "/v1/workspace/members/{userID}"
      }
    }
  ]
}
