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,611 @@
1
+ /**
2
+ * @fileoverview Postman Collection parser (v2.1 format)
3
+ * Converts Postman collections to MCP tool definitions
4
+ * @copyright Copyright (c) 2024-2026 nirholas
5
+ * @license MIT
6
+ */
7
+
8
+ /** Maximum number of properties to flatten from request body (larger bodies are kept as nested 'body' property) */
9
+ const MAX_FLATTEN_PROPERTIES = 5;
10
+
11
+ export interface PostmanCollection {
12
+ info: {
13
+ name: string;
14
+ description?: string;
15
+ schema: string;
16
+ _postman_id?: string;
17
+ };
18
+ item: PostmanItem[];
19
+ variable?: PostmanVariable[];
20
+ auth?: PostmanAuth;
21
+ }
22
+
23
+ export interface PostmanItem {
24
+ name: string;
25
+ description?: string;
26
+ item?: PostmanItem[]; // For folders
27
+ request?: PostmanRequest;
28
+ response?: PostmanResponse[];
29
+ event?: PostmanEvent[];
30
+ }
31
+
32
+ export interface PostmanRequest {
33
+ method: string;
34
+ header?: PostmanHeader[];
35
+ body?: PostmanBody;
36
+ url: PostmanUrl | string;
37
+ auth?: PostmanAuth;
38
+ description?: string;
39
+ }
40
+
41
+ export interface PostmanUrl {
42
+ raw?: string;
43
+ protocol?: string;
44
+ host?: string[];
45
+ path?: string[];
46
+ query?: PostmanQueryParam[];
47
+ variable?: PostmanPathVariable[];
48
+ }
49
+
50
+ export interface PostmanQueryParam {
51
+ key: string;
52
+ value?: string;
53
+ description?: string;
54
+ disabled?: boolean;
55
+ }
56
+
57
+ export interface PostmanPathVariable {
58
+ key: string;
59
+ value?: string;
60
+ description?: string;
61
+ }
62
+
63
+ export interface PostmanHeader {
64
+ key: string;
65
+ value: string;
66
+ description?: string;
67
+ disabled?: boolean;
68
+ }
69
+
70
+ export interface PostmanBody {
71
+ mode: 'raw' | 'urlencoded' | 'formdata' | 'file' | 'graphql';
72
+ raw?: string;
73
+ urlencoded?: Array<{ key: string; value: string; description?: string; disabled?: boolean }>;
74
+ formdata?: Array<{ key: string; value?: string; type?: string; description?: string; disabled?: boolean }>;
75
+ graphql?: { query: string; variables?: string };
76
+ options?: {
77
+ raw?: { language: string };
78
+ };
79
+ }
80
+
81
+ export interface PostmanAuth {
82
+ type: 'apikey' | 'awsv4' | 'basic' | 'bearer' | 'digest' | 'hawk' | 'noauth' | 'oauth1' | 'oauth2' | 'ntlm';
83
+ apikey?: Array<{ key: string; value: string }>;
84
+ basic?: Array<{ key: string; value: string }>;
85
+ bearer?: Array<{ key: string; value: string }>;
86
+ oauth2?: Array<{ key: string; value: string }>;
87
+ }
88
+
89
+ export interface PostmanResponse {
90
+ name: string;
91
+ originalRequest?: PostmanRequest;
92
+ status?: string;
93
+ code?: number;
94
+ header?: PostmanHeader[];
95
+ body?: string;
96
+ _postman_previewlanguage?: string;
97
+ }
98
+
99
+ export interface PostmanEvent {
100
+ listen: 'prerequest' | 'test';
101
+ script: {
102
+ exec: string[];
103
+ type: string;
104
+ };
105
+ }
106
+
107
+ export interface PostmanVariable {
108
+ key: string;
109
+ value: string;
110
+ type?: string;
111
+ description?: string;
112
+ }
113
+
114
+ export interface PostmanToolDefinition {
115
+ name: string;
116
+ description: string;
117
+ inputSchema: {
118
+ type: 'object';
119
+ properties: Record<string, any>;
120
+ required?: string[];
121
+ };
122
+ metadata: {
123
+ endpoint: {
124
+ path: string;
125
+ method: string;
126
+ };
127
+ folder?: string;
128
+ auth?: {
129
+ type: string;
130
+ envVar?: string;
131
+ };
132
+ headers?: Record<string, string>;
133
+ };
134
+ examples?: Array<{ input?: any; output?: any }>;
135
+ }
136
+
137
+ export interface PostmanParseResult {
138
+ format: 'postman';
139
+ info: {
140
+ name: string;
141
+ description?: string;
142
+ };
143
+ tools: PostmanToolDefinition[];
144
+ variables: Record<string, string>;
145
+ auth?: { type: string };
146
+ }
147
+
148
+ /**
149
+ * Parser for Postman Collection v2.1 format
150
+ */
151
+ export class PostmanParser {
152
+ private collection: PostmanCollection | null = null;
153
+ private variables: Map<string, string> = new Map();
154
+
155
+ /**
156
+ * Parse Postman Collection from JSON string
157
+ */
158
+ parse(input: string): PostmanCollection {
159
+ try {
160
+ this.collection = JSON.parse(input);
161
+ } catch (error) {
162
+ throw new Error(`Failed to parse Postman collection: ${error instanceof Error ? error.message : 'Invalid JSON'}`);
163
+ }
164
+
165
+ if (!this.isValidCollection(this.collection)) {
166
+ throw new Error('Invalid Postman collection: missing required fields');
167
+ }
168
+
169
+ // Extract collection variables
170
+ if (this.collection.variable) {
171
+ for (const v of this.collection.variable) {
172
+ this.variables.set(v.key, v.value);
173
+ }
174
+ }
175
+
176
+ return this.collection;
177
+ }
178
+
179
+ /**
180
+ * Parse from object (already loaded)
181
+ */
182
+ parseObject(collection: PostmanCollection): PostmanCollection {
183
+ if (!this.isValidCollection(collection)) {
184
+ throw new Error('Invalid Postman collection: missing required fields');
185
+ }
186
+ this.collection = collection;
187
+
188
+ if (collection.variable) {
189
+ for (const v of collection.variable) {
190
+ this.variables.set(v.key, v.value);
191
+ }
192
+ }
193
+
194
+ return collection;
195
+ }
196
+
197
+ /**
198
+ * Validate collection structure
199
+ */
200
+ private isValidCollection(collection: any): collection is PostmanCollection {
201
+ return (
202
+ collection &&
203
+ typeof collection.info === 'object' &&
204
+ typeof collection.info.name === 'string' &&
205
+ Array.isArray(collection.item)
206
+ );
207
+ }
208
+
209
+ /**
210
+ * Extract all requests recursively
211
+ */
212
+ extractRequests(folderPath: string = ''): Array<{ item: PostmanItem; folder: string }> {
213
+ if (!this.collection) {
214
+ throw new Error('No collection parsed. Call parse() first.');
215
+ }
216
+
217
+ const requests: Array<{ item: PostmanItem; folder: string }> = [];
218
+ this.extractRequestsRecursive(this.collection.item, folderPath, requests);
219
+ return requests;
220
+ }
221
+
222
+ /**
223
+ * Recursively extract requests from items
224
+ */
225
+ private extractRequestsRecursive(
226
+ items: PostmanItem[],
227
+ currentPath: string,
228
+ results: Array<{ item: PostmanItem; folder: string }>
229
+ ): void {
230
+ for (const item of items) {
231
+ if (item.item) {
232
+ // This is a folder
233
+ const newPath = currentPath ? `${currentPath}/${item.name}` : item.name;
234
+ this.extractRequestsRecursive(item.item, newPath, results);
235
+ } else if (item.request) {
236
+ // This is a request
237
+ results.push({ item, folder: currentPath });
238
+ }
239
+ }
240
+ }
241
+
242
+ /**
243
+ * Convert to MCP tool definitions
244
+ */
245
+ toMcpTools(): PostmanToolDefinition[] {
246
+ const requests = this.extractRequests();
247
+ const tools: PostmanToolDefinition[] = [];
248
+
249
+ for (const { item, folder } of requests) {
250
+ const tool = this.requestToTool(item, folder);
251
+ if (tool) {
252
+ tools.push(tool);
253
+ }
254
+ }
255
+
256
+ return tools;
257
+ }
258
+
259
+ /**
260
+ * Convert a Postman request to an MCP tool
261
+ */
262
+ private requestToTool(item: PostmanItem, folder: string): PostmanToolDefinition | null {
263
+ const request = item.request;
264
+ if (!request) return null;
265
+
266
+ const { path, queryParams, pathVariables } = this.parseUrl(request.url);
267
+ const properties: Record<string, any> = {};
268
+ const required: string[] = [];
269
+
270
+ // Add path variables
271
+ for (const variable of pathVariables) {
272
+ properties[variable.key] = {
273
+ type: 'string',
274
+ description: variable.description || `Path variable: ${variable.key}`,
275
+ };
276
+ required.push(variable.key);
277
+ }
278
+
279
+ // Add query parameters
280
+ for (const param of queryParams) {
281
+ if (param.disabled) continue;
282
+ properties[param.key] = {
283
+ type: 'string',
284
+ description: param.description || undefined,
285
+ default: param.value || undefined,
286
+ };
287
+ }
288
+
289
+ // Add body schema
290
+ if (request.body) {
291
+ const bodySchema = this.parseBodySchema(request.body);
292
+ if (bodySchema) {
293
+ if (bodySchema.properties && Object.keys(bodySchema.properties).length <= MAX_FLATTEN_PROPERTIES) {
294
+ // Flatten small bodies
295
+ Object.assign(properties, bodySchema.properties);
296
+ if (bodySchema.required) {
297
+ required.push(...bodySchema.required);
298
+ }
299
+ } else {
300
+ properties.body = bodySchema;
301
+ required.push('body');
302
+ }
303
+ }
304
+ }
305
+
306
+ // Extract examples from responses
307
+ const examples = this.extractExamples(item.response);
308
+
309
+ // Determine auth
310
+ const auth = this.extractAuth(request.auth || this.collection?.auth);
311
+
312
+ return {
313
+ name: this.generateToolName(item.name, folder),
314
+ description: request.description || item.description || item.name,
315
+ inputSchema: {
316
+ type: 'object',
317
+ properties,
318
+ required: required.length > 0 ? required : undefined,
319
+ },
320
+ metadata: {
321
+ endpoint: {
322
+ path,
323
+ method: request.method,
324
+ },
325
+ folder: folder || undefined,
326
+ auth,
327
+ headers: this.extractHeaders(request.header),
328
+ },
329
+ examples: examples.length > 0 ? examples : undefined,
330
+ };
331
+ }
332
+
333
+ /**
334
+ * Parse Postman URL object
335
+ */
336
+ private parseUrl(url: PostmanUrl | string): {
337
+ path: string;
338
+ queryParams: PostmanQueryParam[];
339
+ pathVariables: PostmanPathVariable[];
340
+ } {
341
+ if (typeof url === 'string') {
342
+ return {
343
+ path: this.replaceVariables(url),
344
+ queryParams: [],
345
+ pathVariables: [],
346
+ };
347
+ }
348
+
349
+ let path = '';
350
+ if (url.path) {
351
+ path = '/' + url.path.map(p => this.replaceVariables(p)).join('/');
352
+ } else if (url.raw) {
353
+ const rawUrl = this.replaceVariables(url.raw);
354
+ try {
355
+ const parsed = new URL(rawUrl);
356
+ path = parsed.pathname;
357
+ } catch {
358
+ path = rawUrl;
359
+ }
360
+ }
361
+
362
+ return {
363
+ path,
364
+ queryParams: url.query || [],
365
+ pathVariables: url.variable || [],
366
+ };
367
+ }
368
+
369
+ /**
370
+ * Replace collection variables in string
371
+ */
372
+ private replaceVariables(str: string): string {
373
+ return str.replace(/\{\{([^}]+)\}\}/g, (match, key) => {
374
+ return this.variables.get(key) || `{${key}}`;
375
+ });
376
+ }
377
+
378
+ /**
379
+ * Parse body schema from Postman body
380
+ */
381
+ private parseBodySchema(body: PostmanBody): any {
382
+ if (body.mode === 'raw' && body.raw) {
383
+ const language = body.options?.raw?.language || 'json';
384
+ if (language === 'json') {
385
+ try {
386
+ const example = JSON.parse(body.raw);
387
+ return this.inferSchemaFromExample(example);
388
+ } catch {
389
+ return { type: 'string' };
390
+ }
391
+ }
392
+ return { type: 'string' };
393
+ }
394
+
395
+ if (body.mode === 'urlencoded' && body.urlencoded) {
396
+ const properties: Record<string, any> = {};
397
+ for (const param of body.urlencoded) {
398
+ if (!param.disabled) {
399
+ properties[param.key] = {
400
+ type: 'string',
401
+ description: param.description || undefined,
402
+ };
403
+ }
404
+ }
405
+ return { type: 'object', properties };
406
+ }
407
+
408
+ if (body.mode === 'formdata' && body.formdata) {
409
+ const properties: Record<string, any> = {};
410
+ for (const param of body.formdata) {
411
+ if (!param.disabled) {
412
+ properties[param.key] = {
413
+ type: param.type === 'file' ? 'string' : 'string',
414
+ format: param.type === 'file' ? 'binary' : undefined,
415
+ description: param.description || undefined,
416
+ };
417
+ }
418
+ }
419
+ return { type: 'object', properties };
420
+ }
421
+
422
+ if (body.mode === 'graphql' && body.graphql) {
423
+ return {
424
+ type: 'object',
425
+ properties: {
426
+ query: { type: 'string', description: 'GraphQL query' },
427
+ variables: { type: 'object', description: 'GraphQL variables' },
428
+ },
429
+ required: ['query'],
430
+ };
431
+ }
432
+
433
+ return null;
434
+ }
435
+
436
+ /**
437
+ * Infer JSON Schema from example value
438
+ */
439
+ private inferSchemaFromExample(value: any): any {
440
+ if (value === null) {
441
+ return { type: 'null' };
442
+ }
443
+
444
+ if (Array.isArray(value)) {
445
+ if (value.length === 0) {
446
+ return { type: 'array', items: {} };
447
+ }
448
+ return {
449
+ type: 'array',
450
+ items: this.inferSchemaFromExample(value[0]),
451
+ };
452
+ }
453
+
454
+ if (typeof value === 'object') {
455
+ const properties: Record<string, any> = {};
456
+ for (const [key, val] of Object.entries(value)) {
457
+ properties[key] = this.inferSchemaFromExample(val);
458
+ }
459
+ return { type: 'object', properties };
460
+ }
461
+
462
+ if (typeof value === 'number') {
463
+ return Number.isInteger(value) ? { type: 'integer' } : { type: 'number' };
464
+ }
465
+
466
+ if (typeof value === 'boolean') {
467
+ return { type: 'boolean' };
468
+ }
469
+
470
+ return { type: 'string' };
471
+ }
472
+
473
+ /**
474
+ * Extract examples from Postman responses
475
+ */
476
+ private extractExamples(responses?: PostmanResponse[]): Array<{ input?: any; output?: any }> {
477
+ if (!responses) return [];
478
+
479
+ const examples: Array<{ input?: any; output?: any }> = [];
480
+
481
+ for (const response of responses) {
482
+ if (response.body) {
483
+ try {
484
+ const output = JSON.parse(response.body);
485
+ let input: any;
486
+
487
+ // Try to extract input from original request
488
+ if (response.originalRequest?.body?.raw) {
489
+ try {
490
+ input = JSON.parse(response.originalRequest.body.raw);
491
+ } catch {
492
+ // Ignore
493
+ }
494
+ }
495
+
496
+ examples.push({ input, output });
497
+ } catch {
498
+ // Ignore non-JSON responses
499
+ }
500
+ }
501
+ }
502
+
503
+ return examples;
504
+ }
505
+
506
+ /**
507
+ * Extract auth information
508
+ */
509
+ private extractAuth(auth?: PostmanAuth): { type: string; envVar?: string } | undefined {
510
+ if (!auth) return undefined;
511
+
512
+ const authMappings: Record<string, { type: string; envVar: string }> = {
513
+ bearer: { type: 'bearer', envVar: 'API_TOKEN' },
514
+ basic: { type: 'basic', envVar: 'API_BASIC_AUTH' },
515
+ apikey: { type: 'apiKey', envVar: 'API_KEY' },
516
+ oauth2: { type: 'oauth2', envVar: 'OAUTH_TOKEN' },
517
+ };
518
+
519
+ return authMappings[auth.type] || { type: auth.type };
520
+ }
521
+
522
+ /**
523
+ * Extract headers as a map
524
+ */
525
+ private extractHeaders(headers?: PostmanHeader[]): Record<string, string> | undefined {
526
+ if (!headers) return undefined;
527
+
528
+ const headerMap: Record<string, string> = {};
529
+ for (const header of headers) {
530
+ if (!header.disabled && !this.isAuthHeader(header.key)) {
531
+ headerMap[header.key] = header.value;
532
+ }
533
+ }
534
+
535
+ return Object.keys(headerMap).length > 0 ? headerMap : undefined;
536
+ }
537
+
538
+ /**
539
+ * Check if header is an auth header
540
+ */
541
+ private isAuthHeader(name: string): boolean {
542
+ const authHeaders = ['authorization', 'x-api-key', 'api-key'];
543
+ return authHeaders.includes(name.toLowerCase());
544
+ }
545
+
546
+ /**
547
+ * Generate tool name from request name and folder
548
+ */
549
+ private generateToolName(requestName: string, folder: string): string {
550
+ let name = requestName;
551
+
552
+ // Include folder as prefix if present
553
+ if (folder) {
554
+ const folderPrefix = folder
555
+ .split('/')
556
+ .map(s => this.toSnakeCase(s))
557
+ .join('_');
558
+ name = `${folderPrefix}_${requestName}`;
559
+ }
560
+
561
+ return this.toSnakeCase(name);
562
+ }
563
+
564
+ /**
565
+ * Convert string to snake_case
566
+ */
567
+ private toSnakeCase(str: string): string {
568
+ return str
569
+ .replace(/([A-Z])/g, '_$1')
570
+ .toLowerCase()
571
+ .replace(/[^a-z0-9_]/g, '_')
572
+ .replace(/[_]+/g, '_')
573
+ .replace(/^_/, '')
574
+ .replace(/_$/, '');
575
+ }
576
+
577
+ /**
578
+ * Get complete parse result
579
+ */
580
+ getParseResult(): PostmanParseResult {
581
+ if (!this.collection) {
582
+ throw new Error('No collection parsed. Call parse() first.');
583
+ }
584
+
585
+ return {
586
+ format: 'postman',
587
+ info: {
588
+ name: this.collection.info.name,
589
+ description: this.collection.info.description,
590
+ },
591
+ tools: this.toMcpTools(),
592
+ variables: Object.fromEntries(this.variables),
593
+ auth: this.collection.auth ? { type: this.collection.auth.type } : undefined,
594
+ };
595
+ }
596
+ }
597
+
598
+ /**
599
+ * Convenience function to parse Postman collection
600
+ */
601
+ export function parsePostman(input: string | object): PostmanParseResult {
602
+ const parser = new PostmanParser();
603
+
604
+ if (typeof input === 'string') {
605
+ parser.parse(input);
606
+ } else {
607
+ parser.parseObject(input as PostmanCollection);
608
+ }
609
+
610
+ return parser.getParseResult();
611
+ }