> ## Documentation Index
> Fetch the complete documentation index at: https://cadenya.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Choose a tool set adapter

> Compare OpenAPI, MCP, HTTP, and Bare tool sets, then pick a configuration that matches your provider and runtime.

A tool set gives an agent something to do. Choose one adapter based on where the tool definitions come from and who executes each call.

<Frame caption="The tool set connection step with all four adapter types">
  <img src="https://mintcdn.com/cadenya/KlD5G2JQBS2N3ZfD/images/docs/tool-sets/adapter-picker.webp?fit=max&auto=format&n=KlD5G2JQBS2N3ZfD&q=85&s=6d126427fb2f9c740f523d49fa96d44d" alt="Create tool set connection step with OpenAPI, MCP, HTTP, and Bare adapter tabs" width="1800" height="1320" data-path="images/docs/tool-sets/adapter-picker.webp" />
</Frame>

<CardGroup cols={2}>
  <Card title="Connect an OpenAPI spec" icon="file-code" href="/docs/guides/tool-sets/openapi">
    Turn each operation in a hosted or uploaded specification into a tool.
  </Card>

  <Card title="Connect an MCP server" icon="plug" href="/docs/guides/tool-sets/mcp">
    Load tools from a Model Context Protocol server ahead of time or when an objective starts.
  </Card>

  <Card title="Wrap an HTTP API" icon="globe" href="/docs/guides/tool-sets/http">
    Define each endpoint, parameter schema, and request template by hand.
  </Card>

  <Card title="Run tools in your code" icon="code" href="/docs/guides/tool-sets/bare">
    Let Cadenya pause each call while your application supplies the result.
  </Card>

  <Card title="Filter tools and require approval" icon="user-check" href="/docs/guides/tool-sets/filter-and-approve">
    Limit a managed source and pause sensitive calls for review.
  </Card>
</CardGroup>

## Compare the adapters

| Adapter | Tool definitions come from    | Calls run through                                        | Updates                                                                                              |
| :------ | :---------------------------- | :------------------------------------------------------- | :--------------------------------------------------------------------------------------------------- |
| OpenAPI | Operations in a specification | The server from the spec or an adapter override          | URL sources sync each hour; uploads change when you replace the adapter source                       |
| MCP     | The server's tool list        | The MCP server                                           | Synced sets refresh hourly and after adapter updates; on-demand sets load when each objective starts |
| HTTP    | Tools you create in Cadenya   | A shared base URL plus each tool's request configuration | You edit the tools                                                                                   |
| Bare    | Tools you create in Cadenya   | Your application or a person                             | You edit the tools                                                                                   |

OpenAPI and MCP suit providers that already describe their tools. HTTP and Bare start empty, so you define each tool's name, description, parameter schema, and approval requirement.

## Configuration patterns

Each adapter supports more than one useful shape. Start with the pattern that matches your provider.

### OpenAPI

* **Hosted specification.** Use a URL when the provider publishes a specification that changes. Cadenya fetches it each hour and sends any configured headers while fetching and calling tools.
* **Uploaded specification.** Upload a JSON or YAML file when the document cannot be hosted or should stay fixed.
* **Server routing.** Use the specification's first server, select a named server, or set a base URL override. A base URL override wins when both override fields are set.

### MCP

* **Ahead-of-time sync.** Turn off `Just-in-time tool loading` to sync and pin the server's tool list to the tool set. Cadenya refreshes it hourly and after adapter updates. The **Tools** and **Sync Events** tabs show what arrived.
* **On-demand loading.** Keep `Just-in-time tool loading` on to list tools when an objective starts. This uses that objective's resolved secrets and leaves the tool set's synced tool count at zero.
* **Curated access.** Add include or exclude filters, then require approval for every tool or only matching tools.

### HTTP

* **Path request.** Put an argument in the path for calls such as `GET /orders/{{ arguments.order_id }}`.
* **Query request.** Render a query string and per-tool headers for search, pagination, or provider-specific routing.
* **Body request.** Use `POST`, `PUT`, or `PATCH` with a content type and Liquid request body template. Mark sensitive writes as requiring approval.

### Bare

* **Human response.** Define a tool for a question or decision, then let your application collect a person's answer and submit it as the result.
* **Private worker.** Poll for calls in `TOOL_CALL_EXECUTION_STATUS_WAITING_FOR_CONTENT`, run the work inside your network, and send the result back.
* **Bounded wait.** Set `contentTimeout` when a call should stop waiting before the 24-hour service default. A timeout produces a system result and lets the objective continue.

## Keep credentials in secrets

OpenAPI, MCP, and HTTP adapters accept headers. Store credentials as [secrets](/docs/guides/store-and-use-secrets) and reference them with `${SECRET_NAME}` instead of placing raw values in a tool set.

```
Authorization: Bearer ${PROVIDER_API_KEY}
```

Objective secrets override tool set secrets, which override workspace secrets. This lets one objective supply a per-user credential without changing the shared tool set.

## Next

Pick one of the four guides, create the tool set, then assign it to an [agent variation](/docs/guides/agents).
