create-client-tool — скилл для Claude Code
Скилл создаёт клиентский инструмент AtlasTool для чата useAtlasChat в веб-приложении. Он описывает схему TypeBox, настраивает вызов логики в браузере и подключает инструмент к чату.
npx skills add cognitedata/builder-skills --skill create-client-tool -a claude-codeЧто делает create-client-tool
Скилл генерирует шаблон инструмента AtlasTool, позволяя агенту Atlas выполнять клиентский код прямо в браузере: менять локальное состояние или строить графики. Параметры описываются через @sinclair/typebox для проверки типов при сборке и валидации аргументов во время работы. Функция execute() возвращает текстовый output агенту и объект details для интерфейса приложения.
Скилл анализирует файлы проекта, находит вызов хука useAtlasChat, создаёт файл инструмента и добавляет его в массив tools. Результаты работы выводятся через message.toolCalls в компонентах интерфейса.
Без предварительно скопированной папки src/atlas-agent/ и установленного пакета @sinclair/typebox сгенерированный код не скомпилируется. Для боковой панели EOS этот скилл не подходит: для неё нужно действие Fusion через integrate-fusion-agent.
Какие задачи решает
- сгенерировать шаблон
AtlasToolсо схемой TypeBox - подключить клиентский инструмент к хуку
useAtlasChat - вернуть структурированные данные
detailsдля отображения в UI - передать текстовый результат работы браузерного кода агенту
Примеры запросов агенту
- Сделай клиентский инструмент export_pdf для скачивания отчётов в формате PDF
- Создай тул show_filter_panel для открытия боковой панели фильтров в интерфейсе
- Добавь AtlasTool navigate_to_asset для перехода на страницу выбранного актива
Как установить create-client-tool
1Через Skills CLI (Vercel)
npx skills add cognitedata/builder-skills --skill create-client-tool -a claude-code2Вручную: положить файлы
~/.claude/skills/create-client-tool/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/create-client-tool/
1Через Skills CLI (Vercel)
npx skills add cognitedata/builder-skills --skill create-client-tool -a codex2Вручную: положить файлы
.agents/skills/create-client-tool/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add cognitedata/builder-skills --skill create-client-tool -a cursor2Вручную: положить файлы
.cursor/skills/create-client-tool/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install cognitedata/builder-skills create-client-tool2Вручную: положить файлы
.github/skills/create-client-tool/SKILL.md1Через Skills CLI (Vercel)
npx skills add cognitedata/builder-skills --skill create-client-tool -a gemini-cli2Командой платформы
gemini skills install https://github.com/cognitedata/builder-skills --path skills/create-client-toolВручную: положить файлы
.devin/skills/create-client-tool/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add cognitedata/builder-skills --skill create-client-tool -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о create-client-tool
Как установить create-client-tool в Claude Code?
Выполните команду npx skills add cognitedata/builder-skills --skill create-client-tool -a claude-code.
Что делает скилл create-client-tool?
Он создаёт определение AtlasTool с валидацией через TypeBox, браузерным методом execute и прописывает его в массиве tools хука useAtlasChat.
Что требуется перед запуском create-client-tool?
В проекте должны быть установлена библиотека @sinclair/typebox и перенесена директория src/atlas-agent/, подготовленные ранее через integrate-atlas-chat.
Исходный текст
SKILL.md · Apache-2.0
---
name: create-client-tool
description: "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."
allowed-tools: Read, Glob, Grep, Edit, Write
metadata:
argument-hint: "[tool-name] [brief description of what it does]"
---
# 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).
```ts
import { Type } from "@sinclair/typebox";
import type { AtlasTool } from "./atlas-agent/types";
export const myTool: AtlasTool = {
name: "my_tool", // snake_case — this is what the agent uses to invoke it
description:
"One sentence describing what this tool does and when the agent should call it.",
parameters: Type.Object({
exampleParam: Type.String({ description: "What this param is for" }),
optionalNum: Type.Optional(Type.Number({ description: "..." })),
}),
execute: async (args) => {
return {
output: "Plain text summary sent back to the agent",
details: {
// Any structured data you want available in the UI via message.toolCalls
},
};
},
};
```
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:
```ts
const { messages, send, ... } = useAtlasChat({
client: isLoading ? null : sdk,
agentExternalId: AGENT_EXTERNAL_ID,
tools: [myTool], // add here
});
```
---
## 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.
```tsx
{msg.toolCalls?.map((tc, i) => (
// tc.name — tool name
// tc.output — the string sent back to the agent
// tc.details — your structured data (cast to your known shape)
<MyToolOutput key={i} data={tc.details as MyToolDetails} />
))}
```
© cognitedata · Apache-2.0 · cognitedata/builder-skills