Build synthetic tools
A synthetic tool combines several steps, sometimes across different products, into a single tool that an AI client can call. For example, one tool can look a customer up in your CRM and then open a support ticket for them. One tool like this is usually better than three separate calls that the AI client has to chain by itself.
Where to find it: Toolboxes → Synthetic tools
Before you start
| Requirement | Detail |
|---|---|
| Plan | Every plan includes synthetic tools. The free Personal plan holds up to 10 in the organization; Gold and Black have no limit. Without the feature, the page explains that synthetic tools are not in your plan. |
| Permission | toolbox:create (or equivalent access to build tools). |
| Connection | At least one working connection to test against. |
Design a synthetic tool
- Open Toolboxes → Synthetic tools and choose New synthetic tool.
- Enter a name. Describe when an AI client should use the tool. This text becomes the tool's description.
- Define the Input schema (JSON Schema). This is what the AI client must provide.
- Choose Add step for each call, and fill in these fields:
| Field | What it does |
|---|---|
| Step key | A stable id that other steps and templates use to refer to this step. |
| Connection | The account that runs this step. |
| Tool | The tool on that connection to call. |
| Depends on | Earlier steps that must finish first. |
| Repeat for each (optional) | Runs this step once for each item in a list. |
| Advanced (optional) | Parallel items, what to do when a call fails, and how many pages to read. See Advanced step settings. |
| Arguments template (JSONata) | Builds the step's arguments from { input, steps, run }. |
| Output template (optional, JSONata) | Shapes what later steps see. |
- Choose Create for a new tool, or Save for an existing one.
Steps with no dependency between them run in parallel. A dependent step waits for the steps it depends on. Elaichi rejects cycles and unknown references when you save. Later templates read an earlier step's result as steps.<key>.
You will know it worked when the tool appears in the Synthetic tools list.
Repeat a step for each item
Without Repeat for each, a step calls its tool once. When you turn it on and give it a JSONata expression that produces a list, the step calls its tool once for each item. The AI client still sees one tool.
Example: update every open card and leave a comment on each, in three steps instead of 3 × N separate calls.
find_cards: no Repeat for each. It finds the open cards.update_card: Repeat for each issteps.find_cards.result. Its arguments template can readitem(the current card) andindex(the position, starting at 0). For example:{ "card_id": item.id, "status": "in_progress" }.comment_card: Repeat for each issteps.find_cards.result, with arguments{ "card_id": item.id, "text": "Picked up" }.
The result of a repeating step is a list, in item order. steps.update_card.result holds every updated card's result, not one. If one item fails, the step fails and names the item, such as "item 3: …".
A repeating step stops at 100 items. If your list can be longer, split the input or narrow the list first.
Advanced step settings
Each step has an Advanced section. It is collapsed unless you already set something in it.
| Setting | What it does |
|---|---|
| Parallel items | Shown only when Repeat for each is on. Sets how many items run at once, from 1 to 4 (default 4). Lower it if the connection's tool is rate-limited. Fewer items at once is slower but stays under the vendor's limit. |
| If a call fails | Stop the run (default) or Keep going. Keep going leaves an empty slot for the failed item (or the failed step, for a step that does not repeat) and lists the errors. One bad record no longer stops everything. |
| Pages to read | For a list tool, how many pages to follow with the tool's own next_cursor, from 1 to 10 (default 1). Only list tools allow this. Elaichi rejects any other tool when you save. |
When a step reads several pages, Elaichi reports the result of the cut-short pages:
- A step that repeats over a list reports which items still had more pages (
truncated). - A single step that stops with pages left reports "1 cut short" and keeps the tool's
next_cursor.
If you use Keep going or read several pages, include the step's errors, truncated and next_cursor in the Output template. An AI client that runs the tool over MCP sees only the output, so anything the template leaves out stays hidden. With no output template, the client gets the raw steps, and they carry all three.
Fetch only what changed
Every synthetic tool tracks run.last_success_at. It is the time of your last successful real run, and it is available to every step's arguments template. A template can use it to ask for only the new or changed records:
run.last_success_at ? { "updated_since": run.last_success_at } : {}run.last_success_at is empty on the first run. The template then leaves the filter out and reads everything.
A test run never moves this timestamp. Only a real run does, which is a run through a toolbox, or through the MCP tool with test left off. So you can test freely without losing your place.
A real run also leaves the timestamp unchanged when it did not finish the job, for example when a step failed items under Keep going or stopped with pages unread. The next run then reads a little more, never less.
Test a synthetic tool
After you save, use the Test run panel.
- Enter sample inputs that match your schema.
- Choose Run. The test uses your live connections.
- Check for Test succeeded. If you see Test stopped, fix the step it names.
You can test a synthetic tool without adding it to a toolbox first. Results depend on real account data, so use a safe connection while you experiment.
A step with Repeat for each shows how many times it ran (for example, "Ran 12 times") next to its duration. It also shows how many items failed when If a call fails is Keep going. If any calls were retried, the result badge shows how many.
The test uses your output template exactly as written in the editor, even if you have not saved. Change the template, choose Run again, and you see the new shape before you commit to it.
Add a synthetic tool to a toolbox
- Open a template or a toolbox, then choose Add tools.
- Open the Synthetic tools tab and pick your tool.
- Adjust the name and description if you want.
Elaichi rejects default values and input schema overrides on a synthetic tool, because the tool defines its own schema. Locked-in values do nothing on a synthetic entry, because each step supplies its own arguments.
The tool advertises its own input schema over MCP. Elaichi runs its steps through the same restriction and audit checks as any other tool.
What to know
- Each step runs with the access of the connection behind it.
- If a dependent step fails, the run stops there. Independent parallel steps still follow the dependency order.
- A caller cannot use a tool that a restriction blocks to them as a step.
- An AI client sees one tool. It does not manage the steps in between.