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,109 @@
1
+ /**
2
+ * @fileoverview Command to convert the currently open workspace repository
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
+ /**
13
+ * Convert the currently open GitHub repository to MCP server
14
+ */
15
+ export async function convertCurrentRepoCommand(
16
+ storage: StorageService,
17
+ historyProvider: HistoryProvider,
18
+ extensionUri: vscode.Uri
19
+ ): Promise<void> {
20
+ const workspaceFolders = vscode.workspace.workspaceFolders;
21
+
22
+ if (!workspaceFolders || workspaceFolders.length === 0) {
23
+ vscode.window.showWarningMessage('No workspace folder open. Please open a GitHub repository folder.');
24
+ return;
25
+ }
26
+
27
+ // Try to get the GitHub URL from git config
28
+ const githubUrl = await getGitHubUrlFromWorkspace(workspaceFolders[0]);
29
+
30
+ if (!githubUrl) {
31
+ // Fallback to manual input if we can't detect
32
+ const response = await vscode.window.showWarningMessage(
33
+ 'Could not detect GitHub repository. Would you like to enter the URL manually?',
34
+ 'Enter URL',
35
+ 'Cancel'
36
+ );
37
+
38
+ if (response === 'Enter URL') {
39
+ vscode.commands.executeCommand('github-to-mcp.convertFromUrl');
40
+ }
41
+ return;
42
+ }
43
+
44
+ // Confirm with user
45
+ const repoPath = githubUrl.replace('https://github.com/', '');
46
+ const confirm = await vscode.window.showInformationMessage(
47
+ `Convert ${repoPath} to an MCP server?`,
48
+ 'Yes',
49
+ 'No'
50
+ );
51
+
52
+ if (confirm !== 'Yes') {
53
+ return;
54
+ }
55
+
56
+ await performConversion(githubUrl, storage, historyProvider, extensionUri);
57
+ }
58
+
59
+ /**
60
+ * Extract GitHub URL from workspace git config
61
+ */
62
+ async function getGitHubUrlFromWorkspace(folder: vscode.WorkspaceFolder): Promise<string | null> {
63
+ try {
64
+ const gitConfigPath = vscode.Uri.joinPath(folder.uri, '.git', 'config');
65
+ const gitConfig = await vscode.workspace.fs.readFile(gitConfigPath);
66
+ const content = Buffer.from(gitConfig).toString('utf-8');
67
+
68
+ // Match HTTPS format: https://github.com/owner/repo.git
69
+ const httpsMatch = content.match(/url\s*=\s*https?:\/\/github\.com\/([\w-]+\/[\w.-]+?)(?:\.git)?$/m);
70
+ if (httpsMatch) {
71
+ return `https://github.com/${httpsMatch[1]}`;
72
+ }
73
+
74
+ // Match SSH format: git@github.com:owner/repo.git
75
+ const sshMatch = content.match(/url\s*=\s*git@github\.com:([\w-]+\/[\w.-]+?)(?:\.git)?$/m);
76
+ if (sshMatch) {
77
+ return `https://github.com/${sshMatch[1]}`;
78
+ }
79
+
80
+ return null;
81
+ } catch {
82
+ return null;
83
+ }
84
+ }
85
+
86
+ /**
87
+ * Check if the current workspace is a GitHub repository
88
+ */
89
+ export async function isCurrentWorkspaceGitHubRepo(): Promise<boolean> {
90
+ const workspaceFolders = vscode.workspace.workspaceFolders;
91
+ if (!workspaceFolders || workspaceFolders.length === 0) {
92
+ return false;
93
+ }
94
+
95
+ const url = await getGitHubUrlFromWorkspace(workspaceFolders[0]);
96
+ return url !== null;
97
+ }
98
+
99
+ /**
100
+ * Get the GitHub URL of the current workspace
101
+ */
102
+ export async function getCurrentWorkspaceGitHubUrl(): Promise<string | null> {
103
+ const workspaceFolders = vscode.workspace.workspaceFolders;
104
+ if (!workspaceFolders || workspaceFolders.length === 0) {
105
+ return null;
106
+ }
107
+
108
+ return getGitHubUrlFromWorkspace(workspaceFolders[0]);
109
+ }
@@ -0,0 +1,138 @@
1
+ /**
2
+ * @fileoverview Command to convert a GitHub repository from URL input
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
+ * Prompt user for GitHub URL and convert to MCP server
14
+ */
15
+ export async function convertFromUrlCommand(
16
+ storage: StorageService,
17
+ historyProvider: HistoryProvider,
18
+ extensionUri: vscode.Uri
19
+ ): Promise<void> {
20
+ // Get URL from user input
21
+ const url = await vscode.window.showInputBox({
22
+ prompt: 'Enter GitHub repository URL',
23
+ placeHolder: 'https://github.com/owner/repo',
24
+ ignoreFocusOut: true,
25
+ validateInput: (value) => {
26
+ if (!value) {
27
+ return 'URL is required';
28
+ }
29
+ if (!value.match(/^https?:\/\/github\.com\/[\w-]+\/[\w.-]+/)) {
30
+ return 'Invalid GitHub URL format. Expected: https://github.com/owner/repo';
31
+ }
32
+ return null;
33
+ }
34
+ });
35
+
36
+ if (!url) {
37
+ return;
38
+ }
39
+
40
+ await performConversion(url, storage, historyProvider, extensionUri);
41
+ }
42
+
43
+ /**
44
+ * Perform the actual conversion
45
+ */
46
+ export async function performConversion(
47
+ url: string,
48
+ storage: StorageService,
49
+ historyProvider: HistoryProvider,
50
+ extensionUri: vscode.Uri
51
+ ): Promise<ConversionResult | undefined> {
52
+ return vscode.window.withProgress(
53
+ {
54
+ location: vscode.ProgressLocation.Notification,
55
+ title: 'Converting GitHub repository...',
56
+ cancellable: true
57
+ },
58
+ async (progress, token) => {
59
+ try {
60
+ // Parse URL to get owner/repo
61
+ const match = url.match(/github\.com\/([\w-]+)\/([\w.-]+)/);
62
+ if (!match) {
63
+ throw new Error('Invalid GitHub URL');
64
+ }
65
+
66
+ const [, owner, repo] = match;
67
+
68
+ if (token.isCancellationRequested) {
69
+ return undefined;
70
+ }
71
+
72
+ progress.report({ message: 'Fetching repository data...', increment: 10 });
73
+
74
+ // Import the core library dynamically to avoid bundling issues
75
+ const { generateFromGithub } = await import('@nirholas/github-to-mcp');
76
+
77
+ if (token.isCancellationRequested) {
78
+ return undefined;
79
+ }
80
+
81
+ progress.report({ message: 'Analyzing repository...', increment: 30 });
82
+
83
+ const result = await generateFromGithub(url, {
84
+ sources: ['readme', 'openapi', 'code']
85
+ });
86
+
87
+ if (token.isCancellationRequested) {
88
+ return undefined;
89
+ }
90
+
91
+ progress.report({ message: 'Generating MCP server code...', increment: 40 });
92
+
93
+ const generatedCode = result.generate();
94
+
95
+ progress.report({ message: 'Finalizing...', increment: 20 });
96
+
97
+ // Create conversion result
98
+ const conversionResult: ConversionResult = {
99
+ id: Date.now().toString(),
100
+ repoUrl: url,
101
+ repoName: `${owner}/${repo}`,
102
+ toolCount: result.tools.length,
103
+ timestamp: new Date().toISOString(),
104
+ classification: result.classification,
105
+ code: generatedCode,
106
+ tools: result.tools.map((t: { name: string; description: string; parameters?: unknown }) => ({
107
+ name: t.name,
108
+ description: t.description,
109
+ parameters: t.parameters
110
+ }))
111
+ };
112
+
113
+ // Save to history
114
+ storage.addToHistory(conversionResult);
115
+ historyProvider.refresh();
116
+
117
+ // Show results panel
118
+ showResultsPanel(conversionResult, extensionUri);
119
+
120
+ vscode.window.showInformationMessage(
121
+ `Successfully converted ${owner}/${repo} - ${result.tools.length} tools found!`,
122
+ 'View Details',
123
+ 'Copy Config'
124
+ ).then((selection) => {
125
+ if (selection === 'Copy Config') {
126
+ vscode.commands.executeCommand('github-to-mcp.copyConfig');
127
+ }
128
+ });
129
+
130
+ return conversionResult;
131
+ } catch (error) {
132
+ const message = error instanceof Error ? error.message : 'Unknown error';
133
+ vscode.window.showErrorMessage(`Failed to convert repository: ${message}`);
134
+ return undefined;
135
+ }
136
+ }
137
+ );
138
+ }
@@ -0,0 +1,121 @@
1
+ /**
2
+ * @fileoverview Command registration and exports
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
+
11
+ // Re-export individual commands
12
+ export { convertCommand } from './convert';
13
+ export { validateCommand } from './validate';
14
+ export { convertFromUrlCommand, performConversion } from './convertFromUrl';
15
+ export { convertCurrentRepoCommand, isCurrentWorkspaceGitHubRepo, getCurrentWorkspaceGitHubUrl } from './convertCurrentRepo';
16
+ export { browseRegistryCommand, fetchRemoteRegistry } from './browseRegistry';
17
+ export { configureClaudeDesktopCommand, isClaudeDesktopInstalled, openClaudeDesktopConfig } from './configureClaudeDesktop';
18
+
19
+ /**
20
+ * Register all commands with VS Code
21
+ */
22
+ export function registerCommands(
23
+ context: vscode.ExtensionContext,
24
+ storage: StorageService,
25
+ historyProvider: HistoryProvider
26
+ ): vscode.Disposable[] {
27
+ const { convertFromUrlCommand } = require('./convertFromUrl');
28
+ const { convertCurrentRepoCommand } = require('./convertCurrentRepo');
29
+ const { browseRegistryCommand } = require('./browseRegistry');
30
+ const { configureClaudeDesktopCommand, openClaudeDesktopConfig } = require('./configureClaudeDesktop');
31
+
32
+ const extensionUri = context.extensionUri;
33
+
34
+ const disposables: vscode.Disposable[] = [];
35
+
36
+ // Convert from URL command
37
+ disposables.push(
38
+ vscode.commands.registerCommand('github-to-mcp.convertFromUrl', () =>
39
+ convertFromUrlCommand(storage, historyProvider, extensionUri)
40
+ )
41
+ );
42
+
43
+ // Convert current repo command
44
+ disposables.push(
45
+ vscode.commands.registerCommand('github-to-mcp.convertCurrentRepo', () =>
46
+ convertCurrentRepoCommand(storage, historyProvider, extensionUri)
47
+ )
48
+ );
49
+
50
+ // Browse registry command
51
+ disposables.push(
52
+ vscode.commands.registerCommand('github-to-mcp.browseRegistry', () =>
53
+ browseRegistryCommand(storage, historyProvider, extensionUri)
54
+ )
55
+ );
56
+
57
+ // Configure Claude Desktop command
58
+ disposables.push(
59
+ vscode.commands.registerCommand('github-to-mcp.configureClaudeDesktop', () =>
60
+ configureClaudeDesktopCommand(storage)
61
+ )
62
+ );
63
+
64
+ // Open Claude Desktop config command
65
+ disposables.push(
66
+ vscode.commands.registerCommand('github-to-mcp.openClaudeConfig', () =>
67
+ openClaudeDesktopConfig()
68
+ )
69
+ );
70
+
71
+ // Clear history command
72
+ disposables.push(
73
+ vscode.commands.registerCommand('github-to-mcp.clearHistory', async () => {
74
+ const confirm = await vscode.window.showWarningMessage(
75
+ 'Are you sure you want to clear all conversion history?',
76
+ { modal: true },
77
+ 'Clear',
78
+ 'Cancel'
79
+ );
80
+
81
+ if (confirm === 'Clear') {
82
+ storage.clearHistory();
83
+ historyProvider.refresh();
84
+ vscode.window.showInformationMessage('Conversion history cleared.');
85
+ }
86
+ })
87
+ );
88
+
89
+ // Refresh history command
90
+ disposables.push(
91
+ vscode.commands.registerCommand('github-to-mcp.refreshHistory', () => {
92
+ historyProvider.refresh();
93
+ })
94
+ );
95
+
96
+ // Export server command
97
+ disposables.push(
98
+ vscode.commands.registerCommand('github-to-mcp.exportServer', async (item) => {
99
+ if (!item?.code) {
100
+ vscode.window.showWarningMessage('No server code to export.');
101
+ return;
102
+ }
103
+
104
+ const saveUri = await vscode.window.showSaveDialog({
105
+ defaultUri: vscode.Uri.file(`${item.repoName.replace('/', '-')}-mcp.js`),
106
+ filters: {
107
+ 'JavaScript': ['js'],
108
+ 'TypeScript': ['ts']
109
+ },
110
+ title: 'Export MCP Server'
111
+ });
112
+
113
+ if (saveUri) {
114
+ await vscode.workspace.fs.writeFile(saveUri, Buffer.from(item.code, 'utf-8'));
115
+ vscode.window.showInformationMessage(`Server exported to ${saveUri.fsPath}`);
116
+ }
117
+ })
118
+ );
119
+
120
+ return disposables;
121
+ }
@@ -0,0 +1,197 @@
1
+ /**
2
+ * @fileoverview Validate command implementation
3
+ * @copyright Copyright (c) 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ import * as vscode from 'vscode';
8
+
9
+ /**
10
+ * Validate a generated MCP server file
11
+ */
12
+ export async function validateCommand(): Promise<void> {
13
+ const fileUri = await vscode.window.showOpenDialog({
14
+ canSelectFiles: true,
15
+ canSelectFolders: false,
16
+ canSelectMany: false,
17
+ filters: {
18
+ 'TypeScript': ['ts'],
19
+ 'JavaScript': ['js'],
20
+ 'Python': ['py']
21
+ },
22
+ title: 'Select MCP server file to validate'
23
+ });
24
+
25
+ if (!fileUri || fileUri.length === 0) {
26
+ return;
27
+ }
28
+
29
+ const filePath = fileUri[0].fsPath;
30
+
31
+ await vscode.window.withProgress(
32
+ {
33
+ location: vscode.ProgressLocation.Notification,
34
+ title: 'Validating MCP server...',
35
+ cancellable: false
36
+ },
37
+ async (progress) => {
38
+ try {
39
+ progress.report({ message: 'Reading file...' });
40
+
41
+ const document = await vscode.workspace.openTextDocument(fileUri[0]);
42
+ const content = document.getText();
43
+
44
+ progress.report({ message: 'Analyzing structure...' });
45
+
46
+ const issues: ValidationIssue[] = [];
47
+
48
+ // Check for basic MCP server structure
49
+ if (filePath.endsWith('.ts') || filePath.endsWith('.js')) {
50
+ issues.push(...validateTypeScriptMcp(content));
51
+ } else if (filePath.endsWith('.py')) {
52
+ issues.push(...validatePythonMcp(content));
53
+ }
54
+
55
+ // Display results
56
+ if (issues.length === 0) {
57
+ vscode.window.showInformationMessage('✓ MCP server validation passed!');
58
+ } else {
59
+ const channel = vscode.window.createOutputChannel('MCP Validation');
60
+ channel.clear();
61
+ channel.appendLine('MCP Server Validation Results');
62
+ channel.appendLine('=' .repeat(40));
63
+ channel.appendLine('');
64
+
65
+ for (const issue of issues) {
66
+ const icon = issue.severity === 'error' ? '✗' : '⚠';
67
+ channel.appendLine(`${icon} Line ${issue.line || '?'}: ${issue.message}`);
68
+ }
69
+
70
+ channel.show();
71
+ vscode.window.showWarningMessage(
72
+ `Validation found ${issues.length} issue(s). See output for details.`
73
+ );
74
+ }
75
+ } catch (error) {
76
+ const message = error instanceof Error ? error.message : 'Unknown error';
77
+ vscode.window.showErrorMessage(`Validation failed: ${message}`);
78
+ }
79
+ }
80
+ );
81
+ }
82
+
83
+ interface ValidationIssue {
84
+ severity: 'error' | 'warning';
85
+ message: string;
86
+ line?: number;
87
+ }
88
+
89
+ /**
90
+ * Validate TypeScript/JavaScript MCP server
91
+ */
92
+ function validateTypeScriptMcp(content: string): ValidationIssue[] {
93
+ const issues: ValidationIssue[] = [];
94
+ const lines = content.split('\n');
95
+
96
+ // Check for MCP SDK import
97
+ if (!content.includes('@modelcontextprotocol/sdk')) {
98
+ issues.push({
99
+ severity: 'error',
100
+ message: 'Missing @modelcontextprotocol/sdk import'
101
+ });
102
+ }
103
+
104
+ // Check for Server instantiation
105
+ if (!content.includes('new Server(')) {
106
+ issues.push({
107
+ severity: 'error',
108
+ message: 'Missing Server instantiation'
109
+ });
110
+ }
111
+
112
+ // Check for ListToolsRequestSchema handler
113
+ if (!content.includes('ListToolsRequestSchema')) {
114
+ issues.push({
115
+ severity: 'warning',
116
+ message: 'Missing ListToolsRequestSchema handler - tools may not be listed'
117
+ });
118
+ }
119
+
120
+ // Check for CallToolRequestSchema handler
121
+ if (!content.includes('CallToolRequestSchema')) {
122
+ issues.push({
123
+ severity: 'warning',
124
+ message: 'Missing CallToolRequestSchema handler - tools may not be callable'
125
+ });
126
+ }
127
+
128
+ // Check for transport
129
+ if (!content.includes('StdioServerTransport') && !content.includes('transport')) {
130
+ issues.push({
131
+ severity: 'warning',
132
+ message: 'Missing transport configuration'
133
+ });
134
+ }
135
+
136
+ // Check for async function syntax errors (basic)
137
+ lines.forEach((line, index) => {
138
+ if (line.includes('async function') && !line.includes('{') && !lines[index + 1]?.includes('{')) {
139
+ issues.push({
140
+ severity: 'warning',
141
+ message: 'Async function may be missing body',
142
+ line: index + 1
143
+ });
144
+ }
145
+ });
146
+
147
+ return issues;
148
+ }
149
+
150
+ /**
151
+ * Validate Python MCP server
152
+ */
153
+ function validatePythonMcp(content: string): ValidationIssue[] {
154
+ const issues: ValidationIssue[] = [];
155
+
156
+ // Check for mcp import
157
+ if (!content.includes('from mcp') && !content.includes('import mcp')) {
158
+ issues.push({
159
+ severity: 'error',
160
+ message: 'Missing mcp module import'
161
+ });
162
+ }
163
+
164
+ // Check for Server instantiation
165
+ if (!content.includes('Server(')) {
166
+ issues.push({
167
+ severity: 'error',
168
+ message: 'Missing Server instantiation'
169
+ });
170
+ }
171
+
172
+ // Check for list_tools decorator
173
+ if (!content.includes('@server.list_tools') && !content.includes('list_tools')) {
174
+ issues.push({
175
+ severity: 'warning',
176
+ message: 'Missing list_tools handler'
177
+ });
178
+ }
179
+
180
+ // Check for call_tool decorator
181
+ if (!content.includes('@server.call_tool') && !content.includes('call_tool')) {
182
+ issues.push({
183
+ severity: 'warning',
184
+ message: 'Missing call_tool handler'
185
+ });
186
+ }
187
+
188
+ // Check for async main
189
+ if (!content.includes('async def main') && !content.includes('asyncio.run')) {
190
+ issues.push({
191
+ severity: 'warning',
192
+ message: 'Missing async main function or asyncio.run'
193
+ });
194
+ }
195
+
196
+ return issues;
197
+ }