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,133 @@
1
+ /**
2
+ * Conversion Hook - Handles all conversion logic
3
+ * @copyright 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ 'use client';
8
+
9
+ import { useState, useCallback } from 'react';
10
+ import type {
11
+ ConversionResult,
12
+ ConversionStatus,
13
+ ConversionOptions,
14
+ ApiError,
15
+ ConversionHistory
16
+ } from '@/types';
17
+ import { useLocalStorage } from './use-local-storage';
18
+ import { generateId, parseGitHubUrl } from '@/lib/utils';
19
+ import { MAX_HISTORY_ITEMS } from '@/lib/constants';
20
+
21
+ interface UseConversionReturn {
22
+ status: ConversionStatus;
23
+ result: ConversionResult | null;
24
+ error: ApiError | null;
25
+ convert: (url: string, options?: ConversionOptions) => Promise<void>;
26
+ reset: () => void;
27
+ history: ConversionHistory[];
28
+ clearHistory: () => void;
29
+ removeFromHistory: (id: string) => void;
30
+ }
31
+
32
+ export function useConversion(): UseConversionReturn {
33
+ const [status, setStatus] = useState<ConversionStatus>('idle');
34
+ const [result, setResult] = useState<ConversionResult | null>(null);
35
+ const [error, setError] = useState<ApiError | null>(null);
36
+ const [history, setHistory] = useLocalStorage<ConversionHistory[]>('conversion-history', []);
37
+
38
+ const convert = useCallback(async (url: string, options?: ConversionOptions) => {
39
+ setStatus('loading');
40
+ setError(null);
41
+ setResult(null);
42
+
43
+ const startTime = performance.now();
44
+
45
+ try {
46
+ const response = await fetch('/api/convert', {
47
+ method: 'POST',
48
+ headers: {
49
+ 'Content-Type': 'application/json',
50
+ },
51
+ body: JSON.stringify({ url, options }),
52
+ });
53
+
54
+ const data = await response.json();
55
+
56
+ if (!response.ok) {
57
+ const apiError: ApiError = {
58
+ error: data.error || 'Conversion failed',
59
+ code: data.code || 'UNKNOWN_ERROR',
60
+ details: data.details,
61
+ retryAfter: response.status === 429 ? parseInt(response.headers.get('Retry-After') || '60') : undefined,
62
+ };
63
+ setError(apiError);
64
+ setStatus('error');
65
+ return;
66
+ }
67
+
68
+ // Enrich result with timing
69
+ const endTime = performance.now();
70
+ const enrichedResult: ConversionResult = {
71
+ ...data,
72
+ stats: {
73
+ ...data.stats,
74
+ processingTimeMs: Math.round(endTime - startTime),
75
+ },
76
+ generatedAt: new Date().toISOString(),
77
+ };
78
+
79
+ setResult(enrichedResult);
80
+ setStatus('success');
81
+
82
+ // Add to history
83
+ const parsed = parseGitHubUrl(url);
84
+ const historyEntry: ConversionHistory = {
85
+ id: generateId(),
86
+ url,
87
+ name: enrichedResult.name,
88
+ toolCount: enrichedResult.tools.length,
89
+ classification: enrichedResult.classification.type,
90
+ convertedAt: new Date().toISOString(),
91
+ };
92
+
93
+ setHistory(prev => {
94
+ const filtered = prev.filter(h => h.url !== url);
95
+ return [historyEntry, ...filtered].slice(0, MAX_HISTORY_ITEMS);
96
+ });
97
+
98
+ } catch (err) {
99
+ const apiError: ApiError = {
100
+ error: err instanceof Error ? err.message : 'Network error',
101
+ code: 'NETWORK_ERROR',
102
+ details: 'Failed to connect to the server. Please check your internet connection.',
103
+ };
104
+ setError(apiError);
105
+ setStatus('error');
106
+ }
107
+ }, [setHistory]);
108
+
109
+ const reset = useCallback(() => {
110
+ setStatus('idle');
111
+ setResult(null);
112
+ setError(null);
113
+ }, []);
114
+
115
+ const clearHistory = useCallback(() => {
116
+ setHistory([]);
117
+ }, [setHistory]);
118
+
119
+ const removeFromHistory = useCallback((id: string) => {
120
+ setHistory(prev => prev.filter(h => h.id !== id));
121
+ }, [setHistory]);
122
+
123
+ return {
124
+ status,
125
+ result,
126
+ error,
127
+ convert,
128
+ reset,
129
+ history,
130
+ clearHistory,
131
+ removeFromHistory,
132
+ };
133
+ }
@@ -0,0 +1,376 @@
1
+ /**
2
+ * useExecutionHistory Hook
3
+ * Tracks execution history across tools, resources, and prompts
4
+ * @copyright 2024-2026 nirholas
5
+ * @license MIT
6
+ */
7
+
8
+ 'use client';
9
+
10
+ import { useState, useCallback, useRef, useEffect } from 'react';
11
+ import type {
12
+ ExecutionHistoryEntry,
13
+ ExecutionType,
14
+ UseExecutionHistoryReturn,
15
+ ToolExecution,
16
+ ResourceRead,
17
+ PromptExecution,
18
+ UseExecutionHistoryOptions as TypedOptions,
19
+ } from './types';
20
+ import { generateId } from './types';
21
+
22
+ // ============================================================================
23
+ // Constants
24
+ // ============================================================================
25
+
26
+ const LOCAL_STORAGE_KEY = 'mcp-playground-execution-history';
27
+ const MAX_HISTORY_SIZE = 1000;
28
+
29
+ // ============================================================================
30
+ // Hook Implementation
31
+ // ============================================================================
32
+
33
+ export interface UseExecutionHistoryOptions {
34
+ /** Maximum number of history entries to keep */
35
+ maxSize?: number;
36
+ /** Alias for maxSize */
37
+ maxItems?: number;
38
+ /** Whether to persist history to localStorage */
39
+ persist?: boolean;
40
+ /** Alias for persist */
41
+ persistToStorage?: boolean;
42
+ /** Custom storage key */
43
+ storageKey?: string;
44
+ }
45
+
46
+ export function useExecutionHistory(
47
+ options: UseExecutionHistoryOptions = {}
48
+ ): UseExecutionHistoryReturn {
49
+ const {
50
+ maxSize = MAX_HISTORY_SIZE,
51
+ maxItems,
52
+ persist = false,
53
+ persistToStorage,
54
+ storageKey = LOCAL_STORAGE_KEY,
55
+ } = options;
56
+
57
+ // Support both naming conventions
58
+ const effectiveMaxSize = maxItems ?? maxSize;
59
+ const effectivePersist = persistToStorage ?? persist;
60
+
61
+ // State
62
+ const [history, setHistory] = useState<ExecutionHistoryEntry[]>([]);
63
+
64
+ // Refs
65
+ const mountedRef = useRef(true);
66
+ const initializedRef = useRef(false);
67
+
68
+ // Load from localStorage on mount
69
+ useEffect(() => {
70
+ mountedRef.current = true;
71
+
72
+ if (effectivePersist && !initializedRef.current && typeof window !== 'undefined') {
73
+ initializedRef.current = true;
74
+ try {
75
+ const stored = localStorage.getItem(storageKey);
76
+ if (stored) {
77
+ const parsed = JSON.parse(stored) as ExecutionHistoryEntry[];
78
+ // Convert date strings back to Date objects
79
+ const entries = parsed.map(entry => ({
80
+ ...entry,
81
+ timestamp: new Date(entry.timestamp),
82
+ }));
83
+ setHistory(entries);
84
+ }
85
+ } catch (err) {
86
+ console.warn('[useExecutionHistory] Failed to load history from localStorage:', err);
87
+ }
88
+ }
89
+
90
+ return () => {
91
+ mountedRef.current = false;
92
+ };
93
+ }, [effectivePersist, storageKey]);
94
+
95
+ // Save to localStorage when history changes
96
+ useEffect(() => {
97
+ if (effectivePersist && initializedRef.current && typeof window !== 'undefined') {
98
+ try {
99
+ localStorage.setItem(storageKey, JSON.stringify(history));
100
+ } catch (err) {
101
+ console.warn('[useExecutionHistory] Failed to save history to localStorage:', err);
102
+ }
103
+ }
104
+ }, [history, effectivePersist, storageKey]);
105
+
106
+ /**
107
+ * Add a new entry to the history
108
+ */
109
+ const add = useCallback(
110
+ (entry: Omit<ExecutionHistoryEntry, 'id' | 'timestamp'>): void => {
111
+ const newEntry: ExecutionHistoryEntry = {
112
+ ...entry,
113
+ id: generateId(),
114
+ timestamp: new Date(),
115
+ };
116
+
117
+ if (mountedRef.current) {
118
+ setHistory(prev => {
119
+ const updated = [newEntry, ...prev];
120
+ // Trim to max size
121
+ if (updated.length > effectiveMaxSize) {
122
+ return updated.slice(0, effectiveMaxSize);
123
+ }
124
+ return updated;
125
+ });
126
+ }
127
+ },
128
+ [effectiveMaxSize]
129
+ );
130
+
131
+ /**
132
+ * Add a tool execution to history
133
+ */
134
+ const addExecution = useCallback(
135
+ (execution: ToolExecution): void => {
136
+ add({
137
+ type: 'tool',
138
+ name: execution.toolName,
139
+ params: execution.params,
140
+ result: execution.result,
141
+ error: execution.error,
142
+ success: execution.status === 'success',
143
+ executionTime: execution.executionTime,
144
+ });
145
+ },
146
+ [add]
147
+ );
148
+
149
+ /**
150
+ * Add a resource read to history
151
+ */
152
+ const addResourceRead = useCallback(
153
+ (read: ResourceRead): void => {
154
+ add({
155
+ type: 'resource',
156
+ name: read.uri,
157
+ result: read.contents,
158
+ error: read.error,
159
+ success: read.status === 'success',
160
+ });
161
+ },
162
+ [add]
163
+ );
164
+
165
+ /**
166
+ * Add a prompt execution to history
167
+ */
168
+ const addPromptExecution = useCallback(
169
+ (execution: PromptExecution): void => {
170
+ add({
171
+ type: 'prompt',
172
+ name: execution.name || execution.promptName || 'unknown',
173
+ params: execution.args || execution.arguments,
174
+ result: execution.messages,
175
+ error: execution.error,
176
+ success: execution.status === 'success',
177
+ });
178
+ },
179
+ [add]
180
+ );
181
+
182
+ /**
183
+ * Clear all history
184
+ */
185
+ const clear = useCallback((): void => {
186
+ if (mountedRef.current) {
187
+ setHistory([]);
188
+ }
189
+
190
+ if (effectivePersist && typeof window !== 'undefined') {
191
+ try {
192
+ localStorage.removeItem(storageKey);
193
+ } catch (err) {
194
+ console.warn('[useExecutionHistory] Failed to clear localStorage:', err);
195
+ }
196
+ }
197
+ }, [effectivePersist, storageKey]);
198
+
199
+ /** Alias for clear */
200
+ const clearHistory = clear;
201
+
202
+ /**
203
+ * Get entries by type
204
+ */
205
+ const getByType = useCallback(
206
+ (type: ExecutionType): ExecutionHistoryEntry[] => {
207
+ return history.filter(entry => entry.type === type);
208
+ },
209
+ [history]
210
+ );
211
+
212
+ /**
213
+ * Get entries by success status
214
+ */
215
+ const getByStatus = useCallback(
216
+ (success: boolean): ExecutionHistoryEntry[] => {
217
+ return history.filter(entry => entry.success === success);
218
+ },
219
+ [history]
220
+ );
221
+
222
+ /**
223
+ * Export history as JSON string
224
+ */
225
+ const exportHistory = useCallback((): string => {
226
+ return JSON.stringify(history, null, 2);
227
+ }, [history]);
228
+
229
+ /**
230
+ * Import history from JSON string
231
+ */
232
+ const importHistory = useCallback((json: string): void => {
233
+ try {
234
+ const parsed = JSON.parse(json) as ExecutionHistoryEntry[];
235
+
236
+ // Validate structure
237
+ if (!Array.isArray(parsed)) {
238
+ throw new Error('Invalid history format: expected an array');
239
+ }
240
+
241
+ // Convert and validate entries
242
+ const entries = parsed.map((entry, index) => {
243
+ if (!entry.type || !entry.name || typeof entry.success !== 'boolean') {
244
+ throw new Error(`Invalid entry at index ${index}`);
245
+ }
246
+ return {
247
+ ...entry,
248
+ id: entry.id || generateId(),
249
+ timestamp: new Date(entry.timestamp || Date.now()),
250
+ };
251
+ });
252
+
253
+ if (mountedRef.current) {
254
+ setHistory(entries.slice(0, maxSize));
255
+ }
256
+ } catch (err) {
257
+ const message = err instanceof Error ? err.message : 'Failed to import history';
258
+ console.error('[useExecutionHistory] Import failed:', message);
259
+ throw new Error(`Failed to import history: ${message}`);
260
+ }
261
+ }, [maxSize]);
262
+
263
+ return {
264
+ history,
265
+ add,
266
+ addExecution,
267
+ addResourceRead,
268
+ addPromptExecution,
269
+ clear,
270
+ clearHistory,
271
+ getByType,
272
+ getByStatus,
273
+ export: exportHistory,
274
+ exportHistory,
275
+ import: importHistory,
276
+ importHistory,
277
+ };
278
+ }
279
+
280
+ // ============================================================================
281
+ // Helper Functions
282
+ // ============================================================================
283
+
284
+ /**
285
+ * Filter history by type
286
+ */
287
+ export function filterHistoryByType(
288
+ history: ExecutionHistoryEntry[],
289
+ type: ExecutionType
290
+ ): ExecutionHistoryEntry[] {
291
+ return history.filter(entry => entry.type === type);
292
+ }
293
+
294
+ /**
295
+ * Filter history by success/failure
296
+ */
297
+ export function filterHistoryBySuccess(
298
+ history: ExecutionHistoryEntry[],
299
+ success: boolean
300
+ ): ExecutionHistoryEntry[] {
301
+ return history.filter(entry => entry.success === success);
302
+ }
303
+
304
+ /**
305
+ * Filter history by date range
306
+ */
307
+ export function filterHistoryByDateRange(
308
+ history: ExecutionHistoryEntry[],
309
+ start: Date,
310
+ end: Date
311
+ ): ExecutionHistoryEntry[] {
312
+ return history.filter(
313
+ entry => entry.timestamp >= start && entry.timestamp <= end
314
+ );
315
+ }
316
+
317
+ /**
318
+ * Get history statistics
319
+ */
320
+ export interface HistoryStats {
321
+ total: number;
322
+ tools: number;
323
+ resources: number;
324
+ prompts: number;
325
+ successes: number;
326
+ failures: number;
327
+ averageExecutionTime: number | null;
328
+ }
329
+
330
+ export function getHistoryStats(history: ExecutionHistoryEntry[]): HistoryStats {
331
+ const stats: HistoryStats = {
332
+ total: history.length,
333
+ tools: 0,
334
+ resources: 0,
335
+ prompts: 0,
336
+ successes: 0,
337
+ failures: 0,
338
+ averageExecutionTime: null,
339
+ };
340
+
341
+ let totalExecutionTime = 0;
342
+ let executionTimeCount = 0;
343
+
344
+ for (const entry of history) {
345
+ switch (entry.type) {
346
+ case 'tool':
347
+ stats.tools++;
348
+ break;
349
+ case 'resource':
350
+ stats.resources++;
351
+ break;
352
+ case 'prompt':
353
+ stats.prompts++;
354
+ break;
355
+ }
356
+
357
+ if (entry.success) {
358
+ stats.successes++;
359
+ } else {
360
+ stats.failures++;
361
+ }
362
+
363
+ if (entry.executionTime !== undefined) {
364
+ totalExecutionTime += entry.executionTime;
365
+ executionTimeCount++;
366
+ }
367
+ }
368
+
369
+ if (executionTimeCount > 0) {
370
+ stats.averageExecutionTime = totalExecutionTime / executionTimeCount;
371
+ }
372
+
373
+ return stats;
374
+ }
375
+
376
+ export default useExecutionHistory;
@@ -0,0 +1,147 @@
1
+ /**
2
+ * useGenerationProgress Hook - Manages generation step state and progress
3
+ * @copyright 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ 'use client';
8
+
9
+ import { useState, useCallback, useMemo } from 'react';
10
+ import type { GenerationStep, GenerationStepId, GenerationStepStatus } from '@/components/GenerationProgress';
11
+
12
+ const INITIAL_STEPS: GenerationStep[] = [
13
+ {
14
+ id: 'fetching',
15
+ label: 'Fetching Repository',
16
+ description: 'Downloading repository metadata and files',
17
+ status: 'pending',
18
+ },
19
+ {
20
+ id: 'classifying',
21
+ label: 'Classifying Repo',
22
+ description: 'Detecting repository type and structure',
23
+ status: 'pending',
24
+ },
25
+ {
26
+ id: 'extracting',
27
+ label: 'Extracting Tools',
28
+ description: 'Analyzing code and documentation',
29
+ status: 'pending',
30
+ },
31
+ {
32
+ id: 'generating',
33
+ label: 'Generating Server',
34
+ description: 'Creating MCP server code and configs',
35
+ status: 'pending',
36
+ },
37
+ ];
38
+
39
+ export interface UseGenerationProgressReturn {
40
+ steps: GenerationStep[];
41
+ currentStep: GenerationStepId | null;
42
+ totalToolsFound: number;
43
+ statusMessage: string;
44
+ progress: number;
45
+ isComplete: boolean;
46
+ hasError: boolean;
47
+ startStep: (stepId: GenerationStepId, detail?: string) => void;
48
+ completeStep: (stepId: GenerationStepId, toolsFound?: number) => void;
49
+ errorStep: (stepId: GenerationStepId, errorDetail?: string) => void;
50
+ setStatusMessage: (message: string) => void;
51
+ addToolsFound: (count: number) => void;
52
+ reset: () => void;
53
+ }
54
+
55
+ export function useGenerationProgress(): UseGenerationProgressReturn {
56
+ const [steps, setSteps] = useState<GenerationStep[]>(INITIAL_STEPS);
57
+ const [currentStep, setCurrentStep] = useState<GenerationStepId | null>(null);
58
+ const [totalToolsFound, setTotalToolsFound] = useState(0);
59
+ const [statusMessage, setStatusMessage] = useState('');
60
+
61
+ const updateStepStatus = useCallback((stepId: GenerationStepId, status: GenerationStepStatus, updates: Partial<GenerationStep> = {}) => {
62
+ setSteps(prev => prev.map(step =>
63
+ step.id === stepId ? { ...step, status, ...updates } : step
64
+ ));
65
+ }, []);
66
+
67
+ const startStep = useCallback((stepId: GenerationStepId, detail?: string) => {
68
+ // Mark previous steps as complete if not already
69
+ setSteps(prev => prev.map(step => {
70
+ const stepIndex = prev.findIndex(s => s.id === stepId);
71
+ const currentIndex = prev.findIndex(s => s.id === step.id);
72
+
73
+ if (currentIndex < stepIndex && step.status !== 'complete' && step.status !== 'error') {
74
+ return { ...step, status: 'complete' as const };
75
+ }
76
+ if (step.id === stepId) {
77
+ return { ...step, status: 'in-progress' as const, detail };
78
+ }
79
+ return step;
80
+ }));
81
+ setCurrentStep(stepId);
82
+ }, []);
83
+
84
+ const completeStep = useCallback((stepId: GenerationStepId, toolsFound?: number) => {
85
+ updateStepStatus(stepId, 'complete', { toolsFound });
86
+ if (toolsFound) {
87
+ setTotalToolsFound(prev => prev + toolsFound);
88
+ }
89
+ }, [updateStepStatus]);
90
+
91
+ const errorStep = useCallback((stepId: GenerationStepId, errorDetail?: string) => {
92
+ updateStepStatus(stepId, 'error', { detail: errorDetail });
93
+ }, [updateStepStatus]);
94
+
95
+ const addToolsFound = useCallback((count: number) => {
96
+ setTotalToolsFound(prev => prev + count);
97
+ // Also update the current step's tools found
98
+ if (currentStep) {
99
+ setSteps(prev => prev.map(step =>
100
+ step.id === currentStep
101
+ ? { ...step, toolsFound: (step.toolsFound || 0) + count }
102
+ : step
103
+ ));
104
+ }
105
+ }, [currentStep]);
106
+
107
+ const reset = useCallback(() => {
108
+ setSteps(INITIAL_STEPS);
109
+ setCurrentStep(null);
110
+ setTotalToolsFound(0);
111
+ setStatusMessage('');
112
+ }, []);
113
+
114
+ const progress = useMemo(() => {
115
+ const weights = { pending: 0, 'in-progress': 0.5, complete: 1, error: 0 };
116
+ const totalProgress = steps.reduce((acc, step) => acc + weights[step.status], 0);
117
+ return Math.round((totalProgress / steps.length) * 100);
118
+ }, [steps]);
119
+
120
+ const isComplete = useMemo(() =>
121
+ steps.every(step => step.status === 'complete'),
122
+ [steps]
123
+ );
124
+
125
+ const hasError = useMemo(() =>
126
+ steps.some(step => step.status === 'error'),
127
+ [steps]
128
+ );
129
+
130
+ return {
131
+ steps,
132
+ currentStep,
133
+ totalToolsFound,
134
+ statusMessage,
135
+ progress,
136
+ isComplete,
137
+ hasError,
138
+ startStep,
139
+ completeStep,
140
+ errorStep,
141
+ setStatusMessage,
142
+ addToolsFound,
143
+ reset,
144
+ };
145
+ }
146
+
147
+ export default useGenerationProgress;