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,529 @@
1
+ /**
2
+ * @fileoverview File generator for MCP server files in workspace
3
+ * @copyright Copyright (c) 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ import * as vscode from 'vscode';
8
+ import * as path from 'path';
9
+ import { ConversionResult } from './storage';
10
+
11
+ export interface GeneratedFiles {
12
+ serverFile: string;
13
+ packageJsonFile: string;
14
+ readmeFile: string;
15
+ configSnippet: string;
16
+ }
17
+
18
+ export interface GeneratorOptions {
19
+ outputDir?: string;
20
+ runtime?: 'node' | 'typescript' | 'python';
21
+ includeTypes?: boolean;
22
+ includeDocs?: boolean;
23
+ }
24
+
25
+ /**
26
+ * Generate MCP server files from conversion result
27
+ */
28
+ export async function generateMcpServerFiles(
29
+ result: ConversionResult,
30
+ options: GeneratorOptions = {}
31
+ ): Promise<GeneratedFiles> {
32
+ const serverName = result.repoName.replace('/', '-').toLowerCase();
33
+ const outputDir = options.outputDir || await selectOutputDirectory(serverName);
34
+
35
+ if (!outputDir) {
36
+ throw new Error('No output directory selected');
37
+ }
38
+
39
+ const serverDir = path.join(outputDir, `${serverName}-mcp`);
40
+
41
+ // Create directory
42
+ await vscode.workspace.fs.createDirectory(vscode.Uri.file(serverDir));
43
+
44
+ // Generate files based on runtime
45
+ const runtime = options.runtime || 'node';
46
+
47
+ let serverFile: string;
48
+ let packageJsonFile: string;
49
+ let readmeFile: string;
50
+
51
+ if (runtime === 'node' || runtime === 'typescript') {
52
+ serverFile = await generateNodeServer(result, serverDir, runtime === 'typescript');
53
+ packageJsonFile = await generatePackageJson(result, serverDir, runtime === 'typescript');
54
+ } else {
55
+ serverFile = await generatePythonServer(result, serverDir);
56
+ packageJsonFile = ''; // Python doesn't use package.json
57
+ await generatePythonRequirements(result, serverDir);
58
+ }
59
+
60
+ if (options.includeDocs !== false) {
61
+ readmeFile = await generateReadme(result, serverDir);
62
+ } else {
63
+ readmeFile = '';
64
+ }
65
+
66
+ // Generate config snippet
67
+ const configSnippet = generateConfigSnippet(serverName, serverFile);
68
+
69
+ // Open the main server file
70
+ const doc = await vscode.workspace.openTextDocument(vscode.Uri.file(serverFile));
71
+ await vscode.window.showTextDocument(doc);
72
+
73
+ return {
74
+ serverFile,
75
+ packageJsonFile,
76
+ readmeFile,
77
+ configSnippet
78
+ };
79
+ }
80
+
81
+ /**
82
+ * Generate Node.js MCP server file
83
+ */
84
+ async function generateNodeServer(
85
+ result: ConversionResult,
86
+ serverDir: string,
87
+ typescript: boolean
88
+ ): Promise<string> {
89
+ const ext = typescript ? 'ts' : 'js';
90
+ const serverPath = path.join(serverDir, `index.${ext}`);
91
+
92
+ // Use the generated code if available
93
+ let serverCode = result.code;
94
+
95
+ if (!serverCode) {
96
+ // Generate a basic template
97
+ serverCode = generateServerTemplate(result, typescript);
98
+ }
99
+
100
+ await vscode.workspace.fs.writeFile(
101
+ vscode.Uri.file(serverPath),
102
+ Buffer.from(serverCode, 'utf-8')
103
+ );
104
+
105
+ return serverPath;
106
+ }
107
+
108
+ /**
109
+ * Generate server template
110
+ */
111
+ function generateServerTemplate(result: ConversionResult, typescript: boolean): string {
112
+ const tools = result.tools || [];
113
+ const serverName = result.repoName.split('/')[1] || result.repoName;
114
+
115
+ const toolDefinitions = tools.map(tool => `
116
+ {
117
+ name: "${tool.name}",
118
+ description: "${escapeString(tool.description)}",
119
+ inputSchema: {
120
+ type: "object",
121
+ properties: {}
122
+ }
123
+ }`).join(',');
124
+
125
+ const toolHandlers = tools.map(tool => `
126
+ case "${tool.name}":
127
+ // TODO: Implement ${tool.name}
128
+ return {
129
+ content: [{ type: "text", text: "Tool ${tool.name} not yet implemented" }]
130
+ };`).join('\n');
131
+
132
+ if (typescript) {
133
+ return `/**
134
+ * MCP Server: ${serverName}
135
+ * Generated from ${result.repoUrl}
136
+ * Tools: ${result.toolCount}
137
+ */
138
+
139
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
140
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
141
+ import {
142
+ CallToolRequestSchema,
143
+ ListToolsRequestSchema,
144
+ } from "@modelcontextprotocol/sdk/types.js";
145
+
146
+ const server = new Server(
147
+ {
148
+ name: "${serverName}-mcp",
149
+ version: "1.0.0",
150
+ },
151
+ {
152
+ capabilities: {
153
+ tools: {},
154
+ },
155
+ }
156
+ );
157
+
158
+ // Tool definitions
159
+ const tools = [${toolDefinitions}
160
+ ];
161
+
162
+ // List available tools
163
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
164
+ return { tools };
165
+ });
166
+
167
+ // Handle tool calls
168
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
169
+ const { name, arguments: args } = request.params;
170
+
171
+ switch (name) {
172
+ ${toolHandlers}
173
+ default:
174
+ throw new Error(\`Unknown tool: \${name}\`);
175
+ }
176
+ });
177
+
178
+ // Start server
179
+ async function main() {
180
+ const transport = new StdioServerTransport();
181
+ await server.connect(transport);
182
+ console.error("${serverName} MCP server running on stdio");
183
+ }
184
+
185
+ main().catch(console.error);
186
+ `;
187
+ }
188
+
189
+ // JavaScript version
190
+ return `/**
191
+ * MCP Server: ${serverName}
192
+ * Generated from ${result.repoUrl}
193
+ * Tools: ${result.toolCount}
194
+ */
195
+
196
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
197
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
198
+
199
+ const server = new Server(
200
+ {
201
+ name: "${serverName}-mcp",
202
+ version: "1.0.0",
203
+ },
204
+ {
205
+ capabilities: {
206
+ tools: {},
207
+ },
208
+ }
209
+ );
210
+
211
+ // Tool definitions
212
+ const tools = [${toolDefinitions}
213
+ ];
214
+
215
+ // List available tools
216
+ server.setRequestHandler("tools/list", async () => {
217
+ return { tools };
218
+ });
219
+
220
+ // Handle tool calls
221
+ server.setRequestHandler("tools/call", async (request) => {
222
+ const { name, arguments: args } = request.params;
223
+
224
+ switch (name) {
225
+ ${toolHandlers}
226
+ default:
227
+ throw new Error(\`Unknown tool: \${name}\`);
228
+ }
229
+ });
230
+
231
+ // Start server
232
+ async function main() {
233
+ const transport = new StdioServerTransport();
234
+ await server.connect(transport);
235
+ console.error("${serverName} MCP server running on stdio");
236
+ }
237
+
238
+ main().catch(console.error);
239
+ `;
240
+ }
241
+
242
+ /**
243
+ * Generate Python MCP server file
244
+ */
245
+ async function generatePythonServer(
246
+ result: ConversionResult,
247
+ serverDir: string
248
+ ): Promise<string> {
249
+ const serverPath = path.join(serverDir, 'server.py');
250
+ const serverName = result.repoName.split('/')[1] || result.repoName;
251
+ const tools = result.tools || [];
252
+
253
+ const toolDefinitions = tools.map(tool => `
254
+ Tool(
255
+ name="${tool.name}",
256
+ description="${escapeString(tool.description)}",
257
+ inputSchema={"type": "object", "properties": {}}
258
+ )`).join(',');
259
+
260
+ const toolHandlers = tools.map(tool => `
261
+ elif name == "${tool.name}":
262
+ # TODO: Implement ${tool.name}
263
+ return [TextContent(type="text", text="Tool ${tool.name} not yet implemented")]`).join('');
264
+
265
+ const serverCode = `"""
266
+ MCP Server: ${serverName}
267
+ Generated from ${result.repoUrl}
268
+ Tools: ${result.toolCount}
269
+ """
270
+
271
+ import asyncio
272
+ from mcp.server import Server
273
+ from mcp.server.stdio import stdio_server
274
+ from mcp.types import Tool, TextContent
275
+
276
+ # Initialize server
277
+ app = Server("${serverName}-mcp")
278
+
279
+ # Tool definitions
280
+ TOOLS = [${toolDefinitions}
281
+ ]
282
+
283
+ @app.list_tools()
284
+ async def list_tools():
285
+ return TOOLS
286
+
287
+ @app.call_tool()
288
+ async def call_tool(name: str, arguments: dict):
289
+ if False:
290
+ pass${toolHandlers}
291
+ else:
292
+ raise ValueError(f"Unknown tool: {name}")
293
+
294
+ async def main():
295
+ async with stdio_server() as (read_stream, write_stream):
296
+ await app.run(read_stream, write_stream, app.create_initialization_options())
297
+
298
+ if __name__ == "__main__":
299
+ asyncio.run(main())
300
+ `;
301
+
302
+ await vscode.workspace.fs.writeFile(
303
+ vscode.Uri.file(serverPath),
304
+ Buffer.from(serverCode, 'utf-8')
305
+ );
306
+
307
+ return serverPath;
308
+ }
309
+
310
+ /**
311
+ * Generate package.json for Node.js server
312
+ */
313
+ async function generatePackageJson(
314
+ result: ConversionResult,
315
+ serverDir: string,
316
+ typescript: boolean
317
+ ): Promise<string> {
318
+ const packageJsonPath = path.join(serverDir, 'package.json');
319
+ const serverName = result.repoName.replace('/', '-').toLowerCase();
320
+
321
+ const packageJson = {
322
+ name: `${serverName}-mcp`,
323
+ version: '1.0.0',
324
+ description: `MCP server generated from ${result.repoName}`,
325
+ main: typescript ? 'dist/index.js' : 'index.js',
326
+ type: 'module',
327
+ scripts: {
328
+ ...(typescript ? {
329
+ build: 'tsc',
330
+ start: 'node dist/index.js',
331
+ dev: 'ts-node src/index.ts'
332
+ } : {
333
+ start: 'node index.js'
334
+ })
335
+ },
336
+ dependencies: {
337
+ '@modelcontextprotocol/sdk': '^0.5.0'
338
+ },
339
+ ...(typescript ? {
340
+ devDependencies: {
341
+ '@types/node': '^20.0.0',
342
+ 'typescript': '^5.0.0',
343
+ 'ts-node': '^10.0.0'
344
+ }
345
+ } : {})
346
+ };
347
+
348
+ await vscode.workspace.fs.writeFile(
349
+ vscode.Uri.file(packageJsonPath),
350
+ Buffer.from(JSON.stringify(packageJson, null, 2), 'utf-8')
351
+ );
352
+
353
+ return packageJsonPath;
354
+ }
355
+
356
+ /**
357
+ * Generate requirements.txt for Python server
358
+ */
359
+ async function generatePythonRequirements(
360
+ result: ConversionResult,
361
+ serverDir: string
362
+ ): Promise<string> {
363
+ const requirementsPath = path.join(serverDir, 'requirements.txt');
364
+
365
+ const requirements = `# MCP Server: ${result.repoName}
366
+ mcp>=0.5.0
367
+ `;
368
+
369
+ await vscode.workspace.fs.writeFile(
370
+ vscode.Uri.file(requirementsPath),
371
+ Buffer.from(requirements, 'utf-8')
372
+ );
373
+
374
+ return requirementsPath;
375
+ }
376
+
377
+ /**
378
+ * Generate README for the server
379
+ */
380
+ async function generateReadme(
381
+ result: ConversionResult,
382
+ serverDir: string
383
+ ): Promise<string> {
384
+ const readmePath = path.join(serverDir, 'README.md');
385
+ const serverName = result.repoName.split('/')[1] || result.repoName;
386
+
387
+ const toolsList = (result.tools || [])
388
+ .map(t => `- **${t.name}**: ${t.description}`)
389
+ .join('\n');
390
+
391
+ const readme = `# ${serverName} MCP Server
392
+
393
+ MCP server generated from [${result.repoName}](${result.repoUrl}).
394
+
395
+ ## Tools
396
+
397
+ ${toolsList || 'No tools defined.'}
398
+
399
+ ## Installation
400
+
401
+ \`\`\`bash
402
+ npm install
403
+ \`\`\`
404
+
405
+ ## Usage
406
+
407
+ ### With Claude Desktop
408
+
409
+ Add to your \`claude_desktop_config.json\`:
410
+
411
+ \`\`\`json
412
+ {
413
+ "mcpServers": {
414
+ "${serverName}": {
415
+ "command": "node",
416
+ "args": ["${serverDir}/index.js"]
417
+ }
418
+ }
419
+ }
420
+ \`\`\`
421
+
422
+ ### Standalone
423
+
424
+ \`\`\`bash
425
+ npm start
426
+ \`\`\`
427
+
428
+ ## Development
429
+
430
+ Generated on ${new Date().toISOString().split('T')[0]}.
431
+
432
+ ## License
433
+
434
+ MIT
435
+ `;
436
+
437
+ await vscode.workspace.fs.writeFile(
438
+ vscode.Uri.file(readmePath),
439
+ Buffer.from(readme, 'utf-8')
440
+ );
441
+
442
+ return readmePath;
443
+ }
444
+
445
+ /**
446
+ * Generate config snippet for clipboard
447
+ */
448
+ function generateConfigSnippet(serverName: string, serverPath: string): string {
449
+ return JSON.stringify({
450
+ mcpServers: {
451
+ [serverName]: {
452
+ command: 'node',
453
+ args: [serverPath]
454
+ }
455
+ }
456
+ }, null, 2);
457
+ }
458
+
459
+ /**
460
+ * Select output directory
461
+ */
462
+ async function selectOutputDirectory(suggestedName: string): Promise<string | null> {
463
+ const options: vscode.QuickPickItem[] = [];
464
+
465
+ // Add workspace folders
466
+ const workspaceFolders = vscode.workspace.workspaceFolders;
467
+ if (workspaceFolders) {
468
+ for (const folder of workspaceFolders) {
469
+ options.push({
470
+ label: `$(folder) ${folder.name}`,
471
+ description: folder.uri.fsPath,
472
+ detail: 'Create in workspace folder'
473
+ });
474
+ }
475
+ }
476
+
477
+ // Add home directory option
478
+ const homeDir = process.env.HOME || process.env.USERPROFILE || '';
479
+ options.push({
480
+ label: '$(home) Home Directory',
481
+ description: path.join(homeDir, '.mcp-servers'),
482
+ detail: 'Create in ~/.mcp-servers'
483
+ });
484
+
485
+ // Add custom option
486
+ options.push({
487
+ label: '$(folder-opened) Choose Location...',
488
+ description: '',
489
+ detail: 'Select a custom directory'
490
+ });
491
+
492
+ const selection = await vscode.window.showQuickPick(options, {
493
+ placeHolder: `Where should ${suggestedName} server be created?`,
494
+ title: 'Select Output Directory'
495
+ });
496
+
497
+ if (!selection) {
498
+ return null;
499
+ }
500
+
501
+ if (selection.label === '$(folder-opened) Choose Location...') {
502
+ const folders = await vscode.window.showOpenDialog({
503
+ canSelectFolders: true,
504
+ canSelectFiles: false,
505
+ canSelectMany: false,
506
+ title: 'Select output directory'
507
+ });
508
+
509
+ if (!folders || folders.length === 0) {
510
+ return null;
511
+ }
512
+
513
+ return folders[0].fsPath;
514
+ }
515
+
516
+ return selection.description || null;
517
+ }
518
+
519
+ /**
520
+ * Escape string for use in generated code
521
+ */
522
+ function escapeString(str: string): string {
523
+ return str
524
+ .replace(/\\/g, '\\\\')
525
+ .replace(/"/g, '\\"')
526
+ .replace(/\n/g, '\\n')
527
+ .replace(/\r/g, '\\r')
528
+ .replace(/\t/g, '\\t');
529
+ }