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