shadcn.exchange
Search 12,000+ shadcn/ui blocks from 130+ registries, free and paid, with install commands.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"blocks": {
"url": "https://shadcn.exchange/mcp"
}
}
}Remote endpoints
https://shadcn.exchange/mcpstreamable-httpWhat it can do
Tool inventory
Tools (4)
🟢search_blocks(query, category, registry, price, limit, ...)
Search the shadcn/ui blocks listed on shadcn.exchange: ready-made sections of a page, such as heroes, pricing tables, login forms, dashboards, footers and FAQs, from every public shadcn registry, free and paid. Use it when the user is building a page or a screen with shadcn/ui and wants a section to start from, or asks what blocks exist for something. Results come best first. Each has its id (for get_block), its description, its install command if it is free or where to buy it if it is paid, and its page with a live preview. Every word of the query has to be in a block's name, title, description or registry, so use one or two words, and the category for the kind of section.
Input Schema
{
"type": "object",
"properties": {
"query": {
"description": "One or two words to find, such as \"pricing\", \"sign in\", \"testimonials\" or \"bento\". Leave it out to list a category or a registry.",
"type": "string",
"maxLength": 80
},
"category": {
"description": "The kind of section, from list_categories, such as hero, pricing, login, dashboard or footer.",
"type": "string",
"enum": [
"hero",
"pricing",
"dashboard",
"login",
"navbar",
"sidebar",
"features",
"footer",
"cta",
"testimonials",
"faq",
"charts",
"tables",
"contact",
"blog",
"stats",
"team",
"logo-cloud",
"gallery",
"bento",
"ecommerce",
"chat",
"file-upload",
"404-page",
"onboarding",
"settings",
"newsletter",
"about",
"careers",
"changelog",
"integrations",
"banner",
"timeline",
"empty-state",
"cookie-consent",
"kanban",
"portfolio",
"coming-soon"
]
},
"registry": {
"description": "Only this registry's blocks: its id from list_registries, such as efferd or shadcnblocks.",
"type": "string",
"maxLength": 64
},
"price": {
"default": "any",
"description": "free: blocks that install now with one command. paid: blocks their registries sell. any: both.",
"type": "string",
"enum": [
"any",
"free",
"paid"
]
},
"limit": {
"default": 10,
"description": "How many results to return, up to 50.",
"type": "integer",
"minimum": 1,
"maximum": 50
},
"offset": {
"default": 0,
"description": "How many results to skip, for the next page.",
"type": "integer",
"minimum": 0,
"maximum": 10000
}
}
}🟢get_block(id, include_source)
Get one block's details by its id from search_blocks: what it is, its install command, the npm packages and registry items it depends on, the files it adds, and its registry's notes on using it. Set include_source to also get its source code, for when the user wants to read or adapt the code rather than install it.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 3,
"maxLength": 300,
"description": "The block's id from search_blocks, as registry/name, such as efferd/hero-1. Its page's address works too."
},
"include_source": {
"default": false,
"description": "Also give the source of its files. It can be long, and installing the block adds the files anyway.",
"type": "boolean"
}
},
"required": [
"id"
]
}🟢list_categories
List the kinds of section the blocks are sorted into, such as hero, pricing, login, dashboard and footer, with how many blocks each has. Pass one to search_blocks as its category.
Input Schema
{
"type": "object",
"properties": {}
}🟢list_registries(query)
List the public shadcn/ui registries whose blocks shadcn.exchange lists, the most blocks first, with how many of each are free and paid, what each one is, and its page. Pass a registry's id to search_blocks to search only its blocks.
Input Schema
{
"type": "object",
"properties": {
"query": {
"description": "Only registries with this in their id, name or description, such as dashboard or animated.",
"type": "string",
"maxLength": 80
}
}
}Community
Evidence