Skip to main content
Uses: Python · TypeScript · CLI · REST API
Handing an LLM every tool in your account is how agents send email from the wrong mailbox. A toolset is the guardrail: a named bundle that pins which connection each application uses and which tools are permitted. Once it exists, pass its id on discovery and execution - the server enforces the boundary, so a model that hallucinates a tool name simply gets rejected.
cURL samples assume BASE=https://api.engini.io/v1 and AUTH="x-api-key: $ENGINI_API_KEY" - the setup from the REST walkthrough.

Create one

The CLI manages toolsets too - engini toolsets list | get | create | update | delete, see the command reference. engini tools list --toolset <id> shows exactly what a toolset permits, which is the fastest way to confirm a scope is what you intended - and engini toolsets update <id> --dry-run previews a change before anything is written.
Two entry styles, and the difference matters:
  • toolSlugs listed - only those tools are callable. Use this for anything destructive.
  • applicationSlug with no toolSlugs - every tool of that application is permitted. Convenient, broader.
You can also omit connectionId and let the server resolve your default connection for the application at save time - it stores the concrete id, so the binding doesn’t drift later.

Use it

Pass toolsetId on both discovery and execution:
Discovery returns only the permitted tools, so the model never learns that anything else exists - the cheapest guardrail there is. Execution then enforces it server-side:

In an agent loop

The SDK wraps all of this - see Toolsets and the monday assistant. (This part is SDK-only by nature: the agent loop lives in your code.)

Managing them

PATCH replaces connections and workflows wholesale when you supply them - it does not merge. Send the full intended set, or omit the field to leave it untouched.

A pattern worth stealing

Give each agent its own toolset rather than sharing one, and make read-only agents literally incapable of writing:
Now “please delete the duplicates” fails at the API boundary instead of depending on the model declining. That’s a control you can point at during a security review.