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,651 @@
1
+ /**
2
+ * MCP Events - Typed event emitter for MCP client events
3
+ * @copyright 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ import type {
8
+ ConnectionState,
9
+ McpTool,
10
+ McpResource,
11
+ McpPrompt,
12
+ McpToolCallResult,
13
+ McpError,
14
+ } from './types.js';
15
+
16
+ // ============================================================================
17
+ // Event Types
18
+ // ============================================================================
19
+
20
+ /**
21
+ * Connection state change event
22
+ */
23
+ export interface ConnectionStateChangeEvent {
24
+ readonly type: 'connection:stateChange';
25
+ readonly previousState: ConnectionState;
26
+ readonly currentState: ConnectionState;
27
+ readonly timestamp: Date;
28
+ }
29
+
30
+ /**
31
+ * Connection established event
32
+ */
33
+ export interface ConnectionEstablishedEvent {
34
+ readonly type: 'connection:established';
35
+ readonly serverName: string;
36
+ readonly serverVersion: string;
37
+ readonly timestamp: Date;
38
+ }
39
+
40
+ /**
41
+ * Connection closed event
42
+ */
43
+ export interface ConnectionClosedEvent {
44
+ readonly type: 'connection:closed';
45
+ readonly reason?: string;
46
+ readonly wasClean: boolean;
47
+ readonly timestamp: Date;
48
+ }
49
+
50
+ /**
51
+ * Connection error event
52
+ */
53
+ export interface ConnectionErrorEvent {
54
+ readonly type: 'connection:error';
55
+ readonly error: McpError | Error;
56
+ readonly recoverable: boolean;
57
+ readonly timestamp: Date;
58
+ }
59
+
60
+ /**
61
+ * Reconnection attempt event
62
+ */
63
+ export interface ReconnectionAttemptEvent {
64
+ readonly type: 'connection:reconnecting';
65
+ readonly attempt: number;
66
+ readonly maxAttempts: number;
67
+ readonly delayMs: number;
68
+ readonly timestamp: Date;
69
+ }
70
+
71
+ /**
72
+ * Tool list change event (from server notification)
73
+ */
74
+ export interface ToolsChangedEvent {
75
+ readonly type: 'tools:changed';
76
+ readonly tools: readonly McpTool[];
77
+ readonly timestamp: Date;
78
+ }
79
+
80
+ /**
81
+ * Tool execution start event
82
+ */
83
+ export interface ToolExecutionStartEvent {
84
+ readonly type: 'tool:start';
85
+ readonly toolName: string;
86
+ readonly requestId: string;
87
+ readonly params: Readonly<Record<string, unknown>>;
88
+ readonly timestamp: Date;
89
+ }
90
+
91
+ /**
92
+ * Tool execution complete event
93
+ */
94
+ export interface ToolExecutionCompleteEvent {
95
+ readonly type: 'tool:complete';
96
+ readonly toolName: string;
97
+ readonly requestId: string;
98
+ readonly result: McpToolCallResult;
99
+ readonly durationMs: number;
100
+ readonly timestamp: Date;
101
+ }
102
+
103
+ /**
104
+ * Tool execution error event
105
+ */
106
+ export interface ToolExecutionErrorEvent {
107
+ readonly type: 'tool:error';
108
+ readonly toolName: string;
109
+ readonly requestId: string;
110
+ readonly error: McpError | Error;
111
+ readonly durationMs: number;
112
+ readonly timestamp: Date;
113
+ }
114
+
115
+ /**
116
+ * Resource list change event (from server notification)
117
+ */
118
+ export interface ResourcesChangedEvent {
119
+ readonly type: 'resources:changed';
120
+ readonly resources: readonly McpResource[];
121
+ readonly timestamp: Date;
122
+ }
123
+
124
+ /**
125
+ * Resource updated event (from subscription)
126
+ */
127
+ export interface ResourceUpdatedEvent {
128
+ readonly type: 'resource:updated';
129
+ readonly uri: string;
130
+ readonly timestamp: Date;
131
+ }
132
+
133
+ /**
134
+ * Prompt list change event (from server notification)
135
+ */
136
+ export interface PromptsChangedEvent {
137
+ readonly type: 'prompts:changed';
138
+ readonly prompts: readonly McpPrompt[];
139
+ readonly timestamp: Date;
140
+ }
141
+
142
+ /**
143
+ * Server log message event
144
+ */
145
+ export interface ServerLogEvent {
146
+ readonly type: 'server:log';
147
+ readonly level: 'debug' | 'info' | 'notice' | 'warning' | 'error' | 'critical' | 'alert' | 'emergency';
148
+ readonly message: string;
149
+ readonly data?: unknown;
150
+ readonly timestamp: Date;
151
+ }
152
+
153
+ /**
154
+ * Request start event (for any MCP request)
155
+ */
156
+ export interface RequestStartEvent {
157
+ readonly type: 'request:start';
158
+ readonly requestId: string;
159
+ readonly method: string;
160
+ readonly timestamp: Date;
161
+ }
162
+
163
+ /**
164
+ * Request complete event
165
+ */
166
+ export interface RequestCompleteEvent {
167
+ readonly type: 'request:complete';
168
+ readonly requestId: string;
169
+ readonly method: string;
170
+ readonly durationMs: number;
171
+ readonly timestamp: Date;
172
+ }
173
+
174
+ /**
175
+ * Request error event
176
+ */
177
+ export interface RequestErrorEvent {
178
+ readonly type: 'request:error';
179
+ readonly requestId: string;
180
+ readonly method: string;
181
+ readonly error: McpError | Error;
182
+ readonly durationMs: number;
183
+ readonly timestamp: Date;
184
+ }
185
+
186
+ /**
187
+ * Request cancelled event
188
+ */
189
+ export interface RequestCancelledEvent {
190
+ readonly type: 'request:cancelled';
191
+ readonly requestId: string;
192
+ readonly method: string;
193
+ readonly durationMs: number;
194
+ readonly timestamp: Date;
195
+ }
196
+
197
+ /**
198
+ * Session created event
199
+ */
200
+ export interface SessionCreatedEvent {
201
+ readonly type: 'session:created';
202
+ readonly sessionId: string;
203
+ readonly timestamp: Date;
204
+ }
205
+
206
+ /**
207
+ * Session destroyed event
208
+ */
209
+ export interface SessionDestroyedEvent {
210
+ readonly type: 'session:destroyed';
211
+ readonly sessionId: string;
212
+ readonly reason: 'timeout' | 'manual' | 'evicted' | 'error' | 'shutdown';
213
+ readonly timestamp: Date;
214
+ }
215
+
216
+ /**
217
+ * Union of all MCP events
218
+ */
219
+ export type McpEvent =
220
+ | ConnectionStateChangeEvent
221
+ | ConnectionEstablishedEvent
222
+ | ConnectionClosedEvent
223
+ | ConnectionErrorEvent
224
+ | ReconnectionAttemptEvent
225
+ | ToolsChangedEvent
226
+ | ToolExecutionStartEvent
227
+ | ToolExecutionCompleteEvent
228
+ | ToolExecutionErrorEvent
229
+ | ResourcesChangedEvent
230
+ | ResourceUpdatedEvent
231
+ | PromptsChangedEvent
232
+ | ServerLogEvent
233
+ | RequestStartEvent
234
+ | RequestCompleteEvent
235
+ | RequestErrorEvent
236
+ | RequestCancelledEvent
237
+ | SessionCreatedEvent
238
+ | SessionDestroyedEvent;
239
+
240
+ /**
241
+ * Event type to event mapping for type safety
242
+ */
243
+ export interface McpEventMap {
244
+ 'connection:stateChange': ConnectionStateChangeEvent;
245
+ 'connection:established': ConnectionEstablishedEvent;
246
+ 'connection:closed': ConnectionClosedEvent;
247
+ 'connection:error': ConnectionErrorEvent;
248
+ 'connection:reconnecting': ReconnectionAttemptEvent;
249
+ 'tools:changed': ToolsChangedEvent;
250
+ 'tool:start': ToolExecutionStartEvent;
251
+ 'tool:complete': ToolExecutionCompleteEvent;
252
+ 'tool:error': ToolExecutionErrorEvent;
253
+ 'resources:changed': ResourcesChangedEvent;
254
+ 'resource:updated': ResourceUpdatedEvent;
255
+ 'prompts:changed': PromptsChangedEvent;
256
+ 'server:log': ServerLogEvent;
257
+ 'request:start': RequestStartEvent;
258
+ 'request:complete': RequestCompleteEvent;
259
+ 'request:error': RequestErrorEvent;
260
+ 'request:cancelled': RequestCancelledEvent;
261
+ 'session:created': SessionCreatedEvent;
262
+ 'session:destroyed': SessionDestroyedEvent;
263
+ }
264
+
265
+ /**
266
+ * Event type string literal type
267
+ */
268
+ export type McpEventType = keyof McpEventMap;
269
+
270
+ /**
271
+ * Event listener function type
272
+ */
273
+ export type McpEventListener<T extends McpEventType> = (event: McpEventMap[T]) => void;
274
+
275
+ /**
276
+ * Wildcard listener that receives all events
277
+ */
278
+ export type McpWildcardListener = (event: McpEvent) => void;
279
+
280
+ // ============================================================================
281
+ // Event Emitter Class
282
+ // ============================================================================
283
+
284
+ /**
285
+ * Subscription handle for unsubscribing from events
286
+ */
287
+ export interface EventSubscription {
288
+ /** Unsubscribe from the event */
289
+ unsubscribe(): void;
290
+ }
291
+
292
+ /**
293
+ * Typed event emitter for MCP events
294
+ *
295
+ * @example
296
+ * ```typescript
297
+ * const emitter = new McpEventEmitter();
298
+ *
299
+ * // Subscribe to specific event
300
+ * const sub = emitter.on('connection:established', (event) => {
301
+ * console.log(`Connected to ${event.serverName}`);
302
+ * });
303
+ *
304
+ * // Subscribe to all events
305
+ * emitter.onAny((event) => {
306
+ * console.log(`Event: ${event.type}`);
307
+ * });
308
+ *
309
+ * // Emit an event
310
+ * emitter.emit({
311
+ * type: 'connection:established',
312
+ * serverName: 'my-server',
313
+ * serverVersion: '1.0.0',
314
+ * timestamp: new Date(),
315
+ * });
316
+ *
317
+ * // Unsubscribe
318
+ * sub.unsubscribe();
319
+ * ```
320
+ */
321
+ export class McpEventEmitter {
322
+ private readonly _listeners: Map<McpEventType, Set<McpEventListener<McpEventType>>> = new Map();
323
+ private readonly _wildcardListeners: Set<McpWildcardListener> = new Set();
324
+ private readonly _onceListeners: Map<McpEventType, Set<McpEventListener<McpEventType>>> = new Map();
325
+ private _maxListeners = 100;
326
+ private _isPaused = false;
327
+ private _eventQueue: McpEvent[] = [];
328
+
329
+ /**
330
+ * Maximum number of listeners per event type
331
+ */
332
+ get maxListeners(): number {
333
+ return this._maxListeners;
334
+ }
335
+
336
+ set maxListeners(value: number) {
337
+ this._maxListeners = value;
338
+ }
339
+
340
+ /**
341
+ * Subscribe to a specific event type
342
+ *
343
+ * @param eventType - Event type to listen for
344
+ * @param listener - Callback function
345
+ * @returns Subscription handle
346
+ */
347
+ on<T extends McpEventType>(eventType: T, listener: McpEventListener<T>): EventSubscription {
348
+ let listeners = this._listeners.get(eventType);
349
+ if (!listeners) {
350
+ listeners = new Set();
351
+ this._listeners.set(eventType, listeners);
352
+ }
353
+
354
+ if (listeners.size >= this._maxListeners) {
355
+ console.warn(
356
+ `McpEventEmitter: Maximum listeners (${this._maxListeners}) reached for event '${eventType}'`
357
+ );
358
+ }
359
+
360
+ listeners.add(listener as McpEventListener<McpEventType>);
361
+
362
+ return {
363
+ unsubscribe: () => {
364
+ listeners?.delete(listener as McpEventListener<McpEventType>);
365
+ },
366
+ };
367
+ }
368
+
369
+ /**
370
+ * Subscribe to a specific event type for one emission only
371
+ *
372
+ * @param eventType - Event type to listen for
373
+ * @param listener - Callback function
374
+ * @returns Subscription handle
375
+ */
376
+ once<T extends McpEventType>(eventType: T, listener: McpEventListener<T>): EventSubscription {
377
+ let onceListeners = this._onceListeners.get(eventType);
378
+ if (!onceListeners) {
379
+ onceListeners = new Set();
380
+ this._onceListeners.set(eventType, onceListeners);
381
+ }
382
+
383
+ onceListeners.add(listener as McpEventListener<McpEventType>);
384
+
385
+ return {
386
+ unsubscribe: () => {
387
+ onceListeners?.delete(listener as McpEventListener<McpEventType>);
388
+ },
389
+ };
390
+ }
391
+
392
+ /**
393
+ * Subscribe to all events
394
+ *
395
+ * @param listener - Callback function
396
+ * @returns Subscription handle
397
+ */
398
+ onAny(listener: McpWildcardListener): EventSubscription {
399
+ this._wildcardListeners.add(listener);
400
+
401
+ return {
402
+ unsubscribe: () => {
403
+ this._wildcardListeners.delete(listener);
404
+ },
405
+ };
406
+ }
407
+
408
+ /**
409
+ * Unsubscribe a listener from a specific event type
410
+ *
411
+ * @param eventType - Event type
412
+ * @param listener - Listener to remove
413
+ */
414
+ off<T extends McpEventType>(eventType: T, listener: McpEventListener<T>): void {
415
+ const listeners = this._listeners.get(eventType);
416
+ listeners?.delete(listener as McpEventListener<McpEventType>);
417
+
418
+ const onceListeners = this._onceListeners.get(eventType);
419
+ onceListeners?.delete(listener as McpEventListener<McpEventType>);
420
+ }
421
+
422
+ /**
423
+ * Remove all listeners for a specific event type, or all listeners if no type specified
424
+ *
425
+ * @param eventType - Optional event type
426
+ */
427
+ removeAllListeners(eventType?: McpEventType): void {
428
+ if (eventType) {
429
+ this._listeners.delete(eventType);
430
+ this._onceListeners.delete(eventType);
431
+ } else {
432
+ this._listeners.clear();
433
+ this._onceListeners.clear();
434
+ this._wildcardListeners.clear();
435
+ }
436
+ }
437
+
438
+ /**
439
+ * Emit an event to all listeners
440
+ *
441
+ * @param event - Event to emit
442
+ */
443
+ emit<T extends McpEvent>(event: T): void {
444
+ if (this._isPaused) {
445
+ this._eventQueue.push(event);
446
+ return;
447
+ }
448
+
449
+ this._emitInternal(event);
450
+ }
451
+
452
+ /**
453
+ * Internal emit implementation
454
+ */
455
+ private _emitInternal(event: McpEvent): void {
456
+ const eventType = event.type as McpEventType;
457
+
458
+ // Notify specific listeners
459
+ const listeners = this._listeners.get(eventType);
460
+ if (listeners) {
461
+ for (const listener of listeners) {
462
+ try {
463
+ listener(event as McpEventMap[typeof eventType]);
464
+ } catch (error) {
465
+ console.error(`Error in event listener for '${eventType}':`, error);
466
+ }
467
+ }
468
+ }
469
+
470
+ // Notify once listeners
471
+ const onceListeners = this._onceListeners.get(eventType);
472
+ if (onceListeners && onceListeners.size > 0) {
473
+ const listenersToCall = Array.from(onceListeners);
474
+ onceListeners.clear();
475
+ for (const listener of listenersToCall) {
476
+ try {
477
+ listener(event as McpEventMap[typeof eventType]);
478
+ } catch (error) {
479
+ console.error(`Error in once listener for '${eventType}':`, error);
480
+ }
481
+ }
482
+ }
483
+
484
+ // Notify wildcard listeners
485
+ for (const listener of this._wildcardListeners) {
486
+ try {
487
+ listener(event);
488
+ } catch (error) {
489
+ console.error('Error in wildcard event listener:', error);
490
+ }
491
+ }
492
+ }
493
+
494
+ /**
495
+ * Get the count of listeners for a specific event type
496
+ *
497
+ * @param eventType - Event type
498
+ * @returns Number of listeners
499
+ */
500
+ listenerCount(eventType?: McpEventType): number {
501
+ if (eventType) {
502
+ const listeners = this._listeners.get(eventType);
503
+ const onceListeners = this._onceListeners.get(eventType);
504
+ return (listeners?.size ?? 0) + (onceListeners?.size ?? 0);
505
+ }
506
+
507
+ let count = this._wildcardListeners.size;
508
+ for (const listeners of this._listeners.values()) {
509
+ count += listeners.size;
510
+ }
511
+ for (const listeners of this._onceListeners.values()) {
512
+ count += listeners.size;
513
+ }
514
+ return count;
515
+ }
516
+
517
+ /**
518
+ * Get all event types that have listeners
519
+ *
520
+ * @returns Array of event types
521
+ */
522
+ eventTypes(): McpEventType[] {
523
+ const types = new Set<McpEventType>();
524
+ for (const type of this._listeners.keys()) {
525
+ types.add(type);
526
+ }
527
+ for (const type of this._onceListeners.keys()) {
528
+ types.add(type);
529
+ }
530
+ return Array.from(types);
531
+ }
532
+
533
+ /**
534
+ * Pause event emission - events will be queued
535
+ */
536
+ pause(): void {
537
+ this._isPaused = true;
538
+ }
539
+
540
+ /**
541
+ * Resume event emission and flush queued events
542
+ */
543
+ resume(): void {
544
+ this._isPaused = false;
545
+ const queuedEvents = this._eventQueue;
546
+ this._eventQueue = [];
547
+ for (const event of queuedEvents) {
548
+ this._emitInternal(event);
549
+ }
550
+ }
551
+
552
+ /**
553
+ * Wait for a specific event type
554
+ *
555
+ * @param eventType - Event type to wait for
556
+ * @param timeoutMs - Optional timeout
557
+ * @returns Promise that resolves with the event
558
+ */
559
+ waitFor<T extends McpEventType>(
560
+ eventType: T,
561
+ timeoutMs?: number
562
+ ): Promise<McpEventMap[T]> {
563
+ return new Promise((resolve, reject) => {
564
+ let timeoutHandle: ReturnType<typeof setTimeout> | undefined;
565
+
566
+ const subscription = this.once(eventType, (event) => {
567
+ if (timeoutHandle) {
568
+ clearTimeout(timeoutHandle);
569
+ }
570
+ resolve(event);
571
+ });
572
+
573
+ if (timeoutMs !== undefined) {
574
+ timeoutHandle = setTimeout(() => {
575
+ subscription.unsubscribe();
576
+ reject(new Error(`Timeout waiting for event '${eventType}' after ${timeoutMs}ms`));
577
+ }, timeoutMs);
578
+ }
579
+ });
580
+ }
581
+ }
582
+
583
+ // ============================================================================
584
+ // Helper Functions
585
+ // ============================================================================
586
+
587
+ /**
588
+ * Create a new event emitter instance
589
+ */
590
+ export function createEventEmitter(): McpEventEmitter {
591
+ return new McpEventEmitter();
592
+ }
593
+
594
+ /**
595
+ * Create a timestamp for event creation
596
+ */
597
+ export function createEventTimestamp(): Date {
598
+ return new Date();
599
+ }
600
+
601
+ /**
602
+ * Type guard for connection events
603
+ */
604
+ export function isConnectionEvent(event: McpEvent): event is
605
+ | ConnectionStateChangeEvent
606
+ | ConnectionEstablishedEvent
607
+ | ConnectionClosedEvent
608
+ | ConnectionErrorEvent
609
+ | ReconnectionAttemptEvent {
610
+ return event.type.startsWith('connection:');
611
+ }
612
+
613
+ /**
614
+ * Type guard for tool events
615
+ */
616
+ export function isToolEvent(event: McpEvent): event is
617
+ | ToolsChangedEvent
618
+ | ToolExecutionStartEvent
619
+ | ToolExecutionCompleteEvent
620
+ | ToolExecutionErrorEvent {
621
+ return event.type.startsWith('tool:') || event.type === 'tools:changed';
622
+ }
623
+
624
+ /**
625
+ * Type guard for resource events
626
+ */
627
+ export function isResourceEvent(event: McpEvent): event is
628
+ | ResourcesChangedEvent
629
+ | ResourceUpdatedEvent {
630
+ return event.type.startsWith('resource:') || event.type === 'resources:changed';
631
+ }
632
+
633
+ /**
634
+ * Type guard for request events
635
+ */
636
+ export function isRequestEvent(event: McpEvent): event is
637
+ | RequestStartEvent
638
+ | RequestCompleteEvent
639
+ | RequestErrorEvent
640
+ | RequestCancelledEvent {
641
+ return event.type.startsWith('request:');
642
+ }
643
+
644
+ /**
645
+ * Type guard for session events
646
+ */
647
+ export function isSessionEvent(event: McpEvent): event is
648
+ | SessionCreatedEvent
649
+ | SessionDestroyedEvent {
650
+ return event.type.startsWith('session:');
651
+ }