create-client-tool
Scaffolds an AtlasTool for an already-approved in-app useAtlasChat UI. For EOS sidebar tools, use integrate-fusion-agent (createAgentAction) instead. Triggers: AtlasTool, useAtlasChat tool, in-app atlas client tool.
By cognitedata · 1,879 installs
npx skills add cognitedata/builder-skills --skill create-client-tool
Source repository · Upstream listing
Create a Client Tool
Scaffold an AtlasTool named $ARGUMENTS . If the app has no approved in app useAtlasChat , implement a Fusion action via integrate fusion agent instead.
Prerequisite: vendored src/atlas agent/ and @sinclair/typebox from integrate atlas chat .
Background
Client tools let the Atlas Agent invoke browser side logic — charts, local state, UI panels, navigation. The agent decides when to call; the app executes and returns a result.
1. Agent responds with a clientTool action
2. TypeBox validates the arguments
3. execute() runs in the browser and returns { output, details }
4. output (string) is sent back to the agent
5. details is available on message.toolCalls for the UI to render
Step 1 — Understand the codebase
Before writing anything, read:
The file where useAtlasChat is called (often src/App.tsx or a chat hook) to find where tools is passed — imports are typically from ./atlas agent/react after integrate atlas chat
Any existing tool definitions to match the file/naming conventions
Step 2 — Define the tool
Use Type from @sinclair/typebox for the parameters schema (compile time types + runtime validation).
Adjust the ./atlas agent/... path if the tool file is not directly under src/ next to the atlas agent folder (for example ../atlas agent/types from src/tools/ ).
TypeBox quick reference
Schema Usage
Type.String() string
Type.Number() number
Type.Boolean() boolean
Type.Literal("foo") exact value
Type.Union([Type.Literal("a"), Type.Literal("b")]) enum
Type.Array(Type.String()) string[]
Type.Object({ ... }) object
Type.Optional(...) mark any field optional
Always add a description on the tool and on each parameter — the agent uses those strings.
Step 3 — Wire into useAtlasChat
Find the useAtlasChat call and add the tool to the tools array:
Step 4 — Render tool results (if needed)
If the tool returns structured details , render them in the message list.
message.toolCalls is a ToolCall[] — one entry per tool call (client side and server side) in call order.