---
title: "Tool Sets — Cadenya"
url: "https://cadenya.com/features/tool-sets"
description: "Connect the systems your business runs on. Choose what agents can do, what needs approval, and what stays in your hands."
---

![A lone tree on a small island, mirrored in a still lake](/_astro/hero-landscape.Bm0WshlY_gAmYt.webp?dpl=dpl_HJa8gqwfz8xwjnF1PtXneJm7pNwR)

# Tool Sets

## Rooted in  
your stack.

Connect the systems your business runs on. Choose what agents can do, what needs approval, and what stays in your hands.

[Get started](https://app.cadenya.com/signup)

### Connect to  
any MCP

Connect an MCP server and discover its tools. Start from a ready-made integration, or bring your own server and decide which tools are available.

![](/_astro/panel-c1.DGNm8bhe_26lKt9.webp?dpl=dpl_HJa8gqwfz8xwjnF1PtXneJm7pNwR)

![](/_astro/mcp-graph.ZK_bB---.svg)

Tool  
set

Search

Read

Update

Create

### Compatible with  
OpenAPI

Turn an OpenAPI specification into tools. Point to a URL or upload JSON or YAML, then filter the operations your agent can use.

![](/_astro/panel-c2.CTbm_hOe_sxVqS.webp?dpl=dpl_HJa8gqwfz8xwjnF1PtXneJm7pNwR)

OpenAPI connection

Specification

orders.openapi.yaml

GET /orders

listOrders

GET /orders/{id}

getOrder

POST /orders

Filtered out

### Make any endpoint  
an agent action

Define HTTP tools with a shared base URL, headers, and templated paths or request bodies. Give the model a simple schema; shape the request yourself.

![](/_astro/panel-c3.CujaA6jb_Z2vbepF.webp?dpl=dpl_HJa8gqwfz8xwjnF1PtXneJm7pNwR)

HTTP tool / createTicket

Request

POST /tickets

Model fills in

{ subject, description }

Request body

{ "subject": "{{ arguments.subject }}" }

Authorization

Bearer {{ secrets.API\_TOKEN }}

### Auto-mode for  
tool calls

Define Bare tools your application answers. Read the current page, display a card, or ask a visitor a question. The objective waits for your result.

![](/_astro/panel-c4.CnzGStxG_1k5LEc.webp?dpl=dpl_HJa8gqwfz8xwjnF1PtXneJm7pNwR)

Auto mode / Approve calls

Applies to

createTicket

Question

Did the customer ask for a ticket?

Threshold

Score above 0.80

When denied

Skip the call, tell the agent why

![](/_astro/panel-c1.DGNm8bhe_26lKt9.webp?dpl=dpl_HJa8gqwfz8xwjnF1PtXneJm7pNwR)

![](/_astro/mcp-graph.ZK_bB---.svg)

Tool  
set

Search

Read

Update

Create

![](/_astro/panel-c2.CTbm_hOe_sxVqS.webp?dpl=dpl_HJa8gqwfz8xwjnF1PtXneJm7pNwR)

OpenAPI connection

Specification

orders.openapi.yaml

GET /orders

listOrders

GET /orders/{id}

getOrder

POST /orders

Filtered out

![](/_astro/panel-c3.CujaA6jb_Z2vbepF.webp?dpl=dpl_HJa8gqwfz8xwjnF1PtXneJm7pNwR)

HTTP tool / createTicket

Request

POST /tickets

Model fills in

{ subject, description }

Request body

{ "subject": "{{ arguments.subject }}" }

Authorization

Bearer {{ secrets.API\_TOKEN }}

![](/_astro/panel-c4.CnzGStxG_1k5LEc.webp?dpl=dpl_HJa8gqwfz8xwjnF1PtXneJm7pNwR)

Auto mode / Approve calls

Applies to

createTicket

Question

Did the customer ask for a ticket?

Threshold

Score above 0.80

When denied

Skip the call, tell the agent why

## Human  
in the loop.

Tool approvals work out of the box.  
Get a webhook when one is waiting.

![A great tree on a floating island, its roots spilling over the edge](/_astro/templates-tree.3ueNxH1c_Z1K4TU6.webp?dpl=dpl_HJa8gqwfz8xwjnF1PtXneJm7pNwR)

```
import Cadenya from '@cadenya/cadenya';

const cadenya = new Cadenya();

// On objective_event.tool_approval_requested
await cadenya.objectives.approveToolCall(
  objectiveId,
  toolCallId,
);
```

## Make any

API

an agent

![](/_astro/roots-code.CDVUeseu_Z1i3Cfr.webp?dpl=dpl_HJa8gqwfz8xwjnF1PtXneJm7pNwR)

## Connect an MCP server

```
await cadenya.toolSets.create({
  metadata: { name: "Support" },
  spec: { adapter: { type: "mcp",
    mcp: { url: "https://api.example.com/mcp" }
  } }
});
```

## Import only what you need

```
await cadenya.toolSets.create({
  metadata: { name: "Orders" },
  spec: { adapter: { type: "openapi", openapi: {
    type: "url",
    url: "https://api.example.com/orders.openapi.yaml",
    includeTools: {
      operator: "OPERATOR_OR",
      filters: ["listOrders", "getOrder"].map((exact) => ({
        attribute: "ATTRIBUTE_TITLE",
        matcher: { type: "exact", exact },
      })),
    },
  } } },
});
```

### Keep the important  
arguments yours.

Use overlays to remove parameters, set fixed values, or pin them to trusted objective context. Hide customer IDs from the model while every call gets the right value.

![](/_astro/panel-k1.OIJLP98i_Z1mtGXR.webp?dpl=dpl_HJa8gqwfz8xwjnF1PtXneJm7pNwR)

Overlay / Customer context

Applies to

listOrders, getOrder

Parameter path

customerId

Action

Pin → customerId

When not pinned

Fail the call

### Give consequential  
calls a checkpoint.

Require approval for every tool, or only matching tools. Add Auto mode questions and confidence thresholds to an overlay for more specific approval decisions.

![](/_astro/panel-k2.BoEhBysb_2suNQ4.webp?dpl=dpl_HJa8gqwfz8xwjnF1PtXneJm7pNwR)

Approval policy

Read tools

No approval required

Matching tools

createTicket

Approval

Required

Auto mode question

Is this change requested by the user?

### Return the signal.  
Leave the noise.

Transform a tool’s text result with a Liquid template before the model sees it. Keep the fields that matter and retain the raw response in the debug log.

![](/_astro/panel-k3.B3N13Aqy_Z1sCBRH.webp?dpl=dpl_HJa8gqwfz8xwjnF1PtXneJm7pNwR)

Result transform

Raw response

Orders + metadata + pagination

Liquid template

{{ result.json.orders | json }}

Model receives

\[{ "id": "1234", "status": "shipped" }\]

On transform error

Keep raw result or fail

### Load the tools  
for this customer.

Discover MCP tools when each objective starts, using its resolved secrets. Keep credentials scoped to the tool set and choose whether discovery failures stop the objective.

![](/_astro/panel-k4.DILQoSZq_1InAJh.webp?dpl=dpl_HJa8gqwfz8xwjnF1PtXneJm7pNwR)

Just-in-time discovery

Load tools

At objective start

Headers

Bearer {{ secrets.API\_TOKEN }}

Secrets

Tool set overrides workspace

On discovery failure

Fail objective · optional

![](/_astro/panel-k1.OIJLP98i_Z1mtGXR.webp?dpl=dpl_HJa8gqwfz8xwjnF1PtXneJm7pNwR)

Overlay / Customer context

Applies to

listOrders, getOrder

Parameter path

customerId

Action

Pin → customerId

When not pinned

Fail the call

![](/_astro/panel-k2.BoEhBysb_2suNQ4.webp?dpl=dpl_HJa8gqwfz8xwjnF1PtXneJm7pNwR)

Approval policy

Read tools

No approval required

Matching tools

createTicket

Approval

Required

Auto mode question

Is this change requested by the user?

![](/_astro/panel-k3.B3N13Aqy_Z1sCBRH.webp?dpl=dpl_HJa8gqwfz8xwjnF1PtXneJm7pNwR)

Result transform

Raw response

Orders + metadata + pagination

Liquid template

{{ result.json.orders | json }}

Model receives

\[{ "id": "1234", "status": "shipped" }\]

On transform error

Keep raw result or fail

![](/_astro/panel-k4.DILQoSZq_1InAJh.webp?dpl=dpl_HJa8gqwfz8xwjnF1PtXneJm7pNwR)

Just-in-time discovery

Load tools

At objective start

Headers

Bearer {{ secrets.API\_TOKEN }}

Secrets

Tool set overrides workspace

On discovery failure

Fail objective · optional

## Know what  
your tools are doing.

01 / Analytics

### See what gets used.

Track tool calls over time and see which tools do the most work. Follow usage for a whole set or inspect a single tool.

02 / Sync events

### Keep up with change.

See when discovery starts, completes, or fails. MCP and URL-based OpenAPI sources can sync ahead of the next objective.

03 / Debugger

### Get to the source.

Inspect recent tool-call diagnostics. Result transforms keep the raw response in the debug log, so the original is still there.

## A few things  
to know.

Can I connect an API without an MCP server?

Yes. Import an OpenAPI specification from a URL or file, or define HTTP tools with templated requests.

Where do Bare tools run?

Your application supplies their results. Objectives wait for that content, unless a tool has an immediate fixed result.

Can I assign just one tool?

Yes. Assign individual tools or an entire tool set to an agent variation. The Used By views show where each is assigned.

![A tree on a floating cliff, roots hanging from the rock](/_astro/floating-cliff.BtlCTpSf_1B7gvg.webp?dpl=dpl_HJa8gqwfz8xwjnF1PtXneJm7pNwR)

## Put your tools  
to work.

Connect your stack. Set the boundaries. Let agents get on with it.

[Get started](https://app.cadenya.com/signup) [See API docs](/docs)