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,87 @@
1
+ /**
2
+ * @fileoverview Storage utility for conversion history
3
+ * @copyright Copyright (c) 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ import * as vscode from 'vscode';
8
+
9
+ export interface ConversionResult {
10
+ id: string;
11
+ repoUrl: string;
12
+ repoName: string;
13
+ toolCount: number;
14
+ timestamp: string;
15
+ classification?: {
16
+ type: string;
17
+ confidence: number;
18
+ indicators: string[];
19
+ };
20
+ code?: string;
21
+ tools?: Array<{
22
+ name: string;
23
+ description: string;
24
+ }>;
25
+ }
26
+
27
+ const HISTORY_KEY = 'github-to-mcp.history';
28
+
29
+ export class StorageService {
30
+ private context: vscode.ExtensionContext;
31
+
32
+ constructor(context: vscode.ExtensionContext) {
33
+ this.context = context;
34
+ }
35
+
36
+ /**
37
+ * Get conversion history
38
+ */
39
+ getHistory(): ConversionResult[] {
40
+ return this.context.globalState.get<ConversionResult[]>(HISTORY_KEY) || [];
41
+ }
42
+
43
+ /**
44
+ * Add a conversion result to history
45
+ */
46
+ addToHistory(result: ConversionResult): void {
47
+ const history = this.getHistory();
48
+
49
+ // Add to beginning
50
+ history.unshift(result);
51
+
52
+ // Get limit from config
53
+ const config = vscode.workspace.getConfiguration('github-to-mcp');
54
+ const limit = config.get<number>('historyLimit') || 20;
55
+
56
+ // Trim to limit
57
+ if (history.length > limit) {
58
+ history.length = limit;
59
+ }
60
+
61
+ this.context.globalState.update(HISTORY_KEY, history);
62
+ }
63
+
64
+ /**
65
+ * Remove a specific item from history
66
+ */
67
+ removeFromHistory(id: string): void {
68
+ const history = this.getHistory();
69
+ const filtered = history.filter(item => item.id !== id);
70
+ this.context.globalState.update(HISTORY_KEY, filtered);
71
+ }
72
+
73
+ /**
74
+ * Clear all history
75
+ */
76
+ clearHistory(): void {
77
+ this.context.globalState.update(HISTORY_KEY, []);
78
+ }
79
+
80
+ /**
81
+ * Get a specific conversion by ID
82
+ */
83
+ getConversion(id: string): ConversionResult | undefined {
84
+ const history = this.getHistory();
85
+ return history.find(item => item.id === id);
86
+ }
87
+ }
@@ -0,0 +1,160 @@
1
+ /**
2
+ * @fileoverview Tree view provider for MCP servers
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
+
10
+ type McpServerTreeItem = McpServerItem | McpToolItem | EmptyItem;
11
+
12
+ /**
13
+ * Tree data provider for MCP servers view
14
+ */
15
+ export class McpServersTreeView implements vscode.TreeDataProvider<McpServerTreeItem> {
16
+ private _onDidChangeTreeData: vscode.EventEmitter<McpServerTreeItem | undefined | null | void> =
17
+ new vscode.EventEmitter<McpServerTreeItem | undefined | null | void>();
18
+ readonly onDidChangeTreeData: vscode.Event<McpServerTreeItem | undefined | null | void> =
19
+ this._onDidChangeTreeData.event;
20
+
21
+ constructor(private storage: StorageService) {}
22
+
23
+ /**
24
+ * Refresh the tree view
25
+ */
26
+ refresh(): void {
27
+ this._onDidChangeTreeData.fire();
28
+ }
29
+
30
+ /**
31
+ * Get tree item representation
32
+ */
33
+ getTreeItem(element: McpServerTreeItem): vscode.TreeItem {
34
+ return element;
35
+ }
36
+
37
+ /**
38
+ * Get children for tree node
39
+ */
40
+ getChildren(element?: McpServerTreeItem): McpServerTreeItem[] {
41
+ if (!element) {
42
+ // Root level - show all servers
43
+ const history = this.storage.getHistory();
44
+
45
+ if (history.length === 0) {
46
+ return [new EmptyItem('No MCP servers yet', 'Convert a repository to get started')];
47
+ }
48
+
49
+ return history.map(item => new McpServerItem(item));
50
+ }
51
+
52
+ if (element instanceof McpServerItem) {
53
+ // Show tools under each server
54
+ const tools = element.result.tools || [];
55
+
56
+ if (tools.length === 0) {
57
+ return [new EmptyItem('No tools', 'This server has no tools')];
58
+ }
59
+
60
+ return tools.map(tool => new McpToolItem(tool, element.result));
61
+ }
62
+
63
+ return [];
64
+ }
65
+
66
+ /**
67
+ * Get parent of element (for reveal)
68
+ */
69
+ getParent(element: McpServerTreeItem): McpServerTreeItem | undefined {
70
+ if (element instanceof McpToolItem) {
71
+ const history = this.storage.getHistory();
72
+ const server = history.find(h => h.id === element.serverId);
73
+ if (server) {
74
+ return new McpServerItem(server);
75
+ }
76
+ }
77
+ return undefined;
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Tree item for an MCP server
83
+ */
84
+ export class McpServerItem extends vscode.TreeItem {
85
+ public readonly result: ConversionResult;
86
+
87
+ constructor(result: ConversionResult) {
88
+ super(result.repoName, vscode.TreeItemCollapsibleState.Collapsed);
89
+
90
+ this.result = result;
91
+ this.description = `${result.toolCount} tools`;
92
+
93
+ const date = new Date(result.timestamp);
94
+ const formattedDate = date.toLocaleDateString() + ' ' + date.toLocaleTimeString();
95
+
96
+ this.tooltip = new vscode.MarkdownString();
97
+ this.tooltip.appendMarkdown(`### ${result.repoName}\n\n`);
98
+ this.tooltip.appendMarkdown(`**Tools:** ${result.toolCount}\n\n`);
99
+ if (result.classification) {
100
+ this.tooltip.appendMarkdown(`**Type:** ${result.classification.type}\n\n`);
101
+ this.tooltip.appendMarkdown(`**Confidence:** ${Math.round(result.classification.confidence * 100)}%\n\n`);
102
+ }
103
+ this.tooltip.appendMarkdown(`**Converted:** ${formattedDate}\n\n`);
104
+ this.tooltip.appendMarkdown(`[Open Repository](${result.repoUrl})`);
105
+ this.tooltip.isTrusted = true;
106
+
107
+ this.iconPath = new vscode.ThemeIcon('server', new vscode.ThemeColor('charts.green'));
108
+ this.contextValue = 'mcpServer';
109
+
110
+ // Command on click
111
+ this.command = {
112
+ command: 'github-to-mcp.viewDetails',
113
+ title: 'View Details',
114
+ arguments: [result]
115
+ };
116
+ }
117
+ }
118
+
119
+ /**
120
+ * Tree item for an MCP tool
121
+ */
122
+ export class McpToolItem extends vscode.TreeItem {
123
+ public readonly serverId: string;
124
+
125
+ constructor(
126
+ tool: { name: string; description: string },
127
+ server: ConversionResult
128
+ ) {
129
+ super(tool.name, vscode.TreeItemCollapsibleState.None);
130
+
131
+ this.serverId = server.id;
132
+ this.description = tool.description.substring(0, 50) + (tool.description.length > 50 ? '...' : '');
133
+
134
+ this.tooltip = new vscode.MarkdownString();
135
+ this.tooltip.appendMarkdown(`### ${tool.name}\n\n`);
136
+ this.tooltip.appendMarkdown(tool.description);
137
+ this.tooltip.isTrusted = true;
138
+
139
+ this.iconPath = new vscode.ThemeIcon('symbol-method', new vscode.ThemeColor('charts.blue'));
140
+ this.contextValue = 'mcpTool';
141
+
142
+ // Command to show tool details
143
+ this.command = {
144
+ command: 'github-to-mcp.showToolDetails',
145
+ title: 'Show Tool Details',
146
+ arguments: [tool, server]
147
+ };
148
+ }
149
+ }
150
+
151
+ /**
152
+ * Empty placeholder item
153
+ */
154
+ class EmptyItem extends vscode.TreeItem {
155
+ constructor(label: string, description?: string) {
156
+ super(label, vscode.TreeItemCollapsibleState.None);
157
+ this.description = description;
158
+ this.iconPath = new vscode.ThemeIcon('info');
159
+ }
160
+ }
@@ -0,0 +1,195 @@
1
+ /**
2
+ * @fileoverview Dedicated output channel for extension logs
3
+ * @copyright Copyright (c) 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ import * as vscode from 'vscode';
8
+
9
+ type LogLevel = 'info' | 'warn' | 'error' | 'debug';
10
+
11
+ /**
12
+ * Output channel manager for extension logging
13
+ */
14
+ export class OutputChannelView {
15
+ private static instance: OutputChannelView;
16
+ private channel: vscode.OutputChannel;
17
+ private logLevel: LogLevel = 'info';
18
+
19
+ private constructor() {
20
+ this.channel = vscode.window.createOutputChannel('GitHub to MCP', { log: true });
21
+ }
22
+
23
+ /**
24
+ * Get singleton instance
25
+ */
26
+ static getInstance(): OutputChannelView {
27
+ if (!OutputChannelView.instance) {
28
+ OutputChannelView.instance = new OutputChannelView();
29
+ }
30
+ return OutputChannelView.instance;
31
+ }
32
+
33
+ /**
34
+ * Set the minimum log level
35
+ */
36
+ setLogLevel(level: LogLevel): void {
37
+ this.logLevel = level;
38
+ this.info(`Log level set to: ${level}`);
39
+ }
40
+
41
+ /**
42
+ * Log info message
43
+ */
44
+ info(message: string, ...args: unknown[]): void {
45
+ this.log('info', message, ...args);
46
+ }
47
+
48
+ /**
49
+ * Log warning message
50
+ */
51
+ warn(message: string, ...args: unknown[]): void {
52
+ this.log('warn', message, ...args);
53
+ }
54
+
55
+ /**
56
+ * Log error message
57
+ */
58
+ error(message: string, error?: Error, ...args: unknown[]): void {
59
+ this.log('error', message, ...args);
60
+ if (error) {
61
+ this.channel.appendLine(` Stack: ${error.stack || 'No stack trace'}`);
62
+ }
63
+ }
64
+
65
+ /**
66
+ * Log debug message
67
+ */
68
+ debug(message: string, ...args: unknown[]): void {
69
+ if (this.shouldLog('debug')) {
70
+ this.log('debug', message, ...args);
71
+ }
72
+ }
73
+
74
+ /**
75
+ * Log a message with level
76
+ */
77
+ private log(level: LogLevel, message: string, ...args: unknown[]): void {
78
+ if (!this.shouldLog(level)) {
79
+ return;
80
+ }
81
+
82
+ const timestamp = new Date().toISOString();
83
+ const levelIcon = this.getLevelIcon(level);
84
+ const formattedArgs = args.length > 0 ? ' ' + JSON.stringify(args) : '';
85
+
86
+ this.channel.appendLine(`[${timestamp}] ${levelIcon} ${message}${formattedArgs}`);
87
+ }
88
+
89
+ /**
90
+ * Check if message should be logged based on level
91
+ */
92
+ private shouldLog(level: LogLevel): boolean {
93
+ const levels: LogLevel[] = ['debug', 'info', 'warn', 'error'];
94
+ const currentLevelIndex = levels.indexOf(this.logLevel);
95
+ const messageLevelIndex = levels.indexOf(level);
96
+ return messageLevelIndex >= currentLevelIndex;
97
+ }
98
+
99
+ /**
100
+ * Get icon for log level
101
+ */
102
+ private getLevelIcon(level: LogLevel): string {
103
+ switch (level) {
104
+ case 'debug': return '🔍';
105
+ case 'info': return 'ℹ️';
106
+ case 'warn': return '⚠️';
107
+ case 'error': return '❌';
108
+ }
109
+ }
110
+
111
+ /**
112
+ * Show the output channel
113
+ */
114
+ show(): void {
115
+ this.channel.show();
116
+ }
117
+
118
+ /**
119
+ * Hide the output channel
120
+ */
121
+ hide(): void {
122
+ this.channel.hide();
123
+ }
124
+
125
+ /**
126
+ * Clear the output channel
127
+ */
128
+ clear(): void {
129
+ this.channel.clear();
130
+ this.info('Output cleared');
131
+ }
132
+
133
+ /**
134
+ * Log conversion start
135
+ */
136
+ logConversionStart(repoUrl: string): void {
137
+ this.info('═'.repeat(50));
138
+ this.info(`Starting conversion for: ${repoUrl}`);
139
+ this.info('═'.repeat(50));
140
+ }
141
+
142
+ /**
143
+ * Log conversion progress
144
+ */
145
+ logConversionProgress(step: string, details?: string): void {
146
+ this.info(` → ${step}${details ? ': ' + details : ''}`);
147
+ }
148
+
149
+ /**
150
+ * Log conversion success
151
+ */
152
+ logConversionSuccess(repoName: string, toolCount: number): void {
153
+ this.info('✅ Conversion completed successfully!');
154
+ this.info(` Repository: ${repoName}`);
155
+ this.info(` Tools found: ${toolCount}`);
156
+ this.info('─'.repeat(50));
157
+ }
158
+
159
+ /**
160
+ * Log conversion failure
161
+ */
162
+ logConversionFailure(repoUrl: string, error: Error): void {
163
+ this.error(`❌ Conversion failed for: ${repoUrl}`, error);
164
+ this.info('─'.repeat(50));
165
+ }
166
+
167
+ /**
168
+ * Log tool extraction
169
+ */
170
+ logToolExtracted(toolName: string, description: string): void {
171
+ this.debug(` 📦 Extracted tool: ${toolName}`);
172
+ this.debug(` ${description.substring(0, 60)}${description.length > 60 ? '...' : ''}`);
173
+ }
174
+
175
+ /**
176
+ * Log configuration change
177
+ */
178
+ logConfigChange(setting: string, value: unknown): void {
179
+ this.info(`Configuration changed: ${setting} = ${JSON.stringify(value)}`);
180
+ }
181
+
182
+ /**
183
+ * Dispose the output channel
184
+ */
185
+ dispose(): void {
186
+ this.channel.dispose();
187
+ }
188
+ }
189
+
190
+ /**
191
+ * Get the global output channel instance
192
+ */
193
+ export function getOutputChannel(): OutputChannelView {
194
+ return OutputChannelView.getInstance();
195
+ }
@@ -0,0 +1,251 @@
1
+ /**
2
+ * @fileoverview Status bar item for showing conversion progress
3
+ * @copyright Copyright (c) 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ import * as vscode from 'vscode';
8
+ import { isCurrentWorkspaceGitHubRepo } from '../commands/convertCurrentRepo';
9
+
10
+ type StatusBarState = 'idle' | 'loading' | 'success' | 'error';
11
+
12
+ /**
13
+ * Status bar item manager for the extension
14
+ */
15
+ export class StatusBarItem {
16
+ private item: vscode.StatusBarItem;
17
+ private state: StatusBarState = 'idle';
18
+ private progressInterval: NodeJS.Timeout | null = null;
19
+ private progressDots = 0;
20
+
21
+ constructor(private context: vscode.ExtensionContext) {
22
+ this.item = vscode.window.createStatusBarItem(
23
+ vscode.StatusBarAlignment.Right,
24
+ 100
25
+ );
26
+
27
+ this.item.command = 'github-to-mcp.showQuickActions';
28
+ this.setIdle();
29
+
30
+ // Register the quick actions command
31
+ context.subscriptions.push(
32
+ vscode.commands.registerCommand('github-to-mcp.showQuickActions', () => {
33
+ this.showQuickActions();
34
+ })
35
+ );
36
+
37
+ // Check if current workspace is a GitHub repo
38
+ this.updateVisibility();
39
+
40
+ // Watch for workspace changes
41
+ context.subscriptions.push(
42
+ vscode.workspace.onDidChangeWorkspaceFolders(() => {
43
+ this.updateVisibility();
44
+ })
45
+ );
46
+ }
47
+
48
+ /**
49
+ * Update visibility based on workspace
50
+ */
51
+ private async updateVisibility(): Promise<void> {
52
+ const isGitHubRepo = await isCurrentWorkspaceGitHubRepo();
53
+ const config = vscode.workspace.getConfiguration('github-to-mcp');
54
+ const alwaysShow = config.get<boolean>('alwaysShowStatusBar', false);
55
+
56
+ if (isGitHubRepo || alwaysShow) {
57
+ this.item.show();
58
+ } else {
59
+ this.item.hide();
60
+ }
61
+ }
62
+
63
+ /**
64
+ * Show quick actions menu
65
+ */
66
+ private async showQuickActions(): Promise<void> {
67
+ const items: vscode.QuickPickItem[] = [
68
+ {
69
+ label: '$(github) Convert from URL',
70
+ description: 'Enter a GitHub repository URL',
71
+ detail: 'Convert any public GitHub repository to MCP server'
72
+ },
73
+ {
74
+ label: '$(folder) Convert Current Repo',
75
+ description: 'Convert the open workspace',
76
+ detail: 'Convert the currently open GitHub repository'
77
+ },
78
+ {
79
+ label: '$(list-flat) Browse Registry',
80
+ description: 'Browse popular MCP servers',
81
+ detail: 'Choose from a curated list of repositories'
82
+ },
83
+ {
84
+ label: '$(gear) Configure Claude Desktop',
85
+ description: 'Auto-configure your MCP servers',
86
+ detail: 'Add converted servers to Claude Desktop config'
87
+ },
88
+ {
89
+ label: '',
90
+ kind: vscode.QuickPickItemKind.Separator
91
+ },
92
+ {
93
+ label: '$(history) View History',
94
+ description: 'See conversion history',
95
+ detail: 'View all previously converted repositories'
96
+ },
97
+ {
98
+ label: '$(output) Show Logs',
99
+ description: 'Open output channel',
100
+ detail: 'View extension logs and debug information'
101
+ }
102
+ ];
103
+
104
+ const selected = await vscode.window.showQuickPick(items, {
105
+ placeHolder: 'Select an action',
106
+ title: 'GitHub to MCP'
107
+ });
108
+
109
+ if (!selected) {
110
+ return;
111
+ }
112
+
113
+ switch (selected.label) {
114
+ case '$(github) Convert from URL':
115
+ vscode.commands.executeCommand('github-to-mcp.convertFromUrl');
116
+ break;
117
+ case '$(folder) Convert Current Repo':
118
+ vscode.commands.executeCommand('github-to-mcp.convertCurrentRepo');
119
+ break;
120
+ case '$(list-flat) Browse Registry':
121
+ vscode.commands.executeCommand('github-to-mcp.browseRegistry');
122
+ break;
123
+ case '$(gear) Configure Claude Desktop':
124
+ vscode.commands.executeCommand('github-to-mcp.configureClaudeDesktop');
125
+ break;
126
+ case '$(history) View History':
127
+ vscode.commands.executeCommand('github-to-mcp.history.focus');
128
+ break;
129
+ case '$(output) Show Logs':
130
+ vscode.commands.executeCommand('github-to-mcp.showOutput');
131
+ break;
132
+ }
133
+ }
134
+
135
+ /**
136
+ * Set status to idle
137
+ */
138
+ setIdle(): void {
139
+ this.stopProgress();
140
+ this.state = 'idle';
141
+ this.item.text = '$(github) MCP';
142
+ this.item.tooltip = 'GitHub to MCP: Click for actions';
143
+ this.item.backgroundColor = undefined;
144
+ }
145
+
146
+ /**
147
+ * Set status to loading with optional message
148
+ */
149
+ setLoading(message?: string): void {
150
+ this.state = 'loading';
151
+ this.item.tooltip = message || 'Converting repository...';
152
+ this.item.backgroundColor = new vscode.ThemeColor('statusBarItem.warningBackground');
153
+ this.startProgress();
154
+ }
155
+
156
+ /**
157
+ * Set status to success
158
+ */
159
+ setSuccess(message?: string): void {
160
+ this.stopProgress();
161
+ this.state = 'success';
162
+ this.item.text = '$(check) MCP';
163
+ this.item.tooltip = message || 'Conversion successful!';
164
+ this.item.backgroundColor = new vscode.ThemeColor('statusBarItem.prominentBackground');
165
+
166
+ // Reset to idle after 3 seconds
167
+ setTimeout(() => {
168
+ if (this.state === 'success') {
169
+ this.setIdle();
170
+ }
171
+ }, 3000);
172
+ }
173
+
174
+ /**
175
+ * Set status to error
176
+ */
177
+ setError(message?: string): void {
178
+ this.stopProgress();
179
+ this.state = 'error';
180
+ this.item.text = '$(error) MCP';
181
+ this.item.tooltip = message || 'Conversion failed';
182
+ this.item.backgroundColor = new vscode.ThemeColor('statusBarItem.errorBackground');
183
+
184
+ // Reset to idle after 5 seconds
185
+ setTimeout(() => {
186
+ if (this.state === 'error') {
187
+ this.setIdle();
188
+ }
189
+ }, 5000);
190
+ }
191
+
192
+ /**
193
+ * Start progress animation
194
+ */
195
+ private startProgress(): void {
196
+ this.stopProgress();
197
+ this.progressDots = 0;
198
+
199
+ this.progressInterval = setInterval(() => {
200
+ this.progressDots = (this.progressDots + 1) % 4;
201
+ const dots = '.'.repeat(this.progressDots);
202
+ this.item.text = `$(sync~spin) MCP${dots}`;
203
+ }, 300);
204
+ }
205
+
206
+ /**
207
+ * Stop progress animation
208
+ */
209
+ private stopProgress(): void {
210
+ if (this.progressInterval) {
211
+ clearInterval(this.progressInterval);
212
+ this.progressInterval = null;
213
+ }
214
+ }
215
+
216
+ /**
217
+ * Show the status bar item
218
+ */
219
+ show(): void {
220
+ this.item.show();
221
+ }
222
+
223
+ /**
224
+ * Hide the status bar item
225
+ */
226
+ hide(): void {
227
+ this.item.hide();
228
+ }
229
+
230
+ /**
231
+ * Get current state
232
+ */
233
+ getState(): StatusBarState {
234
+ return this.state;
235
+ }
236
+
237
+ /**
238
+ * Dispose the status bar item
239
+ */
240
+ dispose(): void {
241
+ this.stopProgress();
242
+ this.item.dispose();
243
+ }
244
+ }
245
+
246
+ /**
247
+ * Create and initialize the status bar item
248
+ */
249
+ export function createStatusBarItem(context: vscode.ExtensionContext): StatusBarItem {
250
+ return new StatusBarItem(context);
251
+ }