TOOLS: section defines the external capabilities available to an agent. Each tool declares a typed signature (parameters and return type), an optional execution binding (HTTP, MCP, sandbox, or lambda), and metadata that guides the LLM’s tool selection.
Tool declaration syntax
A tool is declared with a function-style signature followed by indented properties:Signature format
- name — a lowercase identifier using
snake_case - parameters — comma-separated list of typed parameters
- return_type — the type of data the tool returns
Parameter syntax
Each parameter follows the formatname: type with an optional default value:
| Component | Description | Examples |
|---|---|---|
name | Parameter identifier (snake_case) | account_id, query, limit |
type | Data type | string, number, boolean, date |
= default | Default value (makes parameter optional) | = 10, = "USD", = true |
Parameter types
| Type | Description | Examples |
|---|---|---|
string | Text value | "hello" |
number | Numeric value (integer or float) | 42, 3.14 |
boolean | True or false | true, false |
date | Date value | "2026-03-01" |
object | Nested object (specify fields with nested parameters:) | — |
type[] | Array of the given type | string[], number[] |
Object parameters
When a parameter has typeobject, you can define nested fields using a parameters: block under the tool:
Array parameters
Array types use the[] suffix:
Return type
The return type appears after the-> arrow. It can be:
| Form | Syntax | Example |
|---|---|---|
| Simple type | -> type | -> string |
| Object type | -> {field: type, ...} | -> {id: string, name: string} |
| Array type | -> type[] | -> Hotel[] |
| Nested object | -> {field: {nested: type}} | -> {user: {name: string, age: number}} |
| Optional fields | -> {field?: type} | -> {error?: string} |
| Array of objects | -> {field: type}[] | -> {id: string, title: string}[] |
Description
Thedescription: property provides a natural-language explanation of what the tool does. The LLM uses this description to decide when and how to call the tool.
- What the tool does
- When to call it
- What data it returns
Hints
Thehints: block provides execution metadata that the runtime uses for optimization:
| Hint | Type | Default | Description |
|---|---|---|---|
cacheable | boolean | none | Whether results can be cached across calls with the same parameters |
latency | "fast" | "medium" | "slow" | none | Expected latency category for runtime scheduling |
side_effects | boolean | none | Whether the tool modifies external state |
requires_auth | boolean | none | Whether the tool requires authenticated context |
timeout | number | none | Tool-specific timeout in milliseconds (overrides EXECUTION.tool_timeout) |
HTTP tools
HTTP tools call REST API endpoints. They are the most common tool type.HTTP binding properties
| Property | Type | Required | Default | Description |
|---|---|---|---|---|
type | "http" | Yes | — | Declares this as an HTTP tool |
endpoint | string | Yes | — | URL or path for the API call. Supports path parameters: "/hotels/{hotel_id}" |
method | "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | Yes | — | HTTP method |
auth | string | No | "none" | Authentication type (see Auth) |
timeout | number | No | EXECUTION.tool_timeout | Request timeout in milliseconds |
retry | number | No | none | Number of retry attempts on failure |
retry_delay | number | No | none | Delay in milliseconds between retries |
headers | Record<string, string> | No | none | Custom HTTP headers |
query_params | Record<string, string> | No | none | Query string parameters |
body_template | string | No | none | Custom body template with interpolation |
rate_limit | number | No | none | Maximum requests per second |
circuit_breaker | {threshold, resetMs} | No | none | Circuit breaker configuration |
Path parameters
Use curly braces in the endpoint to reference tool parameters:Headers
Custom headers are specified as key-value pairs:Auth
Theauth: property specifies the authentication mechanism. The runtime resolves credentials from the project’s credential store — the ABL document never contains actual secrets.
| Auth type | Description |
|---|---|
none | No authentication |
bearer | Bearer token in Authorization header |
api_key | API key (header name configurable via auth_config) |
oauth2_client | OAuth 2.0 client credentials flow |
oauth2_user | OAuth 2.0 authorization code flow (user-scoped tokens) |
saml | SAML assertion-based authentication |
custom | Custom authentication with configurable headers |
Auth configuration
For auth types that require additional configuration, use theauth_config: block:
| Auth config property | Type | Used with | Description |
|---|---|---|---|
token_url | string | oauth2_client, oauth2_user | OAuth token endpoint URL |
client_id | string | oauth2_client, oauth2_user | OAuth client identifier |
client_secret | string | oauth2_client, oauth2_user | OAuth client secret (use {{config.X}} placeholders) |
scopes | string | oauth2_client, oauth2_user | Space-separated OAuth scopes |
header_name | string | api_key | Custom header name for the API key |
provider | string | oauth2_user, saml | Auth provider identifier |
custom_headers | Record<string, string> | custom | Custom authentication headers |
Credential placeholders
Credentials use{{config.NAME}} placeholder syntax (with isSecret: true on the config var). The runtime resolves these from the project’s config vars at execution time. For OAuth integrations, binding an auth profile is the preferred approach. Never embed actual credentials in ABL files.
Result transformation
Tool results are available in the session context after execution. You can map specific result fields to session variables usingon_result: and handle errors with on_error::
SSRF protection
The platform enforces SSRF (Server-Side Request Forgery) protection on all HTTP tool endpoints. Private IP ranges, localhost, and internal network addresses are blocked at the runtime level. Only allowlisted domains and public endpoints are permitted for HTTP tool calls.Circuit breaker
The circuit breaker prevents cascading failures by halting requests to a failing endpoint after a threshold of consecutive errors:| Property | Type | Description |
|---|---|---|
threshold | number | Number of consecutive failures before the circuit opens |
resetMs | number | Milliseconds to wait before trying the endpoint again |
MCP tools
MCP (Model Context Protocol) tools connect to external MCP servers that expose tools dynamically. The runtime handles protocol negotiation, transport, and tool discovery.MCP binding properties
| Property | Type | Required | Default | Description |
|---|---|---|---|---|
type | "mcp" | Yes | — | Declares this as an MCP tool |
server | string | Yes | — | MCP server name (resolved from runtime configuration) |
server_tool | string | No | Tool name | Tool name on the MCP server (if different from the ABL tool name) |
Server configuration
Theserver value is a logical name that maps to an MCP server configuration in the project’s runtime settings. Server configuration (transport type, connection URL, authentication) is managed at the project level, not in the ABL file.
The platform supports these MCP transport types:
| Transport | Description |
|---|---|
stdio | Standard input/output (for local MCP server processes) |
http | HTTP-based transport (Streamable HTTP) |
websocket | WebSocket-based transport |
Dynamic tool discovery
MCP servers can expose multiple tools. When you declare an MCP tool in ABL, you bind a specific tool from the server. If the tool name on the MCP server differs from the tool name in your ABL file, useserver_tool: to specify the server-side name:
Code tools (sandbox)
Code tools execute user-provided JavaScript or Python code in an isolated sandbox environment with resource limits and no network access.Sandbox binding properties
| Property | Type | Required | Default | Description |
|---|---|---|---|---|
type | "sandbox" | Yes | — | Declares this as a sandbox tool |
runtime | "javascript" | "python" | Yes | — | Execution runtime |
code | string | No | none | Inline source code (pipe block syntax for multi-line) |
timeout | number | No | Platform default | Maximum execution time in milliseconds |
memory_mb | number | No | Platform default | Memory limit in megabytes |
Isolation
Sandbox tools execute in a gVisor-isolated environment with the following restrictions:- No network access
- No filesystem access beyond the sandbox working directory
- Resource limits enforced (CPU, memory, execution time)
- Each execution runs in a fresh environment
JavaScript runtime
JavaScript code tools have access to standard JavaScript built-ins. The code should return a value matching the declared return type.Python runtime
Python code tools use a sandboxed Python interpreter. The code should return a dictionary matching the declared return type.Lambda tools
Lambda tools invoke cloud serverless functions. The function name is a logical identifier resolved to an actual endpoint (ARN, URL) at runtime through the project’s function registry.Lambda binding properties
| Property | Type | Required | Default | Description |
|---|---|---|---|---|
type | "lambda" | Yes | — | Declares this as a lambda tool |
function | string | Yes | — | Logical function name (resolved at runtime) |
runtime | string | No | none | Runtime hint (e.g., "nodejs20", "python3.12") |
timeout | number | No | Platform default | Override timeout for this function in milliseconds |
Async webhook tools
Async webhook tools send an HTTP request with a callback URL injected into the payload. The external system processes the request asynchronously and posts the result back to the callback URL when complete.Async webhook binding properties
| Property | Type | Required | Default | Description |
|---|---|---|---|---|
type | "async_webhook" | Yes | — | Declares this as an async webhook tool |
endpoint | string | Yes | — | URL to send the initial request |
method | "POST" | "PUT" | "PATCH" | Yes | — | HTTP method |
headers | Record<string, string> | No | none | Custom HTTP headers |
callback_url_field | string | No | "callbackUrl" | Dot-path in the request body where the callback URL is injected |
timeout_seconds | number | No | 3600 | Timeout in seconds for the async callback response |
Tool file imports
Tool definitions can be organized into reusable.tools.abl files and imported into agent documents. This allows sharing tool definitions across multiple agents.
Tool file format
A.tools.abl file starts with a TOOLS: section that can include shared defaults:
Shared defaults
The following defaults can be set at the top of a.tools.abl file and apply to all tools in the file:
| Default | Type | Description |
|---|---|---|
base_url | string | Base URL prepended to all relative endpoint paths |
auth | string | Default auth type for all tools |
timeout | number | Default timeout in milliseconds |
retry | number | Default retry count |
retry_delay | number | Default retry delay in milliseconds |
rate_limit | number | Default rate limit (requests per second) |
headers | Record<string, string> | Default headers applied to all tools |
Import syntax
Import tools from a.tools.abl file into an agent using the file: directive within the TOOLS: section:
- The path to the
.tools.ablfile (relative to the agent file) - An optional list of specific tool names to import (in brackets). If omitted, all tools from the file are imported.
TOOLS: signatures during apply. That keeps imported agents compileable even when the bundle didn’t include companion .tools.abl files, and the next export writes those synthesized stubs back out as tools/<name>.tools.abl.
Example
Given the filetools/hotels-api.tools.abl:
Tool features
Confirmation
Theconfirmation: block configures whether the agent should ask the user for confirmation before executing a tool. This is particularly important for tools with side effects (e.g., executing a payment, deleting a record).
| Property | Type | Default | Description |
|---|---|---|---|
require | "always" | "never" | "when_side_effects" | none | When to require user confirmation |
immutable_params | string[] | none | Parameters that cannot be changed after confirmation |
Caching hints
Use thecacheable hint to indicate that a tool’s results can be cached:
cacheable: true, the runtime may cache results for identical parameter combinations. When cacheable: false, results are never cached (use this for tools that return time-sensitive data).
PII access
Thepii_access: property declares what level of personally identifiable information (PII) a tool can access:
| Value | Description |
|---|---|
tools | Tool can access PII data from other tool results |
user | Tool can access user-provided PII |
logs | PII from this tool may appear in logs |
llm | PII from this tool is sent to the LLM |
Context access
Thecontext_access: block declares which session context variables a tool reads from and writes to. This enables the runtime to automatically inject context into HTTP requests and apply result values back to session state:
Store result
Thestore_result: property controls whether the raw tool result blob is stored in the session context. Defaults to true.
Related
- Language overview — file structure and syntax
- Agent declaration —
tool_timeoutand model settings in EXECUTION - GATHER — information collection (often used alongside tools)
- FLOW —
CALLaction for invoking tools within flow steps