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,570 @@
1
+ /**
2
+ * @fileoverview generator module implementation
3
+ * @copyright Copyright (c) 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ import Handlebars from 'handlebars';
8
+ import type { McpToolDefinition } from './transformer.js';
9
+ import type { OpenAPIV3 } from 'openapi-types';
10
+
11
+ export interface GeneratorOptions {
12
+ format: 'typescript' | 'javascript' | 'json';
13
+ serverName: string;
14
+ serverVersion: string;
15
+ baseUrl: string;
16
+ auth?: {
17
+ type: 'bearer' | 'basic' | 'apiKey' | 'oauth';
18
+ envVar?: string;
19
+ header?: string;
20
+ };
21
+ features?: {
22
+ pagination?: boolean;
23
+ retry?: boolean;
24
+ cache?: boolean;
25
+ validation?: boolean;
26
+ types?: boolean;
27
+ };
28
+ }
29
+
30
+ /**
31
+ * Generates MCP server code from tool definitions
32
+ */
33
+ export class CodeGenerator {
34
+ private templates: Map<string, HandlebarsTemplateDelegate> = new Map();
35
+
36
+ constructor(private options: GeneratorOptions) {
37
+ this.initializeTemplates();
38
+ }
39
+
40
+ /**
41
+ * Initialize Handlebars templates
42
+ */
43
+ private initializeTemplates() {
44
+ // Server template
45
+ const serverTemplate = `
46
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
47
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
48
+ import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
49
+ {{#if features.cache}}
50
+ import { Cache } from './utils/cache.js';
51
+ {{/if}}
52
+ {{#if features.retry}}
53
+ import { retryWithBackoff } from './utils/retry.js';
54
+ {{/if}}
55
+
56
+ // Import all tool handlers
57
+ {{#each toolGroups}}
58
+ import * as {{this.name}}Tools from './tools/{{this.name}}.js';
59
+ {{/each}}
60
+
61
+ const server = new Server(
62
+ {
63
+ name: '{{serverName}}',
64
+ version: '{{serverVersion}}',
65
+ },
66
+ {
67
+ capabilities: {
68
+ tools: {},
69
+ },
70
+ }
71
+ );
72
+
73
+ // Collect all tools
74
+ const allTools = [
75
+ {{#each toolGroups}}
76
+ ...Object.values({{this.name}}Tools),
77
+ {{/each}}
78
+ ];
79
+
80
+ // List tools handler
81
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
82
+ return {
83
+ tools: allTools.map(tool => ({
84
+ name: tool.name,
85
+ description: tool.description,
86
+ inputSchema: tool.inputSchema,
87
+ })),
88
+ };
89
+ });
90
+
91
+ // Call tool handler
92
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
93
+ const { name, arguments: args } = request.params;
94
+
95
+ const tool = allTools.find(t => t.name === name);
96
+ if (!tool) {
97
+ throw new Error(\`Unknown tool: \${name}\`);
98
+ }
99
+
100
+ {{#if features.validation}}
101
+ // Validate inputs (using Zod or JSON Schema)
102
+ // ... validation logic
103
+ {{/if}}
104
+
105
+ try {
106
+ const result = await tool.handler(args || {});
107
+ return {
108
+ content: [
109
+ {
110
+ type: 'text',
111
+ text: JSON.stringify(result, null, 2),
112
+ },
113
+ ],
114
+ };
115
+ } catch (error) {
116
+ return {
117
+ content: [
118
+ {
119
+ type: 'text',
120
+ text: \`Error: \${error instanceof Error ? error.message : 'Unknown error'}\`,
121
+ },
122
+ ],
123
+ isError: true,
124
+ };
125
+ }
126
+ });
127
+
128
+ // Start server
129
+ async function main() {
130
+ const transport = new StdioServerTransport();
131
+ await server.connect(transport);
132
+ console.error('{{serverName}} MCP server running on stdio');
133
+ }
134
+
135
+ main().catch(console.error);
136
+ `;
137
+
138
+ // Tool template
139
+ const toolTemplate = `
140
+ {{#if features.cache}}
141
+ const cache = new Cache({ ttl: 300000 }); // 5 minutes
142
+ {{/if}}
143
+
144
+ /**
145
+ * {{description}}
146
+ * @endpoint {{metadata.endpoint.method}} {{metadata.endpoint.path}}
147
+ {{#if metadata.deprecated}}
148
+ * @deprecated
149
+ {{/if}}
150
+ */
151
+ export const {{name}} = {
152
+ name: '{{name}}',
153
+ description: '{{description}}',
154
+ inputSchema: {{{json inputSchema}}},
155
+
156
+ handler: async (args: any) => {
157
+ {{#if features.cache}}
158
+ {{#if isGetMethod}}
159
+ // Check cache for GET requests
160
+ const cacheKey = '{{name}}:' + JSON.stringify(args);
161
+ const cached = cache.get(cacheKey);
162
+ if (cached) {
163
+ return cached;
164
+ }
165
+ {{/if}}
166
+ {{/if}}
167
+
168
+ // Build URL
169
+ let url = '{{baseUrl}}{{metadata.endpoint.path}}';
170
+
171
+ {{#if hasPathParams}}
172
+ // Replace path parameters
173
+ {{#each pathParams}}
174
+ url = url.replace('{{{this.name}}}', encodeURIComponent(args.{{this.name}}));
175
+ {{/each}}
176
+ {{/if}}
177
+
178
+ {{#if hasQueryParams}}
179
+ // Add query parameters
180
+ const queryParams = new URLSearchParams();
181
+ {{#each queryParams}}
182
+ if (args.{{this.name}} !== undefined) {
183
+ queryParams.append('{{this.name}}', String(args.{{this.name}}));
184
+ }
185
+ {{/each}}
186
+ const queryString = queryParams.toString();
187
+ if (queryString) {
188
+ url += '?' + queryString;
189
+ }
190
+ {{/if}}
191
+
192
+ // Build headers
193
+ const headers: Record<string, string> = {
194
+ 'Content-Type': 'application/json',
195
+ {{#if auth}}
196
+ {{#if (eq auth.type 'bearer')}}
197
+ 'Authorization': \`Bearer \${process.env.{{auth.envVar}} || ''}\`,
198
+ {{/if}}
199
+ {{#if (eq auth.type 'apiKey')}}
200
+ '{{auth.header}}': process.env.{{auth.envVar}} || '',
201
+ {{/if}}
202
+ {{/if}}
203
+ };
204
+
205
+ {{#if hasHeaderParams}}
206
+ // Add custom headers
207
+ {{#each headerParams}}
208
+ if (args.{{this.name}} !== undefined) {
209
+ headers['{{this.name}}'] = String(args.{{this.name}});
210
+ }
211
+ {{/each}}
212
+ {{/if}}
213
+
214
+ // Build request options
215
+ const options: RequestInit = {
216
+ method: '{{metadata.endpoint.method}}',
217
+ headers,
218
+ {{#if hasBody}}
219
+ body: JSON.stringify(args.body || args),
220
+ {{/if}}
221
+ };
222
+
223
+ {{#if features.retry}}
224
+ // Execute with retry
225
+ const executeRequest = async () => {
226
+ const response = await fetch(url, options);
227
+
228
+ if (!response.ok) {
229
+ const error = await response.text();
230
+ throw new Error(\`HTTP \${response.status}: \${error}\`);
231
+ }
232
+
233
+ return await response.json();
234
+ };
235
+
236
+ const result = await retryWithBackoff(executeRequest, {
237
+ maxRetries: 3,
238
+ baseDelay: 1000,
239
+ });
240
+ {{else}}
241
+ // Execute request
242
+ const response = await fetch(url, options);
243
+
244
+ if (!response.ok) {
245
+ const error = await response.text();
246
+ throw new Error(\`HTTP \${response.status}: \${error}\`);
247
+ }
248
+
249
+ const result = await response.json();
250
+ {{/if}}
251
+
252
+ {{#if features.cache}}
253
+ {{#if isGetMethod}}
254
+ // Cache result for GET requests
255
+ cache.set(cacheKey, result);
256
+ {{/if}}
257
+ {{/if}}
258
+
259
+ {{#if metadata.pagination}}
260
+ // Handle pagination - automatically fetches all pages
261
+ let allResults = Array.isArray(result) ? result : [result];
262
+ let nextPageUrl = result.next || result.nextPage || result._links?.next?.href;
263
+ let pageCount = 1;
264
+ const maxPages = 100; // Safety limit
265
+
266
+ while (nextPageUrl && pageCount < maxPages) {
267
+ const pageResponse = await fetch(nextPageUrl, options);
268
+ if (!pageResponse.ok) break;
269
+
270
+ const pageResult = await pageResponse.json();
271
+ const pageData = Array.isArray(pageResult)
272
+ ? pageResult
273
+ : (pageResult.data || pageResult.items || pageResult.results || []);
274
+
275
+ allResults = allResults.concat(pageData);
276
+ nextPageUrl = pageResult.next || pageResult.nextPage || pageResult._links?.next?.href;
277
+ pageCount++;
278
+ }
279
+
280
+ return { data: allResults, totalPages: pageCount };
281
+ {{/if}}
282
+
283
+ return result;
284
+ }
285
+ };
286
+ `;
287
+
288
+ this.templates.set('server', Handlebars.compile(serverTemplate));
289
+ this.templates.set('tool', Handlebars.compile(toolTemplate));
290
+
291
+ // Register Handlebars helpers
292
+ Handlebars.registerHelper('json', (context) => JSON.stringify(context, null, 2));
293
+ Handlebars.registerHelper('eq', (a, b) => a === b);
294
+ }
295
+
296
+ /**
297
+ * Generate complete MCP server
298
+ */
299
+ generateServer(
300
+ tools: McpToolDefinition[],
301
+ toolGroups: Map<string, McpToolDefinition[]>
302
+ ): Map<string, string> {
303
+ const files = new Map<string, string>();
304
+
305
+ // Generate main server file
306
+ const serverTemplate = this.templates.get('server')!;
307
+ const serverCode = serverTemplate({
308
+ serverName: this.options.serverName,
309
+ serverVersion: this.options.serverVersion,
310
+ features: this.options.features,
311
+ toolGroups: Array.from(toolGroups.entries()).map(([name, tools]) => ({
312
+ name,
313
+ count: tools.length,
314
+ })),
315
+ });
316
+ files.set('index.ts', serverCode);
317
+
318
+ // Generate tool files (grouped)
319
+ for (const [groupName, groupTools] of toolGroups.entries()) {
320
+ const toolsCode = this.generateToolsFile(groupTools);
321
+ files.set(`tools/${groupName}.ts`, toolsCode);
322
+ }
323
+
324
+ // Generate utility files
325
+ if (this.options.features?.cache) {
326
+ files.set('utils/cache.ts', this.generateCacheUtil());
327
+ }
328
+ if (this.options.features?.retry) {
329
+ files.set('utils/retry.ts', this.generateRetryUtil());
330
+ }
331
+
332
+ // Generate package.json
333
+ files.set('package.json', this.generatePackageJson());
334
+
335
+ // Generate tsconfig.json
336
+ if (this.options.format === 'typescript') {
337
+ files.set('tsconfig.json', this.generateTsConfig());
338
+ }
339
+
340
+ // Generate README.md
341
+ files.set('README.md', this.generateReadme(tools));
342
+
343
+ return files;
344
+ }
345
+
346
+ /**
347
+ * Generate tools file for a group
348
+ */
349
+ private generateToolsFile(tools: McpToolDefinition[]): string {
350
+ const toolTemplate = this.templates.get('tool')!;
351
+ const toolsCode = tools.map(tool => {
352
+ return toolTemplate({
353
+ ...tool,
354
+ baseUrl: this.options.baseUrl,
355
+ auth: this.options.auth,
356
+ features: this.options.features,
357
+ isGetMethod: tool.metadata.endpoint.method === 'GET',
358
+ hasPathParams: this.hasPathParams(tool),
359
+ hasQueryParams: this.hasQueryParams(tool),
360
+ hasHeaderParams: this.hasHeaderParams(tool),
361
+ hasBody: this.hasBody(tool),
362
+ pathParams: this.getPathParams(tool),
363
+ queryParams: this.getQueryParams(tool),
364
+ headerParams: this.getHeaderParams(tool),
365
+ });
366
+ });
367
+
368
+ return toolsCode.join('\n\n');
369
+ }
370
+
371
+ /**
372
+ * Check if tool has path parameters
373
+ */
374
+ private hasPathParams(tool: McpToolDefinition): boolean {
375
+ return tool.metadata.endpoint.path.includes('{');
376
+ }
377
+
378
+ /**
379
+ * Check if tool has query parameters
380
+ */
381
+ private hasQueryParams(tool: McpToolDefinition): boolean {
382
+ return Object.keys(tool.inputSchema.properties || {}).some(
383
+ key => !tool.metadata.endpoint.path.includes(`{${key}}`)
384
+ );
385
+ }
386
+
387
+ /**
388
+ * Check if tool has header parameters
389
+ */
390
+ private hasHeaderParams(tool: McpToolDefinition): boolean {
391
+ // Simplified - would need to track parameter locations
392
+ return false;
393
+ }
394
+
395
+ /**
396
+ * Check if tool has body
397
+ */
398
+ private hasBody(tool: McpToolDefinition): boolean {
399
+ return ['POST', 'PUT', 'PATCH'].includes(tool.metadata.endpoint.method);
400
+ }
401
+
402
+ /**
403
+ * Get path parameters
404
+ */
405
+ private getPathParams(tool: McpToolDefinition): Array<{ name: string }> {
406
+ const matches = tool.metadata.endpoint.path.matchAll(/\{([^}]+)\}/g);
407
+ return Array.from(matches).map(m => ({ name: m[1] }));
408
+ }
409
+
410
+ /**
411
+ * Get query parameters
412
+ */
413
+ private getQueryParams(tool: McpToolDefinition): Array<{ name: string }> {
414
+ const pathParams = new Set(this.getPathParams(tool).map(p => p.name));
415
+ return Object.keys(tool.inputSchema.properties || {})
416
+ .filter(key => !pathParams.has(key) && key !== 'body')
417
+ .map(name => ({ name }));
418
+ }
419
+
420
+ /**
421
+ * Get header parameters
422
+ */
423
+ private getHeaderParams(tool: McpToolDefinition): Array<{ name: string }> {
424
+ return [];
425
+ }
426
+
427
+ /**
428
+ * Generate cache utility
429
+ */
430
+ private generateCacheUtil(): string {
431
+ return `
432
+ export class Cache {
433
+ private store: Map<string, { data: any; timestamp: number }> = new Map();
434
+ private ttl: number;
435
+
436
+ constructor(options: { ttl: number }) {
437
+ this.ttl = options.ttl;
438
+ }
439
+
440
+ get(key: string): any | null {
441
+ const cached = this.store.get(key);
442
+ if (!cached) return null;
443
+
444
+ if (Date.now() - cached.timestamp > this.ttl) {
445
+ this.store.delete(key);
446
+ return null;
447
+ }
448
+
449
+ return cached.data;
450
+ }
451
+
452
+ set(key: string, data: any): void {
453
+ this.store.set(key, { data, timestamp: Date.now() });
454
+ }
455
+
456
+ clear(): void {
457
+ this.store.clear();
458
+ }
459
+ }
460
+ `;
461
+ }
462
+
463
+ /**
464
+ * Generate retry utility
465
+ */
466
+ private generateRetryUtil(): string {
467
+ return `
468
+ export async function retryWithBackoff<T>(
469
+ fn: () => Promise<T>,
470
+ options: {
471
+ maxRetries: number;
472
+ baseDelay: number;
473
+ }
474
+ ): Promise<T> {
475
+ let lastError: Error | null = null;
476
+
477
+ for (let i = 0; i <= options.maxRetries; i++) {
478
+ try {
479
+ return await fn();
480
+ } catch (error) {
481
+ lastError = error as Error;
482
+
483
+ if (i < options.maxRetries) {
484
+ const delay = options.baseDelay * Math.pow(2, i);
485
+ await new Promise(resolve => setTimeout(resolve, delay));
486
+ }
487
+ }
488
+ }
489
+
490
+ throw lastError;
491
+ }
492
+ `;
493
+ }
494
+
495
+ /**
496
+ * Generate package.json
497
+ */
498
+ private generatePackageJson(): string {
499
+ return JSON.stringify({
500
+ name: this.options.serverName.toLowerCase().replace(/\s+/g, '-'),
501
+ version: this.options.serverVersion,
502
+ type: 'module',
503
+ main: './dist/index.js',
504
+ scripts: {
505
+ build: 'tsc',
506
+ start: 'node dist/index.js',
507
+ dev: 'tsx src/index.ts',
508
+ },
509
+ dependencies: {
510
+ '@modelcontextprotocol/sdk': '^1.0.0',
511
+ },
512
+ devDependencies: {
513
+ '@types/node': '^20.10.0',
514
+ typescript: '^5.3.3',
515
+ tsx: '^4.7.0',
516
+ },
517
+ }, null, 2);
518
+ }
519
+
520
+ /**
521
+ * Generate tsconfig.json
522
+ */
523
+ private generateTsConfig(): string {
524
+ return JSON.stringify({
525
+ compilerOptions: {
526
+ target: 'ES2022',
527
+ module: 'ES2022',
528
+ moduleResolution: 'node',
529
+ outDir: './dist',
530
+ rootDir: './src',
531
+ strict: true,
532
+ esModuleInterop: true,
533
+ skipLibCheck: true,
534
+ forceConsistentCasingInFileNames: true,
535
+ },
536
+ include: ['src/**/*'],
537
+ exclude: ['node_modules', 'dist'],
538
+ }, null, 2);
539
+ }
540
+
541
+ /**
542
+ * Generate README
543
+ */
544
+ private generateReadme(tools: McpToolDefinition[]): string {
545
+ const toolsByGroup = new Map<string, McpToolDefinition[]>();
546
+
547
+ for (const tool of tools) {
548
+ const group = tool.metadata.tags?.[0] || 'default';
549
+ if (!toolsByGroup.has(group)) {
550
+ toolsByGroup.set(group, []);
551
+ }
552
+ toolsByGroup.get(group)!.push(tool);
553
+ }
554
+
555
+ let readme = `# ${this.options.serverName}\n\n`;
556
+ readme += `Auto-generated MCP server with ${tools.length} tools.\n\n`;
557
+ readme += `## Installation\n\n\`\`\`bash\nnpm install\nnpm run build\nnpm start\n\`\`\`\n\n`;
558
+ readme += `## Tools\n\n`;
559
+
560
+ for (const [group, groupTools] of toolsByGroup.entries()) {
561
+ readme += `### ${group} (${groupTools.length} tools)\n\n`;
562
+ for (const tool of groupTools) {
563
+ readme += `- **${tool.name}**: ${tool.description}\n`;
564
+ }
565
+ readme += `\n`;
566
+ }
567
+
568
+ return readme;
569
+ }
570
+ }