Learn-skills.dev tools-ui
"Tool lifecycle UI components for React/Next.js from ui.inference.sh. Display tool calls: pending, progress, approval required, results. Capabilities: tool status, progress indicators, approval flows, results display. Use for: showing agent tool calls, human-in-the-loop approvals, tool output. Triggers: tool ui, tool calls, tool status, tool approval, tool results," agent tools, mcp tools ui, function calling ui, tool lifecycle, tool pending
install
source · Clone the upstream repo
git clone https://github.com/NeverSight/learn-skills.dev
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/NeverSight/learn-skills.dev "$T" && mkdir -p ~/.claude/skills && cp -r "$T/data/skills-md/1nference-sh/skills/tools-ui" ~/.claude/skills/neversight-learn-skills-dev-tools-ui-4f9938 && rm -rf "$T"
manifest:
data/skills-md/1nference-sh/skills/tools-ui/SKILL.mdsource content
Tool UI Components
Tool lifecycle components from ui.inference.sh.

Quick Start
npx shadcn@latest add https://ui.inference.sh/r/tools.json
Tool States
| State | Description |
|---|---|
| Tool call requested, waiting to execute |
| Tool is currently executing |
| Requires human approval before execution |
| Tool completed successfully |
| Tool execution failed |
Components
Tool Call Display
import { ToolCall } from "@/registry/blocks/tools/tool-call" <ToolCall name="search_web" args={{ query: "latest AI news" }} status="running" />
Tool Result
import { ToolResult } from "@/registry/blocks/tools/tool-result" <ToolResult name="search_web" result={{ results: [...] }} status="success" />
Tool Approval
import { ToolApproval } from "@/registry/blocks/tools/tool-approval" <ToolApproval name="send_email" args={{ to: "user@example.com", subject: "Hello" }} onApprove={() => executeTool()} onDeny={() => cancelTool()} />
Full Example
import { ToolCall, ToolResult, ToolApproval } from "@/registry/blocks/tools" function ToolDisplay({ tool }) { if (tool.status === 'approval') { return ( <ToolApproval name={tool.name} args={tool.args} onApprove={tool.approve} onDeny={tool.deny} /> ) } if (tool.result) { return ( <ToolResult name={tool.name} result={tool.result} status={tool.status} /> ) } return ( <ToolCall name={tool.name} args={tool.args} status={tool.status} /> ) }
Styling Tool Cards
<ToolCall name="read_file" args={{ path: "/src/index.ts" }} status="running" className="border-blue-500" />
Tool Icons
Tools automatically get icons based on their name:
| Pattern | Icon |
|---|---|
, | Search |
, | File |
, | Pencil |
, | Trash |
, | |
| Default | Wrench |
With Agent Component
The Agent component handles tool lifecycle automatically:
import { Agent } from "@/registry/blocks/agent/agent" <Agent proxyUrl="/api/inference/proxy" config={{ core_app: { ref: 'openrouter/claude-sonnet-45@0fkg6xwb' }, tools: [ { name: 'search_web', description: 'Search the web', parameters: { query: { type: 'string' } }, requiresApproval: true, // Enable approval flow }, ], }} />
Related Skills
# Full agent component (recommended) npx skills add inferencesh/skills@agent-ui # Chat UI blocks npx skills add inferencesh/skills@chat-ui # Widgets for tool results npx skills add inferencesh/skills@widgets-ui
Documentation
- Adding Tools to Agents - Equip agents with tools
- Human-in-the-Loop - Approval flows
- Tool Approval Gates - Implementing approvals
Component docs: ui.inference.sh/blocks/tools