CLI and programmatic API for adding UI components from registries. Supports multi-registry, dependency resolution, code transformation, and MCP integration for AI assistants.
npx @tessl/cli install tessl/npm-shadcn@3.6.0shadcn is a CLI tool and programmatic API for adding UI components to your project. It provides both command-line interface for interactive component management and a powerful programmatic API for fetching and resolving components from registries. The tool features multi-registry support, dependency resolution, code transformation, and AI assistant integration through the Model Context Protocol.
npm install shadcn or use directly with npx shadcn# Initialize a new project
npx shadcn init
# Add a component
npx shadcn add button
# Add multiple components (non-interactive)
npx shadcn add button card dialog --yes --overwrite// Programmatic usage
import { getRegistryItems, resolveRegistryItems } from 'shadcn';
// Fetch components
const items = await getRegistryItems(['@shadcn/button', '@shadcn/card']);
// Resolve with dependencies
const resolved = await resolveRegistryItems(['@shadcn/button']);See Quick Start Guide for detailed setup instructions.
Multi-registry support with namespace-based and URL-based registries. Supports HTTP caching, authentication, and dependency resolution.
12 commands for component management: init, add, search, view, diff, migrate, info, build, mcp, and more.
TypeScript API for fetching, resolving, and searching components with full type safety.
Automatic code transformation for framework compatibility (RSC, CSS variables, icon libraries, Tailwind prefixes).
Model Context Protocol server with 7 specialized tools for AI assistant workflows.
import {
getRegistryItems,
resolveRegistryItems,
getRegistry,
getRegistriesConfig,
getRegistriesIndex,
getShadcnRegistryIndex,
getRegistryStyles,
getRegistryIcons,
getRegistryBaseColors,
getRegistryBaseColor,
getPresets,
getPreset
} from 'shadcn';import {
getRegistryItems,
searchRegistries,
RegistryError,
RegistryNotFoundError,
RegistryNotConfiguredError,
ConfigMissingError
// ... more error classes
} from 'shadcn/registry';import {
registryItemSchema,
configSchema,
registryConfigSchema,
type RegistryItem,
type Config
} from 'shadcn/schema';import {
transformStyle,
transformIcons,
transformMenu,
transformRender,
createStyleMap
} from 'shadcn/utils';import { iconLibraries, type IconLibraryName } from 'shadcn/icons';import { server } from 'shadcn/mcp';| Command | Description |
|---|---|
init | Initialize project with configuration |
add [component...] | Add components to project |
search [query] | Search for components |
view [items...] | View component details |
diff [component] | Check for component updates |
migrate <command> | Run migrations (icons, radix) |
info | Display project information |
mcp | Start MCP server |
See CLI Commands Reference for complete documentation.
| Function | Description |
|---|---|
getRegistryItems(items, options?) | Fetch registry items by name |
resolveRegistryItems(items, options?) | Resolve items with all dependencies |
getRegistry(name, options?) | Get registry by name or URL |
searchRegistries(registries, options?) | Search items across registries |
getRegistriesConfig(cwd, options?) | Get registries configuration |
See Registry API Reference for complete API documentation.
| Error Class | When Thrown |
|---|---|
RegistryNotFoundError | Item or registry not found |
RegistryNotConfiguredError | Registry not in components.json |
ConfigMissingError | components.json not found |
RegistryFetchError | Network or fetch errors |
RegistryUnauthorizedError | Authentication required |
ConfigParseError | Invalid components.json |
See Error Handling for complete error documentation.
shadcn is built around several key components:
import { resolveRegistryItems } from 'shadcn';
import { writeFile, mkdir } from 'fs/promises';
const resolved = await resolveRegistryItems(['@shadcn/button']);
// Install dependencies, write files, update configsSee Real-World Scenarios for complete examples.
import { getRegistryItems, RegistryNotFoundError, ConfigMissingError } from 'shadcn/registry';
try {
const items = await getRegistryItems(['@shadcn/button']);
} catch (error) {
if (error instanceof ConfigMissingError) {
// Project not initialized
} else if (error instanceof RegistryNotFoundError) {
// Item not found
}
}See Edge Cases for comprehensive error handling patterns.
import { getRegistriesConfig } from 'shadcn';
import { findUp } from 'find-up';
const configPath = await findUp('components.json', { cwd: process.cwd() });
const { registries } = await getRegistriesConfig(dirname(configPath));Supported icon libraries: Lucide, Tabler, HugeIcons, and Phosphor Icons.
import { iconLibraries, type IconLibraryName } from 'shadcn/icons';
type IconLibraryName = "lucide" | "tabler" | "hugeicons" | "phosphor"The following functions are deprecated:
resolveTree → Use resolveRegistryItemsfetchTree → Use getRegistryItems with resolved dependenciesgetItemTargetPath → Use config.resolvedPaths directly