tools-ui
Installation
Summary
React/Next.js components for displaying tool calls across their full lifecycle: pending, running, approval, success, and error states.
- Includes three core components: ToolCall for displaying pending/running tool invocations, ToolResult for showing completed outputs, and ToolApproval for human-in-the-loop approval flows with approve/deny callbacks
- Automatic icon assignment based on tool name patterns (search, read, write, delete, send, etc.) with fallback to wrench icon
- Five distinct tool states (pending, running, approval, success, error) with customizable styling via className prop
- Integrates seamlessly with the Agent component for automatic tool lifecycle management and optional approval gates on sensitive operations
SKILL.md
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 |
|---|---|
pending |
Tool call requested, waiting to execute |
running |
Tool is currently executing |
approval |
Requires human approval before execution |
success |
Tool completed successfully |
error |
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*, find* |
Search |
read*, get* |
File |
write*, create* |
Pencil |
delete*, remove* |
Trash |
send*, email* |
|
| 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 inference-sh/skills@agent-ui
# Chat UI blocks
npx skills add inference-sh/skills@chat-ui
# Widgets for tool results
npx skills add inference-sh/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
Weekly Installs
12
Repository
inferen-sh/skillsGitHub Stars
343
First Seen
Feb 1, 2026
Security Audits
Installed on
claude-code8
opencode8
openclaw7
gemini-cli7
antigravity7
codex7