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,9 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ "rootDir": "./src"
6
+ },
7
+ "include": ["src/**/*"],
8
+ "exclude": ["node_modules", "dist"]
9
+ }
@@ -0,0 +1,11 @@
1
+ import { defineConfig } from 'tsup';
2
+
3
+ export default defineConfig({
4
+ entry: ['src/index.ts'],
5
+ format: ['esm'],
6
+ dts: false, // Temporarily disabled due to OpenAPI type version conflicts
7
+ sourcemap: true,
8
+ clean: true,
9
+ target: 'es2022',
10
+ outExtension: () => ({ js: '.mjs' }),
11
+ });
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@github-to-mcp/registry",
3
+ "version": "1.0.0",
4
+ "description": "Registry of pre-converted MCP servers for popular repositories",
5
+ "type": "module",
6
+ "main": "./dist/index.mjs",
7
+ "module": "./dist/index.mjs",
8
+ "types": "./dist/index.d.mts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.mjs",
12
+ "types": "./dist/index.d.mts"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "data"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsup",
21
+ "dev": "tsup --watch",
22
+ "typecheck": "tsc --noEmit",
23
+ "lint": "eslint src",
24
+ "test": "vitest run",
25
+ "test:watch": "vitest"
26
+ },
27
+ "keywords": [
28
+ "mcp",
29
+ "model-context-protocol",
30
+ "registry",
31
+ "github",
32
+ "ai",
33
+ "tools"
34
+ ],
35
+ "author": "nirholas",
36
+ "license": "Apache-2.0",
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "https://github.com/nirholas/github-to-mcp"
40
+ },
41
+ "dependencies": {
42
+ "semver": "^7.6.0"
43
+ },
44
+ "devDependencies": {
45
+ "@types/node": "^20.0.0",
46
+ "@types/semver": "^7.5.0",
47
+ "tsup": "^8.0.0",
48
+ "typescript": "^5.0.0",
49
+ "vitest": "^1.0.0"
50
+ },
51
+ "peerDependencies": {
52
+ "@nirholas/github-to-mcp": "workspace:*"
53
+ },
54
+ "peerDependenciesMeta": {
55
+ "@nirholas/github-to-mcp": {
56
+ "optional": true
57
+ }
58
+ }
59
+ }
@@ -0,0 +1,456 @@
1
+ /**
2
+ * @fileoverview Registry CLI commands
3
+ * @copyright Copyright (c) 2024-2026 nirholas
4
+ * @license Apache-2.0
5
+ */
6
+
7
+ import { Command } from 'commander';
8
+ import chalk from 'chalk';
9
+ import ora from 'ora';
10
+ import { McpRegistry } from './registry';
11
+ import { popularEntries } from './popular';
12
+ import type { RegistryEntrySummary, InstallOptions } from './types';
13
+
14
+ // Dynamic import for cli-table3
15
+ async function importTable() {
16
+ const Table = await import('cli-table3');
17
+ return Table.default;
18
+ }
19
+
20
+ /**
21
+ * Create the registry subcommand
22
+ */
23
+ export function createRegistryCommand(): Command {
24
+ const registry = new Command('registry')
25
+ .description('Manage pre-built MCP servers from the registry');
26
+
27
+ // List command
28
+ registry
29
+ .command('list')
30
+ .alias('ls')
31
+ .description('List available MCP servers in the registry')
32
+ .option('-c, --category <category>', 'Filter by category')
33
+ .option('-s, --sort <field>', 'Sort by: popularity, name, quality, toolCount', 'popularity')
34
+ .option('-l, --limit <n>', 'Number of results', '20')
35
+ .option('--verified', 'Show only verified entries')
36
+ .option('--json', 'Output as JSON')
37
+ .action(async (options) => {
38
+ await listServers(options);
39
+ });
40
+
41
+ // Search command
42
+ registry
43
+ .command('search <query>')
44
+ .description('Search for MCP servers')
45
+ .option('-l, --limit <n>', 'Number of results', '20')
46
+ .option('--json', 'Output as JSON')
47
+ .action(async (query, options) => {
48
+ await searchServers(query, options);
49
+ });
50
+
51
+ // Info command
52
+ registry
53
+ .command('info <id>')
54
+ .description('Show detailed information about an MCP server')
55
+ .option('--json', 'Output as JSON')
56
+ .action(async (id, options) => {
57
+ await showServerInfo(id, options);
58
+ });
59
+
60
+ // Install command
61
+ registry
62
+ .command('install <id>')
63
+ .description('Install an MCP server to your IDE')
64
+ .option('--claude', 'Install to Claude Desktop')
65
+ .option('--cursor', 'Install to Cursor')
66
+ .option('--vscode', 'Install to VS Code')
67
+ .option('-o, --output <dir>', 'Output directory (for file export)')
68
+ .option('--python', 'Use Python version if available')
69
+ .option('--overwrite', 'Overwrite existing installation')
70
+ .action(async (id, options) => {
71
+ await installServer(id, options);
72
+ });
73
+
74
+ // Categories command
75
+ registry
76
+ .command('categories')
77
+ .alias('cats')
78
+ .description('List all categories')
79
+ .action(async () => {
80
+ await listCategories();
81
+ });
82
+
83
+ // Stats command
84
+ registry
85
+ .command('stats')
86
+ .description('Show registry statistics')
87
+ .action(async () => {
88
+ await showStats();
89
+ });
90
+
91
+ // Update command
92
+ registry
93
+ .command('update [id]')
94
+ .description('Check for updates (optionally for a specific server)')
95
+ .action(async (id) => {
96
+ await checkUpdates(id);
97
+ });
98
+
99
+ return registry;
100
+ }
101
+
102
+ /**
103
+ * List available servers
104
+ */
105
+ async function listServers(options: {
106
+ category?: string;
107
+ sort?: string;
108
+ limit?: string;
109
+ verified?: boolean;
110
+ json?: boolean;
111
+ }): Promise<void> {
112
+ const mcpRegistry = new McpRegistry();
113
+
114
+ const result = await mcpRegistry.list({
115
+ category: options.category,
116
+ sortBy: options.sort as 'popularity' | 'name' | 'quality' | 'toolCount',
117
+ limit: parseInt(options.limit || '20', 10),
118
+ verifiedOnly: options.verified,
119
+ });
120
+
121
+ if (options.json) {
122
+ console.log(JSON.stringify(result, null, 2));
123
+ return;
124
+ }
125
+
126
+ if (result.entries.length === 0) {
127
+ console.log(chalk.yellow('No servers found matching your criteria.'));
128
+ return;
129
+ }
130
+
131
+ const Table = await importTable();
132
+ const table = new Table({
133
+ head: [
134
+ chalk.cyan('Name'),
135
+ chalk.cyan('ID'),
136
+ chalk.cyan('Tools'),
137
+ chalk.cyan('Quality'),
138
+ chalk.cyan('Downloads'),
139
+ chalk.cyan('Categories'),
140
+ ],
141
+ style: { head: [], border: ['gray'] },
142
+ });
143
+
144
+ for (const entry of result.entries) {
145
+ table.push([
146
+ `${entry.verified ? chalk.green('✓') : ' '} ${entry.name}`,
147
+ chalk.gray(entry.id),
148
+ entry.toolCount.toString(),
149
+ getQualityBadge(entry.quality),
150
+ formatNumber(entry.popularity),
151
+ chalk.gray(entry.categories.slice(0, 2).join(', ')),
152
+ ]);
153
+ }
154
+
155
+ console.log(chalk.bold.cyan('\n MCP Server Registry\n'));
156
+ console.log(table.toString());
157
+ console.log(chalk.gray(`\nShowing ${result.entries.length} of ${result.total} servers`));
158
+ console.log(chalk.gray('Use "github-to-mcp registry info <id>" for details'));
159
+ }
160
+
161
+ /**
162
+ * Search for servers
163
+ */
164
+ async function searchServers(query: string, options: { limit?: string; json?: boolean }): Promise<void> {
165
+ const mcpRegistry = new McpRegistry();
166
+ const entries = await mcpRegistry.search(query);
167
+
168
+ if (options.json) {
169
+ console.log(JSON.stringify(entries, null, 2));
170
+ return;
171
+ }
172
+
173
+ if (entries.length === 0) {
174
+ console.log(chalk.yellow(`No servers found matching "${query}"`));
175
+ return;
176
+ }
177
+
178
+ const Table = await importTable();
179
+ const table = new Table({
180
+ head: [chalk.cyan('Name'), chalk.cyan('ID'), chalk.cyan('Description'), chalk.cyan('Tools')],
181
+ style: { head: [], border: ['gray'] },
182
+ colWidths: [15, 15, 40, 8],
183
+ wordWrap: true,
184
+ });
185
+
186
+ const limit = parseInt(options.limit || '20', 10);
187
+ for (const entry of entries.slice(0, limit)) {
188
+ table.push([
189
+ `${entry.verified ? chalk.green('✓') : ' '} ${entry.name}`,
190
+ chalk.gray(entry.id),
191
+ entry.description.substring(0, 80),
192
+ entry.toolCount.toString(),
193
+ ]);
194
+ }
195
+
196
+ console.log(chalk.bold.cyan(`\n Search results for "${query}"\n`));
197
+ console.log(table.toString());
198
+ }
199
+
200
+ /**
201
+ * Show server information
202
+ */
203
+ async function showServerInfo(id: string, options: { json?: boolean }): Promise<void> {
204
+ const mcpRegistry = new McpRegistry();
205
+ const entry = await mcpRegistry.get(id);
206
+
207
+ if (!entry) {
208
+ // Check popular entries
209
+ const popular = popularEntries.find(e => e.id === id);
210
+ if (popular) {
211
+ if (options.json) {
212
+ console.log(JSON.stringify(popular, null, 2));
213
+ return;
214
+ }
215
+ displayEntryInfo(popular);
216
+ return;
217
+ }
218
+ console.log(chalk.red(`Server "${id}" not found`));
219
+ process.exit(1);
220
+ }
221
+
222
+ if (options.json) {
223
+ console.log(JSON.stringify(entry, null, 2));
224
+ return;
225
+ }
226
+
227
+ displayEntryInfo(entry);
228
+ }
229
+
230
+ /**
231
+ * Display entry information in a nice format
232
+ */
233
+ function displayEntryInfo(entry: {
234
+ name: string;
235
+ id: string;
236
+ description: string;
237
+ sourceRepo: string;
238
+ version: string;
239
+ toolCount: number;
240
+ quality: { overall: number; schemaCompleteness: number; documentation: number; examples: number; authHandling: number };
241
+ categories: string[];
242
+ tags: string[];
243
+ auth: Array<{ type: string; envVar?: string; instructions?: string }>;
244
+ tools: Array<{ name: string; description: string }>;
245
+ docsUrl?: string;
246
+ apiDocsUrl?: string;
247
+ verified: boolean;
248
+ }): void {
249
+ console.log(chalk.bold.cyan(`\n ${entry.name}`));
250
+ console.log(chalk.gray(` ${entry.id} v${entry.version}`));
251
+ if (entry.verified) {
252
+ console.log(chalk.green(' ✓ Verified'));
253
+ }
254
+ console.log();
255
+ console.log(chalk.white(` ${entry.description}`));
256
+ console.log();
257
+ console.log(chalk.gray(' Source: ') + chalk.blue(`https://github.com/${entry.sourceRepo}`));
258
+ console.log(chalk.gray(' Tools: ') + chalk.green(entry.toolCount.toString()));
259
+ console.log(chalk.gray(' Quality: ') + getQualityBadge(entry.quality.overall));
260
+ console.log(chalk.gray(' Categories: ') + entry.categories.join(', '));
261
+ console.log(chalk.gray(' Tags: ') + chalk.gray(entry.tags.join(', ')));
262
+
263
+ // Quality breakdown
264
+ console.log(chalk.bold('\n Quality Breakdown:'));
265
+ console.log(` Schema: ${getProgressBar(entry.quality.schemaCompleteness)}`);
266
+ console.log(` Docs: ${getProgressBar(entry.quality.documentation)}`);
267
+ console.log(` Examples: ${getProgressBar(entry.quality.examples)}`);
268
+ console.log(` Auth: ${getProgressBar(entry.quality.authHandling)}`);
269
+
270
+ // Authentication
271
+ if (entry.auth.length > 0) {
272
+ console.log(chalk.bold('\n Authentication:'));
273
+ for (const auth of entry.auth) {
274
+ console.log(` Type: ${auth.type}`);
275
+ if (auth.envVar) {
276
+ console.log(` Env: ${chalk.yellow(auth.envVar)}`);
277
+ }
278
+ if (auth.instructions) {
279
+ console.log(` ${chalk.gray(auth.instructions)}`);
280
+ }
281
+ }
282
+ }
283
+
284
+ // Tools preview
285
+ console.log(chalk.bold('\n Tools:'));
286
+ const toolsToShow = entry.tools.slice(0, 8);
287
+ for (const tool of toolsToShow) {
288
+ console.log(` ${chalk.green('•')} ${chalk.white(tool.name)}`);
289
+ console.log(` ${chalk.gray(tool.description.substring(0, 60))}${tool.description.length > 60 ? '...' : ''}`);
290
+ }
291
+ if (entry.tools.length > 8) {
292
+ console.log(chalk.gray(` ... and ${entry.tools.length - 8} more tools`));
293
+ }
294
+
295
+ // Links
296
+ console.log(chalk.bold('\n Links:'));
297
+ if (entry.docsUrl) {
298
+ console.log(` Docs: ${chalk.blue(entry.docsUrl)}`);
299
+ }
300
+ if (entry.apiDocsUrl) {
301
+ console.log(` API: ${chalk.blue(entry.apiDocsUrl)}`);
302
+ }
303
+
304
+ // Install hint
305
+ console.log(chalk.bold('\n Install:'));
306
+ console.log(chalk.gray(` github-to-mcp registry install ${entry.id} --claude`));
307
+ console.log();
308
+ }
309
+
310
+ /**
311
+ * Install a server
312
+ */
313
+ async function installServer(
314
+ id: string,
315
+ options: {
316
+ claude?: boolean;
317
+ cursor?: boolean;
318
+ vscode?: boolean;
319
+ output?: string;
320
+ python?: boolean;
321
+ overwrite?: boolean;
322
+ }
323
+ ): Promise<void> {
324
+ const spinner = ora(`Installing ${id}...`).start();
325
+
326
+ const mcpRegistry = new McpRegistry();
327
+
328
+ // Determine target
329
+ let target: InstallOptions['target'] = 'file';
330
+ if (options.claude) target = 'claude';
331
+ else if (options.cursor) target = 'cursor';
332
+ else if (options.vscode) target = 'vscode';
333
+
334
+ const installOptions: InstallOptions = {
335
+ target,
336
+ outputDir: options.output,
337
+ language: options.python ? 'python' : 'typescript',
338
+ overwrite: options.overwrite,
339
+ };
340
+
341
+ const result = await mcpRegistry.install(id, installOptions);
342
+
343
+ if (!result.success) {
344
+ spinner.fail(chalk.red(result.error));
345
+ process.exit(1);
346
+ }
347
+
348
+ spinner.succeed(chalk.green(`Installed ${id}`));
349
+
350
+ if (result.instructions) {
351
+ console.log(chalk.bold('\n Next steps:'));
352
+ for (const instruction of result.instructions) {
353
+ console.log(` ${chalk.gray('•')} ${instruction}`);
354
+ }
355
+ }
356
+
357
+ if (result.path) {
358
+ console.log(chalk.gray(`\n Installed to: ${result.path}`));
359
+ }
360
+ }
361
+
362
+ /**
363
+ * List categories
364
+ */
365
+ async function listCategories(): Promise<void> {
366
+ const mcpRegistry = new McpRegistry();
367
+ const categories = await mcpRegistry.getCategories();
368
+
369
+ console.log(chalk.bold.cyan('\n Available Categories\n'));
370
+ for (const cat of categories) {
371
+ console.log(` ${chalk.green('•')} ${cat}`);
372
+ }
373
+ console.log();
374
+ }
375
+
376
+ /**
377
+ * Show registry stats
378
+ */
379
+ async function showStats(): Promise<void> {
380
+ const mcpRegistry = new McpRegistry();
381
+ const stats = await mcpRegistry.getStats();
382
+
383
+ console.log(chalk.bold.cyan('\n Registry Statistics\n'));
384
+ console.log(` Total Servers: ${chalk.green(stats.totalEntries.toString())}`);
385
+ console.log(` Total Tools: ${chalk.green(stats.totalTools.toString())}`);
386
+ console.log(` Total Downloads: ${chalk.green(formatNumber(stats.totalDownloads))}`);
387
+
388
+ console.log(chalk.bold('\n Categories:'));
389
+ for (const cat of stats.categories.slice(0, 10)) {
390
+ console.log(` ${cat.name.padEnd(20)} ${chalk.gray(cat.count.toString())}`);
391
+ }
392
+
393
+ console.log(chalk.bold('\n Top Servers:'));
394
+ for (const entry of stats.topEntries.slice(0, 5)) {
395
+ console.log(` ${entry.name.padEnd(15)} ${chalk.gray(formatNumber(entry.popularity))} downloads`);
396
+ }
397
+ console.log();
398
+ }
399
+
400
+ /**
401
+ * Check for updates
402
+ */
403
+ async function checkUpdates(id?: string): Promise<void> {
404
+ const spinner = ora('Checking for updates...').start();
405
+
406
+ const mcpRegistry = new McpRegistry();
407
+
408
+ if (id) {
409
+ const update = await mcpRegistry.checkUpdate(id);
410
+ if (!update) {
411
+ spinner.succeed(chalk.green(`${id} is up to date`));
412
+ return;
413
+ }
414
+ spinner.info(chalk.yellow(`Update available for ${id}`));
415
+ console.log(` Current: ${update.currentVersion}`);
416
+ console.log(` Latest: ${update.latestVersion}`);
417
+ if (update.breaking) {
418
+ console.log(chalk.red(' ⚠ Breaking changes'));
419
+ }
420
+ } else {
421
+ const updates = await mcpRegistry.checkUpdates();
422
+ if (updates.length === 0) {
423
+ spinner.succeed(chalk.green('All servers are up to date'));
424
+ return;
425
+ }
426
+ spinner.info(chalk.yellow(`${updates.length} updates available`));
427
+ for (const update of updates) {
428
+ console.log(` ${update.id}: ${update.currentVersion} → ${update.latestVersion}`);
429
+ }
430
+ }
431
+ }
432
+
433
+ // Helper functions
434
+ function getQualityBadge(score: number): string {
435
+ if (score >= 90) return chalk.green(`★★★★★ ${score}`);
436
+ if (score >= 80) return chalk.green(`★★★★☆ ${score}`);
437
+ if (score >= 70) return chalk.yellow(`★★★☆☆ ${score}`);
438
+ if (score >= 50) return chalk.yellow(`★★☆☆☆ ${score}`);
439
+ return chalk.red(`★☆☆☆☆ ${score}`);
440
+ }
441
+
442
+ function getProgressBar(value: number): string {
443
+ const filled = Math.round(value / 10);
444
+ const empty = 10 - filled;
445
+ const bar = chalk.green('█'.repeat(filled)) + chalk.gray('░'.repeat(empty));
446
+ return `${bar} ${value}%`;
447
+ }
448
+
449
+ function formatNumber(n: number): string {
450
+ if (n >= 1000000) return `${(n / 1000000).toFixed(1)}M`;
451
+ if (n >= 1000) return `${(n / 1000).toFixed(1)}K`;
452
+ return n.toString();
453
+ }
454
+
455
+ // Export for use in main CLI
456
+ export { createRegistryCommand as default };
@@ -0,0 +1,44 @@
1
+ /**
2
+ * @fileoverview MCP Registry package exports
3
+ * @copyright Copyright (c) 2024-2026 nirholas
4
+ * @license Apache-2.0
5
+ */
6
+
7
+ // Main registry class
8
+ export { McpRegistry, type McpRegistryOptions } from './registry';
9
+
10
+ // Storage adapters
11
+ export { FileStorage, MemoryStorage } from './storage';
12
+
13
+ // Updater
14
+ export { RegistryUpdater, type UpdaterOptions } from './updater';
15
+
16
+ // Types
17
+ export type {
18
+ // Core types
19
+ RegistryEntry,
20
+ RegistryEntrySummary,
21
+ ToolSummary,
22
+ QualityScore,
23
+ AuthScheme,
24
+
25
+ // Configs
26
+ IdeConfigs,
27
+ GeneratedCode,
28
+
29
+ // Operations
30
+ ListOptions,
31
+ ListResult,
32
+ InstallOptions,
33
+ InstallResult,
34
+ UpdateInfo,
35
+
36
+ // Storage
37
+ StorageAdapter,
38
+
39
+ // Stats
40
+ RegistryStats,
41
+ } from './types';
42
+
43
+ // Re-export popular entries
44
+ export { popularEntries, getPopularEntry } from './popular';
@@ -0,0 +1,47 @@
1
+ {
2
+ "id": "github-mcp",
3
+ "name": "GitHub",
4
+ "description": "GitHub API - manage repositories, issues, pull requests, and more",
5
+ "sourceRepo": "octokit/rest.js",
6
+ "sourceUrl": "https://github.com/octokit/rest.js",
7
+ "version": "1.0.0",
8
+ "sourceVersion": "v20.0.0",
9
+ "toolCount": 15,
10
+ "tools": [
11
+ { "name": "get_repository", "description": "Get repository details", "source": "openapi", "paramCount": 2, "requiresAuth": true },
12
+ { "name": "list_repositories", "description": "List repositories for a user or org", "source": "openapi", "paramCount": 4, "requiresAuth": true },
13
+ { "name": "create_repository", "description": "Create a new repository", "source": "openapi", "paramCount": 5, "requiresAuth": true },
14
+ { "name": "get_issue", "description": "Get an issue by number", "source": "openapi", "paramCount": 3, "requiresAuth": true },
15
+ { "name": "list_issues", "description": "List issues in a repository", "source": "openapi", "paramCount": 5, "requiresAuth": true },
16
+ { "name": "create_issue", "description": "Create a new issue", "source": "openapi", "paramCount": 5, "requiresAuth": true },
17
+ { "name": "update_issue", "description": "Update an existing issue", "source": "openapi", "paramCount": 6, "requiresAuth": true },
18
+ { "name": "get_pull_request", "description": "Get a pull request by number", "source": "openapi", "paramCount": 3, "requiresAuth": true },
19
+ { "name": "list_pull_requests", "description": "List pull requests in a repository", "source": "openapi", "paramCount": 5, "requiresAuth": true },
20
+ { "name": "create_pull_request", "description": "Create a new pull request", "source": "openapi", "paramCount": 6, "requiresAuth": true },
21
+ { "name": "get_file_contents", "description": "Get contents of a file in a repository", "source": "openapi", "paramCount": 4, "requiresAuth": true },
22
+ { "name": "create_or_update_file", "description": "Create or update a file", "source": "openapi", "paramCount": 6, "requiresAuth": true },
23
+ { "name": "search_code", "description": "Search for code across repositories", "source": "openapi", "paramCount": 3, "requiresAuth": true },
24
+ { "name": "search_issues", "description": "Search for issues and pull requests", "source": "openapi", "paramCount": 3, "requiresAuth": true },
25
+ { "name": "get_user", "description": "Get a user's profile", "source": "openapi", "paramCount": 1, "requiresAuth": true }
26
+ ],
27
+ "categories": ["developer-tools", "version-control", "api"],
28
+ "tags": ["github", "git", "repositories", "issues", "pull-requests", "code"],
29
+ "popularity": 23150,
30
+ "lastUpdated": "2026-01-15T00:00:00.000Z",
31
+ "createdAt": "2025-06-01T00:00:00.000Z",
32
+ "generatedCode": {
33
+ "typescript": "import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';\n\nconst GITHUB_TOKEN = process.env.GITHUB_TOKEN;\nconst GITHUB_BASE_URL = 'https://api.github.com';\n\nif (!GITHUB_TOKEN) {\n console.error('Error: GITHUB_TOKEN environment variable is required');\n process.exit(1);\n}\n\nconst server = new Server({ name: 'github-mcp', version: '1.0.0' }, { capabilities: { tools: {} } });\n\nasync function githubRequest(endpoint: string, method: string = 'GET', body?: unknown) {\n const response = await fetch(`${GITHUB_BASE_URL}${endpoint}`, {\n method,\n headers: {\n 'Authorization': `Bearer ${GITHUB_TOKEN}`,\n 'Accept': 'application/vnd.github.v3+json',\n 'Content-Type': 'application/json',\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.message || 'GitHub API error');\n }\n return response.json();\n}\n\nconst tools = [\n { name: 'get_repository', description: 'Get repository details', inputSchema: { type: 'object', properties: { owner: { type: 'string' }, repo: { type: 'string' } }, required: ['owner', 'repo'] } },\n { name: 'list_repositories', description: 'List repositories for a user or org', inputSchema: { type: 'object', properties: { username: { type: 'string' }, type: { type: 'string', enum: ['all', 'owner', 'member'] }, per_page: { type: 'number' } }, required: ['username'] } },\n { name: 'create_repository', description: 'Create a new repository', inputSchema: { type: 'object', properties: { name: { type: 'string' }, description: { type: 'string' }, private: { type: 'boolean' }, auto_init: { type: 'boolean' } }, required: ['name'] } },\n { name: 'get_issue', description: 'Get an issue by number', inputSchema: { type: 'object', properties: { owner: { type: 'string' }, repo: { type: 'string' }, issue_number: { type: 'number' } }, required: ['owner', 'repo', 'issue_number'] } },\n { name: 'list_issues', description: 'List issues in a repository', inputSchema: { type: 'object', properties: { owner: { type: 'string' }, repo: { type: 'string' }, state: { type: 'string', enum: ['open', 'closed', 'all'] }, per_page: { type: 'number' } }, required: ['owner', 'repo'] } },\n { name: 'create_issue', description: 'Create a new issue', inputSchema: { type: 'object', properties: { owner: { type: 'string' }, repo: { type: 'string' }, title: { type: 'string' }, body: { type: 'string' }, labels: { type: 'array', items: { type: 'string' } } }, required: ['owner', 'repo', 'title'] } },\n { name: 'get_pull_request', description: 'Get a pull request', inputSchema: { type: 'object', properties: { owner: { type: 'string' }, repo: { type: 'string' }, pull_number: { type: 'number' } }, required: ['owner', 'repo', 'pull_number'] } },\n { name: 'create_pull_request', description: 'Create a pull request', inputSchema: { type: 'object', properties: { owner: { type: 'string' }, repo: { type: 'string' }, title: { type: 'string' }, head: { type: 'string' }, base: { type: 'string' }, body: { type: 'string' } }, required: ['owner', 'repo', 'title', 'head', 'base'] } },\n { name: 'get_file_contents', description: 'Get file contents', inputSchema: { type: 'object', properties: { owner: { type: 'string' }, repo: { type: 'string' }, path: { type: 'string' }, ref: { type: 'string' } }, required: ['owner', 'repo', 'path'] } },\n { name: 'search_code', description: 'Search code', inputSchema: { type: 'object', properties: { q: { type: 'string' }, per_page: { type: 'number' } }, required: ['q'] } },\n { name: 'search_issues', description: 'Search issues', inputSchema: { type: 'object', properties: { q: { type: 'string' }, per_page: { type: 'number' } }, required: ['q'] } },\n { name: 'get_user', description: 'Get user profile', inputSchema: { type: 'object', properties: { username: { type: 'string' } }, required: ['username'] } },\n];\n\nserver.setRequestHandler(ListToolsRequestSchema, async () => ({ tools }));\n\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n try {\n let result;\n const a = args as Record<string, unknown>;\n switch (name) {\n case 'get_repository': result = await githubRequest(`/repos/${a.owner}/${a.repo}`); break;\n case 'list_repositories': result = await githubRequest(`/users/${a.username}/repos?type=${a.type || 'all'}&per_page=${a.per_page || 30}`); break;\n case 'create_repository': result = await githubRequest('/user/repos', 'POST', a); break;\n case 'get_issue': result = await githubRequest(`/repos/${a.owner}/${a.repo}/issues/${a.issue_number}`); break;\n case 'list_issues': result = await githubRequest(`/repos/${a.owner}/${a.repo}/issues?state=${a.state || 'open'}&per_page=${a.per_page || 30}`); break;\n case 'create_issue': result = await githubRequest(`/repos/${a.owner}/${a.repo}/issues`, 'POST', { title: a.title, body: a.body, labels: a.labels }); break;\n case 'get_pull_request': result = await githubRequest(`/repos/${a.owner}/${a.repo}/pulls/${a.pull_number}`); break;\n case 'create_pull_request': result = await githubRequest(`/repos/${a.owner}/${a.repo}/pulls`, 'POST', { title: a.title, head: a.head, base: a.base, body: a.body }); break;\n case 'get_file_contents': result = await githubRequest(`/repos/${a.owner}/${a.repo}/contents/${a.path}${a.ref ? `?ref=${a.ref}` : ''}`); break;\n case 'search_code': result = await githubRequest(`/search/code?q=${encodeURIComponent(a.q as string)}&per_page=${a.per_page || 30}`); break;\n case 'search_issues': result = await githubRequest(`/search/issues?q=${encodeURIComponent(a.q as string)}&per_page=${a.per_page || 30}`); break;\n case 'get_user': result = await githubRequest(`/users/${a.username}`); break;\n default: throw new Error(`Unknown tool: ${name}`);\n }\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };\n } catch (error) {\n return { content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}` }], isError: true };\n }\n});\n\nasync function main() {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\nmain().catch(console.error);\n"
34
+ },
35
+ "configs": {
36
+ "claude": { "mcpServers": { "github": { "command": "npx", "args": ["tsx", "index.ts"], "env": { "GITHUB_TOKEN": "${GITHUB_TOKEN}" } } } },
37
+ "cursor": { "mcpServers": { "github": { "command": "npx", "args": ["tsx", "index.ts"], "env": { "GITHUB_TOKEN": "${GITHUB_TOKEN}" } } } },
38
+ "vscode": { "mcpServers": { "github": { "command": "npx", "args": ["tsx", "index.ts"], "env": { "GITHUB_TOKEN": "${GITHUB_TOKEN}" } } } }
39
+ },
40
+ "quality": { "overall": 94, "schemaCompleteness": 96, "documentation": 92, "examples": 90, "authHandling": 95, "parameterTypes": 95 },
41
+ "auth": [{ "type": "http", "scheme": "bearer", "envVar": "GITHUB_TOKEN", "instructions": "Create a personal access token at https://github.com/settings/tokens" }],
42
+ "docsUrl": "https://docs.github.com",
43
+ "apiDocsUrl": "https://docs.github.com/en/rest",
44
+ "iconUrl": "https://github.com/favicon.ico",
45
+ "verified": true,
46
+ "author": "github-to-mcp"
47
+ }