# Tool Sets ## List tool sets **get** `/v1/tool_sets` Lists all tool sets in the workspace ### Query Parameters - `cursor: optional string` Pagination cursor from previous response - `includeInfo: 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) - `sortOrder: optional string` Sort order for results (asc or desc by creation time) ### Returns - `items: optional array of ToolSet` - `metadata: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...") - `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: ToolSetSpec` - `adapter: optional ToolSetAdapter` - `http: optional ToolSetAdapterHTTP` - `baseUrl: optional string` - `headers: optional map[string]` - `mcp: optional ToolSetAdapterMcp` - `excludeTools: optional McpToolFilter` 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 McpToolFilter` Top-level filter with simple boolean logic (no nesting) - `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 McpToolFilter` Top-level filter with simple boolean logic (no nesting) - `url: optional string` - `description: optional string` - `info: optional ToolSetInfo` Tool set information - `agentCount: optional number` - `createdBy: optional Profile` 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: AccountResourceMetadata` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `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: ProfileSpec` 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 Page` - `nextCursor: optional string` - `total: optional number` ### Example ```http curl https://api.cadenya.com/v1/tool_sets \ -H "Authorization: Bearer $CADENYA_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 **post** `/v1/tool_sets` Creates a new tool set in the workspace ### Body Parameters - `metadata: CreateResourceMetadata` CreateResourceMetadata contains the user-provided fields for creating a workspace-scoped resource. Read-only fields (id, account_id, workspace_id, profile_id, created_at) are excluded since they are set by the server. - `name: string` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") - `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: ToolSetSpec` - `adapter: optional ToolSetAdapter` - `http: optional ToolSetAdapterHTTP` - `baseUrl: optional string` - `headers: optional map[string]` - `mcp: optional ToolSetAdapterMcp` - `excludeTools: optional McpToolFilter` 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 McpToolFilter` Top-level filter with simple boolean logic (no nesting) - `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 McpToolFilter` Top-level filter with simple boolean logic (no nesting) - `url: optional string` - `description: optional string` ### Returns - `ToolSet = object { metadata, spec, info }` - `metadata: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...") - `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: ToolSetSpec` - `adapter: optional ToolSetAdapter` - `http: optional ToolSetAdapterHTTP` - `baseUrl: optional string` - `headers: optional map[string]` - `mcp: optional ToolSetAdapterMcp` - `excludeTools: optional McpToolFilter` 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 McpToolFilter` Top-level filter with simple boolean logic (no nesting) - `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 McpToolFilter` Top-level filter with simple boolean logic (no nesting) - `url: optional string` - `description: optional string` - `info: optional ToolSetInfo` Tool set information - `agentCount: optional number` - `createdBy: optional Profile` 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: AccountResourceMetadata` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `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: ProfileSpec` 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 ```http curl https://api.cadenya.com/v1/tool_sets \ -H 'Content-Type: application/json' \ -H "Authorization: Bearer $CADENYA_API_KEY" \ -d '{ "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 **get** `/v1/tool_sets/{id}` Retrieves a tool set by ID from the workspace ### Path Parameters - `id: string` ### Returns - `ToolSet = object { metadata, spec, info }` - `metadata: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...") - `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: ToolSetSpec` - `adapter: optional ToolSetAdapter` - `http: optional ToolSetAdapterHTTP` - `baseUrl: optional string` - `headers: optional map[string]` - `mcp: optional ToolSetAdapterMcp` - `excludeTools: optional McpToolFilter` 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 McpToolFilter` Top-level filter with simple boolean logic (no nesting) - `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 McpToolFilter` Top-level filter with simple boolean logic (no nesting) - `url: optional string` - `description: optional string` - `info: optional ToolSetInfo` Tool set information - `agentCount: optional number` - `createdBy: optional Profile` 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: AccountResourceMetadata` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `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: ProfileSpec` 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 ```http curl https://api.cadenya.com/v1/tool_sets/$ID \ -H "Authorization: Bearer $CADENYA_API_KEY" ``` #### 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 **put** `/v1/tool_sets/{id}` Updates a tool set in the workspace ### Path Parameters - `id: string` ### Body Parameters - `metadata: optional UpdateResourceMetadata` UpdateResourceMetadata contains the user-provided fields for updating a workspace-scoped resource. Read-only fields (id, account_id, workspace_id, profile_id, created_at) are excluded since they are set by the server. - `name: string` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") - `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: optional ToolSetSpec` - `adapter: optional ToolSetAdapter` - `http: optional ToolSetAdapterHTTP` - `baseUrl: optional string` - `headers: optional map[string]` - `mcp: optional ToolSetAdapterMcp` - `excludeTools: optional McpToolFilter` 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 McpToolFilter` Top-level filter with simple boolean logic (no nesting) - `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 McpToolFilter` Top-level filter with simple boolean logic (no nesting) - `url: optional string` - `description: optional string` - `updateMask: optional string` ### Returns - `ToolSet = object { metadata, spec, info }` - `metadata: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...") - `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: ToolSetSpec` - `adapter: optional ToolSetAdapter` - `http: optional ToolSetAdapterHTTP` - `baseUrl: optional string` - `headers: optional map[string]` - `mcp: optional ToolSetAdapterMcp` - `excludeTools: optional McpToolFilter` 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 McpToolFilter` Top-level filter with simple boolean logic (no nesting) - `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 McpToolFilter` Top-level filter with simple boolean logic (no nesting) - `url: optional string` - `description: optional string` - `info: optional ToolSetInfo` Tool set information - `agentCount: optional number` - `createdBy: optional Profile` 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: AccountResourceMetadata` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `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: ProfileSpec` 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 ```http curl https://api.cadenya.com/v1/tool_sets/$ID \ -X PUT \ -H 'Content-Type: application/json' \ -H "Authorization: Bearer $CADENYA_API_KEY" \ -d '{}' ``` #### 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 **delete** `/v1/tool_sets/{id}` Deletes a tool set in the workspace ### Path Parameters - `id: string` ### Example ```http curl https://api.cadenya.com/v1/tool_sets/$ID \ -X DELETE \ -H "Authorization: Bearer $CADENYA_API_KEY" ``` ## List tool set events **get** `/v1/tool_sets/{toolSetId}/events` Lists all events (including sync status) for a tool set ### Path Parameters - `toolSetId: string` ### Query Parameters - `cursor: optional string` Pagination cursor from previous response - `includeInfo: 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 - `sortOrder: optional string` Sort order for results (asc or desc by creation time) ### Returns - `items: optional array of ToolSetEvent` - `metadata: OperationMetadata` Metadata for ephemeral operations and activities (e.g., objectives, executions, runs) - `id: string` Unique identifier for the operation (prefixed ULID, e.g., "obj_01HXK...") - `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 ToolSetEventData` ToolSetEventData represents the actual event payload for tool set operations - `syncCompleted: optional SyncCompleted` 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 SyncFailed` 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 SyncStarted` 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 Profile` 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: AccountResourceMetadata` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `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: ProfileSpec` 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 ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...") - `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 Page` - `nextCursor: optional string` - `total: optional number` ### Example ```http curl https://api.cadenya.com/v1/tool_sets/$TOOL_SET_ID/events \ -H "Authorization: Bearer $CADENYA_API_KEY" ``` #### 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 - `McpToolFilter = 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 - `SyncCompleted = 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 - `SyncFailed = 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 - `SyncStarted = object { message }` SyncStarted is emitted when a tool set sync operation begins - `message: optional string` Timestamp when the sync was initiated ### Tool Set - `ToolSet = object { metadata, spec, info }` - `metadata: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...") - `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: ToolSetSpec` - `adapter: optional ToolSetAdapter` - `http: optional ToolSetAdapterHTTP` - `baseUrl: optional string` - `headers: optional map[string]` - `mcp: optional ToolSetAdapterMcp` - `excludeTools: optional McpToolFilter` 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 McpToolFilter` Top-level filter with simple boolean logic (no nesting) - `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 McpToolFilter` Top-level filter with simple boolean logic (no nesting) - `url: optional string` - `description: optional string` - `info: optional ToolSetInfo` Tool set information - `agentCount: optional number` - `createdBy: optional Profile` 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: AccountResourceMetadata` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `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: ProfileSpec` 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 - `ToolSetAdapter = object { http, mcp }` - `http: optional ToolSetAdapterHTTP` - `baseUrl: optional string` - `headers: optional map[string]` - `mcp: optional ToolSetAdapterMcp` - `excludeTools: optional McpToolFilter` 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 McpToolFilter` Top-level filter with simple boolean logic (no nesting) - `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 McpToolFilter` Top-level filter with simple boolean logic (no nesting) - `url: optional string` ### Tool Set Adapter HTTP - `ToolSetAdapterHTTP = object { baseUrl, headers }` - `baseUrl: optional string` - `headers: optional map[string]` ### Tool Set Adapter Mcp - `ToolSetAdapterMcp = object { excludeTools, headers, includeTools, 2 more }` - `excludeTools: optional McpToolFilter` 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 McpToolFilter` Top-level filter with simple boolean logic (no nesting) - `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 McpToolFilter` Top-level filter with simple boolean logic (no nesting) - `url: optional string` ### Tool Set Event - `ToolSetEvent = object { metadata, event, info, toolSetId }` ToolSetEvent represents a single event in the tool set's operation timeline - `metadata: OperationMetadata` Metadata for ephemeral operations and activities (e.g., objectives, executions, runs) - `id: string` Unique identifier for the operation (prefixed ULID, e.g., "obj_01HXK...") - `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 ToolSetEventData` ToolSetEventData represents the actual event payload for tool set operations - `syncCompleted: optional SyncCompleted` 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 SyncFailed` 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 SyncStarted` 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 Profile` 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: AccountResourceMetadata` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `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: ProfileSpec` 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 ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...") - `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 - `ToolSetEventData = object { syncCompleted, syncFailed, syncStarted, type }` ToolSetEventData represents the actual event payload for tool set operations - `syncCompleted: optional SyncCompleted` 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 SyncFailed` 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 SyncStarted` 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 - `ToolSetInfo = object { agentCount, createdBy, lastSync, toolCount }` - `agentCount: optional number` - `createdBy: optional Profile` 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: AccountResourceMetadata` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `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: ProfileSpec` 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 - `ToolSetSpec = object { adapter, description }` - `adapter: optional ToolSetAdapter` - `http: optional ToolSetAdapterHTTP` - `baseUrl: optional string` - `headers: optional map[string]` - `mcp: optional ToolSetAdapterMcp` - `excludeTools: optional McpToolFilter` 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 McpToolFilter` Top-level filter with simple boolean logic (no nesting) - `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 McpToolFilter` Top-level filter with simple boolean logic (no nesting) - `url: optional string` - `description: optional string` # Tools ## List tools **get** `/v1/tool_sets/{toolSetId}/tools` Lists all tools in the tool set ### Path Parameters - `toolSetId: string` ### Query Parameters - `cursor: optional string` Pagination cursor from previous response - `includeInfo: 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) - `sortOrder: optional string` Sort order for results (asc or desc by creation time) ### Returns - `items: optional array of Tool` - `metadata: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...") - `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: ToolSpec` - `config: ToolSpecConfig` Config defines the adapter to use for the tool. This is used to determine how the tool is called. For example, if the tool is an HTTP tool, the adapter will be Http. If the tool is an inline tool, the adapter will be Inline. - `http: optional ConfigHTTP` - `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 ConfigMcp` - `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 ToolInfo` - `createdBy: optional Profile` 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: AccountResourceMetadata` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `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: ProfileSpec` 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 ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `pagination: optional Page` - `nextCursor: optional string` - `total: optional number` ### Example ```http curl https://api.cadenya.com/v1/tool_sets/$TOOL_SET_ID/tools \ -H "Authorization: Bearer $CADENYA_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": { "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 **post** `/v1/tool_sets/{toolSetId}/tools` Creates a new tool in the tool set ### Path Parameters - `toolSetId: string` ### Body Parameters - `metadata: CreateResourceMetadata` CreateResourceMetadata contains the user-provided fields for creating a workspace-scoped resource. Read-only fields (id, account_id, workspace_id, profile_id, created_at) are excluded since they are set by the server. - `name: string` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") - `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: ToolSpec` - `config: ToolSpecConfig` Config defines the adapter to use for the tool. This is used to determine how the tool is called. For example, if the tool is an HTTP tool, the adapter will be Http. If the tool is an inline tool, the adapter will be Inline. - `http: optional ConfigHTTP` - `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 ConfigMcp` - `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` ### Returns - `Tool = object { metadata, spec, info }` - `metadata: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...") - `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: ToolSpec` - `config: ToolSpecConfig` Config defines the adapter to use for the tool. This is used to determine how the tool is called. For example, if the tool is an HTTP tool, the adapter will be Http. If the tool is an inline tool, the adapter will be Inline. - `http: optional ConfigHTTP` - `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 ConfigMcp` - `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 ToolInfo` - `createdBy: optional Profile` 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: AccountResourceMetadata` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `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: ProfileSpec` 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 ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) ### Example ```http curl https://api.cadenya.com/v1/tool_sets/$TOOL_SET_ID/tools \ -H 'Content-Type: application/json' \ -H "Authorization: Bearer $CADENYA_API_KEY" \ -d '{ "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 **get** `/v1/tool_sets/{toolSetId}/tools/{id}` Retrieves a tool by ID from the workspace ### Path Parameters - `toolSetId: string` - `id: string` ### Returns - `Tool = object { metadata, spec, info }` - `metadata: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...") - `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: ToolSpec` - `config: ToolSpecConfig` Config defines the adapter to use for the tool. This is used to determine how the tool is called. For example, if the tool is an HTTP tool, the adapter will be Http. If the tool is an inline tool, the adapter will be Inline. - `http: optional ConfigHTTP` - `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 ConfigMcp` - `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 ToolInfo` - `createdBy: optional Profile` 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: AccountResourceMetadata` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `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: ProfileSpec` 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 ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) ### Example ```http curl https://api.cadenya.com/v1/tool_sets/$TOOL_SET_ID/tools/$ID \ -H "Authorization: Bearer $CADENYA_API_KEY" ``` #### 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 **put** `/v1/tool_sets/{toolSetId}/tools/{id}` Updates a tool in the tool set ### Path Parameters - `toolSetId: string` - `id: string` ### Body Parameters - `metadata: optional UpdateResourceMetadata` UpdateResourceMetadata contains the user-provided fields for updating a workspace-scoped resource. Read-only fields (id, account_id, workspace_id, profile_id, created_at) are excluded since they are set by the server. - `name: string` Human-readable name for the resource (e.g., "Customer Support Agent", "Email Tool") - `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: optional ToolSpec` - `config: ToolSpecConfig` Config defines the adapter to use for the tool. This is used to determine how the tool is called. For example, if the tool is an HTTP tool, the adapter will be Http. If the tool is an inline tool, the adapter will be Inline. - `http: optional ConfigHTTP` - `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 ConfigMcp` - `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` - `updateMask: optional string` ### Returns - `Tool = object { metadata, spec, info }` - `metadata: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...") - `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: ToolSpec` - `config: ToolSpecConfig` Config defines the adapter to use for the tool. This is used to determine how the tool is called. For example, if the tool is an HTTP tool, the adapter will be Http. If the tool is an inline tool, the adapter will be Inline. - `http: optional ConfigHTTP` - `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 ConfigMcp` - `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 ToolInfo` - `createdBy: optional Profile` 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: AccountResourceMetadata` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `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: ProfileSpec` 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 ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) ### Example ```http curl https://api.cadenya.com/v1/tool_sets/$TOOL_SET_ID/tools/$ID \ -X PUT \ -H 'Content-Type: application/json' \ -H "Authorization: Bearer $CADENYA_API_KEY" \ -d '{}' ``` #### 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 **delete** `/v1/tool_sets/{toolSetId}/tools/{id}` Deletes a tool in the tool set ### Path Parameters - `toolSetId: string` - `id: string` ### Example ```http curl https://api.cadenya.com/v1/tool_sets/$TOOL_SET_ID/tools/$ID \ -X DELETE \ -H "Authorization: Bearer $CADENYA_API_KEY" ``` ## Domain Types ### Config HTTP - `ConfigHTTP = 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 - `ConfigMcp = object { toolDescription, toolName, toolTitle }` - `toolDescription: optional string` - `toolName: optional string` - `toolTitle: optional string` ### Tool - `Tool = object { metadata, spec, info }` - `metadata: ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...") - `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: ToolSpec` - `config: ToolSpecConfig` Config defines the adapter to use for the tool. This is used to determine how the tool is called. For example, if the tool is an HTTP tool, the adapter will be Http. If the tool is an inline tool, the adapter will be Inline. - `http: optional ConfigHTTP` - `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 ConfigMcp` - `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 ToolInfo` - `createdBy: optional Profile` 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: AccountResourceMetadata` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `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: ProfileSpec` 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 ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) ### Tool Info - `ToolInfo = object { createdBy, toolSet }` - `createdBy: optional Profile` 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: AccountResourceMetadata` AccountResourceMetadata is used to represent a resource that is associated to an account but not to a workspace. - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "apikey_01HXK...") - `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: ProfileSpec` 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 ResourceMetadata` Standard metadata for persistent, named resources (e.g., agents, tools, prompts) - `id: string` Unique identifier for the resource (prefixed ULID, e.g., "agent_01HXK...") - `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 - `ToolSpec = object { config, description, parameters, 2 more }` - `config: ToolSpecConfig` Config defines the adapter to use for the tool. This is used to determine how the tool is called. For example, if the tool is an HTTP tool, the adapter will be Http. If the tool is an inline tool, the adapter will be Inline. - `http: optional ConfigHTTP` - `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 ConfigMcp` - `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 - `ToolSpecConfig = 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 ConfigHTTP` - `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 ConfigMcp` - `toolDescription: optional string` - `toolName: optional string` - `toolTitle: optional string`