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,305 @@
1
+ /**
2
+ * EmptyStates Component - Empty state displays for playground
3
+ * @copyright 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ 'use client';
8
+
9
+ import * as React from 'react';
10
+ import { motion } from 'framer-motion';
11
+ import {
12
+ Plug,
13
+ Wrench,
14
+ FileText,
15
+ MessageSquare,
16
+ Rocket,
17
+ ArrowRight,
18
+ Sparkles,
19
+ Terminal,
20
+ Globe,
21
+ Zap,
22
+ } from 'lucide-react';
23
+ import { Button } from '@/components/ui/button';
24
+ import { cn } from '@/lib/utils';
25
+
26
+ export type EmptyStateType =
27
+ | 'not-connected'
28
+ | 'no-tools'
29
+ | 'no-resources'
30
+ | 'no-prompts'
31
+ | 'first-time';
32
+
33
+ export interface EmptyStatesProps {
34
+ /** Type of empty state to display */
35
+ type: EmptyStateType;
36
+ /** Callback when primary action is clicked */
37
+ onAction?: () => void;
38
+ /** Additional CSS classes */
39
+ className?: string;
40
+ }
41
+
42
+ interface EmptyStateConfig {
43
+ icon: React.ReactNode;
44
+ title: string;
45
+ description: string;
46
+ action?: string;
47
+ secondaryText?: string;
48
+ }
49
+
50
+ const EMPTY_STATE_CONFIG: Record<EmptyStateType, EmptyStateConfig> = {
51
+ 'not-connected': {
52
+ icon: <Plug className="w-12 h-12" />,
53
+ title: 'Not Connected',
54
+ description:
55
+ 'Configure your transport settings and connect to an MCP server to start testing.',
56
+ action: 'Connect',
57
+ },
58
+ 'no-tools': {
59
+ icon: <Wrench className="w-12 h-12" />,
60
+ title: 'No Tools Available',
61
+ description:
62
+ 'This MCP server doesn\'t expose any tools, or tools capability is not enabled.',
63
+ secondaryText: 'Check the server configuration or try a different server.',
64
+ },
65
+ 'no-resources': {
66
+ icon: <FileText className="w-12 h-12" />,
67
+ title: 'No Resources Available',
68
+ description:
69
+ 'This MCP server doesn\'t expose any resources, or resources capability is not enabled.',
70
+ secondaryText: 'Check the server configuration or try a different server.',
71
+ },
72
+ 'no-prompts': {
73
+ icon: <MessageSquare className="w-12 h-12" />,
74
+ title: 'No Prompts Available',
75
+ description:
76
+ 'This MCP server doesn\'t expose any prompts, or prompts capability is not enabled.',
77
+ secondaryText: 'Check the server configuration or try a different server.',
78
+ },
79
+ 'first-time': {
80
+ icon: <Rocket className="w-12 h-12" />,
81
+ title: 'Welcome to MCP Playground',
82
+ description:
83
+ 'Test and debug MCP servers interactively. Connect to a server using stdio, SSE, or streamable HTTP transport.',
84
+ action: 'Get Started',
85
+ },
86
+ };
87
+
88
+ /**
89
+ * EmptyStates - Display contextual empty states
90
+ */
91
+ export default function EmptyStates({
92
+ type,
93
+ onAction,
94
+ className = '',
95
+ }: EmptyStatesProps) {
96
+ const config = EMPTY_STATE_CONFIG[type];
97
+
98
+ return (
99
+ <motion.div
100
+ initial={{ opacity: 0, y: 20 }}
101
+ animate={{ opacity: 1, y: 0 }}
102
+ className={cn(
103
+ 'flex flex-col items-center justify-center text-center p-8',
104
+ className
105
+ )}
106
+ >
107
+ <div className="text-neutral-600 mb-4">{config.icon}</div>
108
+ <h3 className="text-lg font-semibold text-white mb-2">{config.title}</h3>
109
+ <p className="text-sm text-neutral-400 max-w-md mb-4">
110
+ {config.description}
111
+ </p>
112
+ {config.secondaryText && (
113
+ <p className="text-xs text-neutral-500 max-w-md mb-4">
114
+ {config.secondaryText}
115
+ </p>
116
+ )}
117
+ {config.action && onAction && (
118
+ <Button
119
+ onClick={onAction}
120
+ rightIcon={<ArrowRight className="w-4 h-4" />}
121
+ >
122
+ {config.action}
123
+ </Button>
124
+ )}
125
+ </motion.div>
126
+ );
127
+ }
128
+
129
+ /**
130
+ * First-time user guide component with more details
131
+ */
132
+ export function FirstTimeGuide({
133
+ onGetStarted,
134
+ className = '',
135
+ }: {
136
+ onGetStarted?: () => void;
137
+ className?: string;
138
+ }) {
139
+ return (
140
+ <motion.div
141
+ initial={{ opacity: 0, y: 20 }}
142
+ animate={{ opacity: 1, y: 0 }}
143
+ className={cn('p-8', className)}
144
+ >
145
+ <div className="max-w-2xl mx-auto">
146
+ {/* Header */}
147
+ <div className="text-center mb-8">
148
+ <div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-green-500/10 border border-green-500/30 text-green-400 text-sm mb-4">
149
+ <Sparkles className="w-4 h-4" />
150
+ MCP Playground
151
+ </div>
152
+ <h1 className="text-2xl font-bold text-white mb-2">
153
+ Test MCP Servers Interactively
154
+ </h1>
155
+ <p className="text-neutral-400">
156
+ Connect to any MCP server and explore its tools, resources, and
157
+ prompts.
158
+ </p>
159
+ </div>
160
+
161
+ {/* Transport options */}
162
+ <div className="grid gap-4 md:grid-cols-3 mb-8">
163
+ <div className="p-4 rounded-xl border border-neutral-800 bg-neutral-900/50">
164
+ <Terminal className="w-8 h-8 text-blue-400 mb-3" />
165
+ <h3 className="font-medium text-white mb-1">STDIO</h3>
166
+ <p className="text-xs text-neutral-400">
167
+ Run a local MCP server command and communicate via standard I/O.
168
+ </p>
169
+ </div>
170
+ <div className="p-4 rounded-xl border border-neutral-800 bg-neutral-900/50">
171
+ <Globe className="w-8 h-8 text-green-400 mb-3" />
172
+ <h3 className="font-medium text-white mb-1">SSE</h3>
173
+ <p className="text-xs text-neutral-400">
174
+ Connect to a remote MCP server using Server-Sent Events.
175
+ </p>
176
+ </div>
177
+ <div className="p-4 rounded-xl border border-neutral-800 bg-neutral-900/50">
178
+ <Zap className="w-8 h-8 text-purple-400 mb-3" />
179
+ <h3 className="font-medium text-white mb-1">Streamable HTTP</h3>
180
+ <p className="text-xs text-neutral-400">
181
+ Connect to a remote MCP server using streamable HTTP transport.
182
+ </p>
183
+ </div>
184
+ </div>
185
+
186
+ {/* Quick start steps */}
187
+ <div className="p-6 rounded-xl border border-neutral-800 bg-neutral-900/50 mb-8">
188
+ <h3 className="font-medium text-white mb-4">Quick Start</h3>
189
+ <ol className="space-y-3 text-sm">
190
+ <li className="flex items-start gap-3">
191
+ <span className="flex-shrink-0 w-6 h-6 rounded-full bg-white/10 text-white text-xs flex items-center justify-center">
192
+ 1
193
+ </span>
194
+ <div>
195
+ <p className="text-neutral-300">Choose a transport type</p>
196
+ <p className="text-neutral-500 text-xs">
197
+ Select STDIO for local servers or SSE/HTTP for remote ones.
198
+ </p>
199
+ </div>
200
+ </li>
201
+ <li className="flex items-start gap-3">
202
+ <span className="flex-shrink-0 w-6 h-6 rounded-full bg-white/10 text-white text-xs flex items-center justify-center">
203
+ 2
204
+ </span>
205
+ <div>
206
+ <p className="text-neutral-300">Configure connection settings</p>
207
+ <p className="text-neutral-500 text-xs">
208
+ Enter the command, URL, or paste generated server code.
209
+ </p>
210
+ </div>
211
+ </li>
212
+ <li className="flex items-start gap-3">
213
+ <span className="flex-shrink-0 w-6 h-6 rounded-full bg-white/10 text-white text-xs flex items-center justify-center">
214
+ 3
215
+ </span>
216
+ <div>
217
+ <p className="text-neutral-300">Connect and explore</p>
218
+ <p className="text-neutral-500 text-xs">
219
+ Browse tools, resources, and prompts exposed by the server.
220
+ </p>
221
+ </div>
222
+ </li>
223
+ </ol>
224
+ </div>
225
+
226
+ {/* CTA */}
227
+ {onGetStarted && (
228
+ <div className="text-center">
229
+ <Button
230
+ size="lg"
231
+ onClick={onGetStarted}
232
+ rightIcon={<ArrowRight className="w-4 h-4" />}
233
+ >
234
+ Get Started
235
+ </Button>
236
+ </div>
237
+ )}
238
+ </div>
239
+ </motion.div>
240
+ );
241
+ }
242
+
243
+ /**
244
+ * Connecting state display
245
+ */
246
+ export function ConnectingState({ className = '' }: { className?: string }) {
247
+ return (
248
+ <motion.div
249
+ initial={{ opacity: 0 }}
250
+ animate={{ opacity: 1 }}
251
+ className={cn(
252
+ 'flex flex-col items-center justify-center text-center p-8',
253
+ className
254
+ )}
255
+ >
256
+ <div className="relative mb-4">
257
+ <Plug className="w-12 h-12 text-neutral-600" />
258
+ <motion.div
259
+ className="absolute inset-0 border-2 border-yellow-400 rounded-full"
260
+ animate={{ scale: [1, 1.5, 1], opacity: [0.5, 0, 0.5] }}
261
+ transition={{ duration: 1.5, repeat: Infinity }}
262
+ />
263
+ </div>
264
+ <h3 className="text-lg font-semibold text-white mb-2">Connecting...</h3>
265
+ <p className="text-sm text-neutral-400 max-w-md">
266
+ Establishing connection to the MCP server. This may take a few seconds.
267
+ </p>
268
+ </motion.div>
269
+ );
270
+ }
271
+
272
+ /**
273
+ * Error state display
274
+ */
275
+ export function ErrorState({
276
+ error,
277
+ onRetry,
278
+ className = '',
279
+ }: {
280
+ error: string;
281
+ onRetry?: () => void;
282
+ className?: string;
283
+ }) {
284
+ return (
285
+ <motion.div
286
+ initial={{ opacity: 0, y: 20 }}
287
+ animate={{ opacity: 1, y: 0 }}
288
+ className={cn(
289
+ 'flex flex-col items-center justify-center text-center p-8',
290
+ className
291
+ )}
292
+ >
293
+ <div className="w-12 h-12 rounded-full bg-red-500/10 flex items-center justify-center mb-4">
294
+ <Plug className="w-6 h-6 text-red-400" />
295
+ </div>
296
+ <h3 className="text-lg font-semibold text-white mb-2">Connection Failed</h3>
297
+ <p className="text-sm text-red-300 max-w-md mb-4">{error}</p>
298
+ {onRetry && (
299
+ <Button variant="secondary" onClick={onRetry}>
300
+ Try Again
301
+ </Button>
302
+ )}
303
+ </motion.div>
304
+ );
305
+ }
@@ -0,0 +1,260 @@
1
+ /**
2
+ * ExecutionLog Component - Real-time output display for MCP server
3
+ * @copyright 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ 'use client';
8
+
9
+ import { useState, useRef, useEffect, useCallback } from 'react';
10
+ import { motion, AnimatePresence } from 'framer-motion';
11
+ import {
12
+ Terminal,
13
+ ChevronDown,
14
+ ChevronUp,
15
+ Trash2,
16
+ Download,
17
+ Copy,
18
+ Check,
19
+ ArrowRight,
20
+ AlertTriangle,
21
+ Info,
22
+ XCircle,
23
+ CheckCircle,
24
+ } from 'lucide-react';
25
+ import { Button } from '@/components/ui/button';
26
+ import type { ExecutionLog as ExecutionLogType } from '@/hooks/use-mcp-execution';
27
+ import { copyToClipboard } from '@/lib/utils';
28
+
29
+ export interface ExecutionLogProps {
30
+ logs: ExecutionLogType[];
31
+ onClear?: () => void;
32
+ defaultExpanded?: boolean;
33
+ maxHeight?: number;
34
+ className?: string;
35
+ }
36
+
37
+ const LOG_TYPE_STYLES: Record<ExecutionLogType['type'], string> = {
38
+ stdout: 'text-neutral-300',
39
+ stderr: 'text-orange-400',
40
+ info: 'text-blue-400',
41
+ error: 'text-red-400',
42
+ success: 'text-green-400',
43
+ };
44
+
45
+ const LOG_TYPE_ICONS: Record<ExecutionLogType['type'], React.ReactNode> = {
46
+ stdout: <ArrowRight className="w-3 h-3" />,
47
+ stderr: <AlertTriangle className="w-3 h-3" />,
48
+ info: <Info className="w-3 h-3" />,
49
+ error: <XCircle className="w-3 h-3" />,
50
+ success: <CheckCircle className="w-3 h-3" />,
51
+ };
52
+
53
+ function formatTimestamp(date: Date): string {
54
+ return date.toLocaleTimeString('en-US', {
55
+ hour12: false,
56
+ hour: '2-digit',
57
+ minute: '2-digit',
58
+ second: '2-digit',
59
+ fractionalSecondDigits: 3,
60
+ });
61
+ }
62
+
63
+ export default function ExecutionLog({
64
+ logs,
65
+ onClear,
66
+ defaultExpanded = false,
67
+ maxHeight = 300,
68
+ className = '',
69
+ }: ExecutionLogProps) {
70
+ const [isExpanded, setIsExpanded] = useState(defaultExpanded);
71
+ const [copied, setCopied] = useState(false);
72
+ const [autoScroll, setAutoScroll] = useState(true);
73
+ const scrollRef = useRef<HTMLDivElement>(null);
74
+
75
+ // Auto-scroll to bottom when new logs arrive
76
+ useEffect(() => {
77
+ if (autoScroll && scrollRef.current && isExpanded) {
78
+ scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
79
+ }
80
+ }, [logs, autoScroll, isExpanded]);
81
+
82
+ // Expand when first log arrives
83
+ useEffect(() => {
84
+ if (logs.length === 1 && !isExpanded) {
85
+ setIsExpanded(true);
86
+ }
87
+ }, [logs.length, isExpanded]);
88
+
89
+ const handleCopyLogs = useCallback(async () => {
90
+ const logText = logs
91
+ .map(log => `[${formatTimestamp(log.timestamp)}] [${log.type.toUpperCase()}] ${log.message}`)
92
+ .join('\n');
93
+
94
+ const success = await copyToClipboard(logText);
95
+ if (success) {
96
+ setCopied(true);
97
+ setTimeout(() => setCopied(false), 2000);
98
+ }
99
+ }, [logs]);
100
+
101
+ const handleDownloadLogs = useCallback(() => {
102
+ const logText = logs
103
+ .map(log => `[${formatTimestamp(log.timestamp)}] [${log.type.toUpperCase()}] ${log.toolName ? `[${log.toolName}] ` : ''}${log.message}`)
104
+ .join('\n');
105
+
106
+ const blob = new Blob([logText], { type: 'text/plain' });
107
+ const url = URL.createObjectURL(blob);
108
+ const a = document.createElement('a');
109
+ a.href = url;
110
+ a.download = `mcp-execution-log-${new Date().toISOString().slice(0, 19).replace(/:/g, '-')}.txt`;
111
+ document.body.appendChild(a);
112
+ a.click();
113
+ document.body.removeChild(a);
114
+ URL.revokeObjectURL(url);
115
+ }, [logs]);
116
+
117
+ const handleScroll = useCallback(() => {
118
+ if (scrollRef.current) {
119
+ const { scrollTop, scrollHeight, clientHeight } = scrollRef.current;
120
+ // If user scrolls up more than 50px from bottom, disable auto-scroll
121
+ const isAtBottom = scrollHeight - scrollTop - clientHeight < 50;
122
+ setAutoScroll(isAtBottom);
123
+ }
124
+ }, []);
125
+
126
+ const recentLogs = logs.slice(-100); // Limit display to last 100 logs
127
+ const hasLogs = logs.length > 0;
128
+
129
+ return (
130
+ <div className={`rounded-xl border border-neutral-800 bg-neutral-900/50 overflow-hidden ${className}`}>
131
+ {/* Header */}
132
+ <button
133
+ onClick={() => setIsExpanded(!isExpanded)}
134
+ className="w-full px-4 py-3 flex items-center justify-between hover:bg-white/5 transition-colors"
135
+ >
136
+ <div className="flex items-center gap-2">
137
+ <Terminal className="w-4 h-4 text-neutral-400" />
138
+ <span className="text-sm font-medium text-white">Execution Log</span>
139
+ {hasLogs && (
140
+ <span className="px-1.5 py-0.5 text-xs rounded bg-neutral-700 text-neutral-300">
141
+ {logs.length}
142
+ </span>
143
+ )}
144
+ </div>
145
+ <div className="flex items-center gap-2">
146
+ {hasLogs && isExpanded && (
147
+ <>
148
+ <Button
149
+ variant="ghost"
150
+ size="icon-sm"
151
+ onClick={(e) => {
152
+ e.stopPropagation();
153
+ handleCopyLogs();
154
+ }}
155
+ title="Copy logs"
156
+ >
157
+ {copied ? <Check className="w-3 h-3" /> : <Copy className="w-3 h-3" />}
158
+ </Button>
159
+ <Button
160
+ variant="ghost"
161
+ size="icon-sm"
162
+ onClick={(e) => {
163
+ e.stopPropagation();
164
+ handleDownloadLogs();
165
+ }}
166
+ title="Download logs"
167
+ >
168
+ <Download className="w-3 h-3" />
169
+ </Button>
170
+ {onClear && (
171
+ <Button
172
+ variant="ghost"
173
+ size="icon-sm"
174
+ onClick={(e) => {
175
+ e.stopPropagation();
176
+ onClear();
177
+ }}
178
+ title="Clear logs"
179
+ >
180
+ <Trash2 className="w-3 h-3" />
181
+ </Button>
182
+ )}
183
+ </>
184
+ )}
185
+ {isExpanded ? (
186
+ <ChevronUp className="w-4 h-4 text-neutral-400" />
187
+ ) : (
188
+ <ChevronDown className="w-4 h-4 text-neutral-400" />
189
+ )}
190
+ </div>
191
+ </button>
192
+
193
+ {/* Log content */}
194
+ <AnimatePresence>
195
+ {isExpanded && (
196
+ <motion.div
197
+ initial={{ height: 0 }}
198
+ animate={{ height: 'auto' }}
199
+ exit={{ height: 0 }}
200
+ className="overflow-hidden"
201
+ >
202
+ <div
203
+ ref={scrollRef}
204
+ onScroll={handleScroll}
205
+ className="border-t border-neutral-800 bg-black/50 font-mono text-xs overflow-y-auto"
206
+ style={{ maxHeight }}
207
+ >
208
+ {!hasLogs ? (
209
+ <div className="p-4 text-center text-neutral-500">
210
+ No logs yet. Connect to a server and execute a tool to see output.
211
+ </div>
212
+ ) : (
213
+ <div className="p-2 space-y-0.5">
214
+ {recentLogs.map((log) => (
215
+ <motion.div
216
+ key={log.id}
217
+ initial={{ opacity: 0, x: -10 }}
218
+ animate={{ opacity: 1, x: 0 }}
219
+ className="flex items-start gap-2 py-0.5 hover:bg-white/5 rounded px-1"
220
+ >
221
+ <span className="text-neutral-600 flex-shrink-0 select-none">
222
+ {formatTimestamp(log.timestamp)}
223
+ </span>
224
+ <span className={`flex-shrink-0 ${LOG_TYPE_STYLES[log.type]}`}>
225
+ {LOG_TYPE_ICONS[log.type]}
226
+ </span>
227
+ {log.toolName && (
228
+ <span className="text-purple-400 flex-shrink-0">
229
+ [{log.toolName}]
230
+ </span>
231
+ )}
232
+ <span className={LOG_TYPE_STYLES[log.type]}>
233
+ {log.message}
234
+ </span>
235
+ </motion.div>
236
+ ))}
237
+ </div>
238
+ )}
239
+ </div>
240
+
241
+ {/* Auto-scroll indicator */}
242
+ {hasLogs && !autoScroll && (
243
+ <button
244
+ onClick={() => {
245
+ setAutoScroll(true);
246
+ if (scrollRef.current) {
247
+ scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
248
+ }
249
+ }}
250
+ className="w-full py-1 text-xs text-center text-blue-400 hover:text-blue-300 bg-blue-500/10 transition-colors flex items-center justify-center gap-1"
251
+ >
252
+ <ChevronDown className="w-3 h-3" /> Scroll to bottom (auto-scroll paused)
253
+ </button>
254
+ )}
255
+ </motion.div>
256
+ )}
257
+ </AnimatePresence>
258
+ </div>
259
+ );
260
+ }