# Tool Sets ## List tool sets `tool_sets.list(workspace_id, **kwargs) -> CursorPagination` **get** `/v1/workspaces/{workspaceId}/tool_sets` Lists all tool sets in the workspace ### Parameters - `workspace_id: String` - `bundle_key: String` Filter by bundle_key — return only resources owned by this bundle. - `cursor: String` Pagination cursor from previous response - `include_info: bool` When set to true you may use more of your alloted API rate-limit - `limit: Integer` Maximum number of results to return - `prefix: String` Filter expression (query param: prefix) - `query: String` Free-form search query - `sort_order: String` Sort order for results (asc or desc by creation time) ### Returns - `class ToolSet` - `metadata: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `created_at: Time` Timestamp when this resource was created - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` ID of the actor (user or service account) that created this resource - `workspace_id: String` Workspace this resource belongs to for organizational grouping (prefixed ULID) - `bundle_key: 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. - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ToolSetSpec` - `adapter: ToolSetAdapter` - `http: ToolSetAdapterHTTP` - `base_url: String` - `headers: Hash[Symbol, String]` - `mcp: ToolSetAdapterMcp` - `exclude_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `operator: :OPERATOR_UNSPECIFIED | :OPERATOR_AND | :OPERATOR_OR` - `:OPERATOR_UNSPECIFIED` - `:OPERATOR_AND` - `:OPERATOR_OR` - `filters: Array[AttributeFilter]` - `attribute: :ATTRIBUTE_UNSPECIFIED | :ATTRIBUTE_NAME | :ATTRIBUTE_TITLE | :ATTRIBUTE_DESCRIPTION` - `:ATTRIBUTE_UNSPECIFIED` - `:ATTRIBUTE_NAME` - `:ATTRIBUTE_TITLE` - `:ATTRIBUTE_DESCRIPTION` - `matcher: StringMatcher` String matching operations - `case_sensitive: bool` - `contains: String` - `ends_with: String` - `exact: String` - `regex: String` - `starts_with: String` - `headers: Hash[Symbol, String]` - `include_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `tool_approvals: ApprovalRequirementFilter` Approval filters that will automatically set the approval requirement on tools synced from an external source - `always: bool` - `only: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `url: String` - `openapi: ToolSetAdapterOpenAPI` - `base_url: String` Base URL for dispatching tool calls. If set, overrides the server resolved from the spec's servers array. - `exclude_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `headers: Hash[Symbol, String]` Headers sent when fetching the spec from a URL and when dispatching tool calls. - `include_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `server_name: 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. - `tool_approvals: ApprovalRequirementFilter` Approval filters that will automatically set the approval requirement on tools synced from an external source - `upload_id: String` ID of a COMPLETE Upload containing the OpenAPI spec document. - `url: String` URL to fetch the OpenAPI spec from. Synced automatically every hour. - `description: String` - `info: ToolSetInfo` Tool set information - `agent_count: Integer` - `created_by: 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` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ProfileSpec` Configuration for a profile. - `type: :PROFILE_TYPE_UNSPECIFIED | :PROFILE_TYPE_USER | :PROFILE_TYPE_API_KEY | :PROFILE_TYPE_SYSTEM` Whether this profile represents a human user, an API key, or a system principal. - `:PROFILE_TYPE_UNSPECIFIED` - `:PROFILE_TYPE_USER` - `:PROFILE_TYPE_API_KEY` - `:PROFILE_TYPE_SYSTEM` - `email: String` Email address of the profile. Required and unique within an account for user profiles. - `name: String` Display name (e.g., "Bobby Tables"). - `last_sync: Time` - `tool_count: Integer` ### Example ```ruby require "cadenya" cadenya = Cadenya::Client.new(api_key: "My API Key") page = cadenya.tool_sets.list("workspaceId") puts(page) ``` #### Response ```json { "items": [ { "metadata": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "name": "name", "profileId": "profileId", "workspaceId": "workspaceId", "bundleKey": "bundleKey", "externalId": "externalId", "labels": { "foo": "string" } }, "spec": { "adapter": { "http": { "baseUrl": "baseUrl", "headers": { "foo": "string" } }, "mcp": { "excludeTools": { "operator": "OPERATOR_UNSPECIFIED", "filters": [ { "attribute": "ATTRIBUTE_UNSPECIFIED", "matcher": { "caseSensitive": true, "contains": "contains", "endsWith": "endsWith", "exact": "exact", "regex": "regex", "startsWith": "startsWith" } } ] }, "headers": { "foo": "string" }, "includeTools": { "operator": "OPERATOR_UNSPECIFIED", "filters": [ { "attribute": "ATTRIBUTE_UNSPECIFIED", "matcher": { "caseSensitive": true, "contains": "contains", "endsWith": "endsWith", "exact": "exact", "regex": "regex", "startsWith": "startsWith" } } ] }, "toolApprovals": { "always": true, "only": { "operator": "OPERATOR_UNSPECIFIED", "filters": [ { "attribute": "ATTRIBUTE_UNSPECIFIED", "matcher": { "caseSensitive": true, "contains": "contains", "endsWith": "endsWith", "exact": "exact", "regex": "regex", "startsWith": "startsWith" } } ] } }, "url": "url" }, "openapi": { "baseUrl": "baseUrl", "excludeTools": { "operator": "OPERATOR_UNSPECIFIED", "filters": [ { "attribute": "ATTRIBUTE_UNSPECIFIED", "matcher": { "caseSensitive": true, "contains": "contains", "endsWith": "endsWith", "exact": "exact", "regex": "regex", "startsWith": "startsWith" } } ] }, "headers": { "foo": "string" }, "includeTools": { "operator": "OPERATOR_UNSPECIFIED", "filters": [ { "attribute": "ATTRIBUTE_UNSPECIFIED", "matcher": { "caseSensitive": true, "contains": "contains", "endsWith": "endsWith", "exact": "exact", "regex": "regex", "startsWith": "startsWith" } } ] }, "serverName": "serverName", "toolApprovals": { "always": true, "only": { "operator": "OPERATOR_UNSPECIFIED", "filters": [ { "attribute": "ATTRIBUTE_UNSPECIFIED", "matcher": { "caseSensitive": true, "contains": "contains", "endsWith": "endsWith", "exact": "exact", "regex": "regex", "startsWith": "startsWith" } } ] } }, "uploadId": "uploadId", "url": "url" } }, "description": "description" }, "info": { "agentCount": 0, "createdBy": { "metadata": { "id": "id", "accountId": "accountId", "name": "name", "profileId": "profileId", "externalId": "externalId", "labels": { "foo": "string" } }, "spec": { "type": "PROFILE_TYPE_UNSPECIFIED", "email": "email", "name": "name" } }, "lastSync": "2019-12-27T18:11:19.117Z", "toolCount": 0 } } ], "pagination": { "nextCursor": "nextCursor", "total": 0 } } ``` ## Create a new tool set `tool_sets.create(workspace_id, **kwargs) -> ToolSet` **post** `/v1/workspaces/{workspaceId}/tool_sets` Creates a new tool set in the workspace ### Parameters - `workspace_id: String` - `metadata: CreateResourceMetadata` 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` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") - `bundle_key: String` Optional bundle ownership key. See ResourceMetadata.bundle_key. - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ToolSetSpec` - `adapter: ToolSetAdapter` - `http: ToolSetAdapterHTTP` - `base_url: String` - `headers: Hash[Symbol, String]` - `mcp: ToolSetAdapterMcp` - `exclude_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `operator: :OPERATOR_UNSPECIFIED | :OPERATOR_AND | :OPERATOR_OR` - `:OPERATOR_UNSPECIFIED` - `:OPERATOR_AND` - `:OPERATOR_OR` - `filters: Array[AttributeFilter]` - `attribute: :ATTRIBUTE_UNSPECIFIED | :ATTRIBUTE_NAME | :ATTRIBUTE_TITLE | :ATTRIBUTE_DESCRIPTION` - `:ATTRIBUTE_UNSPECIFIED` - `:ATTRIBUTE_NAME` - `:ATTRIBUTE_TITLE` - `:ATTRIBUTE_DESCRIPTION` - `matcher: StringMatcher` String matching operations - `case_sensitive: bool` - `contains: String` - `ends_with: String` - `exact: String` - `regex: String` - `starts_with: String` - `headers: Hash[Symbol, String]` - `include_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `tool_approvals: ApprovalRequirementFilter` Approval filters that will automatically set the approval requirement on tools synced from an external source - `always: bool` - `only: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `url: String` - `openapi: ToolSetAdapterOpenAPI` - `base_url: String` Base URL for dispatching tool calls. If set, overrides the server resolved from the spec's servers array. - `exclude_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `headers: Hash[Symbol, String]` Headers sent when fetching the spec from a URL and when dispatching tool calls. - `include_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `server_name: 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. - `tool_approvals: ApprovalRequirementFilter` Approval filters that will automatically set the approval requirement on tools synced from an external source - `upload_id: String` ID of a COMPLETE Upload containing the OpenAPI spec document. - `url: String` URL to fetch the OpenAPI spec from. Synced automatically every hour. - `description: String` ### Returns - `class ToolSet` - `metadata: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `created_at: Time` Timestamp when this resource was created - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` ID of the actor (user or service account) that created this resource - `workspace_id: String` Workspace this resource belongs to for organizational grouping (prefixed ULID) - `bundle_key: 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. - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ToolSetSpec` - `adapter: ToolSetAdapter` - `http: ToolSetAdapterHTTP` - `base_url: String` - `headers: Hash[Symbol, String]` - `mcp: ToolSetAdapterMcp` - `exclude_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `operator: :OPERATOR_UNSPECIFIED | :OPERATOR_AND | :OPERATOR_OR` - `:OPERATOR_UNSPECIFIED` - `:OPERATOR_AND` - `:OPERATOR_OR` - `filters: Array[AttributeFilter]` - `attribute: :ATTRIBUTE_UNSPECIFIED | :ATTRIBUTE_NAME | :ATTRIBUTE_TITLE | :ATTRIBUTE_DESCRIPTION` - `:ATTRIBUTE_UNSPECIFIED` - `:ATTRIBUTE_NAME` - `:ATTRIBUTE_TITLE` - `:ATTRIBUTE_DESCRIPTION` - `matcher: StringMatcher` String matching operations - `case_sensitive: bool` - `contains: String` - `ends_with: String` - `exact: String` - `regex: String` - `starts_with: String` - `headers: Hash[Symbol, String]` - `include_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `tool_approvals: ApprovalRequirementFilter` Approval filters that will automatically set the approval requirement on tools synced from an external source - `always: bool` - `only: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `url: String` - `openapi: ToolSetAdapterOpenAPI` - `base_url: String` Base URL for dispatching tool calls. If set, overrides the server resolved from the spec's servers array. - `exclude_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `headers: Hash[Symbol, String]` Headers sent when fetching the spec from a URL and when dispatching tool calls. - `include_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `server_name: 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. - `tool_approvals: ApprovalRequirementFilter` Approval filters that will automatically set the approval requirement on tools synced from an external source - `upload_id: String` ID of a COMPLETE Upload containing the OpenAPI spec document. - `url: String` URL to fetch the OpenAPI spec from. Synced automatically every hour. - `description: String` - `info: ToolSetInfo` Tool set information - `agent_count: Integer` - `created_by: 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` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ProfileSpec` Configuration for a profile. - `type: :PROFILE_TYPE_UNSPECIFIED | :PROFILE_TYPE_USER | :PROFILE_TYPE_API_KEY | :PROFILE_TYPE_SYSTEM` Whether this profile represents a human user, an API key, or a system principal. - `:PROFILE_TYPE_UNSPECIFIED` - `:PROFILE_TYPE_USER` - `:PROFILE_TYPE_API_KEY` - `:PROFILE_TYPE_SYSTEM` - `email: String` Email address of the profile. Required and unique within an account for user profiles. - `name: String` Display name (e.g., "Bobby Tables"). - `last_sync: Time` - `tool_count: Integer` ### Example ```ruby require "cadenya" cadenya = Cadenya::Client.new(api_key: "My API Key") tool_set = cadenya.tool_sets.create("workspaceId", metadata: {name: "name"}, spec: {}) puts(tool_set) ``` #### Response ```json { "metadata": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "name": "name", "profileId": "profileId", "workspaceId": "workspaceId", "bundleKey": "bundleKey", "externalId": "externalId", "labels": { "foo": "string" } }, "spec": { "adapter": { "http": { "baseUrl": "baseUrl", "headers": { "foo": "string" } }, "mcp": { "excludeTools": { "operator": "OPERATOR_UNSPECIFIED", "filters": [ { "attribute": "ATTRIBUTE_UNSPECIFIED", "matcher": { "caseSensitive": true, "contains": "contains", "endsWith": "endsWith", "exact": "exact", "regex": "regex", "startsWith": "startsWith" } } ] }, "headers": { "foo": "string" }, "includeTools": { "operator": "OPERATOR_UNSPECIFIED", "filters": [ { "attribute": "ATTRIBUTE_UNSPECIFIED", "matcher": { "caseSensitive": true, "contains": "contains", "endsWith": "endsWith", "exact": "exact", "regex": "regex", "startsWith": "startsWith" } } ] }, "toolApprovals": { "always": true, "only": { "operator": "OPERATOR_UNSPECIFIED", "filters": [ { "attribute": "ATTRIBUTE_UNSPECIFIED", "matcher": { "caseSensitive": true, "contains": "contains", "endsWith": "endsWith", "exact": "exact", "regex": "regex", "startsWith": "startsWith" } } ] } }, "url": "url" }, "openapi": { "baseUrl": "baseUrl", "excludeTools": { "operator": "OPERATOR_UNSPECIFIED", "filters": [ { "attribute": "ATTRIBUTE_UNSPECIFIED", "matcher": { "caseSensitive": true, "contains": "contains", "endsWith": "endsWith", "exact": "exact", "regex": "regex", "startsWith": "startsWith" } } ] }, "headers": { "foo": "string" }, "includeTools": { "operator": "OPERATOR_UNSPECIFIED", "filters": [ { "attribute": "ATTRIBUTE_UNSPECIFIED", "matcher": { "caseSensitive": true, "contains": "contains", "endsWith": "endsWith", "exact": "exact", "regex": "regex", "startsWith": "startsWith" } } ] }, "serverName": "serverName", "toolApprovals": { "always": true, "only": { "operator": "OPERATOR_UNSPECIFIED", "filters": [ { "attribute": "ATTRIBUTE_UNSPECIFIED", "matcher": { "caseSensitive": true, "contains": "contains", "endsWith": "endsWith", "exact": "exact", "regex": "regex", "startsWith": "startsWith" } } ] } }, "uploadId": "uploadId", "url": "url" } }, "description": "description" }, "info": { "agentCount": 0, "createdBy": { "metadata": { "id": "id", "accountId": "accountId", "name": "name", "profileId": "profileId", "externalId": "externalId", "labels": { "foo": "string" } }, "spec": { "type": "PROFILE_TYPE_UNSPECIFIED", "email": "email", "name": "name" } }, "lastSync": "2019-12-27T18:11:19.117Z", "toolCount": 0 } } ``` ## Get a tool set by ID `tool_sets.retrieve(id, **kwargs) -> ToolSet` **get** `/v1/workspaces/{workspaceId}/tool_sets/{id}` Retrieves a tool set by ID from the workspace ### Parameters - `workspace_id: String` - `id: String` ### Returns - `class ToolSet` - `metadata: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `created_at: Time` Timestamp when this resource was created - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` ID of the actor (user or service account) that created this resource - `workspace_id: String` Workspace this resource belongs to for organizational grouping (prefixed ULID) - `bundle_key: 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. - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ToolSetSpec` - `adapter: ToolSetAdapter` - `http: ToolSetAdapterHTTP` - `base_url: String` - `headers: Hash[Symbol, String]` - `mcp: ToolSetAdapterMcp` - `exclude_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `operator: :OPERATOR_UNSPECIFIED | :OPERATOR_AND | :OPERATOR_OR` - `:OPERATOR_UNSPECIFIED` - `:OPERATOR_AND` - `:OPERATOR_OR` - `filters: Array[AttributeFilter]` - `attribute: :ATTRIBUTE_UNSPECIFIED | :ATTRIBUTE_NAME | :ATTRIBUTE_TITLE | :ATTRIBUTE_DESCRIPTION` - `:ATTRIBUTE_UNSPECIFIED` - `:ATTRIBUTE_NAME` - `:ATTRIBUTE_TITLE` - `:ATTRIBUTE_DESCRIPTION` - `matcher: StringMatcher` String matching operations - `case_sensitive: bool` - `contains: String` - `ends_with: String` - `exact: String` - `regex: String` - `starts_with: String` - `headers: Hash[Symbol, String]` - `include_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `tool_approvals: ApprovalRequirementFilter` Approval filters that will automatically set the approval requirement on tools synced from an external source - `always: bool` - `only: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `url: String` - `openapi: ToolSetAdapterOpenAPI` - `base_url: String` Base URL for dispatching tool calls. If set, overrides the server resolved from the spec's servers array. - `exclude_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `headers: Hash[Symbol, String]` Headers sent when fetching the spec from a URL and when dispatching tool calls. - `include_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `server_name: 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. - `tool_approvals: ApprovalRequirementFilter` Approval filters that will automatically set the approval requirement on tools synced from an external source - `upload_id: String` ID of a COMPLETE Upload containing the OpenAPI spec document. - `url: String` URL to fetch the OpenAPI spec from. Synced automatically every hour. - `description: String` - `info: ToolSetInfo` Tool set information - `agent_count: Integer` - `created_by: 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` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ProfileSpec` Configuration for a profile. - `type: :PROFILE_TYPE_UNSPECIFIED | :PROFILE_TYPE_USER | :PROFILE_TYPE_API_KEY | :PROFILE_TYPE_SYSTEM` Whether this profile represents a human user, an API key, or a system principal. - `:PROFILE_TYPE_UNSPECIFIED` - `:PROFILE_TYPE_USER` - `:PROFILE_TYPE_API_KEY` - `:PROFILE_TYPE_SYSTEM` - `email: String` Email address of the profile. Required and unique within an account for user profiles. - `name: String` Display name (e.g., "Bobby Tables"). - `last_sync: Time` - `tool_count: Integer` ### Example ```ruby require "cadenya" cadenya = Cadenya::Client.new(api_key: "My API Key") tool_set = cadenya.tool_sets.retrieve("id", workspace_id: "workspaceId") puts(tool_set) ``` #### Response ```json { "metadata": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "name": "name", "profileId": "profileId", "workspaceId": "workspaceId", "bundleKey": "bundleKey", "externalId": "externalId", "labels": { "foo": "string" } }, "spec": { "adapter": { "http": { "baseUrl": "baseUrl", "headers": { "foo": "string" } }, "mcp": { "excludeTools": { "operator": "OPERATOR_UNSPECIFIED", "filters": [ { "attribute": "ATTRIBUTE_UNSPECIFIED", "matcher": { "caseSensitive": true, "contains": "contains", "endsWith": "endsWith", "exact": "exact", "regex": "regex", "startsWith": "startsWith" } } ] }, "headers": { "foo": "string" }, "includeTools": { "operator": "OPERATOR_UNSPECIFIED", "filters": [ { "attribute": "ATTRIBUTE_UNSPECIFIED", "matcher": { "caseSensitive": true, "contains": "contains", "endsWith": "endsWith", "exact": "exact", "regex": "regex", "startsWith": "startsWith" } } ] }, "toolApprovals": { "always": true, "only": { "operator": "OPERATOR_UNSPECIFIED", "filters": [ { "attribute": "ATTRIBUTE_UNSPECIFIED", "matcher": { "caseSensitive": true, "contains": "contains", "endsWith": "endsWith", "exact": "exact", "regex": "regex", "startsWith": "startsWith" } } ] } }, "url": "url" }, "openapi": { "baseUrl": "baseUrl", "excludeTools": { "operator": "OPERATOR_UNSPECIFIED", "filters": [ { "attribute": "ATTRIBUTE_UNSPECIFIED", "matcher": { "caseSensitive": true, "contains": "contains", "endsWith": "endsWith", "exact": "exact", "regex": "regex", "startsWith": "startsWith" } } ] }, "headers": { "foo": "string" }, "includeTools": { "operator": "OPERATOR_UNSPECIFIED", "filters": [ { "attribute": "ATTRIBUTE_UNSPECIFIED", "matcher": { "caseSensitive": true, "contains": "contains", "endsWith": "endsWith", "exact": "exact", "regex": "regex", "startsWith": "startsWith" } } ] }, "serverName": "serverName", "toolApprovals": { "always": true, "only": { "operator": "OPERATOR_UNSPECIFIED", "filters": [ { "attribute": "ATTRIBUTE_UNSPECIFIED", "matcher": { "caseSensitive": true, "contains": "contains", "endsWith": "endsWith", "exact": "exact", "regex": "regex", "startsWith": "startsWith" } } ] } }, "uploadId": "uploadId", "url": "url" } }, "description": "description" }, "info": { "agentCount": 0, "createdBy": { "metadata": { "id": "id", "accountId": "accountId", "name": "name", "profileId": "profileId", "externalId": "externalId", "labels": { "foo": "string" } }, "spec": { "type": "PROFILE_TYPE_UNSPECIFIED", "email": "email", "name": "name" } }, "lastSync": "2019-12-27T18:11:19.117Z", "toolCount": 0 } } ``` ## Update a tool set `tool_sets.update(id, **kwargs) -> ToolSet` **put** `/v1/workspaces/{workspaceId}/tool_sets/{id}` Updates a tool set in the workspace ### Parameters - `workspace_id: String` - `id: String` - `metadata: UpdateResourceMetadata` UpdateResourceMetadata contains the user-provided fields for updating 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` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") - `bundle_key: String` Optional bundle ownership key. See ResourceMetadata.bundle_key. - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ToolSetSpec` - `adapter: ToolSetAdapter` - `http: ToolSetAdapterHTTP` - `base_url: String` - `headers: Hash[Symbol, String]` - `mcp: ToolSetAdapterMcp` - `exclude_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `operator: :OPERATOR_UNSPECIFIED | :OPERATOR_AND | :OPERATOR_OR` - `:OPERATOR_UNSPECIFIED` - `:OPERATOR_AND` - `:OPERATOR_OR` - `filters: Array[AttributeFilter]` - `attribute: :ATTRIBUTE_UNSPECIFIED | :ATTRIBUTE_NAME | :ATTRIBUTE_TITLE | :ATTRIBUTE_DESCRIPTION` - `:ATTRIBUTE_UNSPECIFIED` - `:ATTRIBUTE_NAME` - `:ATTRIBUTE_TITLE` - `:ATTRIBUTE_DESCRIPTION` - `matcher: StringMatcher` String matching operations - `case_sensitive: bool` - `contains: String` - `ends_with: String` - `exact: String` - `regex: String` - `starts_with: String` - `headers: Hash[Symbol, String]` - `include_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `tool_approvals: ApprovalRequirementFilter` Approval filters that will automatically set the approval requirement on tools synced from an external source - `always: bool` - `only: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `url: String` - `openapi: ToolSetAdapterOpenAPI` - `base_url: String` Base URL for dispatching tool calls. If set, overrides the server resolved from the spec's servers array. - `exclude_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `headers: Hash[Symbol, String]` Headers sent when fetching the spec from a URL and when dispatching tool calls. - `include_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `server_name: 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. - `tool_approvals: ApprovalRequirementFilter` Approval filters that will automatically set the approval requirement on tools synced from an external source - `upload_id: String` ID of a COMPLETE Upload containing the OpenAPI spec document. - `url: String` URL to fetch the OpenAPI spec from. Synced automatically every hour. - `description: String` - `update_mask: String` ### Returns - `class ToolSet` - `metadata: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `created_at: Time` Timestamp when this resource was created - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` ID of the actor (user or service account) that created this resource - `workspace_id: String` Workspace this resource belongs to for organizational grouping (prefixed ULID) - `bundle_key: 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. - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ToolSetSpec` - `adapter: ToolSetAdapter` - `http: ToolSetAdapterHTTP` - `base_url: String` - `headers: Hash[Symbol, String]` - `mcp: ToolSetAdapterMcp` - `exclude_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `operator: :OPERATOR_UNSPECIFIED | :OPERATOR_AND | :OPERATOR_OR` - `:OPERATOR_UNSPECIFIED` - `:OPERATOR_AND` - `:OPERATOR_OR` - `filters: Array[AttributeFilter]` - `attribute: :ATTRIBUTE_UNSPECIFIED | :ATTRIBUTE_NAME | :ATTRIBUTE_TITLE | :ATTRIBUTE_DESCRIPTION` - `:ATTRIBUTE_UNSPECIFIED` - `:ATTRIBUTE_NAME` - `:ATTRIBUTE_TITLE` - `:ATTRIBUTE_DESCRIPTION` - `matcher: StringMatcher` String matching operations - `case_sensitive: bool` - `contains: String` - `ends_with: String` - `exact: String` - `regex: String` - `starts_with: String` - `headers: Hash[Symbol, String]` - `include_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `tool_approvals: ApprovalRequirementFilter` Approval filters that will automatically set the approval requirement on tools synced from an external source - `always: bool` - `only: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `url: String` - `openapi: ToolSetAdapterOpenAPI` - `base_url: String` Base URL for dispatching tool calls. If set, overrides the server resolved from the spec's servers array. - `exclude_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `headers: Hash[Symbol, String]` Headers sent when fetching the spec from a URL and when dispatching tool calls. - `include_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `server_name: 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. - `tool_approvals: ApprovalRequirementFilter` Approval filters that will automatically set the approval requirement on tools synced from an external source - `upload_id: String` ID of a COMPLETE Upload containing the OpenAPI spec document. - `url: String` URL to fetch the OpenAPI spec from. Synced automatically every hour. - `description: String` - `info: ToolSetInfo` Tool set information - `agent_count: Integer` - `created_by: 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` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ProfileSpec` Configuration for a profile. - `type: :PROFILE_TYPE_UNSPECIFIED | :PROFILE_TYPE_USER | :PROFILE_TYPE_API_KEY | :PROFILE_TYPE_SYSTEM` Whether this profile represents a human user, an API key, or a system principal. - `:PROFILE_TYPE_UNSPECIFIED` - `:PROFILE_TYPE_USER` - `:PROFILE_TYPE_API_KEY` - `:PROFILE_TYPE_SYSTEM` - `email: String` Email address of the profile. Required and unique within an account for user profiles. - `name: String` Display name (e.g., "Bobby Tables"). - `last_sync: Time` - `tool_count: Integer` ### Example ```ruby require "cadenya" cadenya = Cadenya::Client.new(api_key: "My API Key") tool_set = cadenya.tool_sets.update("id", workspace_id: "workspaceId") puts(tool_set) ``` #### Response ```json { "metadata": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "name": "name", "profileId": "profileId", "workspaceId": "workspaceId", "bundleKey": "bundleKey", "externalId": "externalId", "labels": { "foo": "string" } }, "spec": { "adapter": { "http": { "baseUrl": "baseUrl", "headers": { "foo": "string" } }, "mcp": { "excludeTools": { "operator": "OPERATOR_UNSPECIFIED", "filters": [ { "attribute": "ATTRIBUTE_UNSPECIFIED", "matcher": { "caseSensitive": true, "contains": "contains", "endsWith": "endsWith", "exact": "exact", "regex": "regex", "startsWith": "startsWith" } } ] }, "headers": { "foo": "string" }, "includeTools": { "operator": "OPERATOR_UNSPECIFIED", "filters": [ { "attribute": "ATTRIBUTE_UNSPECIFIED", "matcher": { "caseSensitive": true, "contains": "contains", "endsWith": "endsWith", "exact": "exact", "regex": "regex", "startsWith": "startsWith" } } ] }, "toolApprovals": { "always": true, "only": { "operator": "OPERATOR_UNSPECIFIED", "filters": [ { "attribute": "ATTRIBUTE_UNSPECIFIED", "matcher": { "caseSensitive": true, "contains": "contains", "endsWith": "endsWith", "exact": "exact", "regex": "regex", "startsWith": "startsWith" } } ] } }, "url": "url" }, "openapi": { "baseUrl": "baseUrl", "excludeTools": { "operator": "OPERATOR_UNSPECIFIED", "filters": [ { "attribute": "ATTRIBUTE_UNSPECIFIED", "matcher": { "caseSensitive": true, "contains": "contains", "endsWith": "endsWith", "exact": "exact", "regex": "regex", "startsWith": "startsWith" } } ] }, "headers": { "foo": "string" }, "includeTools": { "operator": "OPERATOR_UNSPECIFIED", "filters": [ { "attribute": "ATTRIBUTE_UNSPECIFIED", "matcher": { "caseSensitive": true, "contains": "contains", "endsWith": "endsWith", "exact": "exact", "regex": "regex", "startsWith": "startsWith" } } ] }, "serverName": "serverName", "toolApprovals": { "always": true, "only": { "operator": "OPERATOR_UNSPECIFIED", "filters": [ { "attribute": "ATTRIBUTE_UNSPECIFIED", "matcher": { "caseSensitive": true, "contains": "contains", "endsWith": "endsWith", "exact": "exact", "regex": "regex", "startsWith": "startsWith" } } ] } }, "uploadId": "uploadId", "url": "url" } }, "description": "description" }, "info": { "agentCount": 0, "createdBy": { "metadata": { "id": "id", "accountId": "accountId", "name": "name", "profileId": "profileId", "externalId": "externalId", "labels": { "foo": "string" } }, "spec": { "type": "PROFILE_TYPE_UNSPECIFIED", "email": "email", "name": "name" } }, "lastSync": "2019-12-27T18:11:19.117Z", "toolCount": 0 } } ``` ## Delete a tool set `tool_sets.delete(id, **kwargs) -> void` **delete** `/v1/workspaces/{workspaceId}/tool_sets/{id}` Deletes a tool set in the workspace ### Parameters - `workspace_id: String` - `id: String` ### Example ```ruby require "cadenya" cadenya = Cadenya::Client.new(api_key: "My API Key") result = cadenya.tool_sets.delete("id", workspace_id: "workspaceId") puts(result) ``` ## Get consumed OpenAPI spec `tool_sets.get_openapi_spec(tool_set_id, **kwargs) -> ToolSetGetOpenAPISpecResponse` **get** `/v1/workspaces/{workspaceId}/tool_sets/{toolSetId}/openapi_spec` Retrieves the current OpenAPI specification JSON that has been consumed by the tool set. Only applicable to tool sets using the OpenAPI adapter. ### Parameters - `workspace_id: String` - `tool_set_id: String` ### Returns - `class ToolSetGetOpenAPISpecResponse` - `spec: String` The consumed OpenAPI specification as a JSON string. ### Example ```ruby require "cadenya" cadenya = Cadenya::Client.new(api_key: "My API Key") response = cadenya.tool_sets.get_openapi_spec("toolSetId", workspace_id: "workspaceId") puts(response) ``` #### Response ```json { "spec": "spec" } ``` ## List tool set events `tool_sets.list_events(tool_set_id, **kwargs) -> CursorPagination` **get** `/v1/workspaces/{workspaceId}/tool_sets/{toolSetId}/events` Lists all events (including sync status) for a tool set ### Parameters - `workspace_id: String` - `tool_set_id: String` - `cursor: String` Pagination cursor from previous response - `include_info: bool` When set to true you may use more of your alloted API rate-limit - `limit: Integer` Maximum number of results to return - `sort_order: String` Sort order for results (asc or desc by creation time) ### Returns - `class ToolSetEvent` A single event in the tool set's operation timeline. - `metadata: OperationMetadata` Metadata for ephemeral operations and activities (e.g., objectives, executions, runs) - `id: String` Unique identifier for the operation (prefixed ULID, e.g., "obj_01HXK...") - `account_id: String` Account this operation belongs to for multi-tenant isolation (prefixed ULID) - `created_at: Time` Timestamp when this operation was created ULID includes timestamp information, but this explicit field enables easier querying - `profile_id: String` ID of the actor (user or service account) that created this operation - `workspace_id: String` Workspace this operation belongs to for organizational grouping (prefixed ULID) - `external_id: String` External ID for the operation (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"priority": "high", "source": "api", "workflow": "onboarding"} - `event: ToolSetEventData` Event payload for a tool set operation. - `sync_completed: SyncCompleted` Emitted when a tool set sync operation completes successfully. - `message: String` Optional message with additional details. - `tools_synced: Integer` Number of tools synced. - `sync_failed: SyncFailed` Emitted when a tool set sync operation fails. - `error: bool` Indicates this is an error event. - `error_type: String` Optional error type/code for programmatic handling. - `message: String` Error message describing what went wrong. - `sync_started: SyncStarted` Emitted when a tool set sync operation begins. - `message: String` Human-readable message describing the start of the sync. - `type: String` Type of the event (e.g., "sync_started", "sync_completed", "sync_failed"). - `info: Info{ created_by, tool_set}` - `created_by: 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` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ProfileSpec` Configuration for a profile. - `type: :PROFILE_TYPE_UNSPECIFIED | :PROFILE_TYPE_USER | :PROFILE_TYPE_API_KEY | :PROFILE_TYPE_SYSTEM` Whether this profile represents a human user, an API key, or a system principal. - `:PROFILE_TYPE_UNSPECIFIED` - `:PROFILE_TYPE_USER` - `:PROFILE_TYPE_API_KEY` - `:PROFILE_TYPE_SYSTEM` - `email: String` Email address of the profile. Required and unique within an account for user profiles. - `name: String` Display name (e.g., "Bobby Tables"). - `tool_set: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `created_at: Time` Timestamp when this resource was created - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` ID of the actor (user or service account) that created this resource - `workspace_id: String` Workspace this resource belongs to for organizational grouping (prefixed ULID) - `bundle_key: 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. - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `tool_set_id: String` The tool set this event is associated with. ### Example ```ruby require "cadenya" cadenya = Cadenya::Client.new(api_key: "My API Key") page = cadenya.tool_sets.list_events("toolSetId", workspace_id: "workspaceId") puts(page) ``` #### Response ```json { "items": [ { "metadata": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "profileId": "profileId", "workspaceId": "workspaceId", "externalId": "externalId", "labels": { "foo": "string" } }, "event": { "syncCompleted": { "message": "message", "toolsSynced": 0 }, "syncFailed": { "error": true, "errorType": "errorType", "message": "message" }, "syncStarted": { "message": "message" }, "type": "type" }, "info": { "createdBy": { "metadata": { "id": "id", "accountId": "accountId", "name": "name", "profileId": "profileId", "externalId": "externalId", "labels": { "foo": "string" } }, "spec": { "type": "PROFILE_TYPE_UNSPECIFIED", "email": "email", "name": "name" } }, "toolSet": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "name": "name", "profileId": "profileId", "workspaceId": "workspaceId", "bundleKey": "bundleKey", "externalId": "externalId", "labels": { "foo": "string" } } }, "toolSetId": "toolSetId" } ], "pagination": { "nextCursor": "nextCursor", "total": 0 } } ``` ## Domain Types ### Approval Requirement Filter - `class ApprovalRequirementFilter` Approval filters that will automatically set the approval requirement on tools synced from an external source - `always: bool` - `only: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `operator: :OPERATOR_UNSPECIFIED | :OPERATOR_AND | :OPERATOR_OR` - `:OPERATOR_UNSPECIFIED` - `:OPERATOR_AND` - `:OPERATOR_OR` - `filters: Array[AttributeFilter]` - `attribute: :ATTRIBUTE_UNSPECIFIED | :ATTRIBUTE_NAME | :ATTRIBUTE_TITLE | :ATTRIBUTE_DESCRIPTION` - `:ATTRIBUTE_UNSPECIFIED` - `:ATTRIBUTE_NAME` - `:ATTRIBUTE_TITLE` - `:ATTRIBUTE_DESCRIPTION` - `matcher: StringMatcher` String matching operations - `case_sensitive: bool` - `contains: String` - `ends_with: String` - `exact: String` - `regex: String` - `starts_with: String` ### Attribute Filter - `class AttributeFilter` Single attribute filter - `attribute: :ATTRIBUTE_UNSPECIFIED | :ATTRIBUTE_NAME | :ATTRIBUTE_TITLE | :ATTRIBUTE_DESCRIPTION` - `:ATTRIBUTE_UNSPECIFIED` - `:ATTRIBUTE_NAME` - `:ATTRIBUTE_TITLE` - `:ATTRIBUTE_DESCRIPTION` - `matcher: StringMatcher` String matching operations - `case_sensitive: bool` - `contains: String` - `ends_with: String` - `exact: String` - `regex: String` - `starts_with: String` ### String Matcher - `class StringMatcher` String matching operations - `case_sensitive: bool` - `contains: String` - `ends_with: String` - `exact: String` - `regex: String` - `starts_with: String` ### Sync Completed - `class SyncCompleted` Emitted when a tool set sync operation completes successfully. - `message: String` Optional message with additional details. - `tools_synced: Integer` Number of tools synced. ### Sync Failed - `class SyncFailed` Emitted when a tool set sync operation fails. - `error: bool` Indicates this is an error event. - `error_type: String` Optional error type/code for programmatic handling. - `message: String` Error message describing what went wrong. ### Sync Started - `class SyncStarted` Emitted when a tool set sync operation begins. - `message: String` Human-readable message describing the start of the sync. ### Tool Filter - `class ToolFilter` Top-level filter with simple boolean logic (no nesting) - `operator: :OPERATOR_UNSPECIFIED | :OPERATOR_AND | :OPERATOR_OR` - `:OPERATOR_UNSPECIFIED` - `:OPERATOR_AND` - `:OPERATOR_OR` - `filters: Array[AttributeFilter]` - `attribute: :ATTRIBUTE_UNSPECIFIED | :ATTRIBUTE_NAME | :ATTRIBUTE_TITLE | :ATTRIBUTE_DESCRIPTION` - `:ATTRIBUTE_UNSPECIFIED` - `:ATTRIBUTE_NAME` - `:ATTRIBUTE_TITLE` - `:ATTRIBUTE_DESCRIPTION` - `matcher: StringMatcher` String matching operations - `case_sensitive: bool` - `contains: String` - `ends_with: String` - `exact: String` - `regex: String` - `starts_with: String` ### Tool Set - `class ToolSet` - `metadata: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `created_at: Time` Timestamp when this resource was created - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` ID of the actor (user or service account) that created this resource - `workspace_id: String` Workspace this resource belongs to for organizational grouping (prefixed ULID) - `bundle_key: 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. - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ToolSetSpec` - `adapter: ToolSetAdapter` - `http: ToolSetAdapterHTTP` - `base_url: String` - `headers: Hash[Symbol, String]` - `mcp: ToolSetAdapterMcp` - `exclude_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `operator: :OPERATOR_UNSPECIFIED | :OPERATOR_AND | :OPERATOR_OR` - `:OPERATOR_UNSPECIFIED` - `:OPERATOR_AND` - `:OPERATOR_OR` - `filters: Array[AttributeFilter]` - `attribute: :ATTRIBUTE_UNSPECIFIED | :ATTRIBUTE_NAME | :ATTRIBUTE_TITLE | :ATTRIBUTE_DESCRIPTION` - `:ATTRIBUTE_UNSPECIFIED` - `:ATTRIBUTE_NAME` - `:ATTRIBUTE_TITLE` - `:ATTRIBUTE_DESCRIPTION` - `matcher: StringMatcher` String matching operations - `case_sensitive: bool` - `contains: String` - `ends_with: String` - `exact: String` - `regex: String` - `starts_with: String` - `headers: Hash[Symbol, String]` - `include_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `tool_approvals: ApprovalRequirementFilter` Approval filters that will automatically set the approval requirement on tools synced from an external source - `always: bool` - `only: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `url: String` - `openapi: ToolSetAdapterOpenAPI` - `base_url: String` Base URL for dispatching tool calls. If set, overrides the server resolved from the spec's servers array. - `exclude_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `headers: Hash[Symbol, String]` Headers sent when fetching the spec from a URL and when dispatching tool calls. - `include_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `server_name: 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. - `tool_approvals: ApprovalRequirementFilter` Approval filters that will automatically set the approval requirement on tools synced from an external source - `upload_id: String` ID of a COMPLETE Upload containing the OpenAPI spec document. - `url: String` URL to fetch the OpenAPI spec from. Synced automatically every hour. - `description: String` - `info: ToolSetInfo` Tool set information - `agent_count: Integer` - `created_by: 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` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ProfileSpec` Configuration for a profile. - `type: :PROFILE_TYPE_UNSPECIFIED | :PROFILE_TYPE_USER | :PROFILE_TYPE_API_KEY | :PROFILE_TYPE_SYSTEM` Whether this profile represents a human user, an API key, or a system principal. - `:PROFILE_TYPE_UNSPECIFIED` - `:PROFILE_TYPE_USER` - `:PROFILE_TYPE_API_KEY` - `:PROFILE_TYPE_SYSTEM` - `email: String` Email address of the profile. Required and unique within an account for user profiles. - `name: String` Display name (e.g., "Bobby Tables"). - `last_sync: Time` - `tool_count: Integer` ### Tool Set Adapter - `class ToolSetAdapter` - `http: ToolSetAdapterHTTP` - `base_url: String` - `headers: Hash[Symbol, String]` - `mcp: ToolSetAdapterMcp` - `exclude_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `operator: :OPERATOR_UNSPECIFIED | :OPERATOR_AND | :OPERATOR_OR` - `:OPERATOR_UNSPECIFIED` - `:OPERATOR_AND` - `:OPERATOR_OR` - `filters: Array[AttributeFilter]` - `attribute: :ATTRIBUTE_UNSPECIFIED | :ATTRIBUTE_NAME | :ATTRIBUTE_TITLE | :ATTRIBUTE_DESCRIPTION` - `:ATTRIBUTE_UNSPECIFIED` - `:ATTRIBUTE_NAME` - `:ATTRIBUTE_TITLE` - `:ATTRIBUTE_DESCRIPTION` - `matcher: StringMatcher` String matching operations - `case_sensitive: bool` - `contains: String` - `ends_with: String` - `exact: String` - `regex: String` - `starts_with: String` - `headers: Hash[Symbol, String]` - `include_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `tool_approvals: ApprovalRequirementFilter` Approval filters that will automatically set the approval requirement on tools synced from an external source - `always: bool` - `only: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `url: String` - `openapi: ToolSetAdapterOpenAPI` - `base_url: String` Base URL for dispatching tool calls. If set, overrides the server resolved from the spec's servers array. - `exclude_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `headers: Hash[Symbol, String]` Headers sent when fetching the spec from a URL and when dispatching tool calls. - `include_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `server_name: 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. - `tool_approvals: ApprovalRequirementFilter` Approval filters that will automatically set the approval requirement on tools synced from an external source - `upload_id: String` ID of a COMPLETE Upload containing the OpenAPI spec document. - `url: String` URL to fetch the OpenAPI spec from. Synced automatically every hour. ### Tool Set Adapter HTTP - `class ToolSetAdapterHTTP` - `base_url: String` - `headers: Hash[Symbol, String]` ### Tool Set Adapter Mcp - `class ToolSetAdapterMcp` - `exclude_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `operator: :OPERATOR_UNSPECIFIED | :OPERATOR_AND | :OPERATOR_OR` - `:OPERATOR_UNSPECIFIED` - `:OPERATOR_AND` - `:OPERATOR_OR` - `filters: Array[AttributeFilter]` - `attribute: :ATTRIBUTE_UNSPECIFIED | :ATTRIBUTE_NAME | :ATTRIBUTE_TITLE | :ATTRIBUTE_DESCRIPTION` - `:ATTRIBUTE_UNSPECIFIED` - `:ATTRIBUTE_NAME` - `:ATTRIBUTE_TITLE` - `:ATTRIBUTE_DESCRIPTION` - `matcher: StringMatcher` String matching operations - `case_sensitive: bool` - `contains: String` - `ends_with: String` - `exact: String` - `regex: String` - `starts_with: String` - `headers: Hash[Symbol, String]` - `include_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `tool_approvals: ApprovalRequirementFilter` Approval filters that will automatically set the approval requirement on tools synced from an external source - `always: bool` - `only: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `url: String` ### Tool Set Adapter OpenAPI - `class ToolSetAdapterOpenAPI` - `base_url: String` Base URL for dispatching tool calls. If set, overrides the server resolved from the spec's servers array. - `exclude_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `operator: :OPERATOR_UNSPECIFIED | :OPERATOR_AND | :OPERATOR_OR` - `:OPERATOR_UNSPECIFIED` - `:OPERATOR_AND` - `:OPERATOR_OR` - `filters: Array[AttributeFilter]` - `attribute: :ATTRIBUTE_UNSPECIFIED | :ATTRIBUTE_NAME | :ATTRIBUTE_TITLE | :ATTRIBUTE_DESCRIPTION` - `:ATTRIBUTE_UNSPECIFIED` - `:ATTRIBUTE_NAME` - `:ATTRIBUTE_TITLE` - `:ATTRIBUTE_DESCRIPTION` - `matcher: StringMatcher` String matching operations - `case_sensitive: bool` - `contains: String` - `ends_with: String` - `exact: String` - `regex: String` - `starts_with: String` - `headers: Hash[Symbol, String]` Headers sent when fetching the spec from a URL and when dispatching tool calls. - `include_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `server_name: 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. - `tool_approvals: ApprovalRequirementFilter` Approval filters that will automatically set the approval requirement on tools synced from an external source - `always: bool` - `only: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `upload_id: String` ID of a COMPLETE Upload containing the OpenAPI spec document. - `url: String` URL to fetch the OpenAPI spec from. Synced automatically every hour. ### Tool Set Event - `class ToolSetEvent` A single event in the tool set's operation timeline. - `metadata: OperationMetadata` Metadata for ephemeral operations and activities (e.g., objectives, executions, runs) - `id: String` Unique identifier for the operation (prefixed ULID, e.g., "obj_01HXK...") - `account_id: String` Account this operation belongs to for multi-tenant isolation (prefixed ULID) - `created_at: Time` Timestamp when this operation was created ULID includes timestamp information, but this explicit field enables easier querying - `profile_id: String` ID of the actor (user or service account) that created this operation - `workspace_id: String` Workspace this operation belongs to for organizational grouping (prefixed ULID) - `external_id: String` External ID for the operation (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"priority": "high", "source": "api", "workflow": "onboarding"} - `event: ToolSetEventData` Event payload for a tool set operation. - `sync_completed: SyncCompleted` Emitted when a tool set sync operation completes successfully. - `message: String` Optional message with additional details. - `tools_synced: Integer` Number of tools synced. - `sync_failed: SyncFailed` Emitted when a tool set sync operation fails. - `error: bool` Indicates this is an error event. - `error_type: String` Optional error type/code for programmatic handling. - `message: String` Error message describing what went wrong. - `sync_started: SyncStarted` Emitted when a tool set sync operation begins. - `message: String` Human-readable message describing the start of the sync. - `type: String` Type of the event (e.g., "sync_started", "sync_completed", "sync_failed"). - `info: Info{ created_by, tool_set}` - `created_by: 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` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ProfileSpec` Configuration for a profile. - `type: :PROFILE_TYPE_UNSPECIFIED | :PROFILE_TYPE_USER | :PROFILE_TYPE_API_KEY | :PROFILE_TYPE_SYSTEM` Whether this profile represents a human user, an API key, or a system principal. - `:PROFILE_TYPE_UNSPECIFIED` - `:PROFILE_TYPE_USER` - `:PROFILE_TYPE_API_KEY` - `:PROFILE_TYPE_SYSTEM` - `email: String` Email address of the profile. Required and unique within an account for user profiles. - `name: String` Display name (e.g., "Bobby Tables"). - `tool_set: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `created_at: Time` Timestamp when this resource was created - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` ID of the actor (user or service account) that created this resource - `workspace_id: String` Workspace this resource belongs to for organizational grouping (prefixed ULID) - `bundle_key: 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. - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `tool_set_id: String` The tool set this event is associated with. ### Tool Set Event Data - `class ToolSetEventData` Event payload for a tool set operation. - `sync_completed: SyncCompleted` Emitted when a tool set sync operation completes successfully. - `message: String` Optional message with additional details. - `tools_synced: Integer` Number of tools synced. - `sync_failed: SyncFailed` Emitted when a tool set sync operation fails. - `error: bool` Indicates this is an error event. - `error_type: String` Optional error type/code for programmatic handling. - `message: String` Error message describing what went wrong. - `sync_started: SyncStarted` Emitted when a tool set sync operation begins. - `message: String` Human-readable message describing the start of the sync. - `type: String` Type of the event (e.g., "sync_started", "sync_completed", "sync_failed"). ### Tool Set Info - `class ToolSetInfo` - `agent_count: Integer` - `created_by: 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` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ProfileSpec` Configuration for a profile. - `type: :PROFILE_TYPE_UNSPECIFIED | :PROFILE_TYPE_USER | :PROFILE_TYPE_API_KEY | :PROFILE_TYPE_SYSTEM` Whether this profile represents a human user, an API key, or a system principal. - `:PROFILE_TYPE_UNSPECIFIED` - `:PROFILE_TYPE_USER` - `:PROFILE_TYPE_API_KEY` - `:PROFILE_TYPE_SYSTEM` - `email: String` Email address of the profile. Required and unique within an account for user profiles. - `name: String` Display name (e.g., "Bobby Tables"). - `last_sync: Time` - `tool_count: Integer` ### Tool Set Spec - `class ToolSetSpec` - `adapter: ToolSetAdapter` - `http: ToolSetAdapterHTTP` - `base_url: String` - `headers: Hash[Symbol, String]` - `mcp: ToolSetAdapterMcp` - `exclude_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `operator: :OPERATOR_UNSPECIFIED | :OPERATOR_AND | :OPERATOR_OR` - `:OPERATOR_UNSPECIFIED` - `:OPERATOR_AND` - `:OPERATOR_OR` - `filters: Array[AttributeFilter]` - `attribute: :ATTRIBUTE_UNSPECIFIED | :ATTRIBUTE_NAME | :ATTRIBUTE_TITLE | :ATTRIBUTE_DESCRIPTION` - `:ATTRIBUTE_UNSPECIFIED` - `:ATTRIBUTE_NAME` - `:ATTRIBUTE_TITLE` - `:ATTRIBUTE_DESCRIPTION` - `matcher: StringMatcher` String matching operations - `case_sensitive: bool` - `contains: String` - `ends_with: String` - `exact: String` - `regex: String` - `starts_with: String` - `headers: Hash[Symbol, String]` - `include_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `tool_approvals: ApprovalRequirementFilter` Approval filters that will automatically set the approval requirement on tools synced from an external source - `always: bool` - `only: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `url: String` - `openapi: ToolSetAdapterOpenAPI` - `base_url: String` Base URL for dispatching tool calls. If set, overrides the server resolved from the spec's servers array. - `exclude_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `headers: Hash[Symbol, String]` Headers sent when fetching the spec from a URL and when dispatching tool calls. - `include_tools: ToolFilter` Top-level filter with simple boolean logic (no nesting) - `server_name: 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. - `tool_approvals: ApprovalRequirementFilter` Approval filters that will automatically set the approval requirement on tools synced from an external source - `upload_id: String` ID of a COMPLETE Upload containing the OpenAPI spec document. - `url: String` URL to fetch the OpenAPI spec from. Synced automatically every hour. - `description: String` ### Tool Set Get OpenAPI Spec Response - `class ToolSetGetOpenAPISpecResponse` - `spec: String` The consumed OpenAPI specification as a JSON string. # Tools ## List tools `tool_sets.tools.list(tool_set_id, **kwargs) -> CursorPagination` **get** `/v1/workspaces/{workspaceId}/tool_sets/{toolSetId}/tools` Lists all tools in the tool set ### Parameters - `workspace_id: String` - `tool_set_id: String` - `bundle_key: String` Filter by bundle_key — return only resources owned by this bundle. - `cursor: String` Pagination cursor from previous response - `include_info: bool` When set to true you may use more of your alloted API rate-limit - `limit: Integer` Maximum number of results to return - `names: Array[String]` Filter by tool name (exact match). Multiple values are OR'd together. - `prefix: String` Filter expression (query param: prefix) - `query: String` Free-form search query - `requires_approval: bool` Filter by approval requirement. Omitted = no filter; true = only tools requiring approval; false = only tools not requiring approval. - `sort_order: String` Sort order for results (asc or desc by creation time) - `statuses: Array[:TOOL_STATUS_UNSPECIFIED | :TOOL_STATUS_AVAILABLE | :TOOL_STATUS_OMITTED | :TOOL_STATUS_ARCHIVED]` Filter by tool status. Multiple values are OR'd together. - `:TOOL_STATUS_UNSPECIFIED` - `:TOOL_STATUS_AVAILABLE` - `:TOOL_STATUS_OMITTED` - `:TOOL_STATUS_ARCHIVED` ### Returns - `class Tool` - `metadata: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `created_at: Time` Timestamp when this resource was created - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` ID of the actor (user or service account) that created this resource - `workspace_id: String` Workspace this resource belongs to for organizational grouping (prefixed ULID) - `bundle_key: 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. - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ToolSpec` - `config: ToolSpecConfig` Config defines the adapter to use for the tool. This is used to determine how the tool is called. For example, if the tool is an HTTP tool, the adapter will be Http. If the tool is an inline tool, the adapter will be Inline. - `http: ConfigHTTP` - `request_method: :HTTP_METHOD_UNSPECIFIED | :GET | :POST | 3 more` - `:HTTP_METHOD_UNSPECIFIED` - `:GET` - `:POST` - `:PUT` - `:PATCH` - `:DELETE` - `headers: Hash[Symbol, String]` - `path: String` - `query: String` - `request_body_content_type: String` - `request_body_template: String` These are only used when the request method is a POST, PUT, or PATCH - `tool_name: String` The tool name (commonly an "operation id" in OpenAPI specs) to call on the HTTP adapter. This is used to match the tool spec to the correct endpoint on the HTTP adapter. it will be derived from the name of the tool if not provided. - `mcp: ConfigMcp` - `tool_description: String` - `tool_name: String` - `tool_title: String` - `openapi: ConfigOpenAPI` - `method_: String` - `operation_id: String` - `path: String` - `description: String` - `parameters: Hash[Symbol, untyped]` - `status: :TOOL_STATUS_UNSPECIFIED | :TOOL_STATUS_AVAILABLE | :TOOL_STATUS_OMITTED | :TOOL_STATUS_ARCHIVED` - `:TOOL_STATUS_UNSPECIFIED` - `:TOOL_STATUS_AVAILABLE` - `:TOOL_STATUS_OMITTED` - `:TOOL_STATUS_ARCHIVED` - `requires_approval: bool` - `info: ToolInfo` - `created_by: 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` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ProfileSpec` Configuration for a profile. - `type: :PROFILE_TYPE_UNSPECIFIED | :PROFILE_TYPE_USER | :PROFILE_TYPE_API_KEY | :PROFILE_TYPE_SYSTEM` Whether this profile represents a human user, an API key, or a system principal. - `:PROFILE_TYPE_UNSPECIFIED` - `:PROFILE_TYPE_USER` - `:PROFILE_TYPE_API_KEY` - `:PROFILE_TYPE_SYSTEM` - `email: String` Email address of the profile. Required and unique within an account for user profiles. - `name: String` Display name (e.g., "Bobby Tables"). - `tool_set: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) ### Example ```ruby require "cadenya" cadenya = Cadenya::Client.new(api_key: "My API Key") page = cadenya.tool_sets.tools.list("toolSetId", workspace_id: "workspaceId") puts(page) ``` #### Response ```json { "items": [ { "metadata": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "name": "name", "profileId": "profileId", "workspaceId": "workspaceId", "bundleKey": "bundleKey", "externalId": "externalId", "labels": { "foo": "string" } }, "spec": { "config": { "http": { "requestMethod": "HTTP_METHOD_UNSPECIFIED", "headers": { "foo": "string" }, "path": "path", "query": "query", "requestBodyContentType": "requestBodyContentType", "requestBodyTemplate": "requestBodyTemplate", "toolName": "toolName" }, "mcp": { "toolDescription": "toolDescription", "toolName": "toolName", "toolTitle": "toolTitle" }, "openapi": { "method": "method", "operationId": "operationId", "path": "path" } }, "description": "description", "parameters": { "foo": "bar" }, "status": "TOOL_STATUS_UNSPECIFIED", "requiresApproval": true }, "info": { "createdBy": { "metadata": { "id": "id", "accountId": "accountId", "name": "name", "profileId": "profileId", "externalId": "externalId", "labels": { "foo": "string" } }, "spec": { "type": "PROFILE_TYPE_UNSPECIFIED", "email": "email", "name": "name" } }, "toolSet": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "name": "name", "profileId": "profileId", "workspaceId": "workspaceId", "bundleKey": "bundleKey", "externalId": "externalId", "labels": { "foo": "string" } } } } ], "pagination": { "nextCursor": "nextCursor", "total": 0 } } ``` ## Create a new tool `tool_sets.tools.create(tool_set_id, **kwargs) -> Tool` **post** `/v1/workspaces/{workspaceId}/tool_sets/{toolSetId}/tools` Creates a new tool in the tool set ### Parameters - `workspace_id: String` - `tool_set_id: String` - `metadata: CreateResourceMetadata` 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` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") - `bundle_key: String` Optional bundle ownership key. See ResourceMetadata.bundle_key. - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ToolSpec` - `config: ToolSpecConfig` Config defines the adapter to use for the tool. This is used to determine how the tool is called. For example, if the tool is an HTTP tool, the adapter will be Http. If the tool is an inline tool, the adapter will be Inline. - `http: ConfigHTTP` - `request_method: :HTTP_METHOD_UNSPECIFIED | :GET | :POST | 3 more` - `:HTTP_METHOD_UNSPECIFIED` - `:GET` - `:POST` - `:PUT` - `:PATCH` - `:DELETE` - `headers: Hash[Symbol, String]` - `path: String` - `query: String` - `request_body_content_type: String` - `request_body_template: String` These are only used when the request method is a POST, PUT, or PATCH - `tool_name: String` The tool name (commonly an "operation id" in OpenAPI specs) to call on the HTTP adapter. This is used to match the tool spec to the correct endpoint on the HTTP adapter. it will be derived from the name of the tool if not provided. - `mcp: ConfigMcp` - `tool_description: String` - `tool_name: String` - `tool_title: String` - `openapi: ConfigOpenAPI` - `method_: String` - `operation_id: String` - `path: String` - `description: String` - `parameters: Hash[Symbol, untyped]` - `status: :TOOL_STATUS_UNSPECIFIED | :TOOL_STATUS_AVAILABLE | :TOOL_STATUS_OMITTED | :TOOL_STATUS_ARCHIVED` - `:TOOL_STATUS_UNSPECIFIED` - `:TOOL_STATUS_AVAILABLE` - `:TOOL_STATUS_OMITTED` - `:TOOL_STATUS_ARCHIVED` - `requires_approval: bool` ### Returns - `class Tool` - `metadata: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `created_at: Time` Timestamp when this resource was created - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` ID of the actor (user or service account) that created this resource - `workspace_id: String` Workspace this resource belongs to for organizational grouping (prefixed ULID) - `bundle_key: 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. - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ToolSpec` - `config: ToolSpecConfig` Config defines the adapter to use for the tool. This is used to determine how the tool is called. For example, if the tool is an HTTP tool, the adapter will be Http. If the tool is an inline tool, the adapter will be Inline. - `http: ConfigHTTP` - `request_method: :HTTP_METHOD_UNSPECIFIED | :GET | :POST | 3 more` - `:HTTP_METHOD_UNSPECIFIED` - `:GET` - `:POST` - `:PUT` - `:PATCH` - `:DELETE` - `headers: Hash[Symbol, String]` - `path: String` - `query: String` - `request_body_content_type: String` - `request_body_template: String` These are only used when the request method is a POST, PUT, or PATCH - `tool_name: String` The tool name (commonly an "operation id" in OpenAPI specs) to call on the HTTP adapter. This is used to match the tool spec to the correct endpoint on the HTTP adapter. it will be derived from the name of the tool if not provided. - `mcp: ConfigMcp` - `tool_description: String` - `tool_name: String` - `tool_title: String` - `openapi: ConfigOpenAPI` - `method_: String` - `operation_id: String` - `path: String` - `description: String` - `parameters: Hash[Symbol, untyped]` - `status: :TOOL_STATUS_UNSPECIFIED | :TOOL_STATUS_AVAILABLE | :TOOL_STATUS_OMITTED | :TOOL_STATUS_ARCHIVED` - `:TOOL_STATUS_UNSPECIFIED` - `:TOOL_STATUS_AVAILABLE` - `:TOOL_STATUS_OMITTED` - `:TOOL_STATUS_ARCHIVED` - `requires_approval: bool` - `info: ToolInfo` - `created_by: 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` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ProfileSpec` Configuration for a profile. - `type: :PROFILE_TYPE_UNSPECIFIED | :PROFILE_TYPE_USER | :PROFILE_TYPE_API_KEY | :PROFILE_TYPE_SYSTEM` Whether this profile represents a human user, an API key, or a system principal. - `:PROFILE_TYPE_UNSPECIFIED` - `:PROFILE_TYPE_USER` - `:PROFILE_TYPE_API_KEY` - `:PROFILE_TYPE_SYSTEM` - `email: String` Email address of the profile. Required and unique within an account for user profiles. - `name: String` Display name (e.g., "Bobby Tables"). - `tool_set: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) ### Example ```ruby require "cadenya" cadenya = Cadenya::Client.new(api_key: "My API Key") tool = cadenya.tool_sets.tools.create( "toolSetId", workspace_id: "workspaceId", metadata: {name: "name"}, spec: {config: {}, description: "description", parameters: {foo: "bar"}, status: :TOOL_STATUS_UNSPECIFIED} ) puts(tool) ``` #### Response ```json { "metadata": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "name": "name", "profileId": "profileId", "workspaceId": "workspaceId", "bundleKey": "bundleKey", "externalId": "externalId", "labels": { "foo": "string" } }, "spec": { "config": { "http": { "requestMethod": "HTTP_METHOD_UNSPECIFIED", "headers": { "foo": "string" }, "path": "path", "query": "query", "requestBodyContentType": "requestBodyContentType", "requestBodyTemplate": "requestBodyTemplate", "toolName": "toolName" }, "mcp": { "toolDescription": "toolDescription", "toolName": "toolName", "toolTitle": "toolTitle" }, "openapi": { "method": "method", "operationId": "operationId", "path": "path" } }, "description": "description", "parameters": { "foo": "bar" }, "status": "TOOL_STATUS_UNSPECIFIED", "requiresApproval": true }, "info": { "createdBy": { "metadata": { "id": "id", "accountId": "accountId", "name": "name", "profileId": "profileId", "externalId": "externalId", "labels": { "foo": "string" } }, "spec": { "type": "PROFILE_TYPE_UNSPECIFIED", "email": "email", "name": "name" } }, "toolSet": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "name": "name", "profileId": "profileId", "workspaceId": "workspaceId", "bundleKey": "bundleKey", "externalId": "externalId", "labels": { "foo": "string" } } } } ``` ## Get a tool by ID `tool_sets.tools.retrieve(id, **kwargs) -> Tool` **get** `/v1/workspaces/{workspaceId}/tool_sets/{toolSetId}/tools/{id}` Retrieves a tool by ID from the workspace ### Parameters - `workspace_id: String` - `tool_set_id: String` - `id: String` ### Returns - `class Tool` - `metadata: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `created_at: Time` Timestamp when this resource was created - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` ID of the actor (user or service account) that created this resource - `workspace_id: String` Workspace this resource belongs to for organizational grouping (prefixed ULID) - `bundle_key: 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. - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ToolSpec` - `config: ToolSpecConfig` Config defines the adapter to use for the tool. This is used to determine how the tool is called. For example, if the tool is an HTTP tool, the adapter will be Http. If the tool is an inline tool, the adapter will be Inline. - `http: ConfigHTTP` - `request_method: :HTTP_METHOD_UNSPECIFIED | :GET | :POST | 3 more` - `:HTTP_METHOD_UNSPECIFIED` - `:GET` - `:POST` - `:PUT` - `:PATCH` - `:DELETE` - `headers: Hash[Symbol, String]` - `path: String` - `query: String` - `request_body_content_type: String` - `request_body_template: String` These are only used when the request method is a POST, PUT, or PATCH - `tool_name: String` The tool name (commonly an "operation id" in OpenAPI specs) to call on the HTTP adapter. This is used to match the tool spec to the correct endpoint on the HTTP adapter. it will be derived from the name of the tool if not provided. - `mcp: ConfigMcp` - `tool_description: String` - `tool_name: String` - `tool_title: String` - `openapi: ConfigOpenAPI` - `method_: String` - `operation_id: String` - `path: String` - `description: String` - `parameters: Hash[Symbol, untyped]` - `status: :TOOL_STATUS_UNSPECIFIED | :TOOL_STATUS_AVAILABLE | :TOOL_STATUS_OMITTED | :TOOL_STATUS_ARCHIVED` - `:TOOL_STATUS_UNSPECIFIED` - `:TOOL_STATUS_AVAILABLE` - `:TOOL_STATUS_OMITTED` - `:TOOL_STATUS_ARCHIVED` - `requires_approval: bool` - `info: ToolInfo` - `created_by: 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` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ProfileSpec` Configuration for a profile. - `type: :PROFILE_TYPE_UNSPECIFIED | :PROFILE_TYPE_USER | :PROFILE_TYPE_API_KEY | :PROFILE_TYPE_SYSTEM` Whether this profile represents a human user, an API key, or a system principal. - `:PROFILE_TYPE_UNSPECIFIED` - `:PROFILE_TYPE_USER` - `:PROFILE_TYPE_API_KEY` - `:PROFILE_TYPE_SYSTEM` - `email: String` Email address of the profile. Required and unique within an account for user profiles. - `name: String` Display name (e.g., "Bobby Tables"). - `tool_set: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) ### Example ```ruby require "cadenya" cadenya = Cadenya::Client.new(api_key: "My API Key") tool = cadenya.tool_sets.tools.retrieve("id", workspace_id: "workspaceId", tool_set_id: "toolSetId") puts(tool) ``` #### Response ```json { "metadata": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "name": "name", "profileId": "profileId", "workspaceId": "workspaceId", "bundleKey": "bundleKey", "externalId": "externalId", "labels": { "foo": "string" } }, "spec": { "config": { "http": { "requestMethod": "HTTP_METHOD_UNSPECIFIED", "headers": { "foo": "string" }, "path": "path", "query": "query", "requestBodyContentType": "requestBodyContentType", "requestBodyTemplate": "requestBodyTemplate", "toolName": "toolName" }, "mcp": { "toolDescription": "toolDescription", "toolName": "toolName", "toolTitle": "toolTitle" }, "openapi": { "method": "method", "operationId": "operationId", "path": "path" } }, "description": "description", "parameters": { "foo": "bar" }, "status": "TOOL_STATUS_UNSPECIFIED", "requiresApproval": true }, "info": { "createdBy": { "metadata": { "id": "id", "accountId": "accountId", "name": "name", "profileId": "profileId", "externalId": "externalId", "labels": { "foo": "string" } }, "spec": { "type": "PROFILE_TYPE_UNSPECIFIED", "email": "email", "name": "name" } }, "toolSet": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "name": "name", "profileId": "profileId", "workspaceId": "workspaceId", "bundleKey": "bundleKey", "externalId": "externalId", "labels": { "foo": "string" } } } } ``` ## Update a tool `tool_sets.tools.update(id, **kwargs) -> Tool` **put** `/v1/workspaces/{workspaceId}/tool_sets/{toolSetId}/tools/{id}` Updates a tool in the tool set ### Parameters - `workspace_id: String` - `tool_set_id: String` - `id: String` - `metadata: UpdateResourceMetadata` UpdateResourceMetadata contains the user-provided fields for updating 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` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") - `bundle_key: String` Optional bundle ownership key. See ResourceMetadata.bundle_key. - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ToolSpec` - `config: ToolSpecConfig` Config defines the adapter to use for the tool. This is used to determine how the tool is called. For example, if the tool is an HTTP tool, the adapter will be Http. If the tool is an inline tool, the adapter will be Inline. - `http: ConfigHTTP` - `request_method: :HTTP_METHOD_UNSPECIFIED | :GET | :POST | 3 more` - `:HTTP_METHOD_UNSPECIFIED` - `:GET` - `:POST` - `:PUT` - `:PATCH` - `:DELETE` - `headers: Hash[Symbol, String]` - `path: String` - `query: String` - `request_body_content_type: String` - `request_body_template: String` These are only used when the request method is a POST, PUT, or PATCH - `tool_name: String` The tool name (commonly an "operation id" in OpenAPI specs) to call on the HTTP adapter. This is used to match the tool spec to the correct endpoint on the HTTP adapter. it will be derived from the name of the tool if not provided. - `mcp: ConfigMcp` - `tool_description: String` - `tool_name: String` - `tool_title: String` - `openapi: ConfigOpenAPI` - `method_: String` - `operation_id: String` - `path: String` - `description: String` - `parameters: Hash[Symbol, untyped]` - `status: :TOOL_STATUS_UNSPECIFIED | :TOOL_STATUS_AVAILABLE | :TOOL_STATUS_OMITTED | :TOOL_STATUS_ARCHIVED` - `:TOOL_STATUS_UNSPECIFIED` - `:TOOL_STATUS_AVAILABLE` - `:TOOL_STATUS_OMITTED` - `:TOOL_STATUS_ARCHIVED` - `requires_approval: bool` - `update_mask: String` ### Returns - `class Tool` - `metadata: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `created_at: Time` Timestamp when this resource was created - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` ID of the actor (user or service account) that created this resource - `workspace_id: String` Workspace this resource belongs to for organizational grouping (prefixed ULID) - `bundle_key: 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. - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ToolSpec` - `config: ToolSpecConfig` Config defines the adapter to use for the tool. This is used to determine how the tool is called. For example, if the tool is an HTTP tool, the adapter will be Http. If the tool is an inline tool, the adapter will be Inline. - `http: ConfigHTTP` - `request_method: :HTTP_METHOD_UNSPECIFIED | :GET | :POST | 3 more` - `:HTTP_METHOD_UNSPECIFIED` - `:GET` - `:POST` - `:PUT` - `:PATCH` - `:DELETE` - `headers: Hash[Symbol, String]` - `path: String` - `query: String` - `request_body_content_type: String` - `request_body_template: String` These are only used when the request method is a POST, PUT, or PATCH - `tool_name: String` The tool name (commonly an "operation id" in OpenAPI specs) to call on the HTTP adapter. This is used to match the tool spec to the correct endpoint on the HTTP adapter. it will be derived from the name of the tool if not provided. - `mcp: ConfigMcp` - `tool_description: String` - `tool_name: String` - `tool_title: String` - `openapi: ConfigOpenAPI` - `method_: String` - `operation_id: String` - `path: String` - `description: String` - `parameters: Hash[Symbol, untyped]` - `status: :TOOL_STATUS_UNSPECIFIED | :TOOL_STATUS_AVAILABLE | :TOOL_STATUS_OMITTED | :TOOL_STATUS_ARCHIVED` - `:TOOL_STATUS_UNSPECIFIED` - `:TOOL_STATUS_AVAILABLE` - `:TOOL_STATUS_OMITTED` - `:TOOL_STATUS_ARCHIVED` - `requires_approval: bool` - `info: ToolInfo` - `created_by: 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` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ProfileSpec` Configuration for a profile. - `type: :PROFILE_TYPE_UNSPECIFIED | :PROFILE_TYPE_USER | :PROFILE_TYPE_API_KEY | :PROFILE_TYPE_SYSTEM` Whether this profile represents a human user, an API key, or a system principal. - `:PROFILE_TYPE_UNSPECIFIED` - `:PROFILE_TYPE_USER` - `:PROFILE_TYPE_API_KEY` - `:PROFILE_TYPE_SYSTEM` - `email: String` Email address of the profile. Required and unique within an account for user profiles. - `name: String` Display name (e.g., "Bobby Tables"). - `tool_set: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) ### Example ```ruby require "cadenya" cadenya = Cadenya::Client.new(api_key: "My API Key") tool = cadenya.tool_sets.tools.update("id", workspace_id: "workspaceId", tool_set_id: "toolSetId") puts(tool) ``` #### Response ```json { "metadata": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "name": "name", "profileId": "profileId", "workspaceId": "workspaceId", "bundleKey": "bundleKey", "externalId": "externalId", "labels": { "foo": "string" } }, "spec": { "config": { "http": { "requestMethod": "HTTP_METHOD_UNSPECIFIED", "headers": { "foo": "string" }, "path": "path", "query": "query", "requestBodyContentType": "requestBodyContentType", "requestBodyTemplate": "requestBodyTemplate", "toolName": "toolName" }, "mcp": { "toolDescription": "toolDescription", "toolName": "toolName", "toolTitle": "toolTitle" }, "openapi": { "method": "method", "operationId": "operationId", "path": "path" } }, "description": "description", "parameters": { "foo": "bar" }, "status": "TOOL_STATUS_UNSPECIFIED", "requiresApproval": true }, "info": { "createdBy": { "metadata": { "id": "id", "accountId": "accountId", "name": "name", "profileId": "profileId", "externalId": "externalId", "labels": { "foo": "string" } }, "spec": { "type": "PROFILE_TYPE_UNSPECIFIED", "email": "email", "name": "name" } }, "toolSet": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "name": "name", "profileId": "profileId", "workspaceId": "workspaceId", "bundleKey": "bundleKey", "externalId": "externalId", "labels": { "foo": "string" } } } } ``` ## Delete a tool `tool_sets.tools.delete(id, **kwargs) -> void` **delete** `/v1/workspaces/{workspaceId}/tool_sets/{toolSetId}/tools/{id}` Deletes a tool in the tool set ### Parameters - `workspace_id: String` - `tool_set_id: String` - `id: String` ### Example ```ruby require "cadenya" cadenya = Cadenya::Client.new(api_key: "My API Key") result = cadenya.tool_sets.tools.delete("id", workspace_id: "workspaceId", tool_set_id: "toolSetId") puts(result) ``` ## Domain Types ### Config HTTP - `class ConfigHTTP` - `request_method: :HTTP_METHOD_UNSPECIFIED | :GET | :POST | 3 more` - `:HTTP_METHOD_UNSPECIFIED` - `:GET` - `:POST` - `:PUT` - `:PATCH` - `:DELETE` - `headers: Hash[Symbol, String]` - `path: String` - `query: String` - `request_body_content_type: String` - `request_body_template: String` These are only used when the request method is a POST, PUT, or PATCH - `tool_name: String` The tool name (commonly an "operation id" in OpenAPI specs) to call on the HTTP adapter. This is used to match the tool spec to the correct endpoint on the HTTP adapter. it will be derived from the name of the tool if not provided. ### Config Mcp - `class ConfigMcp` - `tool_description: String` - `tool_name: String` - `tool_title: String` ### Config OpenAPI - `class ConfigOpenAPI` - `method_: String` - `operation_id: String` - `path: String` ### Tool - `class Tool` - `metadata: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `created_at: Time` Timestamp when this resource was created - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` ID of the actor (user or service account) that created this resource - `workspace_id: String` Workspace this resource belongs to for organizational grouping (prefixed ULID) - `bundle_key: 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. - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ToolSpec` - `config: ToolSpecConfig` Config defines the adapter to use for the tool. This is used to determine how the tool is called. For example, if the tool is an HTTP tool, the adapter will be Http. If the tool is an inline tool, the adapter will be Inline. - `http: ConfigHTTP` - `request_method: :HTTP_METHOD_UNSPECIFIED | :GET | :POST | 3 more` - `:HTTP_METHOD_UNSPECIFIED` - `:GET` - `:POST` - `:PUT` - `:PATCH` - `:DELETE` - `headers: Hash[Symbol, String]` - `path: String` - `query: String` - `request_body_content_type: String` - `request_body_template: String` These are only used when the request method is a POST, PUT, or PATCH - `tool_name: String` The tool name (commonly an "operation id" in OpenAPI specs) to call on the HTTP adapter. This is used to match the tool spec to the correct endpoint on the HTTP adapter. it will be derived from the name of the tool if not provided. - `mcp: ConfigMcp` - `tool_description: String` - `tool_name: String` - `tool_title: String` - `openapi: ConfigOpenAPI` - `method_: String` - `operation_id: String` - `path: String` - `description: String` - `parameters: Hash[Symbol, untyped]` - `status: :TOOL_STATUS_UNSPECIFIED | :TOOL_STATUS_AVAILABLE | :TOOL_STATUS_OMITTED | :TOOL_STATUS_ARCHIVED` - `:TOOL_STATUS_UNSPECIFIED` - `:TOOL_STATUS_AVAILABLE` - `:TOOL_STATUS_OMITTED` - `:TOOL_STATUS_ARCHIVED` - `requires_approval: bool` - `info: ToolInfo` - `created_by: 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` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ProfileSpec` Configuration for a profile. - `type: :PROFILE_TYPE_UNSPECIFIED | :PROFILE_TYPE_USER | :PROFILE_TYPE_API_KEY | :PROFILE_TYPE_SYSTEM` Whether this profile represents a human user, an API key, or a system principal. - `:PROFILE_TYPE_UNSPECIFIED` - `:PROFILE_TYPE_USER` - `:PROFILE_TYPE_API_KEY` - `:PROFILE_TYPE_SYSTEM` - `email: String` Email address of the profile. Required and unique within an account for user profiles. - `name: String` Display name (e.g., "Bobby Tables"). - `tool_set: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) ### Tool Info - `class ToolInfo` - `created_by: 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` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} - `spec: ProfileSpec` Configuration for a profile. - `type: :PROFILE_TYPE_UNSPECIFIED | :PROFILE_TYPE_USER | :PROFILE_TYPE_API_KEY | :PROFILE_TYPE_SYSTEM` Whether this profile represents a human user, an API key, or a system principal. - `:PROFILE_TYPE_UNSPECIFIED` - `:PROFILE_TYPE_USER` - `:PROFILE_TYPE_API_KEY` - `:PROFILE_TYPE_SYSTEM` - `email: String` Email address of the profile. Required and unique within an account for user profiles. - `name: String` Display name (e.g., "Bobby Tables"). - `tool_set: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `id: String` Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...") - `account_id: String` Account this resource belongs to for multi-tenant isolation (prefixed ULID) - `created_at: Time` Timestamp when this resource was created - `name: String` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") Required for resources that users interact with directly - `profile_id: String` ID of the actor (user or service account) that created this resource - `workspace_id: String` Workspace this resource belongs to for organizational grouping (prefixed ULID) - `bundle_key: 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. - `external_id: String` External ID for the resource (e.g., a workflow ID from an external system) - `labels: Hash[Symbol, String]` Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"} ### Tool Spec - `class ToolSpec` - `config: ToolSpecConfig` Config defines the adapter to use for the tool. This is used to determine how the tool is called. For example, if the tool is an HTTP tool, the adapter will be Http. If the tool is an inline tool, the adapter will be Inline. - `http: ConfigHTTP` - `request_method: :HTTP_METHOD_UNSPECIFIED | :GET | :POST | 3 more` - `:HTTP_METHOD_UNSPECIFIED` - `:GET` - `:POST` - `:PUT` - `:PATCH` - `:DELETE` - `headers: Hash[Symbol, String]` - `path: String` - `query: String` - `request_body_content_type: String` - `request_body_template: String` These are only used when the request method is a POST, PUT, or PATCH - `tool_name: String` The tool name (commonly an "operation id" in OpenAPI specs) to call on the HTTP adapter. This is used to match the tool spec to the correct endpoint on the HTTP adapter. it will be derived from the name of the tool if not provided. - `mcp: ConfigMcp` - `tool_description: String` - `tool_name: String` - `tool_title: String` - `openapi: ConfigOpenAPI` - `method_: String` - `operation_id: String` - `path: String` - `description: String` - `parameters: Hash[Symbol, untyped]` - `status: :TOOL_STATUS_UNSPECIFIED | :TOOL_STATUS_AVAILABLE | :TOOL_STATUS_OMITTED | :TOOL_STATUS_ARCHIVED` - `:TOOL_STATUS_UNSPECIFIED` - `:TOOL_STATUS_AVAILABLE` - `:TOOL_STATUS_OMITTED` - `:TOOL_STATUS_ARCHIVED` - `requires_approval: bool` ### Tool Spec Config - `class ToolSpecConfig` Config defines the adapter to use for the tool. This is used to determine how the tool is called. For example, if the tool is an HTTP tool, the adapter will be Http. If the tool is an inline tool, the adapter will be Inline. - `http: ConfigHTTP` - `request_method: :HTTP_METHOD_UNSPECIFIED | :GET | :POST | 3 more` - `:HTTP_METHOD_UNSPECIFIED` - `:GET` - `:POST` - `:PUT` - `:PATCH` - `:DELETE` - `headers: Hash[Symbol, String]` - `path: String` - `query: String` - `request_body_content_type: String` - `request_body_template: String` These are only used when the request method is a POST, PUT, or PATCH - `tool_name: String` The tool name (commonly an "operation id" in OpenAPI specs) to call on the HTTP adapter. This is used to match the tool spec to the correct endpoint on the HTTP adapter. it will be derived from the name of the tool if not provided. - `mcp: ConfigMcp` - `tool_description: String` - `tool_name: String` - `tool_title: String` - `openapi: ConfigOpenAPI` - `method_: String` - `operation_id: String` - `path: String`