# Tool Sets ## List tool sets `$ cadenya tool-sets list` **get** `/v1/tool_sets` Lists all tool sets in the workspace ### Parameters - `--cursor: optional string` Pagination cursor from previous response - `--include-info: optional boolean` When set to true you may use more of your alloted API rate-limit - `--limit: optional number` Maximum number of results to return - `--prefix: optional string` Filter expression (query param: prefix) - `--sort-order: optional string` Sort order for results (asc or desc by creation time) ### Returns - `ListToolSetsResponse: object { items, pagination }` - `items: optional array of ToolSet` - `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"` - `filters: optional array of object { attribute, matcher }` - `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"` - `filters: optional array of object { attribute, matcher }` - `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` - `pagination: optional object { nextCursor, total }` - `nextCursor: optional string` - `total: optional number` ### Example ```cli cadenya tool-sets list \ --api-key 'My API Key' ``` #### Response ```json { "items": [ { "metadata": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "name": "name", "profileId": "profileId", "workspaceId": "workspaceId", "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" } }, "description": "description" }, "info": { "agentCount": 0, "createdBy": { "metadata": { "id": "id", "accountId": "accountId", "name": "name", "profileId": "profileId", "externalId": "externalId", "labels": { "foo": "string" } }, "spec": { "type": "PROFILE_TYPE_USER", "email": "email", "name": "name" } }, "lastSync": "2019-12-27T18:11:19.117Z", "toolCount": 0 } } ], "pagination": { "nextCursor": "nextCursor", "total": 0 } } ``` ## Create a new tool set `$ cadenya tool-sets create` **post** `/v1/tool_sets` Creates a new tool set in the workspace ### Parameters - `--metadata: object { name, externalId, labels }` 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. - `--spec: object { adapter, description }` ### Returns - `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"` - `filters: optional array of object { attribute, matcher }` - `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"` - `filters: optional array of object { attribute, matcher }` - `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` ### Example ```cli cadenya tool-sets create \ --api-key 'My API Key' \ --metadata '{name: name}' \ --spec '{}' ``` #### Response ```json { "metadata": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "name": "name", "profileId": "profileId", "workspaceId": "workspaceId", "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" } }, "description": "description" }, "info": { "agentCount": 0, "createdBy": { "metadata": { "id": "id", "accountId": "accountId", "name": "name", "profileId": "profileId", "externalId": "externalId", "labels": { "foo": "string" } }, "spec": { "type": "PROFILE_TYPE_USER", "email": "email", "name": "name" } }, "lastSync": "2019-12-27T18:11:19.117Z", "toolCount": 0 } } ``` ## Get a tool set by ID `$ cadenya tool-sets retrieve` **get** `/v1/tool_sets/{id}` Retrieves a tool set by ID from the workspace ### Parameters - `--id: string` ### Returns - `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"` - `filters: optional array of object { attribute, matcher }` - `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"` - `filters: optional array of object { attribute, matcher }` - `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` ### Example ```cli cadenya tool-sets retrieve \ --api-key 'My API Key' \ --id id ``` #### Response ```json { "metadata": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "name": "name", "profileId": "profileId", "workspaceId": "workspaceId", "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" } }, "description": "description" }, "info": { "agentCount": 0, "createdBy": { "metadata": { "id": "id", "accountId": "accountId", "name": "name", "profileId": "profileId", "externalId": "externalId", "labels": { "foo": "string" } }, "spec": { "type": "PROFILE_TYPE_USER", "email": "email", "name": "name" } }, "lastSync": "2019-12-27T18:11:19.117Z", "toolCount": 0 } } ``` ## Update a tool set `$ cadenya tool-sets update` **put** `/v1/tool_sets/{id}` Updates a tool set in the workspace ### Parameters - `--id: string` - `--metadata: optional object { name, externalId, labels }` 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. - `--spec: optional object { adapter, description }` - `--update-mask: optional string` ### Returns - `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"` - `filters: optional array of object { attribute, matcher }` - `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"` - `filters: optional array of object { attribute, matcher }` - `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` ### Example ```cli cadenya tool-sets update \ --api-key 'My API Key' \ --id id ``` #### Response ```json { "metadata": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "name": "name", "profileId": "profileId", "workspaceId": "workspaceId", "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" } }, "description": "description" }, "info": { "agentCount": 0, "createdBy": { "metadata": { "id": "id", "accountId": "accountId", "name": "name", "profileId": "profileId", "externalId": "externalId", "labels": { "foo": "string" } }, "spec": { "type": "PROFILE_TYPE_USER", "email": "email", "name": "name" } }, "lastSync": "2019-12-27T18:11:19.117Z", "toolCount": 0 } } ``` ## Delete a tool set `$ cadenya tool-sets delete` **delete** `/v1/tool_sets/{id}` Deletes a tool set in the workspace ### Parameters - `--id: string` ### Example ```cli cadenya tool-sets delete \ --api-key 'My API Key' \ --id id ``` ## List tool set events `$ cadenya tool-sets list-events` **get** `/v1/tool_sets/{toolSetId}/events` Lists all events (including sync status) for a tool set ### Parameters - `--tool-set-id: string` - `--cursor: optional string` Pagination cursor from previous response - `--include-info: optional boolean` When set to true you may use more of your alloted API rate-limit - `--limit: optional number` Maximum number of results to return - `--sort-order: optional string` Sort order for results (asc or desc by creation time) ### Returns - `ListToolSetEventsResponse: object { items, pagination }` - `items: optional array of ToolSetEvent` - `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 - `pagination: optional object { nextCursor, total }` - `nextCursor: optional string` - `total: optional number` ### Example ```cli cadenya tool-sets list-events \ --api-key 'My API Key' \ --tool-set-id toolSetId ``` #### 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_USER", "email": "email", "name": "name" } }, "toolSet": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "name": "name", "profileId": "profileId", "workspaceId": "workspaceId", "externalId": "externalId", "labels": { "foo": "string" } } }, "toolSetId": "toolSetId" } ], "pagination": { "nextCursor": "nextCursor", "total": 0 } } ``` ## Domain Types ### Mcp Tool Filter - `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 - `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 - `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 - `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 - `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"` - `filters: optional array of object { attribute, matcher }` - `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"` - `filters: optional array of object { attribute, matcher }` - `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 - `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"` - `filters: optional array of object { attribute, matcher }` - `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"` - `filters: optional array of object { attribute, matcher }` - `url: optional string` ### Tool Set Adapter HTTP - `tool_set_adapter_http: object { baseUrl, headers }` - `baseUrl: optional string` - `headers: optional map[string]` ### Tool Set Adapter Mcp - `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"` - `filters: optional array of object { attribute, matcher }` - `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"` - `filters: optional array of object { attribute, matcher }` - `url: optional string` ### Tool Set Event - `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 - `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 - `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 - `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"` - `filters: optional array of object { attribute, matcher }` - `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"` - `filters: optional array of object { attribute, matcher }` - `url: optional string` - `description: optional string` # Tools ## List tools `$ cadenya tool-sets:tools list` **get** `/v1/tool_sets/{toolSetId}/tools` Lists all tools in the tool set ### Parameters - `--tool-set-id: string` - `--cursor: optional string` Pagination cursor from previous response - `--include-info: optional boolean` When set to true you may use more of your alloted API rate-limit - `--limit: optional number` Maximum number of results to return - `--prefix: optional string` Filter expression (query param: prefix) - `--sort-order: optional string` Sort order for results (asc or desc by creation time) ### Returns - `ListToolsResponse: object { items, pagination }` - `items: optional array of Tool` - `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"} - `pagination: optional object { nextCursor, total }` - `nextCursor: optional string` - `total: optional number` ### Example ```cli cadenya tool-sets:tools list \ --api-key 'My API Key' \ --tool-set-id toolSetId ``` #### Response ```json { "items": [ { "metadata": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "name": "name", "profileId": "profileId", "workspaceId": "workspaceId", "externalId": "externalId", "labels": { "foo": "string" } }, "spec": { "config": { "http": { "requestMethod": "GET", "headers": { "foo": "string" }, "path": "path", "query": "query", "requestBodyContentType": "requestBodyContentType", "requestBodyTemplate": "requestBodyTemplate", "toolName": "toolName" }, "mcp": { "toolDescription": "toolDescription", "toolName": "toolName", "toolTitle": "toolTitle" } }, "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_USER", "email": "email", "name": "name" } }, "toolSet": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "name": "name", "profileId": "profileId", "workspaceId": "workspaceId", "externalId": "externalId", "labels": { "foo": "string" } } } } ], "pagination": { "nextCursor": "nextCursor", "total": 0 } } ``` ## Create a new tool `$ cadenya tool-sets:tools create` **post** `/v1/tool_sets/{toolSetId}/tools` Creates a new tool in the tool set ### Parameters - `--tool-set-id: string` - `--metadata: object { name, externalId, labels }` 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. - `--spec: object { config, description, parameters, 2 more }` ### Returns - `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"} ### Example ```cli cadenya tool-sets:tools create \ --api-key 'My API Key' \ --tool-set-id toolSetId \ --metadata '{name: name}' \ --spec '{config: {}, description: description, parameters: {foo: bar}, status: TOOL_STATUS_UNSPECIFIED}' ``` #### Response ```json { "metadata": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "name": "name", "profileId": "profileId", "workspaceId": "workspaceId", "externalId": "externalId", "labels": { "foo": "string" } }, "spec": { "config": { "http": { "requestMethod": "GET", "headers": { "foo": "string" }, "path": "path", "query": "query", "requestBodyContentType": "requestBodyContentType", "requestBodyTemplate": "requestBodyTemplate", "toolName": "toolName" }, "mcp": { "toolDescription": "toolDescription", "toolName": "toolName", "toolTitle": "toolTitle" } }, "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_USER", "email": "email", "name": "name" } }, "toolSet": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "name": "name", "profileId": "profileId", "workspaceId": "workspaceId", "externalId": "externalId", "labels": { "foo": "string" } } } } ``` ## Get a tool by ID `$ cadenya tool-sets:tools retrieve` **get** `/v1/tool_sets/{toolSetId}/tools/{id}` Retrieves a tool by ID from the workspace ### Parameters - `--tool-set-id: string` - `--id: string` ### Returns - `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"} ### Example ```cli cadenya tool-sets:tools retrieve \ --api-key 'My API Key' \ --tool-set-id toolSetId \ --id id ``` #### Response ```json { "metadata": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "name": "name", "profileId": "profileId", "workspaceId": "workspaceId", "externalId": "externalId", "labels": { "foo": "string" } }, "spec": { "config": { "http": { "requestMethod": "GET", "headers": { "foo": "string" }, "path": "path", "query": "query", "requestBodyContentType": "requestBodyContentType", "requestBodyTemplate": "requestBodyTemplate", "toolName": "toolName" }, "mcp": { "toolDescription": "toolDescription", "toolName": "toolName", "toolTitle": "toolTitle" } }, "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_USER", "email": "email", "name": "name" } }, "toolSet": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "name": "name", "profileId": "profileId", "workspaceId": "workspaceId", "externalId": "externalId", "labels": { "foo": "string" } } } } ``` ## Update a tool `$ cadenya tool-sets:tools update` **put** `/v1/tool_sets/{toolSetId}/tools/{id}` Updates a tool in the tool set ### Parameters - `--tool-set-id: string` - `--id: string` - `--metadata: optional object { name, externalId, labels }` 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. - `--spec: optional object { config, description, parameters, 2 more }` - `--update-mask: optional string` ### Returns - `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"} ### Example ```cli cadenya tool-sets:tools update \ --api-key 'My API Key' \ --tool-set-id toolSetId \ --id id ``` #### Response ```json { "metadata": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "name": "name", "profileId": "profileId", "workspaceId": "workspaceId", "externalId": "externalId", "labels": { "foo": "string" } }, "spec": { "config": { "http": { "requestMethod": "GET", "headers": { "foo": "string" }, "path": "path", "query": "query", "requestBodyContentType": "requestBodyContentType", "requestBodyTemplate": "requestBodyTemplate", "toolName": "toolName" }, "mcp": { "toolDescription": "toolDescription", "toolName": "toolName", "toolTitle": "toolTitle" } }, "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_USER", "email": "email", "name": "name" } }, "toolSet": { "id": "id", "accountId": "accountId", "createdAt": "2019-12-27T18:11:19.117Z", "name": "name", "profileId": "profileId", "workspaceId": "workspaceId", "externalId": "externalId", "labels": { "foo": "string" } } } } ``` ## Delete a tool `$ cadenya tool-sets:tools delete` **delete** `/v1/tool_sets/{toolSetId}/tools/{id}` Deletes a tool in the tool set ### Parameters - `--tool-set-id: string` - `--id: string` ### Example ```cli cadenya tool-sets:tools delete \ --api-key 'My API Key' \ --tool-set-id toolSetId \ --id id ``` ## Domain Types ### Config HTTP - `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 - `config_mcp: object { toolDescription, toolName, toolTitle }` - `toolDescription: optional string` - `toolName: optional string` - `toolTitle: optional string` ### Tool - `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 - `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 - `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 - `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`