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,239 @@
1
+ /**
2
+ * ShareButton Component - Generate and share playground URLs
3
+ * @copyright 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ 'use client';
8
+
9
+ import * as React from 'react';
10
+ import { useState, useCallback } from 'react';
11
+ import { motion, AnimatePresence } from 'framer-motion';
12
+ import { Share2, Copy, Check, Link2, Code2, X } from 'lucide-react';
13
+ import { Button } from '@/components/ui/button';
14
+ import { cn } from '@/lib/utils';
15
+ import type { TransportConfig, CapabilityTab } from './types';
16
+
17
+ export interface ShareButtonProps {
18
+ /** Current transport configuration */
19
+ transportConfig: TransportConfig | null;
20
+ /** Current active tab */
21
+ activeTab?: CapabilityTab;
22
+ /** Currently selected tool name */
23
+ selectedToolName?: string;
24
+ /** Additional CSS classes */
25
+ className?: string;
26
+ }
27
+
28
+ /**
29
+ * Generate shareable URL from playground state
30
+ */
31
+ function generateShareUrl(
32
+ transportConfig: TransportConfig | null,
33
+ activeTab?: CapabilityTab,
34
+ selectedToolName?: string
35
+ ): string {
36
+ const baseUrl = typeof window !== 'undefined' ? window.location.origin : '';
37
+ const params = new URLSearchParams();
38
+
39
+ if (transportConfig) {
40
+ params.set('transport', transportConfig.type);
41
+
42
+ if (transportConfig.type === 'stdio') {
43
+ params.set('command', transportConfig.command);
44
+ if (transportConfig.args?.length) {
45
+ params.set('args', transportConfig.args.join(','));
46
+ }
47
+ } else if (transportConfig.type === 'sse' || transportConfig.type === 'streamable-http') {
48
+ params.set('url', transportConfig.url);
49
+ if (transportConfig.headers) {
50
+ params.set('headers', encodeURIComponent(JSON.stringify(transportConfig.headers)));
51
+ }
52
+ }
53
+ }
54
+
55
+ if (activeTab && activeTab !== 'tools') {
56
+ params.set('tab', activeTab);
57
+ }
58
+
59
+ if (selectedToolName) {
60
+ params.set('tool', selectedToolName);
61
+ }
62
+
63
+ const queryString = params.toString();
64
+ return queryString ? `${baseUrl}/playground/v2?${queryString}` : `${baseUrl}/playground/v2`;
65
+ }
66
+
67
+ /**
68
+ * Generate embed code for the playground
69
+ */
70
+ function generateEmbedCode(
71
+ transportConfig: TransportConfig | null,
72
+ activeTab?: CapabilityTab,
73
+ selectedToolName?: string
74
+ ): string {
75
+ const url = generateShareUrl(transportConfig, activeTab, selectedToolName);
76
+ return `<iframe
77
+ src="${url}"
78
+ width="100%"
79
+ height="600"
80
+ frameborder="0"
81
+ allow="clipboard-write"
82
+ style="border-radius: 12px; border: 1px solid #27272a;"
83
+ ></iframe>`;
84
+ }
85
+
86
+ /**
87
+ * ShareButton - Generate and share playground URLs
88
+ */
89
+ export default function ShareButton({
90
+ transportConfig,
91
+ activeTab,
92
+ selectedToolName,
93
+ className = '',
94
+ }: ShareButtonProps) {
95
+ const [isOpen, setIsOpen] = useState(false);
96
+ const [copiedType, setCopiedType] = useState<'url' | 'embed' | null>(null);
97
+
98
+ const shareUrl = generateShareUrl(transportConfig, activeTab, selectedToolName);
99
+ const embedCode = generateEmbedCode(transportConfig, activeTab, selectedToolName);
100
+
101
+ const handleCopy = useCallback(async (text: string, type: 'url' | 'embed') => {
102
+ try {
103
+ await navigator.clipboard.writeText(text);
104
+ setCopiedType(type);
105
+ setTimeout(() => setCopiedType(null), 2000);
106
+ } catch (err) {
107
+ console.error('Failed to copy:', err);
108
+ }
109
+ }, []);
110
+
111
+ const handleClose = useCallback(() => {
112
+ setIsOpen(false);
113
+ setCopiedType(null);
114
+ }, []);
115
+
116
+ // Check if there's anything to share
117
+ const canShare = transportConfig !== null;
118
+
119
+ if (!canShare) {
120
+ return (
121
+ <Button
122
+ variant="outline"
123
+ size="sm"
124
+ disabled
125
+ className={cn('gap-2', className)}
126
+ >
127
+ <Share2 className="w-4 h-4" />
128
+ <span className="hidden sm:inline">Share</span>
129
+ </Button>
130
+ );
131
+ }
132
+
133
+ return (
134
+ <div className="relative">
135
+ <Button
136
+ onClick={() => setIsOpen(!isOpen)}
137
+ variant="outline"
138
+ size="sm"
139
+ className={cn('gap-2', className)}
140
+ >
141
+ <Share2 className="w-4 h-4" />
142
+ <span className="hidden sm:inline">Share</span>
143
+ </Button>
144
+
145
+ <AnimatePresence>
146
+ {isOpen && (
147
+ <>
148
+ {/* Backdrop */}
149
+ <motion.div
150
+ initial={{ opacity: 0 }}
151
+ animate={{ opacity: 1 }}
152
+ exit={{ opacity: 0 }}
153
+ className="fixed inset-0 z-40"
154
+ onClick={handleClose}
155
+ />
156
+
157
+ {/* Dropdown */}
158
+ <motion.div
159
+ initial={{ opacity: 0, y: -10, scale: 0.95 }}
160
+ animate={{ opacity: 1, y: 0, scale: 1 }}
161
+ exit={{ opacity: 0, y: -10, scale: 0.95 }}
162
+ transition={{ duration: 0.15 }}
163
+ className="absolute right-0 top-full mt-2 z-50 w-80 p-4 rounded-xl bg-neutral-900 border border-neutral-800 shadow-xl"
164
+ >
165
+ {/* Header */}
166
+ <div className="flex items-center justify-between mb-4">
167
+ <h3 className="font-semibold text-white flex items-center gap-2">
168
+ <Link2 className="w-4 h-4" />
169
+ Share Playground
170
+ </h3>
171
+ <button
172
+ onClick={handleClose}
173
+ className="text-neutral-400 hover:text-white transition-colors"
174
+ >
175
+ <X className="w-4 h-4" />
176
+ </button>
177
+ </div>
178
+
179
+ {/* Share URL */}
180
+ <div className="space-y-2 mb-4">
181
+ <label className="text-xs text-neutral-500">Share URL</label>
182
+ <div className="flex gap-2">
183
+ <input
184
+ type="text"
185
+ readOnly
186
+ value={shareUrl}
187
+ className="flex-1 px-3 py-2 text-sm bg-neutral-950 border border-neutral-800 rounded-lg text-neutral-300 truncate"
188
+ />
189
+ <Button
190
+ onClick={() => handleCopy(shareUrl, 'url')}
191
+ variant="outline"
192
+ size="sm"
193
+ className="shrink-0"
194
+ >
195
+ {copiedType === 'url' ? (
196
+ <Check className="w-4 h-4 text-green-400" />
197
+ ) : (
198
+ <Copy className="w-4 h-4" />
199
+ )}
200
+ </Button>
201
+ </div>
202
+ </div>
203
+
204
+ {/* Embed Code */}
205
+ <div className="space-y-2">
206
+ <label className="text-xs text-neutral-500 flex items-center gap-1">
207
+ <Code2 className="w-3 h-3" />
208
+ Embed Code
209
+ </label>
210
+ <div className="relative">
211
+ <pre className="p-3 text-xs bg-neutral-950 border border-neutral-800 rounded-lg text-neutral-400 overflow-x-auto max-h-24 overflow-y-auto">
212
+ {embedCode}
213
+ </pre>
214
+ <Button
215
+ onClick={() => handleCopy(embedCode, 'embed')}
216
+ variant="ghost"
217
+ size="sm"
218
+ className="absolute top-2 right-2"
219
+ >
220
+ {copiedType === 'embed' ? (
221
+ <Check className="w-4 h-4 text-green-400" />
222
+ ) : (
223
+ <Copy className="w-4 h-4" />
224
+ )}
225
+ </Button>
226
+ </div>
227
+ </div>
228
+
229
+ {/* Info */}
230
+ <p className="mt-4 text-xs text-neutral-600">
231
+ Share this URL to let others use the same transport configuration.
232
+ </p>
233
+ </motion.div>
234
+ </>
235
+ )}
236
+ </AnimatePresence>
237
+ </div>
238
+ );
239
+ }
@@ -0,0 +1,309 @@
1
+ /**
2
+ * ToolsPanel Component - Display and execute MCP tools
3
+ * @copyright 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ 'use client';
8
+
9
+ import * as React from 'react';
10
+ import { useState, useCallback, useMemo } from 'react';
11
+ import { motion, AnimatePresence } from 'framer-motion';
12
+ import {
13
+ Search,
14
+ Wrench,
15
+ Play,
16
+ Loader2,
17
+ AlertCircle,
18
+ ChevronRight,
19
+ Code2,
20
+ FileJson,
21
+ } from 'lucide-react';
22
+ import { Button } from '@/components/ui/button';
23
+ import { Input } from '@/components/ui/input';
24
+ import { Badge } from '@/components/ui/badge';
25
+ import { cn } from '@/lib/utils';
26
+ import SchemaForm from './SchemaForm';
27
+ import JsonViewer from './JsonViewer';
28
+ import type { McpTool, JsonSchema } from './types';
29
+
30
+ export interface ToolsPanelProps {
31
+ /** List of available tools */
32
+ tools: McpTool[];
33
+ /** Currently selected tool */
34
+ selectedTool: McpTool | null;
35
+ /** Callback when a tool is selected */
36
+ onSelectTool: (tool: McpTool) => void;
37
+ /** Callback when a tool is executed */
38
+ onExecute: (tool: McpTool, params: Record<string, unknown>) => void;
39
+ /** Whether a tool execution is in progress */
40
+ isExecuting?: boolean;
41
+ /** Last execution result */
42
+ lastResult?: unknown;
43
+ /** Last execution error */
44
+ lastError?: string | null;
45
+ /** Additional CSS classes */
46
+ className?: string;
47
+ }
48
+
49
+ /**
50
+ * ToolsPanel - Browse and execute MCP tools
51
+ */
52
+ export default function ToolsPanel({
53
+ tools,
54
+ selectedTool,
55
+ onSelectTool,
56
+ onExecute,
57
+ isExecuting = false,
58
+ lastResult,
59
+ lastError,
60
+ className = '',
61
+ }: ToolsPanelProps) {
62
+ const [searchQuery, setSearchQuery] = useState('');
63
+ const [params, setParams] = useState<Record<string, unknown>>({});
64
+ const [showSchema, setShowSchema] = useState(false);
65
+
66
+ // Filter tools based on search
67
+ const filteredTools = useMemo(() => {
68
+ if (!searchQuery.trim()) return tools;
69
+ const query = searchQuery.toLowerCase();
70
+ return tools.filter(
71
+ (tool) =>
72
+ tool.name.toLowerCase().includes(query) ||
73
+ tool.description?.toLowerCase().includes(query)
74
+ );
75
+ }, [tools, searchQuery]);
76
+
77
+ // Reset params when tool changes
78
+ React.useEffect(() => {
79
+ setParams({});
80
+ }, [selectedTool?.name]);
81
+
82
+ // Handle tool execution
83
+ const handleExecute = useCallback(() => {
84
+ if (!selectedTool) return;
85
+ onExecute(selectedTool, params);
86
+ }, [selectedTool, params, onExecute]);
87
+
88
+ // Get schema for selected tool
89
+ const schema = selectedTool?.inputSchema || {
90
+ type: 'object',
91
+ properties: {},
92
+ };
93
+
94
+ return (
95
+ <div className={cn('flex h-full', className)}>
96
+ {/* Tools List */}
97
+ <div className="w-72 flex-shrink-0 border-r border-neutral-800 flex flex-col">
98
+ {/* Search */}
99
+ <div className="p-3 border-b border-neutral-800">
100
+ <Input
101
+ type="text"
102
+ placeholder="Search tools..."
103
+ value={searchQuery}
104
+ onChange={(e) => setSearchQuery(e.target.value)}
105
+ leftIcon={<Search className="w-4 h-4" />}
106
+ className="h-9 text-sm"
107
+ />
108
+ </div>
109
+
110
+ {/* Tool List */}
111
+ <div className="flex-1 overflow-y-auto">
112
+ {filteredTools.length === 0 ? (
113
+ <div className="flex flex-col items-center justify-center h-full text-center p-4">
114
+ <Wrench className="w-8 h-8 text-neutral-600 mb-2" />
115
+ <p className="text-sm text-neutral-500">
116
+ {searchQuery ? 'No tools match your search' : 'No tools available'}
117
+ </p>
118
+ </div>
119
+ ) : (
120
+ <div className="py-1">
121
+ {filteredTools.map((tool) => {
122
+ const isSelected = selectedTool?.name === tool.name;
123
+ const paramCount = Object.keys(
124
+ tool.inputSchema?.properties || {}
125
+ ).length;
126
+
127
+ return (
128
+ <button
129
+ key={tool.name}
130
+ onClick={() => onSelectTool(tool)}
131
+ className={cn(
132
+ 'w-full px-3 py-2.5 text-left transition-colors',
133
+ isSelected
134
+ ? 'bg-white/10 border-l-2 border-white'
135
+ : 'hover:bg-white/5 border-l-2 border-transparent'
136
+ )}
137
+ >
138
+ <div className="flex items-center gap-2">
139
+ <Wrench
140
+ className={cn(
141
+ 'w-4 h-4 flex-shrink-0',
142
+ isSelected ? 'text-white' : 'text-neutral-500'
143
+ )}
144
+ />
145
+ <span
146
+ className={cn(
147
+ 'text-sm font-medium truncate',
148
+ isSelected ? 'text-white' : 'text-neutral-300'
149
+ )}
150
+ >
151
+ {tool.name}
152
+ </span>
153
+ {paramCount > 0 && (
154
+ <Badge
155
+ variant="secondary"
156
+ className="ml-auto text-xs px-1.5"
157
+ >
158
+ {paramCount}
159
+ </Badge>
160
+ )}
161
+ </div>
162
+ {tool.description && (
163
+ <p
164
+ className={cn(
165
+ 'mt-1 text-xs truncate',
166
+ isSelected ? 'text-neutral-400' : 'text-neutral-500'
167
+ )}
168
+ >
169
+ {tool.description}
170
+ </p>
171
+ )}
172
+ </button>
173
+ );
174
+ })}
175
+ </div>
176
+ )}
177
+ </div>
178
+
179
+ {/* Tool Count */}
180
+ <div className="px-3 py-2 border-t border-neutral-800 text-xs text-neutral-500">
181
+ {filteredTools.length} of {tools.length} tools
182
+ </div>
183
+ </div>
184
+
185
+ {/* Tool Detail */}
186
+ <div className="flex-1 flex flex-col min-w-0">
187
+ {selectedTool ? (
188
+ <>
189
+ {/* Tool Header */}
190
+ <div className="p-4 border-b border-neutral-800">
191
+ <div className="flex items-start justify-between gap-4">
192
+ <div className="min-w-0">
193
+ <h3 className="text-lg font-semibold text-white truncate">
194
+ {selectedTool.name}
195
+ </h3>
196
+ {selectedTool.description && (
197
+ <p className="mt-1 text-sm text-neutral-400">
198
+ {selectedTool.description}
199
+ </p>
200
+ )}
201
+ </div>
202
+ <Button
203
+ variant="ghost"
204
+ size="sm"
205
+ onClick={() => setShowSchema(!showSchema)}
206
+ leftIcon={<FileJson className="w-3.5 h-3.5" />}
207
+ className={cn(showSchema && 'bg-white/10')}
208
+ >
209
+ Schema
210
+ </Button>
211
+ </div>
212
+
213
+ {/* Schema viewer */}
214
+ <AnimatePresence>
215
+ {showSchema && selectedTool.inputSchema && (
216
+ <motion.div
217
+ initial={{ opacity: 0, height: 0 }}
218
+ animate={{ opacity: 1, height: 'auto' }}
219
+ exit={{ opacity: 0, height: 0 }}
220
+ className="mt-3 overflow-hidden"
221
+ >
222
+ <div className="p-3 rounded-lg bg-neutral-950 border border-neutral-800">
223
+ <pre className="text-xs text-neutral-400 overflow-x-auto">
224
+ {JSON.stringify(selectedTool.inputSchema, null, 2)}
225
+ </pre>
226
+ </div>
227
+ </motion.div>
228
+ )}
229
+ </AnimatePresence>
230
+ </div>
231
+
232
+ {/* Parameters Form */}
233
+ <div className="flex-1 overflow-y-auto p-4">
234
+ <h4 className="text-sm font-medium text-neutral-300 mb-3 flex items-center gap-2">
235
+ <Code2 className="w-4 h-4" />
236
+ Parameters
237
+ </h4>
238
+ <SchemaForm
239
+ schema={schema}
240
+ value={params}
241
+ onChange={setParams}
242
+ disabled={isExecuting}
243
+ />
244
+ </div>
245
+
246
+ {/* Execute Button */}
247
+ <div className="p-4 border-t border-neutral-800">
248
+ <Button
249
+ onClick={handleExecute}
250
+ disabled={isExecuting}
251
+ loading={isExecuting}
252
+ className="w-full"
253
+ leftIcon={!isExecuting && <Play className="w-4 h-4" />}
254
+ >
255
+ {isExecuting ? 'Executing...' : 'Execute'}
256
+ </Button>
257
+ </div>
258
+
259
+ {/* Result/Error */}
260
+ <AnimatePresence>
261
+ {(lastResult !== undefined || lastError) && (
262
+ <motion.div
263
+ initial={{ opacity: 0, height: 0 }}
264
+ animate={{ opacity: 1, height: 'auto' }}
265
+ exit={{ opacity: 0, height: 0 }}
266
+ className="border-t border-neutral-800"
267
+ >
268
+ <div className="p-4">
269
+ <h4 className="text-sm font-medium text-neutral-300 mb-3 flex items-center gap-2">
270
+ {lastError ? (
271
+ <>
272
+ <AlertCircle className="w-4 h-4 text-red-400" />
273
+ <span className="text-red-400">Error</span>
274
+ </>
275
+ ) : (
276
+ <>
277
+ <ChevronRight className="w-4 h-4 text-green-400" />
278
+ <span className="text-green-400">Result</span>
279
+ </>
280
+ )}
281
+ </h4>
282
+ {lastError ? (
283
+ <div className="p-3 rounded-lg bg-red-500/10 border border-red-500/30">
284
+ <p className="text-sm text-red-300">{lastError}</p>
285
+ </div>
286
+ ) : (
287
+ <JsonViewer data={lastResult} maxHeight={200} />
288
+ )}
289
+ </div>
290
+ </motion.div>
291
+ )}
292
+ </AnimatePresence>
293
+ </>
294
+ ) : (
295
+ /* No tool selected */
296
+ <div className="flex-1 flex flex-col items-center justify-center text-center p-8">
297
+ <Wrench className="w-12 h-12 text-neutral-700 mb-4" />
298
+ <h3 className="text-lg font-medium text-neutral-400 mb-2">
299
+ No tool selected
300
+ </h3>
301
+ <p className="text-sm text-neutral-500 max-w-xs">
302
+ Select a tool from the list to view its details and execute it.
303
+ </p>
304
+ </div>
305
+ )}
306
+ </div>
307
+ </div>
308
+ );
309
+ }