mirror of
https://github.com/stack-auth/stack.git
synced 2026-06-13 21:01:21 +08:00
<!--
Make sure you've read the CONTRIBUTING.md guidelines:
https://github.com/stack-auth/stack-auth/blob/dev/CONTRIBUTING.md
-->
Adds MCP installation instructions pages to docs:
<img width="1156" height="851" alt="image"
src="https://github.com/user-attachments/assets/ba3b1431-b3a5-403b-98ee-35afa8b93720"
/>
<!-- RECURSEML_SUMMARY:START -->
## High-level PR Summary
This PR adds MCP (Model Context Protocol) installation documentation to
the Stack Auth docs. It creates a new page (`mcp-setup.mdx`) with
instructions for setting up Stack Auth's MCP server in various
development environments including Cursor, VS Code, Claude Code, Claude
Desktop, Windsurf, ChatGPT, and Gemini CLI. The PR includes necessary
supporting assets like SVG icons, a new button component, modifications
to existing components, and updates to configuration files to properly
register the new documentation page.
⏱️ Estimated Review Time: 15-30 minutes
<details>
<summary>💡 Review Order Suggestion</summary>
| Order | File Path |
|-------|-----------|
| 1 | `docs/templates/others/mcp-setup.mdx` |
| 2 | `docs/docs-platform.yml` |
| 3 | `docs/src/components/icons.tsx` |
| 4 | `docs/src/components/mdx/button.tsx` |
| 5 | `docs/src/components/mdx/info.tsx` |
| 6 | `docs/src/mdx-components.tsx` |
| 7 | `docs/templates/meta.json` |
| 8 | `docs/public/imgs/mcp.svg` |
| 9 | `docs/public/imgs/vscode.svg` |
| 10 | `docs/public/imgs/cursor.svg` |
</details>
[](https://discord.gg/n3SsVDAW6U)
<!-- RECURSEML_SUMMARY:END -->
<!-- ELLIPSIS_HIDDEN -->
----
> [!IMPORTANT]
> Adds MCP installation instructions to documentation, introduces new
components, and updates existing components for enhanced MDX support.
>
> - **Documentation**:
> - Adds `mcp-setup.mdx` for MCP installation instructions in
`docs/templates/others`.
> - Updates `docs-platform.yml` and `meta.json` to include the new MCP
setup page.
> - **Components**:
> - Adds `Button` component in `button.tsx` for MDX content.
> - Updates `Info` component in `info.tsx` to include a size option for
compact notices.
> - Adds `StackAuthIcon` and `CursorIcon` to `icons.tsx` for MDX use.
> - **MDX Components**:
> - Exposes new `Button` and icons in `mdx-components.tsx`.
>
> <sup>This description was created by </sup>[<img alt="Ellipsis"
src="https://img.shields.io/badge/Ellipsis-blue?color=175173">](https://www.ellipsis.dev?ref=stack-auth%2Fstack-auth&utm_source=github&utm_medium=referral)<sup>
for d8ef95cdfb. You can
[customize](https://app.ellipsis.dev/stack-auth/settings/summaries) this
summary. It will automatically update as commits are pushed.</sup>
----
<!-- ELLIPSIS_HIDDEN -->
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Added an MCP setup guide page available across Next, React, JS, and
Python.
* Introduced a reusable Button component for MDX content with
link/button behavior.
* Added a size option to Info components for compact notices.
* New StackAuth and Cursor icons available for MDX use.
* **Documentation**
* Added the MCP setup template to docs and navigation/meta.
* Exposed the new Button and icons in MDX component mappings.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
---------
Co-authored-by: Konsti Wohlwend <n2d4xc@gmail.com>
397 lines
12 KiB
TypeScript
397 lines
12 KiB
TypeScript
/**
|
|
* @license lucide-react - ISC
|
|
*
|
|
* All copyright belongs to https://github.com/lucide-icons/lucide, we bundle it as part of library to avoid upstream issues.
|
|
*/
|
|
import { type ComponentProps, createElement, forwardRef } from 'react';
|
|
import { cn } from '../lib/cn';
|
|
|
|
const defaultAttributes: LucideProps = {
|
|
xmlns: 'http://www.w3.org/2000/svg',
|
|
width: 24,
|
|
height: 24,
|
|
viewBox: '0 0 24 24',
|
|
fill: 'none',
|
|
stroke: 'currentColor',
|
|
strokeWidth: 2,
|
|
strokeLinecap: 'round',
|
|
strokeLinejoin: 'round',
|
|
};
|
|
|
|
type SVGElementType =
|
|
| 'circle'
|
|
| 'ellipse'
|
|
| 'g'
|
|
| 'line'
|
|
| 'path'
|
|
| 'polygon'
|
|
| 'polyline'
|
|
| 'rect';
|
|
|
|
export type LucideProps = {
|
|
size?: string | number,
|
|
} & ComponentProps<'svg'>
|
|
|
|
export type IconNode = [
|
|
elementName: SVGElementType,
|
|
attrs: Record<string, string>,
|
|
][];
|
|
|
|
const createLucideIcon = (iconName: string, iconNode: IconNode) => {
|
|
const Component = forwardRef<SVGSVGElement, LucideProps>(
|
|
(
|
|
{ className, size = 24, color = 'currentColor', children, ...props },
|
|
ref,
|
|
) => {
|
|
return (
|
|
<svg
|
|
ref={ref}
|
|
{...defaultAttributes}
|
|
width={size}
|
|
height={size}
|
|
stroke={color}
|
|
className={cn('lucide', className)}
|
|
{...props}
|
|
>
|
|
{iconNode.map(([tag, attr]) => createElement(tag, attr))}
|
|
{children}
|
|
</svg>
|
|
);
|
|
},
|
|
);
|
|
|
|
Component.displayName = iconName;
|
|
return Component;
|
|
};
|
|
|
|
export const ChevronDown = createLucideIcon('chevron-down', [
|
|
['path', { d: 'm6 9 6 6 6-6', key: 'qrunsl' }],
|
|
]);
|
|
|
|
export const Languages = createLucideIcon('languages', [
|
|
['path', { d: 'm5 8 6 6', key: '1wu5hv' }],
|
|
['path', { d: 'm4 14 6-6 2-3', key: '1k1g8d' }],
|
|
['path', { d: 'M2 5h12', key: 'or177f' }],
|
|
['path', { d: 'M7 2h1', key: '1t2jsx' }],
|
|
['path', { d: 'm22 22-5-10-5 10', key: 'don7ne' }],
|
|
['path', { d: 'M14 18h6', key: '1m8k6r' }],
|
|
]);
|
|
|
|
export const Sidebar = createLucideIcon('panel-left', [
|
|
[
|
|
'rect',
|
|
{ width: '18', height: '18', x: '3', y: '3', rx: '2', key: 'afitv7' },
|
|
],
|
|
['path', { d: 'M9 3v18', key: 'fh3hqa' }],
|
|
]);
|
|
|
|
export const ChevronsUpDown = createLucideIcon('chevrons-up-down', [
|
|
['path', { d: 'm7 15 5 5 5-5', key: '1hf1tw' }],
|
|
['path', { d: 'm7 9 5-5 5 5', key: 'sgt6xg' }],
|
|
]);
|
|
|
|
export const Search = createLucideIcon('search', [
|
|
['circle', { cx: '11', cy: '11', r: '8', key: '4ej97u' }],
|
|
['path', { d: 'm21 21-4.3-4.3', key: '1qie3q' }],
|
|
]);
|
|
|
|
export const ExternalLink = createLucideIcon('external-link', [
|
|
['path', { d: 'M15 3h6v6', key: '1q9fwt' }],
|
|
['path', { d: 'M10 14 21 3', key: 'gplh6r' }],
|
|
[
|
|
'path',
|
|
{
|
|
d: 'M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6',
|
|
key: 'a6xqqp',
|
|
},
|
|
],
|
|
]);
|
|
|
|
export const Moon = createLucideIcon('moon', [
|
|
['path', { d: 'M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z', key: 'a7tn18' }],
|
|
]);
|
|
|
|
export const Sun = createLucideIcon('sun', [
|
|
['circle', { cx: '12', cy: '12', r: '4', key: '4exip2' }],
|
|
['path', { d: 'M12 2v2', key: 'tus03m' }],
|
|
['path', { d: 'M12 20v2', key: '1lh1kg' }],
|
|
['path', { d: 'm4.93 4.93 1.41 1.41', key: '149t6j' }],
|
|
['path', { d: 'm17.66 17.66 1.41 1.41', key: 'ptbguv' }],
|
|
['path', { d: 'M2 12h2', key: '1t8f8n' }],
|
|
['path', { d: 'M20 12h2', key: '1q8mjw' }],
|
|
['path', { d: 'm6.34 17.66-1.41 1.41', key: '1m8zz5' }],
|
|
['path', { d: 'm19.07 4.93-1.41 1.41', key: '1shlcs' }],
|
|
]);
|
|
|
|
export const Airplay = createLucideIcon('airplay', [
|
|
[
|
|
'path',
|
|
{
|
|
d: 'M5 17H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-1',
|
|
key: 'ns4c3b',
|
|
},
|
|
],
|
|
['path', { d: 'm12 15 5 6H7Z', key: '14qnn2' }],
|
|
]);
|
|
|
|
export const Menu = createLucideIcon('menu', [
|
|
['line', { x1: '4', x2: '20', y1: '12', y2: '12', key: '1e0a9i' }],
|
|
['line', { x1: '4', x2: '20', y1: '6', y2: '6', key: '1owob3' }],
|
|
['line', { x1: '4', x2: '20', y1: '18', y2: '18', key: 'yk5zj1' }],
|
|
]);
|
|
|
|
export const X = createLucideIcon('x', [
|
|
['path', { d: 'M18 6 6 18', key: '1bl5f8' }],
|
|
['path', { d: 'm6 6 12 12', key: 'd8bk6v' }],
|
|
]);
|
|
|
|
export const LoaderCircle = createLucideIcon('loader-circle', [
|
|
['path', { d: 'M21 12a9 9 0 1 1-6.219-8.56', key: '13zald' }],
|
|
]);
|
|
|
|
export const CircleCheck = createLucideIcon('circle-check', [
|
|
['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],
|
|
['path', { d: 'm9 12 2 2 4-4', key: 'dzmm74' }],
|
|
]);
|
|
|
|
export const CircleX = createLucideIcon('circle-x', [
|
|
['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],
|
|
['path', { d: 'm15 9-6 6', key: '1uzhvr' }],
|
|
['path', { d: 'm9 9 6 6', key: 'z0biqf' }],
|
|
]);
|
|
|
|
export const Check = createLucideIcon('check', [
|
|
['path', { d: 'M20 6 9 17l-5-5', key: '1gmf2c' }],
|
|
]);
|
|
|
|
export const TriangleAlert = createLucideIcon('triangle-alert', [
|
|
[
|
|
'path',
|
|
{
|
|
d: 'm21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3',
|
|
key: 'wmoenq',
|
|
},
|
|
],
|
|
['path', { d: 'M12 9v4', key: 'juzpu7' }],
|
|
['path', { d: 'M12 17h.01', key: 'p32p05' }],
|
|
]);
|
|
|
|
export const Info = createLucideIcon('info', [
|
|
['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],
|
|
['path', { d: 'M12 16v-4', key: '1dtifu' }],
|
|
['path', { d: 'M12 8h.01', key: 'e9boi3' }],
|
|
]);
|
|
|
|
export const Copy = createLucideIcon('copy', [
|
|
[
|
|
'rect',
|
|
{
|
|
width: '14',
|
|
height: '14',
|
|
x: '8',
|
|
y: '8',
|
|
rx: '2',
|
|
ry: '2',
|
|
key: '17jyea',
|
|
},
|
|
],
|
|
[
|
|
'path',
|
|
{
|
|
d: 'M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2',
|
|
key: 'zix9uf',
|
|
},
|
|
],
|
|
]);
|
|
|
|
export const FileText = createLucideIcon('file-text', [
|
|
[
|
|
'path',
|
|
{
|
|
d: 'M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z',
|
|
key: '1rqfz7',
|
|
},
|
|
],
|
|
['path', { d: 'M14 2v4a2 2 0 0 0 2 2h4', key: 'tnqrlb' }],
|
|
['path', { d: 'M10 9H8', key: 'b1mrlr' }],
|
|
['path', { d: 'M16 13H8', key: 't4e002' }],
|
|
['path', { d: 'M16 17H8', key: 'z1uh3a' }],
|
|
]);
|
|
|
|
export const Hash = createLucideIcon('hash', [
|
|
['line', { x1: '4', x2: '20', y1: '9', y2: '9', key: '4lhtct' }],
|
|
['line', { x1: '4', x2: '20', y1: '15', y2: '15', key: 'vyu0kd' }],
|
|
['line', { x1: '10', x2: '8', y1: '3', y2: '21', key: '1ggp8o' }],
|
|
['line', { x1: '16', x2: '14', y1: '3', y2: '21', key: 'weycgp' }],
|
|
]);
|
|
|
|
export const Text = createLucideIcon('text', [
|
|
['path', { d: 'M15 18H3', key: 'olowqp' }],
|
|
['path', { d: 'M17 6H3', key: '16j9eg' }],
|
|
['path', { d: 'M21 12H3', key: '2avoz0' }],
|
|
]);
|
|
|
|
export const File = createLucideIcon('file', [
|
|
[
|
|
'path',
|
|
{
|
|
d: 'M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z',
|
|
key: '1rqfz7',
|
|
},
|
|
],
|
|
['path', { d: 'M14 2v4a2 2 0 0 0 2 2h4', key: 'tnqrlb' }],
|
|
]);
|
|
|
|
export const Folder = createLucideIcon('folder', [
|
|
[
|
|
'path',
|
|
{
|
|
d: 'M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z',
|
|
key: '1kt360',
|
|
},
|
|
],
|
|
]);
|
|
|
|
export const FolderOpen = createLucideIcon('folder-open', [
|
|
[
|
|
'path',
|
|
{
|
|
d: 'm6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2',
|
|
key: 'usdka0',
|
|
},
|
|
],
|
|
]);
|
|
|
|
export const Star = createLucideIcon('star', [
|
|
[
|
|
'path',
|
|
{
|
|
d: 'M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z',
|
|
key: 'r04s7s',
|
|
},
|
|
],
|
|
]);
|
|
|
|
export const Link = createLucideIcon('link', [
|
|
[
|
|
'path',
|
|
{
|
|
d: 'M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71',
|
|
key: '1cjeqo',
|
|
},
|
|
],
|
|
[
|
|
'path',
|
|
{
|
|
d: 'M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71',
|
|
key: '19qd67',
|
|
},
|
|
],
|
|
]);
|
|
|
|
export const Edit = createLucideIcon('square-pen', [
|
|
[
|
|
'path',
|
|
{
|
|
d: 'M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7',
|
|
key: '1m0v6g',
|
|
},
|
|
],
|
|
[
|
|
'path',
|
|
{
|
|
d: 'M18.375 2.625a1 1 0 0 1 3 3l-9.013 9.014a2 2 0 0 1-.853.505l-2.873.84a.5.5 0 0 1-.62-.62l.84-2.873a2 2 0 0 1 .506-.852z',
|
|
key: 'ohrbg2',
|
|
},
|
|
],
|
|
]);
|
|
|
|
export const ChevronRight = createLucideIcon('chevron-right', [
|
|
['path', { d: 'm9 18 6-6-6-6', key: 'mthhwq' }],
|
|
]);
|
|
|
|
export const ChevronLeft = createLucideIcon('chevron-left', [
|
|
['path', { d: 'm15 18-6-6 6-6', key: '1wnfg3' }],
|
|
]);
|
|
|
|
export const Plus = createLucideIcon('plus', [
|
|
['path', { d: 'M5 12h14', key: '1ays0h' }],
|
|
['path', { d: 'M12 5v14', key: 's699le' }],
|
|
]);
|
|
|
|
export const Trash2 = createLucideIcon('trash-2', [
|
|
['path', { d: 'M3 6h18', key: 'd0wm0j' }],
|
|
['path', { d: 'M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6', key: '4alrt4' }],
|
|
['path', { d: 'M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2', key: 'v07s0e' }],
|
|
['line', { x1: '10', x2: '10', y1: '11', y2: '17', key: '1uufr5' }],
|
|
['line', { x1: '14', x2: '14', y1: '11', y2: '17', key: 'xtxkd' }],
|
|
]);
|
|
|
|
export const ChevronUp = createLucideIcon('chevron-up', [
|
|
['path', { d: 'm18 15-6-6-6 6', key: '153udz' }],
|
|
]);
|
|
|
|
export const Box = createLucideIcon('box', [
|
|
['path', { d: 'M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z', key: 'hh9hay' }],
|
|
['path', { d: 'm3.3 7 8.7 5 8.7-5', key: 'g66t2b' }],
|
|
['path', { d: 'M12 22V12', key: 'd0xqq' }],
|
|
]);
|
|
|
|
export const Code = createLucideIcon('code', [
|
|
['path', { d: 'm16 18 6-6-6-6', key: '4m8svg' }],
|
|
['path', { d: 'm8 6-6 6 6 6', key: '1ksn4a' }],
|
|
]);
|
|
|
|
export const Zap = createLucideIcon('zap', [
|
|
['path', { d: 'M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z', key: 'za6gxh' }],
|
|
]);
|
|
|
|
// Stack Auth Logo Component
|
|
export const StackAuthIcon = forwardRef<SVGSVGElement, LucideProps>(
|
|
({ className, size = 40, color = 'currentColor', ...props }, ref) => {
|
|
return (
|
|
<svg
|
|
ref={ref}
|
|
width={size}
|
|
height={size}
|
|
viewBox="0 0 200 242"
|
|
fill="none"
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
className={cn('flex-shrink-0', className)}
|
|
{...props}
|
|
>
|
|
<path
|
|
d="M103.504 1.81227C101.251 0.68679 98.6002 0.687576 96.3483 1.81439L4.4201 47.8136C1.71103 49.1692 0 51.9387 0 54.968V130.55C0 133.581 1.7123 136.351 4.42292 137.706L96.4204 183.695C98.6725 184.82 101.323 184.82 103.575 183.694L168.422 151.271C173.742 148.611 180 152.479 180 158.426V168.879C180 171.91 178.288 174.68 175.578 176.035L103.577 212.036C101.325 213.162 98.6745 213.162 96.4224 212.036L11.5771 169.623C6.25791 166.964 0 170.832 0 176.779V187.073C0 190.107 1.71689 192.881 4.43309 194.234L96.5051 240.096C98.7529 241.216 101.396 241.215 103.643 240.094L195.571 194.235C198.285 192.881 200 190.109 200 187.076V119.512C200 113.565 193.741 109.697 188.422 112.356L131.578 140.778C126.258 143.438 120 139.57 120 133.623V123.17C120 120.14 121.712 117.37 124.422 116.014L195.578 80.4368C198.288 79.0817 200 76.3116 200 73.2814V54.9713C200 51.9402 198.287 49.1695 195.576 47.8148L103.504 1.81227Z"
|
|
fill={color}
|
|
/>
|
|
</svg>
|
|
);
|
|
}
|
|
);
|
|
|
|
StackAuthIcon.displayName = 'StackAuthIcon';
|
|
|
|
// Cursor Logo Component (actual Cursor logo)
|
|
export const CursorIcon = forwardRef<SVGSVGElement, LucideProps>(
|
|
({ className, size = 24, color = 'currentColor', ...props }, ref) => {
|
|
return (
|
|
<svg
|
|
ref={ref}
|
|
width={size}
|
|
height={size}
|
|
viewBox="0 0 24 24"
|
|
fill="none"
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
className={cn('flex-shrink-0', className)}
|
|
{...props}
|
|
>
|
|
<path d="M12 2L2 7L12 12L22 7L12 2Z" fill={color}/>
|
|
<path d="M2 17L12 22L22 17" stroke={color} strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
|
|
<path d="M2 12L12 17L22 12" stroke={color} strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"/>
|
|
</svg>
|
|
);
|
|
}
|
|
);
|
|
|
|
CursorIcon.displayName = 'CursorIcon';
|