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,472 @@
1
+ /**
2
+ * Playground Component - Interactive MCP tool testing sandbox
3
+ * @copyright 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ 'use client';
8
+
9
+ import { useState, useCallback, useMemo, useEffect } from 'react';
10
+ import { motion, AnimatePresence } from 'framer-motion';
11
+ import {
12
+ Search,
13
+ Code2,
14
+ Play,
15
+ ChevronRight,
16
+ Package,
17
+ FileJson,
18
+ Terminal,
19
+ AlertCircle,
20
+ Sparkles,
21
+ Upload,
22
+ RefreshCw,
23
+ } from 'lucide-react';
24
+ import { Input } from '@/components/ui/input';
25
+ import { Button } from '@/components/ui/button';
26
+ import PlaygroundToolTester from './PlaygroundToolTester';
27
+ import SplitView from './SplitView';
28
+ import ServerStatus from './playground/ServerStatus';
29
+ import ExecutionLog from './playground/ExecutionLog';
30
+ import type { Tool, ConversionResult } from '@/types';
31
+ import { useLocalStorage } from '@/hooks/use-local-storage';
32
+ import { useMcpExecution } from '@/hooks/use-mcp-execution';
33
+
34
+ interface PlaygroundProps {
35
+ initialResult?: ConversionResult | null;
36
+ className?: string;
37
+ }
38
+
39
+ // Demo tools for when no result is loaded
40
+ const DEMO_TOOLS: Tool[] = [
41
+ {
42
+ name: 'get_repository',
43
+ description: 'Fetch information about a GitHub repository',
44
+ inputSchema: {
45
+ type: 'object',
46
+ properties: {
47
+ repo_url: {
48
+ type: 'string',
49
+ description: 'GitHub repository URL or owner/repo (e.g., "facebook/react" or "https://github.com/facebook/react")',
50
+ },
51
+ include_stats: {
52
+ type: 'boolean',
53
+ description: 'Include repository statistics',
54
+ default: false,
55
+ },
56
+ },
57
+ required: ['repo_url'],
58
+ },
59
+ source: { type: 'openapi', file: 'demo' },
60
+ },
61
+ {
62
+ name: 'search_issues',
63
+ description: 'Search for issues in a repository',
64
+ inputSchema: {
65
+ type: 'object',
66
+ properties: {
67
+ repo_url: {
68
+ type: 'string',
69
+ description: 'GitHub repository URL or owner/repo',
70
+ },
71
+ query: {
72
+ type: 'string',
73
+ description: 'Search query',
74
+ },
75
+ state: {
76
+ type: 'string',
77
+ description: 'Issue state filter',
78
+ enum: ['open', 'closed', 'all'],
79
+ default: 'open',
80
+ },
81
+ labels: {
82
+ type: 'array',
83
+ description: 'Filter by labels',
84
+ },
85
+ limit: {
86
+ type: 'number',
87
+ description: 'Maximum number of results',
88
+ default: 10,
89
+ },
90
+ },
91
+ required: ['repo_url', 'query'],
92
+ },
93
+ source: { type: 'code', file: 'demo' },
94
+ },
95
+ {
96
+ name: 'create_comment',
97
+ description: 'Add a comment to an issue or pull request',
98
+ inputSchema: {
99
+ type: 'object',
100
+ properties: {
101
+ repo_url: {
102
+ type: 'string',
103
+ description: 'GitHub repository URL or owner/repo',
104
+ },
105
+ issue_number: {
106
+ type: 'number',
107
+ description: 'Issue or PR number',
108
+ },
109
+ body: {
110
+ type: 'string',
111
+ description: 'Comment body (markdown supported)',
112
+ },
113
+ },
114
+ required: ['repo_url', 'issue_number', 'body'],
115
+ },
116
+ source: { type: 'readme', file: 'demo' },
117
+ },
118
+ ];
119
+
120
+ export default function Playground({ initialResult, className = '' }: PlaygroundProps) {
121
+ const [storedResult] = useLocalStorage<ConversionResult | null>('playground-result', null);
122
+ const [storedCode, setStoredCode] = useLocalStorage<string | null>('playground-code', null);
123
+ const [searchQuery, setSearchQuery] = useState('');
124
+ const [selectedTool, setSelectedTool] = useState<Tool | null>(null);
125
+
126
+ // Use provided result, stored result, or demo tools
127
+ const result = initialResult || storedResult;
128
+ const generatedCode = result?.code || storedCode;
129
+ const isDemo = !generatedCode;
130
+
131
+ // MCP execution hook
132
+ const {
133
+ tools: serverTools,
134
+ isConnected,
135
+ isConnecting,
136
+ isLoading,
137
+ error: connectionError,
138
+ sessionId,
139
+ executionLogs,
140
+ connect,
141
+ disconnect,
142
+ executeTool,
143
+ clearLogs,
144
+ } = useMcpExecution({
145
+ generatedCode,
146
+ onToolsLoaded: (loadedTools) => {
147
+ // Auto-select first tool when tools are loaded
148
+ if (loadedTools.length > 0 && !selectedTool) {
149
+ setSelectedTool(loadedTools[0]);
150
+ }
151
+ },
152
+ });
153
+
154
+ // Use server tools when connected, otherwise use result tools or demo tools
155
+ const tools = isConnected && serverTools.length > 0 ? serverTools : (result?.tools || DEMO_TOOLS);
156
+
157
+ // Filter tools based on search
158
+ const filteredTools = useMemo(() => {
159
+ if (!searchQuery) return tools;
160
+ const query = searchQuery.toLowerCase();
161
+ return tools.filter(
162
+ tool =>
163
+ tool.name.toLowerCase().includes(query) ||
164
+ tool.description.toLowerCase().includes(query)
165
+ );
166
+ }, [tools, searchQuery]);
167
+
168
+ // Select first tool if none selected
169
+ useEffect(() => {
170
+ if (!selectedTool && filteredTools.length > 0) {
171
+ setSelectedTool(filteredTools[0]);
172
+ }
173
+ }, [filteredTools, selectedTool]);
174
+
175
+ // Handle tool execution
176
+ const handleExecute = useCallback(async (tool: Tool, params: Record<string, unknown>) => {
177
+ if (isConnected) {
178
+ // Real execution via MCP server
179
+ return await executeTool(tool.name, params);
180
+ }
181
+
182
+ // Mock execution for demo mode
183
+ await new Promise(resolve => setTimeout(resolve, 800 + Math.random() * 400));
184
+
185
+ return {
186
+ success: true,
187
+ tool: tool.name,
188
+ timestamp: new Date().toISOString(),
189
+ params,
190
+ response: {
191
+ message: `[Demo] Mock response for ${tool.name}`,
192
+ data: {
193
+ id: Math.random().toString(36).substring(7),
194
+ ...params,
195
+ },
196
+ },
197
+ };
198
+ }, [isConnected, executeTool]);
199
+
200
+ // Handle loading code from file input
201
+ const handleLoadCode = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {
202
+ const file = event.target.files?.[0];
203
+ if (!file) return;
204
+
205
+ const reader = new FileReader();
206
+ reader.onload = (e) => {
207
+ const code = e.target?.result as string;
208
+ setStoredCode(code);
209
+ };
210
+ reader.readAsText(file);
211
+ }, [setStoredCode]);
212
+
213
+ const SOURCE_COLORS: Record<string, string> = {
214
+ readme: 'bg-blue-500/10 text-blue-400',
215
+ code: 'bg-purple-500/10 text-purple-400',
216
+ openapi: 'bg-green-500/10 text-green-400',
217
+ graphql: 'bg-pink-500/10 text-pink-400',
218
+ 'mcp-introspect': 'bg-yellow-500/10 text-yellow-400',
219
+ universal: 'bg-neutral-500/10 text-neutral-400',
220
+ };
221
+
222
+ return (
223
+ <div className={`flex flex-col h-full ${className}`}>
224
+ {/* Server Status */}
225
+ <ServerStatus
226
+ isConnected={isConnected}
227
+ isConnecting={isConnecting}
228
+ sessionId={sessionId}
229
+ error={connectionError}
230
+ isDemoMode={isDemo}
231
+ onConnect={generatedCode ? connect : undefined}
232
+ onDisconnect={disconnect}
233
+ className="mb-4"
234
+ />
235
+
236
+ {/* Demo notice with CTA */}
237
+ {isDemo && (
238
+ <motion.div
239
+ initial={{ opacity: 0, y: -10 }}
240
+ animate={{ opacity: 1, y: 0 }}
241
+ className="mb-4 p-4 rounded-lg border border-yellow-500/30 bg-yellow-500/10"
242
+ >
243
+ <div className="flex items-start gap-3">
244
+ <Sparkles className="w-5 h-5 text-yellow-400 flex-shrink-0 mt-0.5" />
245
+ <div className="flex-1">
246
+ <p className="text-sm text-yellow-300 font-medium">
247
+ Demo Mode - Not Connected to Real Server
248
+ </p>
249
+ <p className="text-sm text-yellow-300/70 mt-1">
250
+ You&apos;re viewing sample tools.{' '}
251
+ <a href="/convert" className="underline hover:text-white transition-colors">
252
+ Convert a repository
253
+ </a>{' '}
254
+ to test your own tools, or load existing code.
255
+ </p>
256
+ <div className="flex items-center gap-3 mt-3">
257
+ <Button
258
+ variant="secondary"
259
+ size="sm"
260
+ onClick={() => window.location.href = '/convert'}
261
+ leftIcon={<Play className="w-4 h-4" />}
262
+ >
263
+ Convert a Repo
264
+ </Button>
265
+ <label className="cursor-pointer">
266
+ <input
267
+ type="file"
268
+ accept=".ts,.js,.mcp"
269
+ onChange={handleLoadCode}
270
+ className="hidden"
271
+ />
272
+ <Button
273
+ variant="outline"
274
+ size="sm"
275
+ leftIcon={<Upload className="w-4 h-4" />}
276
+ asChild
277
+ >
278
+ <span>Load Code</span>
279
+ </Button>
280
+ </label>
281
+ </div>
282
+ </div>
283
+ </div>
284
+ </motion.div>
285
+ )}
286
+
287
+ {/* Not connected notice (has code but not connected) */}
288
+ {!isDemo && !isConnected && !isConnecting && (
289
+ <motion.div
290
+ initial={{ opacity: 0, y: -10 }}
291
+ animate={{ opacity: 1, y: 0 }}
292
+ className="mb-4 p-3 rounded-lg border border-blue-500/30 bg-blue-500/10 flex items-center justify-between gap-3"
293
+ >
294
+ <div className="flex items-center gap-2">
295
+ <Terminal className="w-4 h-4 text-blue-400" />
296
+ <span className="text-sm text-blue-300">
297
+ Ready to connect. Click &quot;Connect&quot; to start the MCP server and test tools.
298
+ </span>
299
+ </div>
300
+ <Button
301
+ variant="secondary"
302
+ size="sm"
303
+ onClick={connect}
304
+ leftIcon={<RefreshCw className="w-4 h-4" />}
305
+ >
306
+ Connect
307
+ </Button>
308
+ </motion.div>
309
+ )}
310
+
311
+ {/* Main content with split view */}
312
+ <div className="flex-1 min-h-0">
313
+ <SplitView
314
+ left={
315
+ <div className="flex flex-col h-full rounded-xl border border-neutral-800 bg-neutral-900/50 overflow-hidden">
316
+ {/* Sidebar header */}
317
+ <div className="p-3 border-b border-neutral-800">
318
+ <div className="flex items-center gap-2 mb-3">
319
+ <Package className="w-4 h-4 text-neutral-400" />
320
+ <span className="text-sm font-medium text-white">
321
+ Tools ({tools.length})
322
+ </span>
323
+ {isConnected && (
324
+ <span className="px-1.5 py-0.5 text-xs rounded bg-green-500/20 text-green-400">
325
+ Live
326
+ </span>
327
+ )}
328
+ {isDemo && (
329
+ <span className="px-1.5 py-0.5 text-xs rounded bg-yellow-500/20 text-yellow-400">
330
+ Demo
331
+ </span>
332
+ )}
333
+ </div>
334
+ <div className="relative">
335
+ <Search className="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-neutral-500" />
336
+ <Input
337
+ type="text"
338
+ value={searchQuery}
339
+ onChange={(e) => setSearchQuery(e.target.value)}
340
+ placeholder="Search tools..."
341
+ className="pl-9 h-9 text-sm"
342
+ />
343
+ </div>
344
+ </div>
345
+
346
+ {/* Tool list */}
347
+ <div className="flex-1 overflow-y-auto py-1">
348
+ {filteredTools.length === 0 ? (
349
+ <div className="p-4 text-center">
350
+ <AlertCircle className="w-8 h-8 text-neutral-600 mx-auto mb-2" />
351
+ <p className="text-sm text-neutral-500">No tools found</p>
352
+ </div>
353
+ ) : (
354
+ filteredTools.map((tool) => {
355
+ const isSelected = selectedTool?.name === tool.name;
356
+ const sourceColor = SOURCE_COLORS[tool.source?.type || 'universal'] || SOURCE_COLORS.universal;
357
+
358
+ return (
359
+ <button
360
+ key={tool.name}
361
+ onClick={() => setSelectedTool(tool)}
362
+ className={`w-full p-3 flex items-start gap-3 text-left transition-colors ${
363
+ isSelected
364
+ ? 'bg-white/10 border-l-2 border-white'
365
+ : 'hover:bg-white/5 border-l-2 border-transparent'
366
+ }`}
367
+ >
368
+ <div className="flex-shrink-0 mt-0.5">
369
+ <ChevronRight
370
+ className={`w-4 h-4 transition-transform ${
371
+ isSelected ? 'text-white rotate-90' : 'text-neutral-500'
372
+ }`}
373
+ />
374
+ </div>
375
+ <div className="flex-1 min-w-0">
376
+ <div className="flex items-center gap-2">
377
+ <span
378
+ className={`font-medium truncate ${
379
+ isSelected ? 'text-white' : 'text-neutral-300'
380
+ }`}
381
+ >
382
+ {tool.name}
383
+ </span>
384
+ </div>
385
+ <p className="text-xs text-neutral-500 line-clamp-2 mt-0.5">
386
+ {tool.description}
387
+ </p>
388
+ <div className="flex items-center gap-2 mt-1.5">
389
+ <span className={`px-1.5 py-0.5 text-xs rounded ${sourceColor}`}>
390
+ {tool.source?.type || 'unknown'}
391
+ </span>
392
+ <span className="text-xs text-neutral-600">
393
+ {Object.keys(tool.inputSchema?.properties || {}).length} params
394
+ </span>
395
+ </div>
396
+ </div>
397
+ </button>
398
+ );
399
+ })
400
+ )}
401
+ </div>
402
+ </div>
403
+ }
404
+ right={
405
+ <div className="flex flex-col h-full gap-4">
406
+ {selectedTool ? (
407
+ <>
408
+ <PlaygroundToolTester
409
+ tool={selectedTool}
410
+ onExecute={handleExecute}
411
+ isDemoMode={isDemo}
412
+ isExecuting={isLoading}
413
+ className="flex-1"
414
+ />
415
+ {/* Execution Log */}
416
+ <ExecutionLog
417
+ logs={executionLogs}
418
+ onClear={clearLogs}
419
+ defaultExpanded={false}
420
+ />
421
+ </>
422
+ ) : (
423
+ <div className="flex-1 flex items-center justify-center rounded-xl border border-neutral-800 bg-neutral-900/50">
424
+ <div className="text-center">
425
+ <Terminal className="w-12 h-12 text-neutral-600 mx-auto mb-4" />
426
+ <h3 className="text-lg font-medium text-neutral-400 mb-2">
427
+ Select a Tool
428
+ </h3>
429
+ <p className="text-sm text-neutral-500">
430
+ Choose a tool from the list to start testing
431
+ </p>
432
+ </div>
433
+ </div>
434
+ )}
435
+ </div>
436
+ }
437
+ defaultSplit={30}
438
+ minLeftWidth={250}
439
+ minRightWidth={400}
440
+ />
441
+ </div>
442
+
443
+ {/* Server info footer (when result is available) */}
444
+ {result && (
445
+ <div className="mt-4 p-4 rounded-xl border border-neutral-800 bg-neutral-900/50">
446
+ <div className="flex items-center justify-between">
447
+ <div className="flex items-center gap-4">
448
+ <div className="flex items-center gap-2">
449
+ <Code2 className="w-4 h-4 text-neutral-400" />
450
+ <span className="text-sm text-neutral-400">Server:</span>
451
+ <span className="text-sm font-medium text-white">{result.name}</span>
452
+ </div>
453
+ <div className="flex items-center gap-2">
454
+ <FileJson className="w-4 h-4 text-neutral-400" />
455
+ <span className="text-sm text-neutral-400">Version:</span>
456
+ <span className="text-sm font-medium text-white">{result.version}</span>
457
+ </div>
458
+ </div>
459
+ <Button
460
+ variant="outline"
461
+ size="sm"
462
+ onClick={() => window.location.href = '/convert'}
463
+ leftIcon={<Play className="w-4 h-4" />}
464
+ >
465
+ Convert Another
466
+ </Button>
467
+ </div>
468
+ </div>
469
+ )}
470
+ </div>
471
+ );
472
+ }