docusaurus-plugin-mcp-server 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/theme/index.d.mts +2 -1
- package/dist/theme/index.d.ts +2 -1
- package/dist/theme/index.js +313 -158
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/index.mjs +308 -158
- package/dist/theme/index.mjs.map +1 -1
- package/package.json +4 -1
package/dist/theme/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/theme/McpRegistryContext.tsx","../../src/theme/McpInstallButton.tsx"],"names":["MCPConfigRegistry","usePluginData","useMemo","useState","useRef","useEffect","useCallback","jsxs","jsx","config"],"mappings":"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","file":"index.js","sourcesContent":["import { useMemo } from 'react';\nimport { usePluginData } from '@docusaurus/useGlobalData';\nimport { MCPConfigRegistry, type RegistryOptions } from '@gleanwork/mcp-config-schema/browser';\n\n/**\n * Configuration from the plugin\n */\nexport interface McpConfig {\n /** Full URL to the MCP server endpoint */\n serverUrl: string;\n /** Name of the MCP server for configuration */\n serverName: string;\n}\n\n/**\n * Plugin global data shape\n */\ninterface McpPluginGlobalData {\n serverUrl: string;\n serverName: string;\n}\n\n/**\n * Registry options for the docs MCP server.\n * Similar to GLEAN_REGISTRY_OPTIONS in @gleanwork/mcp-config-glean\n */\nexport function createDocsRegistryOptions(config: McpConfig): RegistryOptions {\n return {\n // Use the serverName from config for naming\n serverNameBuilder: () => config.serverName,\n };\n}\n\n/**\n * Creates an MCPConfigRegistry pre-configured with the docs server settings.\n *\n * Similar to createGleanRegistry() from @gleanwork/mcp-config-glean\n *\n * @param config - The server configuration from plugin\n * @returns Object with registry instance and bound config\n */\nexport function createDocsRegistry(config: McpConfig): {\n registry: MCPConfigRegistry;\n config: McpConfig;\n} {\n const options = createDocsRegistryOptions(config);\n return {\n registry: new MCPConfigRegistry(options),\n config,\n };\n}\n\n/**\n * Hook to access the pre-configured MCP registry and config.\n *\n * Reads configuration from plugin globalData and creates a registry\n * with the serverUrl and serverName pre-bound in the config object.\n *\n * @returns { registry, config } or undefined if plugin not configured\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const mcp = useMcpRegistry();\n * if (!mcp) return null;\n *\n * const { registry, config } = mcp;\n * const builder = registry.createBuilder('claude-code');\n * const json = builder.buildConfiguration({\n * transport: 'http',\n * serverUrl: config.serverUrl,\n * serverName: config.serverName,\n * });\n * }\n * ```\n */\nexport function useMcpRegistry(): { registry: MCPConfigRegistry; config: McpConfig } | undefined {\n // Read plugin globalData\n let pluginData: McpPluginGlobalData | undefined;\n try {\n pluginData = usePluginData('docusaurus-plugin-mcp-server') as McpPluginGlobalData | undefined;\n } catch {\n // Plugin not installed\n return undefined;\n }\n\n // Memoize registry creation\n const result = useMemo(() => {\n if (!pluginData?.serverUrl || !pluginData?.serverName) {\n return undefined;\n }\n const config: McpConfig = {\n serverUrl: pluginData.serverUrl,\n serverName: pluginData.serverName,\n };\n return createDocsRegistry(config);\n }, [pluginData?.serverUrl, pluginData?.serverName]);\n\n return result;\n}\n\nexport default useMcpRegistry;\n","import React, { useState, useRef, useEffect, useCallback, useMemo } from 'react';\nimport {\n MCPConfigRegistry,\n type ClientId,\n type MCPClientConfig,\n} from '@gleanwork/mcp-config-schema/browser';\nimport { useMcpRegistry, createDocsRegistry, type McpConfig } from './McpRegistryContext.js';\n\n/**\n * Props for the McpInstallButton component\n */\nexport interface McpInstallButtonProps {\n /** Server URL. If not provided, uses plugin configuration. */\n serverUrl?: string;\n /** Server name. If not provided, uses plugin configuration. */\n serverName?: string;\n /** Button label (default: \"Install MCP\") */\n label?: string;\n /** Optional className for styling */\n className?: string;\n /** Clients to show. Defaults to all HTTP-capable clients from registry. */\n clients?: ClientId[];\n}\n\n/**\n * A dropdown button component for installing MCP servers in various AI tools.\n *\n * @example\n * ```tsx\n * <McpInstallButton\n * serverUrl=\"https://docs.example.com/mcp\"\n * serverName=\"my-docs\"\n * />\n * ```\n */\nexport function McpInstallButton({\n serverUrl: serverUrlProp,\n serverName: serverNameProp,\n label = 'Install MCP',\n className = '',\n clients: clientsProp,\n}: McpInstallButtonProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [copiedClient, setCopiedClient] = useState<string | null>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Get pre-configured registry from plugin\n const pluginMcp = useMcpRegistry();\n\n // Use props if provided, otherwise fall back to plugin config\n const { registry, config } = useMemo(() => {\n // If explicit props provided, create a new registry with those values\n if (serverUrlProp && serverNameProp) {\n return createDocsRegistry({\n serverUrl: serverUrlProp,\n serverName: serverNameProp,\n });\n }\n // Otherwise use plugin-provided registry\n if (pluginMcp) {\n return pluginMcp;\n }\n // Fallback: create registry without bound config (will fail validation below)\n return {\n registry: new MCPConfigRegistry(),\n config: { serverUrl: '', serverName: '' } as McpConfig,\n };\n }, [serverUrlProp, serverNameProp, pluginMcp]);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n // Validate configuration\n if (!config.serverUrl || !config.serverName) {\n console.error(\n '[McpInstallButton] Missing serverUrl or serverName. ' +\n 'Either pass them as props or configure the docusaurus-plugin-mcp-server plugin.'\n );\n return null;\n }\n\n // Get clients to display - dynamic from registry\n const clientConfigs = useMemo(() => {\n if (clientsProp) {\n return clientsProp\n .map((id) => registry.getConfig(id))\n .filter((c): c is MCPClientConfig => c !== undefined);\n }\n // Get all HTTP-capable clients dynamically\n return registry.getNativeHttpClients();\n }, [registry, clientsProp]);\n\n const copyToClipboard = useCallback(async (text: string, clientId: string) => {\n try {\n await navigator.clipboard.writeText(text);\n setCopiedClient(clientId);\n setTimeout(() => setCopiedClient(null), 2000);\n } catch (err) {\n console.error('Failed to copy:', err);\n }\n }, []);\n\n const getConfigForClient = useCallback(\n (clientId: ClientId): string => {\n const builder = registry.createBuilder(clientId);\n const clientConfig = builder.buildConfiguration({\n transport: 'http',\n serverUrl: config.serverUrl,\n serverName: config.serverName,\n });\n return JSON.stringify(clientConfig, null, 2);\n },\n [registry, config.serverUrl, config.serverName]\n );\n\n const getCommandForClient = useCallback(\n (clientId: ClientId): string | null => {\n const builder = registry.createBuilder(clientId);\n const cliStatus = builder.supportsCliInstallation();\n if (!cliStatus.supported) {\n return null;\n }\n return builder.buildCommand({\n transport: 'http',\n serverUrl: config.serverUrl,\n serverName: config.serverName,\n });\n },\n [registry, config.serverUrl, config.serverName]\n );\n\n return (\n <div ref={dropdownRef} className={`mcp-install-button ${className}`} style={styles.container}>\n <button\n onClick={() => setIsOpen(!isOpen)}\n style={styles.button}\n aria-expanded={isOpen}\n aria-haspopup=\"true\"\n >\n {label}\n <span style={styles.caret}>{isOpen ? '▲' : '▼'}</span>\n </button>\n\n {isOpen && (\n <div style={styles.dropdown}>\n <div style={styles.dropdownHeader}>Choose your AI tool:</div>\n\n {clientConfigs.map((client) => {\n const command = getCommandForClient(client.id);\n const config = getConfigForClient(client.id);\n const isCopied = copiedClient === client.id;\n\n return (\n <div key={client.id} style={styles.clientSection}>\n <div style={styles.clientHeader}>\n <span style={styles.clientName}>{client.displayName}</span>\n </div>\n\n {command ? (\n <div style={styles.codeBlock}>\n <code style={styles.code}>{command}</code>\n <button\n onClick={() => copyToClipboard(command, client.id)}\n style={styles.copyButton}\n title=\"Copy to clipboard\"\n >\n {isCopied ? '✓' : '📋'}\n </button>\n </div>\n ) : (\n <div style={styles.codeBlock}>\n <pre style={styles.pre}>\n <code style={styles.code}>{config}</code>\n </pre>\n <button\n onClick={() => copyToClipboard(config, client.id)}\n style={styles.copyButton}\n title=\"Copy to clipboard\"\n >\n {isCopied ? '✓' : '📋'}\n </button>\n </div>\n )}\n\n {client.localConfigNotes && (\n <div style={styles.notes}>{client.localConfigNotes}</div>\n )}\n </div>\n );\n })}\n\n <div style={styles.footer}>\n <a\n href=\"https://modelcontextprotocol.io/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={styles.learnMore}\n >\n Learn more about MCP →\n </a>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nconst styles: Record<string, React.CSSProperties> = {\n container: {\n position: 'relative',\n display: 'inline-block',\n },\n button: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '6px',\n padding: '8px 16px',\n fontSize: '14px',\n fontWeight: 500,\n color: '#fff',\n backgroundColor: '#5B4DC7',\n border: 'none',\n borderRadius: '6px',\n cursor: 'pointer',\n transition: 'background-color 0.2s',\n },\n caret: {\n fontSize: '10px',\n },\n dropdown: {\n position: 'absolute',\n top: '100%',\n right: 0,\n marginTop: '8px',\n width: '380px',\n maxHeight: '70vh',\n overflowY: 'auto',\n backgroundColor: '#fff',\n borderRadius: '8px',\n boxShadow: '0 4px 20px rgba(0, 0, 0, 0.15)',\n zIndex: 1000,\n },\n dropdownHeader: {\n padding: '12px 16px',\n fontSize: '13px',\n fontWeight: 600,\n color: '#666',\n borderBottom: '1px solid #eee',\n },\n clientSection: {\n padding: '12px 16px',\n borderBottom: '1px solid #eee',\n },\n clientHeader: {\n display: 'flex',\n alignItems: 'center',\n marginBottom: '8px',\n },\n clientName: {\n fontSize: '14px',\n fontWeight: 600,\n color: '#333',\n },\n codeBlock: {\n position: 'relative',\n backgroundColor: '#f6f8fa',\n borderRadius: '6px',\n padding: '10px 40px 10px 12px',\n },\n pre: {\n margin: 0,\n fontSize: '12px',\n lineHeight: 1.4,\n overflow: 'auto',\n maxHeight: '120px',\n },\n code: {\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace',\n fontSize: '12px',\n color: '#24292f',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-all',\n },\n copyButton: {\n position: 'absolute',\n top: '8px',\n right: '8px',\n padding: '4px 8px',\n fontSize: '14px',\n backgroundColor: 'transparent',\n border: 'none',\n cursor: 'pointer',\n opacity: 0.6,\n transition: 'opacity 0.2s',\n },\n notes: {\n marginTop: '8px',\n fontSize: '11px',\n color: '#666',\n fontStyle: 'italic',\n },\n footer: {\n padding: '12px 16px',\n textAlign: 'center',\n },\n learnMore: {\n fontSize: '12px',\n color: '#5B4DC7',\n textDecoration: 'none',\n },\n};\n\nexport default McpInstallButton;\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/theme/McpRegistryContext.tsx","../../src/theme/McpInstallButton.tsx"],"names":["MCPConfigRegistry","usePluginData","useMemo","jsxs","jsx","IconSuccess","IconCopy","useState","useRef","useEffect","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["import { useMemo } from 'react';\nimport { usePluginData } from '@docusaurus/useGlobalData';\nimport { MCPConfigRegistry, type RegistryOptions } from '@gleanwork/mcp-config-schema/browser';\n\n/**\n * Configuration from the plugin\n */\nexport interface McpConfig {\n /** Full URL to the MCP server endpoint */\n serverUrl: string;\n /** Name of the MCP server for configuration */\n serverName: string;\n}\n\n/**\n * Plugin global data shape\n */\ninterface McpPluginGlobalData {\n serverUrl: string;\n serverName: string;\n}\n\n/**\n * Registry options for the docs MCP server.\n * Similar to GLEAN_REGISTRY_OPTIONS in @gleanwork/mcp-config-glean\n */\nexport function createDocsRegistryOptions(config: McpConfig): RegistryOptions {\n return {\n // Use the serverName from config for naming\n serverNameBuilder: () => config.serverName,\n };\n}\n\n/**\n * Creates an MCPConfigRegistry pre-configured with the docs server settings.\n *\n * Similar to createGleanRegistry() from @gleanwork/mcp-config-glean\n *\n * @param config - The server configuration from plugin\n * @returns Object with registry instance and bound config\n */\nexport function createDocsRegistry(config: McpConfig): {\n registry: MCPConfigRegistry;\n config: McpConfig;\n} {\n const options = createDocsRegistryOptions(config);\n return {\n registry: new MCPConfigRegistry(options),\n config,\n };\n}\n\n/**\n * Hook to access the pre-configured MCP registry and config.\n *\n * Reads configuration from plugin globalData and creates a registry\n * with the serverUrl and serverName pre-bound in the config object.\n *\n * @returns { registry, config } or undefined if plugin not configured\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const mcp = useMcpRegistry();\n * if (!mcp) return null;\n *\n * const { registry, config } = mcp;\n * const builder = registry.createBuilder('claude-code');\n * const json = builder.buildConfiguration({\n * transport: 'http',\n * serverUrl: config.serverUrl,\n * serverName: config.serverName,\n * });\n * }\n * ```\n */\nexport function useMcpRegistry(): { registry: MCPConfigRegistry; config: McpConfig } | undefined {\n // Read plugin globalData\n let pluginData: McpPluginGlobalData | undefined;\n try {\n pluginData = usePluginData('docusaurus-plugin-mcp-server') as McpPluginGlobalData | undefined;\n } catch {\n // Plugin not installed\n return undefined;\n }\n\n // Memoize registry creation\n const result = useMemo(() => {\n if (!pluginData?.serverUrl || !pluginData?.serverName) {\n return undefined;\n }\n const config: McpConfig = {\n serverUrl: pluginData.serverUrl,\n serverName: pluginData.serverName,\n };\n return createDocsRegistry(config);\n }, [pluginData?.serverUrl, pluginData?.serverName]);\n\n return result;\n}\n\nexport default useMcpRegistry;\n","import { useState, useRef, useEffect, useCallback, useMemo } from 'react';\nimport {\n MCPConfigRegistry,\n type ClientId,\n type MCPClientConfig,\n} from '@gleanwork/mcp-config-schema/browser';\nimport IconCopy from '@theme/Icon/Copy';\nimport IconSuccess from '@theme/Icon/Success';\nimport { useMcpRegistry, createDocsRegistry, type McpConfig } from './McpRegistryContext.js';\n\n/**\n * MCP Logo icon - extracted from official MCP branding\n */\nfunction IconMcp({ size = 16 }: { size?: number }) {\n return (\n <svg\n viewBox=\"0 0 170 195\"\n width={size}\n height={size}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ display: 'block' }}\n >\n <path\n d=\"M25 97.8528L92.8823 29.9706C102.255 20.598 117.451 20.598 126.823 29.9706C136.196 39.3431 136.196 54.5391 126.823 63.9117L75.5581 115.177\"\n stroke=\"currentColor\"\n strokeWidth=\"12\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M76.2653 114.47L126.823 63.9117C136.196 54.5391 151.392 54.5391 160.765 63.9117L161.118 64.2652C170.491 73.6378 170.491 88.8338 161.118 98.2063L99.7248 159.6C96.6006 162.724 96.6006 167.789 99.7248 170.913L112.331 183.52\"\n stroke=\"currentColor\"\n strokeWidth=\"12\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M109.853 46.9411L59.6482 97.1457C50.2757 106.518 50.2757 121.714 59.6482 131.087C69.0208 140.459 84.2168 140.459 93.5894 131.087L143.794 80.8822\"\n stroke=\"currentColor\"\n strokeWidth=\"12\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\n/**\n * Chevron icon for dropdown\n */\nfunction IconChevron({ isOpen }: { isOpen: boolean }) {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n style={{\n display: 'block',\n transform: isOpen ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform var(--ifm-transition-fast)',\n }}\n >\n <path\n d=\"M2.5 4.5L6 8L9.5 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n );\n}\n\n/**\n * External link icon\n */\nfunction IconExternalLink() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" style={{ display: 'block', marginLeft: '4px' }}>\n <path\n fill=\"currentColor\"\n d=\"M3.5 3C3.22386 3 3 3.22386 3 3.5C3 3.77614 3.22386 4 3.5 4H7.29289L3.14645 8.14645C2.95118 8.34171 2.95118 8.65829 3.14645 8.85355C3.34171 9.04882 3.65829 9.04882 3.85355 8.85355L8 4.70711V8.5C8 8.77614 8.22386 9 8.5 9C8.77614 9 9 8.77614 9 8.5V3.5C9 3.22386 8.77614 3 8.5 3H3.5Z\"\n />\n </svg>\n );\n}\n\n/**\n * Code block with integrated copy button\n */\nfunction CodeBlock({\n code,\n isMultiline = false,\n isCopied,\n onCopy,\n}: {\n code: string;\n isMultiline?: boolean;\n isCopied: boolean;\n onCopy: () => void;\n}) {\n return (\n <div className=\"mcp-code-block\">\n <div className=\"mcp-code-block__content\">\n {isMultiline ? (\n <pre className=\"mcp-code-block__pre\">\n <code>{code}</code>\n </pre>\n ) : (\n <code>{code}</code>\n )}\n </div>\n <button\n className=\"mcp-code-block__copy\"\n onClick={onCopy}\n title={isCopied ? 'Copied!' : 'Copy to clipboard'}\n aria-label={isCopied ? 'Copied' : 'Copy to clipboard'}\n >\n {isCopied ? (\n <IconSuccess className=\"mcp-code-block__icon mcp-code-block__icon--success\" />\n ) : (\n <IconCopy className=\"mcp-code-block__icon\" />\n )}\n </button>\n </div>\n );\n}\n\n/**\n * Props for the McpInstallButton component\n */\nexport interface McpInstallButtonProps {\n /** Server URL. If not provided, uses plugin configuration. */\n serverUrl?: string;\n /** Server name. If not provided, uses plugin configuration. */\n serverName?: string;\n /** Button label (default: \"Install docs MCP\") */\n label?: string;\n /** Optional className for styling */\n className?: string;\n /** Clients to show. Defaults to all HTTP-capable clients from registry. */\n clients?: ClientId[];\n}\n\n/**\n * A dropdown button component for installing MCP servers in various AI tools.\n * Uses Docusaurus/Infima CSS classes for consistent theming.\n *\n * @example\n * ```tsx\n * <McpInstallButton\n * serverUrl=\"https://docs.example.com/mcp\"\n * serverName=\"my-docs\"\n * />\n * ```\n */\nexport function McpInstallButton({\n serverUrl: serverUrlProp,\n serverName: serverNameProp,\n label = 'Install docs MCP',\n className = '',\n clients: clientsProp,\n}: McpInstallButtonProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [copiedClient, setCopiedClient] = useState<string | null>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Get pre-configured registry from plugin\n const pluginMcp = useMcpRegistry();\n\n // Use props if provided, otherwise fall back to plugin config\n const { registry, config } = useMemo(() => {\n if (serverUrlProp && serverNameProp) {\n return createDocsRegistry({\n serverUrl: serverUrlProp,\n serverName: serverNameProp,\n });\n }\n if (pluginMcp) {\n return pluginMcp;\n }\n return {\n registry: new MCPConfigRegistry(),\n config: { serverUrl: '', serverName: '' } as McpConfig,\n };\n }, [serverUrlProp, serverNameProp, pluginMcp]);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n }\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n // Validate configuration\n if (!config.serverUrl || !config.serverName) {\n console.error(\n '[McpInstallButton] Missing serverUrl or serverName. ' +\n 'Either pass them as props or configure the docusaurus-plugin-mcp-server plugin.'\n );\n return null;\n }\n\n // Get clients to display - dynamic from registry, sorted alphabetically\n const clientConfigs = useMemo(() => {\n let clients: MCPClientConfig[];\n if (clientsProp) {\n clients = clientsProp\n .map((id) => registry.getConfig(id))\n .filter((c): c is MCPClientConfig => c !== undefined);\n } else {\n clients = registry.getNativeHttpClients();\n }\n // Sort alphabetically by display name\n return clients.sort((a, b) => a.displayName.localeCompare(b.displayName));\n }, [registry, clientsProp]);\n\n const copyToClipboard = useCallback(async (text: string, clientId: string) => {\n try {\n await navigator.clipboard.writeText(text);\n setCopiedClient(clientId);\n setTimeout(() => setCopiedClient(null), 2000);\n } catch (err) {\n console.error('Failed to copy:', err);\n }\n }, []);\n\n const getConfigForClient = useCallback(\n (clientId: ClientId): string | null => {\n try {\n const builder = registry.createBuilder(clientId);\n const clientConfig = builder.buildConfiguration({\n transport: 'http',\n serverUrl: config.serverUrl,\n serverName: config.serverName,\n });\n return JSON.stringify(clientConfig, null, 2);\n } catch {\n // Client doesn't support local configuration\n return null;\n }\n },\n [registry, config.serverUrl, config.serverName]\n );\n\n const getCommandForClient = useCallback(\n (clientId: ClientId): string | null => {\n try {\n const builder = registry.createBuilder(clientId);\n const cliStatus = builder.supportsCliInstallation();\n if (!cliStatus.supported) {\n return null;\n }\n return builder.buildCommand({\n transport: 'http',\n serverUrl: config.serverUrl,\n serverName: config.serverName,\n });\n } catch {\n return null;\n }\n },\n [registry, config.serverUrl, config.serverName]\n );\n\n // Using Infima dropdown classes\n const dropdownClasses = [\n 'dropdown',\n 'dropdown--right',\n isOpen ? 'dropdown--show' : '',\n 'mcp-install-dropdown',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div ref={dropdownRef} className={dropdownClasses}>\n {/* Infima button classes */}\n <button\n className=\"button button--primary mcp-install-dropdown__button\"\n onClick={() => setIsOpen(!isOpen)}\n aria-expanded={isOpen}\n aria-haspopup=\"true\"\n >\n <IconMcp size={16} />\n <span>{label}</span>\n <IconChevron isOpen={isOpen} />\n </button>\n\n {/* Dropdown menu using Infima classes */}\n <ul className=\"dropdown__menu mcp-install-dropdown__menu\">\n <li className=\"mcp-install-dropdown__header\">Choose your AI tool:</li>\n\n {clientConfigs.map((client) => {\n const command = getCommandForClient(client.id);\n const clientConfig = getConfigForClient(client.id);\n const isCopied = copiedClient === client.id;\n\n if (!command && !clientConfig) {\n return null;\n }\n\n return (\n <li key={client.id} className=\"mcp-install-dropdown__item\">\n <div className=\"mcp-install-dropdown__client-header\">\n <span className=\"mcp-install-dropdown__client-name\">{client.displayName}</span>\n {command && <span className=\"badge badge--success\">CLI</span>}\n </div>\n\n {command ? (\n <CodeBlock\n code={command}\n isCopied={isCopied}\n onCopy={() => copyToClipboard(command, client.id)}\n />\n ) : clientConfig ? (\n <CodeBlock\n code={clientConfig}\n isMultiline\n isCopied={isCopied}\n onCopy={() => copyToClipboard(clientConfig, client.id)}\n />\n ) : null}\n\n {client.localConfigNotes && (\n <p className=\"mcp-install-dropdown__notes\">{client.localConfigNotes}</p>\n )}\n </li>\n );\n })}\n\n <li className=\"mcp-install-dropdown__footer\">\n <a\n href=\"https://modelcontextprotocol.io/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mcp-install-dropdown__learn-more\"\n >\n Learn more about MCP\n <IconExternalLink />\n </a>\n </li>\n </ul>\n\n {/* Scoped styles using CSS variables for customization */}\n <style>{`\n .mcp-install-dropdown {\n --mcp-dropdown-width: 520px;\n /* Always use dark code blocks for consistency across themes */\n --mcp-code-bg: #1e1e1e;\n --mcp-code-color: #e5e7eb;\n }\n\n .mcp-install-dropdown__button {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n .mcp-install-dropdown__menu {\n width: var(--mcp-dropdown-width);\n padding: 0;\n top: calc(100% + 0.25rem);\n }\n\n .mcp-install-dropdown__header {\n padding: 0.75rem 1rem;\n font-size: var(--ifm-font-size-small);\n font-weight: var(--ifm-font-weight-semibold);\n color: var(--ifm-color-secondary-darkest);\n background-color: var(--ifm-background-color);\n border-bottom: 1px solid var(--ifm-toc-border-color);\n }\n\n .mcp-install-dropdown__item {\n padding: 0.875rem 1rem;\n border-bottom: 1px solid var(--ifm-toc-border-color);\n }\n\n .mcp-install-dropdown__client-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-bottom: 0.625rem;\n }\n\n .mcp-install-dropdown__client-name {\n font-weight: var(--ifm-font-weight-semibold);\n color: var(--ifm-font-color-base);\n }\n\n .mcp-install-dropdown__notes {\n margin: 0.5rem 0 0;\n font-size: var(--ifm-font-size-small);\n color: var(--ifm-color-secondary-darkest);\n line-height: 1.4;\n }\n\n .mcp-install-dropdown__footer {\n padding: 0.75rem 1rem;\n text-align: center;\n background-color: var(--ifm-background-color);\n }\n\n .mcp-install-dropdown__learn-more {\n display: inline-flex;\n align-items: center;\n font-size: var(--ifm-font-size-small);\n font-weight: var(--ifm-font-weight-semibold);\n color: var(--ifm-color-primary);\n text-decoration: none;\n }\n\n .mcp-install-dropdown__learn-more:hover {\n color: var(--ifm-color-primary-dark);\n text-decoration: none;\n }\n\n /* Code block styles */\n .mcp-code-block {\n display: flex;\n border-radius: var(--ifm-code-border-radius, 0.25rem);\n overflow: hidden;\n }\n\n .mcp-code-block__content {\n flex: 1;\n background-color: var(--mcp-code-bg);\n padding: 0.75rem 1rem;\n overflow-x: auto;\n }\n\n .mcp-code-block__content code {\n font-family: var(--ifm-font-family-monospace);\n font-size: var(--ifm-code-font-size);\n color: var(--mcp-code-color);\n background: none;\n padding: 0;\n border: none;\n white-space: nowrap;\n }\n\n .mcp-code-block__pre {\n margin: 0;\n background: none;\n max-height: 120px;\n overflow-y: auto;\n }\n\n .mcp-code-block__pre code {\n white-space: pre;\n }\n\n .mcp-code-block__copy {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2.75rem;\n background-color: var(--ifm-color-gray-800, #374151);\n border: none;\n cursor: pointer;\n color: var(--ifm-color-gray-400, #9ca3af);\n transition: background-color var(--ifm-transition-fast);\n }\n\n .mcp-code-block__copy:hover {\n background-color: var(--ifm-color-gray-700, #4b5563);\n }\n\n .mcp-code-block__icon {\n width: 16px;\n height: 16px;\n display: block;\n }\n\n .mcp-code-block__icon--success {\n color: var(--ifm-color-success, #22c55e);\n }\n `}</style>\n </div>\n );\n}\n\nexport default McpInstallButton;\n"]}
|
package/dist/theme/index.mjs
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { useMemo, useState, useRef, useEffect, useCallback } from 'react';
|
|
2
2
|
import { MCPConfigRegistry } from '@gleanwork/mcp-config-schema/browser';
|
|
3
|
+
import IconCopy from '@theme/Icon/Copy';
|
|
4
|
+
import IconSuccess from '@theme/Icon/Success';
|
|
3
5
|
import { usePluginData } from '@docusaurus/useGlobalData';
|
|
4
6
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
7
|
|
|
@@ -36,10 +38,107 @@ function useMcpRegistry() {
|
|
|
36
38
|
}, [pluginData?.serverUrl, pluginData?.serverName]);
|
|
37
39
|
return result;
|
|
38
40
|
}
|
|
41
|
+
function IconMcp({ size = 16 }) {
|
|
42
|
+
return /* @__PURE__ */ jsxs(
|
|
43
|
+
"svg",
|
|
44
|
+
{
|
|
45
|
+
viewBox: "0 0 170 195",
|
|
46
|
+
width: size,
|
|
47
|
+
height: size,
|
|
48
|
+
fill: "none",
|
|
49
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
50
|
+
style: { display: "block" },
|
|
51
|
+
children: [
|
|
52
|
+
/* @__PURE__ */ jsx(
|
|
53
|
+
"path",
|
|
54
|
+
{
|
|
55
|
+
d: "M25 97.8528L92.8823 29.9706C102.255 20.598 117.451 20.598 126.823 29.9706C136.196 39.3431 136.196 54.5391 126.823 63.9117L75.5581 115.177",
|
|
56
|
+
stroke: "currentColor",
|
|
57
|
+
strokeWidth: "12",
|
|
58
|
+
strokeLinecap: "round"
|
|
59
|
+
}
|
|
60
|
+
),
|
|
61
|
+
/* @__PURE__ */ jsx(
|
|
62
|
+
"path",
|
|
63
|
+
{
|
|
64
|
+
d: "M76.2653 114.47L126.823 63.9117C136.196 54.5391 151.392 54.5391 160.765 63.9117L161.118 64.2652C170.491 73.6378 170.491 88.8338 161.118 98.2063L99.7248 159.6C96.6006 162.724 96.6006 167.789 99.7248 170.913L112.331 183.52",
|
|
65
|
+
stroke: "currentColor",
|
|
66
|
+
strokeWidth: "12",
|
|
67
|
+
strokeLinecap: "round"
|
|
68
|
+
}
|
|
69
|
+
),
|
|
70
|
+
/* @__PURE__ */ jsx(
|
|
71
|
+
"path",
|
|
72
|
+
{
|
|
73
|
+
d: "M109.853 46.9411L59.6482 97.1457C50.2757 106.518 50.2757 121.714 59.6482 131.087C69.0208 140.459 84.2168 140.459 93.5894 131.087L143.794 80.8822",
|
|
74
|
+
stroke: "currentColor",
|
|
75
|
+
strokeWidth: "12",
|
|
76
|
+
strokeLinecap: "round"
|
|
77
|
+
}
|
|
78
|
+
)
|
|
79
|
+
]
|
|
80
|
+
}
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
function IconChevron({ isOpen }) {
|
|
84
|
+
return /* @__PURE__ */ jsx(
|
|
85
|
+
"svg",
|
|
86
|
+
{
|
|
87
|
+
width: "12",
|
|
88
|
+
height: "12",
|
|
89
|
+
viewBox: "0 0 12 12",
|
|
90
|
+
style: {
|
|
91
|
+
display: "block",
|
|
92
|
+
transform: isOpen ? "rotate(180deg)" : "rotate(0deg)",
|
|
93
|
+
transition: "transform var(--ifm-transition-fast)"
|
|
94
|
+
},
|
|
95
|
+
children: /* @__PURE__ */ jsx(
|
|
96
|
+
"path",
|
|
97
|
+
{
|
|
98
|
+
d: "M2.5 4.5L6 8L9.5 4.5",
|
|
99
|
+
stroke: "currentColor",
|
|
100
|
+
strokeWidth: "1.5",
|
|
101
|
+
strokeLinecap: "round",
|
|
102
|
+
strokeLinejoin: "round",
|
|
103
|
+
fill: "none"
|
|
104
|
+
}
|
|
105
|
+
)
|
|
106
|
+
}
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
function IconExternalLink() {
|
|
110
|
+
return /* @__PURE__ */ jsx("svg", { width: "12", height: "12", viewBox: "0 0 12 12", style: { display: "block", marginLeft: "4px" }, children: /* @__PURE__ */ jsx(
|
|
111
|
+
"path",
|
|
112
|
+
{
|
|
113
|
+
fill: "currentColor",
|
|
114
|
+
d: "M3.5 3C3.22386 3 3 3.22386 3 3.5C3 3.77614 3.22386 4 3.5 4H7.29289L3.14645 8.14645C2.95118 8.34171 2.95118 8.65829 3.14645 8.85355C3.34171 9.04882 3.65829 9.04882 3.85355 8.85355L8 4.70711V8.5C8 8.77614 8.22386 9 8.5 9C8.77614 9 9 8.77614 9 8.5V3.5C9 3.22386 8.77614 3 8.5 3H3.5Z"
|
|
115
|
+
}
|
|
116
|
+
) });
|
|
117
|
+
}
|
|
118
|
+
function CodeBlock({
|
|
119
|
+
code,
|
|
120
|
+
isMultiline = false,
|
|
121
|
+
isCopied,
|
|
122
|
+
onCopy
|
|
123
|
+
}) {
|
|
124
|
+
return /* @__PURE__ */ jsxs("div", { className: "mcp-code-block", children: [
|
|
125
|
+
/* @__PURE__ */ jsx("div", { className: "mcp-code-block__content", children: isMultiline ? /* @__PURE__ */ jsx("pre", { className: "mcp-code-block__pre", children: /* @__PURE__ */ jsx("code", { children: code }) }) : /* @__PURE__ */ jsx("code", { children: code }) }),
|
|
126
|
+
/* @__PURE__ */ jsx(
|
|
127
|
+
"button",
|
|
128
|
+
{
|
|
129
|
+
className: "mcp-code-block__copy",
|
|
130
|
+
onClick: onCopy,
|
|
131
|
+
title: isCopied ? "Copied!" : "Copy to clipboard",
|
|
132
|
+
"aria-label": isCopied ? "Copied" : "Copy to clipboard",
|
|
133
|
+
children: isCopied ? /* @__PURE__ */ jsx(IconSuccess, { className: "mcp-code-block__icon mcp-code-block__icon--success" }) : /* @__PURE__ */ jsx(IconCopy, { className: "mcp-code-block__icon" })
|
|
134
|
+
}
|
|
135
|
+
)
|
|
136
|
+
] });
|
|
137
|
+
}
|
|
39
138
|
function McpInstallButton({
|
|
40
139
|
serverUrl: serverUrlProp,
|
|
41
140
|
serverName: serverNameProp,
|
|
42
|
-
label = "Install MCP",
|
|
141
|
+
label = "Install docs MCP",
|
|
43
142
|
className = "",
|
|
44
143
|
clients: clientsProp
|
|
45
144
|
}) {
|
|
@@ -78,10 +177,13 @@ function McpInstallButton({
|
|
|
78
177
|
return null;
|
|
79
178
|
}
|
|
80
179
|
const clientConfigs = useMemo(() => {
|
|
180
|
+
let clients;
|
|
81
181
|
if (clientsProp) {
|
|
82
|
-
|
|
182
|
+
clients = clientsProp.map((id) => registry.getConfig(id)).filter((c) => c !== void 0);
|
|
183
|
+
} else {
|
|
184
|
+
clients = registry.getNativeHttpClients();
|
|
83
185
|
}
|
|
84
|
-
return
|
|
186
|
+
return clients.sort((a, b) => a.displayName.localeCompare(b.displayName));
|
|
85
187
|
}, [registry, clientsProp]);
|
|
86
188
|
const copyToClipboard = useCallback(async (text, clientId) => {
|
|
87
189
|
try {
|
|
@@ -94,196 +196,244 @@ function McpInstallButton({
|
|
|
94
196
|
}, []);
|
|
95
197
|
const getConfigForClient = useCallback(
|
|
96
198
|
(clientId) => {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
199
|
+
try {
|
|
200
|
+
const builder = registry.createBuilder(clientId);
|
|
201
|
+
const clientConfig = builder.buildConfiguration({
|
|
202
|
+
transport: "http",
|
|
203
|
+
serverUrl: config.serverUrl,
|
|
204
|
+
serverName: config.serverName
|
|
205
|
+
});
|
|
206
|
+
return JSON.stringify(clientConfig, null, 2);
|
|
207
|
+
} catch {
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
104
210
|
},
|
|
105
211
|
[registry, config.serverUrl, config.serverName]
|
|
106
212
|
);
|
|
107
213
|
const getCommandForClient = useCallback(
|
|
108
214
|
(clientId) => {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
215
|
+
try {
|
|
216
|
+
const builder = registry.createBuilder(clientId);
|
|
217
|
+
const cliStatus = builder.supportsCliInstallation();
|
|
218
|
+
if (!cliStatus.supported) {
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
return builder.buildCommand({
|
|
222
|
+
transport: "http",
|
|
223
|
+
serverUrl: config.serverUrl,
|
|
224
|
+
serverName: config.serverName
|
|
225
|
+
});
|
|
226
|
+
} catch {
|
|
112
227
|
return null;
|
|
113
228
|
}
|
|
114
|
-
return builder.buildCommand({
|
|
115
|
-
transport: "http",
|
|
116
|
-
serverUrl: config.serverUrl,
|
|
117
|
-
serverName: config.serverName
|
|
118
|
-
});
|
|
119
229
|
},
|
|
120
230
|
[registry, config.serverUrl, config.serverName]
|
|
121
231
|
);
|
|
122
|
-
|
|
232
|
+
const dropdownClasses = [
|
|
233
|
+
"dropdown",
|
|
234
|
+
"dropdown--right",
|
|
235
|
+
isOpen ? "dropdown--show" : "",
|
|
236
|
+
"mcp-install-dropdown",
|
|
237
|
+
className
|
|
238
|
+
].filter(Boolean).join(" ");
|
|
239
|
+
return /* @__PURE__ */ jsxs("div", { ref: dropdownRef, className: dropdownClasses, children: [
|
|
123
240
|
/* @__PURE__ */ jsxs(
|
|
124
241
|
"button",
|
|
125
242
|
{
|
|
243
|
+
className: "button button--primary mcp-install-dropdown__button",
|
|
126
244
|
onClick: () => setIsOpen(!isOpen),
|
|
127
|
-
style: styles.button,
|
|
128
245
|
"aria-expanded": isOpen,
|
|
129
246
|
"aria-haspopup": "true",
|
|
130
247
|
children: [
|
|
131
|
-
|
|
132
|
-
/* @__PURE__ */ jsx("span", {
|
|
248
|
+
/* @__PURE__ */ jsx(IconMcp, { size: 16 }),
|
|
249
|
+
/* @__PURE__ */ jsx("span", { children: label }),
|
|
250
|
+
/* @__PURE__ */ jsx(IconChevron, { isOpen })
|
|
133
251
|
]
|
|
134
252
|
}
|
|
135
253
|
),
|
|
136
|
-
|
|
137
|
-
/* @__PURE__ */ jsx("
|
|
254
|
+
/* @__PURE__ */ jsxs("ul", { className: "dropdown__menu mcp-install-dropdown__menu", children: [
|
|
255
|
+
/* @__PURE__ */ jsx("li", { className: "mcp-install-dropdown__header", children: "Choose your AI tool:" }),
|
|
138
256
|
clientConfigs.map((client) => {
|
|
139
257
|
const command = getCommandForClient(client.id);
|
|
140
|
-
const
|
|
258
|
+
const clientConfig = getConfigForClient(client.id);
|
|
141
259
|
const isCopied = copiedClient === client.id;
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
onClick: () => copyToClipboard(command, client.id),
|
|
150
|
-
style: styles.copyButton,
|
|
151
|
-
title: "Copy to clipboard",
|
|
152
|
-
children: isCopied ? "\u2713" : "\u{1F4CB}"
|
|
153
|
-
}
|
|
154
|
-
)
|
|
155
|
-
] }) : /* @__PURE__ */ jsxs("div", { style: styles.codeBlock, children: [
|
|
156
|
-
/* @__PURE__ */ jsx("pre", { style: styles.pre, children: /* @__PURE__ */ jsx("code", { style: styles.code, children: config2 }) }),
|
|
157
|
-
/* @__PURE__ */ jsx(
|
|
158
|
-
"button",
|
|
159
|
-
{
|
|
160
|
-
onClick: () => copyToClipboard(config2, client.id),
|
|
161
|
-
style: styles.copyButton,
|
|
162
|
-
title: "Copy to clipboard",
|
|
163
|
-
children: isCopied ? "\u2713" : "\u{1F4CB}"
|
|
164
|
-
}
|
|
165
|
-
)
|
|
260
|
+
if (!command && !clientConfig) {
|
|
261
|
+
return null;
|
|
262
|
+
}
|
|
263
|
+
return /* @__PURE__ */ jsxs("li", { className: "mcp-install-dropdown__item", children: [
|
|
264
|
+
/* @__PURE__ */ jsxs("div", { className: "mcp-install-dropdown__client-header", children: [
|
|
265
|
+
/* @__PURE__ */ jsx("span", { className: "mcp-install-dropdown__client-name", children: client.displayName }),
|
|
266
|
+
command && /* @__PURE__ */ jsx("span", { className: "badge badge--success", children: "CLI" })
|
|
166
267
|
] }),
|
|
167
|
-
|
|
268
|
+
command ? /* @__PURE__ */ jsx(
|
|
269
|
+
CodeBlock,
|
|
270
|
+
{
|
|
271
|
+
code: command,
|
|
272
|
+
isCopied,
|
|
273
|
+
onCopy: () => copyToClipboard(command, client.id)
|
|
274
|
+
}
|
|
275
|
+
) : clientConfig ? /* @__PURE__ */ jsx(
|
|
276
|
+
CodeBlock,
|
|
277
|
+
{
|
|
278
|
+
code: clientConfig,
|
|
279
|
+
isMultiline: true,
|
|
280
|
+
isCopied,
|
|
281
|
+
onCopy: () => copyToClipboard(clientConfig, client.id)
|
|
282
|
+
}
|
|
283
|
+
) : null,
|
|
284
|
+
client.localConfigNotes && /* @__PURE__ */ jsx("p", { className: "mcp-install-dropdown__notes", children: client.localConfigNotes })
|
|
168
285
|
] }, client.id);
|
|
169
286
|
}),
|
|
170
|
-
/* @__PURE__ */ jsx("
|
|
287
|
+
/* @__PURE__ */ jsx("li", { className: "mcp-install-dropdown__footer", children: /* @__PURE__ */ jsxs(
|
|
171
288
|
"a",
|
|
172
289
|
{
|
|
173
290
|
href: "https://modelcontextprotocol.io/",
|
|
174
291
|
target: "_blank",
|
|
175
292
|
rel: "noopener noreferrer",
|
|
176
|
-
|
|
177
|
-
children:
|
|
293
|
+
className: "mcp-install-dropdown__learn-more",
|
|
294
|
+
children: [
|
|
295
|
+
"Learn more about MCP",
|
|
296
|
+
/* @__PURE__ */ jsx(IconExternalLink, {})
|
|
297
|
+
]
|
|
178
298
|
}
|
|
179
299
|
) })
|
|
180
|
-
] })
|
|
300
|
+
] }),
|
|
301
|
+
/* @__PURE__ */ jsx("style", { children: `
|
|
302
|
+
.mcp-install-dropdown {
|
|
303
|
+
--mcp-dropdown-width: 520px;
|
|
304
|
+
/* Always use dark code blocks for consistency across themes */
|
|
305
|
+
--mcp-code-bg: #1e1e1e;
|
|
306
|
+
--mcp-code-color: #e5e7eb;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
.mcp-install-dropdown__button {
|
|
310
|
+
display: inline-flex;
|
|
311
|
+
align-items: center;
|
|
312
|
+
gap: 0.5rem;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
.mcp-install-dropdown__menu {
|
|
316
|
+
width: var(--mcp-dropdown-width);
|
|
317
|
+
padding: 0;
|
|
318
|
+
top: calc(100% + 0.25rem);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
.mcp-install-dropdown__header {
|
|
322
|
+
padding: 0.75rem 1rem;
|
|
323
|
+
font-size: var(--ifm-font-size-small);
|
|
324
|
+
font-weight: var(--ifm-font-weight-semibold);
|
|
325
|
+
color: var(--ifm-color-secondary-darkest);
|
|
326
|
+
background-color: var(--ifm-background-color);
|
|
327
|
+
border-bottom: 1px solid var(--ifm-toc-border-color);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
.mcp-install-dropdown__item {
|
|
331
|
+
padding: 0.875rem 1rem;
|
|
332
|
+
border-bottom: 1px solid var(--ifm-toc-border-color);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
.mcp-install-dropdown__client-header {
|
|
336
|
+
display: flex;
|
|
337
|
+
align-items: center;
|
|
338
|
+
gap: 0.5rem;
|
|
339
|
+
margin-bottom: 0.625rem;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
.mcp-install-dropdown__client-name {
|
|
343
|
+
font-weight: var(--ifm-font-weight-semibold);
|
|
344
|
+
color: var(--ifm-font-color-base);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
.mcp-install-dropdown__notes {
|
|
348
|
+
margin: 0.5rem 0 0;
|
|
349
|
+
font-size: var(--ifm-font-size-small);
|
|
350
|
+
color: var(--ifm-color-secondary-darkest);
|
|
351
|
+
line-height: 1.4;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
.mcp-install-dropdown__footer {
|
|
355
|
+
padding: 0.75rem 1rem;
|
|
356
|
+
text-align: center;
|
|
357
|
+
background-color: var(--ifm-background-color);
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
.mcp-install-dropdown__learn-more {
|
|
361
|
+
display: inline-flex;
|
|
362
|
+
align-items: center;
|
|
363
|
+
font-size: var(--ifm-font-size-small);
|
|
364
|
+
font-weight: var(--ifm-font-weight-semibold);
|
|
365
|
+
color: var(--ifm-color-primary);
|
|
366
|
+
text-decoration: none;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
.mcp-install-dropdown__learn-more:hover {
|
|
370
|
+
color: var(--ifm-color-primary-dark);
|
|
371
|
+
text-decoration: none;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/* Code block styles */
|
|
375
|
+
.mcp-code-block {
|
|
376
|
+
display: flex;
|
|
377
|
+
border-radius: var(--ifm-code-border-radius, 0.25rem);
|
|
378
|
+
overflow: hidden;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
.mcp-code-block__content {
|
|
382
|
+
flex: 1;
|
|
383
|
+
background-color: var(--mcp-code-bg);
|
|
384
|
+
padding: 0.75rem 1rem;
|
|
385
|
+
overflow-x: auto;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
.mcp-code-block__content code {
|
|
389
|
+
font-family: var(--ifm-font-family-monospace);
|
|
390
|
+
font-size: var(--ifm-code-font-size);
|
|
391
|
+
color: var(--mcp-code-color);
|
|
392
|
+
background: none;
|
|
393
|
+
padding: 0;
|
|
394
|
+
border: none;
|
|
395
|
+
white-space: nowrap;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
.mcp-code-block__pre {
|
|
399
|
+
margin: 0;
|
|
400
|
+
background: none;
|
|
401
|
+
max-height: 120px;
|
|
402
|
+
overflow-y: auto;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
.mcp-code-block__pre code {
|
|
406
|
+
white-space: pre;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
.mcp-code-block__copy {
|
|
410
|
+
display: flex;
|
|
411
|
+
align-items: center;
|
|
412
|
+
justify-content: center;
|
|
413
|
+
width: 2.75rem;
|
|
414
|
+
background-color: var(--ifm-color-gray-800, #374151);
|
|
415
|
+
border: none;
|
|
416
|
+
cursor: pointer;
|
|
417
|
+
color: var(--ifm-color-gray-400, #9ca3af);
|
|
418
|
+
transition: background-color var(--ifm-transition-fast);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
.mcp-code-block__copy:hover {
|
|
422
|
+
background-color: var(--ifm-color-gray-700, #4b5563);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
.mcp-code-block__icon {
|
|
426
|
+
width: 16px;
|
|
427
|
+
height: 16px;
|
|
428
|
+
display: block;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
.mcp-code-block__icon--success {
|
|
432
|
+
color: var(--ifm-color-success, #22c55e);
|
|
433
|
+
}
|
|
434
|
+
` })
|
|
181
435
|
] });
|
|
182
436
|
}
|
|
183
|
-
var styles = {
|
|
184
|
-
container: {
|
|
185
|
-
position: "relative",
|
|
186
|
-
display: "inline-block"
|
|
187
|
-
},
|
|
188
|
-
button: {
|
|
189
|
-
display: "inline-flex",
|
|
190
|
-
alignItems: "center",
|
|
191
|
-
gap: "6px",
|
|
192
|
-
padding: "8px 16px",
|
|
193
|
-
fontSize: "14px",
|
|
194
|
-
fontWeight: 500,
|
|
195
|
-
color: "#fff",
|
|
196
|
-
backgroundColor: "#5B4DC7",
|
|
197
|
-
border: "none",
|
|
198
|
-
borderRadius: "6px",
|
|
199
|
-
cursor: "pointer",
|
|
200
|
-
transition: "background-color 0.2s"
|
|
201
|
-
},
|
|
202
|
-
caret: {
|
|
203
|
-
fontSize: "10px"
|
|
204
|
-
},
|
|
205
|
-
dropdown: {
|
|
206
|
-
position: "absolute",
|
|
207
|
-
top: "100%",
|
|
208
|
-
right: 0,
|
|
209
|
-
marginTop: "8px",
|
|
210
|
-
width: "380px",
|
|
211
|
-
maxHeight: "70vh",
|
|
212
|
-
overflowY: "auto",
|
|
213
|
-
backgroundColor: "#fff",
|
|
214
|
-
borderRadius: "8px",
|
|
215
|
-
boxShadow: "0 4px 20px rgba(0, 0, 0, 0.15)",
|
|
216
|
-
zIndex: 1e3
|
|
217
|
-
},
|
|
218
|
-
dropdownHeader: {
|
|
219
|
-
padding: "12px 16px",
|
|
220
|
-
fontSize: "13px",
|
|
221
|
-
fontWeight: 600,
|
|
222
|
-
color: "#666",
|
|
223
|
-
borderBottom: "1px solid #eee"
|
|
224
|
-
},
|
|
225
|
-
clientSection: {
|
|
226
|
-
padding: "12px 16px",
|
|
227
|
-
borderBottom: "1px solid #eee"
|
|
228
|
-
},
|
|
229
|
-
clientHeader: {
|
|
230
|
-
display: "flex",
|
|
231
|
-
alignItems: "center",
|
|
232
|
-
marginBottom: "8px"
|
|
233
|
-
},
|
|
234
|
-
clientName: {
|
|
235
|
-
fontSize: "14px",
|
|
236
|
-
fontWeight: 600,
|
|
237
|
-
color: "#333"
|
|
238
|
-
},
|
|
239
|
-
codeBlock: {
|
|
240
|
-
position: "relative",
|
|
241
|
-
backgroundColor: "#f6f8fa",
|
|
242
|
-
borderRadius: "6px",
|
|
243
|
-
padding: "10px 40px 10px 12px"
|
|
244
|
-
},
|
|
245
|
-
pre: {
|
|
246
|
-
margin: 0,
|
|
247
|
-
fontSize: "12px",
|
|
248
|
-
lineHeight: 1.4,
|
|
249
|
-
overflow: "auto",
|
|
250
|
-
maxHeight: "120px"
|
|
251
|
-
},
|
|
252
|
-
code: {
|
|
253
|
-
fontFamily: "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace",
|
|
254
|
-
fontSize: "12px",
|
|
255
|
-
color: "#24292f",
|
|
256
|
-
whiteSpace: "pre-wrap",
|
|
257
|
-
wordBreak: "break-all"
|
|
258
|
-
},
|
|
259
|
-
copyButton: {
|
|
260
|
-
position: "absolute",
|
|
261
|
-
top: "8px",
|
|
262
|
-
right: "8px",
|
|
263
|
-
padding: "4px 8px",
|
|
264
|
-
fontSize: "14px",
|
|
265
|
-
backgroundColor: "transparent",
|
|
266
|
-
border: "none",
|
|
267
|
-
cursor: "pointer",
|
|
268
|
-
opacity: 0.6,
|
|
269
|
-
transition: "opacity 0.2s"
|
|
270
|
-
},
|
|
271
|
-
notes: {
|
|
272
|
-
marginTop: "8px",
|
|
273
|
-
fontSize: "11px",
|
|
274
|
-
color: "#666",
|
|
275
|
-
fontStyle: "italic"
|
|
276
|
-
},
|
|
277
|
-
footer: {
|
|
278
|
-
padding: "12px 16px",
|
|
279
|
-
textAlign: "center"
|
|
280
|
-
},
|
|
281
|
-
learnMore: {
|
|
282
|
-
fontSize: "12px",
|
|
283
|
-
color: "#5B4DC7",
|
|
284
|
-
textDecoration: "none"
|
|
285
|
-
}
|
|
286
|
-
};
|
|
287
437
|
var McpInstallButton_default = McpInstallButton;
|
|
288
438
|
|
|
289
439
|
export { McpInstallButton, createDocsRegistry, createDocsRegistryOptions, McpInstallButton_default as default, useMcpRegistry };
|