Productivity

tools

assistant-ui/skills · updated Apr 8, 2026

$npx skills add https://github.com/assistant-ui/skills --skill tools
summary

Framework for registering LLM tools with custom UI rendering in assistant-ui.

  • Supports both backend tools (via AI SDK) and frontend-only tools, each with optional custom UI rendering through makeAssistantToolUI
  • Includes human-in-the-loop patterns with requires-action status for confirmation workflows and interactive tool responses
  • Tool UI receives execution status, arguments, results, and a submitResult callback for interactive tools
  • Common setup patterns provided for weather APIs
skill.md

assistant-ui Tools

Always consult assistant-ui.com/llms.txt for latest API.

Tools let LLMs trigger actions with custom UI rendering.

References

Tool Types

Where does the tool execute?
├─ Backend (LLM calls API) → AI SDK tool()
│  └─ Want custom UI? → makeAssistantToolUI
└─ Frontend (browser-only) → makeAssistantTool
   └─ Want custom UI? → makeAssistantToolUI

Backend Tool with UI

// Backend (app/api/chat/route.ts)
import { tool, stepCountIs } from "ai";
import { z } from "zod";

const tools = {
  get_weather: tool({
    description: "Get weather for a city",
    inputSchema: z.object({ city: z.string() }),
    execute: async ({ city }) => ({ temp: 22, city }),
  }),
};

const result = streamText({
  model: openai("gpt-4o"),
  messages,
  tools,
  stopWhen: stepCountIs(5),
});
// Frontend
import { makeAssistantToolUI } from "@assistant-ui/react";

const WeatherToolUI = makeAssistantToolUI({
  toolName: "get_weather",
  render: ({ args, result, status }) => {
    if (status === "running") return <div>Loading weather...</div>;
    return <div>{result?.city}: {result?.temp}°C</div>;
  },
});

// Register in app
<AssistantRuntimeProvider runtime={runtime}>
  <WeatherToolUI />
  <Thread />
</AssistantRuntimeProvider>

Frontend-Only Tool

import { makeAssistantTool } from "@assistant-ui/react";
import { z } from "zod";

const CopyTool = makeAssistantTool({
  toolName: "copy_to_clipboard",
  parameters: z.object({ text: z.string() }),
  execute: async ({ text }) => {
    await navigator.clipboard.writeText(text);
    return { success: true };
  },
});

<AssistantRuntimeProvider runtime={runtime}>
  <CopyTool />
  <Thread />
</AssistantRuntimeProvider>

API Reference

// makeAssistantToolUI props
interface ToolUIProps {
  toolCallId: string;
  toolName: string;
  args: Record<string, unknown>;
  argsText: string;
  result?: unknown;
  status: "running" | "complete" | "incomplete" | "requires-action";
  submitResult: (result: unknown) => void;  // For interactive tools
}

Human-in-the-Loop

const DeleteToolUI = makeAssistantToolUI({
  toolName: "delete_file",
  render: ({ args, status, submitResult }) => {
    if (status === "requires-action") {
      return (
        <div>
          <p>Delete {args.path}?</p>
          <button onClick={() => submitResult({ confirmed: true })}>Confirm</button>
          <button onClick={() => submitResult({ confirmed: false })}>Cancel</button>
        </div>
      );
    }
    return <div>File deleted</div>;
  },
});

Common Gotchas

Tool UI not rendering

  • toolName must match exactly (case-sensitive)
  • Register UI inside AssistantRuntimeProvider

Tool not being called

  • Check tool description is clear
  • Use stopWhen: stepCountIs(n) to allow multi-step

Result not showing

  • Tool must return a value
  • Check status === "complete" before accessing result
general reviews

Ratings

4.639 reviews
  • Zaid Srinivasan· Dec 24, 2024

    Useful defaults in tools — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.

  • Carlos Robinson· Dec 12, 2024

    I recommend tools for anyone iterating fast on agent tooling; clear intent and a small, reviewable surface area.

  • Pratham Ware· Dec 8, 2024

    Registry listing for tools matched our evaluation — installs cleanly and behaves as described in the markdown.

  • Sakshi Patil· Nov 27, 2024

    tools reduced setup friction for our internal harness; good balance of opinion and flexibility.

  • Chen Abbas· Nov 15, 2024

    We added tools from the explainx registry; install was straightforward and the SKILL.md answered most questions upfront.

  • Michael Rao· Nov 3, 2024

    Keeps context tight: tools is the kind of skill you can hand to a new teammate without a long onboarding doc.

  • Nia Kim· Oct 22, 2024

    Registry listing for tools matched our evaluation — installs cleanly and behaves as described in the markdown.

  • Chaitanya Patil· Oct 18, 2024

    I recommend tools for anyone iterating fast on agent tooling; clear intent and a small, reviewable surface area.

  • Mateo Gill· Oct 6, 2024

    Solid pick for teams standardizing on skills: tools is focused, and the summary matches what you get after install.

  • Piyush G· Sep 25, 2024

    Useful defaults in tools — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.

showing 1-10 of 39

1 / 4