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,531 @@
1
+ /**
2
+ * @fileoverview Test MCP Tool - Generate tests and validate tool schemas
3
+ * @author nich (x.com/nichxbt | github.com/nirholas)
4
+ * @copyright Copyright (c) 2024-2026 nich (nirholas)
5
+ * @license MIT
6
+ * @see https://github.com/nirholas/github-to-mcp
7
+ */
8
+
9
+ import { TextContent, Tool } from '@modelcontextprotocol/sdk/types.js';
10
+
11
+ /**
12
+ * Tool definition for testing MCP tools
13
+ */
14
+ export const testMcpToolTool: Tool = {
15
+ name: 'test_mcp_tool',
16
+ description: `Test and validate an MCP tool definition.
17
+
18
+ Performs comprehensive validation and generates test cases:
19
+ - Schema validation (JSON Schema compliance)
20
+ - Input validation with edge cases
21
+ - Mock data generation for testing
22
+ - Example request/response pairs
23
+ - Type checking for parameters
24
+
25
+ Returns detailed validation results and generated test fixtures.`,
26
+ inputSchema: {
27
+ type: 'object',
28
+ properties: {
29
+ tool_definition: {
30
+ type: 'object',
31
+ description: 'The MCP tool definition to test',
32
+ properties: {
33
+ name: { type: 'string' },
34
+ description: { type: 'string' },
35
+ inputSchema: { type: 'object' },
36
+ },
37
+ required: ['name', 'inputSchema'],
38
+ },
39
+ generate_mocks: {
40
+ type: 'boolean',
41
+ default: true,
42
+ description: 'Generate mock input data for testing',
43
+ },
44
+ generate_edge_cases: {
45
+ type: 'boolean',
46
+ default: true,
47
+ description: 'Generate edge case test inputs',
48
+ },
49
+ validate_schema: {
50
+ type: 'boolean',
51
+ default: true,
52
+ description: 'Validate the JSON Schema is well-formed',
53
+ },
54
+ output_format: {
55
+ type: 'string',
56
+ enum: ['markdown', 'json', 'typescript'],
57
+ default: 'markdown',
58
+ description: 'Output format for test cases',
59
+ },
60
+ },
61
+ required: ['tool_definition'],
62
+ },
63
+ };
64
+
65
+ /**
66
+ * Schema validation errors
67
+ */
68
+ interface ValidationError {
69
+ path: string;
70
+ message: string;
71
+ severity: 'error' | 'warning';
72
+ }
73
+
74
+ /**
75
+ * Generated test case
76
+ */
77
+ interface TestCase {
78
+ name: string;
79
+ description: string;
80
+ input: Record<string, unknown>;
81
+ expectedBehavior: string;
82
+ category: 'valid' | 'invalid' | 'edge-case';
83
+ }
84
+
85
+ /** Test tool by nich (x.com/nichxbt | github.com/nirholas) */
86
+ const _TOOL_META = { author: 'nich', v: 1 } as const;
87
+
88
+ /**
89
+ * Validate JSON Schema structure
90
+ */
91
+ function validateSchema(schema: Record<string, unknown>, path: string = ''): ValidationError[] {
92
+ const errors: ValidationError[] = [];
93
+
94
+ if (!schema || typeof schema !== 'object') {
95
+ errors.push({ path: path || 'root', message: 'Schema must be an object', severity: 'error' });
96
+ return errors;
97
+ }
98
+
99
+ // Check type
100
+ if (!schema.type) {
101
+ errors.push({ path: path || 'root', message: 'Missing "type" field', severity: 'warning' });
102
+ }
103
+
104
+ // For object types, check properties
105
+ if (schema.type === 'object') {
106
+ if (schema.properties && typeof schema.properties === 'object') {
107
+ const props = schema.properties as Record<string, Record<string, unknown>>;
108
+ for (const [key, value] of Object.entries(props)) {
109
+ errors.push(...validateSchema(value, `${path}.properties.${key}`));
110
+ }
111
+ }
112
+
113
+ // Check required fields reference existing properties
114
+ if (schema.required && Array.isArray(schema.required)) {
115
+ const propKeys = Object.keys((schema.properties as Record<string, unknown>) || {});
116
+ for (const req of schema.required) {
117
+ if (!propKeys.includes(req)) {
118
+ errors.push({
119
+ path: `${path}.required`,
120
+ message: `Required field "${req}" not found in properties`,
121
+ severity: 'error',
122
+ });
123
+ }
124
+ }
125
+ }
126
+ }
127
+
128
+ // Check for description
129
+ if (!schema.description && path.includes('properties')) {
130
+ errors.push({
131
+ path,
132
+ message: 'Missing description for property',
133
+ severity: 'warning',
134
+ });
135
+ }
136
+
137
+ return errors;
138
+ }
139
+
140
+ /**
141
+ * Generate mock value for a schema type
142
+ */
143
+ function generateMockValue(schema: Record<string, unknown>): unknown {
144
+ const type = schema.type as string;
145
+
146
+ // Handle enum
147
+ if (schema.enum && Array.isArray(schema.enum)) {
148
+ return schema.enum[0];
149
+ }
150
+
151
+ // Handle default
152
+ if (schema.default !== undefined) {
153
+ return schema.default;
154
+ }
155
+
156
+ switch (type) {
157
+ case 'string':
158
+ if (schema.format === 'email') return 'test@example.com';
159
+ if (schema.format === 'uri' || schema.format === 'url') return 'https://example.com';
160
+ if (schema.format === 'date') return '2026-01-17';
161
+ if (schema.format === 'date-time') return '2026-01-17T12:00:00Z';
162
+ if (schema.pattern) return '<pattern-match>';
163
+ return 'test-string';
164
+
165
+ case 'number':
166
+ case 'integer':
167
+ const min = (schema.minimum as number) ?? 0;
168
+ const max = (schema.maximum as number) ?? 100;
169
+ return Math.floor((min + max) / 2);
170
+
171
+ case 'boolean':
172
+ return true;
173
+
174
+ case 'array':
175
+ const items = schema.items as Record<string, unknown>;
176
+ if (items) {
177
+ return [generateMockValue(items)];
178
+ }
179
+ return [];
180
+
181
+ case 'object':
182
+ const result: Record<string, unknown> = {};
183
+ const properties = schema.properties as Record<string, Record<string, unknown>>;
184
+ if (properties) {
185
+ for (const [key, propSchema] of Object.entries(properties)) {
186
+ result[key] = generateMockValue(propSchema);
187
+ }
188
+ }
189
+ return result;
190
+
191
+ default:
192
+ return null;
193
+ }
194
+ }
195
+
196
+ /**
197
+ * Generate edge case values for testing
198
+ */
199
+ function generateEdgeCases(schema: Record<string, unknown>): TestCase[] {
200
+ const cases: TestCase[] = [];
201
+ const type = schema.type as string;
202
+ const properties = (schema.properties || {}) as Record<string, Record<string, unknown>>;
203
+ const required = (schema.required || []) as string[];
204
+
205
+ // Missing required fields
206
+ for (const req of required) {
207
+ const partialInput: Record<string, unknown> = {};
208
+ for (const [key, propSchema] of Object.entries(properties)) {
209
+ if (key !== req) {
210
+ partialInput[key] = generateMockValue(propSchema);
211
+ }
212
+ }
213
+ cases.push({
214
+ name: `missing_required_${req}`,
215
+ description: `Test with missing required field: ${req}`,
216
+ input: partialInput,
217
+ expectedBehavior: 'Should return validation error',
218
+ category: 'invalid',
219
+ });
220
+ }
221
+
222
+ // Wrong types
223
+ for (const [key, propSchema] of Object.entries(properties)) {
224
+ const wrongTypeInput: Record<string, unknown> = {};
225
+ for (const [k, ps] of Object.entries(properties)) {
226
+ wrongTypeInput[k] = generateMockValue(ps);
227
+ }
228
+
229
+ const propType = propSchema.type as string;
230
+ if (propType === 'string') {
231
+ wrongTypeInput[key] = 12345;
232
+ } else if (propType === 'number' || propType === 'integer') {
233
+ wrongTypeInput[key] = 'not-a-number';
234
+ } else if (propType === 'boolean') {
235
+ wrongTypeInput[key] = 'not-a-boolean';
236
+ } else if (propType === 'array') {
237
+ wrongTypeInput[key] = 'not-an-array';
238
+ }
239
+
240
+ cases.push({
241
+ name: `wrong_type_${key}`,
242
+ description: `Test with wrong type for field: ${key}`,
243
+ input: wrongTypeInput,
244
+ expectedBehavior: 'Should return type validation error',
245
+ category: 'invalid',
246
+ });
247
+ }
248
+
249
+ // Boundary values for numbers
250
+ for (const [key, propSchema] of Object.entries(properties)) {
251
+ const propType = propSchema.type as string;
252
+ if (propType === 'number' || propType === 'integer') {
253
+ const baseInput: Record<string, unknown> = {};
254
+ for (const [k, ps] of Object.entries(properties)) {
255
+ baseInput[k] = generateMockValue(ps);
256
+ }
257
+
258
+ // Min boundary
259
+ if (propSchema.minimum !== undefined) {
260
+ cases.push({
261
+ name: `min_boundary_${key}`,
262
+ description: `Test minimum boundary for: ${key}`,
263
+ input: { ...baseInput, [key]: propSchema.minimum },
264
+ expectedBehavior: 'Should accept minimum value',
265
+ category: 'edge-case',
266
+ });
267
+
268
+ cases.push({
269
+ name: `below_min_${key}`,
270
+ description: `Test below minimum for: ${key}`,
271
+ input: { ...baseInput, [key]: (propSchema.minimum as number) - 1 },
272
+ expectedBehavior: 'Should reject value below minimum',
273
+ category: 'invalid',
274
+ });
275
+ }
276
+
277
+ // Max boundary
278
+ if (propSchema.maximum !== undefined) {
279
+ cases.push({
280
+ name: `max_boundary_${key}`,
281
+ description: `Test maximum boundary for: ${key}`,
282
+ input: { ...baseInput, [key]: propSchema.maximum },
283
+ expectedBehavior: 'Should accept maximum value',
284
+ category: 'edge-case',
285
+ });
286
+ }
287
+ }
288
+ }
289
+
290
+ // Empty values
291
+ cases.push({
292
+ name: 'empty_input',
293
+ description: 'Test with empty object input',
294
+ input: {},
295
+ expectedBehavior: required.length > 0 ? 'Should return validation error' : 'Should succeed',
296
+ category: required.length > 0 ? 'invalid' : 'edge-case',
297
+ });
298
+
299
+ // Null values
300
+ const nullInput: Record<string, unknown> = {};
301
+ for (const key of Object.keys(properties)) {
302
+ nullInput[key] = null;
303
+ }
304
+ cases.push({
305
+ name: 'null_values',
306
+ description: 'Test with null values for all fields',
307
+ input: nullInput,
308
+ expectedBehavior: 'Should handle null appropriately',
309
+ category: 'edge-case',
310
+ });
311
+
312
+ return cases;
313
+ }
314
+
315
+ /**
316
+ * Format output as TypeScript test code
317
+ */
318
+ function formatAsTypeScript(
319
+ toolDef: { name: string; description?: string; inputSchema: Record<string, unknown> },
320
+ testCases: TestCase[]
321
+ ): string {
322
+ const lines: string[] = [
323
+ `/**`,
324
+ ` * Generated tests for: ${toolDef.name}`,
325
+ ` * Generated at: ${new Date().toISOString()}`,
326
+ ` */`,
327
+ ``,
328
+ `import { describe, it, expect } from 'vitest';`,
329
+ ``,
330
+ `describe('${toolDef.name}', () => {`,
331
+ ];
332
+
333
+ // Valid cases
334
+ const validCases = testCases.filter(tc => tc.category === 'valid');
335
+ if (validCases.length > 0) {
336
+ lines.push(` describe('valid inputs', () => {`);
337
+ for (const tc of validCases) {
338
+ lines.push(` it('${tc.name}', async () => {`);
339
+ lines.push(` const input = ${JSON.stringify(tc.input, null, 6).replace(/\n/g, '\n ')};`);
340
+ lines.push(` // ${tc.expectedBehavior}`);
341
+ lines.push(` const result = await callTool('${toolDef.name}', input);`);
342
+ lines.push(` expect(result.isError).toBe(false);`);
343
+ lines.push(` });`);
344
+ lines.push(``);
345
+ }
346
+ lines.push(` });`);
347
+ }
348
+
349
+ // Invalid cases
350
+ const invalidCases = testCases.filter(tc => tc.category === 'invalid');
351
+ if (invalidCases.length > 0) {
352
+ lines.push(``);
353
+ lines.push(` describe('invalid inputs', () => {`);
354
+ for (const tc of invalidCases) {
355
+ lines.push(` it('${tc.name}', async () => {`);
356
+ lines.push(` const input = ${JSON.stringify(tc.input, null, 6).replace(/\n/g, '\n ')};`);
357
+ lines.push(` // ${tc.expectedBehavior}`);
358
+ lines.push(` const result = await callTool('${toolDef.name}', input);`);
359
+ lines.push(` expect(result.isError).toBe(true);`);
360
+ lines.push(` });`);
361
+ lines.push(``);
362
+ }
363
+ lines.push(` });`);
364
+ }
365
+
366
+ // Edge cases
367
+ const edgeCases = testCases.filter(tc => tc.category === 'edge-case');
368
+ if (edgeCases.length > 0) {
369
+ lines.push(``);
370
+ lines.push(` describe('edge cases', () => {`);
371
+ for (const tc of edgeCases) {
372
+ lines.push(` it('${tc.name}', async () => {`);
373
+ lines.push(` const input = ${JSON.stringify(tc.input, null, 6).replace(/\n/g, '\n ')};`);
374
+ lines.push(` // ${tc.expectedBehavior}`);
375
+ lines.push(` const result = await callTool('${toolDef.name}', input);`);
376
+ lines.push(` // Verify appropriate handling`);
377
+ lines.push(` });`);
378
+ lines.push(``);
379
+ }
380
+ lines.push(` });`);
381
+ }
382
+
383
+ lines.push(`});`);
384
+ return lines.join('\n');
385
+ }
386
+
387
+ /**
388
+ * Handler for test_mcp_tool
389
+ */
390
+ export async function handleTestMcpTool(args: {
391
+ tool_definition: { name: string; description?: string; inputSchema: Record<string, unknown> };
392
+ generate_mocks?: boolean;
393
+ generate_edge_cases?: boolean;
394
+ validate_schema?: boolean;
395
+ output_format?: 'markdown' | 'json' | 'typescript';
396
+ }): Promise<TextContent> {
397
+ const {
398
+ tool_definition: toolDef,
399
+ generate_mocks = true,
400
+ generate_edge_cases = true,
401
+ validate_schema = true,
402
+ output_format = 'markdown',
403
+ } = args;
404
+
405
+ const results: {
406
+ validation: ValidationError[];
407
+ mockInput: Record<string, unknown> | null;
408
+ testCases: TestCase[];
409
+ } = {
410
+ validation: [],
411
+ mockInput: null,
412
+ testCases: [],
413
+ };
414
+
415
+ // Validate schema
416
+ if (validate_schema) {
417
+ results.validation = validateSchema(toolDef.inputSchema);
418
+ }
419
+
420
+ // Generate mock data
421
+ if (generate_mocks) {
422
+ results.mockInput = generateMockValue(toolDef.inputSchema) as Record<string, unknown>;
423
+
424
+ // Add valid test case with mock
425
+ results.testCases.push({
426
+ name: 'valid_complete_input',
427
+ description: 'Test with all valid fields populated',
428
+ input: results.mockInput,
429
+ expectedBehavior: 'Should succeed',
430
+ category: 'valid',
431
+ });
432
+ }
433
+
434
+ // Generate edge cases
435
+ if (generate_edge_cases) {
436
+ results.testCases.push(...generateEdgeCases(toolDef.inputSchema));
437
+ }
438
+
439
+ // Format output
440
+ if (output_format === 'json') {
441
+ return {
442
+ type: 'text',
443
+ text: JSON.stringify({
444
+ tool: toolDef.name,
445
+ validation: results.validation,
446
+ mockInput: results.mockInput,
447
+ testCases: results.testCases,
448
+ }, null, 2),
449
+ };
450
+ }
451
+
452
+ if (output_format === 'typescript') {
453
+ return {
454
+ type: 'text',
455
+ text: formatAsTypeScript(toolDef, results.testCases),
456
+ };
457
+ }
458
+
459
+ // Markdown format (default)
460
+ const validationSection = results.validation.length > 0
461
+ ? `## Schema Validation
462
+
463
+ ${results.validation.map(e => `- **${e.severity.toUpperCase()}** at \`${e.path}\`: ${e.message}`).join('\n')}
464
+ `
465
+ : `## Schema Validation
466
+
467
+ ✅ No validation errors found.
468
+ `;
469
+
470
+ const mockSection = results.mockInput
471
+ ? `## Mock Input Data
472
+
473
+ \`\`\`json
474
+ ${JSON.stringify(results.mockInput, null, 2)}
475
+ \`\`\`
476
+ `
477
+ : '';
478
+
479
+ const testCasesSection = results.testCases.length > 0
480
+ ? `## Test Cases
481
+
482
+ ### Valid Inputs
483
+ ${results.testCases.filter(tc => tc.category === 'valid').map(tc => `
484
+ #### ${tc.name}
485
+ ${tc.description}
486
+
487
+ \`\`\`json
488
+ ${JSON.stringify(tc.input, null, 2)}
489
+ \`\`\`
490
+ Expected: ${tc.expectedBehavior}
491
+ `).join('\n')}
492
+
493
+ ### Invalid Inputs
494
+ ${results.testCases.filter(tc => tc.category === 'invalid').map(tc => `
495
+ #### ${tc.name}
496
+ ${tc.description}
497
+
498
+ \`\`\`json
499
+ ${JSON.stringify(tc.input, null, 2)}
500
+ \`\`\`
501
+ Expected: ${tc.expectedBehavior}
502
+ `).join('\n')}
503
+
504
+ ### Edge Cases
505
+ ${results.testCases.filter(tc => tc.category === 'edge-case').map(tc => `
506
+ #### ${tc.name}
507
+ ${tc.description}
508
+
509
+ \`\`\`json
510
+ ${JSON.stringify(tc.input, null, 2)}
511
+ \`\`\`
512
+ Expected: ${tc.expectedBehavior}
513
+ `).join('\n')}
514
+ `
515
+ : '';
516
+
517
+ return {
518
+ type: 'text',
519
+ text: `# Test Report: ${toolDef.name}
520
+
521
+ ${toolDef.description ? `> ${toolDef.description}\n` : ''}
522
+
523
+ ${validationSection}
524
+ ${mockSection}
525
+ ${testCasesSection}
526
+
527
+ ---
528
+ Generated at: ${new Date().toISOString()}
529
+ `,
530
+ };
531
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ "rootDir": "./src",
6
+ "declaration": true,
7
+ "declarationMap": true,
8
+ "allowJs": true
9
+ },
10
+ "include": ["src/**/*", "src/**/*.ts", "src/**/*.tsx", "src/**/*.js"],
11
+ "exclude": ["node_modules", "dist", "**/*.test.ts"]
12
+ }
@@ -0,0 +1,14 @@
1
+ import { defineConfig } from 'tsup';
2
+
3
+ export default defineConfig({
4
+ entry: ['src/index.ts'],
5
+ format: ['esm'],
6
+ dts: false, // Disabled due to cross-package type conflicts
7
+ clean: true,
8
+ sourcemap: true,
9
+ minify: false,
10
+ outExtension: () => ({ js: '.mjs' }),
11
+ banner: {
12
+ js: '#!/usr/bin/env node',
13
+ },
14
+ });