---
title: "Create a new tool set"
method: POST
path: "/v1/workspaces/{workspaceId}/tool_sets"
tags: ["ToolService", "Tool Sets"]
---

# Create a new tool set

`POST /v1/workspaces/{workspaceId}/tool_sets`

Creates a new tool set in the workspace

## Path parameters

- `workspaceId` string, required

## Request body

- CreateToolSetRequest
  - `workspaceId` string — Workspace ID.
  - `metadata` CreateResourceMetadata, required — CreateResourceMetadata contains the user-provided fields for creating a workspace-scoped resource. Read-only fields (id, account_id, workspace_id, profile_id, created_at) are excluded since they are set by the server.
    - `name` string, required — Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool")
    - `externalId` string — External ID for the resource (e.g., a workflow ID from an external system)
    - `labels` object — Key-value pairs for categorization and filtering. Values are 0-63 alphanumeric characters with "-", "_", or "." allowed between; keys follow the same shape and additionally accept an optional DNS-subdomain prefix (e.g. "cadenya.com/") of at most 253 characters. Examples: {"environment": "production", "team": "platform", "version": "v2"}
  - `spec` ToolSetSpec, required
    - `description` string
    - `adapter` union
      - ToolSetAdapterMcpVariant
        - `type` 'mcp', required
        - `mcp` ToolSetAdapterMCP, required
          - `url` string
          - `headers` object
          - `includeTools` ToolSetAdapterToolFilter — Top-level filter with simple boolean logic (no nesting)
            - `filters` ToolSetAdapterAttributeFilter[]
              - …
            - `operator` 'OPERATOR_UNSPECIFIED' | 'OPERATOR_AND' | 'OPERATOR_OR' | 'OPERATOR_AND' | 'OPERATOR_OR', enum, required
          - `excludeTools` ToolSetAdapterToolFilter — Top-level filter with simple boolean logic (no nesting)
            - `filters` ToolSetAdapterAttributeFilter[]
              - …
            - `operator` 'OPERATOR_UNSPECIFIED' | 'OPERATOR_AND' | 'OPERATOR_OR' | 'OPERATOR_AND' | 'OPERATOR_OR', enum, required
          - `toolApprovals` union — Approval filters that will automatically set the approval requirement on tools synced from an external source
            - ToolSetAdapterApprovalRequirementFilterAlways
              - …
            - ToolSetAdapterApprovalRequirementFilterOnly
              - …
          - `justInTime` ToolSetAdapterJustInTime — Defines behavior for just-in-time capable tool set adapters (IE: MCP).
            - `enabled` boolean
            - `failObjectiveOnToolListError` boolean — If set, an objective will automatically be failed if tools cannot be loaded in the initial stages of an objective being created. Tools are loaded asynchronously, so this setting is useful for ensuring that an objective continued any further if tools are not available.
      - ToolSetAdapterHttpVariant
        - `type` 'http', required
        - `http` ToolSetAdapterHTTP, required
          - `baseUrl` string
          - `headers` object
      - ToolSetAdapterOpenapiVariant
        - `type` 'openapi', required
        - `openapi` union, required
          - ToolSetAdapterOpenAPIUrl
            - `type` 'url', required
            - `url` string, required — URL to fetch the OpenAPI spec from. Synced automatically every hour.
            - `headers` object — Headers sent when fetching the spec from a URL and when dispatching tool calls.
            - `includeTools` ToolSetAdapterToolFilter — Top-level filter with simple boolean logic (no nesting)
              - …
            - `excludeTools` ToolSetAdapterToolFilter — Top-level filter with simple boolean logic (no nesting)
              - …
            - `toolApprovals` union — Approval filters that will automatically set the approval requirement on tools synced from an external source
              - …
            - `baseUrl` string — Base URL for dispatching tool calls. If set, overrides the server resolved from the spec's servers array.
            - `serverName` string — Name of the server entry in the spec's servers array (OpenAPI 3.2 server.name field). Used to select which server URL to dispatch to when base_url is not set. If unset, the first server is used. Ignored when base_url is set.
          - ToolSetAdapterOpenAPIUploadId
            - `type` 'uploadId', required
            - `uploadId` string, required — ID of a COMPLETE Upload containing the OpenAPI spec document.
            - `headers` object — Headers sent when fetching the spec from a URL and when dispatching tool calls.
            - `includeTools` ToolSetAdapterToolFilter — Top-level filter with simple boolean logic (no nesting)
              - …
            - `excludeTools` ToolSetAdapterToolFilter — Top-level filter with simple boolean logic (no nesting)
              - …
            - `toolApprovals` union — Approval filters that will automatically set the approval requirement on tools synced from an external source
              - …
            - `baseUrl` string — Base URL for dispatching tool calls. If set, overrides the server resolved from the spec's servers array.
            - `serverName` string — Name of the server entry in the spec's servers array (OpenAPI 3.2 server.name field). Used to select which server URL to dispatch to when base_url is not set. If unset, the first server is used. Ignored when base_url is set.
      - ToolSetAdapterBareVariant
        - `type` 'bare', required
        - `bare` ToolSetAdapterBare, required — Bare tool sets define tools without an execution adapter. A bare tool call doesn't fire anything: the objective's workflow pauses and waits for an external API consumer to set the tool call's content (e.g. human-in-the-loop tools, or a reverse harness that polls for pending tool calls, executes locally, and reports results back via SetToolCallContent).
          - `contentTimeout` integer — How long to wait for content to be set before the tool call errors. If unset, the call waits indefinitely.

## Response `200`

OK

- ToolSet
  - `metadata` ResourceMetadata, required — Standard metadata for persistent, named resources (e.g., agents, tools, prompts)
    - `id` string, required — Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...")
    - `accountId` string, required — Account this resource belongs to for multi-tenant isolation (prefixed ULID)
    - `workspaceId` string, required — Workspace this resource belongs to for organizational grouping (prefixed ULID)
    - `name` string, required — Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly
    - `externalId` string — External ID for the resource (e.g., a workflow ID from an external system)
    - `labels` object — Key-value pairs for categorization and filtering. Values are 0-63 alphanumeric characters with "-", "_", or "." allowed between; keys follow the same shape and additionally accept an optional DNS-subdomain prefix (e.g. "cadenya.com/") of at most 253 characters. Examples: {"environment": "production", "team": "platform", "version": "v2"}
    - `profileId` string, required — ID of the actor (user or service account) that created this resource
    - `createdAt` string, date-time, required — Timestamp when this resource was created
    - `updatedAt` string, date-time — Timestamp when this resource was last updated
  - `spec` ToolSetSpec, required
    - `description` string
    - `adapter` union
      - ToolSetAdapterMcpVariant
        - `type` 'mcp', required
        - `mcp` ToolSetAdapterMCP, required
          - `url` string
          - `headers` object
          - `includeTools` ToolSetAdapterToolFilter — Top-level filter with simple boolean logic (no nesting)
            - `filters` ToolSetAdapterAttributeFilter[]
              - …
            - `operator` 'OPERATOR_UNSPECIFIED' | 'OPERATOR_AND' | 'OPERATOR_OR' | 'OPERATOR_AND' | 'OPERATOR_OR', enum, required
          - `excludeTools` ToolSetAdapterToolFilter — Top-level filter with simple boolean logic (no nesting)
            - `filters` ToolSetAdapterAttributeFilter[]
              - …
            - `operator` 'OPERATOR_UNSPECIFIED' | 'OPERATOR_AND' | 'OPERATOR_OR' | 'OPERATOR_AND' | 'OPERATOR_OR', enum, required
          - `toolApprovals` union — Approval filters that will automatically set the approval requirement on tools synced from an external source
            - ToolSetAdapterApprovalRequirementFilterAlways
              - …
            - ToolSetAdapterApprovalRequirementFilterOnly
              - …
          - `justInTime` ToolSetAdapterJustInTime — Defines behavior for just-in-time capable tool set adapters (IE: MCP).
            - `enabled` boolean
            - `failObjectiveOnToolListError` boolean — If set, an objective will automatically be failed if tools cannot be loaded in the initial stages of an objective being created. Tools are loaded asynchronously, so this setting is useful for ensuring that an objective continued any further if tools are not available.
      - ToolSetAdapterHttpVariant
        - `type` 'http', required
        - `http` ToolSetAdapterHTTP, required
          - `baseUrl` string
          - `headers` object
      - ToolSetAdapterOpenapiVariant
        - `type` 'openapi', required
        - `openapi` union, required
          - ToolSetAdapterOpenAPIUrl
            - `type` 'url', required
            - `url` string, required — URL to fetch the OpenAPI spec from. Synced automatically every hour.
            - `headers` object — Headers sent when fetching the spec from a URL and when dispatching tool calls.
            - `includeTools` ToolSetAdapterToolFilter — Top-level filter with simple boolean logic (no nesting)
              - …
            - `excludeTools` ToolSetAdapterToolFilter — Top-level filter with simple boolean logic (no nesting)
              - …
            - `toolApprovals` union — Approval filters that will automatically set the approval requirement on tools synced from an external source
              - …
            - `baseUrl` string — Base URL for dispatching tool calls. If set, overrides the server resolved from the spec's servers array.
            - `serverName` string — Name of the server entry in the spec's servers array (OpenAPI 3.2 server.name field). Used to select which server URL to dispatch to when base_url is not set. If unset, the first server is used. Ignored when base_url is set.
          - ToolSetAdapterOpenAPIUploadId
            - `type` 'uploadId', required
            - `uploadId` string, required — ID of a COMPLETE Upload containing the OpenAPI spec document.
            - `headers` object — Headers sent when fetching the spec from a URL and when dispatching tool calls.
            - `includeTools` ToolSetAdapterToolFilter — Top-level filter with simple boolean logic (no nesting)
              - …
            - `excludeTools` ToolSetAdapterToolFilter — Top-level filter with simple boolean logic (no nesting)
              - …
            - `toolApprovals` union — Approval filters that will automatically set the approval requirement on tools synced from an external source
              - …
            - `baseUrl` string — Base URL for dispatching tool calls. If set, overrides the server resolved from the spec's servers array.
            - `serverName` string — Name of the server entry in the spec's servers array (OpenAPI 3.2 server.name field). Used to select which server URL to dispatch to when base_url is not set. If unset, the first server is used. Ignored when base_url is set.
      - ToolSetAdapterBareVariant
        - `type` 'bare', required
        - `bare` ToolSetAdapterBare, required — Bare tool sets define tools without an execution adapter. A bare tool call doesn't fire anything: the objective's workflow pauses and waits for an external API consumer to set the tool call's content (e.g. human-in-the-loop tools, or a reverse harness that polls for pending tool calls, executes locally, and reports results back via SetToolCallContent).
          - `contentTimeout` integer — How long to wait for content to be set before the tool call errors. If unset, the call waits indefinitely.
  - `info` ToolSetInfo
    - `toolCount` integer
    - `agentCount` integer
    - `lastSync` string, date-time
    - `createdBy` Profile — A profile identifies a user or non-human principal (such as an API key) at the account level. Profiles are account-scoped and can be granted access to multiple workspaces.
      - `metadata` AccountResourceMetadata, required — AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace.
        - `id` string, required — Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...")
        - `accountId` string, required — Account this resource belongs to for multi-tenant isolation (prefixed ULID)
        - `name` string, required — Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly
        - `externalId` string — External ID for the resource (e.g., a workflow ID from an external system)
        - `labels` object — Key-value pairs for categorization and filtering. Values are 0-63 alphanumeric characters with "-", "_", or "." allowed between; keys follow the same shape and additionally accept an optional DNS-subdomain prefix (e.g. "cadenya.com/") of at most 253 characters. Examples: {"environment": "production", "team": "platform", "version": "v2"}
        - `profileId` string, required
        - `createdAt` string, date-time
      - `spec` ProfileSpec, required — Configuration for a profile.
        - `email` string — Email address of the profile. Required and unique within an account for user profiles.
        - `name` string — Display name (e.g., "Bobby Tables").
        - `type` 'PROFILE_TYPE_UNSPECIFIED' | 'PROFILE_TYPE_USER' | 'PROFILE_TYPE_API_KEY' | 'PROFILE_TYPE_SYSTEM', enum, required — Whether this profile represents a human user, an API key, or a system principal.
    - `availableTools` integer
    - `omittedTools` integer
  - `state` 'STATE_UNSPECIFIED' | 'STATE_ACTIVE' | 'STATE_ARCHIVED', enum, required — The current lifecycle state of the tool set. Output only. Tool sets are created STATE_ACTIVE; use the :archive and :unarchive actions to transition between states.

## Other responses

- `default` — Default error response

---

[API](https://skmtc.net/cadenya/apis/cadenya-api.md) · [All operations](https://skmtc.net/cadenya/apis/cadenya-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/cadenya/cadenya-api/revisions/ac1a7f084068/schema)
