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,211 @@
1
+ /**
2
+ * @fileoverview Command to browse public MCP server registry
3
+ * @copyright Copyright (c) 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ import * as vscode from 'vscode';
8
+ import { StorageService } from '../utils/storage';
9
+ import { HistoryProvider } from '../views/historyProvider';
10
+ import { performConversion } from './convertFromUrl';
11
+
12
+ interface RegistryServer {
13
+ name: string;
14
+ description: string;
15
+ repoUrl: string;
16
+ category: string;
17
+ stars?: number;
18
+ author?: string;
19
+ }
20
+
21
+ // Built-in registry of popular MCP-compatible repositories
22
+ const REGISTRY_SERVERS: RegistryServer[] = [
23
+ {
24
+ name: 'Anthropic Claude Code',
25
+ description: 'AI coding assistant from Anthropic',
26
+ repoUrl: 'https://github.com/anthropics/claude-code',
27
+ category: 'AI Tools',
28
+ author: 'Anthropic'
29
+ },
30
+ {
31
+ name: 'Langchain',
32
+ description: 'Build applications with LLMs through composability',
33
+ repoUrl: 'https://github.com/langchain-ai/langchain',
34
+ category: 'AI Framework',
35
+ author: 'LangChain'
36
+ },
37
+ {
38
+ name: 'OpenAI Node',
39
+ description: 'Official Node.js library for OpenAI API',
40
+ repoUrl: 'https://github.com/openai/openai-node',
41
+ category: 'AI SDK',
42
+ author: 'OpenAI'
43
+ },
44
+ {
45
+ name: 'Vercel AI SDK',
46
+ description: 'Build AI-powered apps with React, Svelte, Vue',
47
+ repoUrl: 'https://github.com/vercel/ai',
48
+ category: 'AI SDK',
49
+ author: 'Vercel'
50
+ },
51
+ {
52
+ name: 'Hugging Face Transformers',
53
+ description: 'State-of-the-art ML for PyTorch, TensorFlow, JAX',
54
+ repoUrl: 'https://github.com/huggingface/transformers',
55
+ category: 'ML Framework',
56
+ author: 'Hugging Face'
57
+ },
58
+ {
59
+ name: 'FastAPI',
60
+ description: 'Modern, fast web framework for building APIs',
61
+ repoUrl: 'https://github.com/tiangolo/fastapi',
62
+ category: 'Web Framework',
63
+ author: 'Sebastián Ramírez'
64
+ },
65
+ {
66
+ name: 'Prisma',
67
+ description: 'Next-generation ORM for Node.js and TypeScript',
68
+ repoUrl: 'https://github.com/prisma/prisma',
69
+ category: 'Database',
70
+ author: 'Prisma'
71
+ },
72
+ {
73
+ name: 'tRPC',
74
+ description: 'End-to-end typesafe APIs made easy',
75
+ repoUrl: 'https://github.com/trpc/trpc',
76
+ category: 'API Framework',
77
+ author: 'tRPC'
78
+ },
79
+ {
80
+ name: 'Stripe Node',
81
+ description: 'Node.js library for Stripe API',
82
+ repoUrl: 'https://github.com/stripe/stripe-node',
83
+ category: 'Payment',
84
+ author: 'Stripe'
85
+ },
86
+ {
87
+ name: 'Supabase',
88
+ description: 'Open source Firebase alternative',
89
+ repoUrl: 'https://github.com/supabase/supabase',
90
+ category: 'Database',
91
+ author: 'Supabase'
92
+ }
93
+ ];
94
+
95
+ /**
96
+ * Browse and convert from public MCP server registry
97
+ */
98
+ export async function browseRegistryCommand(
99
+ storage: StorageService,
100
+ historyProvider: HistoryProvider,
101
+ extensionUri: vscode.Uri
102
+ ): Promise<void> {
103
+ // Group servers by category
104
+ const categories = [...new Set(REGISTRY_SERVERS.map(s => s.category))];
105
+
106
+ // First, let user pick a category or view all
107
+ const categorySelection = await vscode.window.showQuickPick(
108
+ [
109
+ { label: '$(list-flat) All Servers', value: 'all' },
110
+ { label: '$(search) Search by Name', value: 'search' },
111
+ { label: '', kind: vscode.QuickPickItemKind.Separator },
112
+ ...categories.map(cat => ({
113
+ label: `$(folder) ${cat}`,
114
+ value: cat
115
+ }))
116
+ ],
117
+ {
118
+ placeHolder: 'Select a category or search',
119
+ title: 'MCP Server Registry'
120
+ }
121
+ );
122
+
123
+ if (!categorySelection) {
124
+ return;
125
+ }
126
+
127
+ let serversToShow: RegistryServer[];
128
+
129
+ // Type guard - separator items don't have value property
130
+ const selection = categorySelection as { label: string; value?: string };
131
+ const selectionValue = selection.value;
132
+
133
+ if (selectionValue === 'search') {
134
+ // Search mode
135
+ const searchQuery = await vscode.window.showInputBox({
136
+ prompt: 'Search for MCP servers',
137
+ placeHolder: 'Enter search term...'
138
+ });
139
+
140
+ if (!searchQuery) {
141
+ return;
142
+ }
143
+
144
+ const query = searchQuery.toLowerCase();
145
+ serversToShow = REGISTRY_SERVERS.filter(
146
+ s => s.name.toLowerCase().includes(query) ||
147
+ s.description.toLowerCase().includes(query) ||
148
+ s.author?.toLowerCase().includes(query)
149
+ );
150
+
151
+ if (serversToShow.length === 0) {
152
+ vscode.window.showInformationMessage(`No servers found matching "${searchQuery}"`);
153
+ return;
154
+ }
155
+ } else if (selectionValue === 'all') {
156
+ serversToShow = REGISTRY_SERVERS;
157
+ } else {
158
+ serversToShow = REGISTRY_SERVERS.filter(s => s.category === selectionValue);
159
+ }
160
+
161
+ // Show servers in the selected category
162
+ const serverItems: vscode.QuickPickItem[] = serversToShow.map(server => ({
163
+ label: `$(github) ${server.name}`,
164
+ description: server.author || '',
165
+ detail: server.description,
166
+ server: server
167
+ } as vscode.QuickPickItem & { server: RegistryServer }));
168
+
169
+ const selectedServer = await vscode.window.showQuickPick(serverItems, {
170
+ placeHolder: 'Select a server to convert',
171
+ title: 'MCP Server Registry',
172
+ matchOnDescription: true,
173
+ matchOnDetail: true
174
+ }) as (vscode.QuickPickItem & { server: RegistryServer }) | undefined;
175
+
176
+ if (!selectedServer) {
177
+ return;
178
+ }
179
+
180
+ // Show server details and confirm
181
+ const action = await vscode.window.showInformationMessage(
182
+ `Convert ${selectedServer.server.name} to MCP server?`,
183
+ { modal: true, detail: `${selectedServer.server.description}\n\nRepository: ${selectedServer.server.repoUrl}` },
184
+ 'Convert',
185
+ 'Open in Browser',
186
+ 'Cancel'
187
+ );
188
+
189
+ if (action === 'Convert') {
190
+ await performConversion(selectedServer.server.repoUrl, storage, historyProvider, extensionUri);
191
+ } else if (action === 'Open in Browser') {
192
+ vscode.env.openExternal(vscode.Uri.parse(selectedServer.server.repoUrl));
193
+ }
194
+ }
195
+
196
+ /**
197
+ * Fetch registry from remote source (for future implementation)
198
+ */
199
+ export async function fetchRemoteRegistry(): Promise<RegistryServer[]> {
200
+ // In the future, this could fetch from a remote registry API
201
+ // For now, return the built-in registry
202
+ return REGISTRY_SERVERS;
203
+ }
204
+
205
+ /**
206
+ * Add a custom server to the local registry
207
+ */
208
+ export function addCustomServer(server: RegistryServer): void {
209
+ // This would persist to workspace state
210
+ REGISTRY_SERVERS.push(server);
211
+ }
@@ -0,0 +1,332 @@
1
+ /**
2
+ * @fileoverview Command to auto-configure Claude Desktop with MCP servers
3
+ * @copyright Copyright (c) 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ import * as vscode from 'vscode';
8
+ import * as os from 'os';
9
+ import * as path from 'path';
10
+ import { StorageService, ConversionResult } from '../utils/storage';
11
+
12
+ interface ClaudeDesktopConfig {
13
+ mcpServers?: Record<string, McpServerConfig>;
14
+ }
15
+
16
+ interface McpServerConfig {
17
+ command: string;
18
+ args?: string[];
19
+ env?: Record<string, string>;
20
+ }
21
+
22
+ /**
23
+ * Auto-configure Claude Desktop with MCP servers
24
+ */
25
+ export async function configureClaudeDesktopCommand(
26
+ storage: StorageService
27
+ ): Promise<void> {
28
+ // Get conversion history
29
+ const history = storage.getHistory();
30
+
31
+ if (history.length === 0) {
32
+ const response = await vscode.window.showWarningMessage(
33
+ 'No converted MCP servers found. Would you like to convert a repository first?',
34
+ 'Convert Repository',
35
+ 'Cancel'
36
+ );
37
+
38
+ if (response === 'Convert Repository') {
39
+ vscode.commands.executeCommand('github-to-mcp.convertFromUrl');
40
+ }
41
+ return;
42
+ }
43
+
44
+ // Let user select which servers to configure
45
+ const serverItems = history.map(item => ({
46
+ label: item.repoName,
47
+ description: `${item.toolCount} tools`,
48
+ picked: false,
49
+ result: item
50
+ }));
51
+
52
+ const selectedItems = await vscode.window.showQuickPick(serverItems, {
53
+ canPickMany: true,
54
+ placeHolder: 'Select MCP servers to add to Claude Desktop',
55
+ title: 'Configure Claude Desktop'
56
+ });
57
+
58
+ if (!selectedItems || selectedItems.length === 0) {
59
+ return;
60
+ }
61
+
62
+ // Get Claude Desktop config path
63
+ const configPath = getClaudeDesktopConfigPath();
64
+
65
+ if (!configPath) {
66
+ vscode.window.showErrorMessage('Could not determine Claude Desktop config location for your platform.');
67
+ return;
68
+ }
69
+
70
+ // Check if config file exists
71
+ const configUri = vscode.Uri.file(configPath);
72
+ let existingConfig: ClaudeDesktopConfig = {};
73
+
74
+ try {
75
+ const configContent = await vscode.workspace.fs.readFile(configUri);
76
+ existingConfig = JSON.parse(Buffer.from(configContent).toString('utf-8'));
77
+ } catch {
78
+ // Config doesn't exist yet, we'll create it
79
+ }
80
+
81
+ // Initialize mcpServers if not present
82
+ if (!existingConfig.mcpServers) {
83
+ existingConfig.mcpServers = {};
84
+ }
85
+
86
+ // Ask user for output directory
87
+ const outputDir = await getOutputDirectory();
88
+ if (!outputDir) {
89
+ return;
90
+ }
91
+
92
+ // Generate and save MCP server files, then add to config
93
+ const addedServers: string[] = [];
94
+ const errors: string[] = [];
95
+
96
+ for (const item of selectedItems) {
97
+ const result = item.result as ConversionResult;
98
+ const serverName = result.repoName.replace('/', '-').toLowerCase();
99
+
100
+ try {
101
+ // Generate the server file
102
+ const serverPath = await generateMcpServerFile(result, outputDir);
103
+
104
+ // Add to config
105
+ existingConfig.mcpServers![serverName] = {
106
+ command: 'node',
107
+ args: [serverPath]
108
+ };
109
+
110
+ addedServers.push(serverName);
111
+ } catch (error) {
112
+ const msg = error instanceof Error ? error.message : 'Unknown error';
113
+ errors.push(`${serverName}: ${msg}`);
114
+ }
115
+ }
116
+
117
+ // Write updated config
118
+ try {
119
+ // Ensure config directory exists
120
+ const configDir = path.dirname(configPath);
121
+ await vscode.workspace.fs.createDirectory(vscode.Uri.file(configDir));
122
+
123
+ // Write config file
124
+ await vscode.workspace.fs.writeFile(
125
+ configUri,
126
+ Buffer.from(JSON.stringify(existingConfig, null, 2), 'utf-8')
127
+ );
128
+
129
+ // Show results
130
+ if (addedServers.length > 0) {
131
+ const message = `Added ${addedServers.length} MCP server(s) to Claude Desktop config`;
132
+ const action = await vscode.window.showInformationMessage(
133
+ message,
134
+ 'Open Config',
135
+ 'Restart Claude Desktop',
136
+ 'Done'
137
+ );
138
+
139
+ if (action === 'Open Config') {
140
+ const doc = await vscode.workspace.openTextDocument(configUri);
141
+ vscode.window.showTextDocument(doc);
142
+ } else if (action === 'Restart Claude Desktop') {
143
+ vscode.window.showInformationMessage(
144
+ 'Please restart Claude Desktop for changes to take effect.',
145
+ 'OK'
146
+ );
147
+ }
148
+ }
149
+
150
+ if (errors.length > 0) {
151
+ vscode.window.showWarningMessage(
152
+ `Some servers could not be added: ${errors.join(', ')}`
153
+ );
154
+ }
155
+ } catch (error) {
156
+ const message = error instanceof Error ? error.message : 'Unknown error';
157
+ vscode.window.showErrorMessage(`Failed to write Claude Desktop config: ${message}`);
158
+ }
159
+ }
160
+
161
+ /**
162
+ * Get the Claude Desktop config file path based on platform
163
+ */
164
+ function getClaudeDesktopConfigPath(): string | null {
165
+ const platform = os.platform();
166
+ const homeDir = os.homedir();
167
+
168
+ switch (platform) {
169
+ case 'darwin': // macOS
170
+ return path.join(homeDir, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');
171
+
172
+ case 'win32': // Windows
173
+ return path.join(homeDir, 'AppData', 'Roaming', 'Claude', 'claude_desktop_config.json');
174
+
175
+ case 'linux':
176
+ return path.join(homeDir, '.config', 'Claude', 'claude_desktop_config.json');
177
+
178
+ default:
179
+ return null;
180
+ }
181
+ }
182
+
183
+ /**
184
+ * Get output directory for MCP server files
185
+ */
186
+ async function getOutputDirectory(): Promise<string | null> {
187
+ const options = [
188
+ {
189
+ label: '$(home) User MCP Servers',
190
+ description: getDefaultMcpDirectory(),
191
+ value: getDefaultMcpDirectory()
192
+ },
193
+ {
194
+ label: '$(folder) Current Workspace',
195
+ description: vscode.workspace.workspaceFolders?.[0]?.uri.fsPath || 'No workspace open',
196
+ value: vscode.workspace.workspaceFolders?.[0]?.uri.fsPath
197
+ },
198
+ {
199
+ label: '$(folder-opened) Choose Custom Location...',
200
+ value: 'custom'
201
+ }
202
+ ];
203
+
204
+ const selection = await vscode.window.showQuickPick(options, {
205
+ placeHolder: 'Where should MCP server files be saved?',
206
+ title: 'Output Location'
207
+ });
208
+
209
+ if (!selection) {
210
+ return null;
211
+ }
212
+
213
+ if (selection.value === 'custom') {
214
+ const folders = await vscode.window.showOpenDialog({
215
+ canSelectFolders: true,
216
+ canSelectFiles: false,
217
+ canSelectMany: false,
218
+ title: 'Select output directory for MCP servers'
219
+ });
220
+
221
+ if (!folders || folders.length === 0) {
222
+ return null;
223
+ }
224
+
225
+ return folders[0].fsPath;
226
+ }
227
+
228
+ return selection.value || null;
229
+ }
230
+
231
+ /**
232
+ * Get default MCP directory
233
+ */
234
+ function getDefaultMcpDirectory(): string {
235
+ const homeDir = os.homedir();
236
+ return path.join(homeDir, '.mcp-servers');
237
+ }
238
+
239
+ /**
240
+ * Generate MCP server file from conversion result
241
+ */
242
+ async function generateMcpServerFile(result: ConversionResult, outputDir: string): Promise<string> {
243
+ if (!result.code) {
244
+ throw new Error('No generated code available');
245
+ }
246
+
247
+ const serverName = result.repoName.replace('/', '-').toLowerCase();
248
+ const serverDir = path.join(outputDir, serverName);
249
+ const serverFile = path.join(serverDir, 'index.js');
250
+
251
+ // Create server directory
252
+ await vscode.workspace.fs.createDirectory(vscode.Uri.file(serverDir));
253
+
254
+ // Write server file
255
+ await vscode.workspace.fs.writeFile(
256
+ vscode.Uri.file(serverFile),
257
+ Buffer.from(result.code, 'utf-8')
258
+ );
259
+
260
+ // Create package.json
261
+ const packageJson = {
262
+ name: `${serverName}-mcp`,
263
+ version: '1.0.0',
264
+ description: `MCP server generated from ${result.repoName}`,
265
+ main: 'index.js',
266
+ type: 'module',
267
+ dependencies: {
268
+ '@modelcontextprotocol/sdk': '^0.5.0'
269
+ }
270
+ };
271
+
272
+ await vscode.workspace.fs.writeFile(
273
+ vscode.Uri.file(path.join(serverDir, 'package.json')),
274
+ Buffer.from(JSON.stringify(packageJson, null, 2), 'utf-8')
275
+ );
276
+
277
+ return serverFile;
278
+ }
279
+
280
+ /**
281
+ * Check if Claude Desktop is likely installed
282
+ */
283
+ export function isClaudeDesktopInstalled(): boolean {
284
+ const configPath = getClaudeDesktopConfigPath();
285
+ if (!configPath) {
286
+ return false;
287
+ }
288
+
289
+ // Check if the Claude directory exists
290
+ const claudeDir = path.dirname(configPath);
291
+ try {
292
+ // This is a simple heuristic - the directory may exist even without full installation
293
+ return true;
294
+ } catch {
295
+ return false;
296
+ }
297
+ }
298
+
299
+ /**
300
+ * Open Claude Desktop config in editor
301
+ */
302
+ export async function openClaudeDesktopConfig(): Promise<void> {
303
+ const configPath = getClaudeDesktopConfigPath();
304
+ if (!configPath) {
305
+ vscode.window.showErrorMessage('Could not determine Claude Desktop config location.');
306
+ return;
307
+ }
308
+
309
+ try {
310
+ const doc = await vscode.workspace.openTextDocument(vscode.Uri.file(configPath));
311
+ vscode.window.showTextDocument(doc);
312
+ } catch {
313
+ // Config doesn't exist, create it
314
+ const create = await vscode.window.showInformationMessage(
315
+ 'Claude Desktop config file does not exist. Create it?',
316
+ 'Create',
317
+ 'Cancel'
318
+ );
319
+
320
+ if (create === 'Create') {
321
+ const configDir = path.dirname(configPath);
322
+ await vscode.workspace.fs.createDirectory(vscode.Uri.file(configDir));
323
+ await vscode.workspace.fs.writeFile(
324
+ vscode.Uri.file(configPath),
325
+ Buffer.from(JSON.stringify({ mcpServers: {} }, null, 2), 'utf-8')
326
+ );
327
+
328
+ const doc = await vscode.workspace.openTextDocument(vscode.Uri.file(configPath));
329
+ vscode.window.showTextDocument(doc);
330
+ }
331
+ }
332
+ }
@@ -0,0 +1,82 @@
1
+ /**
2
+ * @fileoverview Convert command implementation
3
+ * @copyright Copyright (c) 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ import * as vscode from 'vscode';
8
+ import { StorageService, ConversionResult } from '../utils/storage';
9
+ import { HistoryProvider } from '../views/historyProvider';
10
+ import { showResultsPanel } from '../views/resultsPanel';
11
+
12
+ /**
13
+ * Convert a GitHub repository to MCP tools
14
+ */
15
+ export async function convertCommand(
16
+ url: string,
17
+ storage: StorageService,
18
+ historyProvider: HistoryProvider
19
+ ): Promise<void> {
20
+ return vscode.window.withProgress(
21
+ {
22
+ location: vscode.ProgressLocation.Notification,
23
+ title: 'Converting GitHub repository...',
24
+ cancellable: false
25
+ },
26
+ async (progress) => {
27
+ try {
28
+ progress.report({ message: 'Fetching repository data...' });
29
+
30
+ // Parse URL to get owner/repo
31
+ const match = url.match(/github\.com\/([\w-]+)\/([\w.-]+)/);
32
+ if (!match) {
33
+ throw new Error('Invalid GitHub URL');
34
+ }
35
+
36
+ const [, owner, repo] = match;
37
+
38
+ progress.report({ message: 'Analyzing repository...' });
39
+
40
+ // Import the core library dynamically to avoid bundling issues
41
+ const { generateFromGithub } = await import('@nirholas/github-to-mcp');
42
+
43
+ const result = await generateFromGithub(url, {
44
+ sources: ['readme', 'openapi', 'code']
45
+ });
46
+
47
+ progress.report({ message: 'Generating MCP server code...' });
48
+
49
+ const generatedCode = result.generate();
50
+
51
+ // Create conversion result
52
+ const conversionResult: ConversionResult = {
53
+ id: Date.now().toString(),
54
+ repoUrl: url,
55
+ repoName: `${owner}/${repo}`,
56
+ toolCount: result.tools.length,
57
+ timestamp: new Date().toISOString(),
58
+ classification: result.classification,
59
+ code: generatedCode,
60
+ tools: result.tools.map((t: { name: string; description: string }) => ({
61
+ name: t.name,
62
+ description: t.description
63
+ }))
64
+ };
65
+
66
+ // Save to history
67
+ storage.addToHistory(conversionResult);
68
+ historyProvider.refresh();
69
+
70
+ // Show results panel
71
+ showResultsPanel(conversionResult, vscode.Uri.file(''));
72
+
73
+ vscode.window.showInformationMessage(
74
+ `Successfully converted ${owner}/${repo} - ${result.tools.length} tools found!`
75
+ );
76
+ } catch (error) {
77
+ const message = error instanceof Error ? error.message : 'Unknown error';
78
+ vscode.window.showErrorMessage(`Failed to convert repository: ${message}`);
79
+ }
80
+ }
81
+ );
82
+ }