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,464 @@
1
+ /**
2
+ * @fileoverview VS Code extension for GitHub to MCP
3
+ * @copyright Copyright (c) 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ import * as vscode from 'vscode';
8
+
9
+ // Commands
10
+ import { convertCommand } from './commands/convert';
11
+ import { validateCommand } from './commands/validate';
12
+ import { convertFromUrlCommand, performConversion } from './commands/convertFromUrl';
13
+ import { convertCurrentRepoCommand, isCurrentWorkspaceGitHubRepo, getCurrentWorkspaceGitHubUrl } from './commands/convertCurrentRepo';
14
+ import { browseRegistryCommand } from './commands/browseRegistry';
15
+ import { configureClaudeDesktopCommand, openClaudeDesktopConfig } from './commands/configureClaudeDesktop';
16
+
17
+ // Views
18
+ import { HistoryProvider } from './views/historyProvider';
19
+ import { McpServersTreeView } from './views/McpServersTreeView';
20
+ import { ToolsExplorerView } from './views/ToolsExplorerView';
21
+ import { getOutputChannel } from './views/OutputChannelView';
22
+ import { StatusBarItem, createStatusBarItem } from './views/StatusBarItem';
23
+ import { showResultsPanel } from './views/resultsPanel';
24
+
25
+ // Webviews
26
+ import { showConversionPanel } from './webviews/ConversionPanel';
27
+ import { showToolDetailsPanel } from './webviews/ToolDetailsPanel';
28
+
29
+ // Utils
30
+ import { StorageService, ConversionResult } from './utils/storage';
31
+ import { generateMcpServerFiles } from './utils/file-generator';
32
+
33
+ let statusBarItem: StatusBarItem;
34
+ let historyProvider: HistoryProvider;
35
+ let serversProvider: McpServersTreeView;
36
+ let toolsProvider: ToolsExplorerView;
37
+ let storageService: StorageService;
38
+ let outputChannel = getOutputChannel();
39
+
40
+ export function activate(context: vscode.ExtensionContext): void {
41
+ outputChannel.info('GitHub to MCP extension activating...');
42
+
43
+ // Initialize storage service
44
+ storageService = new StorageService(context);
45
+
46
+ // Initialize providers
47
+ historyProvider = new HistoryProvider(storageService);
48
+ serversProvider = new McpServersTreeView(storageService);
49
+ toolsProvider = new ToolsExplorerView(storageService);
50
+
51
+ // Register tree views
52
+ const historyTreeView = vscode.window.createTreeView('github-to-mcp.history', {
53
+ treeDataProvider: historyProvider,
54
+ showCollapseAll: true
55
+ });
56
+
57
+ const serversTreeView = vscode.window.createTreeView('github-to-mcp.servers', {
58
+ treeDataProvider: serversProvider,
59
+ showCollapseAll: true
60
+ });
61
+
62
+ const toolsTreeView = vscode.window.createTreeView('github-to-mcp.tools', {
63
+ treeDataProvider: toolsProvider,
64
+ showCollapseAll: true
65
+ });
66
+
67
+ // Initialize status bar
68
+ statusBarItem = createStatusBarItem(context);
69
+
70
+ // Register commands
71
+ registerAllCommands(context);
72
+
73
+ // Auto-detection
74
+ const config = vscode.workspace.getConfiguration('github-to-mcp');
75
+ if (config.get<boolean>('autoDetect')) {
76
+ checkAndPromptAutoDetection(context);
77
+ }
78
+
79
+ // Watch for configuration changes
80
+ context.subscriptions.push(
81
+ vscode.workspace.onDidChangeConfiguration(e => {
82
+ if (e.affectsConfiguration('github-to-mcp')) {
83
+ onConfigurationChanged();
84
+ }
85
+ })
86
+ );
87
+
88
+ // Add disposables
89
+ context.subscriptions.push(
90
+ historyTreeView,
91
+ serversTreeView,
92
+ toolsTreeView,
93
+ statusBarItem
94
+ );
95
+
96
+ outputChannel.info('GitHub to MCP extension activated successfully!');
97
+ }
98
+
99
+ export function deactivate(): void {
100
+ outputChannel.info('GitHub to MCP extension deactivating...');
101
+ if (statusBarItem) {
102
+ statusBarItem.dispose();
103
+ }
104
+ outputChannel.dispose();
105
+ }
106
+
107
+ /**
108
+ * Register all commands
109
+ */
110
+ function registerAllCommands(context: vscode.ExtensionContext): void {
111
+ const extensionUri = context.extensionUri;
112
+
113
+ // Convert command (legacy, uses input box)
114
+ context.subscriptions.push(
115
+ vscode.commands.registerCommand('github-to-mcp.convert', async () => {
116
+ const url = await vscode.window.showInputBox({
117
+ prompt: 'Enter GitHub repository URL',
118
+ placeHolder: 'https://github.com/owner/repo',
119
+ validateInput: (value) => {
120
+ if (!value) {
121
+ return 'URL is required';
122
+ }
123
+ if (!value.match(/^https?:\/\/github\.com\/[\w-]+\/[\w.-]+/)) {
124
+ return 'Invalid GitHub URL format';
125
+ }
126
+ return null;
127
+ }
128
+ });
129
+
130
+ if (url) {
131
+ statusBarItem.setLoading('Converting repository...');
132
+ outputChannel.logConversionStart(url);
133
+
134
+ try {
135
+ await convertCommand(url, storageService, historyProvider);
136
+ serversProvider.refresh();
137
+ toolsProvider.refresh();
138
+ statusBarItem.setSuccess('Conversion complete!');
139
+ } catch (error) {
140
+ statusBarItem.setError('Conversion failed');
141
+ outputChannel.error('Conversion failed', error as Error);
142
+ }
143
+ }
144
+ })
145
+ );
146
+
147
+ // Convert from URL command
148
+ context.subscriptions.push(
149
+ vscode.commands.registerCommand('github-to-mcp.convertFromUrl', async () => {
150
+ statusBarItem.setLoading('Converting repository...');
151
+ try {
152
+ await convertFromUrlCommand(storageService, historyProvider, extensionUri);
153
+ serversProvider.refresh();
154
+ toolsProvider.refresh();
155
+ statusBarItem.setSuccess('Conversion complete!');
156
+ } catch (error) {
157
+ statusBarItem.setError('Conversion failed');
158
+ }
159
+ })
160
+ );
161
+
162
+ // Convert current repo command
163
+ context.subscriptions.push(
164
+ vscode.commands.registerCommand('github-to-mcp.convertCurrentRepo', async () => {
165
+ statusBarItem.setLoading('Converting current repository...');
166
+ try {
167
+ await convertCurrentRepoCommand(storageService, historyProvider, extensionUri);
168
+ serversProvider.refresh();
169
+ toolsProvider.refresh();
170
+ statusBarItem.setSuccess('Conversion complete!');
171
+ } catch (error) {
172
+ statusBarItem.setError('Conversion failed');
173
+ }
174
+ })
175
+ );
176
+
177
+ // Convert from clipboard command
178
+ context.subscriptions.push(
179
+ vscode.commands.registerCommand('github-to-mcp.convertFromClipboard', async () => {
180
+ const clipboard = await vscode.env.clipboard.readText();
181
+ if (clipboard.match(/^https?:\/\/github\.com\/[\w-]+\/[\w.-]+/)) {
182
+ statusBarItem.setLoading('Converting from clipboard...');
183
+ try {
184
+ await performConversion(clipboard, storageService, historyProvider, extensionUri);
185
+ serversProvider.refresh();
186
+ toolsProvider.refresh();
187
+ statusBarItem.setSuccess('Conversion complete!');
188
+ } catch (error) {
189
+ statusBarItem.setError('Conversion failed');
190
+ }
191
+ } else {
192
+ vscode.window.showErrorMessage('Clipboard does not contain a valid GitHub URL');
193
+ }
194
+ })
195
+ );
196
+
197
+ // Browse registry command
198
+ context.subscriptions.push(
199
+ vscode.commands.registerCommand('github-to-mcp.browseRegistry', async () => {
200
+ await browseRegistryCommand(storageService, historyProvider, extensionUri);
201
+ serversProvider.refresh();
202
+ toolsProvider.refresh();
203
+ })
204
+ );
205
+
206
+ // Configure Claude Desktop command
207
+ context.subscriptions.push(
208
+ vscode.commands.registerCommand('github-to-mcp.configureClaudeDesktop', async () => {
209
+ await configureClaudeDesktopCommand(storageService);
210
+ })
211
+ );
212
+
213
+ // Open Claude config command
214
+ context.subscriptions.push(
215
+ vscode.commands.registerCommand('github-to-mcp.openClaudeConfig', async () => {
216
+ await openClaudeDesktopConfig();
217
+ })
218
+ );
219
+
220
+ // Copy config command
221
+ context.subscriptions.push(
222
+ vscode.commands.registerCommand('github-to-mcp.copyConfig', async (item?: ConversionResult) => {
223
+ const history = storageService.getHistory();
224
+ const result = item || history[0];
225
+
226
+ if (!result) {
227
+ vscode.window.showWarningMessage('No conversions in history. Convert a repository first.');
228
+ return;
229
+ }
230
+
231
+ const platform = await vscode.window.showQuickPick(
232
+ ['Claude', 'Cursor', 'Raw JSON'],
233
+ { placeHolder: 'Select platform for MCP config' }
234
+ );
235
+
236
+ if (platform) {
237
+ const config = generateConfig(result, platform);
238
+ await vscode.env.clipboard.writeText(config);
239
+ vscode.window.showInformationMessage(`MCP config for ${platform} copied to clipboard!`);
240
+ }
241
+ })
242
+ );
243
+
244
+ // View details command
245
+ context.subscriptions.push(
246
+ vscode.commands.registerCommand('github-to-mcp.viewDetails', (item: ConversionResult) => {
247
+ showResultsPanel(item, extensionUri);
248
+ })
249
+ );
250
+
251
+ // Show tool details command
252
+ context.subscriptions.push(
253
+ vscode.commands.registerCommand('github-to-mcp.showToolDetails', (tool, server) => {
254
+ showToolDetailsPanel(tool, server, context);
255
+ })
256
+ );
257
+
258
+ // Remove history item command
259
+ context.subscriptions.push(
260
+ vscode.commands.registerCommand('github-to-mcp.removeHistoryItem', (item: ConversionResult) => {
261
+ storageService.removeFromHistory(item.id);
262
+ historyProvider.refresh();
263
+ serversProvider.refresh();
264
+ toolsProvider.refresh();
265
+ vscode.window.showInformationMessage(`Removed ${item.repoName} from history`);
266
+ })
267
+ );
268
+
269
+ // Clear history command
270
+ context.subscriptions.push(
271
+ vscode.commands.registerCommand('github-to-mcp.clearHistory', async () => {
272
+ const confirm = await vscode.window.showWarningMessage(
273
+ 'Are you sure you want to clear all conversion history?',
274
+ { modal: true },
275
+ 'Clear',
276
+ 'Cancel'
277
+ );
278
+
279
+ if (confirm === 'Clear') {
280
+ storageService.clearHistory();
281
+ historyProvider.refresh();
282
+ serversProvider.refresh();
283
+ toolsProvider.refresh();
284
+ vscode.window.showInformationMessage('Conversion history cleared.');
285
+ }
286
+ })
287
+ );
288
+
289
+ // Refresh history command
290
+ context.subscriptions.push(
291
+ vscode.commands.registerCommand('github-to-mcp.refreshHistory', () => {
292
+ historyProvider.refresh();
293
+ serversProvider.refresh();
294
+ toolsProvider.refresh();
295
+ })
296
+ );
297
+
298
+ // Open in browser command
299
+ context.subscriptions.push(
300
+ vscode.commands.registerCommand('github-to-mcp.openInBrowser', (item: ConversionResult) => {
301
+ vscode.env.openExternal(vscode.Uri.parse(item.repoUrl));
302
+ })
303
+ );
304
+
305
+ // Export server command
306
+ context.subscriptions.push(
307
+ vscode.commands.registerCommand('github-to-mcp.exportServer', async (item: ConversionResult) => {
308
+ if (!item) {
309
+ const history = storageService.getHistory();
310
+ if (history.length === 0) {
311
+ vscode.window.showWarningMessage('No servers to export.');
312
+ return;
313
+ }
314
+ item = history[0];
315
+ }
316
+
317
+ try {
318
+ const files = await generateMcpServerFiles(item);
319
+ vscode.window.showInformationMessage(
320
+ `Server files generated at ${files.serverFile}`,
321
+ 'Copy Config'
322
+ ).then(selection => {
323
+ if (selection === 'Copy Config') {
324
+ vscode.env.clipboard.writeText(files.configSnippet);
325
+ }
326
+ });
327
+ } catch (error) {
328
+ const msg = error instanceof Error ? error.message : 'Unknown error';
329
+ vscode.window.showErrorMessage(`Failed to export server: ${msg}`);
330
+ }
331
+ })
332
+ );
333
+
334
+ // Validate command
335
+ context.subscriptions.push(
336
+ vscode.commands.registerCommand('github-to-mcp.validate', async () => {
337
+ await validateCommand();
338
+ })
339
+ );
340
+
341
+ // Show output command
342
+ context.subscriptions.push(
343
+ vscode.commands.registerCommand('github-to-mcp.showOutput', () => {
344
+ outputChannel.show();
345
+ })
346
+ );
347
+
348
+ // Show conversion panel command
349
+ context.subscriptions.push(
350
+ vscode.commands.registerCommand('github-to-mcp.showConversionPanel', () => {
351
+ showConversionPanel(context, storageService, historyProvider);
352
+ })
353
+ );
354
+
355
+ // Filter tools command
356
+ context.subscriptions.push(
357
+ vscode.commands.registerCommand('github-to-mcp.filterTools', async () => {
358
+ const filter = await vscode.window.showInputBox({
359
+ prompt: 'Filter tools by name or description',
360
+ placeHolder: 'Enter search term...'
361
+ });
362
+
363
+ if (filter !== undefined) {
364
+ if (filter) {
365
+ toolsProvider.setFilter(filter);
366
+ } else {
367
+ toolsProvider.clearFilter();
368
+ }
369
+ }
370
+ })
371
+ );
372
+ }
373
+
374
+ /**
375
+ * Check for auto-detection and prompt user
376
+ */
377
+ async function checkAndPromptAutoDetection(context: vscode.ExtensionContext): Promise<void> {
378
+ const dontAskKey = 'github-to-mcp.dontAskAutoDetect';
379
+ if (context.globalState.get<boolean>(dontAskKey)) {
380
+ return;
381
+ }
382
+
383
+ const isGitHubRepo = await isCurrentWorkspaceGitHubRepo();
384
+ if (!isGitHubRepo) {
385
+ return;
386
+ }
387
+
388
+ const githubUrl = await getCurrentWorkspaceGitHubUrl();
389
+ if (!githubUrl) {
390
+ return;
391
+ }
392
+
393
+ const repoPath = githubUrl.replace('https://github.com/', '');
394
+
395
+ const response = await vscode.window.showInformationMessage(
396
+ `Convert this GitHub repo (${repoPath}) to an MCP server?`,
397
+ 'Yes',
398
+ 'No',
399
+ "Don't ask again"
400
+ );
401
+
402
+ if (response === 'Yes') {
403
+ statusBarItem.setLoading('Converting repository...');
404
+ try {
405
+ await performConversion(githubUrl, storageService, historyProvider, context.extensionUri);
406
+ serversProvider.refresh();
407
+ toolsProvider.refresh();
408
+ statusBarItem.setSuccess('Conversion complete!');
409
+ } catch (error) {
410
+ statusBarItem.setError('Conversion failed');
411
+ }
412
+ } else if (response === "Don't ask again") {
413
+ await context.globalState.update(dontAskKey, true);
414
+ }
415
+ }
416
+
417
+ /**
418
+ * Handle configuration changes
419
+ */
420
+ function onConfigurationChanged(): void {
421
+ const config = vscode.workspace.getConfiguration('github-to-mcp');
422
+
423
+ // Update log level
424
+ const logLevel = config.get<'debug' | 'info' | 'warn' | 'error'>('logLevel', 'info');
425
+ outputChannel.setLogLevel(logLevel);
426
+ outputChannel.logConfigChange('logLevel', logLevel);
427
+ }
428
+
429
+ /**
430
+ * Generate MCP config for different platforms
431
+ */
432
+ function generateConfig(result: ConversionResult, platform: string): string {
433
+ const serverName = result.repoName.replace('/', '-').toLowerCase();
434
+ const serverConfig = {
435
+ command: 'node',
436
+ args: [`~/.mcp-servers/${serverName}-mcp/index.js`]
437
+ };
438
+
439
+ switch (platform.toLowerCase()) {
440
+ case 'claude':
441
+ return JSON.stringify({
442
+ mcpServers: {
443
+ [serverName]: serverConfig
444
+ }
445
+ }, null, 2);
446
+
447
+ case 'cursor':
448
+ return JSON.stringify({
449
+ mcp: {
450
+ servers: {
451
+ [serverName]: serverConfig
452
+ }
453
+ }
454
+ }, null, 2);
455
+
456
+ case 'raw json':
457
+ default:
458
+ return JSON.stringify({
459
+ name: serverName,
460
+ tools: result.toolCount,
461
+ ...serverConfig
462
+ }, null, 2);
463
+ }
464
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @fileoverview Type declarations for external modules
3
+ * @copyright Copyright (c) 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ declare module '@nirholas/github-to-mcp' {
8
+ export interface ExtractedTool {
9
+ name: string;
10
+ description: string;
11
+ inputSchema: Record<string, unknown>;
12
+ }
13
+
14
+ export interface RepoClassification {
15
+ type: string;
16
+ confidence: number;
17
+ indicators: string[];
18
+ }
19
+
20
+ export interface GenerationResult {
21
+ tools: ExtractedTool[];
22
+ classification?: RepoClassification;
23
+ generate(): string;
24
+ generatePython?(): string;
25
+ }
26
+
27
+ export interface GenerateOptions {
28
+ sources?: string[];
29
+ outputLanguage?: 'typescript' | 'python';
30
+ }
31
+
32
+ export function generateFromGithub(
33
+ url: string,
34
+ options?: GenerateOptions
35
+ ): Promise<GenerationResult>;
36
+ }
@@ -0,0 +1,73 @@
1
+ /**
2
+ * @fileoverview Extension test suite
3
+ * @copyright Copyright (c) 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ import * as assert from 'assert';
8
+ import * as vscode from 'vscode';
9
+
10
+ suite('Extension Test Suite', () => {
11
+ vscode.window.showInformationMessage('Start all tests.');
12
+
13
+ test('Extension should be present', () => {
14
+ assert.ok(vscode.extensions.getExtension('nirholas.github-to-mcp'));
15
+ });
16
+
17
+ test('Should register all commands', async () => {
18
+ const commands = await vscode.commands.getCommands(true);
19
+
20
+ assert.ok(commands.includes('github-to-mcp.convert'));
21
+ assert.ok(commands.includes('github-to-mcp.convertFromClipboard'));
22
+ assert.ok(commands.includes('github-to-mcp.copyConfig'));
23
+ });
24
+
25
+ test('GitHub URL validation', () => {
26
+ const validUrls = [
27
+ 'https://github.com/owner/repo',
28
+ 'https://github.com/some-user/some-repo',
29
+ 'https://github.com/user123/repo.js'
30
+ ];
31
+
32
+ const invalidUrls = [
33
+ 'https://gitlab.com/owner/repo',
34
+ 'not-a-url',
35
+ 'https://github.com/',
36
+ 'https://github.com/owner'
37
+ ];
38
+
39
+ const pattern = /^https?:\/\/github\.com\/[\w-]+\/[\w.-]+/;
40
+
41
+ for (const url of validUrls) {
42
+ assert.ok(pattern.test(url), `Expected ${url} to be valid`);
43
+ }
44
+
45
+ for (const url of invalidUrls) {
46
+ assert.ok(!pattern.test(url), `Expected ${url} to be invalid`);
47
+ }
48
+ });
49
+
50
+ test('Config generation produces valid JSON', () => {
51
+ const mockResult = {
52
+ repoName: 'test-repo',
53
+ toolCount: 5,
54
+ timestamp: new Date().toISOString()
55
+ };
56
+
57
+ const config = {
58
+ mcpServers: {
59
+ [mockResult.repoName]: {
60
+ command: 'node',
61
+ args: [`${mockResult.repoName}-mcp/index.js`]
62
+ }
63
+ }
64
+ };
65
+
66
+ const jsonString = JSON.stringify(config, null, 2);
67
+
68
+ // Should parse without error
69
+ const parsed = JSON.parse(jsonString);
70
+ assert.ok(parsed.mcpServers);
71
+ assert.ok(parsed.mcpServers['test-repo']);
72
+ });
73
+ });