name: docyrus-app-ai-tools
description: Add and manage app-scoped AI tools for the Docyrus system base agent ("Docy") using the docyrus apps ai-tools CLI commands, and set app-level agent guidance with docyrus apps set-agent-context. App-scoped tools are owned by the app and, once the app is installed in a tenant, are automatically available to Docy (the built-in system base assistant) — this is how you give Docy new tools; there is no per-agent wiring and they are not for custom agents. Use when building custom tools the base agent can call — covering all four executable tool types — data_source_query (read one data source with author-fixed shaping and parameter-bound filters), custom_query (hand-written read-only SELECT SQL with Handlebars templating), secure_exec (sandboxed JavaScript that calls the Docyrus REST API), and client_side (tool executed in the user's browser/app). Triggers on tasks like "add a tool to Docy / the base agent", "create an AI tool for an app", "add a data source query tool", "build a custom query tool", "write a secure_exec tool", "make a client-side tool", "let the base assistant query/look up X", docyrus apps ai-tools create/update/list/get/delete, docyrus apps set-agent-context, or writing the agent context that tells the system base assistant (Docy) when to use which app-scoped tool.
Docyrus App-Scoped AI Tools
Build custom tools that the Docyrus system base assistant ("Docy") can call during a conversation. Tools are created per app (tenant_ai_tool, ownership=CUSTOM, tenant_app_id=<app>) with the docyrus apps ai-tools CLI. Once the app is installed in the tenant, its tools are automatically available to the base assistant — there is no per-agent wiring.
End-to-end workflow
- Create the tool —
docyrus apps ai-tools createwith the right--typeand that type's config. - Guide the base assistant (optional but recommended) —
docyrus apps set-agent-contextto tell "Docy" when to use which tool.
App-scoped tools are owned by the app and exclusive to the system base assistant ("Docy"). When the app is installed in the tenant, its tools are attached to Docy automatically — you do not (and cannot) wire them to a specific agent, and there is no agent tools attach step. If the app is not installed in the tenant, its tools are not loaded.
App-scoped tools cannot be attached to custom AI agents. Giving a custom agent its own tools is a different, agent-owned flow (
docyrus agent tools …) outside this skill's scope.
All commands need an authenticated CLI session (docyrus auth who to verify). The app is selected with exactly one of --appId or --appSlug on every command.
The four tool types — pick one
--type |
Use when | Executes | Author config |
|---|---|---|---|
data_source_query |
Read/list records from one data source; the LLM only supplies filter values | Server, RLS-enforced | data source id + fixed columns/limit/formulas + a filter template with {{param}} bindings → data-source-query-tool.md |
custom_query |
Read across joins/aggregations needing hand-written read-only SELECT SQL | Server, read-only txn, RLS | a Handlebars-templated SQL string → custom-query-tool.md |
secure_exec |
Multi-step logic, calling the Docyrus REST API (incl. writes), transforming/compacting results | Server sandbox (10s, no FS/env, Docyrus-API-only network) | a JavaScript body → secure-exec-tool.md |
client_side |
The action must run in the user's browser/app (UI navigation, local selection, host APIs) | Client/frontend | input/output schema only; the host app implements the handler → client-side-tool.md |
Read the matching reference file before authoring that type — each documents the exact config fields, templating/binding rules, runtime behavior, and worked examples.
docyrus apps ai-tools command surface
Routes to /v1/dev/apps/:appId/ai-tools. The CLI resolves --appSlug to an app id.
docyrus apps ai-tools list --appSlug <slug>
docyrus apps ai-tools get --appSlug <slug> --toolId <id>
docyrus apps ai-tools create --appSlug <slug> --type <type> [config flags | --from-file payload.json]
docyrus apps ai-tools update --appSlug <slug> --toolId <id> [flags | --from-file payload.json]
docyrus apps ai-tools delete --appSlug <slug> --toolId <id>
Convenience flags (camelCase flag → snake_case payload key)
Common to every type:
| Flag | Key | Notes |
|---|---|---|
--name |
name |
Required on create. Display name. |
--key |
key |
Required on create. The function name the LLM sees. snake_case, stable, and globally unique (a DB UNIQUE constraint across all tenants) — namespace it (e.g. crm_get_customer_balance) to avoid collisions. |
--description |
description |
Drives LLM tool selection — always write a clear, specific one. |
--type |
type |
Must be set to data_source_query | custom_query | secure_exec | client_side. Omitting it defaults to system, which will not register as any of these. |
--inputJsonSchema |
input_json_schema |
Required at runtime for all four types (the LLM's argument schema). A no-argument tool still needs {"type":"object","properties":{}}. |
--outputJsonSchema |
output_json_schema |
Optional result schema (mainly client_side). |
--icon |
icon |
Optional. |
--environments |
environments |
Comma list of web,desktop,ios. Restricts where the tool is offered. |
--needsApproval |
needs_approval |
Require user approval before the call runs. Use for tools that mutate data. |
--dynamicApprovalFormula |
dynamic_approval_formula |
JSONata that decides approval per-call. |
Type-specific flags (--secureExecCode, --customQuerySqlQuery, --customQueryFilters, --dataSourceQueryDataSourceId, --dataSourceQueryColumns, --dataSourceQueryFilters, --dataSourceQueryFilterKeyword, --dataSourceQueryFormulas, --dataSourceQueryChildQueries, --dataSourceQueryLimit, --clientSideExecution) are documented in each type's reference file.
--from-file <path> / --data '<json>' send a raw JSON payload (snake_case keys); convenience flags are merged over it. Prefer --from-file for anything with JSON schemas, SQL, or code — it sidesteps shell quoting. JSON-typed flags (--inputJsonSchema, --dataSourceQueryFilters, …) expect a JSON string when passed inline.
The endpoint forces
ownership=CUSTOMandtenant_app_id. Platform-managed fields (group,avatar,restricted,cost,development_status,core_action_id,core_data_provider_id,owner_product_id) are not settable here.
Set the app's agent context
agent_context is app-level guidance text injected into the base assistant's prompt. Use it to orchestrate: name each tool's key and say when to reach for it, what each returns, and any ordering ("look up the customer with get_customer before calling get_customer_balance").
docyrus apps set-agent-context --appSlug <slug> --from-file agent-context.md # recommended for prose
docyrus apps set-agent-context --appSlug <slug> --value "Use get_customer_balance when the user asks about balances or overdue amounts."
docyrus apps set-agent-context --appSlug <slug> --clear # remove it
Provide exactly one of --value, --from-file, or --clear. (This writes agent_context via PATCH /v1/dev/apps/:appId; docyrus apps update --agentContext does the same.)
Authoring checklist
--typeset, and the matching config provided (see the type's reference file).input_json_schemapresent (even if empty) and describing only what the LLM should supply.descriptionis specific enough for the model to choose the tool correctly;keyissnake_caseand stable.- The app is installed in the tenant — that's what surfaces its tools to the base assistant (Docy). App-scoped tools auto-attach to Docy only; they're never wired to custom agents.
- Mutating tools (
secure_execwrites, etc.) consider--needsApproval true. - Agent context mentions the new tool's
keyand trigger conditions. - Verify with
docyrus apps ai-tools get --toolId <id>, then exercise it by chatting with the base assistant (docyrus docy "...").