Skip to main content
This page is a recipe book for registering tools by pasting a JSON config. Every example has two parts:
  1. The prompt — what to ask the qlaud assistant if you want it to generate one of these for your own setup.
  2. The JSON config — paste this directly into Dashboard → Tools → “Custom” tab (paste mode is the default) and click Save.
You can also hit 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

After saving, the tool is immediately available to your model. With 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. The to 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. The to 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 via chat.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.
Replace: 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. Optional requester_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. The query 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: POSTs user_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 from thread.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:
  1. 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_session pattern.
  2. Mention if it’s an internal API. “Hit our internal customer API” routes to http-call automatically; “send Slack” routes to the named scaffold.
  3. 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.
  4. 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.
  5. 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:
  • name is required, must be unique per account, can’t start with qlaud-builtin/.
  • provider must match a slug from GET /v1/builtins.
  • input_schema, when present, must be a valid JSON Schema object.
  • For http-call: url must start with http:// or https://; headers, secrets, lock_input_fields must 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