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,482 @@
1
+ /**
2
+ * Conversion Result Component - Displays MCP conversion output
3
+ * @copyright 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ 'use client';
8
+
9
+ import { useState, useCallback, useMemo } from 'react';
10
+ import { motion, AnimatePresence } from 'framer-motion';
11
+ import {
12
+ Check,
13
+ Download,
14
+ Copy,
15
+ RefreshCw,
16
+ Github,
17
+ Code2,
18
+ FileJson,
19
+ Terminal,
20
+ Package,
21
+ ChevronDown,
22
+ ChevronRight,
23
+ ExternalLink,
24
+ Clock,
25
+ Layers,
26
+ Zap,
27
+ FileArchive,
28
+ File,
29
+ Play,
30
+ } from 'lucide-react';
31
+ import type { ConversionResult as ConversionResultType } from '@/types';
32
+ import { CLASSIFICATION_LABELS, SOURCE_TYPE_LABELS } from '@/lib/constants';
33
+ import { copyToClipboard, downloadAsFile, downloadAsZip, formatRelativeTime } from '@/lib/utils';
34
+ import ToolCard from './ToolCard';
35
+ import ConfigTabs from './ConfigTabs';
36
+ import OneClickInstall from './OneClickInstall';
37
+ import TryInPlayground from './TryInPlayground';
38
+ import InlinePlayground from './InlinePlayground';
39
+ import { CodeBlock } from '@/components/ui/code-block';
40
+ import ClaudeConfigExport from '@/components/ClaudeConfigExport';
41
+ import ToolList from '@/components/ToolList';
42
+ import { DeployButton } from '@/components/deploy';
43
+
44
+ interface ConversionResultProps {
45
+ result: ConversionResultType;
46
+ onReset: () => void;
47
+ }
48
+
49
+ type TabType = 'install' | 'tools' | 'playground' | 'code' | 'config';
50
+
51
+ export default function ConversionResult({ result, onReset }: ConversionResultProps) {
52
+ const [activeTab, setActiveTab] = useState<TabType>('install');
53
+ const [copied, setCopied] = useState<string | null>(null);
54
+ const [expandedTools, setExpandedTools] = useState<Set<string>>(new Set());
55
+ const [codeLanguage, setCodeLanguage] = useState<'typescript' | 'python'>('typescript');
56
+ const [showDownloadMenu, setShowDownloadMenu] = useState(false);
57
+
58
+ const handleCopy = useCallback(async (text: string, id: string) => {
59
+ const success = await copyToClipboard(text);
60
+ if (success) {
61
+ setCopied(id);
62
+ setTimeout(() => setCopied(null), 2000);
63
+ }
64
+ }, []);
65
+
66
+ const handleDownload = useCallback((content: string, filename: string) => {
67
+ downloadAsFile(content, filename, 'text/plain');
68
+ setShowDownloadMenu(false);
69
+ }, []);
70
+
71
+ // Generate Claude Desktop config JSON
72
+ const claudeConfig = useMemo(() => {
73
+ return JSON.stringify({
74
+ mcpServers: {
75
+ [result.name]: {
76
+ command: 'npx',
77
+ args: ['tsx', `${result.name}-mcp-server.ts`],
78
+ },
79
+ },
80
+ }, null, 2);
81
+ }, [result.name]);
82
+
83
+ // Generate package.json
84
+ const packageJson = useMemo(() => {
85
+ return JSON.stringify({
86
+ name: `${result.name}-mcp-server`,
87
+ version: '1.0.0',
88
+ description: result.description || `MCP server generated from ${result.name}`,
89
+ main: 'index.ts',
90
+ scripts: {
91
+ start: 'npx tsx index.ts',
92
+ build: 'tsc',
93
+ },
94
+ dependencies: {
95
+ '@modelcontextprotocol/sdk': '^1.0.0',
96
+ 'zod': '^3.22.0',
97
+ },
98
+ devDependencies: {
99
+ '@types/node': '^20.0.0',
100
+ 'typescript': '^5.0.0',
101
+ 'tsx': '^4.0.0',
102
+ },
103
+ }, null, 2);
104
+ }, [result.name, result.description]);
105
+
106
+ // Download all files as ZIP
107
+ const handleDownloadZip = useCallback(async () => {
108
+ const files = [
109
+ { name: `${result.name}-mcp-server.ts`, content: result.code },
110
+ { name: 'package.json', content: packageJson },
111
+ { name: 'claude_desktop_config.json', content: claudeConfig },
112
+ { name: 'README.md', content: `# ${result.name} MCP Server\n\n${result.description || ''}\n\n## Tools\n\n${result.tools.map(t => `- **${t.name}**: ${t.description || 'No description'}`).join('\n')}\n\n## Installation\n\n\`\`\`bash\nnpm install\nnpx tsx ${result.name}-mcp-server.ts\n\`\`\`\n` },
113
+ ];
114
+
115
+ if (result.pythonCode) {
116
+ files.push({ name: `${result.name}_mcp_server.py`, content: result.pythonCode });
117
+ }
118
+
119
+ await downloadAsZip(files, `${result.name}-mcp-server.zip`);
120
+ setShowDownloadMenu(false);
121
+ }, [result, packageJson, claudeConfig]);
122
+
123
+ // Download options
124
+ const downloadOptions = useMemo(() => [
125
+ {
126
+ id: 'zip',
127
+ label: 'Download All (.zip)',
128
+ description: 'Server code, config, README, package.json',
129
+ icon: FileArchive,
130
+ action: handleDownloadZip,
131
+ highlight: true,
132
+ },
133
+ {
134
+ id: 'ts',
135
+ label: 'TypeScript Server',
136
+ description: `${result.name}-mcp-server.ts`,
137
+ icon: Terminal,
138
+ action: () => handleDownload(result.code, `${result.name}-mcp-server.ts`),
139
+ },
140
+ ...(result.pythonCode ? [{
141
+ id: 'py',
142
+ label: 'Python Server',
143
+ description: `${result.name}_mcp_server.py`,
144
+ icon: Code2,
145
+ action: () => handleDownload(result.pythonCode!, `${result.name}_mcp_server.py`),
146
+ }] : []),
147
+ {
148
+ id: 'config',
149
+ label: 'Claude Config',
150
+ description: 'claude_desktop_config.json',
151
+ icon: FileJson,
152
+ action: () => handleDownload(claudeConfig, 'claude_desktop_config.json'),
153
+ },
154
+ {
155
+ id: 'package',
156
+ label: 'package.json',
157
+ description: 'Node.js dependencies',
158
+ icon: Package,
159
+ action: () => handleDownload(packageJson, 'package.json'),
160
+ },
161
+ {
162
+ id: 'tools',
163
+ label: 'Tools JSON',
164
+ description: 'Tool definitions only',
165
+ icon: Layers,
166
+ action: () => handleDownload(JSON.stringify(result.tools, null, 2), `${result.name}-tools.json`),
167
+ },
168
+ ], [result, handleDownload, handleDownloadZip, claudeConfig, packageJson]);
169
+
170
+ const toggleToolExpansion = useCallback((toolName: string) => {
171
+ setExpandedTools(prev => {
172
+ const next = new Set(prev);
173
+ if (next.has(toolName)) {
174
+ next.delete(toolName);
175
+ } else {
176
+ next.add(toolName);
177
+ }
178
+ return next;
179
+ });
180
+ }, []);
181
+
182
+ const classificationInfo = CLASSIFICATION_LABELS[result.classification?.type || 'unknown'];
183
+
184
+ const tabs = [
185
+ { id: 'install' as const, label: 'Quick Install', icon: Zap, highlight: true },
186
+ { id: 'tools' as const, label: 'Tools', icon: Package, count: result.tools.length },
187
+ { id: 'playground' as const, label: 'Try It', icon: Play, highlight: false },
188
+ { id: 'code' as const, label: 'Server Code', icon: Code2 },
189
+ { id: 'config' as const, label: 'Config', icon: FileJson },
190
+ ];
191
+
192
+ // Group tools by source type
193
+ const toolsBySource = useMemo(() => {
194
+ const grouped: Record<string, typeof result.tools> = {};
195
+ result.tools.forEach(tool => {
196
+ const sourceType = tool.source?.type || 'unknown';
197
+ if (!grouped[sourceType]) {
198
+ grouped[sourceType] = [];
199
+ }
200
+ grouped[sourceType].push(tool);
201
+ });
202
+ return grouped;
203
+ }, [result.tools]);
204
+
205
+ return (
206
+ <div className="space-y-6">
207
+ {/* Success header - FIRST: Shows the result summary with stats and actions */}
208
+ <motion.div
209
+ initial={{ opacity: 0, y: 20 }}
210
+ animate={{ opacity: 1, y: 0 }}
211
+ className="rounded-2xl border border-neutral-800 p-6 md:p-8 bg-neutral-900/50 backdrop-blur-xl"
212
+ >
213
+ <div className="flex flex-col lg:flex-row lg:items-center justify-between gap-6">
214
+ <div className="flex items-start gap-4">
215
+ <div className="relative flex-shrink-0">
216
+ <div className="w-14 h-14 rounded-xl bg-white flex items-center justify-center">
217
+ <Check className="w-8 h-8 text-black" />
218
+ </div>
219
+ </div>
220
+ <div>
221
+ <div className="flex items-center gap-3 mb-2">
222
+ <h2 className="text-2xl font-bold text-white">{result.name}</h2>
223
+ <span className={`px-2.5 py-1 text-xs font-medium rounded-full bg-white/10 text-white`}>
224
+ {classificationInfo?.icon} {classificationInfo?.label}
225
+ </span>
226
+ </div>
227
+ <p className="text-neutral-400 text-sm">
228
+ Successfully extracted {result.tools.length} tools from repository
229
+ </p>
230
+ </div>
231
+ </div>
232
+
233
+ <div className="flex items-center gap-3">
234
+ <button
235
+ onClick={onReset}
236
+ className="flex items-center gap-2 px-4 py-2.5 text-sm bg-white/5 border border-neutral-700 rounded-lg hover:border-neutral-600 hover:bg-white/10 transition-colors"
237
+ >
238
+ <RefreshCw className="w-4 h-4" />
239
+ Convert Another
240
+ </button>
241
+
242
+ {/* Deploy to Cloud button */}
243
+ <DeployButton result={result} />
244
+
245
+ {/* Download dropdown */}
246
+ <div className="relative">
247
+ <button
248
+ onClick={() => setShowDownloadMenu(!showDownloadMenu)}
249
+ className="flex items-center gap-2 px-4 py-2.5 text-sm bg-white text-black rounded-lg hover:bg-neutral-200 transition-colors font-medium"
250
+ >
251
+ <Download className="w-4 h-4" />
252
+ Download
253
+ <ChevronDown className={`w-4 h-4 transition-transform ${showDownloadMenu ? 'rotate-180' : ''}`} />
254
+ </button>
255
+
256
+ <AnimatePresence>
257
+ {showDownloadMenu && (
258
+ <>
259
+ {/* Backdrop to close menu */}
260
+ <div
261
+ className="fixed inset-0 z-40"
262
+ onClick={() => setShowDownloadMenu(false)}
263
+ />
264
+
265
+ <motion.div
266
+ initial={{ opacity: 0, y: -10, scale: 0.95 }}
267
+ animate={{ opacity: 1, y: 0, scale: 1 }}
268
+ exit={{ opacity: 0, y: -10, scale: 0.95 }}
269
+ transition={{ duration: 0.15 }}
270
+ className="absolute right-0 mt-2 w-72 rounded-xl border border-neutral-700 bg-neutral-900 shadow-2xl z-50 overflow-hidden"
271
+ >
272
+ <div className="p-2">
273
+ {downloadOptions.map((option, index) => {
274
+ const Icon = option.icon;
275
+ return (
276
+ <button
277
+ key={option.id}
278
+ onClick={option.action}
279
+ className={`w-full flex items-start gap-3 px-3 py-2.5 rounded-lg text-left transition-colors ${
280
+ option.highlight
281
+ ? 'bg-white/10 hover:bg-white/20'
282
+ : 'hover:bg-white/5'
283
+ }`}
284
+ >
285
+ <div className={`w-8 h-8 rounded-lg flex items-center justify-center flex-shrink-0 ${
286
+ option.highlight ? 'bg-white/20' : 'bg-white/5'
287
+ }`}>
288
+ <Icon className="w-4 h-4 text-white" />
289
+ </div>
290
+ <div className="flex-1 min-w-0">
291
+ <div className="text-sm font-medium text-white flex items-center gap-2">
292
+ {option.label}
293
+ {option.highlight && (
294
+ <span className="px-1.5 py-0.5 text-[10px] font-bold rounded bg-green-500/20 text-green-400">
295
+ RECOMMENDED
296
+ </span>
297
+ )}
298
+ </div>
299
+ <div className="text-xs text-neutral-500 truncate">
300
+ {option.description}
301
+ </div>
302
+ </div>
303
+ </button>
304
+ );
305
+ })}
306
+ </div>
307
+ </motion.div>
308
+ </>
309
+ )}
310
+ </AnimatePresence>
311
+ </div>
312
+ </div>
313
+ </div>
314
+
315
+ {/* Stats grid */}
316
+ <div className="grid grid-cols-2 md:grid-cols-4 gap-4 mt-6 pt-6 border-t border-neutral-800">
317
+ <div className="p-4 bg-black/30 rounded-xl">
318
+ <div className="flex items-center gap-2 mb-2">
319
+ <Package className="w-4 h-4 text-white" />
320
+ <span className="text-xs text-neutral-500">Tools</span>
321
+ </div>
322
+ <div className="text-2xl font-bold font-mono text-white">
323
+ {result.tools.length}
324
+ </div>
325
+ </div>
326
+ <div className="p-4 bg-black/30 rounded-xl">
327
+ <div className="flex items-center gap-2 mb-2">
328
+ <Layers className="w-4 h-4 text-neutral-400" />
329
+ <span className="text-xs text-neutral-500">Sources</span>
330
+ </div>
331
+ <div className="text-2xl font-bold font-mono text-white">
332
+ {result.sources?.length || Object.keys(toolsBySource).length}
333
+ </div>
334
+ </div>
335
+ <div className="p-4 bg-black/30 rounded-xl">
336
+ <div className="flex items-center gap-2 mb-2">
337
+ <Code2 className="w-4 h-4 text-neutral-400" />
338
+ <span className="text-xs text-neutral-500">Lines</span>
339
+ </div>
340
+ <div className="text-2xl font-bold font-mono text-white">
341
+ {result.code.split('\n').length.toLocaleString()}
342
+ </div>
343
+ </div>
344
+ <div className="p-4 bg-black/30 rounded-xl">
345
+ <div className="flex items-center gap-2 mb-2">
346
+ <Clock className="w-4 h-4 text-neutral-400" />
347
+ <span className="text-xs text-neutral-500">Generated</span>
348
+ </div>
349
+ <div className="text-lg font-medium text-white">
350
+ {result.generatedAt ? formatRelativeTime(result.generatedAt) : 'Just now'}
351
+ </div>
352
+ </div>
353
+ </div>
354
+ </motion.div>
355
+
356
+ {/* Tabs */}
357
+ <div className="rounded-2xl border border-neutral-800 bg-neutral-900/50 backdrop-blur-xl overflow-hidden">
358
+ {/* Tab header */}
359
+ <div className="flex items-center border-b border-neutral-800 p-2 overflow-x-auto">
360
+ {tabs.map((tab) => {
361
+ const Icon = tab.icon;
362
+ const isActive = activeTab === tab.id;
363
+ const isHighlight = 'highlight' in tab && tab.highlight;
364
+ return (
365
+ <button
366
+ key={tab.id}
367
+ onClick={() => setActiveTab(tab.id)}
368
+ className={`flex items-center gap-2 px-4 py-2.5 rounded-lg text-sm font-medium transition-all whitespace-nowrap ${
369
+ isActive
370
+ ? isHighlight
371
+ ? 'bg-gradient-to-r from-green-500 to-emerald-600 text-white'
372
+ : 'bg-white text-black'
373
+ : isHighlight
374
+ ? 'text-green-400 hover:text-green-300 hover:bg-green-500/10 border border-green-500/30'
375
+ : 'text-neutral-400 hover:text-white hover:bg-white/5'
376
+ }`}
377
+ >
378
+ <Icon className="w-4 h-4" />
379
+ {tab.label}
380
+ {tab.count !== undefined && (
381
+ <span className={`ml-1 px-1.5 py-0.5 text-xs rounded ${
382
+ isActive ? 'bg-black/10' : 'bg-white/10'
383
+ }`}>
384
+ {tab.count}
385
+ </span>
386
+ )}
387
+ {isHighlight && !isActive && (
388
+ <span className="ml-1 px-1.5 py-0.5 text-xs rounded bg-green-500/20 text-green-400">
389
+ NEW
390
+ </span>
391
+ )}
392
+ </button>
393
+ );
394
+ })}
395
+ </div>
396
+
397
+ {/* Tab content */}
398
+ <div className="p-6">
399
+ {activeTab === 'install' && (
400
+ <OneClickInstall
401
+ result={result}
402
+ onCopy={handleCopy}
403
+ copied={copied}
404
+ />
405
+ )}
406
+
407
+ {activeTab === 'tools' && (
408
+ <ToolList
409
+ tools={result.tools}
410
+ showFilter={result.tools.length > 5}
411
+ />
412
+ )}
413
+
414
+ {activeTab === 'playground' && (
415
+ <InlinePlayground
416
+ tools={result.tools}
417
+ generatedCode={result.code}
418
+ />
419
+ )}
420
+
421
+ {activeTab === 'code' && (
422
+ <div className="space-y-4">
423
+ {/* Language toggle */}
424
+ <div className="flex items-center gap-2">
425
+ <button
426
+ onClick={() => setCodeLanguage('typescript')}
427
+ className={`flex items-center gap-2 px-3 py-1.5 rounded-lg text-sm font-medium transition-all ${
428
+ codeLanguage === 'typescript'
429
+ ? 'bg-white text-black'
430
+ : 'text-neutral-400 hover:text-white hover:bg-white/5'
431
+ }`}
432
+ >
433
+ <Terminal className="w-4 h-4" />
434
+ TypeScript
435
+ </button>
436
+ {result.pythonCode && (
437
+ <button
438
+ onClick={() => setCodeLanguage('python')}
439
+ className={`flex items-center gap-2 px-3 py-1.5 rounded-lg text-sm font-medium transition-all ${
440
+ codeLanguage === 'python'
441
+ ? 'bg-white text-black'
442
+ : 'text-neutral-400 hover:text-white hover:bg-white/5'
443
+ }`}
444
+ >
445
+ <Code2 className="w-4 h-4" />
446
+ Python
447
+ </button>
448
+ )}
449
+ </div>
450
+
451
+ <CodeBlock
452
+ code={codeLanguage === 'typescript' ? result.code : (result.pythonCode || '')}
453
+ language={codeLanguage}
454
+ filename={`${result.name}-mcp-server.${codeLanguage === 'typescript' ? 'ts' : 'py'}`}
455
+ showCopy
456
+ showDownload
457
+ maxHeight="600px"
458
+ />
459
+ </div>
460
+ )}
461
+
462
+ {activeTab === 'config' && (
463
+ <div className="space-y-6">
464
+ <ClaudeConfigExport
465
+ serverName={result.name}
466
+ serverDescription={result.description}
467
+ />
468
+ <ConfigTabs
469
+ result={result}
470
+ onCopy={handleCopy}
471
+ copied={copied}
472
+ />
473
+ </div>
474
+ )}
475
+ </div>
476
+ </div>
477
+
478
+ {/* Try in Playground CTA - After install/config options */}
479
+ <TryInPlayground result={result} />
480
+ </div>
481
+ );
482
+ }