docusaurus-plugin-mcp-server 0.9.0 → 0.10.1

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
  ] });
@@ -145,15 +138,16 @@ function CodeBlock({
145
138
  function McpInstallButton({
146
139
  serverUrl: serverUrlProp,
147
140
  serverName: serverNameProp,
148
- label = "Install docs MCP",
141
+ label,
149
142
  className = "",
150
- clients: clientsProp
143
+ clients: clientsProp,
144
+ headerText = "Choose your AI tool:"
151
145
  }) {
152
- const [isOpen, setIsOpen] = react.useState(false);
153
- const [copiedClient, setCopiedClient] = react.useState(null);
154
- const dropdownRef = react.useRef(null);
146
+ const [isOpen, setIsOpen] = useState(false);
147
+ const [copiedClient, setCopiedClient] = useState(null);
148
+ const dropdownRef = useRef(null);
155
149
  const pluginMcp = useMcpRegistry();
156
- const { registry, config } = react.useMemo(() => {
150
+ const { registry, config } = useMemo(() => {
157
151
  if (serverUrlProp && serverNameProp) {
158
152
  return createDocsRegistry({
159
153
  serverUrl: serverUrlProp,
@@ -164,11 +158,11 @@ function McpInstallButton({
164
158
  return pluginMcp;
165
159
  }
166
160
  return {
167
- registry: new browser.MCPConfigRegistry(),
161
+ registry: new MCPConfigRegistry(),
168
162
  config: { serverUrl: "", serverName: "" }
169
163
  };
170
164
  }, [serverUrlProp, serverNameProp, pluginMcp]);
171
- react.useEffect(() => {
165
+ useEffect(() => {
172
166
  function handleClickOutside(event) {
173
167
  if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
174
168
  setIsOpen(false);
@@ -183,7 +177,7 @@ function McpInstallButton({
183
177
  );
184
178
  return null;
185
179
  }
186
- const clientConfigs = react.useMemo(() => {
180
+ const clientConfigs = useMemo(() => {
187
181
  let clients;
188
182
  if (clientsProp) {
189
183
  clients = clientsProp.map((id) => registry.getConfig(id)).filter((c) => c !== void 0);
@@ -192,7 +186,7 @@ function McpInstallButton({
192
186
  }
193
187
  return clients.sort((a, b) => a.displayName.localeCompare(b.displayName));
194
188
  }, [registry, clientsProp]);
195
- const copyToClipboard = react.useCallback(async (text, clientId) => {
189
+ const copyToClipboard = useCallback(async (text, clientId) => {
196
190
  try {
197
191
  await navigator.clipboard.writeText(text);
198
192
  setCopiedClient(clientId);
@@ -201,7 +195,7 @@ function McpInstallButton({
201
195
  console.error("Failed to copy:", err);
202
196
  }
203
197
  }, []);
204
- const getConfigForClient = react.useCallback(
198
+ const getConfigForClient = useCallback(
205
199
  (clientId) => {
206
200
  try {
207
201
  const builder = registry.createBuilder(clientId);
@@ -217,7 +211,7 @@ function McpInstallButton({
217
211
  },
218
212
  [registry, config.serverUrl, config.serverName]
219
213
  );
220
- const getCommandForClient = react.useCallback(
214
+ const getCommandForClient = useCallback(
221
215
  (clientId) => {
222
216
  try {
223
217
  const builder = registry.createBuilder(clientId);
@@ -243,23 +237,24 @@ function McpInstallButton({
243
237
  "mcp-install-dropdown",
244
238
  className
245
239
  ].filter(Boolean).join(" ");
246
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: dropdownRef, className: dropdownClasses, children: [
247
- /* @__PURE__ */ jsxRuntime.jsxs(
240
+ return /* @__PURE__ */ jsxs("div", { ref: dropdownRef, className: dropdownClasses, children: [
241
+ /* @__PURE__ */ jsxs(
248
242
  "button",
249
243
  {
250
- className: "button button--primary mcp-install-dropdown__button",
244
+ className: `button button--primary mcp-install-dropdown__button${label ? "" : " mcp-install-dropdown__button--icon-only"}`,
251
245
  onClick: () => setIsOpen(!isOpen),
252
246
  "aria-expanded": isOpen,
253
247
  "aria-haspopup": "true",
248
+ "aria-label": label || "Install MCP",
254
249
  children: [
255
- /* @__PURE__ */ jsxRuntime.jsx(IconMcp, { size: 16 }),
256
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: label }),
257
- /* @__PURE__ */ jsxRuntime.jsx(IconChevron, { isOpen })
250
+ /* @__PURE__ */ jsx(IconMcp, { size: 16 }),
251
+ label && /* @__PURE__ */ jsx("span", { children: label }),
252
+ /* @__PURE__ */ jsx(IconChevron, { isOpen })
258
253
  ]
259
254
  }
260
255
  ),
261
- /* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "dropdown__menu mcp-install-dropdown__menu", children: [
262
- /* @__PURE__ */ jsxRuntime.jsx("li", { className: "mcp-install-dropdown__header", children: "Choose your AI tool:" }),
256
+ /* @__PURE__ */ jsxs("ul", { className: "dropdown__menu mcp-install-dropdown__menu", children: [
257
+ /* @__PURE__ */ jsx("li", { className: "mcp-install-dropdown__header", children: headerText }),
263
258
  clientConfigs.map((client) => {
264
259
  const command = getCommandForClient(client.id);
265
260
  const clientConfig = getConfigForClient(client.id);
@@ -267,19 +262,19 @@ function McpInstallButton({
267
262
  if (!command && !clientConfig) {
268
263
  return null;
269
264
  }
270
- return /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "mcp-install-dropdown__item", children: [
271
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mcp-install-dropdown__client-header", children: [
272
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mcp-install-dropdown__client-name", children: client.displayName }),
273
- 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" })
274
269
  ] }),
275
- command ? /* @__PURE__ */ jsxRuntime.jsx(
270
+ command ? /* @__PURE__ */ jsx(
276
271
  CodeBlock,
277
272
  {
278
273
  code: command,
279
274
  isCopied,
280
275
  onCopy: () => copyToClipboard(command, client.id)
281
276
  }
282
- ) : clientConfig ? /* @__PURE__ */ jsxRuntime.jsx(
277
+ ) : clientConfig ? /* @__PURE__ */ jsx(
283
278
  CodeBlock,
284
279
  {
285
280
  code: clientConfig,
@@ -288,10 +283,10 @@ function McpInstallButton({
288
283
  onCopy: () => copyToClipboard(clientConfig, client.id)
289
284
  }
290
285
  ) : null,
291
- 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 })
292
287
  ] }, client.id);
293
288
  }),
294
- /* @__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(
295
290
  "a",
296
291
  {
297
292
  href: "https://modelcontextprotocol.io/",
@@ -300,27 +295,25 @@ function McpInstallButton({
300
295
  className: "mcp-install-dropdown__learn-more",
301
296
  children: [
302
297
  "Learn more about MCP",
303
- /* @__PURE__ */ jsxRuntime.jsx(IconExternalLink, {})
298
+ /* @__PURE__ */ jsx(IconExternalLink, {})
304
299
  ]
305
300
  }
306
301
  ) })
307
302
  ] }),
308
- /* @__PURE__ */ jsxRuntime.jsx("style", { children: `
309
- .mcp-install-dropdown {
310
- --mcp-dropdown-width: 520px;
311
- /* Always use dark code blocks for consistency across themes */
312
- --mcp-code-bg: #1e1e1e;
313
- --mcp-code-color: #e5e7eb;
314
- }
315
-
303
+ /* @__PURE__ */ jsx("style", { children: `
316
304
  .mcp-install-dropdown__button {
317
305
  display: inline-flex;
318
306
  align-items: center;
319
307
  gap: 0.5rem;
320
308
  }
321
309
 
310
+ .mcp-install-dropdown__button--icon-only {
311
+ padding: 0.5rem 0.75rem;
312
+ gap: 0.25rem;
313
+ }
314
+
322
315
  .mcp-install-dropdown__menu {
323
- width: var(--mcp-dropdown-width);
316
+ width: 520px;
324
317
  padding: 0;
325
318
  top: calc(100% + 0.25rem);
326
319
  }
@@ -329,7 +322,7 @@ function McpInstallButton({
329
322
  padding: 0.75rem 1rem;
330
323
  font-size: var(--ifm-font-size-small);
331
324
  font-weight: var(--ifm-font-weight-semibold);
332
- color: var(--ifm-color-secondary-darkest);
325
+ color: var(--ifm-color-emphasis-700);
333
326
  background-color: var(--ifm-background-color);
334
327
  border-bottom: 1px solid var(--ifm-toc-border-color);
335
328
  }
@@ -354,7 +347,7 @@ function McpInstallButton({
354
347
  .mcp-install-dropdown__notes {
355
348
  margin: 0.5rem 0 0;
356
349
  font-size: var(--ifm-font-size-small);
357
- color: var(--ifm-color-secondary-darkest);
350
+ color: var(--ifm-color-emphasis-700);
358
351
  line-height: 1.4;
359
352
  }
360
353
 
@@ -378,16 +371,16 @@ function McpInstallButton({
378
371
  text-decoration: none;
379
372
  }
380
373
 
381
- /* Code block styles */
374
+ /* Code block styles - uses Docusaurus pre/code variables */
382
375
  .mcp-code-block {
383
376
  display: flex;
384
- border-radius: var(--ifm-code-border-radius, 0.25rem);
377
+ border-radius: var(--ifm-code-border-radius);
385
378
  overflow: hidden;
386
379
  }
387
380
 
388
381
  .mcp-code-block__content {
389
382
  flex: 1;
390
- background-color: var(--mcp-code-bg);
383
+ background-color: var(--ifm-pre-background);
391
384
  padding: 0.75rem 1rem;
392
385
  overflow-x: auto;
393
386
  }
@@ -395,7 +388,7 @@ function McpInstallButton({
395
388
  .mcp-code-block__content code {
396
389
  font-family: var(--ifm-font-family-monospace);
397
390
  font-size: var(--ifm-code-font-size);
398
- color: var(--mcp-code-color);
391
+ color: var(--ifm-pre-color);
399
392
  background: none;
400
393
  padding: 0;
401
394
  border: none;
@@ -418,15 +411,15 @@ function McpInstallButton({
418
411
  align-items: center;
419
412
  justify-content: center;
420
413
  width: 2.75rem;
421
- background-color: var(--ifm-color-gray-800, #374151);
414
+ background-color: var(--ifm-color-emphasis-200);
422
415
  border: none;
423
416
  cursor: pointer;
424
- color: var(--ifm-color-gray-400, #9ca3af);
417
+ color: var(--ifm-color-emphasis-700);
425
418
  transition: background-color var(--ifm-transition-fast);
426
419
  }
427
420
 
428
421
  .mcp-code-block__copy:hover {
429
- background-color: var(--ifm-color-gray-700, #4b5563);
422
+ background-color: var(--ifm-color-emphasis-300);
430
423
  }
431
424
 
432
425
  .mcp-code-block__icon {
@@ -436,15 +429,12 @@ function McpInstallButton({
436
429
  }
437
430
 
438
431
  .mcp-code-block__icon--success {
439
- color: var(--ifm-color-success, #22c55e);
432
+ color: var(--ifm-color-success);
440
433
  }
441
434
  ` })
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 (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"]}
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.9.0",
3
+ "version": "0.10.1",
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,26 @@
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
32
  },
33
33
  "./adapters": {
34
34
  "types": "./dist/adapters-entry.d.ts",
35
- "import": "./dist/adapters-entry.mjs",
36
- "require": "./dist/adapters-entry.js"
35
+ "import": "./dist/adapters-entry.js"
37
36
  },
38
37
  "./theme": {
39
38
  "types": "./dist/theme/index.d.ts",
40
- "import": "./dist/theme/index.mjs",
41
- "require": "./dist/theme/index.js"
39
+ "import": "./dist/theme/index.js"
42
40
  }
43
41
  },
44
42
  "main": "./dist/index.js",
45
- "module": "./dist/index.mjs",
43
+ "module": "./dist/index.js",
46
44
  "types": "./dist/index.d.ts",
47
45
  "bin": {
48
- "docusaurus-mcp-verify": "./dist/cli/verify.mjs"
46
+ "docusaurus-mcp-verify": "./dist/cli/verify.js"
49
47
  },
50
48
  "files": [
51
49
  "dist"