The two halves
Credentials are split deliberately:
Keeping them apart means you can inspect a tool’s auth setup without exposing
the secret, and rotate the secret without touching the shape.
Creating it
The three parameter maps
This is the part worth internalising — each map exists for a different trust level.dynamic
The model fills these in. Extracted from the conversation. Treat as
untrusted input.
static
Never seen by the model. Sent on every call. For values it has no
business knowing or inventing.
automatic
Filled by the platform.
KNOWN_PARAM_CALL_ID tells your backend which
live call it is being asked about.clinicId is static for a reason: if it were dynamic, a caller could talk the
agent into booking at a different clinic. Anything that identifies who is
asking rather than what they want belongs in staticParameters.
Credential shapes
Declare exactly one per requirement:options is a list of acceptable alternatives — satisfying any one entry is
enough. That’s how you say “either an API key or a bearer token”:
The typo guard
Every key inauthTokens must be declared in
httpSecurityOptions.options[].requirements. Otherwise:
bookingKey requirement, and surface weeks later as an unexplained 401 from
your own endpoint with nothing useful in the logs.
The reverse is not enforced — declaring two alternatives and filling one is
intentional.
Checking and rotating
Credential values are never returned. AGET shows which slots are filled:
"authTokens": null. The same null-clears rule applies
to agentReaction, httpSecurityOptions, and timeout.
Your endpoint receives
Slow endpoints
Work that cannot finish in 40 seconds.
Full tool reference
Every option.