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,477 @@
1
+ /**
2
+ * SchemaForm Component - Dynamic form generation from JSON Schema
3
+ * @copyright 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ 'use client';
8
+
9
+ import * as React from 'react';
10
+ import { useState, useCallback, useMemo } from 'react';
11
+ import { motion, AnimatePresence } from 'framer-motion';
12
+ import {
13
+ Plus,
14
+ Trash2,
15
+ ChevronDown,
16
+ ChevronRight,
17
+ AlertCircle,
18
+ } from 'lucide-react';
19
+ import { Button } from '@/components/ui/button';
20
+ import { Input } from '@/components/ui/input';
21
+ import { cn } from '@/lib/utils';
22
+ import type { JsonSchema, JsonSchemaProperty } from './types';
23
+
24
+ export interface SchemaFormProps {
25
+ /** JSON Schema defining the form structure */
26
+ schema: JsonSchema;
27
+ /** Current form values */
28
+ value: Record<string, unknown>;
29
+ /** Callback when values change */
30
+ onChange: (value: Record<string, unknown>) => void;
31
+ /** Whether the form is disabled */
32
+ disabled?: boolean;
33
+ /** Additional CSS classes */
34
+ className?: string;
35
+ }
36
+
37
+ interface FieldProps {
38
+ name: string;
39
+ property: JsonSchemaProperty;
40
+ value: unknown;
41
+ onChange: (value: unknown) => void;
42
+ required: boolean;
43
+ disabled: boolean;
44
+ path: string;
45
+ }
46
+
47
+ /**
48
+ * Render a single schema field based on its type
49
+ */
50
+ function SchemaField({
51
+ name,
52
+ property,
53
+ value,
54
+ onChange,
55
+ required,
56
+ disabled,
57
+ path,
58
+ }: FieldProps) {
59
+ const [isExpanded, setIsExpanded] = useState(true);
60
+ const fieldId = `${path}-${name}`;
61
+
62
+ // String field
63
+ if (property.type === 'string') {
64
+ // Enum select
65
+ if (property.enum && property.enum.length > 0) {
66
+ return (
67
+ <div className="space-y-1.5">
68
+ <label
69
+ htmlFor={fieldId}
70
+ className="block text-sm font-medium text-neutral-300"
71
+ >
72
+ {name}
73
+ {required && <span className="text-red-400 ml-1">*</span>}
74
+ </label>
75
+ {property.description && (
76
+ <p className="text-xs text-neutral-500">{property.description}</p>
77
+ )}
78
+ <select
79
+ id={fieldId}
80
+ value={(value as string) || (property.default as string) || ''}
81
+ onChange={(e) => onChange(e.target.value)}
82
+ disabled={disabled}
83
+ className={cn(
84
+ 'w-full h-11 px-4 py-2 rounded-xl border bg-black text-white text-sm',
85
+ 'focus:outline-none focus:ring-2 focus:ring-white/10 focus:border-neutral-600',
86
+ disabled && 'opacity-50 cursor-not-allowed',
87
+ 'border-neutral-700'
88
+ )}
89
+ >
90
+ <option value="">Select {name}...</option>
91
+ {property.enum.map((opt) => (
92
+ <option key={opt} value={opt}>
93
+ {opt}
94
+ </option>
95
+ ))}
96
+ </select>
97
+ </div>
98
+ );
99
+ }
100
+
101
+ // Long text (textarea)
102
+ const isLongText =
103
+ property.format === 'textarea' ||
104
+ (property.maxLength && property.maxLength > 200) ||
105
+ name.toLowerCase().includes('body') ||
106
+ name.toLowerCase().includes('content') ||
107
+ name.toLowerCase().includes('description');
108
+
109
+ if (isLongText) {
110
+ return (
111
+ <div className="space-y-1.5">
112
+ <label
113
+ htmlFor={fieldId}
114
+ className="block text-sm font-medium text-neutral-300"
115
+ >
116
+ {name}
117
+ {required && <span className="text-red-400 ml-1">*</span>}
118
+ </label>
119
+ {property.description && (
120
+ <p className="text-xs text-neutral-500">{property.description}</p>
121
+ )}
122
+ <textarea
123
+ id={fieldId}
124
+ value={(value as string) || ''}
125
+ onChange={(e) => onChange(e.target.value)}
126
+ disabled={disabled}
127
+ placeholder={`Enter ${name}...`}
128
+ className={cn(
129
+ 'w-full min-h-[100px] px-4 py-2 rounded-xl border bg-black text-white text-sm resize-y',
130
+ 'placeholder:text-neutral-500',
131
+ 'focus:outline-none focus:ring-2 focus:ring-white/10 focus:border-neutral-600',
132
+ disabled && 'opacity-50 cursor-not-allowed',
133
+ 'border-neutral-700'
134
+ )}
135
+ />
136
+ </div>
137
+ );
138
+ }
139
+
140
+ // Regular string input
141
+ return (
142
+ <div className="space-y-1.5">
143
+ <label
144
+ htmlFor={fieldId}
145
+ className="block text-sm font-medium text-neutral-300"
146
+ >
147
+ {name}
148
+ {required && <span className="text-red-400 ml-1">*</span>}
149
+ </label>
150
+ {property.description && (
151
+ <p className="text-xs text-neutral-500">{property.description}</p>
152
+ )}
153
+ <Input
154
+ id={fieldId}
155
+ type={property.format === 'password' ? 'password' : 'text'}
156
+ value={(value as string) || ''}
157
+ onChange={(e) => onChange(e.target.value)}
158
+ disabled={disabled}
159
+ placeholder={`Enter ${name}...`}
160
+ />
161
+ </div>
162
+ );
163
+ }
164
+
165
+ // Number field
166
+ if (property.type === 'number' || property.type === 'integer') {
167
+ return (
168
+ <div className="space-y-1.5">
169
+ <label
170
+ htmlFor={fieldId}
171
+ className="block text-sm font-medium text-neutral-300"
172
+ >
173
+ {name}
174
+ {required && <span className="text-red-400 ml-1">*</span>}
175
+ </label>
176
+ {property.description && (
177
+ <p className="text-xs text-neutral-500">{property.description}</p>
178
+ )}
179
+ <Input
180
+ id={fieldId}
181
+ type="number"
182
+ value={value !== undefined ? String(value) : ''}
183
+ onChange={(e) => {
184
+ const val = e.target.value;
185
+ if (val === '') {
186
+ onChange(undefined);
187
+ } else {
188
+ onChange(
189
+ property.type === 'integer' ? parseInt(val, 10) : parseFloat(val)
190
+ );
191
+ }
192
+ }}
193
+ disabled={disabled}
194
+ placeholder={`Enter ${name}...`}
195
+ min={property.minimum}
196
+ max={property.maximum}
197
+ step={property.type === 'integer' ? 1 : 'any'}
198
+ />
199
+ </div>
200
+ );
201
+ }
202
+
203
+ // Boolean field
204
+ if (property.type === 'boolean') {
205
+ return (
206
+ <div className="flex items-start gap-3">
207
+ <input
208
+ id={fieldId}
209
+ type="checkbox"
210
+ checked={Boolean(value)}
211
+ onChange={(e) => onChange(e.target.checked)}
212
+ disabled={disabled}
213
+ className={cn(
214
+ 'mt-1 w-4 h-4 rounded border-neutral-600 bg-black text-green-500',
215
+ 'focus:ring-2 focus:ring-white/10',
216
+ disabled && 'opacity-50 cursor-not-allowed'
217
+ )}
218
+ />
219
+ <div>
220
+ <label
221
+ htmlFor={fieldId}
222
+ className="block text-sm font-medium text-neutral-300 cursor-pointer"
223
+ >
224
+ {name}
225
+ {required && <span className="text-red-400 ml-1">*</span>}
226
+ </label>
227
+ {property.description && (
228
+ <p className="text-xs text-neutral-500">{property.description}</p>
229
+ )}
230
+ </div>
231
+ </div>
232
+ );
233
+ }
234
+
235
+ // Array field
236
+ if (property.type === 'array') {
237
+ const arrayValue = Array.isArray(value) ? value : [];
238
+ const itemType = property.items?.type || 'string';
239
+
240
+ const addItem = () => {
241
+ const defaultValue =
242
+ itemType === 'string'
243
+ ? ''
244
+ : itemType === 'number' || itemType === 'integer'
245
+ ? 0
246
+ : itemType === 'boolean'
247
+ ? false
248
+ : itemType === 'object'
249
+ ? {}
250
+ : null;
251
+ onChange([...arrayValue, defaultValue]);
252
+ };
253
+
254
+ const removeItem = (index: number) => {
255
+ onChange(arrayValue.filter((_, i) => i !== index));
256
+ };
257
+
258
+ const updateItem = (index: number, itemValue: unknown) => {
259
+ const newArray = [...arrayValue];
260
+ newArray[index] = itemValue;
261
+ onChange(newArray);
262
+ };
263
+
264
+ return (
265
+ <div className="space-y-2">
266
+ <div className="flex items-center justify-between">
267
+ <label className="block text-sm font-medium text-neutral-300">
268
+ {name}
269
+ {required && <span className="text-red-400 ml-1">*</span>}
270
+ <span className="text-neutral-500 ml-2">({arrayValue.length} items)</span>
271
+ </label>
272
+ <Button
273
+ variant="ghost"
274
+ size="sm"
275
+ onClick={addItem}
276
+ disabled={disabled}
277
+ leftIcon={<Plus className="w-3 h-3" />}
278
+ >
279
+ Add
280
+ </Button>
281
+ </div>
282
+ {property.description && (
283
+ <p className="text-xs text-neutral-500">{property.description}</p>
284
+ )}
285
+ <div className="space-y-2 pl-4 border-l-2 border-neutral-800">
286
+ <AnimatePresence>
287
+ {arrayValue.map((item, index) => (
288
+ <motion.div
289
+ key={index}
290
+ initial={{ opacity: 0, x: -10 }}
291
+ animate={{ opacity: 1, x: 0 }}
292
+ exit={{ opacity: 0, x: -10 }}
293
+ className="flex items-start gap-2"
294
+ >
295
+ <div className="flex-1">
296
+ {property.items && (
297
+ <SchemaField
298
+ name={`[${index}]`}
299
+ property={property.items}
300
+ value={item}
301
+ onChange={(val) => updateItem(index, val)}
302
+ required={false}
303
+ disabled={disabled}
304
+ path={`${path}-${name}-${index}`}
305
+ />
306
+ )}
307
+ </div>
308
+ <Button
309
+ variant="ghost"
310
+ size="icon-sm"
311
+ onClick={() => removeItem(index)}
312
+ disabled={disabled}
313
+ className="mt-6"
314
+ >
315
+ <Trash2 className="w-3 h-3" />
316
+ </Button>
317
+ </motion.div>
318
+ ))}
319
+ </AnimatePresence>
320
+ {arrayValue.length === 0 && (
321
+ <p className="text-xs text-neutral-600 italic py-2">
322
+ No items. Click &quot;Add&quot; to add one.
323
+ </p>
324
+ )}
325
+ </div>
326
+ </div>
327
+ );
328
+ }
329
+
330
+ // Object field
331
+ if (property.type === 'object') {
332
+ const objectValue = (value as Record<string, unknown>) || {};
333
+ const properties = property.properties || {};
334
+ const requiredFields = new Set(property.required || []);
335
+
336
+ return (
337
+ <div className="space-y-2">
338
+ <button
339
+ type="button"
340
+ onClick={() => setIsExpanded(!isExpanded)}
341
+ className="flex items-center gap-2 text-sm font-medium text-neutral-300 hover:text-white transition-colors"
342
+ >
343
+ {isExpanded ? (
344
+ <ChevronDown className="w-4 h-4" />
345
+ ) : (
346
+ <ChevronRight className="w-4 h-4" />
347
+ )}
348
+ {name}
349
+ {required && <span className="text-red-400 ml-1">*</span>}
350
+ </button>
351
+ {property.description && (
352
+ <p className="text-xs text-neutral-500 ml-6">{property.description}</p>
353
+ )}
354
+ <AnimatePresence>
355
+ {isExpanded && (
356
+ <motion.div
357
+ initial={{ opacity: 0, height: 0 }}
358
+ animate={{ opacity: 1, height: 'auto' }}
359
+ exit={{ opacity: 0, height: 0 }}
360
+ className="space-y-3 pl-4 border-l-2 border-neutral-800"
361
+ >
362
+ {Object.entries(properties).map(([propName, propSchema]) => (
363
+ <SchemaField
364
+ key={propName}
365
+ name={propName}
366
+ property={propSchema}
367
+ value={objectValue[propName]}
368
+ onChange={(val) => {
369
+ if (val === undefined) {
370
+ const { [propName]: _, ...rest } = objectValue;
371
+ onChange(rest);
372
+ } else {
373
+ onChange({ ...objectValue, [propName]: val });
374
+ }
375
+ }}
376
+ required={requiredFields.has(propName)}
377
+ disabled={disabled}
378
+ path={`${path}-${name}`}
379
+ />
380
+ ))}
381
+ {Object.keys(properties).length === 0 && (
382
+ <p className="text-xs text-neutral-600 italic py-2">
383
+ No properties defined for this object.
384
+ </p>
385
+ )}
386
+ </motion.div>
387
+ )}
388
+ </AnimatePresence>
389
+ </div>
390
+ );
391
+ }
392
+
393
+ // Unknown type
394
+ return (
395
+ <div className="space-y-1.5">
396
+ <label className="block text-sm font-medium text-neutral-300">
397
+ {name}
398
+ {required && <span className="text-red-400 ml-1">*</span>}
399
+ </label>
400
+ {property.description && (
401
+ <p className="text-xs text-neutral-500">{property.description}</p>
402
+ )}
403
+ <div className="flex items-center gap-2 text-xs text-yellow-400">
404
+ <AlertCircle className="w-3 h-3" />
405
+ Unknown type: {property.type}
406
+ </div>
407
+ <Input
408
+ value={typeof value === 'string' ? value : JSON.stringify(value || '')}
409
+ onChange={(e) => {
410
+ try {
411
+ onChange(JSON.parse(e.target.value));
412
+ } catch {
413
+ onChange(e.target.value);
414
+ }
415
+ }}
416
+ disabled={disabled}
417
+ placeholder={`Enter ${name}...`}
418
+ />
419
+ </div>
420
+ );
421
+ }
422
+
423
+ /**
424
+ * SchemaForm - Dynamic form generation from JSON Schema
425
+ */
426
+ export default function SchemaForm({
427
+ schema,
428
+ value,
429
+ onChange,
430
+ disabled = false,
431
+ className = '',
432
+ }: SchemaFormProps) {
433
+ const properties = schema.properties || {};
434
+ const requiredFields = useMemo(
435
+ () => new Set(schema.required || []),
436
+ [schema.required]
437
+ );
438
+
439
+ // Handle field change
440
+ const handleFieldChange = useCallback(
441
+ (fieldName: string, fieldValue: unknown) => {
442
+ if (fieldValue === undefined) {
443
+ const { [fieldName]: _, ...rest } = value;
444
+ onChange(rest);
445
+ } else {
446
+ onChange({ ...value, [fieldName]: fieldValue });
447
+ }
448
+ },
449
+ [value, onChange]
450
+ );
451
+
452
+ // Check if there are any fields
453
+ if (Object.keys(properties).length === 0) {
454
+ return (
455
+ <div className={cn('text-sm text-neutral-500 italic py-4', className)}>
456
+ This tool has no input parameters.
457
+ </div>
458
+ );
459
+ }
460
+
461
+ return (
462
+ <div className={cn('space-y-4', className)}>
463
+ {Object.entries(properties).map(([name, property]) => (
464
+ <SchemaField
465
+ key={name}
466
+ name={name}
467
+ property={property}
468
+ value={value[name]}
469
+ onChange={(val) => handleFieldChange(name, val)}
470
+ required={requiredFields.has(name)}
471
+ disabled={disabled}
472
+ path="root"
473
+ />
474
+ ))}
475
+ </div>
476
+ );
477
+ }
@@ -0,0 +1,151 @@
1
+ /**
2
+ * ServerStatus Component - Shows MCP server connection status
3
+ * @copyright 2024-2026 nirholas
4
+ * @license MIT
5
+ */
6
+
7
+ 'use client';
8
+
9
+ import { motion } from 'framer-motion';
10
+ import {
11
+ Wifi,
12
+ WifiOff,
13
+ Loader2,
14
+ RefreshCw,
15
+ Power,
16
+ AlertTriangle,
17
+ } from 'lucide-react';
18
+ import { Button } from '@/components/ui/button';
19
+
20
+ export interface ServerStatusProps {
21
+ isConnected: boolean;
22
+ isConnecting: boolean;
23
+ sessionId: string | null;
24
+ error: string | null;
25
+ isDemoMode?: boolean;
26
+ onConnect?: () => void;
27
+ onDisconnect?: () => void;
28
+ className?: string;
29
+ }
30
+
31
+ export default function ServerStatus({
32
+ isConnected,
33
+ isConnecting,
34
+ sessionId,
35
+ error,
36
+ isDemoMode = false,
37
+ onConnect,
38
+ onDisconnect,
39
+ className = '',
40
+ }: ServerStatusProps) {
41
+ // Demo mode display
42
+ if (isDemoMode) {
43
+ return (
44
+ <div className={`flex items-center gap-3 p-3 rounded-lg border border-yellow-500/30 bg-yellow-500/10 ${className}`}>
45
+ <div className="flex items-center gap-2">
46
+ <div className="relative">
47
+ <WifiOff className="w-4 h-4 text-yellow-400" />
48
+ </div>
49
+ <span className="text-sm font-medium text-yellow-300">Demo Mode</span>
50
+ </div>
51
+ <span className="text-xs text-yellow-400/70">Not connected to real server</span>
52
+ </div>
53
+ );
54
+ }
55
+
56
+ // Error state
57
+ if (error && !isConnecting) {
58
+ return (
59
+ <div className={`flex items-center justify-between gap-3 p-3 rounded-lg border border-red-500/30 bg-red-500/10 ${className}`}>
60
+ <div className="flex items-center gap-2 min-w-0">
61
+ <AlertTriangle className="w-4 h-4 text-red-400 flex-shrink-0" />
62
+ <span className="text-sm font-medium text-red-300 truncate">{error}</span>
63
+ </div>
64
+ {onConnect && (
65
+ <Button
66
+ variant="ghost"
67
+ size="sm"
68
+ onClick={onConnect}
69
+ leftIcon={<RefreshCw className="w-3 h-3" />}
70
+ className="flex-shrink-0 text-red-300 hover:text-red-200"
71
+ >
72
+ Retry
73
+ </Button>
74
+ )}
75
+ </div>
76
+ );
77
+ }
78
+
79
+ // Connecting state
80
+ if (isConnecting) {
81
+ return (
82
+ <div className={`flex items-center gap-3 p-3 rounded-lg border border-blue-500/30 bg-blue-500/10 ${className}`}>
83
+ <div className="flex items-center gap-2">
84
+ <Loader2 className="w-4 h-4 text-blue-400 animate-spin" />
85
+ <span className="text-sm font-medium text-blue-300">Connecting to MCP server...</span>
86
+ </div>
87
+ </div>
88
+ );
89
+ }
90
+
91
+ // Connected state
92
+ if (isConnected) {
93
+ return (
94
+ <div className={`flex items-center justify-between gap-3 p-3 rounded-lg border border-green-500/30 bg-green-500/10 ${className}`}>
95
+ <div className="flex items-center gap-3">
96
+ <div className="flex items-center gap-2">
97
+ <motion.div
98
+ initial={{ scale: 0 }}
99
+ animate={{ scale: 1 }}
100
+ className="relative"
101
+ >
102
+ <Wifi className="w-4 h-4 text-green-400" />
103
+ <motion.div
104
+ className="absolute inset-0 rounded-full bg-green-400/30"
105
+ animate={{ scale: [1, 1.5, 1], opacity: [1, 0, 1] }}
106
+ transition={{ duration: 2, repeat: Infinity }}
107
+ />
108
+ </motion.div>
109
+ <span className="text-sm font-medium text-green-300">Connected</span>
110
+ </div>
111
+ {sessionId && (
112
+ <span className="text-xs text-green-400/70 font-mono hidden sm:inline">
113
+ Session: {sessionId.slice(0, 8)}...
114
+ </span>
115
+ )}
116
+ </div>
117
+ {onDisconnect && (
118
+ <Button
119
+ variant="ghost"
120
+ size="sm"
121
+ onClick={onDisconnect}
122
+ leftIcon={<Power className="w-3 h-3" />}
123
+ className="flex-shrink-0 text-green-300 hover:text-red-300"
124
+ >
125
+ Disconnect
126
+ </Button>
127
+ )}
128
+ </div>
129
+ );
130
+ }
131
+
132
+ // Disconnected state
133
+ return (
134
+ <div className={`flex items-center justify-between gap-3 p-3 rounded-lg border border-neutral-700 bg-neutral-800/50 ${className}`}>
135
+ <div className="flex items-center gap-2">
136
+ <WifiOff className="w-4 h-4 text-neutral-500" />
137
+ <span className="text-sm font-medium text-neutral-400">Not connected</span>
138
+ </div>
139
+ {onConnect && (
140
+ <Button
141
+ variant="secondary"
142
+ size="sm"
143
+ onClick={onConnect}
144
+ leftIcon={<Wifi className="w-3 h-3" />}
145
+ >
146
+ Connect
147
+ </Button>
148
+ )}
149
+ </div>
150
+ );
151
+ }