This page is a recipe book for registering tools by pasting a JSON config. Every example has two parts:Documentation Index
Fetch the complete documentation index at: https://docs.qlaud.ai/llms.txt
Use this file to discover all available pages before exploring further.
- The prompt — what to ask the qlaud assistant if you want it to generate one of these for your own setup.
- The JSON config — paste this directly into Dashboard → Tools → “Custom” tab (paste mode is the default) and click Save.
POST /v1/tools with the JSON if you’d rather script it.
The qlaud assistant pulls this page into its retrieval context. When
you ask it “give me a config that…” it pattern-matches against these
examples, swaps in your specifics, and returns a complete config.
That’s the recommended authoring flow — these are the patterns it
knows best.
How to read each example
tools_mode: "tenant" it auto-attaches to every thread message.
Communication
Send an email — recipient locked to logged-in user
The most common safe pattern. Use this whenever the AI emails the user they’re chatting with — prevents prompt-injection redirect. Prompt: “Make me a tool that emails the logged-in user a follow-up.” What it does: Sends transactional email via Resend. Theto field
is forced to end_user.metadata.email regardless of what the model
generates.
Replace: re_REPLACE_ME, support@yourdomain.com. Set
thread.metadata.email when creating the thread.
Send an email — to ANY recipient the model picks
Use only when the AI legitimately needs to email a third party (vendor contact, supplier, outreach prospect). Don’t use this for “email my user” — use the locked variant above. Prompt: “Make me a tool that sends transactional email via Resend to any address.” What it does: Sends email; recipient picked by the model. Replace:re_REPLACE_ME, support@yourdomain.com.
Send SMS — number locked to logged-in user
Prompt: “Make me a tool that texts the logged-in user via Twilio.” What it does: Sends SMS via Twilio. Theto field is forced to
end_user.metadata.phone (E.164 format).
Replace: AC_REPLACE_ME (Account SID), REPLACE_ME (Auth Token),
+14155557890 (your verified Twilio number). Set
thread.metadata.phone when creating the thread.
Post to a Slack channel
Prompt: “Make me a tool that posts a notification to our team’s Slack channel.” What it does: Posts a plain-text message to a default Slack channel viachat.postMessage. Model can override the channel per call.
Replace: xoxb-REPLACE_ME, #support-alerts.
Ticketing
File a Linear issue
Prompt: “Make me a tool that files Linear issues for our engineering team.” What it does: Creates a Linear issue via GraphQL. Title + description- optional priority come from the model.
lin_api_REPLACE_ME, TEAM-ABC-UUID (find in Linear team URL).
File a Zendesk ticket
Prompt: “Make me a tool that opens a Zendesk Support ticket.” What it does: Creates a Zendesk ticket. Optionalrequester_email
links the ticket to a customer; otherwise it’s filed under the API user.
Replace: yourcompany (Zendesk subdomain), agent@yourcompany.com,
REPLACE_ME (Zendesk API token).
File a GitHub issue
Prompt: “Make me a tool that opens GitHub issues in our public repo.” What it does: Creates an issue in a specific GitHub repo with optional labels + assignees from the model. Replace:ghp_REPLACE_ME, youorg, yourepo.
Comment on an existing GitHub issue
Prompt: “Make me a tool that comments on existing GitHub issues or PRs.” What it does: Posts a markdown comment on any issue or PR by number. Replace:ghp_REPLACE_ME, youorg, yourepo.
Knowledge + retrieval
Search the public web
Prompt: “Make me a tool the agent can use to search the web.” What it does: Web search via Brave. Returns titled results with snippets and URLs the model can cite. Replace:BSA_REPLACE_ME.
Search code in our GitHub repo
Prompt: “Make me a tool the agent can use to find code references in our repo.” What it does: Searches code in a pinned repo (or org). Returns up to 10 file matches with snippets. Scope is fixed at registration so the model can’t widen it to private repos. Replace:ghp_REPLACE_ME, youorg, yourepo (omit repo to
search the whole org).
Read a file from our GitHub repo
Prompt: “Make me a tool the agent can use to read files in our codebase.” What it does: Fetches the contents of a single file at any ref (branch/tag/sha). 100KB cap. Replace:ghp_REPLACE_ME, youorg, yourepo.
Append a page to a Notion database
Prompt: “Make me a tool that logs conversations to a Notion database.” What it does: Adds a new page to a Notion database with title + optional plain-text body. Replace:secret_REPLACE_ME, DATABASE_UUID.
Custom (http-call) — for endpoints not in the catalog
Look up a customer in your internal API
The cleanest “agent reads from my backend” pattern. URL uses{{end_user.id}} directly from the trusted session — no lock needed
because the model can’t influence which user is fetched.
Prompt: “Make me a tool the agent can use to look up the logged-in customer in our internal API.”
What it does: GET to your internal endpoint, customer scoped to the
session’s end_user_id, returns whatever JSON your API returns.
Replace: https://api.your-app.com/internal/users/{{end_user.id}},
sk_internal_REPLACE_ME.
High-stakes action with input locked + capped
When the action moves money or changes account state. Lock the customer id to the session, schema-cap the amount. Prompt: “Make me a tool that issues partial refunds, but lock it to the logged-in user and cap the amount.” What it does: POSTs a refund to your internal API.customer_id is
overridden by end_user.id regardless of what the model emits.
amount_cents is JSON-Schema-capped at 50000 ($500).
Replace: https://api.your-app.com/internal/refunds,
sk_REPLACE_ME.
Wrap a GraphQL endpoint
Prompt: “Make me a tool that runs a GraphQL search query against our internal docs API.” What it does: Single GraphQL POST. Thequery arg from the model
gets injected into the variables.
Replace: https://api.your-app.com/graphql, sk_REPLACE_ME.
Trigger a workflow on your backend (form-encoded body)
Prompt: “Make me a tool that kicks off a long-running workflow on our backend. Body needs to be form-encoded.” What it does: POSTsuser_id={{end_user.id}}&workflow=... to a
workflow trigger endpoint.
Replace: https://api.your-app.com/workflows/trigger,
sk_REPLACE_ME.
Send a Slack DM with metadata-templated channel
A slightly more advanced pattern — the channel comes fromthread.metadata.csm_channel, not the model. Useful for
multi-tenant apps where each customer has a dedicated CSM channel.
Prompt: “Make me a tool that posts to the customer’s dedicated CSM Slack channel from our metadata.”
What it does: Posts to whatever channel the thread metadata
specifies — set per-customer at thread creation.
Replace: xoxb-REPLACE_ME. When creating the thread, set
metadata.csm_channel and metadata.email.
Tips for using the qlaud assistant to generate these
When asking the chatbot to generate a config:-
Describe the action AND the safety constraint together. “Email
the user” is good but “Email the logged-in user, lock the
recipient” is better — it triggers the assistant to pick the
lock_to_sessionpattern. - Mention if it’s an internal API. “Hit our internal customer API” routes to http-call automatically; “send Slack” routes to the named scaffold.
- Specify the auth shape if it’s unusual. “Bearer token,” “Basic auth,” “GraphQL with custom headers” — the assistant uses these as cues to pick the right preset or http-call config.
- Ask for input schema constraints. “Cap the amount at $500” or “only allow priorities 1-4” — the assistant adds JSON Schema minimum/maximum/enum where it makes sense.
-
Replace secrets last. The assistant always inserts placeholder
strings (
re_REPLACE_ME,sk_REPLACE_ME, etc.) — search-and-replace them with your real values before pasting into the dashboard.
Validation rules to keep in mind
If you hand-author or edit a config, the gateway will reject anything that violates these:nameis required, must be unique per account, can’t start withqlaud-builtin/.providermust match a slug fromGET /v1/builtins.input_schema, when present, must be a valid JSON Schema object.- For http-call:
urlmust start withhttp://orhttps://;headers,secrets,lock_input_fieldsmust be valid JSON strings (objects for the first two, array of strings for the third). - All secret-format config fields (API keys, tokens) are AES-GCM encrypted at rest and never returned by any read endpoint.
See also
/api-reference/builtins— full catalog of named scaffolds + lock_to_session details/api-reference/http-call— deep reference for the universal scaffold/api-reference/tools-modes— pickdynamic/tenant/explicitfor your request shape/api-reference/tools— webhook tool registration (advanced — for when none of the above fit)