For the complete documentation index, see llms.txt. Markdown variants are available by appending .md to any URL or sending an Accept: text/markdown header. An agent skill is available at /.well-known/agent-skills/site-skill.md.
30
Sponsor

Introduction

Copy-paste React components for MCP Apps, built with Base UI and the shadcn CLI.

mcpcn provides polished, accessible, and customizable React components for MCP Apps. It is built with Base UI and works with the shadcn CLI.

Philosophy

mcpcn follows the shadcn model for MCP App interfaces: copy the components into your project, own the source code, and customize them without waiting for a package API to change.

Model-driven interfaces often need more than a collection of isolated primitives. They need complete patterns for messages, forms, payments, events, lists, maps, and social content. mcpcn provides those patterns with useful defaults while keeping their structure open for composition.

The goal is simple: make MCP Apps feel like the rest of your product—consistent, accessible, responsive, and easy to adapt.

Why mcpcn?

Most MCP App interfaces are assembled from one-off markup or rigid components. mcpcn is designed for teams that want to move quickly without giving up control:

  • Own your code: Install source files into your application and change every detail.
  • Start fast: Render a complete default component immediately after installation.
  • Compose freely: Import child components directly and replace or rearrange sections with ordinary JSX.
  • Stay compatible: Use the same CLI, aliases, utilities, and primitives as a shadcn/ui project.

Composition first

Each compound component owns shared data and behavior through context. Its child components are exported individually, so you can use the default composition or build your own without dot notation.

import {
  QuickReply,
  QuickReplyItem,
  QuickReplyList,
} from "@/components/ui/quick-reply";
 
const replies = [{ label: "Show details" }, { label: "Continue" }];
 
export function SuggestedReplies() {
  return (
    <QuickReply actions={{ onSelectReply: (reply) => console.log(reply) }}>
      <QuickReplyList>
        {replies.map((reply) => (
          <QuickReplyItem key={reply.label} reply={reply} />
        ))}
      </QuickReplyList>
    </QuickReply>
  );
}

Omit children when you want the ready-to-use default composition.

Features

Ready to use
Every block includes a polished default composition with demo data.
Theme aware
Semantic color tokens adapt to your existing light and dark themes.
Composable
Context-backed child components can be imported and arranged directly.
TypeScript
Typed data, appearance, and action contracts make integrations predictable.
Copy and paste
The source code lives in your project, with no component package lock-in.
shadcn compatible
Install blocks and their dependencies with the familiar shadcn CLI.