github-to-mcp-monorepo 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (388) hide show
  1. package/.env.example +8 -0
  2. package/.github/CODEOWNERS +6 -0
  3. package/.husky/pre-commit +1 -0
  4. package/.nvmrc +1 -0
  5. package/.prettierignore +5 -0
  6. package/.prettierrc +7 -0
  7. package/.vscode/settings.json +4 -0
  8. package/ARCHITECTURE.md +1429 -0
  9. package/CHANGELOG.md +167 -0
  10. package/CONTRIBUTING.md +327 -0
  11. package/LICENSE +201 -0
  12. package/README.md +1028 -0
  13. package/SECURITY.md +248 -0
  14. package/VISUAL_GUIDE.md +437 -0
  15. package/apps/vscode/IMPLEMENTATION.md +480 -0
  16. package/apps/vscode/README.md +248 -0
  17. package/apps/vscode/package.json +381 -0
  18. package/apps/vscode/resources/icon.png +0 -0
  19. package/apps/vscode/resources/icon.svg +5 -0
  20. package/apps/vscode/src/commands/browseRegistry.ts +211 -0
  21. package/apps/vscode/src/commands/configureClaudeDesktop.ts +332 -0
  22. package/apps/vscode/src/commands/convert.ts +82 -0
  23. package/apps/vscode/src/commands/convertCurrentRepo.ts +109 -0
  24. package/apps/vscode/src/commands/convertFromUrl.ts +138 -0
  25. package/apps/vscode/src/commands/index.ts +121 -0
  26. package/apps/vscode/src/commands/validate.ts +197 -0
  27. package/apps/vscode/src/extension.ts +464 -0
  28. package/apps/vscode/src/global.d.ts +36 -0
  29. package/apps/vscode/src/test/extension.test.ts +73 -0
  30. package/apps/vscode/src/utils/file-generator.ts +529 -0
  31. package/apps/vscode/src/utils/github-api.ts +335 -0
  32. package/apps/vscode/src/utils/index.ts +29 -0
  33. package/apps/vscode/src/utils/mcp-config.ts +334 -0
  34. package/apps/vscode/src/utils/storage.ts +87 -0
  35. package/apps/vscode/src/views/McpServersTreeView.ts +160 -0
  36. package/apps/vscode/src/views/OutputChannelView.ts +195 -0
  37. package/apps/vscode/src/views/StatusBarItem.ts +251 -0
  38. package/apps/vscode/src/views/ToolsExplorerView.ts +314 -0
  39. package/apps/vscode/src/views/historyProvider.ts +75 -0
  40. package/apps/vscode/src/views/index.ts +12 -0
  41. package/apps/vscode/src/views/resultsPanel.ts +330 -0
  42. package/apps/vscode/src/webviews/ConversionPanel.ts +350 -0
  43. package/apps/vscode/src/webviews/ToolDetailsPanel.ts +448 -0
  44. package/apps/vscode/src/webviews/index.ts +9 -0
  45. package/apps/vscode/src/webviews/webview-ui/styles.ts +492 -0
  46. package/apps/vscode/tsconfig.json +20 -0
  47. package/apps/web/PLAYGROUND_GUIDE.md +499 -0
  48. package/apps/web/README.md +505 -0
  49. package/apps/web/app/api/convert/route.ts +100 -0
  50. package/apps/web/app/api/convert/stream/route.ts +198 -0
  51. package/apps/web/app/api/deploy/route.ts +157 -0
  52. package/apps/web/app/api/edge/route.ts +308 -0
  53. package/apps/web/app/api/export-docker/route.ts +284 -0
  54. package/apps/web/app/api/generate-openapi/route.ts +119 -0
  55. package/apps/web/app/api/mcp/[serverId]/route.ts +263 -0
  56. package/apps/web/app/api/playground/connect/route.ts +143 -0
  57. package/apps/web/app/api/playground/disconnect/route.ts +78 -0
  58. package/apps/web/app/api/playground/execute/route.ts +135 -0
  59. package/apps/web/app/api/playground/sessions/route.ts +103 -0
  60. package/apps/web/app/api/playground/tools/route.ts +117 -0
  61. package/apps/web/app/api/playground/v2/connect/route.ts +96 -0
  62. package/apps/web/app/api/playground/v2/disconnect/route.ts +88 -0
  63. package/apps/web/app/api/playground/v2/health/route.ts +80 -0
  64. package/apps/web/app/api/playground/v2/prompts/route.ts +160 -0
  65. package/apps/web/app/api/playground/v2/resources/route.ts +159 -0
  66. package/apps/web/app/api/playground/v2/sessions/route.ts +184 -0
  67. package/apps/web/app/api/playground/v2/tools/route.ts +167 -0
  68. package/apps/web/app/api/stream/route.ts +232 -0
  69. package/apps/web/app/batch/BatchConvertClient.tsx +190 -0
  70. package/apps/web/app/batch/page.tsx +37 -0
  71. package/apps/web/app/convert/page.tsx +269 -0
  72. package/apps/web/app/dashboard/page.tsx +380 -0
  73. package/apps/web/app/globals.css +622 -0
  74. package/apps/web/app/layout.tsx +120 -0
  75. package/apps/web/app/manifest.ts +31 -0
  76. package/apps/web/app/opengraph-image.tsx +112 -0
  77. package/apps/web/app/page.old.tsx +924 -0
  78. package/apps/web/app/page.tsx +77 -0
  79. package/apps/web/app/playground/page.tsx +306 -0
  80. package/apps/web/app/playground/v2/error.tsx +163 -0
  81. package/apps/web/app/playground/v2/layout.tsx +58 -0
  82. package/apps/web/app/playground/v2/loading.tsx +152 -0
  83. package/apps/web/app/playground/v2/page.tsx +644 -0
  84. package/apps/web/app/playground/v2/providers.tsx +214 -0
  85. package/apps/web/app/playground/v2/use-shortcuts.ts +209 -0
  86. package/apps/web/app/playground/v2/use-url-state.ts +296 -0
  87. package/apps/web/app/providers.tsx +22 -0
  88. package/apps/web/app/sitemap.ts +32 -0
  89. package/apps/web/app/twitter-image.tsx +112 -0
  90. package/apps/web/components/BranchSelector.tsx +401 -0
  91. package/apps/web/components/ClaudeConfigExport.tsx +226 -0
  92. package/apps/web/components/Features.tsx +84 -0
  93. package/apps/web/components/Footer.tsx +119 -0
  94. package/apps/web/components/GenerationProgress.tsx +248 -0
  95. package/apps/web/components/GithubUrlInput.tsx +483 -0
  96. package/apps/web/components/Header.tsx +175 -0
  97. package/apps/web/components/Hero.tsx +117 -0
  98. package/apps/web/components/HowItWorks.tsx +119 -0
  99. package/apps/web/components/InstallBanner.tsx +158 -0
  100. package/apps/web/components/Logo.tsx +116 -0
  101. package/apps/web/components/ParticleBackground.tsx +105 -0
  102. package/apps/web/components/Playground.tsx +472 -0
  103. package/apps/web/components/PlaygroundToolTester.tsx +410 -0
  104. package/apps/web/components/ProductCards.tsx +179 -0
  105. package/apps/web/components/SplitView.tsx +194 -0
  106. package/apps/web/components/ToolFilter.tsx +260 -0
  107. package/apps/web/components/ToolList.tsx +325 -0
  108. package/apps/web/components/batch/BatchConvert.tsx +785 -0
  109. package/apps/web/components/batch/index.ts +7 -0
  110. package/apps/web/components/convert/ConfigTabs.tsx +230 -0
  111. package/apps/web/components/convert/ConversionResult.tsx +482 -0
  112. package/apps/web/components/convert/InlinePlayground.tsx +259 -0
  113. package/apps/web/components/convert/LoadingSteps.tsx +311 -0
  114. package/apps/web/components/convert/OneClickInstall.tsx +224 -0
  115. package/apps/web/components/convert/ToolCard.tsx +189 -0
  116. package/apps/web/components/convert/TryInPlayground.tsx +242 -0
  117. package/apps/web/components/convert/index.ts +12 -0
  118. package/apps/web/components/deploy/DeployButton.tsx +369 -0
  119. package/apps/web/components/deploy/index.ts +7 -0
  120. package/apps/web/components/docker/DockerExport.tsx +690 -0
  121. package/apps/web/components/docker/index.ts +7 -0
  122. package/apps/web/components/install/OneClickInstall.tsx +676 -0
  123. package/apps/web/components/install/index.ts +7 -0
  124. package/apps/web/components/playground/CapabilityTabs.tsx +150 -0
  125. package/apps/web/components/playground/ConnectionStatusV2.tsx +322 -0
  126. package/apps/web/components/playground/EmptyStates.tsx +305 -0
  127. package/apps/web/components/playground/ExecutionLog.tsx +260 -0
  128. package/apps/web/components/playground/ExecutionLogV2.tsx +378 -0
  129. package/apps/web/components/playground/JsonViewer.tsx +388 -0
  130. package/apps/web/components/playground/PlaygroundLayout.tsx +244 -0
  131. package/apps/web/components/playground/PromptsPanel.tsx +385 -0
  132. package/apps/web/components/playground/ResourcesPanel.tsx +378 -0
  133. package/apps/web/components/playground/SchemaForm.tsx +477 -0
  134. package/apps/web/components/playground/ServerStatus.tsx +151 -0
  135. package/apps/web/components/playground/ShareButton.tsx +239 -0
  136. package/apps/web/components/playground/ToolsPanel.tsx +309 -0
  137. package/apps/web/components/playground/TransportConfigurator.tsx +563 -0
  138. package/apps/web/components/playground/index.ts +74 -0
  139. package/apps/web/components/playground/types.ts +202 -0
  140. package/apps/web/components/streaming/StreamingProgress.tsx +441 -0
  141. package/apps/web/components/streaming/index.ts +7 -0
  142. package/apps/web/components/ui/badge.tsx +42 -0
  143. package/apps/web/components/ui/button.tsx +88 -0
  144. package/apps/web/components/ui/card.tsx +75 -0
  145. package/apps/web/components/ui/code-block.tsx +122 -0
  146. package/apps/web/components/ui/index.ts +12 -0
  147. package/apps/web/components/ui/input.tsx +55 -0
  148. package/apps/web/components/ui/tabs.tsx +61 -0
  149. package/apps/web/hooks/index.ts +85 -0
  150. package/apps/web/hooks/types.ts +1173 -0
  151. package/apps/web/hooks/use-conversion.ts +133 -0
  152. package/apps/web/hooks/use-execution-history.ts +376 -0
  153. package/apps/web/hooks/use-generation-progress.ts +147 -0
  154. package/apps/web/hooks/use-local-storage.ts +88 -0
  155. package/apps/web/hooks/use-mcp-client.ts +623 -0
  156. package/apps/web/hooks/use-mcp-connection.ts +500 -0
  157. package/apps/web/hooks/use-mcp-execution.ts +282 -0
  158. package/apps/web/hooks/use-mcp-prompts.ts +441 -0
  159. package/apps/web/hooks/use-mcp-resources.ts +430 -0
  160. package/apps/web/hooks/use-mcp-tools.ts +540 -0
  161. package/apps/web/hooks/use-playground-store.ts +299 -0
  162. package/apps/web/hooks/use-playground.ts +184 -0
  163. package/apps/web/hooks/use-streaming-conversion.ts +227 -0
  164. package/apps/web/hooks/useBatchConversion.ts +271 -0
  165. package/apps/web/hooks/useDockerConfig.ts +161 -0
  166. package/apps/web/hooks/usePlatformDetection.ts +80 -0
  167. package/apps/web/hooks/useStreaming.ts +199 -0
  168. package/apps/web/lib/api/errors.ts +386 -0
  169. package/apps/web/lib/api/index.ts +137 -0
  170. package/apps/web/lib/api/logger.ts +187 -0
  171. package/apps/web/lib/api/middleware.ts +364 -0
  172. package/apps/web/lib/api/openapi.ts +977 -0
  173. package/apps/web/lib/api/session-manager.ts +594 -0
  174. package/apps/web/lib/api/types.ts +433 -0
  175. package/apps/web/lib/api/validation.ts +523 -0
  176. package/apps/web/lib/constants.ts +114 -0
  177. package/apps/web/lib/mcp/client.ts +1137 -0
  178. package/apps/web/lib/mcp/events.ts +651 -0
  179. package/apps/web/lib/mcp/index.ts +347 -0
  180. package/apps/web/lib/mcp/logger.ts +428 -0
  181. package/apps/web/lib/mcp/metrics.ts +703 -0
  182. package/apps/web/lib/mcp/retry.ts +616 -0
  183. package/apps/web/lib/mcp/session-manager.ts +779 -0
  184. package/apps/web/lib/mcp/transports.ts +988 -0
  185. package/apps/web/lib/mcp/types.ts +594 -0
  186. package/apps/web/lib/mcp-client-enhanced.ts +871 -0
  187. package/apps/web/lib/mcp-client.ts +778 -0
  188. package/apps/web/lib/mcp-errors.ts +489 -0
  189. package/apps/web/lib/mcp-sandbox.ts +593 -0
  190. package/apps/web/lib/mcp-testing.ts +428 -0
  191. package/apps/web/lib/mcp-types.ts +448 -0
  192. package/apps/web/lib/playground-store.tsx +1147 -0
  193. package/apps/web/lib/utils.ts +439 -0
  194. package/apps/web/next-env.d.ts +5 -0
  195. package/apps/web/next.config.js +23 -0
  196. package/apps/web/package.json +55 -0
  197. package/apps/web/postcss.config.js +6 -0
  198. package/apps/web/public/.well-known/ai-plugin.json +17 -0
  199. package/apps/web/public/logo.svg +6 -0
  200. package/apps/web/public/robots.txt +22 -0
  201. package/apps/web/public/schema.json +27 -0
  202. package/apps/web/tailwind.config.js +26 -0
  203. package/apps/web/tailwind.config.ts +123 -0
  204. package/apps/web/tsconfig.json +20 -0
  205. package/apps/web/types/deploy.ts +139 -0
  206. package/apps/web/types/index.ts +247 -0
  207. package/apps/web/vercel.json +39 -0
  208. package/eslint.config.mjs +23 -0
  209. package/llms.txt +102 -0
  210. package/mkdocs/docs/api/core.md +318 -0
  211. package/mkdocs/docs/api/index.md +128 -0
  212. package/mkdocs/docs/api/mcp-server.md +301 -0
  213. package/mkdocs/docs/api/openapi-parser.md +254 -0
  214. package/mkdocs/docs/assets/logo.svg +7 -0
  215. package/mkdocs/docs/changelog.md +118 -0
  216. package/mkdocs/docs/cli/generate.md +148 -0
  217. package/mkdocs/docs/cli/index.md +52 -0
  218. package/mkdocs/docs/cli/inspect.md +164 -0
  219. package/mkdocs/docs/cli/serve.md +136 -0
  220. package/mkdocs/docs/concepts/classification.md +254 -0
  221. package/mkdocs/docs/concepts/how-it-works.md +299 -0
  222. package/mkdocs/docs/concepts/index.md +77 -0
  223. package/mkdocs/docs/concepts/mcp-protocol.md +362 -0
  224. package/mkdocs/docs/concepts/tool-types.md +382 -0
  225. package/mkdocs/docs/contributing/architecture.md +262 -0
  226. package/mkdocs/docs/contributing/development.md +245 -0
  227. package/mkdocs/docs/contributing/index.md +73 -0
  228. package/mkdocs/docs/contributing/testing.md +320 -0
  229. package/mkdocs/docs/getting-started/configuration.md +235 -0
  230. package/mkdocs/docs/getting-started/index.md +54 -0
  231. package/mkdocs/docs/getting-started/installation.md +145 -0
  232. package/mkdocs/docs/getting-started/quickstart.md +160 -0
  233. package/mkdocs/docs/guides/batch.md +375 -0
  234. package/mkdocs/docs/guides/claude-desktop.md +227 -0
  235. package/mkdocs/docs/guides/cursor.md +188 -0
  236. package/mkdocs/docs/guides/custom-tools.md +367 -0
  237. package/mkdocs/docs/guides/index.md +78 -0
  238. package/mkdocs/docs/guides/private-repos.md +221 -0
  239. package/mkdocs/docs/guides/vscode.md +247 -0
  240. package/mkdocs/docs/index.md +175 -0
  241. package/mkdocs/docs/reference/config.md +223 -0
  242. package/mkdocs/docs/reference/env.md +192 -0
  243. package/mkdocs/docs/reference/index.md +102 -0
  244. package/mkdocs/docs/reference/tools.md +309 -0
  245. package/mkdocs/docs/stylesheets/extra.css +231 -0
  246. package/mkdocs/mkdocs.yml +204 -0
  247. package/mkdocs/overrides/.gitkeep +1 -0
  248. package/mkdocs/overrides/main.html +7 -0
  249. package/mkdocs/python-deps.txt +7 -0
  250. package/mkdocs/vercel.json +11 -0
  251. package/package.json +63 -0
  252. package/packages/core/package.json +61 -0
  253. package/packages/core/src/__tests__/bitbucket-client.test.ts +366 -0
  254. package/packages/core/src/__tests__/cli.test.ts +235 -0
  255. package/packages/core/src/__tests__/code-extractor.test.ts +378 -0
  256. package/packages/core/src/__tests__/docker-generator.test.ts +255 -0
  257. package/packages/core/src/__tests__/github-client.test.ts +390 -0
  258. package/packages/core/src/__tests__/gitlab-client.test.ts +319 -0
  259. package/packages/core/src/__tests__/go-extractor.test.ts +351 -0
  260. package/packages/core/src/__tests__/graphql-extractor.test.ts +330 -0
  261. package/packages/core/src/__tests__/java-extractor.test.ts +497 -0
  262. package/packages/core/src/__tests__/plugins.test.ts +467 -0
  263. package/packages/core/src/__tests__/readme-extractor.test.ts +258 -0
  264. package/packages/core/src/__tests__/redis-cache.test.ts +307 -0
  265. package/packages/core/src/__tests__/rust-extractor.test.ts +252 -0
  266. package/packages/core/src/__tests__/streaming.test.ts +251 -0
  267. package/packages/core/src/additional-extractors.ts +333 -0
  268. package/packages/core/src/cache/cache-interface.ts +179 -0
  269. package/packages/core/src/cache/index.ts +210 -0
  270. package/packages/core/src/cache/redis-cache.ts +291 -0
  271. package/packages/core/src/cache/upstash-cache.ts +379 -0
  272. package/packages/core/src/cache.ts +251 -0
  273. package/packages/core/src/cli.ts +822 -0
  274. package/packages/core/src/code-extractor.ts +696 -0
  275. package/packages/core/src/docker-generator.ts +470 -0
  276. package/packages/core/src/edge-compatible.ts +491 -0
  277. package/packages/core/src/extractors/go-extractor.ts +791 -0
  278. package/packages/core/src/extractors/index.ts +9 -0
  279. package/packages/core/src/extractors/java-extractor.ts +937 -0
  280. package/packages/core/src/extractors/rust-extractor.ts +744 -0
  281. package/packages/core/src/github-client.ts +319 -0
  282. package/packages/core/src/go-generator.ts +356 -0
  283. package/packages/core/src/graphql-extractor.ts +358 -0
  284. package/packages/core/src/index.ts +797 -0
  285. package/packages/core/src/langchain-exporter.ts +617 -0
  286. package/packages/core/src/language-parsers.ts +1114 -0
  287. package/packages/core/src/mcp-introspector.ts +279 -0
  288. package/packages/core/src/monorepo-detector.ts +378 -0
  289. package/packages/core/src/plugins/index.ts +370 -0
  290. package/packages/core/src/plugins/registry.ts +404 -0
  291. package/packages/core/src/plugins/types.ts +215 -0
  292. package/packages/core/src/providers/base-provider.ts +246 -0
  293. package/packages/core/src/providers/bitbucket-client.ts +464 -0
  294. package/packages/core/src/providers/gitlab-client.ts +388 -0
  295. package/packages/core/src/providers/index.ts +176 -0
  296. package/packages/core/src/python-generator.ts +260 -0
  297. package/packages/core/src/queue/index.ts +100 -0
  298. package/packages/core/src/queue/memory-queue.ts +445 -0
  299. package/packages/core/src/queue/redis-queue.ts +578 -0
  300. package/packages/core/src/queue/types.ts +251 -0
  301. package/packages/core/src/readme-extractor.ts +409 -0
  302. package/packages/core/src/schema-generator.ts +638 -0
  303. package/packages/core/src/streaming.ts +999 -0
  304. package/packages/core/src/types.ts +289 -0
  305. package/packages/core/tsconfig.json +9 -0
  306. package/packages/core/tsup.config.ts +25 -0
  307. package/packages/mcp-server/README.md +297 -0
  308. package/packages/mcp-server/package.json +55 -0
  309. package/packages/mcp-server/src/__tests__/mcp-server.test.ts +177 -0
  310. package/packages/mcp-server/src/__tests__/tools.test.ts +217 -0
  311. package/packages/mcp-server/src/index.ts +1206 -0
  312. package/packages/mcp-server/src/prompts/index.ts +601 -0
  313. package/packages/mcp-server/src/tools/export-docker.ts +362 -0
  314. package/packages/mcp-server/src/tools/generate-openapi.ts +162 -0
  315. package/packages/mcp-server/src/tools/monitor-mcp-server.ts +448 -0
  316. package/packages/mcp-server/src/tools/stream-convert.ts +398 -0
  317. package/packages/mcp-server/src/tools/test-mcp-tool.ts +531 -0
  318. package/packages/mcp-server/tsconfig.json +12 -0
  319. package/packages/mcp-server/tsup.config.ts +14 -0
  320. package/packages/openapi-parser/package-lock.json +3028 -0
  321. package/packages/openapi-parser/package.json +41 -0
  322. package/packages/openapi-parser/src/analyzer.ts +700 -0
  323. package/packages/openapi-parser/src/asyncapi-parser.ts +475 -0
  324. package/packages/openapi-parser/src/cli.ts +302 -0
  325. package/packages/openapi-parser/src/generator.ts +570 -0
  326. package/packages/openapi-parser/src/generators/express-analyzer.ts +649 -0
  327. package/packages/openapi-parser/src/generators/fastapi-analyzer.ts +960 -0
  328. package/packages/openapi-parser/src/generators/index.ts +200 -0
  329. package/packages/openapi-parser/src/generators/nextjs-analyzer.ts +768 -0
  330. package/packages/openapi-parser/src/generators/openapi-builder.ts +527 -0
  331. package/packages/openapi-parser/src/generators/types.ts +298 -0
  332. package/packages/openapi-parser/src/graphql-parser.ts +462 -0
  333. package/packages/openapi-parser/src/grpc-parser.ts +649 -0
  334. package/packages/openapi-parser/src/har-parser.ts +723 -0
  335. package/packages/openapi-parser/src/index.ts +635 -0
  336. package/packages/openapi-parser/src/insomnia-parser.ts +614 -0
  337. package/packages/openapi-parser/src/parser.ts +231 -0
  338. package/packages/openapi-parser/src/postman-parser.ts +611 -0
  339. package/packages/openapi-parser/src/ref-resolver.ts +313 -0
  340. package/packages/openapi-parser/src/transformer.ts +459 -0
  341. package/packages/openapi-parser/tests/generators/express.test.ts +209 -0
  342. package/packages/openapi-parser/tests/generators/fastapi.test.ts +236 -0
  343. package/packages/openapi-parser/tests/generators/nextjs.test.ts +273 -0
  344. package/packages/openapi-parser/tests/parsers.test.ts +847 -0
  345. package/packages/openapi-parser/tsconfig.json +9 -0
  346. package/packages/openapi-parser/tsup.config.ts +11 -0
  347. package/packages/registry/package.json +59 -0
  348. package/packages/registry/src/cli.ts +456 -0
  349. package/packages/registry/src/index.ts +44 -0
  350. package/packages/registry/src/popular/github.json +47 -0
  351. package/packages/registry/src/popular/index.ts +55 -0
  352. package/packages/registry/src/popular/linear.json +42 -0
  353. package/packages/registry/src/popular/notion.json +42 -0
  354. package/packages/registry/src/popular/openai.json +40 -0
  355. package/packages/registry/src/popular/resend.json +38 -0
  356. package/packages/registry/src/popular/slack.json +42 -0
  357. package/packages/registry/src/popular/stripe.json +163 -0
  358. package/packages/registry/src/popular/supabase.json +42 -0
  359. package/packages/registry/src/popular/twilio.json +40 -0
  360. package/packages/registry/src/popular/vercel.json +40 -0
  361. package/packages/registry/src/registry.ts +492 -0
  362. package/packages/registry/src/storage.ts +334 -0
  363. package/packages/registry/src/types.ts +275 -0
  364. package/packages/registry/src/updater.ts +208 -0
  365. package/packages/registry/tsconfig.json +10 -0
  366. package/packages/registry/tsup.config.ts +11 -0
  367. package/pnpm-workspace.yaml +3 -0
  368. package/scripts/build-docs.sh +16 -0
  369. package/server.json +9 -0
  370. package/templates/Dockerfile.python.template +60 -0
  371. package/templates/Dockerfile.typescript.template +60 -0
  372. package/templates/docker-compose.template.yml +68 -0
  373. package/tests/fixtures/express-app/index.js +34 -0
  374. package/tests/fixtures/express-app/routes/posts.js +43 -0
  375. package/tests/fixtures/express-app/routes/users.js +58 -0
  376. package/tests/fixtures/fastapi-app/main.py +125 -0
  377. package/tests/fixtures/fastapi-app/routes/admin.py +42 -0
  378. package/tests/fixtures/graphql/simple-schema.graphql +65 -0
  379. package/tests/fixtures/mocks/github-api-responses.json +63 -0
  380. package/tests/fixtures/nextjs-app/app/api/posts/route.ts +55 -0
  381. package/tests/fixtures/nextjs-app/app/api/users/[id]/route.ts +63 -0
  382. package/tests/fixtures/nextjs-app/app/api/users/route.ts +44 -0
  383. package/tests/fixtures/nextjs-app/pages/api/health.ts +28 -0
  384. package/tests/fixtures/openapi/petstore.yaml +179 -0
  385. package/tests/integration/langchain-export.test.ts +405 -0
  386. package/tests/integration/openapi-conversion.test.ts +221 -0
  387. package/tsconfig.json +18 -0
  388. package/vitest.config.ts +32 -0
@@ -0,0 +1,117 @@
1
+ 'use client'
2
+
3
+ import { useState, useCallback } from 'react'
4
+ import { motion } from 'framer-motion'
5
+ import { Github, ArrowRight } from 'lucide-react'
6
+ import { useRouter } from 'next/navigation'
7
+ import GithubUrlInput from '@/components/GithubUrlInput'
8
+
9
+ const QUICK_TRY = [
10
+ { name: 'MCP Servers', url: 'https://github.com/modelcontextprotocol/servers' },
11
+ { name: 'Anthropic Cookbook', url: 'https://github.com/anthropics/anthropic-cookbook' },
12
+ { name: 'Vercel AI', url: 'https://github.com/vercel/ai' },
13
+ ]
14
+
15
+ export default function Hero() {
16
+ const router = useRouter()
17
+ const [isConverting, setIsConverting] = useState(false)
18
+
19
+ const handleSubmit = useCallback((url: string) => {
20
+ setIsConverting(true)
21
+ const finalUrl = url.startsWith('http') ? url : `https://${url}`
22
+ router.push(`/convert?url=${encodeURIComponent(finalUrl)}`)
23
+ }, [router])
24
+
25
+ const handleQuickTry = useCallback((repoUrl: string) => {
26
+ router.push(`/convert?url=${encodeURIComponent(repoUrl)}`)
27
+ }, [router])
28
+
29
+ return (
30
+ <div className="text-center py-8">
31
+ {/* Badge */}
32
+ <motion.div
33
+ initial={{ opacity: 0, scale: 0.8 }}
34
+ animate={{ opacity: 1, scale: 1 }}
35
+ className="inline-flex items-center gap-2 px-4 py-2 rounded-full bg-white/5 border border-white/10 mb-6"
36
+ >
37
+ <Github className="w-4 h-4 text-white/60" />
38
+ <span className="text-sm font-medium text-neutral-400">
39
+ Free & <span className="text-white font-semibold">Open Source</span>
40
+ </span>
41
+ </motion.div>
42
+
43
+ {/* Main heading */}
44
+ <motion.h1
45
+ initial={{ opacity: 0, y: 20 }}
46
+ animate={{ opacity: 1, y: 0 }}
47
+ transition={{ delay: 0.1 }}
48
+ className="text-5xl md:text-7xl font-bold mb-4 leading-[1.1] tracking-tight"
49
+ >
50
+ <span className="block text-white">Convert GitHub Repos</span>
51
+ <span className="block text-neutral-500">to MCP Servers</span>
52
+ </motion.h1>
53
+
54
+ {/* Short subheadline */}
55
+ <motion.p
56
+ initial={{ opacity: 0, y: 20 }}
57
+ animate={{ opacity: 1, y: 0 }}
58
+ transition={{ delay: 0.15 }}
59
+ className="text-xl text-neutral-400 mb-10"
60
+ >
61
+ Transform any GitHub repository into a Model Context Protocol server for AI agents
62
+ </motion.p>
63
+
64
+ {/* Main URL Input - THE CORE TOOL */}
65
+ <motion.div
66
+ initial={{ opacity: 0, y: 20 }}
67
+ animate={{ opacity: 1, y: 0 }}
68
+ transition={{ delay: 0.2 }}
69
+ className="max-w-2xl mx-auto mb-4"
70
+ >
71
+ <GithubUrlInput
72
+ onSubmit={handleSubmit}
73
+ disabled={isConverting}
74
+ />
75
+ </motion.div>
76
+
77
+ {/* Quick try buttons */}
78
+ <motion.div
79
+ initial={{ opacity: 0 }}
80
+ animate={{ opacity: 1 }}
81
+ transition={{ delay: 0.25 }}
82
+ className="flex flex-wrap justify-center items-center gap-2 mb-8"
83
+ role="group"
84
+ aria-label="Example repositories"
85
+ >
86
+ <span className="text-sm text-neutral-500">Try:</span>
87
+ {QUICK_TRY.map((repo) => (
88
+ <button
89
+ key={repo.name}
90
+ type="button"
91
+ onClick={() => handleQuickTry(repo.url)}
92
+ className="px-3 py-1.5 text-sm bg-white/5 border border-neutral-800 rounded-lg hover:border-neutral-600 hover:bg-white/10 transition-all text-neutral-400 hover:text-white focus:outline-none focus:ring-2 focus:ring-white/20"
93
+ aria-label={`Convert ${repo.name} repository`}
94
+ >
95
+ {repo.name}
96
+ </button>
97
+ ))}
98
+ </motion.div>
99
+
100
+ {/* Feature pills */}
101
+ <motion.div
102
+ initial={{ opacity: 0 }}
103
+ animate={{ opacity: 1 }}
104
+ transition={{ delay: 0.3 }}
105
+ className="flex flex-wrap justify-center items-center gap-2 text-xs text-neutral-500"
106
+ >
107
+ <span>Smart extraction</span>
108
+ <span className="text-neutral-700">•</span>
109
+ <span>TypeScript & Python</span>
110
+ <span className="text-neutral-700">•</span>
111
+ <span>Ready-to-use configs</span>
112
+ <span className="text-neutral-700">•</span>
113
+ <span>Interactive playground</span>
114
+ </motion.div>
115
+ </div>
116
+ )
117
+ }
@@ -0,0 +1,119 @@
1
+ 'use client'
2
+
3
+ import { motion } from 'framer-motion'
4
+ import { Github, Code2, Server } from 'lucide-react'
5
+
6
+ const steps = [
7
+ {
8
+ number: 1,
9
+ title: 'Paste GitHub URL',
10
+ description: 'Enter any public GitHub repository URL. We support repos with README files, OpenAPI specs, GraphQL schemas, and source code.',
11
+ icon: Github,
12
+ },
13
+ {
14
+ number: 2,
15
+ title: 'Analyze & Extract',
16
+ description: 'We analyze the repository structure, detect the type (SDK, CLI, library), and extract all available tools and endpoints.',
17
+ icon: Code2,
18
+ },
19
+ {
20
+ number: 3,
21
+ title: 'Get MCP Server',
22
+ description: 'Download production-ready MCP server code in TypeScript or Python, with configs for Claude Desktop, Cursor, and more.',
23
+ icon: Server,
24
+ },
25
+ ]
26
+
27
+ export default function HowItWorks() {
28
+ return (
29
+ <section id="how-it-works" className="py-24 scroll-mt-24 relative overflow-hidden">
30
+ {/* Background decoration */}
31
+ <div className="absolute inset-0 bg-dots opacity-30" aria-hidden="true" />
32
+
33
+ <div className="relative z-10">
34
+ {/* Section header */}
35
+ <motion.div
36
+ initial={{ opacity: 0, y: 20 }}
37
+ whileInView={{ opacity: 1, y: 0 }}
38
+ viewport={{ once: true }}
39
+ transition={{ duration: 0.5 }}
40
+ className="text-center mb-16"
41
+ >
42
+ <h2 className="text-4xl md:text-5xl font-bold text-white mb-4">
43
+ How it <span className="text-neutral-500">works</span>
44
+ </h2>
45
+ <p className="text-xl text-neutral-400 max-w-2xl mx-auto">
46
+ Three simple steps to convert any GitHub repo into an MCP server.
47
+ </p>
48
+ </motion.div>
49
+
50
+ {/* Steps timeline */}
51
+ <div className="max-w-4xl mx-auto">
52
+ <div className="relative">
53
+ {/* Connecting line */}
54
+ <div className="absolute left-1/2 top-0 bottom-0 w-px bg-gradient-to-b from-neutral-600 via-neutral-700 to-neutral-800 hidden md:block" />
55
+
56
+ {/* Steps */}
57
+ <div className="space-y-12 md:space-y-24">
58
+ {steps.map((step, index) => {
59
+ const Icon = step.icon
60
+ const isEven = index % 2 === 0
61
+
62
+ return (
63
+ <motion.div
64
+ key={step.number}
65
+ initial={{ opacity: 0, x: isEven ? -50 : 50 }}
66
+ whileInView={{ opacity: 1, x: 0 }}
67
+ viewport={{ once: true }}
68
+ transition={{ duration: 0.5, delay: index * 0.2 }}
69
+ className={`flex flex-col md:flex-row items-center gap-8 ${
70
+ isEven ? 'md:flex-row' : 'md:flex-row-reverse'
71
+ }`}
72
+ >
73
+ {/* Content */}
74
+ <div className={`flex-1 text-center ${isEven ? 'md:text-right' : 'md:text-left'}`}>
75
+ <motion.div
76
+ whileHover={{ scale: 1.02 }}
77
+ className="inline-block"
78
+ >
79
+ <div className="rounded-2xl p-6 md:p-8 bg-neutral-900/50 backdrop-blur-sm border border-neutral-800">
80
+ <div className="text-sm font-bold text-neutral-500 mb-2">
81
+ Step {step.number}
82
+ </div>
83
+ <h3 className="text-xl md:text-2xl font-bold text-white mb-3">
84
+ {step.title}
85
+ </h3>
86
+ <p className="text-neutral-400">
87
+ {step.description}
88
+ </p>
89
+ </div>
90
+ </motion.div>
91
+ </div>
92
+
93
+ {/* Center icon */}
94
+ <div className="relative z-10">
95
+ <motion.div
96
+ whileHover={{ scale: 1.1 }}
97
+ className="w-16 h-16 md:w-20 md:h-20 rounded-2xl bg-white/5 border border-neutral-700 flex items-center justify-center shadow-lg"
98
+ >
99
+ <Icon className="w-8 h-8 md:w-10 md:h-10 text-white" />
100
+ </motion.div>
101
+
102
+ {/* Number badge */}
103
+ <div className="absolute -top-2 -right-2 w-6 h-6 rounded-full bg-white text-black flex items-center justify-center text-xs font-bold">
104
+ {step.number}
105
+ </div>
106
+ </div>
107
+
108
+ {/* Empty space for alternating layout */}
109
+ <div className="flex-1 hidden md:block" aria-hidden="true" />
110
+ </motion.div>
111
+ )
112
+ })}
113
+ </div>
114
+ </div>
115
+ </div>
116
+ </div>
117
+ </section>
118
+ )
119
+ }
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Install Banner - Prominent CLI install command
3
+ * @copyright 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ 'use client';
8
+
9
+ import { useState, useCallback } from 'react';
10
+ import { motion } from 'framer-motion';
11
+ import { Copy, Check, Terminal, Zap, ArrowRight } from 'lucide-react';
12
+
13
+ interface InstallBannerProps {
14
+ variant?: 'hero' | 'inline' | 'minimal';
15
+ repoUrl?: string;
16
+ }
17
+
18
+ export default function InstallBanner({ variant = 'hero', repoUrl }: InstallBannerProps) {
19
+ const [copied, setCopied] = useState(false);
20
+
21
+ const command = repoUrl
22
+ ? `npx @nirholas/github-to-mcp install ${repoUrl} --claude`
23
+ : `npx @nirholas/github-to-mcp install <github-url> --claude`;
24
+
25
+ const handleCopy = useCallback(async () => {
26
+ await navigator.clipboard.writeText(command);
27
+ setCopied(true);
28
+ setTimeout(() => setCopied(false), 2000);
29
+ }, [command]);
30
+
31
+ if (variant === 'minimal') {
32
+ return (
33
+ <div className="flex items-center gap-2">
34
+ <code className="text-sm text-green-400 font-mono bg-black/40 px-3 py-1.5 rounded-lg">
35
+ npx @nirholas/github-to-mcp
36
+ </code>
37
+ <button
38
+ onClick={handleCopy}
39
+ className="p-1.5 hover:bg-white/10 rounded transition-colors"
40
+ >
41
+ {copied ? (
42
+ <Check className="w-4 h-4 text-green-400" />
43
+ ) : (
44
+ <Copy className="w-4 h-4 text-neutral-400" />
45
+ )}
46
+ </button>
47
+ </div>
48
+ );
49
+ }
50
+
51
+ if (variant === 'inline') {
52
+ return (
53
+ <motion.div
54
+ initial={{ opacity: 0, y: 10 }}
55
+ animate={{ opacity: 1, y: 0 }}
56
+ className="flex items-center gap-3 p-3 bg-black/40 border border-neutral-800 rounded-xl"
57
+ >
58
+ <Terminal className="w-5 h-5 text-neutral-500 flex-shrink-0" />
59
+ <code className="flex-1 text-sm text-green-400 font-mono overflow-x-auto whitespace-nowrap">
60
+ {command}
61
+ </code>
62
+ <button
63
+ onClick={handleCopy}
64
+ className="flex-shrink-0 p-2 hover:bg-white/10 rounded-lg transition-colors"
65
+ >
66
+ {copied ? (
67
+ <Check className="w-4 h-4 text-green-400" />
68
+ ) : (
69
+ <Copy className="w-4 h-4 text-neutral-400" />
70
+ )}
71
+ </button>
72
+ </motion.div>
73
+ );
74
+ }
75
+
76
+ // Hero variant (default)
77
+ return (
78
+ <motion.div
79
+ initial={{ opacity: 0, y: 20 }}
80
+ animate={{ opacity: 1, y: 0 }}
81
+ className="rounded-2xl border border-neutral-800 bg-gradient-to-br from-neutral-900/80 to-black/80 backdrop-blur-xl overflow-hidden"
82
+ >
83
+ {/* Header */}
84
+ <div className="flex items-center justify-between p-4 border-b border-neutral-800 bg-white/[0.02]">
85
+ <div className="flex items-center gap-3">
86
+ <div className="w-10 h-10 rounded-xl bg-gradient-to-br from-green-500/20 to-emerald-500/10 flex items-center justify-center">
87
+ <Zap className="w-5 h-5 text-green-400" />
88
+ </div>
89
+ <div>
90
+ <h3 className="font-semibold text-white">One-Click Install</h3>
91
+ <p className="text-xs text-neutral-400">Add to Claude Desktop instantly</p>
92
+ </div>
93
+ </div>
94
+ <span className="px-2.5 py-1 text-xs font-medium bg-green-500/20 text-green-400 rounded-full">
95
+ NEW
96
+ </span>
97
+ </div>
98
+
99
+ {/* Command */}
100
+ <div className="p-4">
101
+ <div className="flex items-center gap-3 p-4 bg-black/60 border border-neutral-800 rounded-xl group">
102
+ <span className="text-neutral-500 font-mono">$</span>
103
+ <code className="flex-1 text-green-400 font-mono text-sm overflow-x-auto whitespace-nowrap scrollbar-thin">
104
+ {command}
105
+ </code>
106
+ <button
107
+ onClick={handleCopy}
108
+ className="flex-shrink-0 flex items-center gap-2 px-3 py-1.5 bg-white/5 hover:bg-white/10 border border-neutral-700 rounded-lg transition-all text-sm"
109
+ >
110
+ {copied ? (
111
+ <>
112
+ <Check className="w-4 h-4 text-green-400" />
113
+ <span className="text-green-400">Copied!</span>
114
+ </>
115
+ ) : (
116
+ <>
117
+ <Copy className="w-4 h-4 text-neutral-400" />
118
+ <span className="text-neutral-300">Copy</span>
119
+ </>
120
+ )}
121
+ </button>
122
+ </div>
123
+
124
+ {/* Features */}
125
+ <div className="mt-4 flex flex-wrap gap-4 text-xs text-neutral-400">
126
+ <div className="flex items-center gap-1.5">
127
+ <Check className="w-3.5 h-3.5 text-green-400" />
128
+ <span>Auto-configures Claude Desktop</span>
129
+ </div>
130
+ <div className="flex items-center gap-1.5">
131
+ <Check className="w-3.5 h-3.5 text-green-400" />
132
+ <span>Installs dependencies</span>
133
+ </div>
134
+ <div className="flex items-center gap-1.5">
135
+ <Check className="w-3.5 h-3.5 text-green-400" />
136
+ <span>Works with Cursor too</span>
137
+ </div>
138
+ </div>
139
+ </div>
140
+
141
+ {/* Footer */}
142
+ <div className="flex items-center justify-between px-4 py-3 bg-white/[0.02] border-t border-neutral-800">
143
+ <p className="text-xs text-neutral-500">
144
+ Supports <span className="text-neutral-400">--claude</span>, <span className="text-neutral-400">--cursor</span>, and <span className="text-neutral-400">--vscode</span> flags
145
+ </p>
146
+ <a
147
+ href="https://github.com/nirholas/github-to-mcp#cli"
148
+ target="_blank"
149
+ rel="noopener noreferrer"
150
+ className="flex items-center gap-1 text-xs text-neutral-400 hover:text-white transition-colors"
151
+ >
152
+ View docs
153
+ <ArrowRight className="w-3 h-3" />
154
+ </a>
155
+ </div>
156
+ </motion.div>
157
+ );
158
+ }
@@ -0,0 +1,116 @@
1
+ 'use client'
2
+
3
+ import { motion } from 'framer-motion'
4
+
5
+ interface LogoProps {
6
+ size?: 'sm' | 'md' | 'lg'
7
+ showText?: boolean
8
+ className?: string
9
+ }
10
+
11
+ // Custom space/conversion themed logo - represents transformation/portal
12
+ function LogoIcon({ className = '' }: { className?: string }) {
13
+ return (
14
+ <svg
15
+ viewBox="0 0 32 32"
16
+ fill="none"
17
+ xmlns="http://www.w3.org/2000/svg"
18
+ className={className}
19
+ >
20
+ {/* Outer ring - represents the conversion portal */}
21
+ <circle
22
+ cx="16"
23
+ cy="16"
24
+ r="12"
25
+ stroke="currentColor"
26
+ strokeWidth="2"
27
+ strokeDasharray="4 2"
28
+ className="opacity-40"
29
+ />
30
+
31
+ {/* Inner orbital rings - crossing paths representing transformation */}
32
+ <ellipse
33
+ cx="16"
34
+ cy="16"
35
+ rx="8"
36
+ ry="3"
37
+ stroke="currentColor"
38
+ strokeWidth="1.5"
39
+ className="opacity-60"
40
+ transform="rotate(-30 16 16)"
41
+ />
42
+ <ellipse
43
+ cx="16"
44
+ cy="16"
45
+ rx="8"
46
+ ry="3"
47
+ stroke="currentColor"
48
+ strokeWidth="1.5"
49
+ className="opacity-60"
50
+ transform="rotate(30 16 16)"
51
+ />
52
+
53
+ {/* Center core - the conversion point */}
54
+ <circle
55
+ cx="16"
56
+ cy="16"
57
+ r="4"
58
+ fill="currentColor"
59
+ className="opacity-90"
60
+ />
61
+
62
+ {/* Small orbiting dots - representing data/particles */}
63
+ <circle cx="16" cy="6" r="1.5" fill="currentColor" className="opacity-70" />
64
+ <circle cx="16" cy="26" r="1.5" fill="currentColor" className="opacity-70" />
65
+ <circle cx="6" cy="16" r="1.5" fill="currentColor" className="opacity-70" />
66
+ <circle cx="26" cy="16" r="1.5" fill="currentColor" className="opacity-70" />
67
+ </svg>
68
+ )
69
+ }
70
+
71
+ export function Logo({ size = 'md', showText = true, className = '' }: LogoProps) {
72
+ const sizeClasses = {
73
+ sm: { container: 'w-8 h-8', icon: 'w-5 h-5', text: 'text-base' },
74
+ md: { container: 'w-8 h-8 md:w-9 md:h-9', icon: 'w-5 h-5 md:w-6 md:h-6', text: 'text-base md:text-lg' },
75
+ lg: { container: 'w-10 h-10', icon: 'w-6 h-6', text: 'text-xl' },
76
+ }
77
+
78
+ const sizes = sizeClasses[size]
79
+
80
+ return (
81
+ <div className={`flex items-center gap-2 md:gap-3 ${className}`}>
82
+ {/* Logo Icon Container */}
83
+ <div className="relative">
84
+ <motion.div
85
+ className={`${sizes.container} rounded-lg bg-white flex items-center justify-center`}
86
+ whileHover={{ scale: 1.05 }}
87
+ transition={{ type: 'spring', stiffness: 400, damping: 17 }}
88
+ >
89
+ <LogoIcon className={`${sizes.icon} text-black`} />
90
+ </motion.div>
91
+ </div>
92
+
93
+ {/* Text with shimmer effect */}
94
+ {showText && (
95
+ <span className={`${sizes.text} font-bold text-white relative overflow-hidden`}>
96
+ <span className="relative z-10">github-to-mcp</span>
97
+ {/* Shimmer overlay */}
98
+ <motion.span
99
+ className="absolute inset-0 bg-gradient-to-r from-transparent via-white/20 to-transparent -skew-x-12"
100
+ initial={{ x: '-100%' }}
101
+ animate={{ x: '200%' }}
102
+ transition={{
103
+ duration: 3,
104
+ repeat: Infinity,
105
+ repeatDelay: 4,
106
+ ease: 'easeInOut',
107
+ }}
108
+ />
109
+ </span>
110
+ )}
111
+ </div>
112
+ )
113
+ }
114
+
115
+ export { LogoIcon }
116
+ export default Logo
@@ -0,0 +1,105 @@
1
+ 'use client'
2
+
3
+ import { useEffect, useMemo, useState } from 'react'
4
+ import Particles, { initParticlesEngine } from '@tsparticles/react'
5
+ import { loadSlim } from '@tsparticles/slim'
6
+
7
+ export default function ParticleBackground() {
8
+ const [init, setInit] = useState(false)
9
+
10
+ useEffect(() => {
11
+ initParticlesEngine(async (engine) => {
12
+ await loadSlim(engine)
13
+ }).then(() => {
14
+ setInit(true)
15
+ })
16
+ }, [])
17
+
18
+ const options = useMemo(
19
+ () => ({
20
+ background: {
21
+ color: {
22
+ value: 'transparent',
23
+ },
24
+ },
25
+ fpsLimit: 60,
26
+ interactivity: {
27
+ events: {
28
+ onClick: {
29
+ enable: true,
30
+ mode: 'push',
31
+ },
32
+ onHover: {
33
+ enable: true,
34
+ mode: 'repulse',
35
+ },
36
+ },
37
+ modes: {
38
+ push: {
39
+ quantity: 2,
40
+ },
41
+ repulse: {
42
+ distance: 120,
43
+ duration: 0.4,
44
+ },
45
+ },
46
+ },
47
+ particles: {
48
+ color: {
49
+ value: ['#ffffff', '#a3a3a3', '#737373'],
50
+ },
51
+ links: {
52
+ color: '#ffffff',
53
+ distance: 150,
54
+ enable: true,
55
+ opacity: 0.05,
56
+ width: 1,
57
+ },
58
+ move: {
59
+ direction: 'none' as const,
60
+ enable: true,
61
+ outModes: {
62
+ default: 'bounce' as const,
63
+ },
64
+ random: true,
65
+ speed: 0.5,
66
+ straight: false,
67
+ },
68
+ number: {
69
+ density: {
70
+ enable: true,
71
+ area: 1200,
72
+ },
73
+ value: 40,
74
+ },
75
+ opacity: {
76
+ value: { min: 0.05, max: 0.2 },
77
+ animation: {
78
+ enable: true,
79
+ speed: 0.5,
80
+ minimumValue: 0.05,
81
+ },
82
+ },
83
+ shape: {
84
+ type: 'circle',
85
+ },
86
+ size: {
87
+ value: { min: 1, max: 2 },
88
+ },
89
+ },
90
+ detectRetina: true,
91
+ }),
92
+ []
93
+ )
94
+
95
+ if (!init) return null
96
+
97
+ return (
98
+ <Particles
99
+ id="tsparticles"
100
+ className="fixed inset-0 pointer-events-none"
101
+ style={{ zIndex: 0 }}
102
+ options={options}
103
+ />
104
+ )
105
+ }