docusaurus-plugin-mcp-server 0.10.0 → 0.10.2

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.
@@ -1,16 +1,9 @@
1
- 'use strict';
2
-
3
- var react = require('react');
4
- var browser = require('@gleanwork/mcp-config-schema/browser');
5
- var IconCopy = require('@theme/Icon/Copy');
6
- var IconSuccess = require('@theme/Icon/Success');
7
- var useGlobalData = require('@docusaurus/useGlobalData');
8
- var jsxRuntime = require('react/jsx-runtime');
9
-
10
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
-
12
- var IconCopy__default = /*#__PURE__*/_interopDefault(IconCopy);
13
- var IconSuccess__default = /*#__PURE__*/_interopDefault(IconSuccess);
1
+ import { useMemo, useState, useRef, useEffect, useCallback } from 'react';
2
+ import { MCPConfigRegistry } from '@gleanwork/mcp-config-schema/browser';
3
+ import IconCopy from '@theme/Icon/Copy';
4
+ import IconSuccess from '@theme/Icon/Success';
5
+ import { usePluginData } from '@docusaurus/useGlobalData';
6
+ import { jsxs, jsx } from 'react/jsx-runtime';
14
7
 
15
8
  // src/theme/McpInstallButton.tsx
16
9
  function createDocsRegistryOptions(config) {
@@ -22,18 +15,18 @@ function createDocsRegistryOptions(config) {
22
15
  function createDocsRegistry(config) {
23
16
  const options = createDocsRegistryOptions(config);
24
17
  return {
25
- registry: new browser.MCPConfigRegistry(options),
18
+ registry: new MCPConfigRegistry(options),
26
19
  config
27
20
  };
28
21
  }
29
22
  function useMcpRegistry() {
30
23
  let pluginData;
31
24
  try {
32
- pluginData = useGlobalData.usePluginData("docusaurus-plugin-mcp-server");
25
+ pluginData = usePluginData("docusaurus-plugin-mcp-server");
33
26
  } catch {
34
27
  return void 0;
35
28
  }
36
- const result = react.useMemo(() => {
29
+ const result = useMemo(() => {
37
30
  if (!pluginData?.serverUrl || !pluginData?.serverName) {
38
31
  return void 0;
39
32
  }
@@ -46,7 +39,7 @@ function useMcpRegistry() {
46
39
  return result;
47
40
  }
48
41
  function IconMcp({ size = 16 }) {
49
- return /* @__PURE__ */ jsxRuntime.jsxs(
42
+ return /* @__PURE__ */ jsxs(
50
43
  "svg",
51
44
  {
52
45
  viewBox: "0 0 170 195",
@@ -56,7 +49,7 @@ function IconMcp({ size = 16 }) {
56
49
  xmlns: "http://www.w3.org/2000/svg",
57
50
  style: { display: "block" },
58
51
  children: [
59
- /* @__PURE__ */ jsxRuntime.jsx(
52
+ /* @__PURE__ */ jsx(
60
53
  "path",
61
54
  {
62
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",
@@ -65,7 +58,7 @@ function IconMcp({ size = 16 }) {
65
58
  strokeLinecap: "round"
66
59
  }
67
60
  ),
68
- /* @__PURE__ */ jsxRuntime.jsx(
61
+ /* @__PURE__ */ jsx(
69
62
  "path",
70
63
  {
71
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",
@@ -74,7 +67,7 @@ function IconMcp({ size = 16 }) {
74
67
  strokeLinecap: "round"
75
68
  }
76
69
  ),
77
- /* @__PURE__ */ jsxRuntime.jsx(
70
+ /* @__PURE__ */ jsx(
78
71
  "path",
79
72
  {
80
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",
@@ -88,7 +81,7 @@ function IconMcp({ size = 16 }) {
88
81
  );
89
82
  }
90
83
  function IconChevron({ isOpen }) {
91
- return /* @__PURE__ */ jsxRuntime.jsx(
84
+ return /* @__PURE__ */ jsx(
92
85
  "svg",
93
86
  {
94
87
  width: "12",
@@ -99,7 +92,7 @@ function IconChevron({ isOpen }) {
99
92
  transform: isOpen ? "rotate(180deg)" : "rotate(0deg)",
100
93
  transition: "transform var(--ifm-transition-fast)"
101
94
  },
102
- children: /* @__PURE__ */ jsxRuntime.jsx(
95
+ children: /* @__PURE__ */ jsx(
103
96
  "path",
104
97
  {
105
98
  d: "M2.5 4.5L6 8L9.5 4.5",
@@ -114,7 +107,7 @@ function IconChevron({ isOpen }) {
114
107
  );
115
108
  }
116
109
  function IconExternalLink() {
117
- return /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "12", height: "12", viewBox: "0 0 12 12", style: { display: "block", marginLeft: "4px" }, children: /* @__PURE__ */ jsxRuntime.jsx(
110
+ return /* @__PURE__ */ jsx("svg", { width: "12", height: "12", viewBox: "0 0 12 12", style: { display: "block", marginLeft: "4px" }, children: /* @__PURE__ */ jsx(
118
111
  "path",
119
112
  {
120
113
  fill: "currentColor",
@@ -128,16 +121,16 @@ function CodeBlock({
128
121
  isCopied,
129
122
  onCopy
130
123
  }) {
131
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mcp-code-block", children: [
132
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mcp-code-block__content", children: isMultiline ? /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "mcp-code-block__pre", children: /* @__PURE__ */ jsxRuntime.jsx("code", { children: code }) }) : /* @__PURE__ */ jsxRuntime.jsx("code", { children: code }) }),
133
- /* @__PURE__ */ jsxRuntime.jsx(
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(
134
127
  "button",
135
128
  {
136
129
  className: "mcp-code-block__copy",
137
130
  onClick: onCopy,
138
131
  title: isCopied ? "Copied!" : "Copy to clipboard",
139
132
  "aria-label": isCopied ? "Copied" : "Copy to clipboard",
140
- children: isCopied ? /* @__PURE__ */ jsxRuntime.jsx(IconSuccess__default.default, { className: "mcp-code-block__icon mcp-code-block__icon--success" }) : /* @__PURE__ */ jsxRuntime.jsx(IconCopy__default.default, { className: "mcp-code-block__icon" })
133
+ children: isCopied ? /* @__PURE__ */ jsx(IconSuccess, { className: "mcp-code-block__icon mcp-code-block__icon--success" }) : /* @__PURE__ */ jsx(IconCopy, { className: "mcp-code-block__icon" })
141
134
  }
142
135
  )
143
136
  ] });
@@ -150,11 +143,11 @@ function McpInstallButton({
150
143
  clients: clientsProp,
151
144
  headerText = "Choose your AI tool:"
152
145
  }) {
153
- const [isOpen, setIsOpen] = react.useState(false);
154
- const [copiedClient, setCopiedClient] = react.useState(null);
155
- const dropdownRef = react.useRef(null);
146
+ const [isOpen, setIsOpen] = useState(false);
147
+ const [copiedClient, setCopiedClient] = useState(null);
148
+ const dropdownRef = useRef(null);
156
149
  const pluginMcp = useMcpRegistry();
157
- const { registry, config } = react.useMemo(() => {
150
+ const { registry, config } = useMemo(() => {
158
151
  if (serverUrlProp && serverNameProp) {
159
152
  return createDocsRegistry({
160
153
  serverUrl: serverUrlProp,
@@ -165,11 +158,11 @@ function McpInstallButton({
165
158
  return pluginMcp;
166
159
  }
167
160
  return {
168
- registry: new browser.MCPConfigRegistry(),
161
+ registry: new MCPConfigRegistry(),
169
162
  config: { serverUrl: "", serverName: "" }
170
163
  };
171
164
  }, [serverUrlProp, serverNameProp, pluginMcp]);
172
- react.useEffect(() => {
165
+ useEffect(() => {
173
166
  function handleClickOutside(event) {
174
167
  if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
175
168
  setIsOpen(false);
@@ -184,7 +177,7 @@ function McpInstallButton({
184
177
  );
185
178
  return null;
186
179
  }
187
- const clientConfigs = react.useMemo(() => {
180
+ const clientConfigs = useMemo(() => {
188
181
  let clients;
189
182
  if (clientsProp) {
190
183
  clients = clientsProp.map((id) => registry.getConfig(id)).filter((c) => c !== void 0);
@@ -193,7 +186,7 @@ function McpInstallButton({
193
186
  }
194
187
  return clients.sort((a, b) => a.displayName.localeCompare(b.displayName));
195
188
  }, [registry, clientsProp]);
196
- const copyToClipboard = react.useCallback(async (text, clientId) => {
189
+ const copyToClipboard = useCallback(async (text, clientId) => {
197
190
  try {
198
191
  await navigator.clipboard.writeText(text);
199
192
  setCopiedClient(clientId);
@@ -202,7 +195,7 @@ function McpInstallButton({
202
195
  console.error("Failed to copy:", err);
203
196
  }
204
197
  }, []);
205
- const getConfigForClient = react.useCallback(
198
+ const getConfigForClient = useCallback(
206
199
  (clientId) => {
207
200
  try {
208
201
  const builder = registry.createBuilder(clientId);
@@ -218,7 +211,7 @@ function McpInstallButton({
218
211
  },
219
212
  [registry, config.serverUrl, config.serverName]
220
213
  );
221
- const getCommandForClient = react.useCallback(
214
+ const getCommandForClient = useCallback(
222
215
  (clientId) => {
223
216
  try {
224
217
  const builder = registry.createBuilder(clientId);
@@ -244,8 +237,8 @@ function McpInstallButton({
244
237
  "mcp-install-dropdown",
245
238
  className
246
239
  ].filter(Boolean).join(" ");
247
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: dropdownRef, className: dropdownClasses, children: [
248
- /* @__PURE__ */ jsxRuntime.jsxs(
240
+ return /* @__PURE__ */ jsxs("div", { ref: dropdownRef, className: dropdownClasses, children: [
241
+ /* @__PURE__ */ jsxs(
249
242
  "button",
250
243
  {
251
244
  className: `button button--primary mcp-install-dropdown__button${label ? "" : " mcp-install-dropdown__button--icon-only"}`,
@@ -254,14 +247,14 @@ function McpInstallButton({
254
247
  "aria-haspopup": "true",
255
248
  "aria-label": label || "Install MCP",
256
249
  children: [
257
- /* @__PURE__ */ jsxRuntime.jsx(IconMcp, { size: 16 }),
258
- label && /* @__PURE__ */ jsxRuntime.jsx("span", { children: label }),
259
- /* @__PURE__ */ jsxRuntime.jsx(IconChevron, { isOpen })
250
+ /* @__PURE__ */ jsx(IconMcp, { size: 16 }),
251
+ label && /* @__PURE__ */ jsx("span", { children: label }),
252
+ /* @__PURE__ */ jsx(IconChevron, { isOpen })
260
253
  ]
261
254
  }
262
255
  ),
263
- /* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "dropdown__menu mcp-install-dropdown__menu", children: [
264
- /* @__PURE__ */ jsxRuntime.jsx("li", { className: "mcp-install-dropdown__header", children: headerText }),
256
+ /* @__PURE__ */ jsxs("ul", { className: "dropdown__menu mcp-install-dropdown__menu", children: [
257
+ /* @__PURE__ */ jsx("li", { className: "mcp-install-dropdown__header", children: headerText }),
265
258
  clientConfigs.map((client) => {
266
259
  const command = getCommandForClient(client.id);
267
260
  const clientConfig = getConfigForClient(client.id);
@@ -269,19 +262,19 @@ function McpInstallButton({
269
262
  if (!command && !clientConfig) {
270
263
  return null;
271
264
  }
272
- return /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "mcp-install-dropdown__item", children: [
273
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mcp-install-dropdown__client-header", children: [
274
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mcp-install-dropdown__client-name", children: client.displayName }),
275
- command && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "badge badge--success", children: "CLI" })
265
+ return /* @__PURE__ */ jsxs("li", { className: "mcp-install-dropdown__item", children: [
266
+ /* @__PURE__ */ jsxs("div", { className: "mcp-install-dropdown__client-header", children: [
267
+ /* @__PURE__ */ jsx("span", { className: "mcp-install-dropdown__client-name", children: client.displayName }),
268
+ command && /* @__PURE__ */ jsx("span", { className: "badge badge--success", children: "CLI" })
276
269
  ] }),
277
- command ? /* @__PURE__ */ jsxRuntime.jsx(
270
+ command ? /* @__PURE__ */ jsx(
278
271
  CodeBlock,
279
272
  {
280
273
  code: command,
281
274
  isCopied,
282
275
  onCopy: () => copyToClipboard(command, client.id)
283
276
  }
284
- ) : clientConfig ? /* @__PURE__ */ jsxRuntime.jsx(
277
+ ) : clientConfig ? /* @__PURE__ */ jsx(
285
278
  CodeBlock,
286
279
  {
287
280
  code: clientConfig,
@@ -290,10 +283,10 @@ function McpInstallButton({
290
283
  onCopy: () => copyToClipboard(clientConfig, client.id)
291
284
  }
292
285
  ) : null,
293
- client.localConfigNotes && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mcp-install-dropdown__notes", children: client.localConfigNotes })
286
+ client.localConfigNotes && /* @__PURE__ */ jsx("p", { className: "mcp-install-dropdown__notes", children: client.localConfigNotes })
294
287
  ] }, client.id);
295
288
  }),
296
- /* @__PURE__ */ jsxRuntime.jsx("li", { className: "mcp-install-dropdown__footer", children: /* @__PURE__ */ jsxRuntime.jsxs(
289
+ /* @__PURE__ */ jsx("li", { className: "mcp-install-dropdown__footer", children: /* @__PURE__ */ jsxs(
297
290
  "a",
298
291
  {
299
292
  href: "https://modelcontextprotocol.io/",
@@ -302,12 +295,12 @@ function McpInstallButton({
302
295
  className: "mcp-install-dropdown__learn-more",
303
296
  children: [
304
297
  "Learn more about MCP",
305
- /* @__PURE__ */ jsxRuntime.jsx(IconExternalLink, {})
298
+ /* @__PURE__ */ jsx(IconExternalLink, {})
306
299
  ]
307
300
  }
308
301
  ) })
309
302
  ] }),
310
- /* @__PURE__ */ jsxRuntime.jsx("style", { children: `
303
+ /* @__PURE__ */ jsx("style", { children: `
311
304
  .mcp-install-dropdown__button {
312
305
  display: inline-flex;
313
306
  align-items: center;
@@ -442,9 +435,6 @@ function McpInstallButton({
442
435
  ] });
443
436
  }
444
437
 
445
- exports.McpInstallButton = McpInstallButton;
446
- exports.createDocsRegistry = createDocsRegistry;
447
- exports.createDocsRegistryOptions = createDocsRegistryOptions;
448
- exports.useMcpRegistry = useMcpRegistry;
438
+ export { McpInstallButton, createDocsRegistry, createDocsRegistryOptions, useMcpRegistry };
449
439
  //# sourceMappingURL=index.js.map
450
440
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
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. If not provided, shows only the MCP icon. */\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 /** Header text shown at top of dropdown (default: \"Choose your AI tool:\") */\n headerText?: string;\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,\n className = '',\n clients: clientsProp,\n headerText = 'Choose your AI tool:',\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${label ? '' : ' mcp-install-dropdown__button--icon-only'}`}\n onClick={() => setIsOpen(!isOpen)}\n aria-expanded={isOpen}\n aria-haspopup=\"true\"\n aria-label={label || 'Install MCP'}\n >\n <IconMcp size={16} />\n {label && <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\">{headerText}</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 Docusaurus/Infima CSS variables */}\n <style>{`\n .mcp-install-dropdown__button {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n .mcp-install-dropdown__button--icon-only {\n padding: 0.5rem 0.75rem;\n gap: 0.25rem;\n }\n\n .mcp-install-dropdown__menu {\n width: 520px;\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-emphasis-700);\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-emphasis-700);\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 - uses Docusaurus pre/code variables */\n .mcp-code-block {\n display: flex;\n border-radius: var(--ifm-code-border-radius);\n overflow: hidden;\n }\n\n .mcp-code-block__content {\n flex: 1;\n background-color: var(--ifm-pre-background);\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(--ifm-pre-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-emphasis-200);\n border: none;\n cursor: pointer;\n color: var(--ifm-color-emphasis-700);\n transition: background-color var(--ifm-transition-fast);\n }\n\n .mcp-code-block__copy:hover {\n background-color: var(--ifm-color-emphasis-300);\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);\n }\n `}</style>\n </div>\n );\n}\n\nexport default McpInstallButton;\n"]}
1
+ {"version":3,"sources":["../../src/theme/McpRegistryContext.tsx","../../src/theme/McpInstallButton.tsx"],"names":["useMemo","MCPConfigRegistry"],"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. If not provided, shows only the MCP icon. */\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 /** Header text shown at top of dropdown (default: \"Choose your AI tool:\") */\n headerText?: string;\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,\n className = '',\n clients: clientsProp,\n headerText = 'Choose your AI tool:',\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${label ? '' : ' mcp-install-dropdown__button--icon-only'}`}\n onClick={() => setIsOpen(!isOpen)}\n aria-expanded={isOpen}\n aria-haspopup=\"true\"\n aria-label={label || 'Install MCP'}\n >\n <IconMcp size={16} />\n {label && <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\">{headerText}</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 Docusaurus/Infima CSS variables */}\n <style>{`\n .mcp-install-dropdown__button {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n .mcp-install-dropdown__button--icon-only {\n padding: 0.5rem 0.75rem;\n gap: 0.25rem;\n }\n\n .mcp-install-dropdown__menu {\n width: 520px;\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-emphasis-700);\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-emphasis-700);\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 - uses Docusaurus pre/code variables */\n .mcp-code-block {\n display: flex;\n border-radius: var(--ifm-code-border-radius);\n overflow: hidden;\n }\n\n .mcp-code-block__content {\n flex: 1;\n background-color: var(--ifm-pre-background);\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(--ifm-pre-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-emphasis-200);\n border: none;\n cursor: pointer;\n color: var(--ifm-color-emphasis-700);\n transition: background-color var(--ifm-transition-fast);\n }\n\n .mcp-code-block__copy:hover {\n background-color: var(--ifm-color-emphasis-300);\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);\n }\n `}</style>\n </div>\n );\n}\n\nexport default McpInstallButton;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "docusaurus-plugin-mcp-server",
3
- "version": "0.10.0",
3
+ "version": "0.10.2",
4
4
  "description": "A Docusaurus plugin that exposes an MCP server endpoint for AI agents to search and retrieve documentation",
5
5
  "keywords": [
6
6
  "docusaurus",
@@ -24,28 +24,29 @@
24
24
  },
25
25
  "license": "MIT",
26
26
  "author": "Steve Calvert",
27
+ "type": "module",
27
28
  "exports": {
28
29
  ".": {
29
30
  "types": "./dist/index.d.ts",
30
- "import": "./dist/index.mjs",
31
- "require": "./dist/index.js"
31
+ "import": "./dist/index.js",
32
+ "default": "./dist/index.js"
32
33
  },
33
34
  "./adapters": {
34
35
  "types": "./dist/adapters-entry.d.ts",
35
- "import": "./dist/adapters-entry.mjs",
36
- "require": "./dist/adapters-entry.js"
36
+ "import": "./dist/adapters-entry.js",
37
+ "default": "./dist/adapters-entry.js"
37
38
  },
38
39
  "./theme": {
39
40
  "types": "./dist/theme/index.d.ts",
40
- "import": "./dist/theme/index.mjs",
41
- "require": "./dist/theme/index.js"
41
+ "import": "./dist/theme/index.js",
42
+ "default": "./dist/theme/index.js"
42
43
  }
43
44
  },
44
45
  "main": "./dist/index.js",
45
- "module": "./dist/index.mjs",
46
+ "module": "./dist/index.js",
46
47
  "types": "./dist/index.d.ts",
47
48
  "bin": {
48
- "docusaurus-mcp-verify": "./dist/cli/verify.mjs"
49
+ "docusaurus-mcp-verify": "./dist/cli/verify.js"
49
50
  },
50
51
  "files": [
51
52
  "dist"