---
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 — Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"}
    - `bundleKey` string — Optional bundle ownership key. See ResourceMetadata.bundle_key.
  - `spec` ToolSetSpec, required
    - `description` string
    - `adapter` ToolSetAdapter
      - `mcp` ToolSetAdapterMCP
        - `url` string
        - `headers` object
        - `includeTools` ToolSetAdapterToolFilter — Top-level filter with simple boolean logic (no nesting)
          - `filters` ToolSetAdapterAttributeFilter[]
            - `attribute` 'ATTRIBUTE_UNSPECIFIED' | 'ATTRIBUTE_NAME' | 'ATTRIBUTE_TITLE' | 'ATTRIBUTE_DESCRIPTION' | 'ATTRIBUTE_NAME' | 'ATTRIBUTE_TITLE' | 'ATTRIBUTE_DESCRIPTION', enum, required
            - `matcher` ToolSetAdapterStringMatcher — String matching operations
              - …
          - `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[]
            - `attribute` 'ATTRIBUTE_UNSPECIFIED' | 'ATTRIBUTE_NAME' | 'ATTRIBUTE_TITLE' | 'ATTRIBUTE_DESCRIPTION' | 'ATTRIBUTE_NAME' | 'ATTRIBUTE_TITLE' | 'ATTRIBUTE_DESCRIPTION', enum, required
            - `matcher` ToolSetAdapterStringMatcher — String matching operations
              - …
          - `operator` 'OPERATOR_UNSPECIFIED' | 'OPERATOR_AND' | 'OPERATOR_OR' | 'OPERATOR_AND' | 'OPERATOR_OR', enum, required
        - `toolApprovals` ToolSetAdapterApprovalRequirementFilter — Approval filters that will automatically set the approval requirement on tools synced from an external source
          - `always` boolean
          - `only` 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
      - `http` ToolSetAdapterHTTP
        - `baseUrl` string
        - `headers` object
      - `openapi` ToolSetAdapterOpenAPI
        - `url` string — URL to fetch the OpenAPI spec from. Synced automatically every hour.
        - `uploadId` string — 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)
          - `filters` ToolSetAdapterAttributeFilter[]
            - `attribute` 'ATTRIBUTE_UNSPECIFIED' | 'ATTRIBUTE_NAME' | 'ATTRIBUTE_TITLE' | 'ATTRIBUTE_DESCRIPTION' | 'ATTRIBUTE_NAME' | 'ATTRIBUTE_TITLE' | 'ATTRIBUTE_DESCRIPTION', enum, required
            - `matcher` ToolSetAdapterStringMatcher — String matching operations
              - …
          - `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[]
            - `attribute` 'ATTRIBUTE_UNSPECIFIED' | 'ATTRIBUTE_NAME' | 'ATTRIBUTE_TITLE' | 'ATTRIBUTE_DESCRIPTION' | 'ATTRIBUTE_NAME' | 'ATTRIBUTE_TITLE' | 'ATTRIBUTE_DESCRIPTION', enum, required
            - `matcher` ToolSetAdapterStringMatcher — String matching operations
              - …
          - `operator` 'OPERATOR_UNSPECIFIED' | 'OPERATOR_AND' | 'OPERATOR_OR' | 'OPERATOR_AND' | 'OPERATOR_OR', enum, required
        - `toolApprovals` ToolSetAdapterApprovalRequirementFilter — Approval filters that will automatically set the approval requirement on tools synced from an external source
          - `always` boolean
          - `only` 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
        - `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.

## 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 — Arbitrary key-value pairs for categorization and filtering 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
    - `bundleKey` string — Optional bundle ownership key. When set, indicates the resource is managed by a configuration bundle identified by this key. Used by BulkWorkspaceResources.Apply to track which resources belong to which bundle for reconciliation / soft-delete on re-apply.
  - `spec` ToolSetSpec, required
    - `description` string
    - `adapter` ToolSetAdapter
      - `mcp` ToolSetAdapterMCP
        - `url` string
        - `headers` object
        - `includeTools` ToolSetAdapterToolFilter — Top-level filter with simple boolean logic (no nesting)
          - `filters` ToolSetAdapterAttributeFilter[]
            - `attribute` 'ATTRIBUTE_UNSPECIFIED' | 'ATTRIBUTE_NAME' | 'ATTRIBUTE_TITLE' | 'ATTRIBUTE_DESCRIPTION' | 'ATTRIBUTE_NAME' | 'ATTRIBUTE_TITLE' | 'ATTRIBUTE_DESCRIPTION', enum, required
            - `matcher` ToolSetAdapterStringMatcher — String matching operations
              - …
          - `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[]
            - `attribute` 'ATTRIBUTE_UNSPECIFIED' | 'ATTRIBUTE_NAME' | 'ATTRIBUTE_TITLE' | 'ATTRIBUTE_DESCRIPTION' | 'ATTRIBUTE_NAME' | 'ATTRIBUTE_TITLE' | 'ATTRIBUTE_DESCRIPTION', enum, required
            - `matcher` ToolSetAdapterStringMatcher — String matching operations
              - …
          - `operator` 'OPERATOR_UNSPECIFIED' | 'OPERATOR_AND' | 'OPERATOR_OR' | 'OPERATOR_AND' | 'OPERATOR_OR', enum, required
        - `toolApprovals` ToolSetAdapterApprovalRequirementFilter — Approval filters that will automatically set the approval requirement on tools synced from an external source
          - `always` boolean
          - `only` 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
      - `http` ToolSetAdapterHTTP
        - `baseUrl` string
        - `headers` object
      - `openapi` ToolSetAdapterOpenAPI
        - `url` string — URL to fetch the OpenAPI spec from. Synced automatically every hour.
        - `uploadId` string — 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)
          - `filters` ToolSetAdapterAttributeFilter[]
            - `attribute` 'ATTRIBUTE_UNSPECIFIED' | 'ATTRIBUTE_NAME' | 'ATTRIBUTE_TITLE' | 'ATTRIBUTE_DESCRIPTION' | 'ATTRIBUTE_NAME' | 'ATTRIBUTE_TITLE' | 'ATTRIBUTE_DESCRIPTION', enum, required
            - `matcher` ToolSetAdapterStringMatcher — String matching operations
              - …
          - `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[]
            - `attribute` 'ATTRIBUTE_UNSPECIFIED' | 'ATTRIBUTE_NAME' | 'ATTRIBUTE_TITLE' | 'ATTRIBUTE_DESCRIPTION' | 'ATTRIBUTE_NAME' | 'ATTRIBUTE_TITLE' | 'ATTRIBUTE_DESCRIPTION', enum, required
            - `matcher` ToolSetAdapterStringMatcher — String matching operations
              - …
          - `operator` 'OPERATOR_UNSPECIFIED' | 'OPERATOR_AND' | 'OPERATOR_OR' | 'OPERATOR_AND' | 'OPERATOR_OR', enum, required
        - `toolApprovals` ToolSetAdapterApprovalRequirementFilter — Approval filters that will automatically set the approval requirement on tools synced from an external source
          - `always` boolean
          - `only` 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
        - `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.
  - `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 — Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"}
        - `profileId` string, required
      - `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.

## Other responses

- `default` — Default error response

## Changes

- **2026-06-05** `0702cb021b66` — 1 warning
  - added the new `PROFILE_TYPE_UNSPECIFIED` enum value to the `info/allOf[#/components/schemas/ToolSetInfo]/createdBy/spec/type` response property for the response status `200`

[Change history](https://skmtc.dev/cadenya/apis/cadenya-api/changes/v1/workspaces/:workspaceId/tool_sets/post.md)

---

[API](https://skmtc.dev/cadenya/apis/cadenya-api.md) · [All operations](https://skmtc.dev/cadenya/apis/cadenya-api/llms.txt) · [OpenAPI document](https://skmtc.dev/cadenya/apis/cadenya-api/revisions/2bd8fb53e649?raw)
