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,208 @@
1
+ /**
2
+ * @fileoverview Registry updater for checking and updating entries
3
+ * @copyright Copyright (c) 2024-2026 nirholas
4
+ * @license Apache-2.0
5
+ */
6
+
7
+ import type {
8
+ RegistryEntry,
9
+ UpdateInfo,
10
+ StorageAdapter,
11
+ } from './types';
12
+
13
+ /**
14
+ * Options for the updater
15
+ */
16
+ export interface UpdaterOptions {
17
+ /** GitHub token for API requests */
18
+ githubToken?: string;
19
+ /** Whether to auto-update entries */
20
+ autoUpdate?: boolean;
21
+ /** Check interval in milliseconds */
22
+ checkInterval?: number;
23
+ }
24
+
25
+ /**
26
+ * Registry updater - checks for updates from source repos
27
+ */
28
+ export class RegistryUpdater {
29
+ private storage: StorageAdapter;
30
+ private options: UpdaterOptions;
31
+
32
+ constructor(storage: StorageAdapter, options: UpdaterOptions = {}) {
33
+ this.storage = storage;
34
+ this.options = options;
35
+ }
36
+
37
+ /**
38
+ * Check if an entry has updates available
39
+ */
40
+ async checkForUpdates(id: string): Promise<UpdateInfo | null> {
41
+ const entry = await this.storage.get(id);
42
+ if (!entry) return null;
43
+
44
+ try {
45
+ const latestVersion = await this.getLatestSourceVersion(entry.sourceRepo);
46
+
47
+ if (latestVersion && latestVersion !== entry.sourceVersion) {
48
+ return {
49
+ id: entry.id,
50
+ currentVersion: entry.version,
51
+ latestVersion: this.incrementVersion(entry.version),
52
+ changelog: `Updated from ${entry.sourceVersion} to ${latestVersion}`,
53
+ breaking: this.isBreakingUpdate(entry.sourceVersion, latestVersion),
54
+ };
55
+ }
56
+
57
+ return null;
58
+ } catch {
59
+ return null;
60
+ }
61
+ }
62
+
63
+ /**
64
+ * Check all entries for updates
65
+ */
66
+ async checkAllForUpdates(): Promise<UpdateInfo[]> {
67
+ const updates: UpdateInfo[] = [];
68
+ const result = await this.storage.list({ limit: 1000 });
69
+
70
+ for (const summary of result.entries) {
71
+ const update = await this.checkForUpdates(summary.id);
72
+ if (update) {
73
+ updates.push(update);
74
+ }
75
+ }
76
+
77
+ return updates;
78
+ }
79
+
80
+ /**
81
+ * Get the latest version/commit from source repo
82
+ */
83
+ private async getLatestSourceVersion(sourceRepo: string): Promise<string | null> {
84
+ const [owner, repo] = sourceRepo.split('/');
85
+ if (!owner || !repo) return null;
86
+
87
+ const headers: Record<string, string> = {
88
+ 'Accept': 'application/vnd.github.v3+json',
89
+ 'User-Agent': 'github-to-mcp-registry',
90
+ };
91
+
92
+ if (this.options.githubToken) {
93
+ headers['Authorization'] = `Bearer ${this.options.githubToken}`;
94
+ }
95
+
96
+ try {
97
+ // Try to get latest release first
98
+ const releaseResponse = await fetch(
99
+ `https://api.github.com/repos/${owner}/${repo}/releases/latest`,
100
+ { headers }
101
+ );
102
+
103
+ if (releaseResponse.ok) {
104
+ const release = await releaseResponse.json() as { tag_name: string };
105
+ return release.tag_name;
106
+ }
107
+
108
+ // Fall back to latest commit on default branch
109
+ const commitResponse = await fetch(
110
+ `https://api.github.com/repos/${owner}/${repo}/commits?per_page=1`,
111
+ { headers }
112
+ );
113
+
114
+ if (commitResponse.ok) {
115
+ const commits = await commitResponse.json() as Array<{ sha: string }>;
116
+ if (commits.length > 0) {
117
+ return commits[0].sha.substring(0, 7);
118
+ }
119
+ }
120
+
121
+ return null;
122
+ } catch {
123
+ return null;
124
+ }
125
+ }
126
+
127
+ /**
128
+ * Increment a semver version
129
+ */
130
+ private incrementVersion(version: string): string {
131
+ const parts = version.split('.');
132
+ if (parts.length === 3) {
133
+ const patch = parseInt(parts[2], 10) || 0;
134
+ return `${parts[0]}.${parts[1]}.${patch + 1}`;
135
+ }
136
+ return `${version}.1`;
137
+ }
138
+
139
+ /**
140
+ * Check if an update is a breaking change
141
+ * (Simple heuristic based on major version)
142
+ */
143
+ private isBreakingUpdate(oldVersion: string, newVersion: string): boolean {
144
+ const oldMajor = this.extractMajorVersion(oldVersion);
145
+ const newMajor = this.extractMajorVersion(newVersion);
146
+ return newMajor > oldMajor;
147
+ }
148
+
149
+ /**
150
+ * Extract major version number
151
+ */
152
+ private extractMajorVersion(version: string): number {
153
+ const match = version.match(/^v?(\d+)/);
154
+ return match ? parseInt(match[1], 10) : 0;
155
+ }
156
+
157
+ /**
158
+ * Update an entry from its source repo
159
+ * Requires the core generator to be available
160
+ */
161
+ async updateEntry(
162
+ id: string,
163
+ generator?: { generate: (url: string) => Promise<unknown> }
164
+ ): Promise<RegistryEntry | null> {
165
+ const entry = await this.storage.get(id);
166
+ if (!entry) return null;
167
+
168
+ if (!generator) {
169
+ console.warn('Generator not provided, cannot regenerate entry');
170
+ return null;
171
+ }
172
+
173
+ try {
174
+ // Regenerate from source
175
+ const result = await generator.generate(entry.sourceUrl) as {
176
+ tools: Array<{ name: string; description: string; source: { type: string }; inputSchema: { properties: object } }>;
177
+ generate: () => string;
178
+ generatePython?: () => string;
179
+ };
180
+
181
+ // Update entry
182
+ const updatedEntry: RegistryEntry = {
183
+ ...entry,
184
+ version: this.incrementVersion(entry.version),
185
+ sourceVersion: await this.getLatestSourceVersion(entry.sourceRepo) || entry.sourceVersion,
186
+ toolCount: result.tools.length,
187
+ tools: result.tools.map(t => ({
188
+ name: t.name,
189
+ description: t.description,
190
+ source: t.source.type,
191
+ paramCount: Object.keys(t.inputSchema?.properties || {}).length,
192
+ requiresAuth: entry.auth.length > 0,
193
+ })),
194
+ generatedCode: {
195
+ typescript: result.generate(),
196
+ python: result.generatePython?.(),
197
+ },
198
+ lastUpdated: new Date().toISOString(),
199
+ };
200
+
201
+ await this.storage.save(updatedEntry);
202
+ return updatedEntry;
203
+ } catch (error) {
204
+ console.error(`Failed to update entry ${id}:`, error);
205
+ return null;
206
+ }
207
+ }
208
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ "rootDir": "./src",
6
+ "resolveJsonModule": true
7
+ },
8
+ "include": ["src/**/*"],
9
+ "exclude": ["node_modules", "dist"]
10
+ }
@@ -0,0 +1,11 @@
1
+ import { defineConfig } from 'tsup';
2
+
3
+ export default defineConfig({
4
+ entry: ['src/index.ts'],
5
+ format: ['esm'],
6
+ dts: true,
7
+ sourcemap: true,
8
+ clean: true,
9
+ target: 'es2022',
10
+ outExtension: () => ({ js: '.mjs' }),
11
+ });
@@ -0,0 +1,3 @@
1
+ packages:
2
+ - "packages/*"
3
+ - "apps/*"
@@ -0,0 +1,16 @@
1
+ #!/bin/bash
2
+ # Build MkDocs and copy to Next.js public folder
3
+
4
+ set -e
5
+
6
+ echo "Building MkDocs documentation..."
7
+
8
+ # Install MkDocs dependencies
9
+ pip install -q -r mkdocs/requirements.txt
10
+
11
+ # Build MkDocs to static HTML
12
+ cd mkdocs
13
+ mkdocs build --site-dir ../apps/web/public/docs
14
+ cd ..
15
+
16
+ echo "✓ MkDocs built to apps/web/public/docs"
package/server.json ADDED
@@ -0,0 +1,9 @@
1
+ {
2
+ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
+ "name": "io.github.nirholas/github-to-mcp",
4
+ "version": "1.0.0",
5
+ "title": "GitHub to MCP Converter",
6
+ "description": "Convert any GitHub repo to MCP server - automatic tool generation API wrap",
7
+ "keywords": ["github", "mcp", "converter", "generator", "api", "tools"],
8
+ "repository": {"url": "https://github.com/nirholas/github-to-mcp", "source": "github"}
9
+ }
@@ -0,0 +1,60 @@
1
+ # Auto-generated Dockerfile for {{name}} MCP Server (Python)
2
+ # Generated by @nirholas/github-to-mcp
3
+
4
+ # Build stage
5
+ FROM python:3.11-slim AS builder
6
+
7
+ WORKDIR /app
8
+
9
+ # Install system dependencies
10
+ RUN apt-get update && apt-get install -y --no-install-recommends \
11
+ build-essential \
12
+ && rm -rf /var/lib/apt/lists/*
13
+
14
+ # Install Python dependencies
15
+ COPY requirements.txt ./
16
+ RUN pip install --no-cache-dir --user -r requirements.txt
17
+
18
+ # Production stage
19
+ FROM python:3.11-slim AS production
20
+
21
+ WORKDIR /app
22
+
23
+ # Create non-root user
24
+ RUN useradd -m -u 1001 mcpserver
25
+
26
+ # Copy Python packages from builder
27
+ COPY --from=builder /root/.local /home/mcpserver/.local
28
+
29
+ # Copy source code
30
+ COPY . .
31
+
32
+ # Change ownership
33
+ RUN chown -R mcpserver:mcpserver /app
34
+
35
+ LABEL org.opencontainers.image.title="{{name}}-mcp-server"
36
+ LABEL org.opencontainers.image.description="{{description}}"
37
+ LABEL org.opencontainers.image.source="https://github.com/{{repo}}"
38
+ LABEL maintainer="Generated by @nirholas/github-to-mcp"
39
+
40
+ # Set production environment
41
+ ENV PYTHONUNBUFFERED=1
42
+ ENV PYTHONDONTWRITEBYTECODE=1
43
+ ENV PATH=/home/mcpserver/.local/bin:$PATH
44
+ ENV PORT={{port}}
45
+
46
+ # Expose port
47
+ EXPOSE {{port}}
48
+
49
+ # Health check
50
+ HEALTHCHECK --interval=30s \
51
+ --timeout=10s \
52
+ --start-period=5s \
53
+ --retries=3 \
54
+ CMD python -c "import sys; sys.exit(0)"
55
+
56
+ # Switch to non-root user
57
+ USER mcpserver
58
+
59
+ # Start the MCP server
60
+ CMD ["python", "-m", "mcp_server"]
@@ -0,0 +1,60 @@
1
+ # Auto-generated Dockerfile for {{name}} MCP Server
2
+ # Generated by @nirholas/github-to-mcp
3
+
4
+ # Build stage
5
+ FROM node:20-alpine AS builder
6
+
7
+ WORKDIR /app
8
+
9
+ # Install dependencies
10
+ COPY package*.json ./
11
+ COPY pnpm-lock.yaml* ./
12
+
13
+ # Use pnpm if available, fallback to npm
14
+ RUN corepack enable pnpm 2>/dev/null || npm install -g pnpm
15
+ RUN pnpm install --frozen-lockfile || npm ci
16
+
17
+ # Copy source code
18
+ COPY . .
19
+
20
+ # Build TypeScript
21
+ RUN pnpm build || npm run build
22
+
23
+ # Production stage
24
+ FROM node:20-alpine AS production
25
+
26
+ WORKDIR /app
27
+
28
+ # Create non-root user
29
+ RUN addgroup -g 1001 -S nodejs && \
30
+ adduser -S mcpserver -u 1001
31
+
32
+ # Copy built files and dependencies
33
+ COPY --from=builder /app/dist ./dist
34
+ COPY --from=builder /app/node_modules ./node_modules
35
+ COPY --from=builder /app/package.json ./
36
+
37
+ LABEL org.opencontainers.image.title="{{name}}-mcp-server"
38
+ LABEL org.opencontainers.image.description="{{description}}"
39
+ LABEL org.opencontainers.image.source="https://github.com/{{repo}}"
40
+ LABEL maintainer="Generated by @nirholas/github-to-mcp"
41
+
42
+ # Set production environment
43
+ ENV NODE_ENV=production
44
+ ENV PORT={{port}}
45
+
46
+ # Expose port
47
+ EXPOSE {{port}}
48
+
49
+ # Health check
50
+ HEALTHCHECK --interval=30s \
51
+ --timeout=10s \
52
+ --start-period=5s \
53
+ --retries=3 \
54
+ CMD node -e "process.exit(0)"
55
+
56
+ # Switch to non-root user
57
+ USER mcpserver
58
+
59
+ # Start the MCP server
60
+ CMD ["node", "dist/index.js"]
@@ -0,0 +1,68 @@
1
+ # Auto-generated Docker Compose for {{name}} MCP Server
2
+ # Generated by @nirholas/github-to-mcp
3
+
4
+ version: '3.8'
5
+
6
+ services:
7
+ {{serviceName}}:
8
+ build:
9
+ context: .
10
+ dockerfile: Dockerfile
11
+ container_name: {{serviceName}}-mcp
12
+ restart: unless-stopped
13
+ ports:
14
+ - "{{port}}:{{port}}"
15
+ environment:
16
+ NODE_ENV: "production"
17
+ PORT: "{{port}}"
18
+ {{#if redisEnabled}}
19
+ REDIS_URL: "redis://redis:6379"
20
+ {{/if}}
21
+ {{#if volumes}}
22
+ volumes:
23
+ {{#each volumes}}
24
+ - {{this}}
25
+ {{/each}}
26
+ {{/if}}
27
+ {{#if dependsOn}}
28
+ depends_on:
29
+ {{#each dependsOn}}
30
+ - {{this}}
31
+ {{/each}}
32
+ {{/if}}
33
+ networks:
34
+ - mcp-network
35
+ healthcheck:
36
+ test: ["CMD", "node", "-e", "process.exit(0)"]
37
+ interval: 30s
38
+ timeout: 10s
39
+ retries: 3
40
+ start_period: 10s
41
+
42
+ {{#if redisEnabled}}
43
+ redis:
44
+ image: redis:7-alpine
45
+ container_name: {{serviceName}}-redis
46
+ restart: unless-stopped
47
+ ports:
48
+ - "6379:6379"
49
+ volumes:
50
+ - redis-data:/data
51
+ networks:
52
+ - mcp-network
53
+ healthcheck:
54
+ test: ["CMD", "redis-cli", "ping"]
55
+ interval: 10s
56
+ timeout: 5s
57
+ retries: 5
58
+ {{/if}}
59
+
60
+ networks:
61
+ mcp-network:
62
+ driver: bridge
63
+
64
+ volumes:
65
+ {{serviceName}}-data:
66
+ {{#if redisEnabled}}
67
+ redis-data:
68
+ {{/if}}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Sample Express.js application for testing
3
+ */
4
+ const express = require('express');
5
+ const app = express();
6
+ const usersRouter = require('./routes/users');
7
+ const postsRouter = require('./routes/posts');
8
+
9
+ app.use(express.json());
10
+
11
+ // API routes
12
+ app.use('/api', usersRouter);
13
+ app.use('/api', postsRouter);
14
+
15
+ /**
16
+ * Health check endpoint
17
+ * @tag System
18
+ */
19
+ app.get('/health', (req, res) => {
20
+ res.json({ status: 'ok' });
21
+ });
22
+
23
+ /**
24
+ * API info endpoint
25
+ * @tag System
26
+ */
27
+ app.get('/api/info', (req, res) => {
28
+ res.json({
29
+ name: 'Test API',
30
+ version: '1.0.0',
31
+ });
32
+ });
33
+
34
+ module.exports = app;
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Posts routes for testing
3
+ */
4
+ const express = require('express');
5
+ const router = express.Router();
6
+
7
+ /**
8
+ * Get all posts with pagination
9
+ * @tag Posts
10
+ * @param {number} req.query.page - Page number
11
+ * @param {number} req.query.limit - Items per page
12
+ */
13
+ router.get('/posts', (req, res) => {
14
+ const { page = 1, limit = 10 } = req.query;
15
+ res.json({ posts: [], page, limit, total: 0 });
16
+ });
17
+
18
+ /**
19
+ * Get post by ID
20
+ * @tag Posts
21
+ */
22
+ router.get('/posts/:postId', (req, res) => {
23
+ res.json({ id: req.params.postId, title: 'Test Post' });
24
+ });
25
+
26
+ /**
27
+ * Create post
28
+ * @tag Posts
29
+ */
30
+ router.post('/posts', (req, res) => {
31
+ res.status(201).json({ id: '456', ...req.body });
32
+ });
33
+
34
+ /**
35
+ * Get comments for a post
36
+ * @tag Posts
37
+ * @tag Comments
38
+ */
39
+ router.get('/posts/:postId/comments', (req, res) => {
40
+ res.json({ comments: [] });
41
+ });
42
+
43
+ module.exports = router;
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Sample Express.js application for testing
3
+ */
4
+ const express = require('express');
5
+ const router = express.Router();
6
+
7
+ /**
8
+ * Get all users
9
+ * @tag Users
10
+ * @returns {array} List of users
11
+ */
12
+ router.get('/users', (req, res) => {
13
+ const { limit, offset } = req.query;
14
+ res.json({ users: [], limit, offset });
15
+ });
16
+
17
+ /**
18
+ * Get user by ID
19
+ * @tag Users
20
+ * @param {string} req.params.id - User ID
21
+ * @returns {object} User object
22
+ */
23
+ router.get('/users/:id', (req, res) => {
24
+ const { id } = req.params;
25
+ res.json({ id, name: 'Test User' });
26
+ });
27
+
28
+ /**
29
+ * Create a new user
30
+ * @tag Users
31
+ * @body {object} User data
32
+ * @returns {object} Created user
33
+ */
34
+ router.post('/users', (req, res) => {
35
+ const userData = req.body;
36
+ res.status(201).json({ id: '123', ...userData });
37
+ });
38
+
39
+ /**
40
+ * Update user
41
+ * @tag Users
42
+ * @deprecated
43
+ */
44
+ router.put('/users/:id', (req, res) => {
45
+ const { id } = req.params;
46
+ const userData = req.body;
47
+ res.json({ id, ...userData });
48
+ });
49
+
50
+ /**
51
+ * Delete user
52
+ * @tag Users
53
+ */
54
+ router.delete('/users/:id', (req, res) => {
55
+ res.status(204).send();
56
+ });
57
+
58
+ module.exports = router;