React components for every tool your agent needs.
ai-tool-elements is a React component library for tool-related UI — render stateful tool calls at runtime, or build static tool cards, catalogs, and integration surfaces for providers like Composio, Apify, Scalekit, and more.
npm install ai-tool-elementsEvery state, one prop
The states match AI SDK tool parts one-to-one, so part.state passes straight through — no mapping layer, no status enums of your own.
Draft a launch checklist in our wiki
{ "parent": "Team Wiki",import { Notion, ToolCallCard } from "ai-tool-elements";
import "ai-tool-elements/styles.css";
// AI SDK tool parts map straight through — state, input, output
{message.parts.map((part) =>
part.type === "tool-createPage" ? (
<ToolCallCard
key={part.toolCallId}
tool={Notion}
state={part.state}
input={part.input}
output={formatPage(part.output)}
/>
) : null,
)}Static cards for everything else
ToolCard covers the rest of your surface — settings pages, integration pickers, connector galleries. All 1000+ catalog entries are typed named exports; search them below.
Showing 100 of 1000+ tools
import { ToolCard, toolCatalog } from "ai-tool-elements";
import "ai-tool-elements/styles.css";
export function Integrations() {
const [query, setQuery] = useState("");
const matches = toolCatalog.filter((tool) =>
tool.name.toLowerCase().includes(query.toLowerCase()),
);
return (
<div className="integrations">
<input
placeholder={`Search ${toolCatalog.length} tools…`}
value={query}
onChange={(event) => setQuery(event.target.value)}
/>
{matches.map((tool) => (
<ToolCard key={tool.id} tool={tool} />
))}
</div>
);
}Your own tools use the same type
Anything that satisfies Toolrenders with the same cards — no registry required. Both cards are shadcn’s Card under the hood, so buttons, badges, and dialogs slot straight into their actions and footers.
- API keyRequired
import type { Tool } from "ai-tool-elements";
export const Acme = {
id: "acme",
name: "Acme",
description: "A project-defined connector.",
fields: [{ name: "apiKey", label: "API key", required: true }],
} as const satisfies Tool;
<ToolCard tool={Acme} />