Skip to content
Get started

Tool Sets

ToolService manages tool sets and tools at the WORKSPACE level. Tool sets group related tools, and tools define specific capabilities for agents. All operations are implicitly scoped to the workspace determined by the JWT token.

Note: When a ToolSet has managed=true, only API Key actors can modify its tools. Profile actors (humans) are restricted from modifying managed tool sets.

Authentication: Bearer token (JWT) Scope: Workspace-level operations

List tool sets
$ cadenya tool-sets list
GET/v1/tool_sets
Create a new tool set
$ cadenya tool-sets create
POST/v1/tool_sets
Get a tool set by ID
$ cadenya tool-sets retrieve
GET/v1/tool_sets/{id}
Update a tool set
$ cadenya tool-sets update
PUT/v1/tool_sets/{id}
Delete a tool set
$ cadenya tool-sets delete
DELETE/v1/tool_sets/{id}
List tool set events
$ cadenya tool-sets list-events
GET/v1/tool_sets/{toolSetId}/events
ModelsExpand Collapse
mcp_tool_filter: object { operator, filters }

Top-level filter with simple boolean logic (no nesting)

operator: "OPERATOR_UNSPECIFIED" or "OPERATOR_AND" or "OPERATOR_OR"
"OPERATOR_UNSPECIFIED"
"OPERATOR_AND"
"OPERATOR_OR"
filters: optional array of object { attribute, matcher }
attribute: "ATTRIBUTE_UNSPECIFIED" or "ATTRIBUTE_NAME" or "ATTRIBUTE_TITLE" or "ATTRIBUTE_DESCRIPTION"
"ATTRIBUTE_UNSPECIFIED"
"ATTRIBUTE_NAME"
"ATTRIBUTE_TITLE"
"ATTRIBUTE_DESCRIPTION"
matcher: optional object { caseSensitive, contains, endsWith, 3 more }

String matching operations

caseSensitive: optional boolean
contains: optional string
endsWith: optional string
exact: optional string
regex: optional string
startsWith: optional string
sync_completed: object { message, toolsSynced }

SyncCompleted is emitted when a tool set sync operation completes successfully

message: optional string

Optional message with additional details

toolsSynced: optional number

Number of tools synced

sync_failed: object { error, errorType, message }

SyncFailed is emitted when a tool set sync operation fails

error: optional boolean

Indicates this is an error event

errorType: optional string

Optional error type/code for programmatic handling

message: optional string

Error message describing what went wrong

sync_started: object { message }

SyncStarted is emitted when a tool set sync operation begins

message: optional string

Timestamp when the sync was initiated

tool_set: object { metadata, spec, info }
metadata: object { id, accountId, createdAt, 5 more }

Standard metadata for persistent, named resources (e.g., agents, tools, prompts)

id: string

Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...")

accountId: string

Account this resource belongs to for multi-tenant isolation (prefixed ULID)

createdAt: string

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

profileId: string

ID of the actor (user or service account) that created this resource

workspaceId: string

Workspace this resource belongs to for organizational grouping (prefixed ULID)

externalId: optional string

External ID for the resource (e.g., a workflow ID from an external system)

labels: optional map[string]

Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"}

spec: object { adapter, description }
adapter: optional object { http, mcp }
http: optional object { baseUrl, headers }
baseUrl: optional string
headers: optional map[string]
mcp: optional object { excludeTools, headers, includeTools, 2 more }
excludeTools: optional object { operator, filters }

Top-level filter with simple boolean logic (no nesting)

operator: "OPERATOR_UNSPECIFIED" or "OPERATOR_AND" or "OPERATOR_OR"
"OPERATOR_UNSPECIFIED"
"OPERATOR_AND"
"OPERATOR_OR"
filters: optional array of object { attribute, matcher }
attribute: "ATTRIBUTE_UNSPECIFIED" or "ATTRIBUTE_NAME" or "ATTRIBUTE_TITLE" or "ATTRIBUTE_DESCRIPTION"
"ATTRIBUTE_UNSPECIFIED"
"ATTRIBUTE_NAME"
"ATTRIBUTE_TITLE"
"ATTRIBUTE_DESCRIPTION"
matcher: optional object { caseSensitive, contains, endsWith, 3 more }

String matching operations

caseSensitive: optional boolean
contains: optional string
endsWith: optional string
exact: optional string
regex: optional string
startsWith: optional string
headers: optional map[string]
includeTools: optional object { operator, filters }

Top-level filter with simple boolean logic (no nesting)

operator: "OPERATOR_UNSPECIFIED" or "OPERATOR_AND" or "OPERATOR_OR"
"OPERATOR_UNSPECIFIED"
"OPERATOR_AND"
"OPERATOR_OR"
filters: optional array of object { attribute, matcher }
attribute: "ATTRIBUTE_UNSPECIFIED" or "ATTRIBUTE_NAME" or "ATTRIBUTE_TITLE" or "ATTRIBUTE_DESCRIPTION"
"ATTRIBUTE_UNSPECIFIED"
"ATTRIBUTE_NAME"
"ATTRIBUTE_TITLE"
"ATTRIBUTE_DESCRIPTION"
matcher: optional object { caseSensitive, contains, endsWith, 3 more }

String matching operations

caseSensitive: optional boolean
contains: optional string
endsWith: optional string
exact: optional string
regex: optional string
startsWith: optional string
toolApprovals: optional object { always, only }

Approval filters that will automatically set the approval requirement on the tools synced from the MCP server

always: optional boolean
only: optional object { operator, filters }

Top-level filter with simple boolean logic (no nesting)

operator: "OPERATOR_UNSPECIFIED" or "OPERATOR_AND" or "OPERATOR_OR"
"OPERATOR_UNSPECIFIED"
"OPERATOR_AND"
"OPERATOR_OR"
filters: optional array of object { attribute, matcher }
attribute: "ATTRIBUTE_UNSPECIFIED" or "ATTRIBUTE_NAME" or "ATTRIBUTE_TITLE" or "ATTRIBUTE_DESCRIPTION"
"ATTRIBUTE_UNSPECIFIED"
"ATTRIBUTE_NAME"
"ATTRIBUTE_TITLE"
"ATTRIBUTE_DESCRIPTION"
matcher: optional object { caseSensitive, contains, endsWith, 3 more }

String matching operations

caseSensitive: optional boolean
contains: optional string
endsWith: optional string
exact: optional string
regex: optional string
startsWith: optional string
url: optional string
description: optional string
info: optional object { agentCount, createdBy, lastSync, toolCount }

Tool set information

agentCount: optional number
createdBy: optional object { metadata, spec }

Profile represents a human user at the account level. Profiles are account-scoped resources that can be associated with multiple workspaces through the Actor model. Authentication for profiles is handled via SSO/OAuth (WorkOS).

metadata: object { id, accountId, name, 3 more }

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...")

accountId: 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

profileId: string
externalId: optional string

External ID for the resource (e.g., a workflow ID from an external system)

labels: optional map[string]

Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"}

spec: object { type, email, name }

ProfileSpec contains the profile-specific fields

type: "PROFILE_TYPE_USER" or "PROFILE_TYPE_API_KEY" or "PROFILE_TYPE_SYSTEM"

Type is the type of profile. User's are humans, API keys are computers. You know the deal.

"PROFILE_TYPE_USER"
"PROFILE_TYPE_API_KEY"
"PROFILE_TYPE_SYSTEM"
email: optional string

Email address of the user (required, unique per account)

name: optional string

Display name for the user (e.g., "Bobby Tables")

lastSync: optional string
toolCount: optional number
tool_set_adapter: object { http, mcp }
http: optional object { baseUrl, headers }
baseUrl: optional string
headers: optional map[string]
mcp: optional object { excludeTools, headers, includeTools, 2 more }
excludeTools: optional object { operator, filters }

Top-level filter with simple boolean logic (no nesting)

operator: "OPERATOR_UNSPECIFIED" or "OPERATOR_AND" or "OPERATOR_OR"
"OPERATOR_UNSPECIFIED"
"OPERATOR_AND"
"OPERATOR_OR"
filters: optional array of object { attribute, matcher }
attribute: "ATTRIBUTE_UNSPECIFIED" or "ATTRIBUTE_NAME" or "ATTRIBUTE_TITLE" or "ATTRIBUTE_DESCRIPTION"
"ATTRIBUTE_UNSPECIFIED"
"ATTRIBUTE_NAME"
"ATTRIBUTE_TITLE"
"ATTRIBUTE_DESCRIPTION"
matcher: optional object { caseSensitive, contains, endsWith, 3 more }

String matching operations

caseSensitive: optional boolean
contains: optional string
endsWith: optional string
exact: optional string
regex: optional string
startsWith: optional string
headers: optional map[string]
includeTools: optional object { operator, filters }

Top-level filter with simple boolean logic (no nesting)

operator: "OPERATOR_UNSPECIFIED" or "OPERATOR_AND" or "OPERATOR_OR"
"OPERATOR_UNSPECIFIED"
"OPERATOR_AND"
"OPERATOR_OR"
filters: optional array of object { attribute, matcher }
attribute: "ATTRIBUTE_UNSPECIFIED" or "ATTRIBUTE_NAME" or "ATTRIBUTE_TITLE" or "ATTRIBUTE_DESCRIPTION"
"ATTRIBUTE_UNSPECIFIED"
"ATTRIBUTE_NAME"
"ATTRIBUTE_TITLE"
"ATTRIBUTE_DESCRIPTION"
matcher: optional object { caseSensitive, contains, endsWith, 3 more }

String matching operations

caseSensitive: optional boolean
contains: optional string
endsWith: optional string
exact: optional string
regex: optional string
startsWith: optional string
toolApprovals: optional object { always, only }

Approval filters that will automatically set the approval requirement on the tools synced from the MCP server

always: optional boolean
only: optional object { operator, filters }

Top-level filter with simple boolean logic (no nesting)

operator: "OPERATOR_UNSPECIFIED" or "OPERATOR_AND" or "OPERATOR_OR"
"OPERATOR_UNSPECIFIED"
"OPERATOR_AND"
"OPERATOR_OR"
filters: optional array of object { attribute, matcher }
attribute: "ATTRIBUTE_UNSPECIFIED" or "ATTRIBUTE_NAME" or "ATTRIBUTE_TITLE" or "ATTRIBUTE_DESCRIPTION"
"ATTRIBUTE_UNSPECIFIED"
"ATTRIBUTE_NAME"
"ATTRIBUTE_TITLE"
"ATTRIBUTE_DESCRIPTION"
matcher: optional object { caseSensitive, contains, endsWith, 3 more }

String matching operations

caseSensitive: optional boolean
contains: optional string
endsWith: optional string
exact: optional string
regex: optional string
startsWith: optional string
url: optional string
tool_set_adapter_http: object { baseUrl, headers }
baseUrl: optional string
headers: optional map[string]
tool_set_adapter_mcp: object { excludeTools, headers, includeTools, 2 more }
excludeTools: optional object { operator, filters }

Top-level filter with simple boolean logic (no nesting)

operator: "OPERATOR_UNSPECIFIED" or "OPERATOR_AND" or "OPERATOR_OR"
"OPERATOR_UNSPECIFIED"
"OPERATOR_AND"
"OPERATOR_OR"
filters: optional array of object { attribute, matcher }
attribute: "ATTRIBUTE_UNSPECIFIED" or "ATTRIBUTE_NAME" or "ATTRIBUTE_TITLE" or "ATTRIBUTE_DESCRIPTION"
"ATTRIBUTE_UNSPECIFIED"
"ATTRIBUTE_NAME"
"ATTRIBUTE_TITLE"
"ATTRIBUTE_DESCRIPTION"
matcher: optional object { caseSensitive, contains, endsWith, 3 more }

String matching operations

caseSensitive: optional boolean
contains: optional string
endsWith: optional string
exact: optional string
regex: optional string
startsWith: optional string
headers: optional map[string]
includeTools: optional object { operator, filters }

Top-level filter with simple boolean logic (no nesting)

operator: "OPERATOR_UNSPECIFIED" or "OPERATOR_AND" or "OPERATOR_OR"
"OPERATOR_UNSPECIFIED"
"OPERATOR_AND"
"OPERATOR_OR"
filters: optional array of object { attribute, matcher }
attribute: "ATTRIBUTE_UNSPECIFIED" or "ATTRIBUTE_NAME" or "ATTRIBUTE_TITLE" or "ATTRIBUTE_DESCRIPTION"
"ATTRIBUTE_UNSPECIFIED"
"ATTRIBUTE_NAME"
"ATTRIBUTE_TITLE"
"ATTRIBUTE_DESCRIPTION"
matcher: optional object { caseSensitive, contains, endsWith, 3 more }

String matching operations

caseSensitive: optional boolean
contains: optional string
endsWith: optional string
exact: optional string
regex: optional string
startsWith: optional string
toolApprovals: optional object { always, only }

Approval filters that will automatically set the approval requirement on the tools synced from the MCP server

always: optional boolean
only: optional object { operator, filters }

Top-level filter with simple boolean logic (no nesting)

operator: "OPERATOR_UNSPECIFIED" or "OPERATOR_AND" or "OPERATOR_OR"
"OPERATOR_UNSPECIFIED"
"OPERATOR_AND"
"OPERATOR_OR"
filters: optional array of object { attribute, matcher }
attribute: "ATTRIBUTE_UNSPECIFIED" or "ATTRIBUTE_NAME" or "ATTRIBUTE_TITLE" or "ATTRIBUTE_DESCRIPTION"
"ATTRIBUTE_UNSPECIFIED"
"ATTRIBUTE_NAME"
"ATTRIBUTE_TITLE"
"ATTRIBUTE_DESCRIPTION"
matcher: optional object { caseSensitive, contains, endsWith, 3 more }

String matching operations

caseSensitive: optional boolean
contains: optional string
endsWith: optional string
exact: optional string
regex: optional string
startsWith: optional string
url: optional string
tool_set_event: object { metadata, event, info, toolSetId }

ToolSetEvent represents a single event in the tool set's operation timeline

metadata: object { id, accountId, createdAt, 4 more }

Metadata for ephemeral operations and activities (e.g., objectives, executions, runs)

id: string

Unique identifier for the operation (prefixed ULID, e.g., "obj_01HXK...")

accountId: string

Account this operation belongs to for multi-tenant isolation (prefixed ULID)

createdAt: string

Timestamp when this operation was created ULID includes timestamp information, but this explicit field enables easier querying

profileId: string

ID of the actor (user or service account) that created this operation

workspaceId: string

Workspace this operation belongs to for organizational grouping (prefixed ULID)

externalId: optional string

External ID for the operation (e.g., a workflow ID from an external system)

labels: optional map[string]

Arbitrary key-value pairs for categorization and filtering Examples: {"priority": "high", "source": "api", "workflow": "onboarding"}

event: optional object { syncCompleted, syncFailed, syncStarted, type }

ToolSetEventData represents the actual event payload for tool set operations

syncCompleted: optional object { message, toolsSynced }

SyncCompleted is emitted when a tool set sync operation completes successfully

message: optional string

Optional message with additional details

toolsSynced: optional number

Number of tools synced

syncFailed: optional object { error, errorType, message }

SyncFailed is emitted when a tool set sync operation fails

error: optional boolean

Indicates this is an error event

errorType: optional string

Optional error type/code for programmatic handling

message: optional string

Error message describing what went wrong

syncStarted: optional object { message }

SyncStarted is emitted when a tool set sync operation begins

message: optional string

Timestamp when the sync was initiated

type: optional string

Type of the event (e.g., "sync_started", "sync_completed", "sync_failed")

info: optional object { createdBy, toolSet }
createdBy: optional object { metadata, spec }

Profile represents a human user at the account level. Profiles are account-scoped resources that can be associated with multiple workspaces through the Actor model. Authentication for profiles is handled via SSO/OAuth (WorkOS).

metadata: object { id, accountId, name, 3 more }

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...")

accountId: 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

profileId: string
externalId: optional string

External ID for the resource (e.g., a workflow ID from an external system)

labels: optional map[string]

Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"}

spec: object { type, email, name }

ProfileSpec contains the profile-specific fields

type: "PROFILE_TYPE_USER" or "PROFILE_TYPE_API_KEY" or "PROFILE_TYPE_SYSTEM"

Type is the type of profile. User's are humans, API keys are computers. You know the deal.

"PROFILE_TYPE_USER"
"PROFILE_TYPE_API_KEY"
"PROFILE_TYPE_SYSTEM"
email: optional string

Email address of the user (required, unique per account)

name: optional string

Display name for the user (e.g., "Bobby Tables")

toolSet: optional object { id, accountId, createdAt, 5 more }

Standard metadata for persistent, named resources (e.g., agents, tools, prompts)

id: string

Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...")

accountId: string

Account this resource belongs to for multi-tenant isolation (prefixed ULID)

createdAt: string

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

profileId: string

ID of the actor (user or service account) that created this resource

workspaceId: string

Workspace this resource belongs to for organizational grouping (prefixed ULID)

externalId: optional string

External ID for the resource (e.g., a workflow ID from an external system)

labels: optional map[string]

Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"}

toolSetId: optional string

The tool set this event is associated with

tool_set_event_data: object { syncCompleted, syncFailed, syncStarted, type }

ToolSetEventData represents the actual event payload for tool set operations

syncCompleted: optional object { message, toolsSynced }

SyncCompleted is emitted when a tool set sync operation completes successfully

message: optional string

Optional message with additional details

toolsSynced: optional number

Number of tools synced

syncFailed: optional object { error, errorType, message }

SyncFailed is emitted when a tool set sync operation fails

error: optional boolean

Indicates this is an error event

errorType: optional string

Optional error type/code for programmatic handling

message: optional string

Error message describing what went wrong

syncStarted: optional object { message }

SyncStarted is emitted when a tool set sync operation begins

message: optional string

Timestamp when the sync was initiated

type: optional string

Type of the event (e.g., "sync_started", "sync_completed", "sync_failed")

tool_set_info: object { agentCount, createdBy, lastSync, toolCount }
agentCount: optional number
createdBy: optional object { metadata, spec }

Profile represents a human user at the account level. Profiles are account-scoped resources that can be associated with multiple workspaces through the Actor model. Authentication for profiles is handled via SSO/OAuth (WorkOS).

metadata: object { id, accountId, name, 3 more }

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...")

accountId: 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

profileId: string
externalId: optional string

External ID for the resource (e.g., a workflow ID from an external system)

labels: optional map[string]

Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"}

spec: object { type, email, name }

ProfileSpec contains the profile-specific fields

type: "PROFILE_TYPE_USER" or "PROFILE_TYPE_API_KEY" or "PROFILE_TYPE_SYSTEM"

Type is the type of profile. User's are humans, API keys are computers. You know the deal.

"PROFILE_TYPE_USER"
"PROFILE_TYPE_API_KEY"
"PROFILE_TYPE_SYSTEM"
email: optional string

Email address of the user (required, unique per account)

name: optional string

Display name for the user (e.g., "Bobby Tables")

lastSync: optional string
toolCount: optional number
tool_set_spec: object { adapter, description }
adapter: optional object { http, mcp }
http: optional object { baseUrl, headers }
baseUrl: optional string
headers: optional map[string]
mcp: optional object { excludeTools, headers, includeTools, 2 more }
excludeTools: optional object { operator, filters }

Top-level filter with simple boolean logic (no nesting)

operator: "OPERATOR_UNSPECIFIED" or "OPERATOR_AND" or "OPERATOR_OR"
"OPERATOR_UNSPECIFIED"
"OPERATOR_AND"
"OPERATOR_OR"
filters: optional array of object { attribute, matcher }
attribute: "ATTRIBUTE_UNSPECIFIED" or "ATTRIBUTE_NAME" or "ATTRIBUTE_TITLE" or "ATTRIBUTE_DESCRIPTION"
"ATTRIBUTE_UNSPECIFIED"
"ATTRIBUTE_NAME"
"ATTRIBUTE_TITLE"
"ATTRIBUTE_DESCRIPTION"
matcher: optional object { caseSensitive, contains, endsWith, 3 more }

String matching operations

caseSensitive: optional boolean
contains: optional string
endsWith: optional string
exact: optional string
regex: optional string
startsWith: optional string
headers: optional map[string]
includeTools: optional object { operator, filters }

Top-level filter with simple boolean logic (no nesting)

operator: "OPERATOR_UNSPECIFIED" or "OPERATOR_AND" or "OPERATOR_OR"
"OPERATOR_UNSPECIFIED"
"OPERATOR_AND"
"OPERATOR_OR"
filters: optional array of object { attribute, matcher }
attribute: "ATTRIBUTE_UNSPECIFIED" or "ATTRIBUTE_NAME" or "ATTRIBUTE_TITLE" or "ATTRIBUTE_DESCRIPTION"
"ATTRIBUTE_UNSPECIFIED"
"ATTRIBUTE_NAME"
"ATTRIBUTE_TITLE"
"ATTRIBUTE_DESCRIPTION"
matcher: optional object { caseSensitive, contains, endsWith, 3 more }

String matching operations

caseSensitive: optional boolean
contains: optional string
endsWith: optional string
exact: optional string
regex: optional string
startsWith: optional string
toolApprovals: optional object { always, only }

Approval filters that will automatically set the approval requirement on the tools synced from the MCP server

always: optional boolean
only: optional object { operator, filters }

Top-level filter with simple boolean logic (no nesting)

operator: "OPERATOR_UNSPECIFIED" or "OPERATOR_AND" or "OPERATOR_OR"
"OPERATOR_UNSPECIFIED"
"OPERATOR_AND"
"OPERATOR_OR"
filters: optional array of object { attribute, matcher }
attribute: "ATTRIBUTE_UNSPECIFIED" or "ATTRIBUTE_NAME" or "ATTRIBUTE_TITLE" or "ATTRIBUTE_DESCRIPTION"
"ATTRIBUTE_UNSPECIFIED"
"ATTRIBUTE_NAME"
"ATTRIBUTE_TITLE"
"ATTRIBUTE_DESCRIPTION"
matcher: optional object { caseSensitive, contains, endsWith, 3 more }

String matching operations

caseSensitive: optional boolean
contains: optional string
endsWith: optional string
exact: optional string
regex: optional string
startsWith: optional string
url: optional string
description: optional string

Tool SetsTools

ToolService manages tool sets and tools at the WORKSPACE level. Tool sets group related tools, and tools define specific capabilities for agents. All operations are implicitly scoped to the workspace determined by the JWT token.

Note: When a ToolSet has managed=true, only API Key actors can modify its tools. Profile actors (humans) are restricted from modifying managed tool sets.

Authentication: Bearer token (JWT) Scope: Workspace-level operations

List tools
$ cadenya tool-sets:tools list
GET/v1/tool_sets/{toolSetId}/tools
Create a new tool
$ cadenya tool-sets:tools create
POST/v1/tool_sets/{toolSetId}/tools
Get a tool by ID
$ cadenya tool-sets:tools retrieve
GET/v1/tool_sets/{toolSetId}/tools/{id}
Update a tool
$ cadenya tool-sets:tools update
PUT/v1/tool_sets/{toolSetId}/tools/{id}
Delete a tool
$ cadenya tool-sets:tools delete
DELETE/v1/tool_sets/{toolSetId}/tools/{id}
ModelsExpand Collapse
config_http: object { requestMethod, headers, path, 4 more }
requestMethod: "GET" or "POST" or "PUT" or 2 more
"GET"
"POST"
"PUT"
"PATCH"
"DELETE"
headers: optional map[string]
path: optional string
query: optional string
requestBodyContentType: optional string
requestBodyTemplate: optional string

These are only used when the request method is a POST, PUT, or PATCH

toolName: optional 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: object { toolDescription, toolName, toolTitle }
toolDescription: optional string
toolName: optional string
toolTitle: optional string
tool: object { metadata, spec, info }
metadata: object { id, accountId, createdAt, 5 more }

Standard metadata for persistent, named resources (e.g., agents, tools, prompts)

id: string

Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...")

accountId: string

Account this resource belongs to for multi-tenant isolation (prefixed ULID)

createdAt: string

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

profileId: string

ID of the actor (user or service account) that created this resource

workspaceId: string

Workspace this resource belongs to for organizational grouping (prefixed ULID)

externalId: optional string

External ID for the resource (e.g., a workflow ID from an external system)

labels: optional map[string]

Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"}

spec: object { config, description, parameters, 2 more }
config: object { http, mcp }

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: optional object { requestMethod, headers, path, 4 more }
requestMethod: "GET" or "POST" or "PUT" or 2 more
"GET"
"POST"
"PUT"
"PATCH"
"DELETE"
headers: optional map[string]
path: optional string
query: optional string
requestBodyContentType: optional string
requestBodyTemplate: optional string

These are only used when the request method is a POST, PUT, or PATCH

toolName: optional 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: optional object { toolDescription, toolName, toolTitle }
toolDescription: optional string
toolName: optional string
toolTitle: optional string
description: string
parameters: map[unknown]
status: "TOOL_STATUS_UNSPECIFIED" or "TOOL_STATUS_AVAILABLE" or "TOOL_STATUS_FILTERED" or "TOOL_STATUS_ARCHIVED"
"TOOL_STATUS_UNSPECIFIED"
"TOOL_STATUS_AVAILABLE"
"TOOL_STATUS_FILTERED"
"TOOL_STATUS_ARCHIVED"
requiresApproval: optional boolean
info: optional object { createdBy, toolSet }
createdBy: optional object { metadata, spec }

Profile represents a human user at the account level. Profiles are account-scoped resources that can be associated with multiple workspaces through the Actor model. Authentication for profiles is handled via SSO/OAuth (WorkOS).

metadata: object { id, accountId, name, 3 more }

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...")

accountId: 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

profileId: string
externalId: optional string

External ID for the resource (e.g., a workflow ID from an external system)

labels: optional map[string]

Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"}

spec: object { type, email, name }

ProfileSpec contains the profile-specific fields

type: "PROFILE_TYPE_USER" or "PROFILE_TYPE_API_KEY" or "PROFILE_TYPE_SYSTEM"

Type is the type of profile. User's are humans, API keys are computers. You know the deal.

"PROFILE_TYPE_USER"
"PROFILE_TYPE_API_KEY"
"PROFILE_TYPE_SYSTEM"
email: optional string

Email address of the user (required, unique per account)

name: optional string

Display name for the user (e.g., "Bobby Tables")

toolSet: optional object { id, accountId, createdAt, 5 more }

Standard metadata for persistent, named resources (e.g., agents, tools, prompts)

id: string

Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...")

accountId: string

Account this resource belongs to for multi-tenant isolation (prefixed ULID)

createdAt: string

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

profileId: string

ID of the actor (user or service account) that created this resource

workspaceId: string

Workspace this resource belongs to for organizational grouping (prefixed ULID)

externalId: optional string

External ID for the resource (e.g., a workflow ID from an external system)

labels: optional map[string]

Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"}

tool_info: object { createdBy, toolSet }
createdBy: optional object { metadata, spec }

Profile represents a human user at the account level. Profiles are account-scoped resources that can be associated with multiple workspaces through the Actor model. Authentication for profiles is handled via SSO/OAuth (WorkOS).

metadata: object { id, accountId, name, 3 more }

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...")

accountId: 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

profileId: string
externalId: optional string

External ID for the resource (e.g., a workflow ID from an external system)

labels: optional map[string]

Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"}

spec: object { type, email, name }

ProfileSpec contains the profile-specific fields

type: "PROFILE_TYPE_USER" or "PROFILE_TYPE_API_KEY" or "PROFILE_TYPE_SYSTEM"

Type is the type of profile. User's are humans, API keys are computers. You know the deal.

"PROFILE_TYPE_USER"
"PROFILE_TYPE_API_KEY"
"PROFILE_TYPE_SYSTEM"
email: optional string

Email address of the user (required, unique per account)

name: optional string

Display name for the user (e.g., "Bobby Tables")

toolSet: optional object { id, accountId, createdAt, 5 more }

Standard metadata for persistent, named resources (e.g., agents, tools, prompts)

id: string

Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...")

accountId: string

Account this resource belongs to for multi-tenant isolation (prefixed ULID)

createdAt: string

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

profileId: string

ID of the actor (user or service account) that created this resource

workspaceId: string

Workspace this resource belongs to for organizational grouping (prefixed ULID)

externalId: optional string

External ID for the resource (e.g., a workflow ID from an external system)

labels: optional map[string]

Arbitrary key-value pairs for categorization and filtering Examples: {"environment": "production", "team": "platform", "version": "v2"}

tool_spec: object { config, description, parameters, 2 more }
config: object { http, mcp }

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: optional object { requestMethod, headers, path, 4 more }
requestMethod: "GET" or "POST" or "PUT" or 2 more
"GET"
"POST"
"PUT"
"PATCH"
"DELETE"
headers: optional map[string]
path: optional string
query: optional string
requestBodyContentType: optional string
requestBodyTemplate: optional string

These are only used when the request method is a POST, PUT, or PATCH

toolName: optional 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: optional object { toolDescription, toolName, toolTitle }
toolDescription: optional string
toolName: optional string
toolTitle: optional string
description: string
parameters: map[unknown]
status: "TOOL_STATUS_UNSPECIFIED" or "TOOL_STATUS_AVAILABLE" or "TOOL_STATUS_FILTERED" or "TOOL_STATUS_ARCHIVED"
"TOOL_STATUS_UNSPECIFIED"
"TOOL_STATUS_AVAILABLE"
"TOOL_STATUS_FILTERED"
"TOOL_STATUS_ARCHIVED"
requiresApproval: optional boolean
tool_spec_config: object { http, mcp }

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: optional object { requestMethod, headers, path, 4 more }
requestMethod: "GET" or "POST" or "PUT" or 2 more
"GET"
"POST"
"PUT"
"PATCH"
"DELETE"
headers: optional map[string]
path: optional string
query: optional string
requestBodyContentType: optional string
requestBodyTemplate: optional string

These are only used when the request method is a POST, PUT, or PATCH

toolName: optional 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: optional object { toolDescription, toolName, toolTitle }
toolDescription: optional string
toolName: optional string
toolTitle: optional string