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,470 @@
1
+ /**
2
+ * @fileoverview Docker and Docker Compose file generator for MCP servers
3
+ * @copyright Copyright (c) 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ import type { GenerationResult, ExtractedTool, OutputLanguage } from './types';
8
+
9
+ export interface DockerOptions {
10
+ /** Base image for the Docker container */
11
+ baseImage?: string;
12
+ /** Port to expose */
13
+ port?: number;
14
+ /** Environment variables */
15
+ env?: Record<string, string>;
16
+ /** Additional labels */
17
+ labels?: Record<string, string>;
18
+ /** Health check configuration */
19
+ healthCheck?: {
20
+ interval?: string;
21
+ timeout?: string;
22
+ retries?: number;
23
+ startPeriod?: string;
24
+ };
25
+ }
26
+
27
+ export interface DockerComposeOptions extends DockerOptions {
28
+ /** Service name */
29
+ serviceName?: string;
30
+ /** Networks to connect to */
31
+ networks?: string[];
32
+ /** Volumes to mount */
33
+ volumes?: string[];
34
+ /** Depends on other services */
35
+ dependsOn?: string[];
36
+ /** Enable Redis cache service */
37
+ includeRedis?: boolean;
38
+ }
39
+
40
+ /**
41
+ * Docker file generator for MCP servers
42
+ */
43
+ export class DockerGenerator {
44
+ /**
45
+ * Generate a Dockerfile for the MCP server
46
+ */
47
+ generateDockerfile(result: GenerationResult, language?: OutputLanguage, options: DockerOptions = {}): string {
48
+ const outputLanguage = language || 'typescript';
49
+
50
+ if (outputLanguage === 'python') {
51
+ return this.generatePythonDockerfile(result, options);
52
+ }
53
+
54
+ return this.generateTypescriptDockerfile(result, options);
55
+ }
56
+
57
+ /**
58
+ * Generate TypeScript/Node.js Dockerfile
59
+ */
60
+ private generateTypescriptDockerfile(result: GenerationResult, options: DockerOptions): string {
61
+ const port = options.port || 3000;
62
+ const baseImage = options.baseImage || 'node:20-alpine';
63
+ const envVars = options.env || {};
64
+ const labels = options.labels || {};
65
+ const healthCheck = options.healthCheck || {};
66
+
67
+ const envLines = Object.entries(envVars)
68
+ .map(([key, value]) => `ENV ${key}="${value}"`)
69
+ .join('\n');
70
+
71
+ const labelLines = Object.entries({
72
+ 'org.opencontainers.image.title': `${result.name}-mcp-server`,
73
+ 'org.opencontainers.image.description': result.metadata.description || `MCP server for ${result.repo}`,
74
+ 'org.opencontainers.image.source': `https://github.com/${result.repo}`,
75
+ 'maintainer': 'Generated by @nirholas/github-to-mcp',
76
+ ...labels
77
+ }).map(([key, value]) => `LABEL ${key}="${value}"`).join('\n');
78
+
79
+ const healthCheckCmd = healthCheck.interval ? `
80
+ # Health check
81
+ HEALTHCHECK --interval=${healthCheck.interval || '30s'} \\
82
+ --timeout=${healthCheck.timeout || '10s'} \\
83
+ --start-period=${healthCheck.startPeriod || '5s'} \\
84
+ --retries=${healthCheck.retries || 3} \\
85
+ CMD node -e "process.exit(0)"
86
+ ` : '';
87
+
88
+ return `# Auto-generated Dockerfile for ${result.name} MCP Server
89
+ # Generated by @nirholas/github-to-mcp
90
+
91
+ # Build stage
92
+ FROM ${baseImage} AS builder
93
+
94
+ WORKDIR /app
95
+
96
+ # Install dependencies
97
+ COPY package*.json ./
98
+ COPY pnpm-lock.yaml* ./
99
+
100
+ # Use pnpm if available, fallback to npm
101
+ RUN corepack enable pnpm 2>/dev/null || npm install -g pnpm
102
+ RUN pnpm install --frozen-lockfile || npm ci
103
+
104
+ # Copy source code
105
+ COPY . .
106
+
107
+ # Build TypeScript
108
+ RUN pnpm build || npm run build
109
+
110
+ # Production stage
111
+ FROM ${baseImage} AS production
112
+
113
+ WORKDIR /app
114
+
115
+ # Create non-root user
116
+ RUN addgroup -g 1001 -S nodejs && \\
117
+ adduser -S mcpserver -u 1001
118
+
119
+ # Copy built files and dependencies
120
+ COPY --from=builder /app/dist ./dist
121
+ COPY --from=builder /app/node_modules ./node_modules
122
+ COPY --from=builder /app/package.json ./
123
+
124
+ ${labelLines}
125
+
126
+ ${envLines ? envLines + '\n' : ''}
127
+ # Set production environment
128
+ ENV NODE_ENV=production
129
+ ENV PORT=${port}
130
+
131
+ # Expose port
132
+ EXPOSE ${port}
133
+ ${healthCheckCmd}
134
+ # Switch to non-root user
135
+ USER mcpserver
136
+
137
+ # Start the MCP server
138
+ CMD ["node", "dist/index.js"]
139
+ `;
140
+ }
141
+
142
+ /**
143
+ * Generate Python Dockerfile
144
+ */
145
+ private generatePythonDockerfile(result: GenerationResult, options: DockerOptions): string {
146
+ const port = options.port || 8000;
147
+ const baseImage = options.baseImage || 'python:3.11-slim';
148
+ const envVars = options.env || {};
149
+ const labels = options.labels || {};
150
+ const healthCheck = options.healthCheck || {};
151
+
152
+ const envLines = Object.entries(envVars)
153
+ .map(([key, value]) => `ENV ${key}="${value}"`)
154
+ .join('\n');
155
+
156
+ const labelLines = Object.entries({
157
+ 'org.opencontainers.image.title': `${result.name}-mcp-server`,
158
+ 'org.opencontainers.image.description': result.metadata.description || `MCP server for ${result.repo}`,
159
+ 'org.opencontainers.image.source': `https://github.com/${result.repo}`,
160
+ 'maintainer': 'Generated by @nirholas/github-to-mcp',
161
+ ...labels
162
+ }).map(([key, value]) => `LABEL ${key}="${value}"`).join('\n');
163
+
164
+ const healthCheckCmd = healthCheck.interval ? `
165
+ # Health check
166
+ HEALTHCHECK --interval=${healthCheck.interval || '30s'} \\
167
+ --timeout=${healthCheck.timeout || '10s'} \\
168
+ --start-period=${healthCheck.startPeriod || '5s'} \\
169
+ --retries=${healthCheck.retries || 3} \\
170
+ CMD python -c "import sys; sys.exit(0)"
171
+ ` : '';
172
+
173
+ return `# Auto-generated Dockerfile for ${result.name} MCP Server (Python)
174
+ # Generated by @nirholas/github-to-mcp
175
+
176
+ # Build stage
177
+ FROM ${baseImage} AS builder
178
+
179
+ WORKDIR /app
180
+
181
+ # Install system dependencies
182
+ RUN apt-get update && apt-get install -y --no-install-recommends \\
183
+ build-essential \\
184
+ && rm -rf /var/lib/apt/lists/*
185
+
186
+ # Install Python dependencies
187
+ COPY requirements.txt ./
188
+ RUN pip install --no-cache-dir --user -r requirements.txt
189
+
190
+ # Production stage
191
+ FROM ${baseImage} AS production
192
+
193
+ WORKDIR /app
194
+
195
+ # Create non-root user
196
+ RUN useradd -m -u 1001 mcpserver
197
+
198
+ # Copy Python packages from builder
199
+ COPY --from=builder /root/.local /home/mcpserver/.local
200
+
201
+ # Copy source code
202
+ COPY . .
203
+
204
+ # Change ownership
205
+ RUN chown -R mcpserver:mcpserver /app
206
+
207
+ ${labelLines}
208
+
209
+ ${envLines ? envLines + '\n' : ''}
210
+ # Set production environment
211
+ ENV PYTHONUNBUFFERED=1
212
+ ENV PYTHONDONTWRITEBYTECODE=1
213
+ ENV PATH=/home/mcpserver/.local/bin:$PATH
214
+ ENV PORT=${port}
215
+
216
+ # Expose port
217
+ EXPOSE ${port}
218
+ ${healthCheckCmd}
219
+ # Switch to non-root user
220
+ USER mcpserver
221
+
222
+ # Start the MCP server
223
+ CMD ["python", "-m", "mcp_server"]
224
+ `;
225
+ }
226
+
227
+ /**
228
+ * Generate Docker Compose configuration
229
+ */
230
+ generateDockerCompose(result: GenerationResult, language?: OutputLanguage, options: DockerComposeOptions = {}): string {
231
+ const outputLanguage = language || 'typescript';
232
+ const serviceName = options.serviceName || this.sanitizeServiceName(result.name);
233
+ const port = options.port || (outputLanguage === 'python' ? 8000 : 3000);
234
+ const networks = options.networks || ['mcp-network'];
235
+ const volumes = options.volumes || [];
236
+ const dependsOn = options.dependsOn || [];
237
+ const envVars = options.env || {};
238
+ const includeRedis = options.includeRedis || false;
239
+
240
+ const envLines = Object.entries({
241
+ NODE_ENV: 'production',
242
+ ...envVars
243
+ }).map(([key, value]) => ` ${key}: "${value}"`).join('\n');
244
+
245
+ const volumeLines = volumes.length > 0
246
+ ? ` volumes:\n${volumes.map(v => ` - ${v}`).join('\n')}`
247
+ : '';
248
+
249
+ const dependsOnLines = dependsOn.length > 0 || includeRedis
250
+ ? ` depends_on:\n${[...dependsOn, ...(includeRedis ? ['redis'] : [])].map(d => ` - ${d}`).join('\n')}`
251
+ : '';
252
+
253
+ const networkLines = networks.length > 0
254
+ ? ` networks:\n${networks.map(n => ` - ${n}`).join('\n')}`
255
+ : '';
256
+
257
+ const redisService = includeRedis ? `
258
+ redis:
259
+ image: redis:7-alpine
260
+ restart: unless-stopped
261
+ ports:
262
+ - "6379:6379"
263
+ volumes:
264
+ - redis-data:/data
265
+ networks:
266
+ - ${networks[0] || 'mcp-network'}
267
+ healthcheck:
268
+ test: ["CMD", "redis-cli", "ping"]
269
+ interval: 10s
270
+ timeout: 5s
271
+ retries: 5
272
+ ` : '';
273
+
274
+ const redisVolume = includeRedis ? '\n redis-data:' : '';
275
+
276
+ return `# Auto-generated Docker Compose for ${result.name} MCP Server
277
+ # Generated by @nirholas/github-to-mcp
278
+
279
+ version: '3.8'
280
+
281
+ services:
282
+ ${serviceName}:
283
+ build:
284
+ context: .
285
+ dockerfile: Dockerfile
286
+ container_name: ${serviceName}-mcp
287
+ restart: unless-stopped
288
+ ports:
289
+ - "${port}:${port}"
290
+ environment:
291
+ ${envLines}${includeRedis ? '\n REDIS_URL: "redis://redis:6379"' : ''}
292
+ ${volumeLines}
293
+ ${dependsOnLines}
294
+ ${networkLines}
295
+ healthcheck:
296
+ test: ["CMD", "${outputLanguage === 'python' ? 'python' : 'node'}", "-e", "${outputLanguage === 'python' ? 'import sys; sys.exit(0)' : 'process.exit(0)'}"]
297
+ interval: 30s
298
+ timeout: 10s
299
+ retries: 3
300
+ start_period: 10s
301
+ ${redisService}
302
+ networks:
303
+ ${networks[0] || 'mcp-network'}:
304
+ driver: bridge
305
+
306
+ volumes:
307
+ ${serviceName}-data:${redisVolume}
308
+ `;
309
+ }
310
+
311
+ /**
312
+ * Generate a multi-service Docker Compose with additional infrastructure
313
+ */
314
+ generateDockerComposeWithInfra(
315
+ result: GenerationResult,
316
+ language?: OutputLanguage,
317
+ options: DockerComposeOptions & { includeTraefik?: boolean; includePrometheus?: boolean } = {}
318
+ ): string {
319
+ const baseCompose = this.generateDockerCompose(result, language, { ...options, includeRedis: true });
320
+
321
+ const serviceName = options.serviceName || this.sanitizeServiceName(result.name);
322
+ const networks = options.networks || ['mcp-network'];
323
+
324
+ let additionalServices = '';
325
+
326
+ if (options.includeTraefik) {
327
+ additionalServices += `
328
+ traefik:
329
+ image: traefik:v2.10
330
+ container_name: traefik
331
+ restart: unless-stopped
332
+ command:
333
+ - "--api.insecure=true"
334
+ - "--providers.docker=true"
335
+ - "--providers.docker.exposedbydefault=false"
336
+ - "--entrypoints.web.address=:80"
337
+ ports:
338
+ - "80:80"
339
+ - "8080:8080"
340
+ volumes:
341
+ - /var/run/docker.sock:/var/run/docker.sock:ro
342
+ networks:
343
+ - ${networks[0] || 'mcp-network'}
344
+ `;
345
+ }
346
+
347
+ if (options.includePrometheus) {
348
+ additionalServices += `
349
+ prometheus:
350
+ image: prom/prometheus:latest
351
+ container_name: prometheus
352
+ restart: unless-stopped
353
+ ports:
354
+ - "9090:9090"
355
+ volumes:
356
+ - ./prometheus.yml:/etc/prometheus/prometheus.yml
357
+ - prometheus-data:/prometheus
358
+ networks:
359
+ - ${networks[0] || 'mcp-network'}
360
+ `;
361
+ }
362
+
363
+ // Insert additional services before networks section
364
+ if (additionalServices) {
365
+ const networkIndex = baseCompose.indexOf('\nnetworks:');
366
+ const volumeSection = options.includePrometheus ? '\n prometheus-data:' : '';
367
+
368
+ return baseCompose.slice(0, networkIndex) +
369
+ additionalServices +
370
+ baseCompose.slice(networkIndex).replace(/^(volumes:[\s\S]*?)$/m, `$1${volumeSection}`);
371
+ }
372
+
373
+ return baseCompose;
374
+ }
375
+
376
+ /**
377
+ * Generate .dockerignore file
378
+ */
379
+ generateDockerIgnore(): string {
380
+ return `# Auto-generated .dockerignore
381
+ # Generated by @nirholas/github-to-mcp
382
+
383
+ # Dependencies
384
+ node_modules/
385
+ .pnp
386
+ .pnp.js
387
+
388
+ # Testing
389
+ coverage/
390
+ .nyc_output/
391
+
392
+ # Build outputs (except dist)
393
+ *.tsbuildinfo
394
+
395
+ # Environment files
396
+ .env
397
+ .env.local
398
+ .env.*.local
399
+
400
+ # IDE
401
+ .idea/
402
+ .vscode/
403
+ *.swp
404
+ *.swo
405
+
406
+ # OS
407
+ .DS_Store
408
+ Thumbs.db
409
+
410
+ # Git
411
+ .git/
412
+ .gitignore
413
+
414
+ # Documentation
415
+ docs/
416
+ *.md
417
+ !README.md
418
+
419
+ # Tests
420
+ **/*.test.ts
421
+ **/*.spec.ts
422
+ **/__tests__/
423
+
424
+ # Misc
425
+ *.log
426
+ npm-debug.log*
427
+ yarn-debug.log*
428
+ yarn-error.log*
429
+ .cache/
430
+ tmp/
431
+ `;
432
+ }
433
+
434
+ /**
435
+ * Generate requirements.txt for Python projects
436
+ */
437
+ generateRequirementsTxt(result: GenerationResult): string {
438
+ return `# Auto-generated requirements.txt for ${result.name} MCP Server
439
+ # Generated by @nirholas/github-to-mcp
440
+
441
+ mcp>=1.0.0
442
+ httpx>=0.25.0
443
+ pydantic>=2.0.0
444
+ python-dotenv>=1.0.0
445
+ `;
446
+ }
447
+
448
+ /**
449
+ * Sanitize service name for Docker Compose
450
+ */
451
+ private sanitizeServiceName(name: string): string {
452
+ return name
453
+ .toLowerCase()
454
+ .replace(/[^a-z0-9-]/g, '-')
455
+ .replace(/--+/g, '-')
456
+ .replace(/^-|-$/g, '');
457
+ }
458
+ }
459
+
460
+ // Export singleton instance
461
+ export const dockerGenerator = new DockerGenerator();
462
+
463
+ // Export function for convenience
464
+ export function generateDockerfile(result: GenerationResult, language?: OutputLanguage, options?: DockerOptions): string {
465
+ return dockerGenerator.generateDockerfile(result, language, options);
466
+ }
467
+
468
+ export function generateDockerCompose(result: GenerationResult, language?: OutputLanguage, options?: DockerComposeOptions): string {
469
+ return dockerGenerator.generateDockerCompose(result, language, options);
470
+ }