---
name: {{APP_NAME}}
description: What {{APP_NAME}} can do and the tools it exposes.
alwaysActive: true
---

# {{APP_NAME}}

This skill is the **menu** for {{APP_NAME}}. It tells the AI what this app can do
and lists the tools it can call. The **kitchen** — the code that actually runs
each tool — lives in the process component (`components/process/index.ts`) as one
`POST /tools/<name>` route per tool.

## How a tool call works

1. The AI calls a tool listed in `tools.ts`, e.g. `save_bookmark(url, title)`.
2. Kazzle POSTs `{ "input": { ... } }` to that tool's handler route
   (`POST /tools/save-bookmark`) on this app's process component, with the app
   identity as `Authorization: Bearer <token>`.
3. The handler does the work and returns the result — either plain text or JSON
   `{ "content": "..." }`. The AI sees that as the tool result.

## Tools

- **`save_bookmark(url, title)`** — save a bookmark and return a confirmation.

## Adding a tool (do both, always)

1. Add the tool to `tools.ts` with `type: "app"`, its provider-safe `name`,
   friendly `displayName`, AI-facing `description`, Zod `input` schema, the
   `component` that serves it (a component name from `kazzle.config.ts`), and the
   `path` of its handler route.
2. Add the matching `POST <path>` route to that component (`components/process/index.ts`).

A tool listed here with no matching route does nothing; a route with no menu entry
is never called. Never hardcode a URL or use `{{ }}` placeholders — Kazzle joins
the component's live URL and `path` at call time.
