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,563 @@
1
+ /**
2
+ * TransportConfigurator Component - Configure MCP transport settings
3
+ * @copyright 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ 'use client';
8
+
9
+ import * as React from 'react';
10
+ import { useState, useCallback, useEffect } from 'react';
11
+ import { motion, AnimatePresence } from 'framer-motion';
12
+ import {
13
+ Terminal,
14
+ Globe,
15
+ Zap,
16
+ Plus,
17
+ Trash2,
18
+ ChevronDown,
19
+ ChevronUp,
20
+ Code2,
21
+ AlertCircle,
22
+ } from 'lucide-react';
23
+ import { Button } from '@/components/ui/button';
24
+ import { Input } from '@/components/ui/input';
25
+ import { Badge } from '@/components/ui/badge';
26
+ import { cn } from '@/lib/utils';
27
+ import type {
28
+ TransportConfig,
29
+ TransportType,
30
+ StdioTransportConfig,
31
+ SseTransportConfig,
32
+ StreamableHttpTransportConfig,
33
+ } from './types';
34
+
35
+ export interface TransportConfiguratorProps {
36
+ /** Current transport configuration */
37
+ value: TransportConfig | null;
38
+ /** Callback when configuration changes */
39
+ onChange: (config: TransportConfig) => void;
40
+ /** Whether the configurator is disabled */
41
+ disabled?: boolean;
42
+ /** Additional CSS classes */
43
+ className?: string;
44
+ /** Callback when test connection is requested */
45
+ onTestConnection?: (config: TransportConfig) => void;
46
+ }
47
+
48
+ interface EnvVariable {
49
+ key: string;
50
+ value: string;
51
+ }
52
+
53
+ interface Header {
54
+ key: string;
55
+ value: string;
56
+ }
57
+
58
+ const TRANSPORT_OPTIONS: { type: TransportType; label: string; icon: React.ReactNode; description: string }[] = [
59
+ {
60
+ type: 'stdio',
61
+ label: 'STDIO',
62
+ icon: <Terminal className="w-4 h-4" />,
63
+ description: 'Run a local MCP server command',
64
+ },
65
+ {
66
+ type: 'sse',
67
+ label: 'SSE',
68
+ icon: <Globe className="w-4 h-4" />,
69
+ description: 'Connect to a Server-Sent Events endpoint',
70
+ },
71
+ {
72
+ type: 'streamable-http',
73
+ label: 'Streamable HTTP',
74
+ icon: <Zap className="w-4 h-4" />,
75
+ description: 'Connect to a Streamable HTTP endpoint',
76
+ },
77
+ ];
78
+
79
+ /**
80
+ * TransportConfigurator - Configure MCP transport settings
81
+ */
82
+ export default function TransportConfigurator({
83
+ value,
84
+ onChange,
85
+ disabled = false,
86
+ className = '',
87
+ onTestConnection,
88
+ }: TransportConfiguratorProps) {
89
+ // Local state for form inputs
90
+ const [transportType, setTransportType] = useState<TransportType>(value?.type || 'stdio');
91
+ const [command, setCommand] = useState<string>(
92
+ value?.type === 'stdio' ? value.command : ''
93
+ );
94
+ const [args, setArgs] = useState<string>(
95
+ value?.type === 'stdio' && value.args ? value.args.join(' ') : ''
96
+ );
97
+ const [envVars, setEnvVars] = useState<EnvVariable[]>(() => {
98
+ if (value?.type === 'stdio' && value.env) {
99
+ return Object.entries(value.env).map(([key, val]) => ({ key, value: val }));
100
+ }
101
+ return [];
102
+ });
103
+ const [url, setUrl] = useState<string>(
104
+ value?.type === 'sse' || value?.type === 'streamable-http' ? value.url : ''
105
+ );
106
+ const [headers, setHeaders] = useState<Header[]>(() => {
107
+ if ((value?.type === 'sse' || value?.type === 'streamable-http') && value.headers) {
108
+ return Object.entries(value.headers).map(([key, val]) => ({ key, value: val }));
109
+ }
110
+ return [];
111
+ });
112
+ const [generatedCode, setGeneratedCode] = useState<string>(
113
+ value?.type === 'stdio' && value.generatedCode ? value.generatedCode : ''
114
+ );
115
+ const [showAdvanced, setShowAdvanced] = useState<boolean>(false);
116
+ const [showCodeInput, setShowCodeInput] = useState<boolean>(
117
+ value?.type === 'stdio' && !!value.generatedCode
118
+ );
119
+ const [validationError, setValidationError] = useState<string | null>(null);
120
+
121
+ // Build config from current form state
122
+ const buildConfig = useCallback((): TransportConfig | null => {
123
+ if (transportType === 'stdio') {
124
+ if (showCodeInput) {
125
+ if (!generatedCode.trim()) {
126
+ setValidationError('Generated code is required');
127
+ return null;
128
+ }
129
+ return {
130
+ type: 'stdio',
131
+ command: 'npx',
132
+ args: ['tsx'],
133
+ generatedCode: generatedCode.trim(),
134
+ };
135
+ } else {
136
+ if (!command.trim()) {
137
+ setValidationError('Command is required');
138
+ return null;
139
+ }
140
+ const config: StdioTransportConfig = {
141
+ type: 'stdio',
142
+ command: command.trim(),
143
+ };
144
+ if (args.trim()) {
145
+ config.args = args.split(/\s+/).filter(Boolean);
146
+ }
147
+ if (envVars.length > 0) {
148
+ const env: Record<string, string> = {};
149
+ for (const { key, value } of envVars) {
150
+ if (key.trim()) {
151
+ env[key.trim()] = value;
152
+ }
153
+ }
154
+ if (Object.keys(env).length > 0) {
155
+ config.env = env;
156
+ }
157
+ }
158
+ return config;
159
+ }
160
+ } else {
161
+ if (!url.trim()) {
162
+ setValidationError('URL is required');
163
+ return null;
164
+ }
165
+ try {
166
+ new URL(url.trim());
167
+ } catch {
168
+ setValidationError('Invalid URL format');
169
+ return null;
170
+ }
171
+ const config: SseTransportConfig | StreamableHttpTransportConfig = {
172
+ type: transportType,
173
+ url: url.trim(),
174
+ };
175
+ if (headers.length > 0) {
176
+ const hdrs: Record<string, string> = {};
177
+ for (const { key, value } of headers) {
178
+ if (key.trim()) {
179
+ hdrs[key.trim()] = value;
180
+ }
181
+ }
182
+ if (Object.keys(hdrs).length > 0) {
183
+ config.headers = hdrs;
184
+ }
185
+ }
186
+ return config;
187
+ }
188
+ }, [transportType, command, args, envVars, url, headers, generatedCode, showCodeInput]);
189
+
190
+ // Emit changes when form state updates
191
+ useEffect(() => {
192
+ setValidationError(null);
193
+ const config = buildConfig();
194
+ if (config) {
195
+ onChange(config);
196
+ }
197
+ }, [transportType, command, args, envVars, url, headers, generatedCode, showCodeInput]);
198
+
199
+ // Handlers for environment variables
200
+ const addEnvVar = () => {
201
+ setEnvVars([...envVars, { key: '', value: '' }]);
202
+ };
203
+
204
+ const updateEnvVar = (index: number, field: 'key' | 'value', val: string) => {
205
+ const newVars = [...envVars];
206
+ newVars[index] = { ...newVars[index], [field]: val };
207
+ setEnvVars(newVars);
208
+ };
209
+
210
+ const removeEnvVar = (index: number) => {
211
+ setEnvVars(envVars.filter((_, i) => i !== index));
212
+ };
213
+
214
+ // Handlers for headers
215
+ const addHeader = () => {
216
+ setHeaders([...headers, { key: '', value: '' }]);
217
+ };
218
+
219
+ const updateHeader = (index: number, field: 'key' | 'value', val: string) => {
220
+ const newHeaders = [...headers];
221
+ newHeaders[index] = { ...newHeaders[index], [field]: val };
222
+ setHeaders(newHeaders);
223
+ };
224
+
225
+ const removeHeader = (index: number) => {
226
+ setHeaders(headers.filter((_, i) => i !== index));
227
+ };
228
+
229
+ // Handle test connection
230
+ const handleTestConnection = () => {
231
+ setValidationError(null);
232
+ const config = buildConfig();
233
+ if (config && onTestConnection) {
234
+ onTestConnection(config);
235
+ }
236
+ };
237
+
238
+ return (
239
+ <div className={cn('rounded-xl border border-neutral-800 bg-neutral-900/50 p-4', className)}>
240
+ {/* Transport Type Selector */}
241
+ <div className="mb-4">
242
+ <label className="block text-sm font-medium text-neutral-300 mb-2">
243
+ Transport Type
244
+ </label>
245
+ <div className="grid grid-cols-3 gap-2">
246
+ {TRANSPORT_OPTIONS.map((option) => (
247
+ <button
248
+ key={option.type}
249
+ type="button"
250
+ disabled={disabled}
251
+ onClick={() => setTransportType(option.type)}
252
+ className={cn(
253
+ 'flex flex-col items-center gap-1.5 p-3 rounded-lg border transition-all',
254
+ transportType === option.type
255
+ ? 'border-white/30 bg-white/10 text-white'
256
+ : 'border-neutral-700 bg-neutral-800/50 text-neutral-400 hover:border-neutral-600 hover:text-neutral-300',
257
+ disabled && 'opacity-50 cursor-not-allowed'
258
+ )}
259
+ >
260
+ {option.icon}
261
+ <span className="text-xs font-medium">{option.label}</span>
262
+ </button>
263
+ ))}
264
+ </div>
265
+ <p className="mt-2 text-xs text-neutral-500">
266
+ {TRANSPORT_OPTIONS.find((o) => o.type === transportType)?.description}
267
+ </p>
268
+ </div>
269
+
270
+ {/* STDIO Configuration */}
271
+ {transportType === 'stdio' && (
272
+ <motion.div
273
+ initial={{ opacity: 0, height: 0 }}
274
+ animate={{ opacity: 1, height: 'auto' }}
275
+ exit={{ opacity: 0, height: 0 }}
276
+ className="space-y-4"
277
+ >
278
+ {/* Toggle between command and code */}
279
+ <div className="flex items-center gap-2 mb-3">
280
+ <button
281
+ type="button"
282
+ disabled={disabled}
283
+ onClick={() => setShowCodeInput(false)}
284
+ className={cn(
285
+ 'px-3 py-1.5 text-xs rounded-lg transition-colors',
286
+ !showCodeInput
287
+ ? 'bg-white/10 text-white'
288
+ : 'text-neutral-400 hover:text-neutral-300'
289
+ )}
290
+ >
291
+ Command
292
+ </button>
293
+ <button
294
+ type="button"
295
+ disabled={disabled}
296
+ onClick={() => setShowCodeInput(true)}
297
+ className={cn(
298
+ 'px-3 py-1.5 text-xs rounded-lg transition-colors flex items-center gap-1.5',
299
+ showCodeInput
300
+ ? 'bg-white/10 text-white'
301
+ : 'text-neutral-400 hover:text-neutral-300'
302
+ )}
303
+ >
304
+ <Code2 className="w-3 h-3" />
305
+ Generated Code
306
+ </button>
307
+ </div>
308
+
309
+ {showCodeInput ? (
310
+ <div>
311
+ <label className="block text-sm font-medium text-neutral-300 mb-2">
312
+ MCP Server Code
313
+ </label>
314
+ <textarea
315
+ value={generatedCode}
316
+ onChange={(e) => setGeneratedCode(e.target.value)}
317
+ disabled={disabled}
318
+ placeholder="Paste your generated MCP server code here..."
319
+ className={cn(
320
+ 'w-full h-40 px-3 py-2 text-sm font-mono rounded-lg border bg-black text-white',
321
+ 'placeholder:text-neutral-500 resize-y',
322
+ 'focus:outline-none focus:ring-2 focus:ring-white/10 focus:border-neutral-600',
323
+ disabled && 'opacity-50 cursor-not-allowed',
324
+ 'border-neutral-700'
325
+ )}
326
+ />
327
+ <p className="mt-1 text-xs text-neutral-500">
328
+ The code will be executed with tsx. Make sure it&apos;s a valid MCP server.
329
+ </p>
330
+ </div>
331
+ ) : (
332
+ <>
333
+ <div>
334
+ <label className="block text-sm font-medium text-neutral-300 mb-2">
335
+ Command
336
+ </label>
337
+ <Input
338
+ value={command}
339
+ onChange={(e) => setCommand(e.target.value)}
340
+ disabled={disabled}
341
+ placeholder="e.g., npx, node, python"
342
+ leftIcon={<Terminal className="w-4 h-4" />}
343
+ />
344
+ </div>
345
+
346
+ <div>
347
+ <label className="block text-sm font-medium text-neutral-300 mb-2">
348
+ Arguments
349
+ </label>
350
+ <Input
351
+ value={args}
352
+ onChange={(e) => setArgs(e.target.value)}
353
+ disabled={disabled}
354
+ placeholder="e.g., @modelcontextprotocol/server-everything"
355
+ />
356
+ <p className="mt-1 text-xs text-neutral-500">
357
+ Space-separated arguments to pass to the command
358
+ </p>
359
+ </div>
360
+ </>
361
+ )}
362
+
363
+ {/* Advanced: Environment Variables */}
364
+ {!showCodeInput && (
365
+ <div>
366
+ <button
367
+ type="button"
368
+ onClick={() => setShowAdvanced(!showAdvanced)}
369
+ className="flex items-center gap-2 text-sm text-neutral-400 hover:text-neutral-300 transition-colors"
370
+ >
371
+ {showAdvanced ? (
372
+ <ChevronUp className="w-4 h-4" />
373
+ ) : (
374
+ <ChevronDown className="w-4 h-4" />
375
+ )}
376
+ Environment Variables
377
+ {envVars.length > 0 && (
378
+ <Badge variant="secondary" className="ml-1">
379
+ {envVars.length}
380
+ </Badge>
381
+ )}
382
+ </button>
383
+
384
+ <AnimatePresence>
385
+ {showAdvanced && (
386
+ <motion.div
387
+ initial={{ opacity: 0, height: 0 }}
388
+ animate={{ opacity: 1, height: 'auto' }}
389
+ exit={{ opacity: 0, height: 0 }}
390
+ className="mt-3 space-y-2"
391
+ >
392
+ {envVars.map((envVar, index) => (
393
+ <div key={index} className="flex items-center gap-2">
394
+ <Input
395
+ value={envVar.key}
396
+ onChange={(e) => updateEnvVar(index, 'key', e.target.value)}
397
+ disabled={disabled}
398
+ placeholder="KEY"
399
+ className="flex-1 font-mono text-xs"
400
+ />
401
+ <span className="text-neutral-500">=</span>
402
+ <Input
403
+ value={envVar.value}
404
+ onChange={(e) => updateEnvVar(index, 'value', e.target.value)}
405
+ disabled={disabled}
406
+ placeholder="value"
407
+ className="flex-1 font-mono text-xs"
408
+ type="password"
409
+ />
410
+ <Button
411
+ variant="ghost"
412
+ size="icon-sm"
413
+ onClick={() => removeEnvVar(index)}
414
+ disabled={disabled}
415
+ >
416
+ <Trash2 className="w-3 h-3" />
417
+ </Button>
418
+ </div>
419
+ ))}
420
+ <Button
421
+ variant="outline"
422
+ size="sm"
423
+ onClick={addEnvVar}
424
+ disabled={disabled}
425
+ leftIcon={<Plus className="w-3 h-3" />}
426
+ >
427
+ Add Variable
428
+ </Button>
429
+ </motion.div>
430
+ )}
431
+ </AnimatePresence>
432
+ </div>
433
+ )}
434
+ </motion.div>
435
+ )}
436
+
437
+ {/* SSE / Streamable HTTP Configuration */}
438
+ {(transportType === 'sse' || transportType === 'streamable-http') && (
439
+ <motion.div
440
+ initial={{ opacity: 0, height: 0 }}
441
+ animate={{ opacity: 1, height: 'auto' }}
442
+ exit={{ opacity: 0, height: 0 }}
443
+ className="space-y-4"
444
+ >
445
+ <div>
446
+ <label className="block text-sm font-medium text-neutral-300 mb-2">
447
+ Server URL
448
+ </label>
449
+ <Input
450
+ value={url}
451
+ onChange={(e) => setUrl(e.target.value)}
452
+ disabled={disabled}
453
+ placeholder={
454
+ transportType === 'sse'
455
+ ? 'https://example.com/sse'
456
+ : 'https://example.com/mcp'
457
+ }
458
+ leftIcon={<Globe className="w-4 h-4" />}
459
+ />
460
+ </div>
461
+
462
+ {/* Headers */}
463
+ <div>
464
+ <button
465
+ type="button"
466
+ onClick={() => setShowAdvanced(!showAdvanced)}
467
+ className="flex items-center gap-2 text-sm text-neutral-400 hover:text-neutral-300 transition-colors"
468
+ >
469
+ {showAdvanced ? (
470
+ <ChevronUp className="w-4 h-4" />
471
+ ) : (
472
+ <ChevronDown className="w-4 h-4" />
473
+ )}
474
+ HTTP Headers
475
+ {headers.length > 0 && (
476
+ <Badge variant="secondary" className="ml-1">
477
+ {headers.length}
478
+ </Badge>
479
+ )}
480
+ </button>
481
+
482
+ <AnimatePresence>
483
+ {showAdvanced && (
484
+ <motion.div
485
+ initial={{ opacity: 0, height: 0 }}
486
+ animate={{ opacity: 1, height: 'auto' }}
487
+ exit={{ opacity: 0, height: 0 }}
488
+ className="mt-3 space-y-2"
489
+ >
490
+ {headers.map((header, index) => (
491
+ <div key={index} className="flex items-center gap-2">
492
+ <Input
493
+ value={header.key}
494
+ onChange={(e) => updateHeader(index, 'key', e.target.value)}
495
+ disabled={disabled}
496
+ placeholder="Header-Name"
497
+ className="flex-1 font-mono text-xs"
498
+ />
499
+ <span className="text-neutral-500">:</span>
500
+ <Input
501
+ value={header.value}
502
+ onChange={(e) => updateHeader(index, 'value', e.target.value)}
503
+ disabled={disabled}
504
+ placeholder="value"
505
+ className="flex-1 font-mono text-xs"
506
+ />
507
+ <Button
508
+ variant="ghost"
509
+ size="icon-sm"
510
+ onClick={() => removeHeader(index)}
511
+ disabled={disabled}
512
+ >
513
+ <Trash2 className="w-3 h-3" />
514
+ </Button>
515
+ </div>
516
+ ))}
517
+ <Button
518
+ variant="outline"
519
+ size="sm"
520
+ onClick={addHeader}
521
+ disabled={disabled}
522
+ leftIcon={<Plus className="w-3 h-3" />}
523
+ >
524
+ Add Header
525
+ </Button>
526
+ </motion.div>
527
+ )}
528
+ </AnimatePresence>
529
+ </div>
530
+ </motion.div>
531
+ )}
532
+
533
+ {/* Validation Error */}
534
+ <AnimatePresence>
535
+ {validationError && (
536
+ <motion.div
537
+ initial={{ opacity: 0, y: -10 }}
538
+ animate={{ opacity: 1, y: 0 }}
539
+ exit={{ opacity: 0, y: -10 }}
540
+ className="mt-4 flex items-center gap-2 text-sm text-red-400"
541
+ >
542
+ <AlertCircle className="w-4 h-4" />
543
+ {validationError}
544
+ </motion.div>
545
+ )}
546
+ </AnimatePresence>
547
+
548
+ {/* Test Connection Button */}
549
+ {onTestConnection && (
550
+ <div className="mt-4 pt-4 border-t border-neutral-800">
551
+ <Button
552
+ variant="secondary"
553
+ size="sm"
554
+ onClick={handleTestConnection}
555
+ disabled={disabled}
556
+ >
557
+ Test Connection
558
+ </Button>
559
+ </div>
560
+ )}
561
+ </div>
562
+ );
563
+ }
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Playground Components - Re-export all playground UI components
3
+ * @copyright 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ // Types
8
+ export type {
9
+ TransportType,
10
+ TransportConfig,
11
+ McpCapabilities,
12
+ ServerInfo,
13
+ ConnectionStatus,
14
+ McpTool,
15
+ McpResource,
16
+ McpPrompt,
17
+ PromptArgument,
18
+ LogEntry,
19
+ JsonSchema,
20
+ CapabilityTab,
21
+ ResourceContents,
22
+ PromptMessage,
23
+ } from './types';
24
+
25
+ // Legacy exports (keep for backwards compatibility)
26
+ export { default as ServerStatus } from './ServerStatus';
27
+ export type { ServerStatusProps } from './ServerStatus';
28
+
29
+ export { default as ExecutionLog } from './ExecutionLog';
30
+ export type { ExecutionLogProps } from './ExecutionLog';
31
+
32
+ // Configuration & Connection
33
+ export { default as TransportConfigurator } from './TransportConfigurator';
34
+ export type { TransportConfiguratorProps } from './TransportConfigurator';
35
+
36
+ export { default as ConnectionStatusV2 } from './ConnectionStatusV2';
37
+ export type { ConnectionStatusProps as ConnectionStatusV2Props } from './ConnectionStatusV2';
38
+
39
+ // Navigation
40
+ export { default as CapabilityTabs } from './CapabilityTabs';
41
+ export type { CapabilityTabsProps } from './CapabilityTabs';
42
+
43
+ // Form & Display
44
+ export { default as SchemaForm } from './SchemaForm';
45
+ export type { SchemaFormProps } from './SchemaForm';
46
+
47
+ export { default as JsonViewer } from './JsonViewer';
48
+ export type { JsonViewerProps } from './JsonViewer';
49
+
50
+ // Capability Panels
51
+ export { default as ToolsPanel } from './ToolsPanel';
52
+ export type { ToolsPanelProps } from './ToolsPanel';
53
+
54
+ export { default as ResourcesPanel } from './ResourcesPanel';
55
+ export type { ResourcesPanelProps } from './ResourcesPanel';
56
+
57
+ export { default as PromptsPanel } from './PromptsPanel';
58
+ export type { PromptsPanelProps } from './PromptsPanel';
59
+
60
+ // Execution & Debugging
61
+ export { default as ExecutionLogV2 } from './ExecutionLogV2';
62
+ export type { ExecutionLogV2Props } from './ExecutionLogV2';
63
+
64
+ // Layout
65
+ export { default as PlaygroundLayout } from './PlaygroundLayout';
66
+ export type { PlaygroundLayoutProps } from './PlaygroundLayout';
67
+
68
+ // Empty States
69
+ export { default as EmptyStates, FirstTimeGuide, ConnectingState, ErrorState } from './EmptyStates';
70
+ export type { EmptyStatesProps, EmptyStateType } from './EmptyStates';
71
+
72
+ // Share Functionality
73
+ export { default as ShareButton } from './ShareButton';
74
+ export type { ShareButtonProps } from './ShareButton';