docusaurus-plugin-mcp-server 0.5.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/theme/McpRegistryContext.tsx","../../src/theme/McpInstallButton.tsx"],"names":["useMemo","MCPConfigRegistry","config"],"mappings":"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","file":"index.mjs","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"]}
package/package.json ADDED
@@ -0,0 +1,145 @@
1
+ {
2
+ "name": "docusaurus-plugin-mcp-server",
3
+ "version": "0.5.0",
4
+ "description": "A Docusaurus plugin that exposes an MCP server endpoint for AI agents to search and retrieve documentation",
5
+ "keywords": [
6
+ "docusaurus",
7
+ "docusaurus-plugin",
8
+ "mcp",
9
+ "model-context-protocol",
10
+ "documentation",
11
+ "ai",
12
+ "search",
13
+ "llm",
14
+ "claude",
15
+ "cursor"
16
+ ],
17
+ "homepage": "https://github.com/scalvert/docusaurus-plugin-mcp-server#readme",
18
+ "bugs": {
19
+ "url": "https://github.com/scalvert/docusaurus-plugin-mcp-server/issues"
20
+ },
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "https://github.com/scalvert/docusaurus-plugin-mcp-server.git"
24
+ },
25
+ "license": "MIT",
26
+ "author": "Steve Calvert",
27
+ "exports": {
28
+ ".": {
29
+ "types": "./dist/index.d.ts",
30
+ "import": "./dist/index.mjs",
31
+ "require": "./dist/index.js"
32
+ },
33
+ "./adapters": {
34
+ "types": "./dist/adapters-entry.d.ts",
35
+ "import": "./dist/adapters-entry.mjs",
36
+ "require": "./dist/adapters-entry.js"
37
+ },
38
+ "./theme": {
39
+ "types": "./dist/theme/index.d.ts",
40
+ "import": "./dist/theme/index.mjs",
41
+ "require": "./dist/theme/index.js"
42
+ }
43
+ },
44
+ "main": "./dist/index.js",
45
+ "module": "./dist/index.mjs",
46
+ "types": "./dist/index.d.ts",
47
+ "bin": {
48
+ "docusaurus-mcp-verify": "./dist/cli/verify.mjs"
49
+ },
50
+ "files": [
51
+ "dist"
52
+ ],
53
+ "scripts": {
54
+ "build": "tsup",
55
+ "dev": "tsup --watch",
56
+ "format": "prettier --write .",
57
+ "lint": "eslint src/ tests/ && prettier --check .",
58
+ "lint:fix": "eslint src/ tests/ --fix && prettier --write .",
59
+ "prepublishOnly": "npm run build",
60
+ "test": "vitest run",
61
+ "test:all": "npm run lint && npm run typecheck && npm run test && npm run test:mcp",
62
+ "test:coverage": "vitest run --coverage",
63
+ "test:mcp": "playwright test",
64
+ "test:watch": "vitest",
65
+ "typecheck": "tsc --noEmit"
66
+ },
67
+ "dependencies": {
68
+ "@gleanwork/mcp-config-schema": "^4.1.0",
69
+ "@modelcontextprotocol/sdk": "^1.0.0",
70
+ "flexsearch": "^0.7.43",
71
+ "fs-extra": "^11.0.0",
72
+ "hast-util-select": "^6.0.0",
73
+ "hast-util-to-string": "^3.0.0",
74
+ "p-map": "^7.0.0",
75
+ "rehype-parse": "^9.0.0",
76
+ "rehype-remark": "^10.0.0",
77
+ "remark-gfm": "^4.0.0",
78
+ "remark-stringify": "^11.0.0",
79
+ "unified": "^11.0.0"
80
+ },
81
+ "devDependencies": {
82
+ "@docusaurus/core": "^3.9.2",
83
+ "@docusaurus/types": "^3.9.2",
84
+ "@eslint/js": "^9.39.2",
85
+ "@gleanwork/mcp-server-tester": "^0.12.0",
86
+ "@playwright/test": "^1.58.0",
87
+ "@release-it-plugins/lerna-changelog": "^8.0.1",
88
+ "@types/fs-extra": "^11.0.0",
89
+ "@types/node": "^20.0.0",
90
+ "@types/react": "^18.0.0",
91
+ "@types/react-dom": "^18.0.0",
92
+ "@vitest/coverage-v8": "^4.0.18",
93
+ "eslint": "^9.39.2",
94
+ "globals": "^17.1.0",
95
+ "prettier": "^3.0.0",
96
+ "release-it": "^19.2.4",
97
+ "tsup": "^8.0.0",
98
+ "typescript": "^5.0.0",
99
+ "typescript-eslint": "^8.53.1",
100
+ "vitest": "^4.0.18",
101
+ "zod": "^4.3.6"
102
+ },
103
+ "peerDependencies": {
104
+ "@docusaurus/core": "^3.0.0",
105
+ "@docusaurus/types": "^3.0.0",
106
+ "react": "^18.0.0 || ^19.0.0",
107
+ "react-dom": "^18.0.0 || ^19.0.0",
108
+ "zod": "^3.0.0 || ^4.0.0"
109
+ },
110
+ "peerDependenciesMeta": {
111
+ "@docusaurus/core": {
112
+ "optional": true
113
+ },
114
+ "react": {
115
+ "optional": true
116
+ },
117
+ "react-dom": {
118
+ "optional": true
119
+ },
120
+ "zod": {
121
+ "optional": true
122
+ }
123
+ },
124
+ "engines": {
125
+ "node": ">=20.0.0"
126
+ },
127
+ "publishConfig": {
128
+ "registry": "https://registry.npmjs.org"
129
+ },
130
+ "release-it": {
131
+ "plugins": {
132
+ "@release-it-plugins/lerna-changelog": {
133
+ "infile": "CHANGELOG.md",
134
+ "launchEditor": true
135
+ }
136
+ },
137
+ "git": {
138
+ "tagName": "v${version}"
139
+ },
140
+ "github": {
141
+ "release": true,
142
+ "tokenRef": "GITHUB_AUTH"
143
+ }
144
+ }
145
+ }