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,334 @@
1
+ /**
2
+ * @fileoverview File-based storage adapter for registry
3
+ * @copyright Copyright (c) 2024-2026 nirholas
4
+ * @license Apache-2.0
5
+ */
6
+
7
+ import * as fs from 'fs/promises';
8
+ import * as path from 'path';
9
+ import type {
10
+ StorageAdapter,
11
+ RegistryEntry,
12
+ RegistryEntrySummary,
13
+ ListOptions,
14
+ ListResult,
15
+ } from './types';
16
+
17
+ /**
18
+ * File-based storage for registry entries
19
+ * Stores entries as JSON files in a directory structure
20
+ */
21
+ export class FileStorage implements StorageAdapter {
22
+ private dataDir: string;
23
+ private indexCache: Map<string, RegistryEntrySummary> | null = null;
24
+ private indexCacheTime: number = 0;
25
+ private readonly INDEX_CACHE_TTL = 60000; // 1 minute
26
+
27
+ constructor(dataDir?: string) {
28
+ // Default to bundled data directory
29
+ this.dataDir = dataDir || path.join(import.meta.dirname || __dirname, '..', 'data', 'entries');
30
+ }
31
+
32
+ /**
33
+ * Ensure the data directory exists
34
+ */
35
+ private async ensureDir(): Promise<void> {
36
+ try {
37
+ await fs.mkdir(this.dataDir, { recursive: true });
38
+ } catch {
39
+ // Directory may already exist
40
+ }
41
+ }
42
+
43
+ /**
44
+ * Get path to entry file
45
+ */
46
+ private getEntryPath(id: string): string {
47
+ return path.join(this.dataDir, `${id}.json`);
48
+ }
49
+
50
+ /**
51
+ * Build index of all entries
52
+ */
53
+ private async buildIndex(): Promise<Map<string, RegistryEntrySummary>> {
54
+ const now = Date.now();
55
+
56
+ // Return cached index if still valid
57
+ if (this.indexCache && (now - this.indexCacheTime) < this.INDEX_CACHE_TTL) {
58
+ return this.indexCache;
59
+ }
60
+
61
+ const index = new Map<string, RegistryEntrySummary>();
62
+
63
+ try {
64
+ await this.ensureDir();
65
+ const files = await fs.readdir(this.dataDir);
66
+
67
+ for (const file of files) {
68
+ if (!file.endsWith('.json')) continue;
69
+
70
+ try {
71
+ const content = await fs.readFile(path.join(this.dataDir, file), 'utf-8');
72
+ const entry: RegistryEntry = JSON.parse(content);
73
+
74
+ index.set(entry.id, {
75
+ id: entry.id,
76
+ name: entry.name,
77
+ description: entry.description,
78
+ sourceRepo: entry.sourceRepo,
79
+ version: entry.version,
80
+ toolCount: entry.toolCount,
81
+ categories: entry.categories,
82
+ popularity: entry.popularity,
83
+ quality: entry.quality.overall,
84
+ verified: entry.verified,
85
+ lastUpdated: entry.lastUpdated,
86
+ });
87
+ } catch {
88
+ // Skip invalid files
89
+ }
90
+ }
91
+ } catch {
92
+ // Directory doesn't exist yet
93
+ }
94
+
95
+ this.indexCache = index;
96
+ this.indexCacheTime = now;
97
+ return index;
98
+ }
99
+
100
+ /**
101
+ * Invalidate the index cache
102
+ */
103
+ private invalidateCache(): void {
104
+ this.indexCache = null;
105
+ }
106
+
107
+ /**
108
+ * Get an entry by ID
109
+ */
110
+ async get(id: string): Promise<RegistryEntry | null> {
111
+ try {
112
+ const content = await fs.readFile(this.getEntryPath(id), 'utf-8');
113
+ return JSON.parse(content);
114
+ } catch {
115
+ return null;
116
+ }
117
+ }
118
+
119
+ /**
120
+ * List entries with filtering and pagination
121
+ */
122
+ async list(options: ListOptions = {}): Promise<ListResult> {
123
+ const {
124
+ category,
125
+ search,
126
+ sortBy = 'popularity',
127
+ sortOrder = 'desc',
128
+ offset = 0,
129
+ limit = 20,
130
+ verifiedOnly = false,
131
+ } = options;
132
+
133
+ const index = await this.buildIndex();
134
+ let entries = Array.from(index.values());
135
+
136
+ // Filter by category
137
+ if (category) {
138
+ entries = entries.filter(e =>
139
+ e.categories.some(c => c.toLowerCase() === category.toLowerCase())
140
+ );
141
+ }
142
+
143
+ // Filter by search query
144
+ if (search) {
145
+ const query = search.toLowerCase();
146
+ entries = entries.filter(e =>
147
+ e.name.toLowerCase().includes(query) ||
148
+ e.description.toLowerCase().includes(query) ||
149
+ e.id.toLowerCase().includes(query) ||
150
+ e.sourceRepo.toLowerCase().includes(query)
151
+ );
152
+ }
153
+
154
+ // Filter verified only
155
+ if (verifiedOnly) {
156
+ entries = entries.filter(e => e.verified);
157
+ }
158
+
159
+ // Sort
160
+ entries.sort((a, b) => {
161
+ let comparison = 0;
162
+ switch (sortBy) {
163
+ case 'name':
164
+ comparison = a.name.localeCompare(b.name);
165
+ break;
166
+ case 'quality':
167
+ comparison = a.quality - b.quality;
168
+ break;
169
+ case 'lastUpdated':
170
+ comparison = new Date(a.lastUpdated).getTime() - new Date(b.lastUpdated).getTime();
171
+ break;
172
+ case 'toolCount':
173
+ comparison = a.toolCount - b.toolCount;
174
+ break;
175
+ case 'popularity':
176
+ default:
177
+ comparison = a.popularity - b.popularity;
178
+ break;
179
+ }
180
+ return sortOrder === 'asc' ? comparison : -comparison;
181
+ });
182
+
183
+ const total = entries.length;
184
+ const paginated = entries.slice(offset, offset + limit);
185
+
186
+ return {
187
+ entries: paginated,
188
+ total,
189
+ offset,
190
+ limit,
191
+ };
192
+ }
193
+
194
+ /**
195
+ * Save an entry
196
+ */
197
+ async save(entry: RegistryEntry): Promise<void> {
198
+ await this.ensureDir();
199
+ await fs.writeFile(
200
+ this.getEntryPath(entry.id),
201
+ JSON.stringify(entry, null, 2),
202
+ 'utf-8'
203
+ );
204
+ this.invalidateCache();
205
+ }
206
+
207
+ /**
208
+ * Delete an entry
209
+ */
210
+ async delete(id: string): Promise<boolean> {
211
+ try {
212
+ await fs.unlink(this.getEntryPath(id));
213
+ this.invalidateCache();
214
+ return true;
215
+ } catch {
216
+ return false;
217
+ }
218
+ }
219
+
220
+ /**
221
+ * Check if entry exists
222
+ */
223
+ async exists(id: string): Promise<boolean> {
224
+ try {
225
+ await fs.access(this.getEntryPath(id));
226
+ return true;
227
+ } catch {
228
+ return false;
229
+ }
230
+ }
231
+
232
+ /**
233
+ * Get all unique categories
234
+ */
235
+ async getCategories(): Promise<string[]> {
236
+ const index = await this.buildIndex();
237
+ const categories = new Set<string>();
238
+
239
+ for (const entry of index.values()) {
240
+ for (const cat of entry.categories) {
241
+ categories.add(cat);
242
+ }
243
+ }
244
+
245
+ return Array.from(categories).sort();
246
+ }
247
+
248
+ /**
249
+ * Search entries by query
250
+ */
251
+ async search(query: string): Promise<RegistryEntrySummary[]> {
252
+ const result = await this.list({ search: query, limit: 50 });
253
+ return result.entries;
254
+ }
255
+ }
256
+
257
+ /**
258
+ * In-memory storage for testing
259
+ */
260
+ export class MemoryStorage implements StorageAdapter {
261
+ private entries: Map<string, RegistryEntry> = new Map();
262
+
263
+ async get(id: string): Promise<RegistryEntry | null> {
264
+ return this.entries.get(id) || null;
265
+ }
266
+
267
+ async list(options: ListOptions = {}): Promise<ListResult> {
268
+ const { offset = 0, limit = 20 } = options;
269
+ const all = Array.from(this.entries.values());
270
+
271
+ return {
272
+ entries: all.slice(offset, offset + limit).map(e => ({
273
+ id: e.id,
274
+ name: e.name,
275
+ description: e.description,
276
+ sourceRepo: e.sourceRepo,
277
+ version: e.version,
278
+ toolCount: e.toolCount,
279
+ categories: e.categories,
280
+ popularity: e.popularity,
281
+ quality: e.quality.overall,
282
+ verified: e.verified,
283
+ lastUpdated: e.lastUpdated,
284
+ })),
285
+ total: all.length,
286
+ offset,
287
+ limit,
288
+ };
289
+ }
290
+
291
+ async save(entry: RegistryEntry): Promise<void> {
292
+ this.entries.set(entry.id, entry);
293
+ }
294
+
295
+ async delete(id: string): Promise<boolean> {
296
+ return this.entries.delete(id);
297
+ }
298
+
299
+ async exists(id: string): Promise<boolean> {
300
+ return this.entries.has(id);
301
+ }
302
+
303
+ async getCategories(): Promise<string[]> {
304
+ const categories = new Set<string>();
305
+ for (const entry of this.entries.values()) {
306
+ for (const cat of entry.categories) {
307
+ categories.add(cat);
308
+ }
309
+ }
310
+ return Array.from(categories).sort();
311
+ }
312
+
313
+ async search(query: string): Promise<RegistryEntrySummary[]> {
314
+ const q = query.toLowerCase();
315
+ return Array.from(this.entries.values())
316
+ .filter(e =>
317
+ e.name.toLowerCase().includes(q) ||
318
+ e.description.toLowerCase().includes(q)
319
+ )
320
+ .map(e => ({
321
+ id: e.id,
322
+ name: e.name,
323
+ description: e.description,
324
+ sourceRepo: e.sourceRepo,
325
+ version: e.version,
326
+ toolCount: e.toolCount,
327
+ categories: e.categories,
328
+ popularity: e.popularity,
329
+ quality: e.quality.overall,
330
+ verified: e.verified,
331
+ lastUpdated: e.lastUpdated,
332
+ }));
333
+ }
334
+ }
@@ -0,0 +1,275 @@
1
+ /**
2
+ * @fileoverview Type definitions for MCP Registry
3
+ * @copyright Copyright (c) 2024-2026 nirholas
4
+ * @license Apache-2.0
5
+ */
6
+
7
+ /**
8
+ * Quality metrics for a tool or server
9
+ */
10
+ export interface QualityScore {
11
+ /** Overall quality score (0-100) */
12
+ overall: number;
13
+ /** Schema completeness - required fields, types defined (0-100) */
14
+ schemaCompleteness: number;
15
+ /** Documentation quality - descriptions, examples (0-100) */
16
+ documentation: number;
17
+ /** Has examples in OpenAPI or code (0-100) */
18
+ examples: number;
19
+ /** Authentication handling clarity (0-100) */
20
+ authHandling: number;
21
+ /** Parameter type coverage (0-100) */
22
+ parameterTypes: number;
23
+ }
24
+
25
+ /**
26
+ * Summary of a tool in the registry
27
+ */
28
+ export interface ToolSummary {
29
+ /** Tool name */
30
+ name: string;
31
+ /** Tool description */
32
+ description: string;
33
+ /** Source of extraction (openapi, readme, code, etc.) */
34
+ source: string;
35
+ /** Number of parameters */
36
+ paramCount: number;
37
+ /** Whether authentication is required */
38
+ requiresAuth: boolean;
39
+ }
40
+
41
+ /**
42
+ * Authentication scheme detected for an API
43
+ */
44
+ export interface AuthScheme {
45
+ /** Type of authentication */
46
+ type: 'apiKey' | 'oauth2' | 'http' | 'openIdConnect' | 'none';
47
+ /** Name of the auth header/param */
48
+ name?: string;
49
+ /** Location of the auth credential */
50
+ in?: 'header' | 'query' | 'cookie';
51
+ /** HTTP scheme (bearer, basic) */
52
+ scheme?: 'bearer' | 'basic';
53
+ /** Environment variable name for the credential */
54
+ envVar?: string;
55
+ /** Description of how to obtain credentials */
56
+ instructions?: string;
57
+ }
58
+
59
+ /**
60
+ * IDE configuration formats
61
+ */
62
+ export interface IdeConfigs {
63
+ /** Claude Desktop configuration */
64
+ claude: {
65
+ mcpServers: Record<string, {
66
+ command: string;
67
+ args: string[];
68
+ env?: Record<string, string>;
69
+ }>;
70
+ };
71
+ /** Cursor configuration */
72
+ cursor: {
73
+ mcpServers: Record<string, {
74
+ command: string;
75
+ args: string[];
76
+ env?: Record<string, string>;
77
+ }>;
78
+ };
79
+ /** VS Code configuration */
80
+ vscode: {
81
+ mcpServers: Record<string, {
82
+ command: string;
83
+ args: string[];
84
+ env?: Record<string, string>;
85
+ }>;
86
+ };
87
+ }
88
+
89
+ /**
90
+ * Generated code for different languages
91
+ */
92
+ export interface GeneratedCode {
93
+ /** TypeScript MCP server code */
94
+ typescript: string;
95
+ /** Python MCP server code (optional) */
96
+ python?: string;
97
+ /** Go MCP server code (optional) */
98
+ go?: string;
99
+ }
100
+
101
+ /**
102
+ * A registry entry for a pre-converted MCP server
103
+ */
104
+ export interface RegistryEntry {
105
+ /** Unique identifier (e.g., "stripe-mcp") */
106
+ id: string;
107
+ /** Display name (e.g., "Stripe") */
108
+ name: string;
109
+ /** Short description */
110
+ description: string;
111
+ /** Source GitHub repository (e.g., "stripe/stripe-node") */
112
+ sourceRepo: string;
113
+ /** Source repository URL */
114
+ sourceUrl: string;
115
+ /** Registry entry version */
116
+ version: string;
117
+ /** Source repo version/commit this was generated from */
118
+ sourceVersion: string;
119
+ /** Number of tools */
120
+ toolCount: number;
121
+ /** Summary of all tools */
122
+ tools: ToolSummary[];
123
+ /** Categories for filtering */
124
+ categories: string[];
125
+ /** Tags for search */
126
+ tags: string[];
127
+ /** Download/install count */
128
+ popularity: number;
129
+ /** Last updated timestamp */
130
+ lastUpdated: string;
131
+ /** When entry was created */
132
+ createdAt: string;
133
+ /** Generated code for each language */
134
+ generatedCode: GeneratedCode;
135
+ /** IDE configuration snippets */
136
+ configs: IdeConfigs;
137
+ /** Quality metrics */
138
+ quality: QualityScore;
139
+ /** Authentication requirements */
140
+ auth: AuthScheme[];
141
+ /** Documentation URL */
142
+ docsUrl?: string;
143
+ /** API documentation URL */
144
+ apiDocsUrl?: string;
145
+ /** Logo/icon URL */
146
+ iconUrl?: string;
147
+ /** Whether this is an official/verified entry */
148
+ verified: boolean;
149
+ /** Author of the registry entry */
150
+ author: string;
151
+ }
152
+
153
+ /**
154
+ * Minimal registry entry for list views
155
+ */
156
+ export interface RegistryEntrySummary {
157
+ id: string;
158
+ name: string;
159
+ description: string;
160
+ sourceRepo: string;
161
+ version: string;
162
+ toolCount: number;
163
+ categories: string[];
164
+ popularity: number;
165
+ quality: number;
166
+ verified: boolean;
167
+ lastUpdated: string;
168
+ }
169
+
170
+ /**
171
+ * Options for listing registry entries
172
+ */
173
+ export interface ListOptions {
174
+ /** Filter by category */
175
+ category?: string;
176
+ /** Search query */
177
+ search?: string;
178
+ /** Sort field */
179
+ sortBy?: 'popularity' | 'name' | 'quality' | 'lastUpdated' | 'toolCount';
180
+ /** Sort direction */
181
+ sortOrder?: 'asc' | 'desc';
182
+ /** Pagination offset */
183
+ offset?: number;
184
+ /** Pagination limit */
185
+ limit?: number;
186
+ /** Only show verified entries */
187
+ verifiedOnly?: boolean;
188
+ }
189
+
190
+ /**
191
+ * Result of a list operation
192
+ */
193
+ export interface ListResult {
194
+ entries: RegistryEntrySummary[];
195
+ total: number;
196
+ offset: number;
197
+ limit: number;
198
+ }
199
+
200
+ /**
201
+ * Options for installing a registry entry
202
+ */
203
+ export interface InstallOptions {
204
+ /** Target IDE/tool */
205
+ target: 'claude' | 'cursor' | 'vscode' | 'file';
206
+ /** Output directory (for 'file' target) */
207
+ outputDir?: string;
208
+ /** Environment variables to set */
209
+ env?: Record<string, string>;
210
+ /** Language preference */
211
+ language?: 'typescript' | 'python';
212
+ /** Overwrite existing installation */
213
+ overwrite?: boolean;
214
+ }
215
+
216
+ /**
217
+ * Result of an install operation
218
+ */
219
+ export interface InstallResult {
220
+ success: boolean;
221
+ /** Path to installed files or config */
222
+ path?: string;
223
+ /** Installation instructions */
224
+ instructions?: string[];
225
+ /** Error message if failed */
226
+ error?: string;
227
+ }
228
+
229
+ /**
230
+ * Information about available updates
231
+ */
232
+ export interface UpdateInfo {
233
+ /** Entry ID */
234
+ id: string;
235
+ /** Current installed version */
236
+ currentVersion: string;
237
+ /** Latest available version */
238
+ latestVersion: string;
239
+ /** What changed */
240
+ changelog?: string;
241
+ /** Whether update is breaking */
242
+ breaking: boolean;
243
+ }
244
+
245
+ /**
246
+ * Storage adapter interface for registry data
247
+ */
248
+ export interface StorageAdapter {
249
+ /** Get an entry by ID */
250
+ get(id: string): Promise<RegistryEntry | null>;
251
+ /** List all entries */
252
+ list(options?: ListOptions): Promise<ListResult>;
253
+ /** Save an entry */
254
+ save(entry: RegistryEntry): Promise<void>;
255
+ /** Delete an entry */
256
+ delete(id: string): Promise<boolean>;
257
+ /** Check if entry exists */
258
+ exists(id: string): Promise<boolean>;
259
+ /** Get all categories */
260
+ getCategories(): Promise<string[]>;
261
+ /** Search entries */
262
+ search(query: string): Promise<RegistryEntrySummary[]>;
263
+ }
264
+
265
+ /**
266
+ * Registry statistics
267
+ */
268
+ export interface RegistryStats {
269
+ totalEntries: number;
270
+ totalTools: number;
271
+ totalDownloads: number;
272
+ categories: { name: string; count: number }[];
273
+ topEntries: RegistryEntrySummary[];
274
+ recentlyUpdated: RegistryEntrySummary[];
275
+ }